№5(30) май 2005 подписной индекс 81655 www.samag.ru
Почему MS SQL медленно работает? Ищем причины Строим защищенную беспроводную сеть: WPA-Enterprise, 802.1x EAP-TLS Настраиваем UPS под Linux Как восстановить удаленные файлы под BSD Что важно знать об IP-телефонии Устанавливаем Symantec Antivirus 9.0 в корпоративной сети Эффективно управляем полями пользователей в AD
№5(30) май 2005
Контролируем безопасность сети с помощью OSSIM Интервью с Ларри Уоллом – создателем языка Perl
оглавление 2 РЕПОРТАЖ ИНТЕРВЬЮ 4 Историческая неизбежность победы движения отрытого кода Интервью с Джоном Холлом - одним из основателей движения Open Source. Андрей Бешков tigrisha@sysadmins.ru
6 Ларри Уолл: «Сегодня Perl применяется для решения ряда проблем, о которых я и не подозревал, создавая этот язык» Интервью с создателем языка программирования Perl. Андрей Бешков tigrisha@sysadmins.ru
8 ТЕНДЕНЦИИ АДМИНИСТРИРОВАНИЕ 12 FreeBSD tips: использование syslog Понимание механизма работы syslog позволит вам эффективно управлять протоколированием системной информации. Сергей Супрунов amsand@rambler.ru
16 Крепкий орешек NUT Настраиваем источник бесперебойного питания под Linux с помощью Network UPS Tools. Валентин Синицын val@linuxcenter.ru
20 Что важно знать об IP-телефонии Изучаем основные протоколы, кодеки и интерфейсы шлюзов IP-телефонии. Михаил Платов platov@cs.vsu.ru
26 Alt-N MDaemon – почтовая система для средних и крупных компаний. Часть 2 Почтовый сервер установлен и сделаны первоначальные настройки. Переходим к дальнейшему конфигурированию системы. Роман Марков stepan-razin@newmail.ru
32 Восстанавливаем удаленные файлы под BSD Осваиваем структуру файловой системы UFS и методику ручного восстановления удаленных файлов. Крис Касперски kk@sendmail.ru
38 Реинкарнация данных II: memo-поля Как перенести данные из таблиц формата DBF в PostgreSQL? Несколько способов решения этой задачи мы предложили в первой части статьи. Отдельного внимания заслуживает вопрос работы с полями типа memo. Сергей Супрунов amsand@rambler.ru
40 Почему MS SQL медленно работает? Ищем причины Порой скорость работы этой базы данных падает без видимых причин. Что же случилось? Юлия Шабунио yshabunio@eastwind.ru
№5, май 2005
48 Система вещания на основе Windows Media Services 9. Часть 2 Создаем маленькую радиостанцию и настраивам «живое» вещание с веб-камер. Михаил Платов platov@cs.vsu.ru
54 Автоматизация MS Windows, или AutoIt как мечта эникейщика. Часть 2 Применение AutoIt для решения практических задач администрирования. Алексей Барабанов alekseybb@mail.ru
59 Эффективно управляем полями пользователей в AD Создаем сценарий автоматического внесения изменений в свойства объектов AD. Иван Коробко ikorobko@prosv.ru
СЕТИ 64 Строим защищённую беспроводную сеть: WPA-Enterprise, 802.1x EAP-TLS Практическое руководство. Андрей Платонов Platonov@tayle.com
БЕЗОПАСНОСТЬ 72 Устанавливаем Symantec Antivirus 9.0 в корпоративной сети Конфигурирование одного из самых популярных антивирусных продуктов корпоративного уровня – не совсем тривиальный процесс. Поэтому будет полезно ознакомиться с его подробным описанием. Роман Марков stepan-razin@newmail.ru
78 Контролируем безопасность сети с помощью OSSIM Для полноценной защиты сети уже недостаточно тандема firewall + IDS. Для всестороннего контроля необходимо задействовать разные инструменты. Интеграция различных компонетов – основная задача проекта OSSIM. Сергей Яремчук grinder@ua.fm
ОБРАЗОВАНИЕ 86 Свободная информационная система для школ Centre Приложение Centre позволит автоматизировать рутинные задачи по учету персональных данных учащихся. Сергей Яремчук grinder@ua.fm
WEB 88 Базовая HTTP-авторизация – защита от честных людей Как работает механизм базовой авторизации и насколько он надёжен? Как его подключить? Можно ли усилить защиту? Алексей Мичурин alexey@office-a.mtu-net.ru
93 КНИЖНАЯ ПОЛКА 31, 94 BUGTRAQ 1
репортаж
ИТОГИ КОНФЕРЕНЦИИ OPEN SOURCE FORUM RUSSIA 2005 С 27 по 29 апреля в «Рэдиссон Славянская» прошла выставка и конференция Open Source Forum 2005. Это первое в России мероприятие такого масштаба, посвященное движению отрытого исходного кода. ервый день назывался Open Standarts Day и был занят циклом докладов специалистов организации OASIS (Organization for the Advancement of Structured Information Standards). Большинство выступающих акцентировало внимание слушателей на проблемах внедрения открытых стандартов в ИТ индустрии. С вступительным словом выступил коммерческий директор компании UnitSpace Александр Гершойг. Он прояснил слушателям различия между открытым кодом и открытыми стандартами. Открытость стандартов априори предполагает, что все данные между сервисами будут передаваться в XML-формате. Все доклады тем или иным образом были связаны с сервис-ориентированной архитектурой предприятия, подходами к ее реализации и роли отрытых стандартов в обеспечении безопасной взаимной совместимости платформ от разных поставщиков. Отдельного упоминания стоят довольно интересные презентации директора по стратегии развития и архитектуре Oracle Application Server Suite Вадима Розенберга, рассказавшего о новом языке BPEL. Также любопытные мысли о методах безопасной интеграции SOA прозвучали в речи директора по информационной безопасности Microsoft в России и СНГ Владимира Мамыкина. Стоит отметить, что практически все ораторы тем или иным образом озвучили важность постепенного и безопасного внедрения открытых стандартов. Но к вечеру слушатели начали засыпать – осветить столь объемную тему за один день было не под силу даже столь блестящим специалистам. Параллельно с этим в других залах шел монтаж стендов выставочного зала и Linux City. 28 апреля началась регистрация для посетителей выставки и состоялось торжественное открытие форума.
Ïåðâûå ïîñåòèòåëè âûñòàâêè
2
C самого утра по выставочным залам стали расхаживать большие императорские пингвины, а перед началом выступлений на сцене, отгоняя злых духов, танцевали с бубном шаманы. Эти милые сердцу каждого админа персонажи вызывали улыбки у посетителей.
Ôèííî-óãîðñêèå øàìàíû îòãîíÿþò çëûõ äóõîâ
Первое пленарное заседание открыл президент ассоциации «Руссофт» Валентин Макаров. В своей речи он упомянул, что в мероприятиях форума участвуют более 30 известнейших специалистов в области опенсорс, среди которых и создатель языка Perl Ларри Уолл. Кроме этого на форуме от лица Правительства Российской Федерации выступали Владимир Матюхин – руководитель Федерального агентства по информационным технологиям, Церен Церенов – заместитель директора Департамента корпоративного управления и новой экономики Министерства экономического развития и торговли РФ. Представители министерств рассказали о том, почему государственные структуры поддерживают Форум по открытому коду, как используются программы в открытых кодах для нужд государства и каковы перспективы их дальнейшего внедрения в государственное управление. Затем на сцену вышел один из выдающихся ораторов и идеологов движения Джон Холл более известный как maddog (интервью с ним читайте на 4 cтр.). Доклад Джона по праву может считаться жемчужиной форума, в нем гуру Open Source аргументированно доказал, что закрытое программное обеспечение мешает росту местного рынка ПО, связывает пользователей по рукам и ногам. Проприетарное ПО подобно черному ящику: неизвестно как оно работает и ничего нельзя изменить. К тому же, с ростом корпораций, производящих закрытое ПО, уро-
репортаж ладов аудитория то увеличивалась почти до сотни человек, то вновь уменьшалась до десятка – другого слушателей. Но самым красноречивым отражением экспансии открытого кода, конечно же, стал Linux City со стендами решений на основе Linux. Среди этого мини-городка большего всего бросались в глаза кассовые аппараты, кинотеатр, банк, арбитражный суд, рабочее место бухгалтера, созданное на основе Wine и 1С.
Êîíôåðåíöèÿ ñîáðàëà áîëüøîå ÷èñëî ó÷àñòíèêîâ
вень обслуживания клиентов неуклонно падает. Часто приходится ждать очень долго, пока производитель внесет исправления ошибок в свои продукты. Нередко случается, что даже контракты на большие суммы не могут заставить производителя дорабатывать поставляемый продукт для локализации и адаптации к местному рынку.
Linux City – ìîäåëü èíôðàñòðóêòóðû ãîðîäà, óïðàâëÿåìîãî ÏÎ ñ îòêðûòûì êîäîì
Некоторые организационные моменты прошедшего действа оставили желать лучшего. Неудобные бейджики – на них мы видели в первую очередь логотипы спонсоров, а в имена участников приходилось вглядываться. К сожалению не все слушатели смогли насладиться докладами в полной мере – синхронный перевод оставлял желать лучшего. Несмотря на это, три дня выставки пролетели как один час. Было весьма интересно пообщаться с таким большим количеством компетентных специалистов. Äæîí Õîëë ðàññêàçûâàåò î íåèçáåæíîì âûìèðàíèè çàêðûòîãî ïðîãðàììíîãî îáåñïå÷åíèÿ
Кроме вышеназванных, было довольно много интересных докладов на тему применения Linux в корпоративном секторе. Одним из самых запомнившихся был рассказ Адама Джолланса (Adam Jollans) из IBM о том, почему его компания решила оказывать всестороннюю поддержку 150 проектам с отрытым кодом. Среди самых известных проектов можно назвать Linux, Postfix, Eclipse, Apache, Derby, Globus Alliance. Сразу же после Джолланса на сцену взошел представитель Novell Ричард Зайбт. Его доклад наглядно продемонстрировал полезность Open Source-движения как катализатора конкуренции на рынке. Для простого потребителя ИТ услуг это безусловно благо, впрочем и для самих конкурирующих фирм – тоже неплохо. Одновременно с докладами метров опенсорса в течение второго и третьего дня выставки в одном из залов проходило мероприятие под названием «Уголок оратора». В его рамках выступали с докладами о своих разработках независимые технические специалисты. Весьма любопытными были выступления «Возможности использования открытого кода в закрытых продуктах» и «Открытый код – разработчикам встроенных систем». В зависимости от тем и качества док-
№5, май 2005
Ïèíãâèíû – îäèí èç ñèìâîëîâ äâèæåíèÿ Open Source
Общее впечатление от всего произошедшего сложилось очень приятное. Следующим мероприятием, сравнимым по масштабу с Open Source Forum, станет выставка Linux World, которая пройдет в Москве в сентябре этого года.
Андрей Бешков Фото Андрея Бешкова, Андрея Маркелова
3
интервью
ИСТОРИЧЕСКАЯ НЕИЗБЕЖНОСТЬ ПОБЕДЫ ДВИЖЕНИЯ ОТКРЫТОГО КОДА Джон Холл уже много лет считается гуру движения открытого исходного кода. Уже более 30 лет он работает в компьютерной индустрии, при этом стаж работы с UNIXсистемами – 20 лет. С 1994 года Джон занимается продвижением Linux-решений. На проходящей конференции Open Source мне удалось побеседовать с Джоном Холлом о перспективах развития систем на основе открытого кода. кажите, что вы думаете о перспективах коммерческих компаний, опирающихся в своем бизнесе только на Linux-решения? Все говорят, что сейчас на рынке нет убедительных примеров успешных Linux-компаний, если не брать в расчет Red Hat. Я думаю, вся проблема состоит в том, что многие фирмы неправильно рассчитывают срок выхода на уровень не только самоокупаемости, но и прибыльности. Из-за этого получается, что большинство молодых компаний решают уйти с рынка слишком рано. Это в корне неверно, посмотрите на Red Hat: для получения приличных доходов им пришлось трудиться не покладая рук несколько лет. Каковы ваши прогнозы тенденций развития коммерческих UNIX-систем? Я думаю, что коммерческие UNIX мертвы. Их поддержка слишком дорого обходится производителю. В свое время я работал в DEC, и ежегодно мы тратили 2 миллиона долларов на поддержку собственного диалекта UNIX. Вдумайтесь в эту цифру. Как только Linux дорастает до того, чтобы работать на специфическом оборудовании, к примеру, от HP или IBM, менеджмент начинает задумываться о том, что развивать свой
4
собственный способ изобретения колеса нет нужды. К тому же в голову сразу же приходят мысли, как на этом можно сэкономить. Как вы относитесь к попыткам запускать Windows-приложения под Linux c помощью Wine? Что вы думаете о свободной реализации Windows API, называемой React OS? Мне кажется, что воссоздать API от Microsoft довольно сложно, у людей, работающих над проектом Wine, ушли долгие годы на реализацию основных функций. Сейчас они добились совместимости с Windows 98, но ведь на данный момент актуальна Windows XP. К тому же стоит учесть, что при каждом изменении, вносимом Microsoft без предупреждения, в API и ABI вся система перестает работать. Мне кажется более перспективным создавать стандартный ABI для Linux-приложений, тогда их можно будет запускать под какой угодно ОС. Как вы думаете, слияние Novell, Suse и Ximian – это объективная необходимость или попытка в последний момент успеть вскочить на подножку набирающего ход Linux-поезда? Продукты, поставляемые Novell, уже давно завоевали славу очень стабильных решений. В мире очень много сер-
веров, до сих пор бесперебойно работающих на основе разных версий Novell Netware, но, к сожалению, эти решения уже не дают той гибкости, в которой нуждаются клиенты. В то же время, у Suse и Ximian нет денег для дальнейшего развития. Кроме этого, Novell предлагает не только деньги, но и свою хорошо налаженную сеть распространения. Думаю, что подобное объединение приведет к появлению более качественных продуктов. Обратите внимание: то же самое сейчас происходит с Mandrake и Connectiva, я думаю, что это к лучшему. В последние 10 лет только и разговоров, что о Linux, некоторые люди уже начинают считать, что Linux является единственной ОС для приверженцев движения открытых исходников. Не кажется ли вам, что вокруг этой ОС шумиха несколько преувеличена? Лет 10 назад ко мне пришли люди, занимающиеся BSD, и спросили, почему я ничего не говорю об их ОС в своих выступлениях. Я ответил: «Покажите мне 5 хороших форумов о BSD или армию поклонников этой ОС». Выбор ОС никак не связан с качеством продукта, в сущности, это всего лишь вопрос правильного маркетинга. Иначе Microsoft не продал бы ни единой ко-
интервью жон мэддог Холл (John Hаll) известен как один из пионеров движения Open Source. Неповторимая харизма «Бешеного пса» снискала ему славу среди сторонников и противников открытого кода по всему миру. Проведя более 30 лет в работе в мире ИТ, сначала с UNIX, потом с Linux, он объездил много стран, рассказывая о преимуществах и перспективах открытого кода. С 1995 года и по сей день он является Президентом и СЕО Linux International (www.li.org) – некоммерческой организации поставщиков ИТ-услуг, выступающих в поддержку развития и продвижения ОС Linux. Он также входит в состав правления нескольких компаний и некоммерческих организаций, включая USENIX Association. Перу Мэддога принадлежит книга «Linux for Dummies», и он является автором многочисленных статей, посвященных специфике открытого кода. Благодаря чувству юмора, приветливости и оригинальности
изложения концепций, он стал одной из наиболее ярких фигур мира ИТ. Господинн Холл начинал свою карьеру как программист, и впоследствии он занимал должности специалиста по разработке систем, системного администратора, руководителя отдела реализации продуктов и технического директора в таких организациях, как Western Electric Corporation, Bell Laboratories, Aetna Life and Casualty, Digital Equipment Corporation, VA Linux Systems. Джон Холл известен своей любовью к преподаванию. Он вел несколько курсов лекций в Hartford State Technical College, Merrimack College и Daniel Webster College. Именно студенты Hartford State Technical College, где он был деканом факультета Computer Science, дали ему никнейм «maddog», которым он любит себя называть до сих пор. Свободное время Джон Холл посвящает своему проекту «maddog's monastery for microcomputing and microbrewing».
пии своих программ. Заказчик хочет получить решение на основе Linux, и я считаю: неправильно пытаться заставлять его переходить на BSD только потому, что кому-то она кажется более качественной.
можно, такая участь постигнет и эту компанию. С другой стороны, начать работать в стиле открытых исходных кодов им будет чрезвычайно трудно. Дело не только в том, что каждая большая структура неповоротлива и косна, но и в том, что внутри их продуктов встроено много закрытых технологий, лицензированных у других производителей. Мне кажется, что Microsoft со временем превратится в компанию, ориентированную не на продаваемые
Âûñòóïëåíèå Äæîíà Õîëëà
Что вы думаете об инициативе по уменьшению количества разновидностей лицензий, под которыми выпускается свободное программное обеспечение? Слишком много людей не понимает отличий разных видов лицензий, и для своих сиюминутных нужд создают все новые и новые варианты близнецов. С другой стороны, я бы не хотел никого ограничивать в свободе выбора подходящей модели лицензирования своего кода. Рассмотрев разные варианты существующих лицензий, считаю, что GPL на данный момент лучше всего, хотя и она не совершенна. Каковы ваши прогнозы относительно будущего Microsoft? Каждую достаточно большую фирму можно считать живым организмом. История эволюции доказывает, что виды, отказывающиеся приспосабливаться к меняющимся внешним условиям, вымирают. Если Microsoft не начнет заниматься Open Source, то, воз-
№5, май 2005
продукты, а на предоставляемые сервисы. Грядет время сервис-ориентированной экономики, и тот, кто начнет приспосабливаться к новым условиям, первым займет очень выгодные позиции. На данный момент, по моему мнению, примером сервис-ориентированной компании можно считать IBM.
Андрей Бешков Фото Андрея Бешкова, Андрея Маркелова
Äæîí Õîëë è ðåäàêòîðû æóðíàëà Âàëåíòèí Ñèíèöûí è Àíäðåé Áåøêîâ (ñïðàâà)
5
интервью
ЛАРРИ УОЛЛ: «СЕГОДНЯ PERL ПРИМЕНЯЕТСЯ ДЛЯ РЕШЕНИЯ РЯДА ПРОБЛЕМ, О КОТОРЫХ Я И НЕ ПОДОЗРЕВАЛ, СОЗДАВАЯ ЭТОТ ЯЗЫК» Ларри Уолл – человек, ненамеренно сделавший очень многое для распространения UNIX-систем. Он никогда не занимался целенаправленной рекламой UNIX, но создание языка Perl сделало его одним из самых популярных людей Open Source-движения. Сейчас уже, наверное, невозможно найти технического специалиста, работающего в UNIX и не знакомого с верблюдом, изображенным на логотипе Perl. Благодаря гибкости и переносимости Perl вышел далеко за рамки UNIX, сейчас его довольно часто можно встретить под Windows и многими другими платформами. есколько лет назад Perl позиционировался как лучший язык для разработки веб-приложений. Сейчас его заметно потеснил PHP. Что вы думаете об этой ситуации? Какова экологическая ниша Perl сейчас и для чего, по вашему мнению, его стоит теперь применять? Perl и PHP – очень разные языки. Первый является языком общего назначения. В целом он предназначен для разнообразных научных применений, обработки баз данных, всевозможных манипуляций с текстом, системного администрирования, быстрой разработки прототипов интернет-сервисов. Благодаря этим качествам некоторое время по недоразумению он использовался как вебязык. Второй же предназначен только для веб-разработки и справляется с этой задачей очень хорошо. Неудивительно, что в этой нише он доминирует, но я не думаю, что он будет работать хорошо за ее пределами. Сейчас Perl применяется для решения таких проблем, о которых я и не подозревал, создавая этот язык. К примеру, он с успехом применяется в генетических исследованиях, ведь ДНК принято обозначать как набор символов, а в удобстве работы с символами Perl нет равных. Во время разработки новой версии Perl каким качествам продукта придается первостепенное значение? Оптимизации, гибкости и красоте кода или наличию наибольшего количества полезных функций?
6
Я думаю, всем вышеперечисленным. За последние пять лет мы увидели, что людям может пригодиться самый необычный и фантастический функционал, о котором только можно подумать. Поэтому мы стараемся сделать так, чтобы язык позволял делать многие вещи прозрачнее и проще, чем раньше, но в то же время не ограничивать пользователя, давая возможность реализовывать сложные вещи. В новой версии разработчик получит еще больше могущества и сможет работать гораздо эффективнее. Представьте себе, что нам нужно построчно сложить значения, хранящиеся в двух массивах, и поместить результат в третий. Традиционно для решения этой задачи нужно было бы использовать цикл с операциями сложения и присваивания, но в новой версии все это можно будет сделать всего лишь одним оператором. Будет ли шестая версия языка при всех своих улучшениях работать быстрее, чем пятая? Я думаю, да. В новой версии после компиляции текста в байт-код добавляется больше служебных сведений о типах используемых данных, ходе выполнения кода, это помогает оптимизировать выполнение программы. В то же время стоит отметить, что и код самого компилятора Perl претерпел значительные изменения в лучшую сторону. Обычно для каждого запускаемого скрипта производилась компиляция в байт-код, соответственно, если у нас
выполнялись три экземпляра одного и того же скрипта, компиляция выполнялась трижды. В новой версии будет реализовано понятие разделяемой памяти и кэша байт-кода. Это значит, что скрипт будет компилироваться только первый раз и при запуске новых экземпляров этого скрипта скомпилированный код будет браться прямо из кэша Parrot. Хотелось бы узнать приблизительные сроки выхода Perl 6. Сказать точно, когда это произойдет, я не могу, делать одновременно множество вещей, к сожалению, невозможно. Как любой Open Source-проект, мы располагаем ограниченными средствами, соответственно не можем себе позволить нанимать дополнительных работников, приходится выбирать между скоростью разработки и качеством кода. Мы думаем, что лучше выпустить чуть позже очень устойчивую альфаверсию, чем быстро сделать несколько промежуточных неотшлифованных релизов. Планируется ли в новой версии внести изменения в синтаксис языка, чтобы сделать его более дружественным к пользователю? Этим вопросом будут заниматься другие разработчики, единственная задача, которую я зарезервировал для себя, – транслятор Perl 5 в Perl 6. Мне как лингвисту было бы очень интересно этим заняться, но, к сожалению, пе-
интервью реработка глубинных компонентов языка отнимает довольно много времени. Perl уже давно перерос размеры проекта, который можно обслуживать в одиночку, поэтому многие задачи делегируются специалистам в этой области, которые сделают работу лучше. Для представления строковых данных Perl использует кодировку Unicode, и этим выгодно отличается от других языков. Так было задумано изначально или пришло само собой, когда разработчики столкнулись с проблемами локализации? В момент появления Perl такого понятия, как Unicode, не существовало. Мы, как и многие другие проекты, прошли через все стадии проблем с локализацией. Хранение строковых данных в Unicode появилось в версии 5.6 и работало не очень хорошо. К версии 5.8 к проекту присоединились люди, которые наконец-то довели все это до ума. На сайте Slashdot.org несколько лет назад появилась шутка о том, что скоро должен появиться новый язык Parrot, который должен будет вобрать в себя лучшее из Perl и Python. Через какое-то время была разработана виртуальная машина Parrot, используемая для выполнения компилированного байт-кода Perl 6. Как вы думаете, сможет ли Parrot когда-нибудь компилировать и выполнять код, написанный на Python? Perl является самым распространенным из скриптовых языков, сообщество людей, использующих его, огромно. Я считаю, что мы должны стараться устанавливать добрососедские отношения, всесторонне сотрудничать и поддерживать сообщества разработчиков других скриптовых языков. Поэтому я всегда стремился к разработке какой-то единой платформы, которая сможет запускать не только Perl и Python. В свою очередь сообщество разработчиков Perl 6 решило, что неплохо было бы поддерживать этой платформой и другие языки, такие как Ruby, Basic, Lisp, Lua. Когда работы над Perl 6 будут окончены, я думаю, мы сможем работать в его рамках c любым языком, использующим динамическую типизацию данных. На самом деле Perl
№5, май 2005
старается быть как можно более дружественным к другим языкам. Когда пользователи захотели получить возможность выполнять C-код из программ на Perl, пришлось много потрудиться, чтобы реализовать такой функционал, но я думаю, что труды были ненапрасны, потому что это позволит значительно улучшить кодовую базу многих проектов. Бытует мнение, что виртуальная машина Parrot по своему дизайну очень похожа на среду выполнения Microsoft .Net. Не могли бы вы прокомментировать это утверждение? Я думаю что .Net по особенностям реализации больше похож на Microsoft Java Virtual Machine со свойственной ему статической типизацией данных. В дизайн Parrot изначально заложена способность работать в двух режимах с динамическими типами данных и со статическими. Соответственно, пользователь сможет самостоятельно добавлять данные о типе переменных, используемых в программе, и это позволит управлять тем, как будет выглядеть поведение языка. Что вы думаете о применении embedded Perl в качестве встроенного языка для скриптования компонентов приложения? В данной области Perl 5 успешно применяется уже довольно долго. В моей практике был случай, когда один из заказчиков для своей бухгалтерской программы попросил меня помочь реализовать сложные поля редактирования. Программа должна была понимать и
уметь вычислять выражения вроде: ((8 + 7) * 12 - (10 * 44/11) ) %10. Через пару дней все было готово, ведущий разработчик был просто в восторге от того, что в выражениях можно использовать не только стандартные арифметические операции, но и расчет процентов. Оказалось, что встроить виртуальную машину интерпретатора Perl в приложение было легче, чем реализовать тот же самый функционал на языке C++. На быстродействие получившегося продукта такой симбиоз практически не повлиял, а вот время работы над приложением существенно уменьшилось. Конечно, для сообщества разработчиков дальнейшее совершенствование Perl в качестве встраиваемого языка не является высшим приоритетом, но мы все же стараемся сделать так, чтобы он мог применяться в максимально возможном количестве областей. Расскажите, в какой компании вы сейчас работаете и, если не секрет, чем занимаетесь? Большую часть времени в течение последних четырех лет я официально ни у кого не работаю. В основном средства к существованию получаю за счет выполнения грантов от Perl Foundation, разрабатывая новые и улучшая существующие подсистемы Perl 6. Плюс к этому регулярно поступают авторские отчисления от публикации книг о Perl. В общем, можно сказать, что я не бедствую и довольно легко могу позволить себе путешествовать по всему миру.
Андрей Бешков Фото автора
Ëàððè Óîëë è ðåäàêòîð æóðíàëà Âàëåíòèí Ñèíèöûí
7
тенденции Корпоративные базы данных – 2005 20 и 21 апреля в Синем зале Президиума РАН в Москве проходила юбилейная, десятая по счету конференция «Корпоративные базы данных – 2005». Ее организатором выступила компания Центр Информационных Технологий (ЦИТ), известная как владелец порталов CITForum и CITKit, а генеральным спонсором – корпорация Microsoft. Первый день конференции был посвящен коммерческим решениям. Заседание открыл Дмитрий Артемов (Microsoft), представивший обзор новых возможностей Microsoft SQL Server 2005. Особое внимание было уделено поддержке стандарта XML на уровне ядра базы данных, интеграции с .NET Framework и новым технологиям обеспечения целостности данных. Программа конференции была построена таким образом, что доклады, посвященные системам управления базами данных, чередовались с сообщениями о технологиях интеграции, так что слушатели могли лучше представить себе место новейших разработок в мире СУБД в информационной инфраструктуре предприятия. С презентациями, рассказывающими о развитии тех или иных решений за истекший год выступили также компания InterSystems, производитель СУБД Cache, SWD Software, дистрибьютор системы Empress, а также отечественная фирма Релэкс, известная своей СУБД Линтер. Второй день был практически полностью посвящен открытым разработкам. Это является важным нововведе-
нием, поскольку в предыдущие годы на конференции были представлены лишь поставщики закрытых решений. В этом году слово было предоставлено проекту Sedna, разрабатывающему «прирожденную» СУБД для работы с документами в формате XML посредством языка запросов XQuery и PostgreSQL, блестящее введение в возможности которого сделал один из разработчиков данного продукта Олег Бартунов (ГАИШ МГУ). Не были обойдены вниманием и система Ingres r3 компании Computer Associates, ставшая открытой лишь в мае прошлого года, и Firebird SQL, базирующийся на исходном коде Interbase. Одну из самых популярных открытых СУБД, MySQL, представлял Дмитрий Ленев (MySQL AB), член московской команды разработчиков. Из-за новизны тематики или из-за специфики аудитории (в зале то тут, то там мелькали ноутбуки с Linux), решения Open Source пользовались самым пристальным вниманием и являлись предметом непрерывного обсуждения «в кулуарах». Конференция закончилась выступлением Сергея Кузнецова (ИСП РАН), который представил прогноз возможного развития индустрии баз данных. Согласно ему нас ждет появление новых, «нечетких» типов данных, интеграция СУБД с технологиями Data Mining, а также инновации в области долговременного хранения информации. Возможно, уже через некоторое время эти пока еще не решенные проблемы станут предметом докладов на «Корпоративных базах данных – 200x»? Время покажет.
Ó÷àñòíèêè êîíôåðåíöèè ñëóøàþò âûñòóïëåíèå Äìèòðèÿ Àðòåìîâà
8
Центр Высоких Технологий HP в Москве 26 апреля в Москве состоялось торжественное открытие Центра Высоких Технологий HP (HP High Tech Center). В настоящий момент в мире насчитывается около 80 Центров HP, которые подразделяются на три уровня в зависимости от объема оказываемых ими услуг. Центр Высоких Технологий в Москве принадлежит к первому, высшему уровню. Это пятая организация подобного рода в мире и вторая – за пределами США. Аналогичный центр существует и на территории Западной Европы в г. Беблинген (Германия). Основная задача Центра Высоких Технологий в Москве – оказывать содействие российским клиентам и партнерам Hewlett-Packard. Первым из них будет предложен комплексный подход к решению возникающих бизнес-задач. Иными словами, клиенты Центра Высоких Технологий смогут выбрать интегрированное решение, наилучшим образом отвечающее имеющимся требованиям, организовывать тестирование, производить сертификацию и т. д. При этом будут использоваться как собственные разработки Hewlett-Packard, так и решения компаний-партнеров. Поскольку область компетенции Центра не ограничивается территорией Российской Федерации (это глобальная организация), партнеры HP будут иметь шанс вывести свои решения на новые международные рынки. Оуэн Кемп подчеркнул исключительную важность данного события, охарактеризовав Центр как «окно в мир» для отечественных компаний. Все выступающие отмечали высокий научный и инженерный потенциал российских специалистов и выражали мнение, что задача HP состоит в развитии этих возможностей. Исполнительный вице-президент Майкл Уинклер назвал открытие Центра новой эрой в истории этой компании. В ближайшие пять лет в него будет инвеcтировано около 12 млн. долларов. По словам Марко Буркхарда, Центр будет постоянно совершенствоваться, чтобы отвечать требованиям рынка. В числе стратегических целей были упомянуты банковские системы backoffice и телекоммуникации.
Валентин Синицын Фото автора
тенденции
Sun Microsystems: технологии доверия конце 2002 года компания «Свемел» заключила договор с корпорацией Sun Microsystems, по которому получила исходные тексты программного обеспечения ОС Solaris 9, Sun Ray 2.0 (клиентская и серверная части) и firmware ряда технических средств с возможностью их исследования, модификации, создания собственных версий программных продуктов, встраивания российских средств криптографии с последующей сертификацией в уполномоченных органах РФ. Технология тонких клиентов Sun Ray позволяет полностью избавиться от необходимости хранить, поддерживать и периодически обновлять программное обеспечение на рабочих местах пользователей. Авторизация с помощью смарт-карт позволяет получить доступ к поль-зовательской сессии с любого доступного терминала Sun Ray. Джим Бейти (Jim Baty), Вице-президент Sun Microsystems, в своем выступлении делал основной упор на возможность работы с любого терминала со своими документами. Человек просыпается утром, у него дома стоит терминал Sun Ray, он читает почту, делает какие-то дела, потом едет в офис, с офисного терминала начинает работу с того места, где ее прервал и т.д. В настоящее время разработана концепция «flexible office», заключающаяся в следующем. У сотрудников нет фиксированных рабочих мест. Сотрудник, приходя на работу, занимает любое свободное рабочее место. Если сотрудник покидает рабочее место больше, чем на полдня, он освобождает его от своих личных вещей с тем, чтобы оно могло быть использовано кем-то еще. Личные вещи сотрудник хранит в мобильной тумбе, которую он подкатывает к своему рабочему месту на время работы; на ночь тумбы «паркуются» в специальном месте. Использование терминалов идеально для работы с секретной информацией. Поскольку терминал не имеет дисковых накопителей, скопировать информацию на внешние носители невозможно. Исключение составляют только USB-накопители, которые сложно подключить непосредственно к терминалу, но разрешение на их использование легко настраивается в зависимости от прав пользователя. Таким образом, схе-
10
ма сети с секретными данными выглядит таким образом: 2 сервера Sun Ray, один отвечает за работу с секретной информацией и не имеет выхода в сеть. Второй – для работы с обычными документами и в Интернет. У пользователя есть 2 карты. Вставив первую карту в терминал, он работает с секретной документацией. Вставив вторую – получает доступ в Интернет. И между этими сессиями нет возможности передавать данные, что исключает их утечку. Терминалы Sun Ray работают под ОС Solaris 9, включая офисное программное обеспечение StarOffice7, веб-браузер firefox, почтовый клиент thunderdird и многое другое. Естественно, что в любой фирме существует немало программного обеспечения, работающего только под Windows и не имеющего аналогов под Solaris. В этом случае Sun рекомендует ставить отдельный сервер Windows-приложений, доступ к которому можно получить с помощью программного пакета Citrix MetaFrame. В настоящий момент технология Sun Ray внедряется в МИД РФ. Анатолий Смирнов, руководитель Центра информатики МИД РФ, сделал доклад об успехах этой работы. По его словам, практически для всего программного обеспечения, используемого в МИД, были найдены аналоги, работающие под ОС Solaris 9. Исключение составили некоторые самописные программы, котрые в настоящий момент дорабатываются. Он также отметил, что переподготовка пользователей идет не очень гладко. Наиболее сложным оказался психологический момент, при котором пользователю удобнее работать в MS Office, чем в StarOffice. Ну и напоследок ложка дегтя в бочке меда. Раздражает множество мелких, но очень неприятных недочетов. Мышь в терминале без скроллинга. USB-порты на задней стенке терминала расположены очень неудобно, например, подключить flash-накопитель без удлинителя невозможно. Список можно продолжать и далее. Но в целом технология Sun Ray заслуживает пристального внимания, особенно в свете доработки ОС Solaris 9 с учетом специфики нашего региона.
Кирилл Тихонов
тенденции
SoftInform Search Technology – новая технология поиска документов оссийская компания СофтИнформ (http://www.softinform.com) представила свою технологию поиска «SoftInform Search Technology», а также ее реализацию в новом одноименном корпоративном продукте – системе поиска информации в локальной сети. Это SearchInform Desktop Edition – программа полнотекстового поиска на персональном компьютере и SearchInform Corporate Edition – корпоративная система поиска в информационной базе предприятия. Корпоративная версия состоит из серверной и клиентских частей (серверов может быть несколько для увеличения производительности). Сервер создает индексы указанных ресурсов, а затем, обрабатывая клиентские запросы, выдает пользователям результаты поиска в зависимости от персональных прав пользователя. Позже разработчики объявили о том, что в функционал добавлена возможность сквозного использования системных разрешений безопасности для файлов и папок (в первых версиях права на найденную информацию необходимо было делегировать дополнительно). В данный момент система SearchInform работает со всеми документами Microsoft Office, PDF-файлами, HTML, базами почтовых клиентов от MS, тестовыми файлами формата plain-text, базами данных Access, MS SQL, Oracle, а также любыми СУБД, поддерживающими SQL. При поиске учитывается все множество слов, встречающихся в документе, с задействованием всех словоформ и словаря синонимов. При выводе результатов поиска показываются максимально похожие фрагменты документов независимо от изменений, внесенных в текст (удаление части текста, замена), а также указывается процент релевантности. При этом в корпоративной версии используется трехуровневое управление правами доступа к информации – к самому индексу (т. е. сама возможность поиска в конкретном индексе), к источникам данных и к проиндексированным файлам. Такое разграничение прав является обязательным при работе корпоративной системы, так как, разумеется, что сам сервер индексации должен иметь права доступа ко всем индексируемым документам. Дан-
№5, май 2005
ная система разграничения прав означает, что пользователь, не имеющий прав на конкретный документ, не сможет получить в окне предпросмотра найденные в нем данные. Пробные Trial-версии сервера и клиента можно скачать с сайта: http:// www.searchinform.com. На пресс-конференции директор компании Лев Матвеев акцентировал внимание на том, что это прежде всего глобальная технология, а не только единичный продукт. Сегодня компания «СофтИнформ» делает акцент не просто на продажу готового продукта, а на разработку корпоративных решений
для конкретных заказчиков. По его словам, возможности технологии не исчерпываются перечисленными типами данных и при необходимости заказного решения компания готова создать на основе технологии поиска решение для конкретного заказчика. Пока что серверная и клиентская часть функционируют только на платформе Windows. Данное неудобство частично компенсируется возможностью индексирования сетевых ресурсов, однако для моногамных UNIX-сетей такое решение окажется неприемлемым.
Роман Марков
11
администрирование
FreeBSD TIPS: ИСПОЛЬЗОВАНИЕ SYSLOG – Позвольте, товарищи, у меня все ходы записаны! – Контора пишет, – сказал Остап. И.Ильф, Е.Петров «12 стульев».
Протоколирование работы любой системы, и прежде всего сервера, – одна из важнейших составляющих администрирования. Именно в log-файлы мы заглядываем в первую очередь, когда в системе возникают какие-то неполадки. Оттуда черпаем уверенность, что та или иная программа работает так как ожидается. При разработке веб-приложений log-файл становится важнейшим источником отладочной информации. Об особенностях работы демона syslog, отвечающего за протоколирование системной информации, и пойдет речь.
СЕРГЕЙ СУПРУНОВ Что такое syslog Syslog является централизованным сервисом, обеспечивающим сбор и запись протокольной информации, поступающей от различных компонентов операционной системы и пользовательских процессов. Сторонние программы, как правило, умеют работать со своими лог-файлами самостоятельно, хотя многие из них можно настроить на работу и с демоном syslogd. К преимуществам использования syslog можно отнести возможность управлять процессом сбора необходимой информации с помощью одного конфигурационного файла, что обеспечивает единообразие получаемых log-файлов и в итоге упрощает управление ими. Работа службы syslog обеспечивается демоном syslogd, который автоматически запускается при старте системы. Он постоянно находится в памяти, ожидая сообщения от других процессов и обрабатывая их в соответствии со своими настройками. Каждое сообщение характеризуется уровнем и источником (facility). Уровень задает степень важности сообщения с точки зрения функционирования системы. Файл syslog.h определяет следующие уровни (приоритеты):
12
Òàáëèöà 1. Óðîâíè ñîîáùåíèé
В таблице 1 уровни сообщений перечислены в порядке убывания. Этот порядок понадобится в дальнейшем при обсуждении синтаксиса конфигурационного файла. Обозначения уровня сообщения, записанные в одной строке (например, emerg и panic), – это синонимы, и может быть использовано любое из них. Однако panic, error и warn (указанные в таблице вторыми) считаются устаревшими, и следует избегать этих обозначений при редактировании конфигурационного файла. Вместо них используйте emerg, err и warning соответственно.
администрирование Возможные источники сообщения перечислены в таблице 2: Òàáëèöà 2. Èñòî÷íèêè ñîîáùåíèé
чить требуемый уровень безопасности, исключив возможность чужим хостам писать что-нибудь в ваши журналы. Установить ограничения на входящие соединения позволяет ключ -a (см. man syslogd). Также не последнюю роль играет правильно настроенный брандмауэр. Еще один полезный ключ -l позволяет задавать дополнительные файлы сокетов, которые прослушиваются демоном syslogd в дополнение к используемому по умолчанию /var/ run/log. Например, этот ключ необходим, чтобы syslog мог обслуживать программы, запущенные в chroot-окружении. В частности, так работает named, начиная с версии BIND 9. Во FreeBSD 5.3 syslogd запускается со следующими ключами: # ps -wax | grep syslog 321 ?? Ss 0:01,67 /usr/sbin/syslogd -l /var/run/log -l /var/named/var/run/log -s
Синтаксис конфигурационного файла
При настройке какого-либо приложения для работы со службой syslog уточните, какой источник (facility) оно использует. Некоторые программы позволяют указать источник самостоятельно. Например, демон clamd (главный процесс антивируса clamav) по умолчанию использует local6, однако позволяет задавать другой источник (параметр LogFacility в конфигурационном файле). В ряде случаев может быть полезно объединить его сообщения с сообщениями почтовых служб, указав в качестве источника LOG_MAIL.
Параметры запуска демона Полный список параметров запуска можно получить на странице руководства man syslogd. Здесь рассмотрим только некоторые из них. Syslog способен записывать поступающие сообщения в лог-файлы (которые обычно размещаются в каталоге /var/ log), отправлять на консоль или подключенный терминал пользователя, пересылать на удаленный хост или отдавать на обработку внешней утилите по конвейеру. Для работы по сети syslog использует порты 514 (UDP и TCP). Запущенный без дополнительных параметров, syslogd будет прослушивать эти порты, ожидая входящих сообщений. Ключ -s запрещает принимать входящие сообщения, но сокеты на портах 514 по-прежнему создаются для исходящих соединений, чтобы syslogd мог отправлять сообщения удаленным хостам. Удвоение ключа (-ss) запрещает и исходящие соединения. По умолчанию syslogd запускается с ключом -s (см. /etc/ defaults/rc.conf, параметр syslogd_flags), поэтому входящие соединения запрещены. Если вы хотите использовать службу syslog вашего сервера для обслуживания нескольких машин, добавьте в /etc/rc.conf следующую строчку: syslogd_flags=””
Она переопределит значение, установленное в /etc/ defaults/rc.conf, и syslogd сможет обслуживать входящие соединения. Естественно, в этом случае необходимо обеспе-
№5, май 2005
Настройка протоколирования осуществляется в файле /etc/ syslog.conf. Само собой разумеется, что редактировать его может только пользователь root. Этот файл содержит два вида строк – условно назовем их «фильтры» и «правила». Строка-фильтр определяет программу или хост, к сообщениям от которых будут применяться следующие за ней правила. Фильтр вида «!prog» (или «#!prog») указывает на то, что последующие строки относятся к логам, которые генерируются указанной программой prog. Синонимом этой записи является «!+prog». Строка «!-prog», наоборот, говорит о том, что последующие правила будут применяться ко всем сообщениям, кроме тех, которые исходят от программы prog. Допускается перечислять через запятую несколько программ, при этом знак «+» или «-» применяется ко всему списку. Если строка-фильтр задана как «+hostname», то в качестве источника сообщений, которые должны быть обработаны последующими правилами, будет использоваться указанный хост. Так же как и в случае с программами, символом «-» отмечается, что правила будут применяться ко всем сообщениям, кроме поступающих от указанного хоста. Через запятую можно задавать список хостов. Символ «*», заданный в качестве программы или хоста, отменяет действие фильтра, установленного ранее. То есть правила, указанные после такой строки, будут применяться ко всем сообщениям. Фильтры с именем хоста или программы независимы друг от друга и могут действовать одновременно. Например: # Ïðàâèëà, ðàñïîëîæåííûå çäåñü, ïðèìåíÿþòñÿ êî âñåì # ñîîáùåíèÿì +my.host # Ïðàâèëà ïðèìåíÿþòñÿ êî âñåì ñîîáùåíèÿì ñ my.host !logger # Ïðàâèëà ïðèìåíÿþòñÿ ê ñîîáùåíèÿì îò logger ñ my.host # (ôèëüòð õîñòà ïðîäîëæàåò äåéñòâîâàòü) !+su # Ïðàâèëà ïðèìåíÿþòñÿ ê ñîîáùåíèÿì îò su ñ my.host +* # Ïðàâèëà ïðèìåíÿþòñÿ ê ñîîáùåíèÿì îò su ñ ëþáûõ õîñòîâ # (ôèëüòð õîñòà îòìåíåí, ôèëüòð ïðîãðàììû ïðîäîëæàåò # äåéñòâîâàòü) !* # Ïðàâèëà ïðèìåíÿþòñÿ êî âñåì ñîîáùåíèÿì # (ôèëüòð ïðîãðàììû òàê æå îòìåíåí)
Строки правил имеют следующий вид:
13
администрирование facility.CMPlevel
destination
Здесь facility – источник сообщения («*» обозначает любые источники), level – уровень сообщений, которые будут обрабатываться в соответствии с данным правилом. Служебное слово «none», указанное вместо уровня, дает указание полностью исключить сообщения от данного источника. CMP – операция сравнения (допускаются символы «>», «<», «=», «>=», «<=», а также символ отрицания «!»). Если символ сравнения не указан, подразумевается «больше или равно», то есть обрабатываются все сообщения уровня level и выше. Destination указывает, куда следует сохранять данное сообщение. Это может быть log-файл (указывается полный путь, начиная с «/»), адрес удаленного сервера (начинается с символа «@»), имя пользователя (сообщения будут отправляться на терминал, к которому данный пользователь подключен). Также сообщение может быть передано на обработку внешней программе, для чего используется символ конвейера «|».
Несколько примеров правил
level0 и level3, будут выводиться на все подключенные терминалы. level0,level3.=debug
*
Сообщения службы точного времени, уровень которых выше критического (то есть emerg и alert), а также меньше или равные notice (notice, info и debug), будут отправляться на терминалы пользователей ntpuser и root. ntp.>crit,<=notice
ntpuser,root
Все сообщения уровня warning, исключая поступающие от почтовых служб, будут записываться в файл warn.log. *.=warning,mail.none
/var/log/warn.log
В данном случае все сообщения, уровень которых выше или равен crit, будут отправлены по электронной почте пользователю root. *.crit
| mail –s “critical message” root
Все сообщения ядра будут отправляться в файл kern.log. kern.*
/var/log/kern.log
Все сообщения об ошибках, а также сообщения уровней emerg, alert и crit будут помещены в all-err.log. Обратите внимание на дефис перед именем log-файла. По умолчанию сообщения буферизуются в памяти и записываются на диск по мере заполнения буфера. Это снижает нагрузку на файловую систему, но может вызвать потерю некоторой информации при аварийном отключении машины. Дефис перед именем файла заставляет демон syslogd немедленно записывать сообщения на диск. *.err
-/var/log/all-err.log
Отладочные сообщения пользовательских процессов будут выводиться на терминал, к которому в настоящее время подключен пользователь vasya. user.debug
@syslog.host.ru
В указанный файл будут помещаться все сообщения службы печати, уровень которых ниже warning. Как указывалось ранее, по умолчанию используется сравнение «больше или равно», а символ «!» его инвертирует, заменяя на «меньше». Если нужно исключить конкретный уровень, следует использовать конструкцию «!=». lpr.!warning
/var/log/printers.log
Сообщения уровня debug (и только его), имеющие facility
14
# kill –HUP `cat /var/run/syslog.pid`
Следует заметить, что если то или иное сообщение подпадает под действие нескольких строк в конфигурационном файле, то оно будет обработано в соответствии с каждой из них. Пример: mail.* *.=err
/var/log/maillog /var/log/error.log
В данном случае сообщения mail.err попадут как в maillog, так и в error.log.
Стратегия составления конфигурационного файла
vasya
Все сообщения от служб новостей и электронной почты будут пересылаться на 514-й порт машины syslog.host.ru. mail.*,news.*
Как видите, формат конфигурационного файла допускает перечисление в одной строке нескольких уровней, источников и пунктов назначения, что делает настройку более гибкой. Чтобы изменения после редактирования вступили в силу, нужно послать процессу syslogd сигнал HUP:
Завершая рассмотрение конфигурационного файла, скажу несколько слов о стратегиях его составления. Помимо очень популярной «лишь бы работало», можно выделить две основные, которые условно назовем «по источнику» и «по назначению». ! Первая стратегия, которую можно наблюдать в ряде дистрибутивов GNU/Linux, заключается в том, что для каждого источника сообщений записывается свое правило (или группа правил, если сообщения разных уровней должны обрабатываться по-разному). Ее достоинство – простота определения, куда записываются сообщения конкретных служб. ! Стратегия «по назначению» подразумевает создание по возможности только одной строки для каждого «получателя» сообщения, например, файла. Такого подхода придерживается, в частности, FreeBSD. В итоге можно
администрирование легко определить, какая информация заносится в конкретный лог-файл, но, например, пункты назначения для сообщений ядра приходится собирать по всему конфигурационному файлу.
Утилита logger В составе системы есть утилита logger, которая позволяет отправлять сообщения службе syslog непосредственно из командной строки. Ее удобно использовать при тестировании правил конфигурации, а также в разрабатываемых сценариях для протоколирования их работы. Примеры: user$ logger –p user.err “Error in user program!” user$ logger –h syslog.host.ru “Test it”
Первый пример отправит сообщение с facility user уровня err, которое будет обработано в соответствии с файлом конфигурации. Вторая команда отправит сообщение на удаленный хост, источник и уровень по умолчанию будут установлены как user.notice.
Использование механизмов ротации Рассмотренный выше механизм протоколирования не предусматривает какого-либо управления log-файлами. Сообщения просто помещаются в них согласно правилам, описанным в конфигурационном файле. Это значит, что файлы журналов будут постоянно расти, и если ничего не предпринимать, то рано или поздно заполнят все доступное пространство соответствующего раздела. Чтобы этого избежать, используется механизм ротации. Например, как только размер файла debug.log превысит 100 Мб, он переименовывается в debug.log.0 и упаковывается в debug.log.0.bz2. А вместо него создается новый debug.log. Далее, когда размер и нового файла достигает 100 Мб, debug.log.0.bz2 переименовывается в debug.log.1.bz2, и описанная выше процедура повторяется. Система хранит только определенное количество архивных файлов, удаляя наиболее старые из них. Это и есть ротация.
Утилита newsyslog В системе FreeBSD за ротацию отвечает утилита newsyslog, которая по умолчанию запускается в начале каждого часа демоном cron. Изменить период ротации можно, отредактировав файл /etc/crontab. Указанные в приведенном выше примере параметры ротации (размер файла, упаковка), а также ряд других задаются в конфигурационном файле /etc/newsyslog.conf. Для каждого файла, нуждающегося в ротации, в нем содержится строка в общем случае из девяти полей: имя файла, владелец и группа, права доступа, наибольший номер в имени архивных файлов, максимальный размер файла, период ротации, дополнительные флаги, а также путь к PID-файлу приложения, которому нужно отправить сигнал после ротации, и номер сигнала, который должен быть послан. (Отправка сигнала процессу может понадобиться, например, в том случае, если процесс держит log-файл все время открытым; если этого не сделать, то используемый файловый дескриптор не будет соответствовать вновь созданному файлу.) Некоторые поля могут быть опущены. Приведем два примера, полный и «типичный»:
№5, май 2005
/var/log/pflog root:wheel 600 3 100 /var/run/pflog.pid 1
* JB
↵
В соответствии с этим правилом файл pflog должен перезаписываться, как только его размер превысит 100 Мб (5-е поле) независимо от времени (символ «*» в 6-м поле). Архивные файлы буду т иметь имена вида pflog.X.bz2 (pflog.0.bz2, pflog.1.bz2 и т. д), причем X не может быть больше трех (параметр 3 в 4-м поле). Флаг J указывает, что архивный файл должен упаковываться с помощью утилиты bzip2. Благодаря флагу B в архивируемый и вновь создаваемый файлы не будут добавляться служебные сообщения о ротации, поскольку файл воспринимается как двоичный. Вновь создаваемый файл будет принадлежать пользователю root и группе wheel (это поле можно было бы опустить, поскольку этот владелец устанавливается по умолчанию). Права доступа будут установлены в rw------- (числовое значение 600), то есть только владелец сможет читать этот файл и писать в него. Наконец, процессу, PID которого хранится в файле /var/run/pflog.pid, будет послан сигнал 1 (HUP), чтобы он переоткрыл свой лог-файл. /var/log/maillog
640
7
*
@T00
J
Это правило указывает параметры ротации для файла maillog: независимо от размера (звездочка в 5-м поле), файл будет перезаписываться каждую ночь в 00:00 (в man newsyslog.conf формат указания времени описан достаточно подробно). Архив должен упаковываться, будут сохраняться последние 8 архивов (с номерами от 0 до 7 включительно), вновь созданный файл будет принадлежать пользователю root (значение по умолчанию, поэтому поле владельца пропущено) и иметь права доступа rw-r-----. Для просмотра упакованных log-файлов можно использовать утилиты zcat и bzcat (для gzip и bzip2 соответственно). Midnight Commander вызывает соответствующие утилиты автоматически. После редактирования файла newsyslog.conf никакие сигналы никуда посылать не требуется – конфигурация будет перечитана при следующем вызове newsyslog. Следует заметить, что утилита newsyslog не привязана к демону syslogd. То есть она может быть использована для ротации любых файлов, которые в этом нуждаются. Если ротация включается для логов, которые приложение ведет самостоятельно (например, к логам clamd или squid), то особенно внимательно отнеситесь к указанию владельца и правам доступа. Их неправильное указание может привести к тому, что после ротации приложение, запущенное от имени непривилегированного пользователя, не сможет осуществлять запись во вновь созданный файл.
Подводя итоги Система syslog является очень мощным и эффективным инструментом протоколирования различных событий, происходящих в системе. Настройки, используемые по умолчанию, достаточно сбалансированы и вполне работоспособны для большинства систем. Тем не менее понимание механизма работы syslog позволит вам существенно повысить качество протоколирования, настроив запись журнальной информации строго в соответствии со своими потребностями.
15
администрирование
КРЕПКИЙ ОРЕШЕК NUT Как известно, защитой от некачественного электропитания может служить только качественный UPS. Однако даже танковый аккумулятор не стоит ровным счетом ничего, если он не способен вовремя остановить систему. Здесь на помощь приходит инструментарий NUT.
ВАЛЕНТИН СИНИЦЫН радиционно для управления ИБП применяются штатные утилиты, разработанные производителем оборудования. Зачастую они доступны не только для Windows, но и для UNIX, Linux и других систем. Хотя эти инструменты можно назвать кроссплатформенными в формальном смысле этого слова, нередко они несут на себе «отпечаток» той ОС, для которой были созданы изначально. Как правило, это программы с графическим пользовательским интерфейсом, что делает их малопригодными для запуска в режиме демона, к которому привыкли администраторы UNIX. Более того, и сама графическая среда X Window устанавливается на сервер далеко не всегда. Об очевидных проблемах совместимости (производитель может не предоставлять ни пакеты для вашего любимого дистрибутива, ни исходные тексты для самостоятельной сборки) не стоит и говорить. Выходом из сложившейся ситуации может стать использование открытых решений, об одном из которых – Network UPS Tools (NUT) версии 2.0 – мы и поговорим подробнее. Что подразумевает собой понятие «настройка ИБП»? В первую очередь, это обеспечение корректного останова ОС при истощении аккумуляторных батарей и последующий автоматический запуск компьютера после восстановления электропитания. Во-вторых, это наблюдение за такими параметрами состояния ИБП, как режим работы («от сети» или «от батарей»), степень разряда АКБ, входное и выходное напряжение, температура, а также мощность нагрузки. В последнем случае фатальными могут оказаться как слишком большие, так и слишком маленькие значения, о чем будет сказано чуть позже. Прежде чем переходить к использованию NUT, давайте вкратце рассмотрим его внутреннее устройство.
Мониторинг ИБП изнутри В терминологии NUT программный код, отвечающий за непосредственное взаимодействие с оборудованием, называется «драйвер ИБП» (UPS driver). Следует, однако, понимать, что этот драйвер существенно отличается от драйверов традиционных устройств: сетевых и звуковых карт, клавиатур, «мышей» и т. п. Последние выполняются в режиме ядра и используют его API для передачи сообщений приложениям. В свою очередь драйвер ИБП – обычная программа, имеющая интерфейс командной строки и периодически запрашивающая характеристики ИБП через соответствующее устройство в файловой системе. Например, /dev/ttySx для UPS, подключенного к последовательному порту в системе Linux 1
16
или /dev/usb/hid/hiddev/x для устройств, управляющихся через USB1. Драйвер ИБП инкапсулирует в себе протокол, который поддерживает UPS и напрямую используется крайне редко. Его основная задача – привести данные, полученные от ИБП в стандартный формат и передать их демону upsd через сокет UNIX, расположенный в каталоге statedir (см. ниже) для последующей обработки. Сам upsd не предпринимает никаких активных действий, но выполняет роль диспетчера сообщений, транслирующего все необходимые сведения по запросу многочисленных клиентов, которые могут быть установлены как в локальной, так и на удаленной системе. Именно upsd поддерживает списки контроля доступа (ACL) и определяет, кто сможет наблюдать за выделенным ИБП, а кто – нет. Клиенты – самое высокоуровневое приложение в номенклатуре NUT. Среди них есть непрерывно наблюдающие за «здоровьем» ИБП (upsmon), обеспечивающие доступ к считыванию и изменению параметров UPS через интерфейс командной строки (upsc/upscmd) или через Web (upstats/ upset), планировщики (upssched) и даже графические утилиты: KNutClient (http://www.alo.cz/knutclient), WMNut (http:// wmnut.mgeups.org»). Таким образом, для настройки ИБП необходимо выбрать соответствующий драйвер (NUT 2.0 поддерживает изделия около 25 различных производителей, в том числе APC, Powercom, MGE, Ippon, и др.), назначить списки контроля доступа для upsd и подготовить один или более клиентов. Обязательным минимумом является upsmon, который и будет останавливать систему в случае разряда батарей. Рекомендуется также обеспечить средства для мониторинга параметров ИБП: upsc, upstat/upset и т. д. Однако прежде чем произвести упомянутые выше действия, NUT необходимо установить в вашу систему. Наиболее общим способом является сборка из исходных текстов, и поэтому мы поговорим о ней подробнее.
Собираем собственную версию NUT Прежде чем браться за компиляцию NUT, проверьте, существует ли для вашей системы готовый пакет (http://eu1. networkupstools.org/packages.html). Если таковой имеется, убедитесь, что в него включен драйвер для вашей модели ИБП (учтите, что один драйвер может поддерживать несколько различных устройств). Если нужный драйвер отсутствует, вам все же придется произвести самостоятельную сборку, но вы сможете использовать spec-файлы RPM,
NUT поддерживает как ИБП, подключающиеся к последовательному порту, так и более новые USB HID UPS и даже SNMP UPS (RFC 1628). В последних двух случаях соответствующие драйвера (hidups, newhidups и snmp-ups) пока что имеют статус экспериментальных.
администрирование build-сценарии и прочие подобные вещи, чтобы не нарушить пакетную базу данных вашего дистрибутива. Загрузите архив nut-2.0.x.tar.gz с сайта http://www.networkupstools.org и распакуйте его в любой подходящий каталог. NUT использует стандартную среду autoconf/automake, и его сборка может быть выполнена привычной последовательностью команд:
манду «make install-conf», то сейчас сможете воспользоваться шаблонами, сохраненными в файлах *.sample. Первый файл, в который вам предстоит внести изменения, называется ups.conf. Он определяет все параметры подключенных к вашему компьютеру ИБП, а также задает некоторые глобальные опции, например, учетную запись, от имени которой будут выполняться драйверы (директива user) и интервал опроса оборудования (директива pollinterval).
# ./configure <ïàðàìåòðû> && make && make install Ëèñòèíã 1. Ïðèìåð ôàéëà ups.conf
!
!
!
!
!
Среди полезных параметров сценария configure назовем: --prefix – задает общий «корень» для всего дерева директорий NUT. Значением по умолчанию является /usr/ local/ups, но вы можете выбрать другой путь, например, /usr/local или /usr, чтобы установить NUT в общесистемные каталоги (исполняемые файлы – в /usr/bin вместо /usr/local/ups/bin и т. д.). --with-statepath – задает каталог для хранения сокетов UNIX, создаваемых драйверами и другой информации о состоянии. Значение по умолчанию – /var/state/ups. Пользователь, от имени которого работает NUT (см. ниже), должен иметь право чтения/записи на эту директорию. --with-port – указывает TCP-порт, используемый, в частности, демоном upsd для приема входящих соединений. По умолчанию NUT 2.0 использует порт 3493, а более ранние (несовместимые) версии – 3305. --with-user – задает пользователя, от имени которого будут выполняться демоны NUT. Значение по умолчанию – nobody. При желании вы (или разработчики дистрибутива) можете создать для NUT специальную учетную запись и группу, например, nut:nut. --with-drivers – здесь указывается список драйверов ИБП, подлежащих сборке. В подавляющем большинстве случаев необходимо выбрать лишь один из них.
Более подробную информацию можно найти в файле docs/configure.txt в архиве с исходными текстами NUT. После выполнения configure наберите «make» и «make install» (от имени root), чтобы завершить сборку и установку. Для создания шаблонов конфигурационных файлов используйте «make install-conf». Помимо этого, не забудьте создать каталог для хранения сокетов (statepath) и назначить ему необходимые права доступа (0700, владелец nut:nut, где «nut» – пользователь, от имени которого будут выполняться демоны). Подробности ищите в файле INSTALL, включенном в стандартный комплект поставки.
Запускаем NUT В данном разделе мы рассмотрим настройку NUT в самом простом случае, когда имеется один ИБП, подключенный к одному компьютеру. В принципе NUT способен поддерживать и более сложные системы, когда один UPS контролирует несколько машин. В такой ситуации компьютер, к которому подключен ИБП, является главным (master) и отвечает за своевременное оповещение и выключение подчиненных (slave) систем. Конфигурационные файлы NUT хранятся в каталоге <prefix>/etc. Если на предыдущем этапе вы выполнили ко-
№5, май 2005
user = nut [ups0] driver = ippon port = /dev/ttyS0 desc = "Server UPS"
Данный файл определяет один источник бесперебойного питания, имеющий имя «ups0» и подключенный к первому последовательному порту (/dev/ttyS0). Поле «desc» является необязательным и задает текстовую строку-описание для ИБП. Поле «driver» определяет название драйвера, который будет использоваться для связи с UPS. В данном случае используется ippon, универсальный драйвер для всех ИБП одноименного производителя. Поля «driver» и «port» должны присутствовать в каждой секции файла ups.conf. Руководство пользователя NUT также рекомендует удостовериться, что файл устройства (в нашем примере /dev/ttyS0) не доступен ни для кого, кроме пользователя «nut». После того как файл ups.conf создан, вы можете проверить его корректность, загрузив драйвер ИБП. Для этого используется утилита upsdrvctl, расположенная в каталоге <prefix>/bin. # upsdrvctl start
Если все пойдет гладко, утилита отрапортует об успешном обнаружении ИБП и перейдет в фоновый режим. В противном случае будет выдано сообщение об ошибке. Проверьте, правильно ли заполнены поля driver и port, а также удостоверьтесь, что выбранный вами драйвер не требует указания дополнительных параметров. Если таковые имеются, добавьте их в соответствующую секцию ups.conf. Другой распространенной проблемой является невозможность создания файлов в каталоге statepath при работе от имени пользователя, указанного директивой «user» в файле ups.conf (или параметром --with-user сценария configure, если таковая отсутствует). Теперь, когда в вашей системе имеется новый фоновый процесс, собирающий информацию о состоянии ИБП, настало время подумать и о том, как эту информацию получать. В первую очередь необходимо настроить демон upsd, поскольку, как мы помним, именно он отвечает за передачу этих данных приложениям-клиентам. Конфигурация upsd сводится к построению списков контроля доступа (ACL), которые сохраняются в файле <prefix>/ upsd.conf. Ëèñòèíã 2. Ïðèìåð ôàéëà upsd.conf ACL local 127.0.0.1/32 ACL all 0.0.0.0/0 ACCEPT local REJECT all
17
администрирование Данный файл определяет два ACL-списка: «local» (127.0.0.1/32) и «all» (все узлы Сети). Директива ACCEPT предписывает upsd принимать соединения с локального хоста, а директива REJECT – пресекать любые попытки связи с узлов «all». Upsd просматривает эти директивы в порядке перечисления до тех пор, пока не будет найдено совпадение, поэтому можно быть уверенным, что наш ИБП будет «виден» только с компьютера, к которому он подключен. На мой взгляд, для мониторинга ИБП с других машин удобнее использовать SSH-соединение или веб-интерфейс, а не прямое подключение к демону upsd. Далее, необходимо создать файл <prefix>/upsd.users, в котором будут перечислены учетные записи пользователей, обладающих правами администратора. Администраторы могут изменять переменные состояния драйверов и подавать команды ИБП (например, «выключить звуковое оповещение»). Ëèñòèíã 3. Ïðèìåð ôàéëà upsd.users [admin] password = my_passwd allowfrom = local actions = set instcmds = all upsmon master
Каждому пользователю соответствует отдельная секция файла upsd.users. В данном случае мы определили учетную запись «admin» с паролем «my_passwd» (обратите внимание, что он хранится в открытом виде), разрешили доступ с узлов из списка «local» и предоставили право устанавливать значения переменных (actions = set) и выполнять любые команды (instcmds = all). Более полное описание формата upsd.users можно найти в соответствующем разделе руководства man. Поскольку файлы upsd.conf и upsd.users содержат конфиденциальную информацию в незашифрованной форме, следует ограничить доступ к ним: # chown root:nut upsd.conf upsd.users # chmod 0640 upsd.conf upsd.users
Теперь все готово к тому, чтобы запустить демон upsd.
input.frequency: 50.1 input.voltage: 208.3 output.voltage: 209.4 ups.load: 012 ups.mfr: Ippon ups.model: universal driver ups.status: OL ups.temperature: 25.0
Здесь ups0 – название вашего ИБП, указанное в файле ups.conf, а localhost – имя узла, на котором запущен демон upsd. Вы можете видеть различные параметры состояния: ! заряд батарей (battery.charge2); ! температуру (battery.temperature); ! режим работы (ups.status: OL означает «on-line/от сети», OB – «on battery/от батарей», LB – «low battery/батареи разряжены»); ! входное и выходное напряжение (input.voltage, output. voltage). Полный список характеристик зависит от драйвера ИБП. Удостоверившись в работоспособности данной конфигурации, можно приступать к настройке upsmon – центрального клиентского демона, обеспечивающего реакцию системы на сигналы ИБП.
Останов системы В режиме работы от батарей, перед самым их истощением, ИБП генерирует сообщение «battery low». Upsmon получает и обрабатывает этот сигнал, вызывая команду «shutdown -h now» или подобную ей для корректной остановки системы. Более детально данный процесс можно описать следующей схемой: ! ИБП генерирует событие «battery low». ! Upsmon получает данный сигнал и инициирует выключение: ! создается специальный файл POWERDOWNFLAG, являющийся признаком того, что система находится в режиме отключения в связи с истощением батарей ИБП; ! выполняется команда SHUTDOWNCMD; ! rc-сценарий использует проверку флага POWERDOWNFLAG для предотвращения «энергетической гонки» (power race).
# <prefix>/sbin/upsd
Если запуск прошел нормально (о чем свидетельствует переход upsd в фоновый режим), вы можете наконец-то выполнить программу-клиент. В качестве «пробы пера» хорошо подойдет upsc, простая утилита, входящая в состав NUT и позволяющая просматривать текущие параметры состояния ИБП.
Все упомянутые выше параметры задаются в файле <prefix>/upsmon.conf, который может иметь следующий вид: Ëèñòèíã 4. Ïðèìåð ôàéëà upsmon.conf MONITOR ups0@localhost 1 admin my_passwd master RUN_AS_USER nut POWERDOWNFLAG /killpower SHUTDOWNCMD "/sbin/shutdown -h now"
# upsc ups0@localhost battery.charge: 97.1 battery.voltage: 13.5 driver.name: ippon driver.parameter.port: /dev/ttyS0 driver.version: 2.0.0 driver.version.internal: 0.02 2
18
Замечание. Внимательный читатель может спросить: хватит ли у демона upsmon, выполняющегося от имени пользователя RUN_AS_USER (в нашем примере – nut) прав на запуск команды «shutdown»? Да, поскольку во время старта upsmon специально «резервирует» для этих целей про-
Обратите внимание, что для некоторых драйверов эта важная характеристика не предоставляется оборудованием, а вычисляется на основании других параметров. Используйте ее только в оценочных целях.
администрирование Аппаратные аспекты Непосредственное подключение UPS к системному блоку, как правило, не вызывает затруднений и подробно описывается в документации к оборудованию. Проблема состоит в другом: как настроить компьютер таким образом, чтобы он не только корректно выключался, но и автоматически включался? С точки зрения компьютера (не операционной системы!), истощение батарей ИБП есть сбой электропитания (UPS просто перестает генерировать выходное напряжение, как только процент разрядки превысит некоторый критический порог). Современные версии BIOS позволяют настроить реакцию системы на события такого рода. Соответствующая опция обычно называется «After power fail» или подобным образом и может быть найдена в самых различных подменю. Заводская установка – «Off» означает «требуется ручное включение». Измените ее на «On», и тогда компьютер будет автоматически включаться при появлении напряжения на входных клеммах блока питания. Поскольку ИБП, переходя в режим работы «от сети», сразу же подает ток на все обслуживаемые устройства, от администратора больше не требуется никаких настроек. Другим важным аспектом является мощность нагрузки. Памятуя поговорку «все крайности плохи», можно сказать,
что здесь опасна как перегрузка, так и «недогрузка». С первой из них все понятно: подключение к ИБП лазерного принтера, утюга или электрочайника приведет к срабатыванию предохранителя и немедленному отключению потребителей тока. Никакого сигнала «battery low» в данном случае сгенерировано не будет, так что upsmon, upsd и прочие окажутся бесполезными. Как это ни удивительно, «недогрузка» зачастую грозит теми же последствиями. В некоторые ИБП встраивается так называемая «зеленая функция» (green function), предотвращающая работу на холостом ходу при малой внешней нагрузке. Опыт показывает, что ИБП Ippon Back Power Pro 400 не замечает «народный сервер» Celeron-600/256 RAM/HDD без монитора. Симптомы, свидетельствующие о срабатывании «зеленой функции», таковы: слишком малое время работы от аккумулятора (5-10 минут), несмотря на то, что подключенный к ИБП компьютер имеет небольшую мощность; некорректный останов ОС при условии наличия правильно настроенной системы слежения (NUT или подобной). Для устранения «неполадки» можно обратиться в сервисный центр или же решить проблему с другого конца – повысить общую мощность, например, подключив к компьютеру дополнительные жесткие диски.
цесс, работающий с привилегиями суперпользователя. Угроза для безопасности системы здесь невелика, поскольку сетевое взаимодействие и прочая активность upsmon происходит в другом процессе. При возникновении критической ситуации непривилегированный процесс-потомок сообщает об этом «дремлющему» родителю, который и выполняет команду SHUTDOWNCMD. Директива MONITOR задает ИБП, за которым будет наблюдать upsmon (в нашем примере – ups0@localhost) и реквизиты пользователя. Поскольку последние содержатся в файле upsmon.conf в открытом виде, необходимо снова позаботиться об ограничении доступа (см. выше). «Энергетической гонкой» называется ситуация, когда ИБП переходит в режим работы от сети вскоре после генерации сигнала «battery low», в процессе останова системы. В этом случае компьютер, настроенный на автоматическое включение после сбоя электропитания (см. раздел «Аппаратные аспекты») окажется заложником собственной «осторожности», ведь фактически никакого сбоя не произойдет! Мне приходилось слышать, что некоторые модели UPS разрешают данную проблему автоматически, однако, «во избежание» предлагаю вам использовать следующий механизм, обеспечивающий корректную работу системы даже в случае «глупого» ИБП (см. листинг 5): ! В начале своего выполнения rc-сценарий, отвечающий за останов системы (/etc/rc.d/halt, rc.halt и т. п.) проверяет наличие флага POWERDOWNFLAG. ! Если флаг присутствует, сценарий выполняет все действия, необходимые для корректного завершения работы (выгружает демоны, размонтирует файловые системы и т. п.), после чего засыпает на непродолжительное время, например на 2-3 минуты. ! Если по истечении этого времени rc-сценарию вернулось управление (т.е. компьютер остался включенным,
несмотря на то, что батареи ИБП истощены), мы подозреваем «энергетическую гонку» и принудительно перезагружаем систему.
№5, май 2005
Для проверки флага лучше использовать не стандартные средства bash (оператор -f), а специальный параметр командной строки утилиты upsmon, -K. В данном случае код завершения upsmon будет равен EXIT_SUCCESS (0), если флаг присутствует и EXIT_FAILURE в противном случае. Это обеспечивает более надежное функционирование сценария. Ëèñòèíã 5. rc-ñöåíàðèé, îáåñïå÷èâàþùèé çàùèòó îò power race /usr/local/ups/sbin/upsmon -K >/dev/null 2>&1 if [ $? = 0 ]; then KILLPOWER=1 else KILLPOWER=0 fi # ...ðàçìîíòèðîâàíèå ÔÑ, îñòàíîâ äåìîíîâ if [ $KILLPOWER = 1 ]; then echo "Swithching UPS off, please wait" /usr/local/ups/bin/upsdrvctl shutdown sleep 120
fi
# Power-race workaround echo “Hmm... Still alive?!” reboot -d -f -i
В рамках одной статьи сложно осветить все возможности такого богатого инструмента, как NUT. «За бортом» остались и веб-приложения, и поддержка SSL, и многие другие вопросы. Однако, я надеюсь, изложенных здесь сведений будет достаточно, чтобы понять, нужен ли вам NUT, получить представление о его архитектуре и базовые навыки конфигурирования. За более подробной информацией вы всегда сможете обратиться к страницам руководства и справочной документации, распространяющимися вместе с исходными текстами NUT. Успехов!
19
администрирование
ЧТО ВАЖНО ЗНАТЬ ОБ IP-ТЕЛЕФОНИИ?
Еще не так давно сети с коммутацией каналов (телефонные сети) и сети с коммутацией пакетов (IP-сети передачи данных) существовали практически независимо друг от друга и использовались для различных целей. Телефонные сети использовались для передачи голосовой информации, а IP-сети – для передачи данных. Определенной вехой в истории телекоммуникаций и Интернета является IP-телефония, позволившая передавать «голос» поверх получивших уже значительное распространение IP-сетей. IP-телефония дала возможность общения не только пользователям Интернета. С помощью специальных устройств – шлюзов (gateway) она также объединила телефонные сети и сети передачи данных.
МИХАИЛ ПЛАТОВ 20
администрирование Пять причин использовать IP-телефонию С помощью IP-телефонии вы сможете: 1. Сократить расходы на междугородные и международные переговоры. Один из наиболее распространенных вариантов использования IP-телефонии. Связь через IP получается дешевле по ряду причин. Во-первых, в IP-телефонии используются широко распространенные (и дешевые) сети с коммутацией пакетов1 (в отличие от более дорогостоящих сетей с коммутацией каналов, применяемых в традиционной телефонии). Во-вторых, благодаря использованию голосовых кодеков (вокодеров, voice coders) достигается существенное сжатие речевой информации. Так, при передаче голосового потока в системах цифровой телефонии2 требуется канал 64 кБит/с (ISDN). В системах IP-телефонии, при использовании наиболее популярных на сегодняшний день кодеков, требуется гораздо меньшая пропускная способность (6-13 кБит/с). Можно выделить два наиболее популярных варианта подключения к провайдерам междугородной и международной телефонии: ! Через ТФОП (Телефонная сеть Общего Пользования) – при подключении пользователь набирает «городской» номер сервера IP-телефонии провайдера, проходит аутентификацию (по pin-коду) и набирает нужный ему номер. Чтобы пользоваться IP-телефонией по этой схеме, достаточно иметь обычный городской номер. ! С помощью специальных «шлюзов» – в этом случае пользователь приобретает специальное устройство – шлюз IP-телефонии, с помощью которого получает возможность совершать звонки без использования ТФОП (через интернет-канал, предоставляемый провайдером). В место шлюзов также можно применять программные (в том числе и бесплатные) и аппаратные IP-телефоны. 2. Построить корпоративную телефонную сеть. В данном случае для ведения телефонных разговоров в рамках предприятия используется внутренняя IP-сеть3. Однако в минимальном варианте такие системы используются достаточно редко4 и как правило, корпоративные системы IP-телефонии также решают следующие задачи: ! обеспечение «мобильности» внутренних пользователей; ! организация связи между географически отдаленными филиалами; ! объединение телефонной емкости филиалов в единый номерной план; ! организация аудио- и видеоконференций; ! построение центров обработки вызовов (call-центров). 1
2 3
4 5
Данное направление систем IP-телефонии очень хорошо развито производителями оборудования. Наиболее известными поставщиками являются такие компании как, Cisco Systems, Avaya, Nortel Networks. 3. Получить дополнительные возможности, не свойственные обычным телефонным сетям: сlick2Dial – возможность совершить звонок (например, менеджеру продаж или в службу тех. поддержки) прямо с веб-сайта компании, голосовые авто-информаторы на основе IVR (Interactive Voice Response), аудио- и видеоконференций, голосовую почту и историю пропущенных звонков через web, определение присутствия абонента в сети и т. д. 4. Обеспечить «дешевую связь» в пределах зон Wi-Fi. Пользователь, находящийся в пределах беспроводной точки доступа 802.11 может применять VOIP (вместо сотовой связи)5. 5. Организовать сеансы аудиосвязи или связи типа точка-точка через Интернет. Используя стандартное оборудование IP-телефонии, можно организовать сеанс связи между пользователями Интернет (например, c использованием Microsoft NetMeeting) или соединить несколько географически отдаленных филиалов.
Протоколы IP-телефонии На данный момент существует несколько стандартизованных протоколов, на базе которых строятся системы IP-телефонии. Рассмотрим некоторые из них более подробно.
Протокол H.323 Автором данного стандарта является организация ITU-T (International Telecommunication Union). Существует несколько версий стандарта H323. Первая была выпущена в 1996 году. Последующие являются эволюционным развитием (большая гибкость, масштабируемость и надежность). Последняя на данный момент версия 4 появилась в 2000 году. На данный момент протокол H.323 является стандартом дефакто для междугородной и международной телефонии. Если вы захотите воспользоваться предложением одного из транснациональных операторов IP-телефонии, то придется обратить внимание именно на H.323. Стандарт определяет базовую архитектуру сети передачи мультимедиаданных:
Ðèñóíîê 1. Âîçìîæíàÿ ñòðóêòóðà H323-ñåòè
Необходимо отметить, что, хотя в сетях IP-телефонии для передачи голоса и используется IP-сеть, она не является IP-сетью в обычном понимании. Так, в голосовых IP-сетях особое внимание уделяется обеспечению гарантированного качества обслуживания QoS (DiffServ, IntServ, MPLS), хотя это вовсе не означает, что в IP-сетях без QoS IP-телефония не будет работать. Которые в виду своей стоимости так и не «ушли в массы». Вариант может быть особенно интересен предприятиям, еще не имеющим коммуникационной инфраструктуры, т.к. при использовании IPтелефонии можно полностью отказаться от прокладки «двойной проводки». Все-таки основным преимуществом корпоративных сетей является функциональность, а не стоимость. Инсталляции, работающие по такому принципу, существуют в некоторых западных образовательных учреждениях.
№5, май 2005
21
администрирование К числу объектов стандарта H.323 относятся:
! Терминал (Terminal). ! Шлюз (Gataway). ! Устройство управления конференциями (Multipoint Control Unit – MCU).
! Привратник (GateKeeper). Терминал Конечное H.323-устройство пользователя. Может быть как программным (приложение на компьютере), так и аппаратным (телефонный аппарат). Терминалам могут назначаться один или несколько псевдонимов (номера телефонов, названия).
Шлюз Устройство, предназначенное для сопряжения разнородных сетей. Так, рекомендации ITU-T содержат информацию по сопряжению H.323-устройств с устройствами сетей ISDN, ATM и ТФОП.
Привратник Основной управляющий6 элемент сети H.323, координирующий и контролирующий работу всех ее устройств. К его задачам относятся: ! аутентификация; ! авторизация; ! разрешение имен; ! управление пропускной способностью, используемой H.323-устройствами. Как правило, сеть H.323 разбивается на «зоны», в каждой из которых присутствует привратник, управляющий вверенными ему устройствами. Для обеспечения большей надежности одну «зону» могут обслуживать несколько привратников, тогда один из них называется «главным», а остальные – «альтернативными». Помимо управления и централизованного разрешения имен абонентов, привратники также могут предоставлять дополнительные возможности, например, выполнять функции прокси-сервера для сигнальных и медиаданных.
MCU7 Предназначено для организации конференций с числом участников более 3. Оно координирует передачу управляющей (и опционально мультимедийной) информации между участниками конференций. Работу с устройствами H323 мы рассмотрим на примере привратника GNU GateKeeper и открытых программных телефонов.
Протокол SIP SIP – Session Initiation Protocol (протокол управления сессиями) – используется для создания, изменения и разрыва 6
7 8 9 10
22
«сессий» между одним или несколькими участниками. Понятие «сессии» в протоколе SIP достаточно широкое. Под «сессией» могут подразумеваться не только телефонные звонки, но и передача данных, конференции, децентрализованные игры и т. д. SIP регламентирует только процедуру установки соединения между устройствами, поэтому обычно наряду с SIP используется протокол передачи информации. В случае IPтелефонии в качестве таких протоколов выступают RTP8 и SDP9. Разработкой протокола SIP занимался комитет MMUSIC10 организации IETF, поэтому в отличие от протокола H.323 (разработанного телефонистами из ITU-T) протокол SIP является более интернет-ориентированным и предназначен для предоставления несколько других (по сравнению с H.323) услуг. Ключевые возможности протокола SIP: ! Мультимедийность. ! Персональная мобильность пользователей. Пользователи могут перемещаться без ограничений в пределах сети, поэтому услуги связи должны предоставляться им в любом месте этой сети. Пользователю присваивается уникальный идентификатор, а сеть предоставляет ему услуги связи вне зависимости от того, где он находится. ! Масштабируемость сети. Она характеризуется в первую очередь возможностью увеличения количества элементов сети при её расширении. Серверная структура сети, построенной на базе протокола SIP, в полной мере отвечает этому требованию. ! Открытость и простота. По убеждению авторов и специалистов, SIP позволит наполнить решения и продукты новыми сервисами и возможностями. Что касается простоты, то достаточно сказать, что все используемые в SIP сообщения имеют текстовый формат и поддерживают вложение любых типов данных. Поэтому голосовое соединение может сопровождаться обменом данными между приложениями. Так, разговор по протоколу SIP свободно дополняется передачей данных от одного абонента другому, например, электронной визитки, цифровых фотографий или даже файла MP3. ! Клиент-серверная архитектура. ! Возможность реакции на события. Так, клиент может «подписаться» на определенное событие (например, обновление статуса пользователя), и как только оно наступит, сервер вышлет соответствующее обновление. Протокол SIP во многом схож с широко используемым протоколом HTTP, который также можно считать сигнальным (клиенты запрашивают у сервера нужные им документы). При установке соединения параметры сессии описываются в соответствии с SDP и вместе с заголовками протокола SIP передаются клиенту. Коды ответов протокола
Для сетей сетей H323 наличие «привратника» не является обязательным. В этом случае H323-устройства работают в режиме Peer to Peer и самостоятельно разрешают имена в IP-адреса. Устройство управления конференциями. Real-Time Protocol – для передачи «голоса». Session Description Protocol – для описания параметров сессии. Multiparty Multimedia Session Control.
администрирование SIP также очень похожи на стандартные коды протокола HTTP. В случае удачного ответа клиенту посылается код 200, адрес не найден (404), ошибка авторизации (403) и др. Клиенты SIP-сети идентифицируются по универсальным идентификаторам SIP-URI, внешне похожим на адреса электронной почты: sip:platov@cs.vsu.ru. Таким образом, имя клиента SIP состоит из персональной части (до знака @), идентифицирующей пользователя, и доменной части (после @), определяющей, например, организацию. В качестве доменной части возможно использование DNS-имени. Протокол SIP выделяет следующие типы объектов сети: ! Агенты. ! Серверы регистрации. ! Серверы перенаправления. ! Прокси-серверы.
шения. Могут использоваться для более интеллектуальной маршрутизации (перенаправление вызовов, голосовая почта, дополнительная обработка вызовов и т. д.), могут самостоятельно повторно пересылать пакеты (в случае если они были потеряны при передаче). Платой за дополнительные возможности является более сложная реализация и большие требования в вычислительной мощности сервера (из-за необходимости хранить информацию о каждой SIP-сессии). Наиболее популярным Open Source stateful прокси-сервером, работающим по протоколу SIP, является Asterisk – The Open Source Linux PBX13.
Агенты Под агентами подразумеваются конечные устройства пользователя (телефоны, программные телефоны, мобильные телефоны, наладонные компьютеры, шлюзы в ТФОП, системы голосовых меню и т. д.) В составе агентов выделяются две логические составляющие: ! агент-клиент (UAC – user agent client) – посылает запросы и получает ответы; ! агент-сервер (UAS – user agent server) – принимает запросы и посылает ответы.
Ðèñóíîê 2. Âçàèìîäåéñòâèå UAC è UAS
Ввиду того, что большинству устройств необходимо как передавать, так и принимать данные, в реальных устройствах присутствует как UAC, так и UAS11.
Прокси-серверы Являются неотъемлемой частью SIP-сети, отвечают за маршрутизацию сообщений, а также аутентификацию и авторизацию пользователей. В стандарте определяется два типа SIP-прокси-серверов: ! Без учета состояния (stateless). Такие серверы не отслеживают состояния SIP-сессий и передают сообщения, используя внутренние правила маршрутизации. Их основное применение – распределение нагрузки и маршрутизация. Open Source-примером stateless SIP-прокси-сервера является SER12 (SIP Express Router). ! С учетом состояния (stateful). Отслеживают состояние каждой SIP-сессии от момента ее создания до завер11 12 13
Ðèñóíîê 3. Òèïè÷íàÿ ñõåìà èñïîëüçîâàíèÿ SIP-ïðîêñè-ñåðâåðà
Если пользователь A1@a.com захочет позвонить пользователю B1@b.com, то он передаст запрос INVITE B1 своему прокси-серверу, который перенаправит вызов проксисерверу b.com абонента B1.
Сервер регистрации (REGISTRAR) Перед работой в сети каждое устройство должно зарегистрироваться с помощью специального сообщения REGISTER. При этом клиент сообщает серверу свое имя в формате: IP-адрес, номер порта, SIP-URI и пароль доступа. В случае успешной регистрации информация о клиенте заносится в специальную базу данных (используется в дальнейшем для нахождения клиента) и клиенту высылается сообщение: «200 OK». С определенной периодичностью этот процесс повторяется, таким образом обеспечивается «актуальность» данных о клиентах. Как правило, серверы REGISTRAR совмещаются с прокси-серверами. PBX Asterisk, рассмотрению которого будет посвящена отдельная статья, в этом отношении не является исключением и может выполнять как функции прокси-сервера, так и сервера регистрации.
SCCP (Skinny Client Control Protocol) Данный протокол является корпоративным. Он разработан компанией Cisco Systems для организации работы IP-телефонов Cisco под управлением ПО Cisco Call Manager, являющегося в том числе и шлюзом в сети H.323. Идея подхода, лежащего в основе разработки протокола SCCP, заключалась в переносе логики обработки H.323 соединений из конечных устройств в ПО Cisco Call Manager. Таким образом, существенно упрощалась (и удешевлялась) реализация конечного устройства клиента.
Как оценить качество систем IP-телефонии Существуют различные методики оценки качества систем IP-телефонии. Наиболее известные из них MOS (Mean
Более детально к вопросу о UAC и UAS мы вернемся при рассмотрении тестовых утилит для SIP. http://www.iptel.org. http://www.asterisk.org.
№5, май 2005
23
администрирование Opinion Score или «усредненная субъективная оценка экспертов»), представляющая собой численную оценку, характеризующую «качество» сети телефонии. Идея MOS очень проста: специально сформированной группе людей предоставляют возможность воспользоваться системой связи и просят поставить оценку от 1 (ужасно) до 5 (отлично)14. Усредненные данные такого исследования и называются MOS. Кроме того, для оценки качества речи также существуют и объективные методы, например, рекомендация ITU-T G.113 (измерение качества речи системы телефонии на основе искажений, вносимых каждым ее элементом), PSQM (оценка качества работы вокодеров), PESQ (развитие PSQM для оценки сетей телефонии). Не вдаваясь в детали методов оценки качества, давайте лучше рассмотрим основные параметры, оказывающие на него непосредственное влияние: ! используемый кодек; ! наличие/отсутствие «эха»; ! параметры каналов связи. Все используемые на данный момент в IP-телефонии кодеки обеспечивают «сжатие с потерями». В зависимости от используемых алгоритмов эти «потери» могут быть поразному различимы «на слух» именно в этом аспекте рассматривается влияние кодеков на качество речи. При ведении разговоров на больших расстояниях начинает проявляться эффект «эха». Существуют различные алгоритмы, призванные с этим бороться (G.165, G.168, G.168 2000, и др.), и в подавляющем большинстве устройств какой-нибудь из них обязательно должен присутствовать. Приведу три основных параметра канала связи, оказывающих воздействие на качество систем телефонии: ! Задержка (latency). При передаче голоса или видео существуют определенные требования к максимально допустимой задержке. Различные исследования показывают, что для ведения нормального диалога необходимо, чтобы «двойная задержка» при передаче голоса не превышала 250-300 мс (бюджет задержки). При превышении этого порога участники начинают испытывать дискомфорт и стремятся закончить разговор. Таким образом, для ведения комфортного разговора односторонняя задержка не должна превышать 150 мс (задержка канала + алгоритмическая задержка кодека), что совпадает с рекомендацией ITU-T G.114. Для уменьшения задержки, вносимой сетью, необходимо использовать QoS (Quality of Service) ! Джиттер (jitter). Ethernet является сетью с коммутацией пакетов. В общем случае это означает, что пакеты могут быть получены клиентом не в том порядке, в каком они были ему отправлены (для доставки пакетов могли использоваться различные маршруты). Что в таком случае делать декодеру? Для решения таких проблем используются специальные «jitter buffers» (сглаживающий буфер). Задачей этих буферов является пред14 15 16
17
24
варительное накопление пакетов перед их дальнейшей передачей декодеру. Очевидно, что буфер дрожания также вносит некоторую задержку в процесс передачи голоса, поэтому желательным является использование такого размера буфера дрожания, которое, с одной стороны, обеспечивает приемлемое качество речи, а с другой – минимизирует общее значение бюджета двусторонней задержки до значения 300 мс. ! Потеря пакетов. Как известно, в сетях Ethernet допускается потеря пакетов. Влияние потери пакетов на качество речи определяется размером пакета15, а также используемым алгоритмом сжатия речи16. Речевая информация в большей степени устойчива к пропаже одиночных пакетов, нежели целых серий. В любом случае, согласно рекомендации ITU-T, для нормальной работы систем IP-телефонии допускается потеря не более 1% пакетов, в противном случае ухудшение качества речи будет заметно. Для улучшения качества в условиях загруженных сетей можно использовать QoS либо, если пакеты теряются из-за природы самой сети (например, беспроводная сеть), то для улучшения качества можно использовать более помехоустойчивый кодек или уменьшать размер кодируемого кадра.
Кодеки IP-телефонии За все время существования данного направления было разработано большое количество кодеков, используемых для передачи аудио- и видеоинформации в системах IP-телефонии. Наиболее популярными (по количеству пользователей и поддержки в конечных устройствах) в настоящее время являются: ! G711 – стандартизованный ITU-T кодек, используемый в устройствах ISDN. Требуемая пропускная способность – 64 кбит/сек. Существуют две разновидности кодека alaw и u-law, отличающиеся алгоритмами кодирования. Кодек поддерживается практически всеми устройствами IP-телефонии. ! G729 – стандартизованный ITU-T кодек, предназначенный для передачи речи с «хорошим качеством» при использовании небольшой пропускной способности (8 кбит/сек). Существуют две популярные (и несовместимые между собой) версии данного стандарта: Annex A (более «простая» схема кодирования) и Annex B (с использованием алгоритмов сжатия пауз). По субъективным оценкам, данный кодек обладает качеством лучшим, чем у G.723, но худшим, чем G71117. Поддерживается практически всеми производителями оборудования. При коммерческом использовании требуется лицензия. ! G723.1 – кодек, стандартизованный ITU-T. Отличительной особенностью является возможность работы при очень низком потоке (5.3, 6.3 кбит/сек). По субъективными оценкам, обладает самым плохим качеством (среди рассматриваемых кодеков) речи. Поддерживается
На практике MOS редко превышает 4.5. Чем больше размер пакета, тем сильнее скажется его пропажа на восстановленном голосе. Различные алгоритмы обладают разной степенью устойчивости к пропаже пакетов (при восстановлении используется информация «соседних» кадров). Эти данные также подтверждаются оценкой MOS.
администрирование значительной частью устройств IP-телефонии. При коммерческом использовании требуется лицензия. ! GSM (RPE-LTP) – голосовой кодек, разработанный для использования в системах сотовой связи стандарта GSM. При кодировании кадра используется информация предыдущего кадра, кодирование осуществляется блоками по 20 мс со скоростью 13 кбит/с. Поддерживается производителями оборудования, в основном в шлюзах между сотовыми и VoIP-сетями. ! iLBC (Internet low bitrate codec) – открытый (не требуются лицензионные отчисления) голосовой кодек. Предназначен для кодирования с потоком 13.33 кбит/сек (при размере кадра 30 мс) и 15.20 кбит/сек (при размере кадра 20 мс). По субъективным оценкам экспертов, качество речи данного кодека превышает G.729A. Кроме того, кодек более устойчив (по сравнению с g729) к потере кадров, что позволяет эффективно использовать его при организации сеансов связи через сеть Интернет. Примером этому является популярная сеть IP-телефонии – Skype18. Поддерживается ограниченным числом производителей оборудования. Сравнительные характеристики кодеков приводятся в таблице:
таким интерфейсом могут подключаться обычные телефонные аппараты, факсы и другие абонентские устройства. Фактически, интерфейс FXS это то, что приходит к нам по телефонному кабелю от городской или мини-АТС. В задачу устройств, реализующих этот интерфейс, входят: генерация сигнала готовности АТС (гудок в линии), сигналов вызова абонента и т. д. ! FXO (Foreign eXchange Office) – аналоговый интерфейс абонентских устройств телефонных станций. Устройства с таким интерфейсом подключаются к интерфейсу FXS. Так те же самые факсовые аппараты, телефоны, модемы реализуют интерфейс FXO. Существует такое простое правило – если есть провод, соединяющий два аналоговых устройства телефонии, то с одной стороны этого провода должен быть FXS (АТС), а с другой – FXO (телефон). Таким образом, шлюзы с интерфейсом FXO подключаются вместо телефона. С их помощью можно организовать связь с ТФОП или предоставить доступ к IP-телефонии, используя «внутренние» (более дешевые) линии мини-АТС. Так как шлюзы FXO фактически «эмулирует телефон», зачастую для них бывает необходима настройка «отбоя». Для того чтобы шлюз «клал трубку», нужно научить его понимать сигнал «занято» той мини-АТС, к которой он подключен.
Òàáëèöà. Îñíîâíûå ïàðàìåòðû êîäåêîâ IP-òåëåôîíèè
Ðèñóíîê 4. Cîïðÿæåíèå ïîðòîâ FXO è FXS
! E1 – цифровой интерфейс, используемый для создания Таким образом, по показателю качества кодеки можно расположить следующим образом (в порядке ухудшения качества): G711, iLBC, G729, gsm, G723. По используемой пропускной способности (в порядке увеличения:) G723, iLBC, G729, GSM, G711.
Интерфейсы телефонии Наиболее часто используемым оборудованием в IP-телефонии являются шлюзы. Как было сказано выше, задачей шлюза является сопряжение «обычных» телефонных сетей с IP. И если с одной стороны этого шлюза всегда будет IP, то количество интерфейсов с другой стороны запросто может поставить в тупик неподготовленного человека. Попробуем развеять эту неопределенность и рассмотрим наиболее известные «телефонные» интерфейсы: ! FXS (Foreign eXchange Subscriber) – аналоговый интерфейс телефонных станций. К голосовым шлюзам с 18 19 20
21
высокоскоростных магистралей. В цифровом потоке E1 имеется 32 канала (2 из них служебные) по 64 кБит21. Таким образом, используя 1 поток E1, возможно организовать до 30 одновременных телефонных разговоров. В IP-телефонии такие интерфейсы часто используются для организации связи с ТФОП или для организации связи между АТС. В каналах E1 может использоваться различная сигнализация (CAS, SS7, R2, R1.5, Q.931), и при подключении устройств по E1 это необходимо учитывать.
Заключение Итак, после того как мы получили представление об основных протоколах и кодеках, используемых в IP-телефонии, можно приступить к практической части – рассмотрению конкретных программ и устройств, реализующих эти протоколы. Об этом читайте во второй статье цикла.
Бесплатная для звонков компьютер-компьютер. Некоторые кодеки поддерживают несколько размеров пакетов. При передаче через Ethernet к пакет «обрастает» различными заголовками (MAC, IP, RTP). В даной колонке приводится суммарная пропускная способность (без сжатия заголовков RTP, удаления пауз и потерь при передаче). В таблице приводятся данные для одного госолового канала, в то время как при сеансе их обычно 2 (прямой и обратный). Кроме Е1 (2 Мбит) также существуют Е2 (4 канала E1 или 8 Мбит), Е3 (4 Е2 или 34М бит), Е4 (4 Е1 или 139 Мбит), Е5 (4 Е4 или 565 Мбит). В Северной Америке используется очень схожая иерархия каналов T1, Т2 и т. д., отличающаяся количеством каналов (Т1 – 24 канала по 64 кБит) и, соответственно, пропускной способностью (Т1 – 1,5 Мбит).
№5, май 2005
25
администрирование
ALT-N MDAEMON – ПОЧТОВАЯ СИСТЕМА ДЛЯ СРЕДНИХ И КРУПНЫХ КОМПАНИЙ ЧАСТЬ 2 В первой части статьи (см. №4, 2005 г.) была описана установка и первичная настройка почтового сервера Mdaemon. Сегодня более подробно рассмотрим способы доставки почты до самого почтового сервера, а также основные настройки безопасности. Правильное понимание этих принципов – основа успешного внедрения собственного почтового сервера.
РОМАН МАРКОВ Выбираем способ доставки исходящей почты
В меню «Setup → Primary Domain», закладка «Delivery», указывается способ отправки писем нашим почтовым сервером во внешний мир. «Always send every outbound email to the server specified below» – всегда отправлять исходящие сообщения на сервер, указанный в поле «Mail server». Данную опцию предпочтительно использовать при большом количестве адресатов в исходящих сообщениях и слабых ресурсах почтового сервера, а также для экономии исходящего трафика, если это
26
актуально (низкая исходящая скорость канала, высокая стоимость исходящего трафика). Дело в том, что MDaemon, являясь полноценным почтовым сервером, имеет возможность прямой отправки писем адресатам по протоколу SMTP. Этот процесс абсолютно стандартен, однако иногда становится непонятным для начинающих администраторов, которые конфигурируют почтовый сервер впервые. При использовании SMTP-сервера провайдера происходит отсылка одной копии письма, независимо от количества указанных в нем получателей, а доставкой конечным адресатам занимается уже именно сервер провайдера, поэтому этот процесс обычно
администрирование скрыт от конечных пользователей. В случае прямой отправки писем сервером MDaemon, каждая копия письма для указанных получателей отправляется отдельно, так как доставляется прямо на почтовый сервер адресата (согласно полученной от DNS-сервера MX-записи для домена получателя). Поэтому исходящий трафик от одного письма для 50 адресатов, отправленного через сервер провайдера, будет равен размеру этого письма, а при прямой доставке на сервера получателей – 50-кратному размеру этого письма. Поэтому если вы осуществляете рассылки больших объемов информации для своих подписчиков (например, ежедневные прайс-листы), а исходящая скорость канала мала, или вы оплачиваете исходящий трафик, опция «Always send every outbound email to the server specified below» будет для вас оптимальным решением. Минусом этого метода является отсутствие возможности проанализировать протокол доставки сообщения с конечным сервером получателя, так как наш почтовый сервер будет записывать только протокол обмена с SMTP-сервером провайдера. В поле «Mail server» указывается SMTP-сервер вашего провайдера (или любой другой сервер, позволяющий осуществлять ретрансляцию почты). Если данный сервер требует аутентификации пользователя при отправке, укажите учетные данные для аутентификации в поле «Access to the above mail server requires a log in». Если SMTP-сервер провайдера предъявляет требование проверить существующий POP3-ящик для доступа к отправке почты, укажите параметры этого ящика, кликнув по опции «Access to the above mail server requires a POP mailbox check». «Try direct delivery but send problem emails to the server specified below» – наиболее предпочтительный способ доставки ваших писем, если предыдущие замечания не повлияют на экономические и качественные показатели почтовой системы. То есть если исходящая скорость канала велика, а исходящий трафик бесплатен (дешев). При выборе данного способа доставки почтовый сервер будет пытаться отправить почту напрямую каждому адресату, используя данные его MX-записи, а в случае неудачи (например, отсекание почты от отправителя, IP-адрес которого не имеет обратной DNS-записи, соответствующей его почтовому домену) – на указанный в поле «Mail-Server» хост. Преимущества способа заключаются в возможности анализа файлов протоколов обмена при прямой доставке писем для локализации проблемы на основе этих данных. «Always send all outbound email directly to the recipient’s mail server» – данная опция указывает, что MDaemon должен всегда доставлять письма только напрямую, не используя сервер провайдера. В случае невозможности доставить почту указанному адресату при существующей MX-записи для него, MDaemon поставит такие письма в очередь системы повтора (Retry Queue System) и будет предпринимать повторные попытки доставки в соответствии с настройками удержания таких писем в этой очереди (по умолчанию – постоянно в течение 60 минут, а затем раз в 240 минут в течение 5 дней). В случае невозможности доставки письма в течение первого периода пользователь получит об этом оповещение. После окончания 5-дневного срока пользователь также получит уведомление о том, что его письмо по-прежнему не доставлено. Для изменения настроек по умолча-
№5, май 2005
нию выберите опцию «Click here to configure how undeliverable mail is handled».
Настраиваем интегрированный антивирус Устанавливаем интегрируемый в MDaemon антивирус. Скачиваем дистрибутив оттуда же, откуда загружали сам MDaemon (http://www.altn.com/download) и запускаем файл. В окне мастера выбираем язык, а также путь установки. Можно, например, создать папку антивируса внутри самой папки MDaemon. Инсталлятор автоматически останавливает почтовый сервер, копирует нужные файлы и предлагает перезапустить MDaemon уже с интегрированным антивирусом. Соглашаемся с предложением мастера и после запуска сервера регистрируем наш антивирусный продукт. Его регистрация не требует дополнительной активации и осуществляется вводом серийного номера. Меню «Help → About MDaemon → Antivirus». Вводим в данной закладке выданный нам при покупке серийный номер и перезагружаем почтовый сервер («Пуск → MDaemon → Stop MDaemon → Start MDaemon»). После установки антивирус может запустить процедуру автоматического обновления. Если в этот момент ваш компьютер имеет подключение к Интернету, то новые базы будут автоматически установлены. Сразу же настроим параметры антивируса: период проверки обновлений, режим сканирования, действия при обнаружении вируса или запрещенного вложения. Меню «Security → Antivirus». На основной закладке («Antivirus») выбираем «Enable Antivirus scanner». Если необходимо, здесь же можно задать отправителей/получателей, письма которых сканироваться не будут. В секции «Scanner Configuration» настраиваются действия, которые будут предприниматься к инфицированным письмам. Наиболее универсальное решение – попытаться вылечить зараженное вложение, а при неудаче – удалить его («Clean the infected attachment»). Можно помещать зараженные вложения в карантин, сразу удалять их, а также полностью удалять содержащие их письма. Опция «Quarantine messages that cannot be scanned» перемещает в карантин те сообщения, которые не получилось проверить. В противном случае такие вложения отрезаются. Здесь же можно отредактировать сообщение, которое будет посылаться в качестве оповещения об обнаружении вируса. Рекомендуем добавить в сообщение по умолчанию (на английском языке) несколько русских фраз в стиле: «В данном сообщении содержался вирус, который был удален. Нет причины для беспокойства – ваш компьютер защищен». В противном случае администратор вынужден будет получать множество жалоб от пользователей, у которых «обнаружен вирус!». При необходимости данное оповещение можно вообще отключить. В закладке «Antivirus Updater» настроим ежечасную проверку обновлений антивирусных баз через Интернет (обновляя базы реже, вы рискуете пропустить в свою сеть свежий вирус, описание которого уже добавлено в антивирусные базы). В этой закладке также можно просмотреть текущее состояние версии антивирусного ПО и вирусных сигнатур. Опция «Activate Urgent Updates» позволяет вам подписаться на срочные критические обновления, которые будут высылаться на системную учетную запись домена. Для
27
администрирование изменения расписания проверки обновлений нажимаем кнопку «Scheduler», отмечаем все дни недели, устанавливаем время «Every hour» и нажимаем «Add». К нашему расписанию добавится ежечасная проверка обновлений. Здесь же можно установить расписание обновлений баз Antispamengine, позволяющих проводить анализ и помечать письма от отправителей, входящих в эти базы как спам. Данное обновление можно производить не чаще одного раза в сутки (что в принципе является достаточным интервалом). На закладке «Admins → Attachments» задаются образцы вложений, которые запрещены к пересылке. Имеется два варианта – разрешить только определенные файлы (любые вложения, не удовлетворяющие этому условию, будут отрезаны) или запретить конкретные, разрешив остальные. Второй способ предпочтительней. По современным канонам безопасности рекомендуется запрещать пересылку любых исполняемых файлов в оригинальном виде (при пересылке их необходимо архивировать в неисполняемый вид, либо переименовывать). Поэтому запрет исполняемых файлов по маске устанавливается по умолчанию. Туда же для примера добавлены некоторые файловые маски (например, THE_FLY.*). Вы можете самостоятельно редактировать список разрешенных/запрещенных вложений, а также список адресов-исключений, почта с/для которых не будет проверяться на наличие запрещенных вложений. Также можно задать адреса администраторов Content Filter, которые будут получать уведомления об отсеченных вложениях. В закладке «Notifications» имеется возможность указать других получателей уведомлений о действиях антивирусного сканера и фильтра контента (отправителя, получателя, администратора), а также отредактировать текст этих сообщений. Рекомендуем не отсылать оповещения о найденных вирусах и отсеченных вложениях отправителям писем, так как чаще всего при рассылке вирусов адрес отправителя фальсифицируется и ничего не подозревающие пользователи получат ложное обвинение в том, что с их адреса рассылается вирус. Данное оповещение лучше отсылать получателю письма. В случае явно бесполезного спама его можно будет просто проигнорировать, однако если отрезанным окажется необходимое ему вложение, пользователь сам оповестит отправителя о необходимости выслать файлы в другом формате. Включать ли в список получателей таких уведомлений Администратора системы – ваше личное дело. Чаще всего многочисленные оповещения не несут никакой полезной информации.
Защищаем SMTP-сервер от несанкционированного использования Для того чтобы предотвратить использование спамерами нашего Relay-сервера (SMTP) необходимо настроить политику безопасности. Причем это рекомендуется сделать независимо от того, какой способ получения почты для нашего домена мы выбрали – прямую доставку по протоколу SMTP или закачку от провайдера по POP3 (см. далее). Даже если подключение извне по порту TCP/25 запрещено брандмауэром, лучше настроить дополнительные параметры безопасности. Итак, меню «Security → Relay → Trust → Tarpit → Reverse Lookup…» Закладка «Relay Settings». Самый первый флажок «This
28
server does not relay mail for foreign domains» – главный переключатель, запрещающий доставлять почту для чужих доменов. Обязательно установите его! Если флажок установлен, то любые сообщения, которые не имеют в поле FROM: или TO: локального доменного адреса, будут отвергаться. Однако этого недостаточно для спокойствия администратора. «Refuse to accept mail for unknown local users», отвергает почту для несуществующих локальных адресов. «Sender’s address must be valid if it claims to be from a local domain» проверяет реальное существование ящика отправителя. Все три флажка необходимо установить. Оставшиеся три флажка можно устанавливать при необходимости: «Mail addressed to known aliases can always be relayed» позволяет отправлять почту на локальные алиасы к нелокальным почтовым ящикам, «Mail addressed to known aliases can always be relayed» всегда разрешает перенаправлять почту, если она отправлена через аутентифицированную SMTP-сессию. В закладке «Trusted Hosts» можно добавить IP-адреса (диапазоны) и домены, на которые не будут действовать правила запрета при отправке почты, однако делать это не рекомендуется из соображений безопасности. Закладка «Tarpit Settings» позволяет анализировать и блокировать попытки массовых рассылок. Параметр «SMTP RCPT tarpit threshold» задает количество адресов, на которые возможна отправка писем за одну сессию. Если это количество будет превышено, то каждый последующий адрес будет обрабатываться с задержкой, указанной в параметре «SMTP RCPT tarpit delay». В секции «Automatic IP Screening» задаются дополнительные параметры блокирования отправителей. Например, параметр «‘Recipient unknown’ error threshold» задает количество ошибок «Получатель неизвестен» на каждую сессию, после превышения которого отправитель будет блокирован. Здесь же задается предельное количество неудачных попыток аутентификации, после которых отправитель будет блокирован на время, заданное в опции «Ban sites for this many minutes». При установленной опции «Authenticated sessions are exempt from tarpit and IP screening» эти проверки не будут производиться над сессиями, прошедшими аутентификацию. Закладка «Reverse Lookup» позволяет отклонять письма от отправителей, чьи IP-адреса не соответствуют их DNSзаписи, произведенной методом обратного поиска DNS. Производить такую проверку для записи журнала можно, но отказывать в приеме таким отправителям не рекомендуется, так как далеко не всегда IP-адрес, с которого производилась отправка, имеет соответствующую запись в DNS. Установив флажки «Send 501…», вы можете получить большое количество жалоб, связанных с невозможностью отправить почту на ваш домен. MDaemon поддерживает популярные антиспам-технологии, например такие, как SPF, Bayesian, SURBL. Разумеется, что стандартный опрос баз RBL (список редактируется) также присутствует. Далее в меню «Security → IP-Shielding → AUTH → POP before SMTP» для полной защиты от несанкционированной рассылки на закладке SMTP Authentication рекомендуется включить следующие режимы (см. рис. 1). ! «Authenticated senders are valid regardless of the IP they are using» – при успешной авторизации пользователю
администрирование Проверим наш сервер вручную на элементарные уязвимости, попробовав отправить письмо от пользователя postmaster: telnet mailserver 25
Как видно, без авторизации отправить письмо не удастся, а теперь «угадаем», что в системе есть пользователь roman, и снова попробуем отправить: telnet mailserver 25
Ðèñóíîê 1. Íàñòðîéêà çàùèòû îò íåñàíêöèîíèðîâàííîé ðàññûëêè
!
! !
!
будет разрешено отправить письмо, даже если его IPадрес находится в черном списке. «Authenticated users are exempt from the POP before SMTP requirement» – в случае прохождения авторизации от пользователя не потребуют проверить POP3-ящик перед отправкой письма (при включенной опции «POP before SMTP»). «Authentication is always required when mail is from local accounts» – требовать аутентификацию даже от локальных отправителей. Флаг «Mail from ‘Postmaster’ alias requires an authenticated session» обязует пользователя Postmaster проходить авторизацию (по умолчанию такой алиас всегда существует, и если галка снята – данная учетная запись может использоваться для несанкционированной рассылки). Обязательно установите этот флаг, так как при его отсутствии ваш сервер смогут использовать спаммеры (это известная ошибка начинающих администраторов, настраивающих MDaemon). По умолчанию в MDaemon письма от пользователя postmaster принимаются и пересылаются в любом случае – об этом знают спаммеры и ищут, где неопытные настройщики упустили это. Если этот флаг установить, то письмо от пользователя postmaster данного домена будет требовать SMTP-Auth, и если она будет некорректной, в приеме будет отказано. «Authentication credentials must match those of the email sender» – данная опция принуждает пользователей авторизоваться только собственным именем, что предотвращает пересылку писем от других ящиков, авторизуясь при помощи локальных учетных данных. Это означает, что допускается отправка писем только со значением FROM, совпадающим с использованным в аутентификации.
После включения SMTP-авторизации необходимо также установить соответствующий переключатель в настройках сервера исходящей почты на клиентах («сервер исходящей почты требует авторизации») и задать авторизацию «как на сервере входящей почты – POP3».
№5, май 2005
Аналогично – ретрансляция почты запрещена без авторизации пользователя. На ресурсах, подобных abuse.com, есть тесты на open relay. Использовать их более правильно, однако перед запуском такого теста необходимо убедиться в элементарной защите.
Веб-интерфейс MDaemon имеет очень полезный встроенный функционал для предоставления доступа к почтовым ящикам и административным функциям через веб-интерфейс – WorldClient и WebAdmin (WebAdmin скачивается с сайта Alt-N и устанавливается отдельно). Минимальную настройку осуществляем в меню «Setup → WorldClient». По умолчанию веб-сервер MDaemon использует порт 3000. Таким образом, для получения доступа к почте через Web клиентам необходимо набрать в строке адреса своего браузера ссылку вида: http://mail.domain.com:3000. Вместо имени может выступать IP-адрес, а если вы организуете на брандмауэре прохождение пакетов на этот порт извне, ваши сотрудники смогут получать свою почту из любой точки земного шара, не нуждаясь в настройке почтового клиента – его заменит любой браузер для просмотра веб-страниц. Для стандартизации запросов можно поменять порт на стандартный HTTP:80. Тогда клиентам не придется указывать в строке адреса еще и номер порта. После смены номера порта необходимо перезапустить сервис WorldClient – для этого служит кнопка внизу закладки «Web Server». Здесь же настраивается использование календаря, однако его конфигурирование выходит за рамки данной статьи. В закладке Options можно выбрать язык веб-интерфейса, тему оформления и формат даты для каждого из созданных доменов, а также настроить дополнительные параметры. Будьте внимательны с опцией «Allow users to create new accounts…». Если установить это переключатель, то на веб-странице приглашения MDaemon появится опция создания новой учетной записи любым из пользователей, что может привести в лучшем случае к бесконтрольному заведению пользователями, а в худшем – к использованию вас спамерами в качестве анонимного Relay-сервера. Примечание: некоторые стили оформления (например, LookOut) корректно работают только с IE 6.0 и выше. В слу-
29
администрирование чае необходимости получить доступ к почте при помощи других веб-браузеров выберите в настройках личных предпочтений другой стиль – например, Standart.
Антиспам Помимо этого можно настроить встроенную антиспам-систему. Для этого в меню Security служат две опции: «Spam Blocker» и «Spam Filter». Следует быть также предельно осторожными с настройкой данных опций, так как чрезмерное усердие или недопонимание некоторых функций могут отнести к спаму и заказанную пользователями корреспонденцию. В любом случае имеется возможность просто помечать письма как спам, продолжая их доставку пользователям. И только собрав отзывы и убедившись в приемлемом функционировании данной системы, можно отсекать такие письма.
Создаем правила сортировки В MDaemon имеются гибкие механизмы для сортировки почты. Наиболее употребимым является Content Filter (меню «Security → Content Filter»). По умолчанию уже имеется несколько правил – для отсечения фрагментированных сообщений и пр.
запустить указанный bat-файл и затем удалить сообщение. Таким образом, отправив со строго определенного ящика письмо на специальный ящик и указав в поле «Тема» специальное выражение, мы можем выполнить практически любое действие (например, запустить программу, которая сделает архив базы данных и отправит его по электронной почте). Большое количество вариантов условий делает данный сервис удобным и полезным. Такое большое количество условий необходимо, чтобы при получении любого другого письма на данный ящик указанное действие не вызывалось. Даже если кому-то удастся подобрать пароль к данному ящику, это ничего не даст: правила Content Filter может создавать только администратор почтовой системы.
Осуществляем обновление, перенос на другой сервер, создаем резервные копии Существует два пути. В любом случае не забывайте делать резервную копию каталога MDaemon – его архивирование и есть простейший путь к созданию полной резервной копии MDaemon (как уже говорилось выше – все настройки хранятся в текстовых файлах). Первый способ: установка MDaemon поверх старой версии. Установщик сам произведет конвертацию старых установок для новой версии (рекомендуется следующая последовательность обновления очень старых версий: 3.х.х обновляются до 4.х.х, затем до 5.х.х и, наконец, до 7.х.х). Второй способ: установка MDaemon в новый каталог и перенос туда конфигурационных файлов старой версии, которые находятся в каталоге MDaemon\App и имеют расширение *.dat, а также каталога Users. Перенос MDaemon на другой сервер также прост: переносим всю папку MDaemon и устанавливаем поверх новую (или такую же) версию для создания системных привязок.
Подводя итоги
Ðèñóíîê 2. Íàñòðîéêà ïðàâèë ñîðòèðîâêè
Здесь можно создать практически любое правило для сортировки и произведения необходимых действий. Рассматривать все правила мы не будем – они интуитивно понятны. Для примера создадим гибкое правило для писем. «New Rule» – задаем интуитивно понятное имя для дальнейшего анализа правил. Поле «Select Conditions For This Rule» – устанавливаем флаги «If the FROM HEADER contains», «If the TO HEADER contains» – «If the SUBJECT HEADER contains». Затем в поле «Select Actions For This Rule» отмечаем флаги «Send a note 1 to:», «Run a program…» и «Delete the message». Перейдем в третье поле – «Rule Description», в котором зададим условия в созданном нами правиле. Укажем, что правило распространяется только на письма, содержащие в полях FROM, TO и SUBJECT строго определенные значения, укажем, что при получении таких писем необходимо отсылать сообщение на определенный ящик, после этого
30
MDaemon – мощный корпоративный почтовый сервер с большим набором разносторонних режимов и возможностей. К минусам можно отнести отсутствие штатной возможности интегрировать с ним антивирусные продукты других производителей, кроме Kaspersky Labs. Помимо этого было бы полезным сделать более жесткими настройки безопасности по умолчанию (например, принудительная аутентификация независимо от IP-адреса и пр.) К сожалению, даже в двух статьях невозможно описать настройку всех возможностей продукта. Например, мы не смогли более подробно рассказать про более тонкое конфигурирование веб-интерфейса, общую адресную книгу, использование календаря и планировщика GroupWare, антиспам-систему, настройку Content-Filter, создание автоматической подписки на клиентскую рассылку, используя веб-сайт компании и многие другие возможности. Расположение всех файлов конфигурации в текстовых файлах формата Plain-text открывает широкие возможности для конфигурирования сервера, не используя GUI-интерфейс, а также для написания скриптов автоматического конфигурирования. Если отзывы читателей покажут, что развитие темы будет интересным для них, мы постараемся найти возможность продолжить цикл статей про MDaemon.
bugtraq Отказ в обслуживании в qmail
Раскрытие данных в реализациях IPSec
Программа: qmail на 64-битных платформах. Опасность: Средняя. Описание: Уязвимость позволяет удаленному пользователю вызвать отказ в обслуживании приложения. 1. Целочисленное переполнение существует в функции stralloc_readyplus(). Удаленный пользователь может подключиться к SMTP-службе и послать большое количество данных, что приведет к аварийному завершению работы службы. 2. Переполнение буфера в SMTP-службе обнаружено при обработке параметров команды HELO. Удаленный пользователь может вызвать отказ в обслуживании сервиса. Уязвимость существует в файле commands.c. 3. Удаленный пользователь может с помощью специально сформированной команды RCPT TO вызвать отказ в обслуживании приложения. Переполнение буфера существует в файле qmail_put/substdio_put.
Опасность: Средняя. Описание: Уязвимость позволяет удаленному пользователю изменить IP-адрес источника пакета, расшифровать и перехватить потенциально важные данные. IPSec состоит из нескольких отдельных протоколов, которые включают: 2. Authentication Header (AH) – обеспечивает аутентичность пакета, добавляя к нему стойкую криптографическую контрольную сумму. 3. Encapsulating Security Payload (ESP) – обеспечивает конфиденциальность пакета, шифруя пакет с помощью алгоритмов шифрования. ESP также обеспечивает необязательную службу аутентификации для пакетов. 4. Internet Key Exchange (IKE) – обеспечивает безопасный обмен внешними ключами.
URL производителей: www.qmail.org. Решение: Способов устранения уязвимости не существует в настоящее время.
Межсайтовый скриптинг и выполнение произвольного кода в Mozilla Firefox Программа: Mozilla Firefox 1.0.3. Опасность: Критическая. Описание: Уязвимости позволяют удаленному пользователю выполнить произвольный код на целевой системе. 1. Уязвимость существует при обработке IFRAME. Удаленный пользователь может создать специально сформированную HTML-страницу и выполнить HTML-сценарий в браузере жертвы в контексте безопасности произвольного сайта. 2. Уязвимость существует при обработке входных данных в параметре IconURL функции InstallTrigger.install(). Удаленный пользователь может с помощью специально сформированной страницы установить и выполнить произвольное программное обеспечение. Пример/Эксплоит: www.securitylab.ru/54526.html. URL производителей: www.mozilla.org. Решение: Способов устранения уязвимости не существует в настоящее время.
Повышение привилегии в ядре Linux Программа: Linux kernel 2.2 – 2.2.27-rc2, 2.4 – 2.4.31-pre1, 2.6 – 2.6.12-rc4. Опасность: Низкая. Описание: Уязвимость существует в функции сброса дампа elf_core_dump() в файле fs/binfmt_elf.c. Локальный пользователь может создать специально сформированный ELFбинарник и вызвать отказ в обслуживании системы или выполнить произвольный код с root-привилегиями. URL производителей: www.kernel.org. Решение: Способов устранения уязвимости не существует в настоящее время.
ESP и AH могут использовать два режима: туннельный (tunnel mode) и транспортный (transport mode). При использовании туннельного режима в ESP, IP-пакет (внутренний пакет) полностью шифруется и используется для формирования payload нового пакета (внешний пакет). Обычно ESP использует CBC-режим шифрования для обеспечения конфиденциальности. Без защиты целостности, зашифрованные данные в режиме CBC могут быть модифицированы атакующим. Атакующий может определенным образом внести изменения во внешний пакет, которые затронут данные внутреннего пакета. Поскольку расшифровкой данных занимается программное обеспечение уровня IP, все содержимое внутреннего пакета в открытом виде, или ICMP-сообщение об ошибке могут быть отправлены атакующему. Решение: Способов устранения уязвимости не существует в настоящее время. В качестве временного решения рекомендуется: 1. Сконфигурировать ESP для использования защиты конфиденциальности и целостности данных. 2. Использовать AH-протокол совместно с ESP для защиты целостности данных. 3. Запретить ICMP-сообщения об ошибке с помощью межсетевого экрана.
SQL-инъекция в Invision Power Board Программа: Invision Power Board 1.3.1 и ранние версии. Опасность: Средняя. Описание: Уязвимость существует из-за некорректной фильтрации входных данных в переменной $this->first (параметр st) функции Members сценария memberlist.php. Удаленный пользователь может с помощью специально сформированного URL выполнить произвольные SQL-команды в базе данных приложения. Пример: http://[target]/forums/index.php?act=Members &max_results=30&filter=1&sort_order=asc& sort_key=name&st=SQL_INJECTION
URL производителя: www.invisionboard.com. Решение: Способов устранения уязвимости не существует в настоящее время.
Составил Александр Антипов
№5, май 2005
31
администрирование
ВОССТАНАВЛИВАЕМ УДАЛЕННЫЕ ФАЙЛЫ ПОД BSD Командной строке посвящается…
UFS – это основная файловая система для BSD-систем, устанавливаемая по умолчанию. Многие коммерческие UNIX также используют либо саму UFS, либо нечто очень на нее похожее. В противоположность ext2fs, исхоженной вдоль и поперек, UFS крайне поверхностно описана в доступной литературе и единственным источником информации становятся исходные тексты, в которых не так-то просто разобраться! Существует множество утилит, восстанавливающих уничтоженные данные (или во всяком случае пытающихся это делать), но на поверку все они оказываются неработоспособными. Эта статья описывает основные структуры файловой системы и рассказывает как восстанавливать данные вручную.
КРИС КАСПЕРСКИ Немного истории UFS ведет свою историю от S5 FS – самой первой файловой системы, написанной для UNIX в далеком 1974 году. S5 FS была крайне простой и неповоротливой (по некоторым данным, средняя производительность FS составляла всего лишь 2%-5% от «сырой» производительности жесткого диска), но понятия суперблока (super-block), файловых записей (inodes) и блоков данных (blocks) в ней уже существовали. В процессе работы над дистрибутивом 4.2 BSD, вышедшим в 1983 году, S5 FS претерпела некоторые улучшения. Были добавлены длинные имена, символические ссылки и т. д. Так родилась UFS. В 4.3 BSD, увидевшей свет уже в 1984 году, улучшения носили намного более радикальный, если не сказать революционный, характер. Появились концепции фрагментов (fragments) и групп цилиндров (cylinder groups). Быстродействие файловой системы существенно возросло, что и определило ее название FFS – Fast File System (быстрая файловая система).
32
Все последующие версии линейки 4.x BSD прошли под знаменем FFS, но в 5.x BSD файловая система вновь изменилась. Для поддержки дисков большого объема ширину всех адресных полей пришлось удвоить: 32-битная нумерация фрагментов уступила место 64-битной. Были внесены и другие менее существенные усовершенствования. Фактически мы имеем дело с тремя различными файловыми системами, не совместимыми друг с другом на уровне базовых структур данных, однако, некоторые источники склонны рассматривать FFS как надстройку над UFS. «UFS (and UFS2) define on-disk data layout. FFS sits on top of UFS (1 or 2) and provides directory structure information, and a variety of disk access optimizations» говорит «Little UFS2 FAQ» (UFS/ UFS2 определяет раскладку данных на диске. FFS реализована поверх UFS 1 или 2 и отвечает за структуру директорий и некоторые оптимизации доступа к диску). Если заглянуть в исходные тексты файловой системы, действительно, можно обнаружить два подкаталога – /ufs и /ffs. В /ffs находится определение суперблока (базовой структуры, отвечающей за раскладку данных), а в /ufs – определение inode и
администрирование структуры директорий, что опровергает данный тезис, с позиций которого все должно быть с точностью до наоборот. Чтобы не увязнуть в болоте терминологических тонкостей, под UFS мы будем понимать основную файловую систему 4.5 BSD, а под UFS2 – основную файловую систему 5.х BSD.
Структура UFS Внешне UFS очень похожа на ext2fs – те же inode, блоки данных, файлы, директории… Но есть и отличия. В ext2fs имеется только одна группа inode и только одна группа блоков данных для всего раздела. UFS же делит раздел на несколько зон одинакового размера, называемых группами цилиндров. Каждая зона имеет свою группу inode и свою группу блоков данных, независимую от всех остальных зон. Другим словами, inodе описывают блоки данных той и только той зоны, к которой они принадлежат. Это увеличивает быстродействие файловой системы (головка жесткого диска совершает более короткие перемещения) и упрощает процедуру восстановления при значительном разрушении данных, поскольку, как показывает практика, обычно гибнет только первая группа inode. Чтобы погибли все группы… я даже не знаю, что же такое с жестким диском нужно сделать. А! Знаю! Под пресс положить! В UFS каждый блок разбит на несколько фрагментов фиксированного размера, предотвращающих потерю свободного пространства в хвостах файлов. Благодаря этому, использование блоков большого размера уже не кажется расточительной идеей, напротив, это увеличивает производительность и уменьшает фрагментацию. Если файл использует более одного фрагмента в двух несмежных блоках, он автоматически перемещается на новое место, в наименее фрагментированный регион свободного пространства. Поэтому фрагментация в UFS очень мала или же совсем отсутствует, что существенно облегчает восстановление удаленных файлов и разрушенных данных.
В начале раздела расположен загрузочный сектор, затем следует суперблок, за которым находится одна или несколько групп цилиндров. Для перестраховки копия суперблока дублируется в каждой группе. Загрузочный сектор не дублируется, но по соображениям унификации и единообразия под него просто выделяется место. Таким образом, относительная адресация блоков в каждой группе остается неизменной.
Ðèñóíîê 2. Ïîñëåäîâàòåëüíî ðàñïîëîæåííûå ãðóïïû öèëèíäðîâ
В UFS cуперблок располагается по смещению 8192 байт от начала раздела, что соответствует 16-му сектору. В UFS2 он «переехал» на 65536 байт (128 секторов) от начала, освобождая место для дисковой метки и первичного загрузчика операционной системы, а для действительно больших (в исходных текстах – piggy) систем предусмотрена возможность перемещения суперблока по адресу 262144 байт (целых 512 секторов)! Среди прочей информации суперблок содержит:
! fs_cblkno – смещение первой группы блока цилиндров, ! ! ! ! ! ! !
измеряемый в фрагментах, отсчитываемых от начала раздела; fs_iblkno – смещение первой inode в первой группе цилиндров (фрагменты от начала раздела); fs_dblkno – смещение первого блока данных в первой группе цилиндров (фрагменты от начала раздела); fs_ncg – количество групп цилиндров (штуки); fs_bsize – размер одного блока в байтах; fs_fsize – размер одного фрагмента в байтах; fs_frag – количество фрагментов в блоке; fs_fpg – размер каждой группы цилиндров, выраженный в блоках (также может быть найден через fs_cgsize).
Для перевода смещений, выраженных в фрагментах, в номера секторов используется следующая формула: sec_n(fragment_offset) = fragment_offset*(fs_bsize/fs_frag/512)
или ее более короткая разновидность: Ðèñóíîê 1. Ñòðóêòóðà ôàéëîâîé ñèñòåìû s5/ext2fs (à) è ufs (b)
Адресация ведется либо по физическим смещениям, измеряемых в байтах и отсчитываемых от начала группы цилиндров (реже – UFS-раздела), либо в номерах фрагментов, отсчитываемых от тех же самых точек. Допустим, размер блока составляет 16 Кб, разбитых на 8 фрагментов. Тогда 69-й сектор будет иметь смещение 512 х 69 == 35328 байт или 1024 x (16/8)/512 x 69 = 276 фрагментов.
№5, май 2005
sec_n(fragment_offset) = fragment_offset*fs_fsize/512
Структура суперблока определена в файле /src/ufs/ffs/fs.h и в упрощенном виде выглядит так: Ëèñòèíã 1. Ôîðìàò ñóïåðáëîêà (âòîðîñòåïåííûå ïîëÿ îïóùåíû) struct fs { /* historic file system linked list, */
33
администрирование /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /*
0x00 */ int32_t fs_firstfield; used for incore super blocks */ 0x04 */ int32_t fs_unused_1; addr of super-block in filesys */ 0x08 */ ufs_daddr_t fs_sblkno; offset of cyl-block in filesys */ 0x0C */ ufs_daddr_t fs_cblkno; offset of inode-blocks in filesys */ 0x10 */ ufs_daddr_t fs_iblkno; offset of first data after cg */ 0x14 */ ufs_daddr_t fs_dblkno; cylinder group offset in cylinder */ 0x18 */ int32_t fs_cgoffset; used to calc mod fs_ntrak */ 0x1C */ int32_t fs_cgmask; last time written */ 0x20 */ time_t fs_time; number of blocks in fs */ 0x24 */ int32_t fs_size; number of data blocks in fs */ 0x28 */ int32_t fs_dsize; number of cylinder groups */ 0x2C */ int32_t fs_ncg; size of basic blocks in fs */ 0x30 */ int32_t fs_bsize; size of frag blocks in fs */ 0x34 */ int32_t fs_fsize; number of frags in a block in fs */ 0x38 */ int32_t fs_frag;
/* /* /* /* /* /* /*
these are configuration parameters */ minimum percentage of free blocks */ 0x3Ñ */ int32_t fs_minfree; num of ms for optimal next block */ 0x40 */ int32_t fs_rotdelay; disk revolutions per second */ 0x44 */ int32_t fs_rps;
/* /* /* /* /* /* /* /*
sizes determined by number of cylinder groups */ and their sizes */ blk addr of cyl grp summary area */ 0x98 */ ufs_daddr_t fs_csaddr; size of cyl grp summary area */ 0x9C */ int32_t fs_cssize; cylinder group size */ 0xA0 */ int32_t fs_cgsize;
/* /* /* /* /* /* /*
these fields can be computed from the others */ cylinders per group */ 0xB4 */ int32_t fs_cpg; inodes per group */ 0xB8 */ int32_t fs_ipg; blocks per group * fs_frag */ 0xBC */ int32_t fs_fpg;
/* /* /* /* /* /* /* /* /* /* /* };
these fields are cleared at mount time */ super block modified flag */ 0xD0 */ int8_t fs_fmod; file system is clean flag */ 0xD1 */ int8_t fs_clean; mounted read-only flag */ 0xD2 */ int8_t fs_ronly; see FS_ flags below */ 0xD3 */ int8_t fs_flags; name mounted on */ 0xD4 */ u_char fs_fsmnt[MAXMNTLEN];
За суперблоком находится первая группа цилиндров. В начале каждой группы расположена служебная структура cg (далее по тексту – описатель группы цилиндров, термин автора), содержащая магическую последовательность 55h 02h 09h, позволяющая находить уцелевшие группы цилиндров даже при полном разрушении суперблока (если же суперблок цел, стартовые адреса всех последующих групп вычисляются путем умножения номера группы на ее размер, содержащийся в поле fs_cgsize). Другие важные параметры описателя группы цилиндров: ! cg_cgx – порядковой номер группы, отсчитываемый от нуля; ! cg_old_niblk – количество inode в данной группе;
34
! cg_ndblk – количество блоков данных в данной группе; ! csum – количество свободных inode и блоков данных в данной группе;
! cg_iusedoff – смещение карты занятых inode, отсчитываемое от начала данной группы и измеряемое в байтах;
! cg_freeoff – смещение карты свободного пространства (байты от начала группы). Структура cg определена в файле /src/ufs/ffs/fs.h и выглядит следующим образом: Ëèñòèíã 2. Ñòðóêòóðà îïèñàòåëÿ ãðóïïû öèëèíäðîâ #define CG_MAGIC 0x090255 #define MAXFRAG 8 struct cg { /* historic cyl groups linked list */ /* 0x00 */ int32_t cg_firstfield; /* magic number */ /* 0x04 */ int32_t cg_magic; /* time last written */ /* 0x08 */ int32_t cg_old_time; /* we are the cgx'th cylinder group */ /* 0x0Ñ */ int32_t cg_cgx; /* number of cyl's this cg */ /* 0x10 */ int16_t cg_old_ncyl; /* number of inode blocks this cg */ /* 0x12 */ int16_t cg_old_niblk; /* number of data blocks this cg */ /* 0x14 */ int32_t cg_ndblk; /* cylinder summary information */ /* 0x18 */ struct csum cg_cs; /* position of last used block */ /* 0x28 */ int32_t cg_rotor; /* position of last used frag */ /* 0x2Ñ */ int32_t cg_frotor; /* position of last used inode */ /* 0x30 */ int32_t cg_irotor; /* counts of available frags */ /* 0x34 */ int32_t cg_frsum[MAXFRAG]; /* (int32) block totals per cylinder */ /* 0x54 */ int32_t cg_old_btotoff; /* (u_int16) free block positions */ /* 0x58 */ int32_t cg_old_boff; /* (u_int8) used inode map */ /* 0x5Ñ */ int32_t cg_iusedoff; /* (u_int8) free block map */ /* 0x60 */ int32_t cg_freeoff; /* (u_int8) next available space */ /* 0x64 */ int32_t cg_nextfreeoff; /* (u_int32) counts of avail clusters */ /* 0x68 */ int32_t cg_clustersumoff; /* (u_int8) free cluster map */ /* 0x6Ñ */ int32_t cg_clusteroff; /* number of clusters this cg */ /* 0x70 */ int32_t cg_nclusterblks; /* number of inode blocks this cg */ /* 0x74 */ int32_t cg_niblk; /* last initialized inode */ /* 0x78 */ int32_t cg_initediblk; /* reserved for future use */ /* 0x7Ñ */ int32_t cg_sparecon32[3]; /* time last written */ /* 0x00 */ ufs_time_t cg_time; /* reserved for future use */ /* 0x00 */ int64_t cg_sparecon64[3]; /* space for cylinder group maps */ /* 0x00 */ u_int8_t cg_space[1]; /* actually longer */
Между описателем группы цилиндров и группой inode расположена карта занятых inode и карта свободного дискового пространства, представляющие собой обыкновенные битовые поля, точно такие же, как в NTFS или ext2fs/ ext3fs. При восстановлении удаленных файлов без этих карт никуда! Отделяя зерна от плевел, они существенно сужают круг поиска, что особенно хорошо заметно на дисках, заполненных более чем наполовину.
администрирование За картами следует массив inode, смещение которого содержится в поле cg_iusedoff (адрес первой группы inode продублирован в суперблоке). По сути, в UFS структура inode ничем не отличается от ext2fs, только расположение полей другое. Давайте лучше рассмотрим назначение основных полей inode, к числу которых принадлежат: ! di_nlink – количество ссылок на файл (0 означает «удален»); ! di_size – размер файла в байтах; ! di_atime/di_atimensec – время последнего доступа к файлу; ! di_mtime/di_mtimensec – время последней модификации; ! di_ctime/di_ctimensec – время последнего изменения inode; ! di_db – адреса первых 12-блоков данных файла, отсчитываемые в фрагментах от начала группы цилиндров; ! di_ib – адрес блоков косвенной адресации (фрагменты от начала группы). Сама структура inode определена в файле /src/ufs/ufs/ dinode.h и для UFS1 выглядит так (см. листинг 3 и рис. 3): Ëèñòèíã 3. Ñòðóêòóðà inode â USF1 struct dinode { /* 0: IFMT, permissions; see below. */ /* 0x00 */ u_int16_t di_mode; /* 2: File link count. */ /* 0x02 */ int16_t di_nlink; /* 0x04 */ union { /* 4: Ffs: old user and group ids. */ u_int16_t oldids[2]; /* 4: Lfs: inode number. */ int32_t inumber; } di_u; /* 8: File byte count. */ /* 0x08 */ u_int64_t di_size; /* 16: Last access time. */ /* 0x10 */ int32_t di_atime; /* 20: Last access time. */ /* 0x14 */ int32_t di_atimensec; /* 24: Last modified time. */ /* 0x18 */ int32_t di_mtime; /* 28: Last modified time. */ /* 0x1C */ int32_t di_mtimensec; /* 32: Last inode change time. */ /* 0x20 */ int32_t di_ctime; /* 36: Last inode change time. */ /* 0x24 */ int32_t di_ctimensec; /* 40: Direct disk blocks. */ /* 0x28 */ ufs_daddr_t di_db[NDADDR]; /* 88: Indirect disk blocks. */ /* 0x58 */ ufs_daddr_t di_ib[NIADDR]; /* 100: Status flags (chflags). */ /* 0x64 */ u_int32_t di_flags; /* 104: Blocks actually held. */ /* 0x68 */ int32_t di_blocks; /* 108: Generation number. */ /* 0x6C */ int32_t di_gen; /* 112: File owner. */ /* 0x70 */ u_int32_t di_uid; /* 116: File group. */ /* 0x74 */ u_int32_t di_gid; /* 120: Reserved; currently unused */ /* 0x78 */ int32_t di_spare[2]; };
В UFS2 формат inode был существенно изменен – появилось множество новых полей, удвоилась ширина адресных полей и т. д. Что это обозначает для нас в практическом плане? Смещения всех полей изменились только и всего, а общий принцип работы с inode остался прежним (см. листинг 4).
№5, май 2005
Ðèñóíîê 3. Ñõåìàòè÷íîå èçîáðàæåíèå inode. Ê ïîëþ Extensions îòíîñèòñÿ âñå, ÷òî íàõîäèòñÿ íèæå di_ib Ëèñòèíã 4. Ñòðóêòóðà inode â USF2 struct ufs2_dinode { /* 0: IFMT, permissions; see below. */ /* 0x00 */ u_int16_t di_mode; /* 2: File link count. */ /* 0x02 */ int16_t di_nlink; /* 4: File owner. */ /* 0x04 */ u_int32_t di_uid; /* 8: File group. */ /* 0x08 */ u_int32_t di_gid; /* 12: Inode blocksize. */ /* 0x0C */ u_int32_t di_blksize; /* 16: File byte count. */ /* 0x10 */ u_int64_t di_size; /* 24: Bytes actually held. */ /* 0x18 */ u_int64_t di_blocks; /* 32: Last access time. */ /* 0x20 */ ufs_time_t di_atime; /* 40: Last modified time. */ /* 0x28 */ ufs_time_t di_mtime; /* 48: Last inode change time. */ /* 0x30 */ ufs_time_t di_ctime; /* 56: Inode creation time. */ /* 0x38 */ ufs_time_t di_birthtime; /* 64: Last modified time. */ /* 0x40 */ int32_t di_mtimensec; /* 68: Last access time. */ /* 0x44 */ int32_t di_atimensec; /* 72: Last inode change time. */ /* 0x48 */ int32_t di_ctimensec; /* 76: Inode creation time. */ /* 0x4C */ int32_t di_birthnsec; /* 80: Generation number. */ /* 0x50 */ int32_t di_gen;
35
администрирование /* 84: /* 0x54 /* 88: /* 0x58 /* 92: /* 0x5C /* 96: /* 0x60 /* 112: /* 0x70 /* 208: /* 0xD0 /* 232: /* 0xE8 };
Kernel flags. */ */ u_int32_t di_kernflags; Status flags (chflags). */ */ u_int32_t di_flags; External attributes block. */ */ int32_t di_extsize; External attributes block. */ */ ufs2_daddr_tdi_extb[NXADDR]; Direct disk blocks. */ */ ufs2_daddr_tdi_db[NDADDR]; Indirect disk blocks. */ */ ufs2_daddr_tdi_ib[NIADDR]; Reserved; currently unused */ */ int64_t di_spare[3];
Имена файлов хранятся в директориях. В inode их нет. С точки зрения UFS, директории являются обыкновенными файлами и могут храниться в любом месте, принадлежащем группе цилиндров. Файловая система UFS поддерживает несколько типов хеширования директорий, однако на структуре хранения имен это никак не отражается. Имена хранятся в блоках, называемых DIRECT BLOCK в структурах типа direct, выровненных по 4-байтовой границе.
Ðèñóíîê 4. Õðàíåíèå èìåí ôàéëîâ è äèðåêòîðèé
Структура direct определена в файле /src/ufs/ufs/dir.h и содержит: номер inode, описывающий данный файл, тип файла, его имя, а также длину самой структуры direct, используемую для нахождения следующего direct в блоке. Ëèñòèíã 5. Ñòðóêòóðà direct, îòâå÷àþùàÿ çà õðàíåíèå èìåí ôàéëîâ è äèðåêòîðèé struct direct { /* inode number of entry */ /* 0x00 */ u_int32_t d_ino; /* length of this record */ /* 0x04 */ u_int16_t d_reclen; /* file type, see below */ /* 0x06 */ u_int8_t d_type; /* length of string in d_name */ /* 0x07 */ u_int8_t d_namlen; /* name with length <= MAXNAMLEN */ /* 0x08 */ char d_name[MAXNAMLEN + 1]; };
Чем восстанавливать? 1. Компания Stellarinfo (www.stellarinfo.com) выпустила утилиту «Phoenix», предназначенную для восстановления данных и поддерживающую практически все популярные файловые системы, которые только известны на сегодняшний день (и UFS в том числе). Демонстрационную копию можно скачать по адресу: http://www.stellarinfo.com/ spb.exe. Обратите внимание на расширение файла. Это «.exe». Судя по графе «Platform Supported», он рассчитан на BSD. Но в BSD он не запустится! Потребуется устанавливать в систему дополнительный винчестер с рабочей Windows и инсталлировать Phoenix поверх нее. Под Windows PE он работать отказывается… На Windows 2000 запускается, но при попытке анализа заведомо исправного раздела он аварийно завершается с сообщением о критической ошибке. На других системах я его не проверял. Тем не менее ссылку на файл все-таки даю. Во-первых, вы будете знать, что это за продукт, а во-вторых, не исключено, что у кого-то он все-таки сработает.
36
На этом описание файловой системы UFS можно считать законченным. Для ручного восстановления данных приведенной информации вполне достаточно.
На обломках империи При удалении файла на UFS-разделе происходит следующее (события перечислены в порядке расположения соответствующих структур в разделе и могут не совпадать с порядком их возникновения): ! в суперблоке обновляется поле fs_time (время последнего доступа к разделу); ! в суперблоке обновляется структура fs_cstotal (количество свободных inode и блоков данных в разделе); ! в группе цилиндров обновляются карты занятых inode и блоков данных – inodе, и все блоки данных удаляемого файла помечаются как освобожденные; ! в inode материнского каталога обновляются поля времени последнего доступа и модификации; ! в inode материнского каталога обновляется поле времени последнего изменения inode; ! в inode удаляемого файла поля di_mode (IFMT – Input Format – формат файла, permissions – права доступа), di_nlink (количество ссылок на файл) и di_size (размер файла) варварски обнуляются (замечание: если счетчик ссылок был больше единицы, то при удалении одной из таких ссылок поле di_nlink уменьшается на единицу, но удаления самого файла не происходит); ! в inode удаляемого файла поля di_db (массив указателей на 12 первых блоков файла), и di_ib (указатель на блок косвенной адресации) безжалостно обнуляется; ! в inode удаляемого файла обновляются поля времени последней модификации и изменения inodе, время последнего доступа при этом остается неизменным; ! в inode удаляемого файла обновляется поле di_spare. В исходных текстах оно помечено как «Reserved; currently unused», но просмотр дампа показывает, что это не так. Здесь хранится нечто вроде последовательности обновления (update sequence), используемой для контроля целостности indoe, однако это только предположение; 2. The Sleuth Kit представляет собой бесплатно распространяемый комплект утилит для ручного восстановления файловой системы, который можно найти по адресу (http://www.sleuthkit.org), там же (http://www.sleuthkit.org/ sleuthkit/docs/ref_fs.html) находится краткий how-to. Увы, чудес не бывает, и вся методика восстановления сводится к сканированию свободного пространства на предмет поиска фрагментов с известным содержимым. 3. Foremost – еще одна бесплатная утилита для восстановления удаленных файлов, основанная формате их заголовков на особенностях структуры. Естественно, она работает только с теми файлами, чье строение ей известно. Тем не менее, по сравнению с ее предшественницами это большой шаг вперед! Кстати говоря, утилита взаимодействует с файловой системой не напрямую, а обрабатывает файлы, полученные командой dd или набором Sleuth Kit, благодаря чему она «поддерживает» все файловые системы. Последняя версия лежит на сервере http://foremost.sourceforge.net.
администрирование ! в директории удаленного файла размер предшествующей структуры direct увеличивается на d_reclen, в результате чего она как бы «поглощает» имя удаляемого файла, однако его перезаписывания не происходит, во всяком случае оно уничтожается не сразу, а только тогда, когда в этом возникнет реальная необходимость.
Как мы будем действовать После непреднамеренного удаления одного или нескольких файлов немедленно демонтируйте раздел и запустите дисковый редактор, работающий на уровне секторов. Например, можно воспользоваться BSD-портом уже известной нам утилитой lde. К сожалению, на моей системе (4.5 BSD) она работает крайне нестабильно и не отображает основных структур данных в удобочитаемом виде, хотя поддержка UFS в ней заявлена. При наличии достаточного количества свободного места можно скопировать раздел в файл и открыть его с помощью любого hex-редактора (например, biew) или обратиться непосредственно к самому устройству раздела (например, /dev/ad0s1a). А еще можно вставить в привод загрузочный CD-ROM с Windows PE и воспользоваться любым Windows-редактором от Microsoft Disk Probe до Runtime Disk Explorer. То же самое справедливо и для Norton Disk Editor, запущенного c дискеты из-под MS-DOS (правда, ни диски большого объема, ни SCSI-устройства он не поддерживает). Еще можно запустить KNOPPIX или любой Live LINUX, ориентированный на восстановление (правда, в большинстве «реанимационных» дистрибутивов, и в частности, Frenzy 0.3, никакого дискового редактора вообще нет!). В общем, как говорится, на вкус и цвет товарищей нет…
Техника восстановления файлов Начнем с грустного. Поскольку при удалении файла ссылки на 12 первых блоков и 3 блока косвенной адресации необратимо затираются, автоматическое восстановление данных невозможно в принципе. Найти удаленный файл можно только по его содержимому. Искать, естественно, необходимо в свободном пространстве. Вот тут-то нам и пригодятся карты, расположенные за концом описателя группы цилиндров. Если нам повезет и файл окажется нефрагментированным (а на UFS, как уже отмечалось, фрагментация обычно отсутствует или крайне невелика), остальное будет делом техники. Просто выделяем группу секторов и записываем ее на диск, но только ни в коем случае не на сам восстанавливаемый раздел! (Например, файл можно передать на соседнюю машину по сети). К сожалению, поле длины файла безжалостно затирается при его удалении и актуальный размер приходится определять «на глазок». Звучит намного страшнее, чем выглядит. Неиспользуемый хвост последнего фрагмента всегда забивается нулями, что дает хороший ориентир. Проблема в том, что некоторые типы файлов содержат в своем конце некоторое количество нулей, при отсечении которых их работоспособность нарушается, поэтому тут приходится экспериментировать. А если файл фрагментирован? Первые 13 блоков (именно блоков, а не фрагментов!) придется собирать руками. В
№5, май 2005
идеале это будет один непрерывный регион. Хуже, если первый фрагмент расположен в «чужом» блоке (т.е. блоке, частично занятом другим файлом), а оставшиеся 12 блоков находятся в одном или нескольких регионах. Вообщето достаточно трудно представить себе ситуацию, в которой первые 13 блоков были бы сильно фрагментированы (а поддержка фоновой дефрагментации в UFS на что?). Такое может произойти только при интересной «перегруппировке» большого количеств файлов, что в реальной жизни практически никогда не встречается (ну разве только что вы задумали навести порядок на своем жестком диске). Итак, будем считать, что 13-й блок файла найден. В массив непосредственной адресации он уже не помещается (там содержатся только 12 блоков), и ссылка на него, как и на все последующие блоки файла, должна содержаться в блоках косвенной адресации, которые при удалении файла помечаются как свободные, но не перезаписывается, точнее, перезаписывается, но не сразу. Большинство файлов обходятся только одним косвенным блоком, что существенно упрощает нашу задачу. Как найти этот блок на диске? Вычисляем смещение 13-го блока файла от начала группы цилиндров, переводим его в фрагменты, записываем получившееся число задом наперед (так, чтобы младшие байты располагались по меньшим адресами) и осуществляем контекстный поиск в свободном пространстве. Отличить блок косвенной адресации от всех остальных типов данных очень легко – он представляет собой массив указателей на блоки, а в конце идут нули. Остается только извлечь эти блоки с диска и записать их в файл, обрезая его по нужной длине. Внимание! Если вы нашли несколько «кандидатов» в блоки косвенной адресации, это означает, что 13-й блок удаленного файла в разное время принадлежал различным файлам (а так, скорее всего, и будет). Не все косвенные блоки были затерты, вот ссылки и остались. Как отличить «наш» блок от «чужих»? Если хотя бы одна из ссылок указывает на уже занятый блок данных (что легко определить по карте), такой блок можно сразу откинуть. Оставшиеся блоки перебираются вручную до получения работоспособной копии файла. Имя файла (если оно еще не затерто) можно извлечь из директории. Естественно, при восстановлении нескольких файлов мы не можем однозначно сказать, какое из имен какому файлу принадлежит, тем не менее это все же лучше, чем совсем ничего. Директории восстанавливаются точно так же, как и обыкновенные файлы, хотя, по правде говоря, в них, кроме имен файлов, нечего и восстанавливать…
Заключение Описанный метод восстановления данных страдает множеством ограничений. В частности, при удалении большого количества сильно фрагментированных двоичных файлов он ничем не поможет. Вы только убьете свое время, но навряд ли найдете среди обломков файловой системы чтото полезное. Но как бы там ни было, другого выхода просто нет (если, конечно, не считать резервной копию, которой тоже, скорее всего, нет), поэтому я все-таки считаю, что данная статья будет совсем небесполезной.
37
администрирование
РЕИНКАРНАЦИЯ ДАННЫХ II: memo-ПОЛЯ В прошлом номере журнала мы рассмотрели несколько способов переноса данных из таблиц формата DBF в PostgreSQL. Однако чтобы не перегружать статью, вопрос работы с полями типа memo, достаточно широко используемыми в FoxPro, был оставлен без внимания. Теперь пришло время восполнить данный пробел.
СЕРГЕЙ СУПРУНОВ Формат memo-полей Если нужно сохранить в одном поле данные большого или неопределенного объема, в FoxPro (как и в некоторых других СУБД) используются поля специального типа – так называемые memo-поля. Данные такого поля физически сохраняются в отдельном файле (в случае с FoxPro он имеет то же имя, что и dbf-файл, но с расширением fpt). Логически мемо-поля связываются с таблицей таким образом, что доступны, как и любое другое поле текущей записи. Файл fpt для упрощения работы с данными хранит их поблочно. Размер блока по умолчанию в FPD 2.6 составляет 64 байта. Заголовок fpt-файла имеет размер 512 байт, структура его следующая: Òàáëèöà. Ñòðóêòóðà çàãîëîâêà fpt-ôàéëà
Начиная с 513-го байта от начала файла, располагаются блоки данных. Значение поля может занимать один или несколько блоков. Каждый блок, являющийся первым для записи, содержит 8-байтный заголовок (4 байта сигнатура 0х00000001 и 4 байта – длина поля), после которого следуют собственно данные. Для обеспечения связи таблицы с данными в fpt-файле в каждой записи dbf-файла memo-полю отводится 10 байт, в которые заносится номер первого блока данных. Причем номер хранится в символьном виде с ведущими пробелами. Например, для указания на блок 8 данное поле будет содержать значение « 8» (в шестнадцатеричном виде «20 20 20 20 20 20 20 20 20 38», где 38 – ASCII-код символа «8»). Нумерация блоков идет от начала файла, то есть включает и заголовок. Например, при стандартной длине блока 64 байта за-
38
писи данных будут начинаться с блока 8 (длина заголовка 512, деленная на размер блока 64).
С чем предстоит бороться Теоретически формат DBF позволяет хранить в поле типа memo до 4 Гб данных. Однако на практике из-за внутренних ограничений FoxPro на длину строки оперировать с полями свыше 65504 символов становится проблематично. На практике длина этого поля редко превышает несколько тысяч символов. Поэтому вполне допустимо полагать, что данные из поля типа memo могут быть размещены в поле типа text таблицы PostgreSQL (максимальное значение поля – 1 Гб). Так что размеры полей проблемой считать не будем. Сложнее то, что memo-поля могут содержать разнообразные символы, включая символ перевода строки. Поскольку при обработке текстового файла PostgreSQL воспринимает этот символ как разделитель записей, то необходимо позаботиться об его экранировании. Причем в случае формата конца строки в стиле DOS (CR+LF) экранировать нужно как символ перевода строки (0x0D), так и символ возврата каретки (0x0A). Можно использовать формат CSV для загрузки в PostgreSQL – в этом случае значением поля будут считаться все символы, заключенные в «кавычки». «Кавычками» в данном случае может выступать любой символ, он задается как параметр команды COPY. Теперь внутри поля нужно экранировать «кавычки» (путем удвоения), однако в данном случае больше шансов найти подходящий символ, мало используемый внутри поля данных. К тому же исключаются проблемы с различными стилями перевода строки.
Реализация на FoxPro FoxPro работает с memo-полями прозрачно, так что никаких усилий со стороны программиста не требуется. Не забудьте поставить символ «\» перед символами-разделителями:
администрирование Ëèñòèíã 1. Ôàéë memo2pg.prg (FoxPro)
if fields[i].type == 'M': fld = memo2pg(fld) # ----------^^^^^^^
close databases * Ýòî – êîììåíòàðèé ñ íà÷àëà ñòðîêè && À òàê âûäåëÿþòñÿ êîììåíòàðèè â ïðîèçâîëüíîì ìåñòå ñòðîêè use wmem && Îòêðûâàåì òàáëèöó ñ memo-ïîëÿìè m.delimiter = chr(9) && ñèìâîë Tab m.txf = fcreate('memo2pg.txt') scan * Òåêñòîâîå ïîëå – ýêðàíèðóåì ðàçäåëèòåëè è ñèìâîë «\» m.descr = strtran(Descr, '\', '\\') m.descr = strtran(m.descr, m.delimiter, ; '\' + m.delimiter) *  memo-ïîëå äîïîëíèòåëüíî ýêðàíèðóåì ñèìâîëû * êîíöà ñòðîêè (ASCII-êîäû 10 è 13) m.memfld = strtran(Memfld, '\', '\\') m.memfld = strtran(m.memfld, m.delimiter, ; '\' + m.delimiter) m.memfld = strtran(m.memfld, chr(13), ; '\' + chr(13)) m.memfld = strtran(m.memfld, chr(10), ; '\' + chr(10)) * Çàïèñûâàåì ðåçóëüòàò â ôàéë, ðàçäåëÿÿ ïîëÿ * ñèìâîëîì, õðàíÿùèìñÿ â ïåðåìåííîé m.delimiter =fputs(m.txf, m.descr + ; m.delimiter + ; m.memfld) endscan =fclose(m.txf) wait window 'Finished.'
if fields[i].type == 'D': fld = fld[:4] + '-' + ↵ fld[4:6] + '-' + ↵ fld[6:]
.. .. ..
Здесь при обнаружении поля типа memo считанное значение трактуется как содержащее номер первого блока данных, и вызывается функция разбора fpt-файла: Ëèñòèíã 3. Ôðàãìåíò ñöåíàðèÿ dbf2pg.py, ôóíêöèÿ memo2pg def memo2pg(startblock): # Íîìåð áëîêà ïðåîáðàçóåì â ÷èñëî startblock = int(startblock) fpt = open(basetabname + '.fpt', 'rb') fpt.read(6) # Ñ÷èòûâàåì ðàçìåð áëîêà blocksize = int(ord(fpt.read(1)) * 256 + ord(fpt.read(1))) # Ñìåùàåìñÿ ê íà÷àëó áëîêà äàííûõ fpt.seek(blocksize * startblock) fpt.read(4) # Ñ÷èòûâàåì ðàçìåð ïîëÿ äàííûõ fieldsize = ord(fpt.read(1)) * 16777216 + ↵ ord(fpt.read(1)) * 65536 + ↵ ord(fpt.read(1)) * 256 + ↵ ord(fpt.read(1)) # ×èòàåì äàííûå data = fpt.read(fieldsize) fpt.close() # Ïåðåêîäèðîâêà, ýêðàíèðîâàíèå è ïðî÷. data = unicode(data, 'cp866').encode('koi8-r') data = data.replace('\\', '\\\\') data = data.replace('\x0A', '\\' + '\x0A') data = data.replace('\x0D', '\\' + '\x0D') data = data.replace(delimiter, '\\' + delimiter) return data
Ðèñóíîê. Ðàáî÷åå îêíî FoxPro
Если вы решите работать с CSV-форматом, то вместо табуляции в качестве разделителя будет использоваться запятая, а каждое поле данных, независимо от типа, нужно будет окружить символом-«кавычкой», например «”», который используется по умолчанию. Ну и внутри полей все «кавычки» должны быть удвоены, чтобы исключить их специальную интерпретацию.
Реализация на Python А вот здесь нам придется применить все накопленные выше знания по формату файлов DBF и FPT. Поскольку полностью сценарий разбора DBF-файла приводился в прошлой статье, здесь ограничимся только той частью, которая отвечает за получение данных из мемо-поля. За основу взят сценарий dbf2pg.py, рассмотренный в предыдущей статье (см. листинг 2). В него добавлена обработка полей типа «M» в цикл, обрабатывающий каждую запись (соответствующие строки выделены красным шрифтом): Ëèñòèíã 2. Ôðàãìåíò ñöåíàðèÿ dbf2pg.py, äîáàâëåííûå ñòðîêè .. .. ..
for i in range(num): fld = dbf.read(fields[i].len) # Äîáàâëåíî: vvvvvvv
№5, май 2005
Наконец, нужно позаботиться, чтобы Python не обрабатывал символы перевода строки самостоятельно, для чего вместо вывода каждой сформированной строки с помощью оператора print мы будем осуществлять запись в файл, открытый в двоичном режиме, и формировать конец строки вручную так, как нам нужно: Ëèñòèíã 4. Ôðàãìåíò ñöåíàðèÿ dbf2pg.py, çàïèñü ñòðîêè â ôàéë .. .. ..
#
.. .. ..
print line[:-1] outfile.write(line[:-1] + '\r\n')
В результате dbf2pg.py теперь может обрабатывать и memo-поля.
Заключение Язык FoxPro предоставляет развитые средства для работы со своими файлами (выглядело бы странно, если бы это было не так), и осуществить конвертирование файла DBF в другой формат c его помощью – дело нескольких строк кода. Однако не беда, если вы не очень дружны с ним или не можете им воспользоваться по каким-то причинам. Двоичный формат DBF, как вы могли убедиться, достаточно прост и удобен. Так что при необходимости реализовать его обработку имеющимися подручными средствами труда не составит.
39
администрирование
ПОЧЕМУ MS SQL МЕДЛЕННО РАБОТАЕТ? ИЩЕМ ПРИЧИНЫ «Сервер тормозит! Ничего не выполняется! Весь отдел не может работать!» – не таков ли ночной кошмар многих администраторов Microsoft SQL Server? Увы, порой скорость работы этой базы данных падает без видимых причин. Что же случилось?
ЮЛИЯ ШАБУНИО абота администратора базы данных Microsoft SQL Server порой бывает легка и необременительна. В самом деле, если настроена регулярная архивация, вдумчиво прописаны права пользователей, везде стоит последняя версия клиентского приложения, то заняться бывает нечем. Но увы, рано или поздно звонит (а то и прибегает) какой-нибудь «Главный Пользователь» и громко жалуется на то, что «всё тормозит и ничего не работает». При этом беглый анализ ситуации показывает, что вроде бы всё в порядке, сервисы запущены, в логах ошибок нет. То есть всё работает. Но очень медленно. И приходится администратору базы данных, а то и программисту из службы техподдержки брать универсальные инструменты Microsoft – EM (SQL Server Enterprise Manager) и QA (SQL Query Analyzer) и браться за решение проблемы производительности Microsoft SQL Server. Мой опыт показывает, что причин внезапных «торможений» не так уж и много.
2000. Основные причины замедления работы будут актуальны и для 2005-й версии, но способы решения для них могут заметно отличаться (впрочем, в 2005-й наверняка появятся свои собственные, уникальные способы работать медленно). Результаты DBCC-запросов и структура системных таблиц могут для них заметно отличаться, но общая логика работы остаётся прежней.
Причина первая. Ошибки в индексах Они встречаются чаще всего. Когда программист создаёт индекс на таблице базы данных, таблица чаще всего или совсем пуста, или заполнена несколькими тестовыми строчками. Проверить эффективность выбранных индексов в данной ситуации практически невозможно. Поэтому индексируемые поля выбираются или наугад, или в соответствии со стандартными подсказками Microsoft SQL Server. Например, EM автоматически создаёт кластерный индекс по суррогатному первичному ключу, что довольно редко является идеальным решением. Из проблем производительности эта наиболее приятная, так как простое изменение схемы базы данных позволяет совершить маленькое чудо.
Причина вторая. Неправильные планы запросов Все примеры в данной статье рассмотрены на базе Microsoft SQL Server
40
Microsoft SQL Server обладает очень неплохим оптимизатором запросов. Но и он иногда ошибается. Типичная причина ошибок – запрос с параметрами.
Представьте себе, что у вас есть таблица заказов с полями Data и Status. И вас интересуют невыполненные заказы за последние полгода. Если вы попытаетесь получить информацию через запрос с параметрами, то сервер, скорее всего, выберет индекс по дате. Просто потому, что Status, как правило, одинаков для всех («Выполнен»), а вот дата принимает огромное число разных значений, и условие по ней может вернуть как большой, так и очень маленький результирующий набор. Мы-то знаем, что нас интересуют только невыполненные заказы, которых совсем мало, и при их поиске индекс по статусу сработал бы великолепно. Но серверу на момент компиляции запроса не известно, какое значение мы подставим в параметр @Status – «Выполнен» или «Не выполнен». Поэтому он не может использовать индекс по статусу, так как в том случае, когда параметр равен «Выполнен», этот индекс бесполезен. Вместо этого сервер предпочтёт индекс по дате, который даст более-менее приемлемую скорость в любом случае. Таким образом, упускается возможность использовать индекс по статусу, позволяющий мгновенно выбрать невыполненные заказы. И неэффективный план выполнения заставляет систему задуматься в самом неожиданном месте, где в нормальных условиях сервер зависать не должен. Отмечу, что не только запрос с параметрами может порождать неудачные планы запросов. Не менее часто встречаются сбои из-за нехватки памяти и
администрирование некорректной статистики содержимого таблицы.
Причина третья. Распределённые блокировки Microsoft SQL Server обеспечивает изоляцию транзакций с помощью блокировок строк, страниц и таблиц базы данных. При этом если два потока пытаются установить несовместимые типы блокировок на один и тот же объект, то одному из них придётся ждать, пока второй не закончит работу с этим объектом. Таким образом замедляется работа как отдельных процессов, так и всей системы. Иногда возникает такая ситуация, что первый процесс надолго захватил объект А, второй захватил B и ждёт, пока освободится А, третий захватил важный для всех объект C и пытается обработать B, а еще огромное множество процессов ждёт С, порой захватив еще что-нибудь (рис. 1).
рабатывать эту ситуацию, и поэтому они обычно проявляют себя не в виде замедления работы, а в виде частых ошибок заданий (jobs) и откатов клиентских транзакций. Появление сообщений о дедлоках означает, что со стратегией блокировок не всё в порядке и распределённая блокировка уже гдето рядом.
Ðèñóíîê 2. Deadlock
Когда дедлок происходит на двух отдельных объектах базы данных из-за доступа к ним в разном порядке (как изображено на рис. 2), тогда он весьма просто находится и проблема снимается. Хуже бывает, когда дедлок происходит внутри одной таблицы – если процессы сначала работали в разных её частях, а потом каждый захотел заглянуть на территорию другого. В этом случае дедлок может возникнуть даже без явной транзакции, во время самого обычного обновления большой таблицы.
Причина пятая. Проблемы с памятью, диском и процессором Ðèñóíîê 1. Ðàñïðåäåë¸ííàÿ áëîêèðîâêà
При этом создаётся впечатление, что не работает вообще ничего. Порой не получается даже запустить EM, так как блокировки есть на используемых им системных таблицах. Такую ситуацию я называю распределённой блокировкой, и это одна из очень неприятных проблем. В огромной куче заблокировавших друг друга процессов бывает довольно сложно найти тот, который во всём виноват. А им не всегда является самый первый процесс. В рассмотренной ситуации виноват скорее тот, кто захватил С.
Причина четвертая. Дедлоки (Deadlocks) Особый случай блокировок. Знакомая всем ситуация – процесс 1 захватил объект А и ждёт доступа к Б, а процесс 2 захватил Б и ждёт доступа к А (рис. 2). Если бы не система обнаружения дедлоков, они бы прождали вечно. К счастью, MS SQL Server хорошо умеет об-
№5, май 2005
Бывает и так, что в базе идеально настроены все индексы, запросы выполняются по оптимальным планам, взаимных блокировок процессов нет вообще – а работа всё равно происходит медленно. Увы, любая система в конце концов упирается в «железные» ограничения, в размер оперативной памяти, в пропускную способность и объём жестких дисков, в максимальную производительность процессора. Исчерпание любого из этих ресурсов может вызывать замедление работы. Проще всего обнаруживается (да, пожалуй, и лечится) нехватка места на жёстком диске. Причём последствия этой нехватки могут быть просто катастрофическими. Например, прекращение работы резервного копирования, остановка сервисов, работающих с диском, падение сервиса SQL и наконец аварийная остановка операционной системы без возможности нормальной загрузки. В результате можно потерять базу данных и все последние данные резервного копирования, так что за этим нужно сле-
дить постоянно, и лучше в автоматическом режиме. Исчерпание пропускной способности дисков вызывает только замедление работы, но зато справиться с нею гораздо сложнее, приходится задуматься о серьёзной реорганизации дискового массива. Проблема с недостатком оперативной памяти внешне выглядит очень похоже, с единственной разницей, что проблема касается не только SQL-сервера, но и всей операционной системы (так как современные компьютеры всегда стараются скомпенсировать недостаток памяти за счёт дискового пространства, серьёзно нагружая при этом подсистему ввода-вывода). Процессор, как ни странно, очень редко бывает камнем преткновения в работе MS SQL и никогда не приводит к резкому замедлению. Если загрузка процессора подскочила до 100% внезапно, то это не исчерпание ресурса процессора, а появление какого-то некорректно работающего приложения. Перед тем как принимать решение о необходимости масштабного обновления, обязательно надо проверить, всё ли в порядке с тем оборудованием, что уже есть. Мне известны случаи, когда случайно отключенный кэш записи на контроллере дискового массива приводил к падению скорости работы всей системы в четыре раза. И нельзя забывать, что проблемы на железном уровне могут быть следствием одной из предыдущих причин. Например, неправильный план запроса может создать большую нагрузку на жесткий диск, что не справится никакой RAID. Поэтому аппаратной частью имеет смысл заниматься только в том случае, если исключены все остальные причины.
Поиск причин проблемы Итак, давайте вернёмся к исходной ситуации. Мы имеем недовольных пользователей и сервер, который работает очень медленно. С какой стороны начинать? Первое, что надо сделать – это определить масштабы происшествия (рис. 3). Если пользователи жалуются, что не работает вообще ничего, всё стоит, приложение не запускается, то, скорее всего, мы имеем дело с распределённой блокировкой или же с аппаратными проблемами (во втором случае жалобы будут менее интенсивными, зато гораздо более продолжительными, так как распределённая блокировка
41
администрирование кая информация бесполезна. Распределённая блокировка часто возникает при обычном числе строк в sp_lock. К счастью, у нас есть возможность обработать результаты этого запроса и получить полную картину блокировок в системе. Для этого достаточно сохранить результаты запроса во временной таблице и собрать данные из системных таблиц: Ñêðèïò 1 if ( select object_id( 'tempdb..#LOCK' ) ) ↵ is not null drop table #LOCK go -- Â âàøåé âåðñèè SQL Server ôîðìàò âðåìåííîé òàáëèöû -- ìîæåò áûòü äðóãèì, ïðîâåðüòå âûâîä sp_lock. create table #LOCK ( spid int , dbid int , ObjId int , IndId int , Type varchar(4) , Resource varchar(16) , Mode varchar(8) , Status varchar(6) ) insert into #LOCK exec sp_lock
Ðèñóíîê 3. Ïåðâîíà÷àëüíàÿ îöåíêà ñèòóàöèè
обычно когда-нибудь да заканчивается, а вот железные проблемы сами по себе наверняка не пройдут). Значит, в первую очередь надо проверить это направление. Совсем другая ситуация возникает, когда жалуются на какой-то конкретный процесс или запрос. Например, слишком медленно работает тарификация, слишком долго выставляются счета, тогда как как всё остальное практически в порядке. В этой ситуации стоит поискать проблемный запрос, работающий не с тем индексом или по неудачному плану.
Глобальное замедление работы Давайте рассмотрим различные методы анализа ситуации, когда замедляется работа всей системы.
Общий анализ блокировок в системе Каждый администратор знает, что блокировки на сервере определяются процедурой sp_lock. Но вот скажите честно, что можно понять, глядя на выводимый ею результат... spid dbid ObjId IndId Type Resource ------ ------ ----------- ------ ---- ---------------51 5 0 0 DB 53 5 0 0 DB 54 5 0 0 DB 55 5 0 0 DB 57 5 308912172 0 TAB .... 375 строк 200 5 64719283 2 PAG 5:1730834 200 5 0 0 PAG 4:133248 200 5 475148738 1 PAG 6:122208 200 5 571149080 0 TAB
Mode -------S S S S IS
Status -----GRANT GRANT GRANT GRANT GRANT
IX IX SIX IX
GRANT GRANT GRANT GRANT
На её основе можно разве что сформулировать утверждение «блокировки на сервере есть». Если вы регулярно запускаете sp_lock, то вы можете оценить лишь среднее число блокировок и убедиться, что сейчас их «больше», «меньше» или «как обычно». Для более серьёзного анализа та-
42
-- Êàêèå ïðîöåññû îæèäàþò çàõâàòà êàêèõ ðåñóðñîâ. select count(*) as LockCnt, left(o.name, 32 ) as ObjectName , l.Status, l.Type, l.Mode, l.spid , max(Resource) as SampleResource , left(max(ss.loginame), 16 ) as loginname , max(ss.cmd) as cmd , max(ss.lastwaittype) as lastwaittype , left(max(ss.program_name), 32 ) as program_name , left(max(ss.hostname), 32) as hostname , max(ss.program_name) as full_program_name from #LOCK l , sysobjects o with (nolock) , master..sysprocesses ss with (nolock) where o.id = l.ObjId and l.spid = ss.spid and l.Status not in ( 'GRANT', 'CNVT') and l.dbid = db_id() group by o.name, l.Status, l.Type, l.Mode, l.spid -- Êòî ìåøàåò âûïîëíÿòüñÿ ïðîöåññàì èç ïðåäûäóùåãî -- çàïðîñà, êòî äåðæèò èõ ðåñóðñû. select count(*) as LockCnt, left(o.name, 32 ) as ObjectName , l.Status, l.Type, l.Mode, l.spid , max(Resource) as SampleResource , left(max(ss.loginame), 16 ) as loginname , max(ss.cmd) as cmd , max(ss.lastwaittype) as lastwaittype , left(max(ss.program_name), 32 ) as program_name , left(max(ss.hostname), 32) as hostname , max(ss.program_name) as full_program_name from #LOCK l , sysobjects o with (nolock) , master..sysprocesses ss with (nolock) where o.id = l.ObjId and l.spid = ss.spid and l.dbid = db_id() and l.Status in ( 'GRANT', 'CNVT') and exists ( select * from #LOCK l2 where l2.Status not in ( 'GRANT', ↵ 'CNVT') and l2.dbid = db_id() and l.ObjId = l2.ObjId and l.Resource = l2.Resource ) group by o.name, l.Status, l.Type, l.Mode, l.spid
! Функции left используются для того, чтобы сократить ширину вывода (он и так получается очень широкий). При необходимости можно увеличить отображаемую часть полей. ! Функция max() используется для того, чтобы отобразить поле, не участвующее в group by, но при этом точно имеющее однозначное значение. Это работает, так как max из списка одинаковых значений равен тому же самому значению.
администрирование Как правило, бывает достаточно несколько раз выполнить скрипт 1, чтобы полностью оценить картину – какие процессы блокируют какие ресурсы и кому при этом мешают. Я не стану приводить полное описание полей запроса, так как это простое соединение (join) результата sp_lock с системными таблицами sysobjects (анализируются только блокировки на текущей БД) и master..sysprocesses, их поля описаны в BOL (Books Online), да и сами по себе они довольно очевидны. Хочу сразу предупредить о возможной проблеме. Sp_lock даёт мгновенный снимок ситуации. К тому времени, когда выполнение добирается до sysobjects и master..sysprocesses, уже может не оказаться тех процессов, что создавали блокировки, зато могут появиться новые процессы (причём с тем же spid), и запрос даст неправильный результат. Особенно это актуально, когда система «живёт», и в ней в каждый момент времени появляется и исчезает большое число процессов и выполняется много запросов. Но в случае распределённой блокировки или же просто сложной ситуации нужные вам процессы останутся на месте. Хуже того, я советую не принимать решений по первому же результату. Выполните этот запрос несколько раз, чтобы понять, какие процессы были заблокированы случайно и ненадолго, а какие стабильно присутствуют и являются основой распределённой блокировки. Тот же самый скрипт 1 поможет разобраться в насыщенной блокировками базе данных даже в отсутствие распределённой блокировки. Бывает так, что работать с базой можно, но процессы часто ждут завершения работы друг-друга, и общая скорость работы заметно понижается. Этим данная ситуация отличается от распределенной блокировки, когда «создаётся впечатление, что ничего вообще не работает. Тогда запрос о картине блокировок приходится делать многократ-
Пример анализа блокировок Проанализируем результат работы скрипта 1 (вывод см. ниже). Думаю, читатель оценит уровень его информативности (особенно в сравнении с результатом sp_lock). 1. Задание 0x08989EF05DAC704E94F6D25A2EB2FB75 держит X (эксклюзивную) блокировку на таблицу Calls. Само по себе это нормально, но мешает работать четырём другим задачам, которые, кстати, не планируют захватывать таблицу целиком. Вместо этого они ждут возможности установить IX (эксклюзивная блокировка намерения) на неё, чтобы потом использовать эксклюзивные блокировки на уровне страниц или ключей. Это проблема, и её размеры зависят от значимости таблицы Calls в системе и от целей всех этих пяти заданий. 2. В таблице DCLocks захвачен один диапазон. Этот же диапазон ждут три других процесса, планируя в свою
но, возможно, даже потребуется вынести в отдельное задание выполнение запросов и сохранение результатов в специальной таблице, чтобы потом проанализировать статистику и понять, какие процессы чаще всего «цепляются».
Анализ блокировок отдельного процесса Тот же метод сохранения блокировок во временной таблице может быть использован и для анализа текущего состояния отдельного процесса. Конечно, надёжнее всего отследить его работу с помощью профайлера. Но бывает так, что профайлер не может помочь, ведь он показывает текст запроса только в момент начала или окончания его обработки. А что делать, если начало мы уже пропустили, а конец будет неизвестно когда, так как процесс подвис? Кроме того, далеко не всегда есть время (или возможность) запустить и настроить профайлер. В этой ситуации может помочь разобраться вот такой скрипт (выполняемый после сохранения блокировок в #LOCK): Ñêðèïò 2 select count(*) as LockCnt, left(o.name, 32 ) as ObjectName , l.Status, l.Type, l.Mode, l.spid , max(Resource) as SampleResource , left(max(ss.loginame), 16 ) as loginname , max(ss.cmd) as cmd , max(ss.lastwaittype) as lastwaittype , left(max(ss.program_name), 32 ) as program_name , left(max(ss.hostname), 32) as hostname , max(ss.program_name) as full_program_name from #LOCK l , sysobjects o with (nolock) , master..sysprocesses ss with (nolock) where o.id = l.ObjId and l.spid = ss.spid and l.dbid = db_id() and l.spid = @spid --and program_name like '%0x08989EF05DAC704E94F6D25A2EB2FB75%' group by o.name, l.Status, l.Type, l.Mode, l.spid
очередь захватить его. Судя по ограниченным масштабам блокировки и названию таблицы, тут мы имеем дело со штатной ситуацией синхронизации потоков с помощью блокировок и наше вмешательство не требуется. 3. В эксклюзивное пользование захвачен объект sp_RunCommands. Обратите внимание, что это не таблица, а процедура. На неё устанавливается X-блокировка только на время перекомпиляции. Однако возможности перекомпилировать эту процедуру ждут ещё два процесса. Значит, она из числа тех, чей план запроса не сохраняется в кэше, а каждый раз генерируется заново (например, в ней может использоваться созданная «снаружи» временная таблица). Как видите, такие процедуры не только съедают ресурсы сервера при каждом выполнении, но и служат причиной блокировок и ожиданий, если используются несколькими потоками одновременно.
Cnt --1 1 1 1 1 1 1 1 1
ObjectName -------------Calls Calls Calls Calls DCLocks DCLocks DCLocks sp_RunCommands sp_RunCommands
Status -----WAIT WAIT WAIT WAIT WAIT WAIT WAIT WAIT WAIT
Type ---TAB TAB TAB TAB KEY KEY KEY TAB TAB
Mode ---IX IX IX IX X X X X X
spid ----96 103 168 175 55 79 111 81 114
SampleResource loginname ---------------- ---------------ES\RootUserLogin ES\RootUserLogin ES\RootUserLogin ES\RootUserLogin (010041dc3da7) ES\Admin (010041dc3da7) ES\Admin (010041dc3da7) ES\Admin [COMPILE] ES\Admin [COMPILE] ES\Admin
lastwaittype -----------LCK_M_IX LCK_M_IX LCK_M_IX LCK_M_IX LCK_M_X LCK_M_X LCK_M_X PAGELATCH_SH LCK_M_X
hostname -------BUSINESS BUSINESS BUSINESS BUSINESS SM2 SM2 SM2 SM2 SM2
full_program_name ------------------------------------------------------------------------SQLAgent - TSQL JobStep (Job 0xA52C73583FBDDA43B93ABD532E9C88DD : Step 1) SQLAgent - TSQL JobStep (Job 0x4534BA77AA627843AE48F80997D8E4C8 : Step 1) SQLAgent - TSQL JobStep (Job 0x8F60801B8AC0B44B809F7AE0AEC4FCF7 : Step 1) SQLAgent - TSQL JobStep (Job 0x86BB523C4DEE964EA16A4AD23348997B : Step 1) DeviceManager DeviceManager DeviceManager DeviceManager DeviceManager
Cnt --1 1 1
ObjectName -------------Calls DCLocks sp_RunCommands
Status -----GRANT GRANT GRANT
Type ---TAB KEY TAB
Mode ---X X X
spid ----127 53 59
SampleResource loginname ---------------- ---------------ES\RootUserLogin (010041dc3da7) ES\Admin [COMPILE] ES\Admin
lastwaittype -----------WRITELOG PAGELATCH_UP WRITELOG
hostname -------BUSINESS SM2 SM2
full_program_name ------------------------------------------------------------------------SQLAgent - TSQL JobStep (Job 0x08989EF05DAC704E94F6D25A2EB2FB75 : Step 1) DeviceManager DeviceManager
№5, май 2005
43
администрирование Как видите, он просто возвращает список всех блокировок, которые осуществляет данный процесс. Если вам известен spid процесса, то можно в условии использовать прямо его. При желании вам доступен весь спектр полей master..sysmessges, позволяющий отобрать процесс по имени приложения, логину пользователя, названию клиентского компьютера или любым другим сочетанием условий. Результат этого запроса позволяет понять, к каким таблицам ваш процесс сейчас осуществляет доступ. Часто этого бывает достаточно, чтобы оценить точку выполнения с точностью до строки кода.
Распределённая блокировка и sp_who2 Прежде чем переходить к следующей части, нельзя не вспомнить более известный способ поиска головного процесса в распределённой блокировке. Это – системная процедура sp_who2. Она показывает в поле BlkBy важнейшую информацию – ожидает ли конкретный процесс завершения работы другого, и какого именно. По результатам выполнения sp_who2 довольно легко найти тот spid, который никем не заблокирован, но при этом блокирует всех остальных. Я предпочитаю обработанный вывод sp_lock, так как он показывает, не только какой процесс является причиной блокировок, но и какие объекты являются причиной столкновения интересов. Ведь порой бывает, что вносить исправления надо вовсе не в головной процесс, а в один из заблокированных им (например, добавить в их код подсказку nolock, чтобы они больше не зависели от головного процесса). Но если вам сложно оказалось разобраться в огромном списке ожидающих и ожидаемых процессов, возвращаемых скриптом 1, то sp_who2 может вам помочь. Учитывайте только, что при совместном использовании скрипта 1 и sp_who2 их стоит запускать в одном и том же пакете (batch), чтобы минимизировать время между снимками состояния блокировок и состояния процессов, иначе они могут отображать существенно разные картины.
Как определить содержание процесса по его номеру? Итак, тем или иным способом вы нашли spid процесса, который виноват в замедлении работы. Но обычно по spid сложно понять, что же этот процесс делает и как изменить его, чтобы устранить проблему. Единственный случай, ког-
Безобидная разделяемая блокировка Мне часто встречалась одна характерная ошибка, и я хочу предостеречь от нее вас. А именно – при анализе блокировок полностью не принимаются во внимание блокировки типа S (Share, разделяемая) и IS (Intent Share, разделяемая блокировка намерения). Считается, что эти блокировки «безобидные». Такой вывод делается потому, что блокировки S от разных процессов совместимы между собой, и много приложений могут рассматривать объект одновременно, в противоположность X-блокировкам, которые захватывают объект в личное пользование и несовместимы ни с чем. Но нельзя забывать о том, что S-блокировки не совместимы с X. Например, если какую-то таблицу постоянно дописыва-
44
да spid вам реально пригодится, если процесс запущен с вашей же машины под вашим логином и из приложения Query Analyzer. Тогда вам останется просто перебрать все открытые окна QA в поисках нужного. (В окне QA идентификатор процесса написан в статусной строке, это число в скобках после имени пользователя.) В любых других случаях надо искать более конкретную информацию о том, кто же является хозяином процесса. В первую очередь посмотрите на master..sysprocesses (самые полезные поля из нее сразу выводятся скриптом 1). Как правило, вы увидите имя пользователя, компьютера и приложения, запустившего нужный вам процесс. Очень часто этого бывает достаточно. Если приложение называется как-то вроде «Job 0x08989EF05DAC704E94F6D25 A2EB2FB75 Step 2» – значит, за этот процесс отвечает задание сервера. Его «настоящее имя» (то есть то, которое можно увидеть в папке <ИмяСервера>/Management/SQL Server Agent/Jobs приложения EM) узнать очень просто: выполните в QA запрос: select convert( varbinary(30), job_id), ↵ name from msdb..sysjobs order by name
и найдите в списке код нужного вам задания. Если на вашем сервере задания играют существенную роль, вам скоро надоест делать поиск по этому списку, и вы, вероятно, захотите сразу видеть имя нужной вам задачи в выводе скрипта. Но тут имеется небольшая проблема – когда вы делаете запрос в QA, он автоматически преобразует для вас varbinary в нужную форму. А чтобы сделать то же самое программно, понадобится небольшая процедура: Ñêðèïò 3 create function dbo.uniqueidentifier_to_varchar ↵ ( @u uniqueidentifier ) returns varchar(34) as begin declare @binary varbinary(16), @i int , @res varchar(34), @byte smallint , @hex char(2) select @binary = convert( varbinary(16), @u ) , @i = 1, @res = '0x' while ( @i <= 16 ) begin select @byte = substring(@binary, @i, 1) select @hex = case when @byte/16 < 10 then char( ascii('0') + @byte/16 )
ют или обновляют множество процессов, то один пользователь, решивший выполнить сканирование таблицы и заполучивший на нее табличную S-блокировку, способен полностью застопорить работу всей системы с помощью «безобидной» блокировки на чтение. Поэтому, например, правилом хорошего тона является всегда писать nolock при сканировании большой и часто обновляемой таблицы в рабочей базе данных. Единственной по-настоящему безобидной блокировкой является Sch-S, означающая запрет на изменение структуры таблицы и ничего больше. Если процесс наложил такую блокировку, значит, он читает её в nolock-режиме или его уровень изоляции транзакции допускает «грязное чтение», что по сути означает то же самое.
администрирование else char( ascii('A') + @byte/16 - 10 ) end + case when @byte%16 < 10 then char( ascii('0') + @byte%16 ) else char( ascii('A') + @byte%16 - 10 ) end select @res = @res + @hex, @i = @i + 1 end return @res end
Теперь можно найти нужную задачу напрямую, например, так: select name from msdb..sysjobs where ↵ dbo.uniqueidentifier_to_varchar( job_id ) = ↵ '0x07E7726D989CCA4E9103F874F473C2AF'
или так: select * from master..sysprocesses with (nolock) , msdb..sysjobs with (nolock) where program_name like '%' + ↵ dbo.uniqueidentifier_to_varchar(job_id) + '%' -- Ýòîò çàïðîñ âîçâðàùàåò âñþ èíôîðìàöèþ î çàïóùåííûõ -- â äàííûé ìîìåíò çàäàíèÿõ, âêëþ÷àÿ èõ íàçâàíèÿ, sp_id, -- âðåìÿ çàïóñêà è îñòàëüíóþ èíôîðìàöèþ -- èç master..sysprocesses è msdb..sysjobs
Но всё же я не рекомендую использовать функцию dbo.uniqueidentifier_to_varchar(job_id) в повседневной работе, т.к. она довольно медленная. Как вариант для быстрого анализа связи задания и его имени разумнее будет заполнить специальную табличку с двумя полями (uniqueidentifier и varchar(34)) и использовать её в запросах, обновляя по мере необходимости. Это чревато рассинхронизацией данных, однако задания довольно редко создаются, так что вполне можно работать, обновляя табличку по мере необходимости. Если всего вышерепечисленного оказалось недостаточно, попробуйте выполнить: dbcc inputbuffer( <Íîìåð ïðîöåññà> )
Этот dbcc-запрос покажет, какой именно код выполняет процесс, указанный в качестве его параметра. Помните, что размер буфера ограничен и что-нибудь «многоэтажное» может оказаться почти полностью за его рамками. Но того, что есть, обычно оказывается достаточно, чтобы понять, «откуда ветер дует». Читатель может заметить, что предлагаемые мною скрипты не добавляют никакой новой информации. Практически всё это можно получить с помощью EM (<ServerName>/ Management/current Activity). На это я могу сказать только одно – если вам так удобнее, используйте EM! Образы мышления людей, предпочитающих табличное и древовидное представления, очень отличаются друг от друга. Но и тем, кто предпочитает дерево, мой запрос может пригодиться. Ведь EM не отличается высокой скоростью работы на медленных соединениях, и вам придётся очень долго ждать реакции (и не получится обновлять представление достаточно часто, чтобы увидеть динамику происходящего). Кроме того, запрашивая информацию об объектах, EM создаёт блокировки на таблицах. А это значит, что в случае глобальной распределённой блокировки, затрагивающей сис-
№5, май 2005
темные таблицы, он сам попадает в число заблокированных процессов и не способен сообщить вообще ничего (cкрипты же специально на этот случай обращаются к системным таблицам с nolock). Еще одна особенность EM по сравнению с приведёнными скриптами – он не ограничен текущей базой данных и показывает картину процессов всего сервера (сами решайте, плюс это минус). Чтобы получить доступ к блокировкам на нескольких конкретных базах данных сразу, в скрипт достаточно будет добавить несколько разных таблиц sysobjects, но сделать его полностью универсальным можно только с помощью представления (view) или динамического запроса (см. таблицу). Òàáëèöà. Ñðàâíåíèå äâóõ ìåòîäîâ àíàëèçà áëîêèðîâîê â ñèñòåìå
Давайте вернёмся к ситуации с глобальным замедлением работы сервера.
Диагностика проблем на аппаратном уровне Представьте, вы выполняете запрос, показывающий состояние блокировок, а он говорит, что блокировок на базе данных нет! Несколько последующих запросов выдают ту же самую картину, а сообщения о проблемах продолжаются. Увы, в этом случае нет однозначного рецепта. Начать стоит с проверки разнообразных логов – начиная с журналов заданий и SQL Server и заканчивая журналами Windows. Возможно, причиной замедления работы явился какой-то ресурсоёмкий процесс, вроде резервного копирования, перестройки индексов или проверки физической целостности базы данных. Если сервер работает на пределе мощности, то такие процессы способны в разы замедлить его реакцию. Для выявления самых ресурсоёмких процессов можно использовать запрос, подобный следующему: Ñêðèïò 4 select top 10 physical_io/(datediff( second, login_time, dateadd( second, 2, getdate()) ) ) , physical_io, spid , datediff( second , login_time , dateadd( second, 2, getdate()) ) , program_name, * from master..sysprocesses order by physical_io/(datediff( second , login_time , dateadd( second, 2, ↵ getdate()) ) ) desc
Его действие основано на том, что для каждого процес-
45
администрирование са сервер ведёт счётчик использования основных ресурсов – памяти, диска, процессора. Сами по себе показания счётчика дают немного, и при упорядочении по ним вперёд вырываются системные процессы – те, что работают с момента включения системы и до момента её выключения. Но если поделить значение счётчика на время жизни процесса, мы получим интенсивность использования ресурсов, что даёт неплохую возможность найти самый нагружающий сервер процесс. Только не стоит обращать внимание на короткоживущие процессы, на секунду выпрыгивающие наверх и исчезающие при повторном запросе. Они попадают в лидеры только из-за маленького времени жизни и впоследствии не оказывают большого влияния на сервер. Кроме physical_io, можно точно так же строить запросы на основе полей cpu и memusage. Если и здесь не получилось найти виновного, то придётся спускаться на аппаратный уровень (а даже если и получилось, то надо учитывать, что когда ресурсов достаточно, никакой dbcc checkdb не должен замедлять работу сервера). Этот вопрос, вообще говоря, выходит за рамки данной статьи, и администратору базы данных порой стоит делегировать его специалистам по серверному оборудованию. Скажу лишь только, что состояние дисков и памяти сказывается на работе сервера баз данных чаще, чем хотелось бы, причём довольно часто это выглядит именно как падение производительности. Простое уменьшение места на дисках очень сильно замедляет работу (а потом делает её невозможной). Если RAID выполняет интеграцию нового диска в массив, то он не только работает в несколько раз медленнее, но и находится в очень нестабильном состоянии (если сбой питания для обычного жесткого диска слегка неприятен, то для RAIDмассива в состоянии перестройки практически смертелен). Сбои в памяти чреваты целым спектром проблем от простого замедления до появления ошибочных данных и полного разрушения базы. Процессор тоже может влиять на поведение сервера непредсказуемым образом. Однажды мне пришлось решать следующую проблему. Все процессы начинали работу в хорошем темпе. Однако спустя некоторое время скорость работы падала в несколько раз. Ситуацию спасло отключение Hyper Threading. Возможно, оптимизатор параллельных процессов Microsoft SQL Server принимал «сдвоенный»
процессор за два отдельных и соответственно планировал запросы. В решении аппаратных проблем порой помогают счётчики производительности (performance counters). Они пригождаются и для решения специфических для SQL задач, так как сервер позволяет наблюдать огромное число своих параметров. Мне часто приходилось работать в ситуации, когда я не имела доступа к удалённой консоли, да и просто не могла выполнить Windows-логин на сервер (или это было долго и неудобно), но имела права на выполнение xp_ cmdshell. В этой ситуации можно более-менее комфортабельно смотреть на счётчики производительности с помощью утилиты typeperf. Она входит в Microsoft Windows NT Workstation 4.0 Resource Kit, Windows 2000 Resource Kit или в Windows XP. Пример выполнения этой процедуры из QA приведён в скрипте 5. Результат её работы можно посмотреть в разделе «Пример работы утилиты typeprf». Ñêðèïò 5 ------
Äëÿ òîãî ÷òîáû ïîñ÷èòàòü ïðîöåññîðû è ëîãè÷åñêèå äèñêè è ïîëó÷èòü ñïèñîê äîñòóïíûõ ñ÷¸ò÷èêîâ, ðàñêîììåíòèðóéòå ñëåäóþùèå çàïðîñû. exec master..xp_cmdshell 'typeperf -qx \Processor ' exec master..xp_cmdshell 'typeperf -qx \PhysicalDisk'
exec master..xp_cmdshell 'typeperf -sc 10 ↵ "\Processor(_Total)\% Processor Time" ↵ "\PhysicalDisk(1 D:)\% Disk Time" ↵ "\PhysicalDisk(1 D:)\Avg. Disk Queue Length" ↵ "\PhysicalDisk(1 D:)\% Idle Time" ↵ "\SQLServer:Buffer manager\Checkpoint pages/sec" '
Даже если у вас есть все права доступа и соответствующие утилиты, я всё-таки рекомендую поставить typeperf на сервер. Может статься так, что у вас будет очень ограниченное время на анализ ситуации, и тогда доступ к Windowsсчётчикам без стандартной утилиты администрирования Perfomance monitor вам очень пригодится. Очевидно, что подобным же образом можно смотреть журналы любых приложений (очень рекомендую стандартные GNU-утлиты tail, head и grep), в том числе Windows логи и даже логи Sql Server (из EM до них порой не добраться). Итак, в первой части статьи мы рассмотрели методы локализации проблем производительности Microsoft SQL Server в случае глобальнного замедления работы. Нам осталось рассмотреть, как найти проблемную точку в заранее известном процессе, локализовать дедлоки, и обсудить методы решения обнаруженных проблем. Этим вопросам будет посвящена вторая часть статьи.
Пример работы утилиты typeperf Cистема прилично загружена, средняя длина очереди составляет 1-2 пакета, тогда как в нормальном состоянии она близка к нулю. Пора подумать о модернизации, так как время простоя дисков уже маленькое (диски простаивают от 50 до 5% времени, т.е. иногда они загружены на 95%). Но прямо сейчас они не должны замедлять работу, небольшие резервы еще есть. Контрольная точка (Checkpoint) проходит стабильно за 1-2 секунды, значит, производительность записи на диск достаточная. Стоит проверить счётчики, ориентированные именно на чтение.
46
output ----------------------------------------------------------------------------NULL "(PDH-CSV 4.0)","\\BIS\Processor(_Total)\% Processor Time","\\BIS\PhysicalDisk(1 D:)\% Disk Time", "\\BIS\PhysicalDisk(1 D:)\Avg. Disk Queue Length","\\BIS\PhysicalDisk(1 D:)\% Idle Time", "\\BIS\SQLServer:Buffer manager\Checkpoint pages/sec" "04/13/2005 19:13:57.846","50,378475","40,182411","0,395736","60,613311","0,000000" "04/13/2005 19:13:58.846","55,077832","411,062631","4,110626","38,580247","2799,985212" "04/13/2005 19:13:59.846","45,898094","605,983878","6,059839","12,160078","3215,004814" "04/13/2005 19:13:01.846","29,687050","91,170583","0,911706","19,050122","0,000000" "04/13/2005 19:13:02.846","46,288716","195,101249","1,951012","0,770005","0,000000" "04/13/2005 19:13:03.846","52,148134","284,811823","2,848118","6,270040","0,000000" "04/13/2005 19:13:04.846","48,046537","89,120570","0,891206","18,530119","0,000000" "04/13/2005 19:14:05.846","33,202692","47,700305","0,477003","53,540343","0,000000" "04/13/2005 19:14:06.846","24,804209","281,211800","2,812118","21,670139","2225,878616" "04/13/2005 19:14:07.846","22,460444","153,620983","1,536210","10,510067","0,000000" Exiting please wait... The command completed successfully.
администрирование
СИСТЕМА ВЕЩАНИЯ НА ОСНОВЕ WINDOWS MEDIA SERVICES 9 ЧАСТЬ 2 В прошлый раз мы установили медиасервер, настроили многоадресное вещание с TV-тюнера и обеспечили on-demand доступ к небольшой видеотеке. Сегодня мы продолжим наше знакомство с Windows Media Services 9, в процессе которого создадим маленькую радиостанцию, а также рассмотрим варианты настройки «живого» вещания с веб-камер.
МИХАИЛ ПЛАТОВ Делаем радиостанцию Для нашей радиостанции мы будем использовать набор файлов, расположенных в определенной папке жесткого диска. Несмотря на то что сервер Windows Media позволяет организовывать вещание музыкальных файлов, хранящихся как в формате .mp3, так и формате wma, предпочтительным является использование «родного» формата – wma. Дело в том, что при использовании файлов mp3 вещание все равно будет вестись в формате wma, при этом сервер «на лету» будет перекодировать поток в wma. Кроме того, при предоставлении доступа к сервису из Интернета настоятельнол рекомендуется использовать файлы, закодированные с одинаковым битрейтом, иначе при переключении между композициями битрейт будет «скакать», что вряд ли обрадует пользователей, подключенных через низкоскоростное соединение.
Любителям командной строки посвящается Надеюсь, я смог убедить вас в том, что для организации вещания необходимо заранее перекодировать все имеющие-
48
ся файлы в формат .wma с жестко заданным битрейтом (например, 32 Кбит). Для решения этой задачи теоретически можно воспользоваться уже знакомым нам интерфейсом кодировщика Windows Media Encoder, однако на практике так лучше не делать. Интерфейс не позволяет выбрать для кодирования сразу несколько файлов (или папок), поэтому такой процесс перекодирования может несколько утомить. Но тот факт, что «интерфейс не позволяет», еще не означает, что «кодировщик не умеет». В нашем случае необходимой функциональностью обладает скрипт WMCmd.vbs, входящий в стандартную поставку кодировщика Windows Media Encoder. Данный скрипт написан на Visual Basic и является не чем иным как «оберткой», использующей те же самые COM-объекты графического приложения Windows Media Encoder. Файл скрипта располагается в папке установки кодировщика (по умолчанию это C:\Program Files\Windows Media Components\Encoder), а для его запуска используется «консольный» сервер сценариев WSH (Windows Scripting Host.) – cscript. При запуске без параметров (cscript WMCmd.vbs) кодировщик сообщит о возможных ключах вызова.
администрирование Полный список ключей очень велик, поэтому позволю себе привести пример вызова данного скрипта, при котором кодировщик в два прохода перекодирует содержимое папки c:\music_mp3 к формату .wma с постоянным битрейтом 32К1: cscript WMCmd.vbs -input "e:\music_mp3" ↵ -output "e:\music_wma" -a_mode 1 -profile a32
Пишем ноты для оркестра Таким образом, подготовительная часть закончена, и теперь можно приступить непосредственно к настройке сервера. В принципе, для решения поставленной задачи вполне можно обойтись способом вещания всех файлов из папки, рассмотренным в предыдущей статье [1]. Но для разнообразия мы рассмотрим другой способ – с использованием серверных списков воспроизведения (server-side playlist). В этом случае из произвольного набора файлов, папок, потоков с кодировщиков и с других точек распространения можно собрать общий список воспроизведения, содержимое которого будет «вещаться» в указанном нами режиме (unicast или multicast) и порядке. Кроме того, вышеперечисленный контент можно дополнительно «разбавить» с помощью так называемых «рекламных заставок», (например, медиафайлы, описывающие нашу радиостанцию, рекламу спонсора или хостинг-провайдера)2. Итак, откроем уже знакомую нам оснастку сервера Windows Media и создадим broadcast-точку вещания radio, работающую по списку воспроизведения (см. рис. 1).
editor», в появившемся окне выберем «Create a new playlist» и нажмем «OK». Перед нами предстанет окно редактора списков воспроизведения – Windows Media Playlist Editor. Интерфейс добавления объектов в список воспроизведения интуитивно понятен, а вот на типах добавляемых объектов остановимся более подробно. В редакторе play-листов можно определить элементы следующих типов: ! Media – основной элемент любого списка воспроизведения. Используется для указания медиа-ресурса (файлы, потоки с кодировщика или медиа-сервера и т. д.), вещаемого в сеть. ! Advertisement – позволяет вставить в список рекламный ролик. Данный пункт особенно интересен, когда в качестве источника рекламных вставок используется ASP- и CGI-скрипт. ! Sequence – объект-последовательность. Определяет последовательность воспроизведения. Все медиа-источники, перечисленные в рамках элемента sequence, будут воспроизводиться в строго указанном порядке. ! Switch – объект-переключатель. Позволяет определить «альтернативные» медиа-источники, которые будут использованы в случае, если основной источник будет недоступен. Данный объект очень полезен при организации вещания «живых» источников, например, его можно использовать для обработки ситуаций, в которых источник временно не доступен. ! Exclusive – позволяет определить набор медиа-источников, порядок воспроизведения которых может меняться (например, один медиа-файл может «прерывать» воспроизведение другого). ! priorityClass – данный параметр определяет, как один объект прерывает воспроизведение другого. Обычно он используется совместно с параметром Exclusive. ! clientData – позволит отображать дополнительную информацию (исполнитель, название альбома и т. д.) о медиа-источнике во время ее воспроизведения. Итак, перейдем к созданию простого списка воспроизведения для нашей радиостанции3. Первым элементом будет вступительная заставка (advertisement), объясняющая пользователю, к чему он подключился. Порядок воспроизведения файлов нам не важен, поэтому в качестве второго элемента выберем Directory и укажем папку, содержащую музыкальные файлы для нашей радиостанции.
Ðèñóíîê 1. Ñîçäàíèå òî÷êè ðàñïðîñòðàíåíèÿ äëÿ ðàäèîñòàíöèè
Выберем только что созданную точку вещания, перейдем на закладку «Source», нажмем на кнопку «View playlist 1 2 3
Ðèñóíîê 2. Ðåäàêòîð ñïèñêîâ âîñïðîèçâåäåíèÿ
Для потока, доступного через dial-up рекомендуется кодировать с битрейтом 64 Кбит (ключ -a64). Хотя для вставки «настоящей» рекламы все же лучше использовать вещание на основе скриптов. При желании можно использовать и более сложную структуру списка воспроизведения. Например, с помощью объектов sequence можно разбить день на несколько отрезков, в рамках которых будет вестись вещание музыки определенного жанра.
№5, май 2005
49
администрирование Сохраним список воспроизведения и перейдем к настройке параметров точки вещания.
Учим сервер «петь» В предыдущий раз [1] мы определяли параметры вещания в разделе «Properties» соответствующей точки распространения. Это место не является единственным. В Windows Media Services параметры точки распространения определяются на двух уровнях: для всего сервера4 и для каждой конкретной точки распространения. Параметры точки распространения (если, конечно, они заданы) имеют более высокий приоритет и переопределяют соответствующие настройки уровня сервера. В то же время некоторые из них (например, для плагинов протоколов HTTP, RTSP и MMS встроенные парсеры медиа-форматов mp3, jpeg и др.) можно задать только для сервера. К серверным настройкам мы еще вернемся, а пока займемся точками распространения. Первым делом включим режимы «Loop» и «Shuffle» (чтобы медиа-файлы бесконечно долго воспроизводились в случайном порядке). Для этого соответствующим образом изменим параметры плагина: «Playlist Transform → WMS Playlist Transform → Properties». В разделе «General» отключим опцию «Start publishing point when first client connects» (для работы в режиме multicast) и включим опции «Enable Broadcast Auto-Start» и «Enable Advanced Fast Start»5. Перейдем к настройкам аутентификации. В Windows Media поддерживается три варианта аутентификации: ! Anonymous. При использовании данного варианта доступ к медиа-файлам осуществляется с правами заданного для точки вещания (или для всего сервера) пользователя. Схема удобна при организации доступа к ресурсу со стороны большого количества пользователей, в особенности из Интернета. ! NTLM/Kerberos. Способ удобен при разграничении прав доступа к контенту для клиентов, находящихся в одном домене (или в доменах, с которыми установлены отношения доверия). Как следует из названия, при аутентификации используются протоколы NTLM или Kerberos. ! Digest. Этот метод аутентификации применяется в тех случаях, когда использовать NTLM/Kerberos оказывается затруднительно. Например, при необходимости разграничить доступ к точкам вещания для клиентов, подключающихся через Интернет. Мы планируем предоставлять открытый доступ к точке вещания для пользователей Интернета, поэтому включим плагин «WMS Anonymous User Authentication». При необходимости зададим имя и пароль для пользователя анонимного доступа. Также не лишней будет установка ограничений для точки вещания (раздел «Limits»). Разрешим два одновременных подключения с суммарной пропускной способ4 5 6 7
8
50
ностью не более 70 Кбит. Для вещания в режиме multicast включим плагин «WMS Multicast Data Writer» (категория «Multicast Streaming»). С помощью «Multicast Announcement Wizard» создадим файлы анонса, необходимые для доступа к точке вещания со стороны клиентов6.
Ðèñóíîê 3. Âàðèàíò èíòåðôåéñà ìóçûêàëüíîãî ñåðâåðà
После размещения этих файлов на веб-сервере мы получим собственную радиостанцию с доступом из Интернета7, подключиться к которой смогут все пользователи, имеющие проигрыватель Windows Media Player 9 или выше.
Выбор веб-камеры Согласно разработанному в прошлый раз «генеральному плану» [1], мы хотим организовать вещание с веб-камер, установленных в интересующих нас местах. Какую камеру выбрать, как правильно ее подключить? Постараемся разобраться в этом вопросе и посмотрим, какие типы решений присутствуют на рынке. Мне известно о существовании 3 типов веб-камер: ! Веб-камеры с интерфейсом USB. Самые дешевые представители камер данного типа не умеют ничего, кроме как показывать то, на что их настроили. «Продвинутые» модели данного вида могут комплектоваться более функциональным ПО, обладать более высокой разрешающей способностью, способны передавать звук и изменять угол обзора. Как самые дешевые, так и более дорогие USB-веб-камеры с легкостью используются в системах вещания на базе Windows Media, т.к. главным условием работы является наличие Capture-драйвера, осуществляющего захват картинки. Самый большой плюс камер данного типа – цена (от 30$), минус – расстояние, на которое такую камеру можно «отнести» от компьютера (по спецификации USB не более 5 метров8). ! Веб-камеры c интерфейсом Ethernet. Данные камеры подключаются напрямую к сети Ethernet. Управле-
Доступны в разделе «Properties», когда в дереве навигации (слева) выбран сам сервер. Последние две опции появляются после установки Service Pack 1 для Windows Server 2003. Описание процедуры анонсирования multicast-точки распространения можно найти в [1] или в документации для Winows Media Services 9. Для того чтобы наша радиостанция была реально доступна из Интернета (поток unicast), возможно, потребуется дополнительная настройка маршрутизаторов и межсетевых экранов (открыть TCP-порты 554 и 1755). Как можно увеличить это число, будет показано позже.
администрирование ние ими может осуществляться либо через встроенный веб-сервер, либо при помощи специализированного ПО, устанавливаемого на компьютер администратора. Некоторые модели имеют возможность записи по сигналу от встроенного детектора движения, что является немаловажным в системах наблюдения. Отличительным плюсом камер данного типа является то, что благодаря использованию интерфейса Ethernet, камеру можно «отнести» от компьютера-кодировщика практически на любое расстояние9. Платой за такую «переносимость» является цена, которая в среднем превышает значения для аналогичных USB-собратьев. ! Беспроводные веб-камеры. Во многом похожи на камеры второго типа, за исключением того, что вместо проводного Ethernet 802.3 беспроводные камеры используют 802.11a/b/g. Соответственно, для них обязательным условием является наличие отдельного питания. Теоретически в системах вещания на основе Windows Media можно использовать любые типы веб-камер, главное, чтобы на компьютере-кодировщике был установлен соответствующий драйвер захвата изображения (если для данного типа камеры он вообще существует). Если такой драйвер для камеры есть, то для просмотра «картинки» можно использовать не только прилагаемое в комплекте ПО (или встроенный веб-сервер), но и обычный проводник Windows и кодировщик Windows Media. Описываемая далее система вещания будет создаваться с использованием самых обычных (и, вероятно, наиболее распространенных) веб-камер Logitech QuickCam Express с интерфейсом USB. Основная проблема при работе с USB-камерами – недостаточная длина USB-кабеля (все-таки на 1,8 метра особо не разгуляешься). Для ее устранения можно воспользоваться как минимум тремя способами: ! Способ 1. Кабель USB удлиняется с помощью обычных пассивных удлинителей, продающихся во всех компьютерных магазинах. Таким способом вы сможете увеличить длину кабеля еще метра на три10. Еще немного (до +1 метра) вы выиграете, если самостоятельно изготовите USB-удлинитель, использовав при этом экранированную витую пару (STP). Хотя лучше, конечно, обратить внимание на следующий способ. ! Способ 2. Для увеличения длины USB можно использовать активные USB-удлинители. С их помощью удавалось «относить» камеру метров на 15 от компьютера. И хотя на некоторых форумах имеется информация о возможности достижения гораздо большей длины, все-таки использовать более 2 активных удлинителей лучше не стоит. Все-таки веб-камеры, как и активные USB-удлинители, для питания используют USB. Соответственно, при злоупотреблении вторыми питания камере может 9 10
банально не хватить, а внешнего интерфейса питания на USB-веб-камерах обычно не бывает. ! Способ 3. Использование «специализированных» USBудлинителей. С их помощью можно работать с USB-устройствами, отдаленными на достаточно большое расстояние (до 500 м) [2]. В состав таких удлинителей входят два модуля – локальный (устанавливается в компьютер) и удаленный (устанавливается поблизости от USBустройства). Для соединения модулей используется либо обычная витая пара 5-й категории (до 100 м) либо оптоволокно (до 500 м). Использование такого рода удлинителей для веб-камер мне кажется несколько сомнительным хотя бы потому, что стоимость одного удлинителя скорее всего будет в несколько раз превышать стоимость веб-камеры. Будем считать, что, используя вышеприведенную информацию, мы смогли выбрать и разместить камеры, и теперь самое время перейти к их настройке, но сначала:
«Обучаем» сервер При работе с веб-камерами мы будем использовать режим «push», инициатором передачи в котором выступает сама машина с веб-камерой. Первое, что нам необходимо сделать, – создать «шаблон точки распространения», который будут использовать все кодировщики при создании собственных «точек» на медиасервере. Для этого откроем уже знакомую нам оснастку «Windows Media Services» и создадим точку распространения wc_template:
Ðèñóíîê 4. Ñîçäàíèå øàáëîíà push-âåùàíèÿ äëÿ âåá-êàìåð
Особенно если попутно использовать модели, поддерживающие Power over Ethernet (PoE). Максимальное «увеличение» длины определяется конкретной связкой chipset, кабель, камера. Надежность работы веб-камеры на заданном расстоянии лучше всего определять «по факту»: если камера с данным набором удлинителей, 30fps и максимальным разрешением нормально работает в течение нескольких часов, значит, скорее всего, все нормально. Если возникают проблемы, то, вероятно, длину кабеля следует уменьшить.
№5, май 2005
51
администрирование Перейдем на закладку «Properties» и отредактируем параметры вещания. Для режима multicast необходимо определить следующее: ! Multicast Streaming → WMS Multicast Data Writer → Enable (в свойствах этого плагина включим «Enable unicast rollover11» на ту же самую точку вещания). ! General → Start publishing point when first client connects → Disabled. ! Limits → Limit player connections → 2. Для того чтобы картинка достигала клиента с минимальной задержкой, определим следующие параметры: ! Networking → Enable buffering → Disable buffering ! General → Enable Fast Cache → Disable ! General → Enable Advanced Auto-Start ! Cache/Proxy → Stream splitting expiration → Immediately Для предоставления доступа к веб-камерам из Интернета определим следующее: «Authentication → WMS Anonymous User Authentication → Enable». На всякий случай настроим централизованную запись со всех веб-камер: «Archiving → WMS Archive Data Writer → Enable» (в свойствах плагина отметим «Start archiving when publishing point starts», а также при необходимости изменим путь расположения файлов архива). Как нам уже известно, при использовании режима push, кодировщик сам «помещает» поток на сервер, при этом пользователь, с правами которого работает кодировщик, проходит аутентификацию и авторизацию (в режиме pull этого естетственно нет). Из соображений безопастности, при настроках по умолчанию только администраторы имеют право помещать медиа-потоки на сервер. А так как лишняя программа, работающая с правами доменного администратора нам не нужна, создадим обычного доменного пользователя webcams и добавим ему необходимые права12. На сервере Windows Media включим плагин: «Control protocol → WMS HTTP Server Control Protocol → Enable», с привязкой к порту с номером 7979. Кроме того, определим следующие параметры для точки вещания: ! Authentication → WMS Negotiate Authentication → Enable. ! Authorization → WMS Publishing Points ACL Authorization → Enabled. В параметрах плагина авторизации добавим пользователя webcams c правами allow: read, write, create. Откроем оснастку Component Services и в свойствах объекта: «Components Services → Computers → My Computer → DCOM Config → Windows Media Services», разрешим пользователю webcam удаленный доступ, запуск и активацию объекта. 11
12
13
14
52
Ðèñóíîê 5. Íàñòðîéêà áåçîïàñíîñòè DCOM-êîìïîíåíòîâ WMS
На этом процесс создания «шаблон вещания» будем считать законченным, самое время перейти к кодировщикам.
Настройка кодировщика Отличия от уже рассмотренного нами в прошлый раз способа минимальны. Во-первых, при вещании можно не кодировать звук, т.к. используемая мною Logitech QuickCam Express (впрочем, как и подавляющее большинство недорогих USB-веб-камер) попросту не позволяет его записывать. Второе отличие заключается в использовании другого режима. При использовании режима push нам необходимо определить значения 3 параметров. В качестве «имени сервера» укажем полное DNS-имя сервера с WMS HTTPпортом: wms.local.ru:7979
В поле «Publishing point» укажем имя точки вещания для данного кодировщика – wc1. В третьем поле укажем имя созданного нами шаблона – wc_template, параметры которого будут использоваться при создании точки вещания13. Значение «Remove publishing point automatically» оставим без изменений и нажмем «Next». В следующих диалоговых окнах определим параметры сжатия14 и дополнительные атрибуты потока. При нажатии кнопки «Finish» кодировщик попытается соединиться с сервером и создать на нем собственную точку вещания. Если в процессе этой операции возникнут ошибки, то перед нами предстанет соответствующее сообщение. Например, вот такое:
Ðèñóíîê 6. Îøèáêà êîäèðîâùèêà
В этом случае клиенты, которые не смогли подключиться с использованием multicast, будут автоматически подключаться с использованием unicast. В случае если домена нет, можно попробовать создать на сервере Windows Media и всех машинах-кодировщиках локального пользователя с одним и тем же именем и паролем. Так как в режиме push кодировщик «помещает» медиапоток на сервер, пользователь, с правами которого запущен кодировщик, должен иметь соответствующие права на медиасервере. В нашем случае эти права есть у пользователя webcam и всех администраторов домена. По субъективным наблюдениям, «сносное» качество при разрешении 320х240 и кодеке wmv9 начинается с потока 100 Кбит.
администрирование Если же все пройдет успешно, то мы увидим уже знакомый нам диалог анонсирования multicast-точек распространения15. Создадим файлы анонса и поместим их на вебсервер. При правильных настройках после нажатия кнопки «Start Encoding» кодировщик примется за работу, на сервере Windows Media автоматически активизируется точка вещания, и поток с камеры «польется» ко всем клиентам (не забываем, что мы используем multicast).
Когда возможностей кодировщка не хватает Иногда при использовании служб Windows Media возможностей стандартного кодировщика оказывается недостаточно. Например, при организации вещания с большого количества веб-камер настраивать и запускать кодировщик вручную на каждой машине надоедает достаточно быстро. Кроме того, если для кодирования используются современные офисные машины (производительности которых с лихвой хватает для работы офисных приложений), то работающим за этими машинами людям может не понравиться постоянное присутствие «постороннего приложения». Еще больше данная ситуация не будет нравиться администратору, которому для обеспечения нормальной работы камер придется «бороться» с пользователями, закрывающими «лишние окна». И хотя попытаться «скрыть» работу кодировщика можно и с помощью стандартных средств (например, при помощи описанной выше «VBS-обертки», работающей в командной строке), получить стабильно работающее решение таким способом вряд ли получится. В этом случае на помощь приходит пакет Windows Media Encoder SDK. Как и другие пакеты для разработчиков, данный SDK содержит все необходимое для создания собственных приложений с использованием функциональности кодировщика Windows Media Encoder. Помимо исчерпывающей документации, описывающей интерфейсы объектов кодировщика, в состав SDK также входят законченные приложения и примеры вызовов методов объектов для трех языков программирования: C++, C# и Visual Basic. С использованием этого богатого инструментария было разработано специальное приложение-кодировщик, обладающее следующими возможностями: ! Работа в качестве системной службы. ! Автоматическое возобновление сессии кодирования после сбоев (при временном извлечении камеры или потере связи с сервером). ! Работа со стандартными файлами кодировщика (.wme). ! Автоматическое создание файлов анонсов. ! Возможности журналирования и оперативного оповещения (системный журнал, e-mail). ! Автоматическая активация драйвера веб-камеры16. На данный момент приложение распространяется только в исходных кодах, для компиляции которых используется среда MS Visual Studio.NET 2003. 15 16 17
Использовать службу достаточно просто. Первое, что вам потребуется сделать, – настроить кодирование с требуемыми параметрами с помощью стандартного кодировщика Windows Media. Затем необходимо убедиться, что все работает как нужно, и сохранить настройки в файле с расширением .wme. После чего необходимо скомпилировать исполняемый файл службы и зарегистрировать его в системе с помощью прилагаемой утилиты (попутно указав имя учетной записи, с правами которой служба будет работать). Сразу же после этого, если все настройки заданы правильно, служба запустится, создаст все необходимые файлы анонсов и начнет кодирование. На сервере в это время будет активирована соответствующая точка вещания, и передаваемый поток станет доступен вам для просмотра:
Ðèñóíîê 7. Ñèñòåìà âåùàíèÿ ñ âåá-êàìåð
Само приложение, а также инструкцию по его сборке и установке можно найти на сайте проекта [3].
Подводим итоги Итак, теперь наш медиасервер способен передавать видеоданные с TV-тюнера (часть 1) и веб-камер, предоставлять совместный доступ к музыкальным файлам, а также к материалам маленькой видеотеки. Но не следует думать, что на этом возможности Windows Media заканчиваются. Вместе с технологией DRM (Digital Rights Managment) возможно создание коммерческих систем17, совместно с Microsoft Producer for PowerPoint можно с легкостью организовывать вещание презентаций, а благодаря наличию хорошего SDK ко всем компонентам применение Windows Media ограничивается только одним – полетом ваших мыслей!
Литература, ссылки: 1. Платов М. Система вещания на основе Windows Media Services 9. – Журнал «Системный администратор», №4, апрель 2005 г. – 28-33 с. 2. http://www.ihse.de/russian/417-xx.htm. 3. http://sourceforge.net/projects/wcstreaming.
При использовании режима push анонс делается только на кодировщике. В случае если драйвер отключен и у службы есть соответствующие права. http://www.mtv.com/overdrive.
№5, май 2005
53
администрирование
АВТОМАТИЗАЦИЯ MS WINDOWS, ИЛИ AUTOIT КАК МЕЧТА ЭНИКЕЙЩИКА ЧАСТЬ 2 С базовым функционалом AutoIt вы уже познакомились в первой части статьи и представляете, как использовать его для автоматизации простейших операций в MS Windows. Расcмотрим применение AutoIt при решении практических задач администрирования.
АЛЕКСЕЙ БАРАБАНОВ Локализации Отправляйте срочную почту ЗАГЛАВHЫМИ БУКВАМИ. Hаш почтовый сервер ее распознает и отправит быстрее всего!
Отдельно рассмотрим вопрос о приложениях с кириллическими текстами внутри окон. Проиллюстрируем решение этой проблемы на примере установки русифицированной программы. Выберем почтовый клиент Mozilla Thunderbird. Как и в первом случае (см. начало статьи [1]), процедура разработки заключается в том, что запускается специаль-
54
ный перехватчик данных. В версии 3 он называется «AutoIt v3 Active Window Info». За основу разработки берем любой из аналогичных текстов, рассмотренных в [1], из которого в процессе редактирования выкидываем всё лишнее (не забывайте, добродетель сисадмина – лень). Затем устанавливаем наше приложение. Дождавшись первого вопроса к оператору, анализируем, как можно «поймать» это окно в AutoIt. В отношении кириллических текстов есть такая подсказка, что надо пользоваться процедурой «cut-and-paste» для получения правильной кодировки. Но, к сожалению, это
администрирование не срабатывает. Как видно на рис. 1, попытка перенести текст из «перехватчика» окон в редактор с программой приводит к появлению нечитаемого набора символов. Предположение, что так и должно быть, не выдерживает элементарной проверки.
Send ( '{ENTER}' ) MsgBox ( 0, 'AutoIt', 'Done' ) Exit
После запуска эта программа приводит нас к следующему этапу разработки, смотрите рис. 3. Далее все делается аналогично тому, как создавалась программа для установки AutoIt v3 [1].
Ðèñóíîê 1
Может быть, стоит сменить редактор? Ведь секрет в том, что надо записать в текст скрипта требуемую фразу в оригинальной кодировке. То есть редактор должен позволять точно указывать кодировку документа при сохранении. Из находящихся под рукой подходит MS Word. При этом, как и ожидалось, «cut-and-paste» тоже не приводит к появлению текста в правильной кодировке. Но текст, введенный «вручную», можно сохранить в нужной кодировке. В данном случае предполагаем, что заголовок окна установщика Mozilla Thunderbird написан в cp1251, и поэтому сохраняем текст в кириллице (Windows). Все описанное продемонстрировано на рис. 2.
Ðèñóíîê 2
В конце первого этапа разработки получаем следующий текст: AutoItSetOption ( "WinTitleMatchMode", 2 ) AutoItSetOption ( "WinDetectHiddenText", 1 ) WinMinimizeAll ( ) Sleep ( 1000 ) Run ( 'Thunderbird_Setup_1.0.exe' ) WinWait ( 'Mozilla Thunderbird Óñòàíîâêà' )
№5, май 2005
Ðèñóíîê 3
Вот что должно получиться в конце концов: AutoItSetOption ( "WinTitleMatchMode", 2 ) AutoItSetOption ( "WinDetectHiddenText", 1 ) ; open free desktop WinMinimizeAll ( ) Sleep ( 1000 ) Run ( 'Thunderbird_Setup_1.0.exe' ) ;Run ( $CmdLine[1] ) WinWait ( 'Mozilla Thunderbird Óñòàíîâêà' ) Send ( '{ENTER}' ) WinWait ( 'Óñòàíîâêà Thunderbird - Ëèöåíçèîííîå ñîãëàøåíèå' ) Send ( '{TAB}{SPACE}{ENTER}' ) WinWait ( 'Óñòàíîâêà Thunderbird - Òèï óñòàíîâêè' ) Send ( '{ENTER}' ) WinWait ( 'Âûáîð êîìïîíåíòîâ' ) Send ( '{ENTER}' ) ; 'Óñòàíîâêà Mozilla Thunderbird- Íà÷àëî óñòàíîâêè' WinWait ( 'Óñòàíîâêà Mozilla Thunderbird- Çàâåðøåíèå' ) Send ( '{SPACE}{ENTER}' ) ;MsgBox ( 0, 'AutoIt', 'Done' ) Exit
Обратите внимание, в итоговом тексте заменяем прямой вызов установщика Mozilla Thunderbird из текста программы на запуск программы, имя и путь до которой переданы, как параметр в командной строке. Так как последнее упростит использование полученного автоматического установщика в рабочих процедурах, где его можно вызывать из командной строки. И блокируем завершающее окно. Еще одно замечание касательно пропущенного окна «Установка Mozilla Thunderbird → Начало установки». Окно сопровождает процесс непосредственного разворачивания приложения. И можно, конечно, в программе дождаться его завершения, но разумнее просто «поймать» появление следующего окна. Что и было сделано. Если кодировка кириллицы на экране совпадает с основной кодировкой по умолчанию в MS Windows, то есть cp1251, то можно снова вернуться к использованию Notepad как редактора программ на AutoIt. Кстати сказать, использование точно такого же приема для детектирования окон
55
администрирование с текстами в кодировке koi8-r, например, от браузера Интернета, не приводит к успеху. То есть такие окна надо определять по косвенным признакам.
AutoIt – это бот сисадмина Если сисадмин ест на своем рабочем месте, выложите ему все свои проблемы и ждите немедленного ответа. Мы существуем, чтобы служить другим, и всегда готовы подумать о починке компьютеров.
Сфера применимости AutoIt не ограничена только автоматизацией установки прикладных программ. Очень эффективно с помощью него программировать наборы стандартных действий в графической среде MS Windows. Многие такие действия инициируются с использованием внутренней команды MS Windows – rundll32. В Сети есть ряд ресурсов, посвященных разгадыванию и коллекционированию информации об этой слабо документированной команде. Начиная с официального описания http://support. microsoft.com/ default.aspx?scid=KB;EN-US;q164787& и продолжая существенно более информативным http://www.dx21.com/ SCRIPTING. Для примера решим задачу автоматической настройки подключения к VPN. Эта задача интересна тем, что ее приходится выполнять не на внутренней рабочей станции, которая так или иначе доступна для сисадмина, а на приватном компьютере пользователя, который желает получить доступ к офисным ресурсам. В ручном режиме эти настройки осуществляются с помощью «Мастера сетевых подключений». Последовательность разработки программы, автоматизирующей эту операцию, начинается с поиска на указанных ресурсах способа запустить нужный мастер. Потом, как и ранее, с помощью «перехватчика» окон определяется достаточная для детектирования строка и создается управляющий диалог. Здесь продемонстрируем, как можно воспользоваться параметром, задающим таймаут в секундах. Если WinWaitActive успевает обнаружить нужное окно до истечения таймаута, то возвращает «1», в противном случае – «0». Это позволит в случае ошибочной ситуации просто завершить скрипт. На рис. 4 изображена начальная стадия разработки.
тит его иконку на рабочий стол. Далее приведен ее текст, где «Office VPN» – это название соединения, а «office.enterprise.domain» – доменное имя сервера PPtP, доступное из Интернета. Если сервер VPN не зарегистрирован в DNS, то нужно указать его IP-адрес. AutoItSetOption ( "WinTitleMatchMode", 2 ) AutoItSetOption ( "WinDetectHiddenText", 1 ) AutoItSetOption ( "SendAttachMode", 1 ) ; open free desktop WinMinimizeAll ( ) Sleep ( '1000' ) ; network connection wizard Run ( @ComSpec & " /c rundll32.exe netshell.dll,StartNCW" ; 1 If WinWaitActive ( 'Ìàñòåð íîâûõ ïîäêëþ÷åíèé','','10' ) == 0 Then Exit EndIf Send ( '{ENTER}' ) ; 2 WinWaitActive ( 'Ìàñòåð íîâûõ ïîäêëþ÷åíèé', ↵ 'Ïîäêëþ÷èòü ê Èíòåðíåòó','5' ) Send ( '{DOWN}{ENTER}' ) ; 3 WinWaitActive ( 'Ìàñòåð íîâûõ ïîäêëþ÷åíèé', ↵ 'Ñîçäàòü ïîäêëþ÷åíèå:','5' ) Send ( '{DOWN}{ENTER}' ) ; 4 WinWaitActive ( 'Ìàñòåð íîâûõ ïîäêëþ÷åíèé', ↵ 'Ââåäèòå â ñëåäóþùåì ïîëå èìÿ äëÿ ýòîãî ïîäêëþ÷åíèÿ','5' $pptpname = 'Office VPN' Send ( $pptpname & '{ENTER}' ) ; 5 WinWaitActive ( 'Ìàñòåð íîâûõ ïîäêëþ÷åíèé', ↵ 'Ââåäèòå èìÿ óçëà èëè','5' ) $pptphost = 'office.enterprise.domain' Send ( $pptphost & '{ENTER}' ) ; 6 If WinWaitActive ( 'Ìàñòåð íîâûõ ïîäêëþ÷åíèé', ↵ 'Óñïåøíî çàâåðøåíî ñîçäàíèå ñëåäóþùåãî ïîäêëþ÷åíèÿ:', '5' ) == 1 Then Send ( '{SPACE}{ENTER}' ) EndIf Exit
) ↵
)
↵
Программка записывается в файл setup_pptp.au3 и затем из нее создается исполняемый файл setup_pptp.exe. Теперь надо позаботиться о передаче этой программы конечному пользователю. Далее будем исходить из условия, что сервер VPN и почтовый сервер созданы на платформе GNU/ Linux, а не MS Windows. Это очевидно, учитывая необходимость его работы на открытом для доступа из Интернета сетевом соединении. Предположим, все административные скрипты и данные записываются в /root/bin. Сперва полученная программа упаковывается в архив и копируется в ту же папку: # zip -9 setup_pptp.exe.zip setup_pptp.exe adding: setup_pptp.exe (deflated 4%)
# cp
Ðèñóíîê 4
Вот таким образом, шаг за шагом, напишем маленькую программку, которая создаст нужное соединение и помес-
56
setup_pptp.exe.zip ~/bin
Затем создается простенький скрипт. При настройке логина VPN он будет отсылать осчастливленному пользователю локальное электронное сообщение об этом вместе с присоединенным архивом программы автонастройки. Такой способ передачи позволяет доставить аутентификационные данные безопасным образом. Заодно и архив с программой помещается в почтовый ящик пользователя в обход антивирусных средств, фильтрующих smtp-почту. Пользователь должен сохранить письмо и архив на дискете или USB Flash-диске и принести его таким образом на компью-
администрирование тер, где нужно настроить подключение к офисному VPN. Далее останется лишь запустить разархивированную программу, которая настроит соединение, и при подключении указать логин и пароль из текста письма. После выполнения всех манипуляций дискету или USB Flash диск придется уничтожить... Шутка, конечно, но позаботиться об уничтожении информации надо обязательно! Поскольку сервер VPN сделан на GNU/Linux, то скрипт, который настраивает пользовательский логин на сервере, можно написать на языке интерпретатора bash. Например, так: #!/bin/sh FCHAP=/etc/ppp/chap-secrets UNAME=$1 UIP=$2 ( [ "$UNAME" != "" ] && [ "$UIP" != "" ] ) || { echo "Use as : $SELF <user-name> <ip>"; exit -1 ; } D=`cat $FCHAP | grep -e "^$UNAME[[:space:]]"` [ "$D" == "" ] || { echo "User \"$UNAME\" already in database"; exit -1 ; } T=`getent passwd | grep ^$UNAME:` [ "$T" != "" ] || { echo "Chosed <user-name>=$UNAME not found in passwd"; ↵ exit -1 ; } PSW=`pwgen -c -n 9 1` H="officepptp" echo -e "$UNAME\t\"$H\"\t$PSW\t\"$UIP\"" >> $FCHAP SRV=office.enterprice.domain cat <<EOT | ↵ biabam /root/bin/setup_pptp.exe.zip ↵ -s "Extern login for pptp vpn access." $UNAME@localhost Dear user. IT staff has prepared extern login to enterprise network using PPtP VPN for you personally. Tweak PPtP client on workstation to connect on extern IP-address or FQDN $SRV. You must login as "$UNAME" with passphrase "$PSW". Dont forget or loss passphrase ! If this case you must inform IT staff urgently ! After correction we will send new passphrase to you by local e-mail. IT staff. EOT exit
Перед вами очень простой скрипт. Он запускается с двумя параметрами – пользовательский логин и адрес, который выделяется для удаленного компьютера при создании криптованного туннеля. Если этот скрипт запускается на компьютере, где создаются VPN-бюджеты для нелокальных пользователей, то проверку «getent passwd» надо исключить. Применение описанной технологии позволяет избежать проблем в тех случаях, когда в ответ на радостное сообщение сисадмина о выделении пользователю логина VPN следует вопрос, «как это настроить», а визит к пользователю домой не входит в планы сисадмина.
Автоматизируем службу поддержки Если вы столкнулись с сисадмином в выходной день в гастрономе, задайте ему компьютерный вопрос. Мы работаем 24 часа в сутки 7 дней в неделю, даже в гастрономе в выходной день.
Вплотную к вопросам настройки удаленных подключений примыкают вопросы, точнее, подозрения пользователей о исправности их рабочих станций. Зачастую, когда эти вопросы на самом деле вызваны какими-то проблемами и у сисадмина совершенно нет возможности провести диагностику удаленно, приходится долго втолковывать пользова-
№5, май 2005
телям по телефону, что и как надо открыть, запустить и посмотреть. Но ведь можно заранее подготовить программу, которая проделает все манипуляции, проверит ответы и напишет резюме. Что нам потребуется, если придется провести удаленную диагностику? Правильно – исправность сети! Именно это и надо проверить автономно и без участия сисадмина. Далее приведен вариант такой программы: AutoItSetOption ( "WinTitleMatchMode", 2 ) AutoItSetOption ( "WinDetectHiddenText", 1 ) AutoItSetOption ( "SendAttachMode", 1 ) ; open free desktop WinMinimizeAll ( ) Sleep ( '1000' ) ; îáíîâèì dhcp-àäðåñà RunWait ( @ComSpec & " /c ipconfig /renew" ) If StringLeft( @IPAddress1, 3 ) == '127' Then MsgBox ( 0, 'Network Status', ↵ 'Íåèñïðàâåí ñåòåâîé àäàïòåð èëè êàáåëü ↵ íå ïîäêëþ÷åí', 100 ) Else If StringLeft( @IPAddress1, 3 ) == '169' Then MsgBox ( 0, 'Network Status', ↵ 'Íåäîñòóïåí ñåðâåð èëè íå ïîäêëþ÷åí ↵ ñåòåâîé êàáåëü', 100 ) Else If StringLeft( @IPAddress1, 10 ) == '192.168.0.' Then ;------ address OK $i = URLDownloadToFile ( 'http://www.localservernet/' , ↵ @MyDocumentsDir & '\tmp.html' ) FileDelete ( @MyDocumentsDir & '\tmp.html' ) If $i == 1 Then $j = URLDownloadToFile ( 'http://www.google.com/' , ↵ @MyDocumentsDir & '\tmp.html' ) FileDelete ( @MyDocumentsDir & '\tmp.html' ) If $i == 1 Then MsgBox ( 0, 'Network Status', 'Ñåðâåð èñïðàâåí. ↵ Äîñòóï â Èíòåðíåò ðàçðåøåí', 100 ) Else MsgBox ( 0, 'Network Status', 'Ñåðâåð èñïðàâåí. ↵ Èíòåðíåò íåäîñòóïåí', 100 ) EndIf Else MsgBox ( 0, 'Network Status', 'Ñåðâåð íå îòâå÷àåò', 100 ) EndIf ;-----Else MsgBox ( 0, 'Network Status', ↵ 'Íåèçâåñòíûé àäðåñíûé äèàïàçîí', 100 ) EndIf EndIf EndIf Exit
Программа заставляет компьютер заново запросить динамический адрес и по установившемуся значению диагностирует состояние сети. Здесь предполагается, что правильный адрес выдается DHCP из диапазона 192.168.0.0/24. Далее, если локальная сеть работает, делается попытка подключиться к тестовому внутреннему http-ресурсу и затем еще к аналогичному внешнему. Так определяется, «жив» ли внутренний сервер и есть ли доступ к исходящему каналу в Интернет. Число тестов можно расширить. Например, если запрос http://domain.name не проходит, но удовлетворяется запрос по IP-адресу, то можно сделать вывод о проблемах с DNS. Для того чтобы воспользоваться приведенной программой, надо скомпилировать ee в исполняемый файл. Затем поместить результат, например, в директорию, содержащую общий рабочий стол. Таким образом, она будет доступна всем пользователям компьютера. Либо можно поместить ее в персональный рабочий стол в профилях прямо на сервере, что приведет к размножению ее копий по локальным копиям профилей после следующей же пе-
57
администрирование резагрузки. Теперь остается приучить всех пользователей перед истеричным звонком сисадмину запускать эту программу. В первую очередь они должны будут руководствоваться результатами теста, а уже потом эмоциями и предположениями.
Практический пример Если сисадмин сказал, что придет прямо сейчас, выйдите из сети и отправляйтесь пить кофе. Для нас не проблема запомнить 2700 сетевых паролей.
Ну что ж, установка программ и выполнение стандартных действий автоматизирована. Как это поможет вам в практической работе? Рассмотрим случай из практики IT-аутсорсинга. Итак, самое главное в работе сисадмина-аутсорсера – не переработать. Для практикующих этот тяжкий труд показатель успеха прямо пропорционален числу одновременно обслуживаемых рабочих мест. Основным регулирующим фактором становится скорость восстановления рабочих станций. Именно восстановления, а не первоначальной установки. Поэтому будем рассматривать деятельность системного администратора в непрерывном цикле. И в первом приближении надо выполнить два условия. Во-первых, следует максимально снизить необходимость, как в локальном присутствии сисадмина, так и потребность в удаленном управлении. Для этого дадим полную свободу пользователям в пределах собственного рабочего места – сделаем их локальными администраторами. Скорее всего услышим возражения: это не верно, правильно ограничить права локальных пользователей, научитесь пользоваться политиками и т. д. Безусловно, такая точка зрения имеет право быть. Безусловно, есть предприятия с развитой корпоративной культурой. Но в массе, если речь идет об отечественной индустрии, то сисадмину предоставляется на выбор: открыть курсы компьютерной грамотности за свой счет или предоставить локальным пользователям максимальную свободу. Выберем последнее. Поскольку это делает: ! локальных пользователей ответственными за состояние собственного рабочего места; ! избавляет сисадмина от частых визитов по пустякам; ! создает впечатление независимости деятельности сотрудников обслуживаемого предприятия и избавляет от конфликтов, так как не позволяет им переложить ответственность на сисадмина. Во-вторых, необходимо обеспечить максимально быстрый способ восстановления рабочих станций и создать условия для удаленного управления локальными рабочими местами. Здесь должно быть все понятно: предоставив пользователям видимость свободы, надо создать средство для ликвидации последствий такой демократизации. Очень часто единственный рациональный путь «лечения» рабочих станций на платформе MS Windows заключается в полной повторной переустановке. Конечно, надо обеспечить сохранение пользовательского окружения, т.е. профиля. Настройка внутренней сети для работы в составе домена Microsoft с перемещаемыми профилями полностью реша-
58
ет задачу сохранения пользовательского окружения и даже позволяет в случае возникновения проблем с некоторыми рабочими местами воспользоваться другими компьютерами взамен поврежденных, как временной мерой. Получается, что ключевой вопрос – это автоматизированная установка рабочей станции, включая операционную систему и все необходимое для работы прикладное программное обеспечение. Итак, в результате задача свелась к выбору способа автоустановки MS Windows и программ в этой ОС. Почему к «выбору», а не «поиску» или «созданию». Да потому, что автоустановка является штатным свойством этой операционной системы. И ничего тут не надо сочинять и изобретать, ну разве что надо угадывать, так как документация путаная, а многочисленные описания процесса противоречат друг другу. «Выбор» заключается в определении места размещения дистрибутива. Рассмотрим подробнее. Способы размещения определяются используемым дистрибутивным носителем. Носителей информации ровно столько, сколько предоставляет современная технология. Автору представляется очень изящным решением установка с сетевого носителя, например с tftp, вместе с сетевой загрузкой. Многие системные администраторы практикуют этот способ. На этом экономится как минимум 15-20 у.е. стоимости каждого рабочего места – столько же стоит CDROM. Но мы рассматриваем не просто абстрактное администрирование, а аутсорсинг. Здесь нельзя полагаться на какие-то внешние средства, кроме тех, что включены в состав рабочей станции. А вдруг непредвиденное повреждение рабочего места и было связано с проблемами локальной сети. Кроме того, существует совершенно рядовая для современного офиса ситуация, когда надо обеспечить удаленный доступ к внутренним ресурсам не только для сисадмина, но и для других сотрудников. А это значит, что надо, точно так же, как и в офисе, произвести установку типового программного обеспечения и на их персональные компьютеры. Безусловно, приватные визиты могут внести разнообразие в монотонную жизнь системного администратора, но скорее всего включение приватных компьютеров в число оплачиваемых будет отрицательно воспринято заказчиком. Поэтому, выбор в качестве дистрибутивного носителя CD-ROM представляется разумным деловым компромиссом. Тем более что в перспективе можно без излишних проблем перейти на DVD-ROM, значительно увеличив тем самым число устанавливаемых программ. Теперь рассмотрим подробнее процесс установки MS Windows XP Professional SP2 Rus, которую выберем в качестве ОС для создания рабочих станций. Ведь именно этот процесс далее предстоит автоматизировать. Итак, в следующей части рассмотрим подробнее процесс установки MS Windows XP Professional SP2 Rus, которую выберем в качестве ОС для создания рабочих станций. Ведь именно этот процесс далее предстоит автоматизировать.
Литература: 1. Барабанов А. Автоматизация MS Windows, или AutoIt как мечта эникейщика. Часть 1. – Журнал «Системный администратор», №4, апрель 2005 г. – 11-15 с.
администрирование
ЭФФЕКТИВНО УПРАВЛЯЕМ ПОЛЯМИ ПОЛЬЗОВАТЕЛЕЙ В AD
Предположим, вам необходимо внести ряд однотипных изменений в свойствах всех пользователей или пользователей в пределах группы в Active Directory. Сделать их в одном поле у 10-20 пользователей не составит труда. А как быть, если количество полей 2-3, а объектов 200-300?
ИВАН КОРОБКО ля этих целей рекомендуется использовать сценарий, с помощью которого можно автоматически внести необходимые изменения в свойства объектов AD, практически исключив влияние человеческого фактора. О создании такого скрипта и пойдет речь в этой статье.
Функционал сценария Предлагаемый сценарий обеспечивает следующий функционал: корректировку профиля, сценария загрузки, корректировку домашнего каталога (в случае необходимости создание домашнего каталога по указанному шаблону и его предоставление в общий доступ). Все эти свойства должны быть применены только для всех пользователей, входящих в указанную группу, либо для всех пользователей, не входящих в указанную группу. Выполнение одного или второго условия зависит исключительно от трудозатрат на включения пользователей в группу.
Язык создания сценария В качестве языка программирования рекомендуется использовать VBScript, т.к. он имеет ряд преимуществ перед другими языками программирования: ! VBScript – встроенный в операционную систему Windows стандартный скриптовой язык. ! Поддерживает OLE-объекты, что позволяет получить доступ к AD. ! В нем реализована поддержка файловых систем FAT и NTFS – можно производить операции с файлами и папками, управлять уровнями доступа к файлам (только NTFS).
№5, май 2005
Параметры командной строки Для успешной работы сценария необходимы следующие параметры командной строки: ! Домен. Может быть определен в автоматическом режиме. Задавать его в явном виде нет необходимости. ! Название группы, к членам которой применяется скрипт, либо наоборот: скрипт будет применен ко всем пользователям домена, кроме тех, которые входят в эту группу. ! Название сценария регистрации пользователей в сети. ! UNC-путь к профилю. ! UNC и локальный путь к домашнему каталогу. Замечание: сценарий должен запускаться только с сервера, на котором необходимо корректировать домашние каталоги.
Определение имени домена Имя домена может быть определено с помощью одного из провайдеров доступа к AD: WinNT или LDAP. При выборе провайдера необходимо учесть, что WinNT в качестве результата выдает массив, содержащий не только текущий домен, но и доступные рабочие группы, если таковые имеются. Рабочие группы могут временно появиться при подключении одной из рабочих станций к домену или в случае подключения стороннего портативного компьютера к ресурсам сети. Поэтому, несмотря на громоздкий синтаксис, рекомендуется использовать провайдер LDAP, с помощью которого можно определить как длинное имя домена, так и короткое:
59
администрирование set rootDSE_ = GetObject("LDAP://RootDSE") d_def=rootDSE_.Get("defaultNamingContext") long_Ldap_name = "LDAP://" + d_def short_winnt_name= mid(d_def, instr(d_def,"=")+1, ↵ instr(d_def,",")-instr(d_def,"=")-1) wscript.echo long_Ldap_name wscript.echo short_winnt_name
temp=temp+Member.Name Next MsgBox temp
где short_winnt_name – короткое имя домена, GroupName – имя группы безопасности, членов которой необходимо определить.
Определение параметров командной строки
Управление свойствами пользователя с помощью провайдера WINNT
Для определения параметров, переданных скрипту из командной строки, необходимо использовать свойство Arguments объекта WScript. Параметры командной строки считываются сценарием как элементы массива:
Учетные записи пользователей домена содержатся в подклассе User. Подкласс включает в себя более 20 параметров (их описание см. в таблице 1), некоторые из которых не поддерживаются Windows 2k. Пример чтения полей пользователя USER (переменная UserName):
Set objArgs=Wscript.Arguments For Each arg in objArgs t = t & arg & chr(13) Next MsgBox t
Количество параметров, заданных в командной строке, определяется с помощью функции Wscript.Arguments.Count Поскольку все параметры в данной ситуации обязательны, то рекомендуется вставить обработчик ошибок: Set objArgs=Wscript.Arguments If len(cstr(objArgs(3)))=0 then strShare="c:\root\home\" strShare=InputBox("Share","ShareFolder","c:\root\home\") else strShare= cstr(objArgs(3)) If len(cstr(objArgs(2)))=0 then strFolder="\\moscow\root\home\" strFolder = InputBox("Folder:", "Home dir \%username%", ↵ "\\moscow\root\home\") else strFolder= cstr(objArgs(2)) ………………………………… End if End if
где: ! strShare – локальный путь к папке, в которой будет создан домашний каталог. Его физическое имя совпадает с именем пользователя в сети (login), а название папки в сети (share name) совпадает с именем пользователя в сети со знаком доллара (hidden share). ! strFolder – сетевой путь к этой же папке. ! strProfile – сетевой путь к профилям пользователей. Если этот параметр не задан, то профили пользователей будут локальными. ! strGroup – имя группы безопасности в AD. ! strScript – содержит имя сценария загрузки пользователя в сети.
Определение членов группы Провайдер WINNT был разработан для операционной системы Win 4.0, когда еще не было AD. Структура объектов WINNT одноуровневая, неиерархическая, поэтому чтение необходимых объектов осуществляется с помощью фильтров, в данном случае «group»: Set GroupName="Value_Group" Set user_group=GetObject("WinNT://" & ↵ short_winnt_name & "/"& GroupName & ", group") For each obj inGroup.Members
60
Set UserName="USER" Set user=GetObject("WinNT://" & short_winnt_name ↵ & "/"& UserName) u1="FullName: "+ cstr(user.FullName)+chr(13) u2="UserFlags: "+ cstr(user.UserFlags)+chr(13) u3="LoginScript: "+ cstr(user.LoginScript)+chr(13) u4="MaxBadPasswordsAllowed: "+ ↵ cstr(user.MaxBadPasswordsAllowed)+chr(13) u5="PasswordHistoryLength: "+ ↵ cstr(user.PasswordHistoryLength)+chr(13) u6="AutoUnlockInterval: "+ ↵ cstr(user.AutoUnlockInterval)+chr(13) u7="PasswordAge: "+ cstr(user.PasswordAge)+chr(13) u8="PasswordExpired: "+ cstr(user.PasswordExpired)+chr(13) temp="" temp=u1+u2+u3+u4+u5+u6+u7+u8 MsgBox temp
Изменение свойств полей осуществляется с помощью метода SetInfo после банального присвоения нового значения какого-либо параметра: User.HomeDirDrive="Y:" User.HomeDirectory="\\" & strDomain & "\" ↵ & user.name & "$" User.LoginScript=strScript User.Profile=strProfile & user.name User.setinfo
Таким образом, переданные сценарию параметры из командной строки, определение членов группы и механизм изменения свойств можно объединить в единое целое: set rootDSE_ = GetObject("LDAP://RootDSE") d_def=rootDSE_.Get("defaultNamingContext") short_winnt_name = "LDAP://" + d_def For each user in users_domain i=0 a=user.name Set user_group = GetObject("WinNT://" ↵ & short_winnt_name & "/" & strGroup) For each user_group in user_group.Members b=user_group.name if b=a then i=1 end if next if i=0 then User.HomeDirDrive="Y:" User.HomeDirectory="\\" & short_winnt_name ↵ & "\" & user.name & "$" User.LoginScript=strScript if not User.Profile="" then User.Profile=strProfile & user.name end if User.setinfo
администрирование end if next
В приведенном примере обрабатываются учетные записи пользователей, не входящих в группу strGroup. Для того чтобы изменить условие, т.е. производить действия над пользователями, принадлежащими группе, необходимо изменить условие цикла if с «if i=0 then» на «if i=1 then» или «if i<>0 then».
Управление домашним каталогом Сценарий должен последовательно выполнять следующие действия: ! определить, существует ли у домашнего пользователя каталог; ! предоставить папку в доступ с правильным именем (смена sharename); ! изменить права на файловую структуру NTFS в соответствии с установленными правилами;
! сделать необходимые изменения в свойствах учетной записи пользователя в AD.
Создание и удаление папок Создание и удаление каталогов осуществляется с помощью методов CreateFolder(path) и DeleteFolder(path) объекта USER. Параметром каждого из этих методов является путь к каталогу – path. Применяя эти методы, необходимо проверять наличие или отсутствие папки перед выполнением операции. Приведем два примера: первым из них проиллюстрируем процесс создания новой папки C:\TempFolder, используя обработчик ошибок; во втором – удаления папки. Создание папки: path="C:\TempFolder" Temp="" Set user=WScript.CreateObject("Scripting.FileSystemObject") If user.FolderExists(path)=0 then user.CreateFolder(path) Temp= "Folder " + path + " Created "
Òàáëèöà 1. Îïèñàíèå ïàðàìåòðîâ ïîäêëàññà User
№5, май 2005
61
администрирование Else Temp= "Folder " + path + " Already Exists" End If MsgBox Temp
Удаление папки: path="C:\TempFolder" Temp="" Set user=WScript.CreateObject("Scripting.FileSystemObject") If user.FolderExists(path)<>0 then user.DeleteFolder(path) Temp= "Folder " + path + " Deleted" Else Temp= "Folder " + path + " is Absent " End If MsgBox Temp
Программное создание и удаление совместно используемого ресурса Для управления совместно используемыми ресурсами используется контейнер LanmanServer (см. таблицу 2). Создание совместно используемого ресурса осуществляется с помощью метода Create. В свойствах метода указывается тип создаваемого ресурса, в данном случае fileshare, и название ресурса (ShareName). Метод Create обязательно сопровождается методом Path, с помощью которого задается путь к ресурсу, и методом SetInfo, который сохраняет сделанные изменения. Пример, в котором предоставим в общее пользование папку, локальный путь к которой «c:\folder001». Сетевой путь папки должен быть «\\1000pc\Share1». Описание папки – «Shared Folder #1»: Set Set Set Set
PC_Name="1000pc" Share_Name="Share1" Folder_Path="c:\Folder1" Description_Name="Shared Folder #1"
Set object=GetObject("WinNT://" & short_winnt_name ↵ &"/" & PC_Name &"/LanmanServer") Set element=object.Create("fileshare", Share_Name) element.Path= Folder_Path element.Description= Description_Name element.MaxUserCount =10 element.SetInfo
Для удаления используемого ресурса вместо метода Create используют Delete. Изменения вступают в силу немедленно: Set Set Set Set
PC_Name="1000pc" Share_Name="Share1" Folder_Path="c:\Folder1" Description_Name="Shared Folder #1"
Set object=GetObject("WinNT://" & short_winnt_name &"/" ↵ & PC_Name &"/LanmanServer") Call object.Delete("fileshare", Share_Name)
Управление правами доступа на файлы и папки
Sequrity.dll, входящей в комплект поставки ADSI Resource Kit (http://www.microsoft.com/ntserver/nts/downloads/other/ ADSI25/default.asp). Перед использованием библиотеки ее необходимо зарегистрировать на компьютере, на котором будет запускаться сценарий. Команда регистрации библиотеки выглядит следующим образом: regsvr32.exe /s ADsSequrity.dll
Доступ к вышеуказанной библиотеке осуществляется с помощью функции CreateObject(«ADsSecurity») по следующему сценарию: Set sec = CreateObject("ADsSecurity") Set sd = sec.GetSecurityDescriptor("FILE://c:\folder") Set dacl = sd.DiscretionaryAcl For Each ace In dacl Wscript.Echo cstr(ace.Trustee)+" " + ↵ cstr(ace.AccessMask) + " " + cstr(ace.AceType) + ↵ chr(13)+chr(10) Next Wscript.Echo dacl.AceCount
Как видно из примера, для управления правами необходимо создать новый экземпляр объекта ADsSecurity и указать к нему путь, который является параметром функции GetSecurityDescriptor(). Таким образом, можно получить доступ к коллекции DiscretionaryAcl, членами которой являются Trustee, AccessMask, AceType, AceCount и не фигурирующий в данном шаблоне RemoveAcl (см. таблицы 3-5).
Добавление новых объектов В качестве новых объектов могут выступать пользователи или группы. Приведем пример добавления нового пользователя: Set sec = CreateObject("ADsSecurity") Set sd = sec.GetSecurityDescriptor("FILE://c:\Folder") Set dacl = sd.DiscretionaryAcl Set ace = CreateObject("AccessControlEntry") ace.Trustee = "Domain\Administrator" ace.AccessMask = &h20000000 ace.AceType = &h0 ace.AceFlags = &h3 dacl.AddAce ace1 sd.DiscretionaryAcl = dacl sec.SetSecurityDescriptor sd set dacl=nothing set sec=nothing
Если требуется добавить сразу несколько новых объектов, то необходимо учесть некоторые нюансы, о которых подробнее читайте после примера: Set sec = CreateObject("ADsSecurity") Set sd = sec.GetSecurityDescriptor("FILE://c:\Folder") Set dacl = sd.DiscretionaryAcl
Создав домашний каталог для пользователя, рекомендуется изменить созданные по умолчанию права. Оставив права Full Control членам группы Domain Administrators и самому пользователю – права Modify.
Set ace1 = CreateObject("AccessControlEntry") ace1.Trustee = "domain\user1" ace1.AccessMask = &h20000000 ace1.AceType = &h0 ace1.AceFlags = &h3 dacl.AddAce ace1
Библиотека ADsSequrity.dll
for i=0 to 10000000 next
Программное управление правами доступа к файлам и папкам можно реализовать с помощью библиотеки ADs-
Set ace2 = CreateObject("AccessControlEntry") ace2.Trustee = "domain\user2"
62
администрирование ace2.AccessMask = &h20000000 ace2.AceType = &h0 ace2.AceFlags = &h3 dacl.AddAce ace2
Òàáëèöà 2. Îïèñàíèå ïàðàìåòðîâ êîíòåéíåðà LanmanServer
sd.DiscretionaryAcl = dacl sec.SetSecurityDescriptor sd set dacl=nothing set sec=nothing
Внимательно изучив пример, можно обнаружить две особенности: ! Для каждого нового добавляемого объекта необходимо создать свой собственный объект AccessControlEntry, при этом описание объекта GetSecurityDescriptor и ADsSecurity у них может быть общим. ! После добавления нового объекта должно пройти некоторое время (особенно, если сценарий находится на одном сервере, a объект, права доступа на который необходимо изменить, на другом), прежде чем он станет доступен для последующих действий. Для этого необходимо сделать в сценарии паузу. Поскольку в VBScript не существует такой функции, то предлагается использовать следующую:
Òàáëèöà 3. Îáúåêòû êîëëåêöèè DiscretionaryAcl
Òàáëèöà 4. Âîçìîæíûå çíà÷åíèÿ ïàðàìåòðà AceType
Q = Timer + x ‘ x – êîëè÷åñòâî ñåêóíä çàäåðæêè Do Loop Until Timer >= Q
Удаление существующих объектов
Òàáëèöà 5. Íàáîð âîçìîæíûõ àòðèáóòîâ
Удаление существующих групп или пользователей осуществляется с помощью свойства RemoveAcl коллекции объектов DiscretionaryAcl. Set sec = CreateObject("ADsSecurity") Set sd = sec.GetSecurityDescriptor("FILE://c:\2") Set dacl = sd.DiscretionaryAcl For Each ace In dacl If (ace.Trustee="EveryOne") dacl.RemoveAce ace end if Next sd.DiscretionaryAcl = dacl set dacl=nothing set sec=nothing
Таким образом, часть сценария, отвечающая за домашний каталог пользователя, выглядит следующим образом: If Not FS.FolderExists(strFolder&user.name) Then FS.CreateFolder(strFolder&user.name) End If On Error Resume Next ShareServiceObj.Delete "Fileshare", user.name&"$" set NewShare = ShareServiceObj.Create("Fileshare",user.name&"$") Set sec = CreateObject("ADsSecurity") Set sd = sec.GetSecurityDescriptor("FILE://"& strShare) Set dacl = sd.DiscretionaryAcl For Each ace In dacl If (ace.Trustee="EveryOne") dacl.RemoveAce ace end if Next Set ace1 = CreateObject("AccessControlEntry") Ace1.Trustee = short_winnt_name +" \ "+ user.name ace1.AccessMask = &h10000000 ace1.AceType = &h0 ace1.AceFlags = &h3 dacl.AddAce ace1 for i=0 to 10000000 next
№5, май 2005
Set ace2 = CreateObject("AccessControlEntry") ace2.Trustee = short_winnt_name +" \ "+ user.name ace2.AccessMask = &h20+&h1000+&h40000000+&80000000 ace2.AceType = &h0 ace2.AceFlags = &h3 dacl.AddAce ace2 sd.DiscretionaryAcl = dacl sec.SetSecurityDescriptor sd set dacl=nothing set sec=nothing NewShare.Path = strShare&user.name NewShare.MaxUserCount = 10 NewShare.setinfo
С помощью созданного сценария можно легко корректировать свойства доменных пользователей, входящих или исключенных из группы. Данный скрипт принесет огромную пользу при переносе домашних каталогов с одного сервера на другой, при миграции из одного домена в другой.
63
сети
СТРОИМ ЗАЩИЩЁННУЮ БЕСПРОВОДНУЮ СЕТЬ: WPA-ENTERPRISE, 802.1X EAP-TLS
Существует добрая сотня статей о небезопасности беспроводных сетей. Причём многие совершенно идентичны и бесполезны: в них говорится о том, что WEP-это плохо, что MACадреса подменяются легко, и в заключение пишется: «Есть единственный выход и спасение. Нужно использовать WPA.» И точка. Данный материал содержит именно то, что вы хотели услышать после «точки» – практическое руководство по организации хорошо защищённой беспроводной сети.
АНДРЕЙ ПЛАТОНОВ Безопасный небезопасный Wi-Fi На сегодняшний день становится очевидным, что, несмотря на все проблемы, связанные c безопасностью, надёжностью и сложностью эксплуатации, беспроводные решения семейства 802.11a/b/g всё же стали неотъемлемой частью инфраструктуры многих корпоративных, домашних и даже операторских сетей. Отчасти это произошло, потому что большинство этих проблем на современном этапе развития Wi-Fi ушли в прошлое. Беспроводные сети во всех отношениях стали намного умнее и быстрее: появился QoS, интеллектуальные антенны (технология MIMO), реальные скорости достигли 40 Мбит/c (например, технологии SuperG, SuperAG от Atheros). Кроме этого, большие изменения произошли и в наборе технологий, обеспечивающих безопасность беспроводных сетей. Об этом поговорим более подробно. Во времена, когда Wi-Fi был только для избранных, для защиты беспроводных сетей использовалось WEP-шифрование и MAC-фильтры. Всего этого быстро стало не хватать, WEP признали небезопасным из-за статичности ключей шифрования и отсутствия механизмов аутентификации, MAC-фильтры особой безопасности тоже не придавали. Началась разработка нового стандарта IEEE 802.11i, который был призван решить все назревшие проблемы безопасности. На полпути к 802.11i появился набор технологий под общим названием WPA (Wi-Fi Protected Access) – часть ещё не готового стандарта 802.11i. WPA включает в себя сред-
64
ства для аутентификации пользователей, шифрование при помощи динамических WEP-ключей (TKIP/MIC). Затем 802.11i наконец-то закончили, и на свет появился WPA2. Ко всему вышеперечисленному добавилась поддержка более стойкого шифрования AES (Advanced Encryption Standard), которое работает совместно с протоколом безопасности CCMP (Counter with Cipher Block Chaining Message Authentication Code Protocol – это более совершенный аналог TKIP в WPA). WPA2 постепенно стал появляться в новых моделях точек доступа (например, D-Link DWL-3200AP), но пока это скорее экзотика. Все продукты, поддерживающие WPA2, обратно совместимы с оборудованием, поддерживающим WPA. И WPA, и WPA2 включают в себя развитые средства контроля доступа к беспроводной сети на основе стандарта IEEE 802.1x. В архитектуре 802.1x используется несколько обязательных логических элементов: ! Клиент. В роли клиента выступает Supplicant– программа на клиентском компьютере управляющая процессом аутентификации. ! Аутентификатор. Это точка доступа, которая выполняет функции посредника между клиентом и сервером аутентификации. Аутентификатором в том числе может быть и проводной коммутатор, т.к. 802.1x используется в различных сетях. ! Сервер аутентификации – RADIUS-сервер.
на правах рекламы В IEEE 802.1x допускается использование различных методов и алгоритмов аутентификации. Это возможно благодаря протоколу EAP (Extensible Authentication Protocol), в который «вкладываются» атрибуты, соответствующие тому или иному методу аутентификации. Поэтому существует много разновидностей 802.1x EAP: EAP-MD5, EAP-PEAP, EAPLEAP, EAP-SIM и т. д. В данной статье будет описана реализация аутентификации в беспроводной сети на основе цифровых сертификатов – 802.1x EAP-TLS. Этот метод наиболее часто используется в корпоративных беспроводных сетях и отличается достаточно высокой степенью защищённости. Кроме того, EAP-TLS иногда является одним из основных методов защиты в сетях беспроводных провайдеров.
Аутентификация 802.1x EAP-TLS В основе EAP-TLS лежит протокол SSL v3.0, однако в отличие от традиционной аутентификации по протоколу SSL (например, при организации защищенного http-соединения – HTTPS) в EAP-TLS происходит взаимная аутентификация клиента и сервера. Клиент (супликант) и сервер RADIUS должны поддерживать метод аутентификации EAP-TLS; точка доступа должна поддерживать аутентификацию 802.1x/EAP и не обязательно должна знать, какой метод аутентификации используется в конкретном случае. На рисунке ниже изображён процесс аутентификации в беспроводной сети с использованием EAP-TLS.
рационной системе есть встроенный супликант, а недавно выпущенный корпорацией Microsoft update добавляет и поддержку WPA2.
Устанавливаем и настраиваем OpenSSL и FreeRADIUS Предполагается, что в системе FreeBSD 5.3 установлена одна сетевая карта, обновлена коллекция портов, присутствует Midnight Commander, а сам компьютер подключён к Интернету. В дальнейшем будем предполагать, что беспроводная сеть развёртывается в корпоративной сети c маской 192.168.0.0/24. Загружаем с ftp://ftp.openssl.org/snapshot последний стабильный «снимок» (snapshot) OpenSSL (я, например, использовал openssl-0.9.7-stable-SNAP-20050524.tar.gz ). Распаковываем, конфигурируем, компилируем и инсталлируем его стандартным образом: # ./config shared --prefix=/usr/local/openssl # make # make install
В принципе на этом работу с OpenSSL можно и завершить. В дальнейшем он потребуется нам для генерации сертификатов. FreeRADIUS – довольно объёмный пакет, поэтому его, в отличие от OpenSSL, мы будем устанавливать из портов, что обеспечит автоматическое разрешение зависимостей и установку всех необходимых библиотек и приложений. Перемещаемся в директорию /usr/ports/net/freeradius/, затем даём команду make – ничего не выбираем из предложенных установочным сценарием опций, нажимаем «Ok». Начинается процесс автоматической инсталляции (загрузка и компиляция необходимых приложений); по ее завершению следует набрать make install. На этом с установкой FreeRADIUS покончено, можно переходить к его настройке. Выбираем директорию FreeRADIUS: /usr/local/etc/raddb/ (все основные действия будут производиться в этом каталоге): ! Удаляем всё содержимое папки ./certs. ! Находясь в той же папке (./certs), даём команду: # openssl gendh > dh
Ðèñóíîê 1. Ïðîöåññ àóòåíòèôèêàöèè 802.1x EAP-TLS
Здесь уместно закончить небольшое лирически-теоретическое отступление, которое необходимо, для того чтобы получить примерное представление о том, что кроется в недрах безопасной беспроводной сети. Далее будет предложена практическая реализация описанных выше концепций. В качестве сервера RADIUS будет использоваться компьютер под управлением FreeBSD 5.3 c пакетом FreeRADIUS. Для организации инфраструктуры PKI (Public Key Infrastructure) будет применен пакет OpenSSL. Вся беспроводная сеть будет строиться на базе недорогого и надёжного беспроводного оборудования D-Link. Предполагается, что на клиентских машинах установлена Windows XP SP2, т.к. в этой опе1
создаётся файл dh.
! Там же даём команду: # dd if=/dev/random of =random count=2
создаётся файл random.
! Создаём папку raddb/sample и переносим в неё из raddb все файлы с расширением .sample. Из sample обратно в raddb копируем с изменением имени (без расширения .sample) файлы: acct_users, clients.conf, dictionary, eap.conf, hints, huntgroups, preproxy_users, proxy.conf, radiusd.conf, snmp.conf, sql.conf, users1.
На самом деле половина из этих файлов не используется, но в radiusd.conf содержатся ссылки на них. Поэтому, чтобы не тратить время на очистку radiusd.conf и удаление ненужных файлов, можно немного «схитрить».
№5, май 2005
65
сети ! Правим следующие конфигурационные файлы: clients.conf client 192.168.0.220 { # IP-àäðåñ òî÷êè äîñòóïà # Ñåêðåòíîå ñëîâî, êîòîðîå çàäà¸òñÿ íà òî÷êå äîñòóïà secret = 12345 shortname = D-Link_DWL-2100AP nastype = other } client 192.168.0.219 { # IP-àäðåñ òî÷êè secret = 54321 # Ñåêðåòíîå ñëîâî shortname = D-Link_DWL-2700AP nastype = other } # è ò.ä. eap.conf #  ñàìîì íà÷àëå, ïîñëå « eap {» default_eap_type = tls tls { private_key_password = whatever private_key_file = ${raddbdir}/certs/cert-srv.pem certificate_file = ${raddbdir}/certs/cert-srv.pem CA_file = ${raddbdir}/certs/demoCA/cacert.pem dh_file = ${raddbdir}/certs/dh random_file = ${raddbdir}/certs/random fragment_size = 1750 } radiusd.conf bind_address = 192.168.0.222 port = 1812 log_auth = yes # äëÿ îòëàäêè log_auth_badpass = yes log_auth_goodpass = yes
можно настроить на любой из 13 каналов, кроме того, можно включить функцию автоматической настройки на свободный канал. Так мы и сделаем. Если в сети есть мобильные абоненты, которые перемещаются по всей зоне покрытия, можно задать всем точкам одинаковое имя беспроводной сети – SSID, тогда абонент будет автоматически подключаться к новой точке, при потере соединения с предыдущей. При этом он будет проходить повторную аутентификацию, которая в зависимости от супликанта будет занимать от нескольких секунд и более. Так реализуется самый простой неинтеллектуальный роуминг внутри сети. Ещё один вариант: если у каждой точки свой SSID, то можно настроить несколько профилей беспроводной сети в свойствах беспроводного подключения и там же отметить опцию «подключаться к любой доступной сети». Таким образом при потере соединения, клиент будет подключаться к новой точке. Настраиваем DWL-2100AP на взаимодействие с RADIUS. ! Заходим на веб-интерфейс точки доступа (как это сделать, написано в инструкции к точке), сразу меняем пароль по умолчанию на вкладке TOOLS/ADMIN/. ! На вкладке HOME/LAN назначаем точке доступа IP-адрес, который задали в clients.conf: 192.168.0.220.
На этом настройка RADIUS завершена.
Настраиваем точки доступа Для построения беспроводной сети мы будем использовать несколько точек доступа D-Link DWL-2100AP и одну более мощную точку D-Link DWL-2700AP. Это сертифицированные точки доступа стандарта 802.11b/g (до 54 Мбит/c), в них реализована полная поддержка WPA (впрочем, как и во всех остальных точках доступа D-Link). Во всех точках используются последние прошивки, которые можно загрузить отсюда: ftp://ftp.dlink.ru/pub/Wireless. Для начала несколько слов о настройке беспроводной сети, а затем приведем пример конфигурирования D-Link DWL-2100AP для обеспечения взаимодействия с сервером RADIUS. Внутриофисная беспроводная сеть обычно состоит из нескольких точек доступа (всё покрытие разбивается на небольшие ячейки), которые подключены к проводному коммутатору. Часто для построения WLAN используются коммутаторы со встроенной поддержкой Power over Ethernet (802.3af) на портах (например, D-Link DES-1316K). При их помощи удобно подавать питание на точки доступа, разбросанные по офису2. Находящиеся рядом точки настраиваются на непересекающиеся каналы диапазона, для того чтобы они не создавали друг для друга помех. В диапазоне 2.4 ГГц, в котором работает оборудование 802.11b/g, доступно 3 непересекающихся канала для оборудования, в котором 11 каналов, и 4 непересекающихся канала для оборудования, в котором можно выбрать 13 каналов (широкополосный сигнал точки доступа занимает 3 канала диапазона). Точки доступа D-Link DWL-2100AP и DWL-2700AP 2
66
Ðèñóíîê 2. Ïðèñâàèâàåì D-Link DWL-2100AP IP-àäðåñ, îòëè÷íûé îò àäðåñà ïî óìîë÷àíèþ
! На вкладке HOME/WIRELESS делаем всё, как показано на рис. 3; в поле «Radius Secret» указываем пароль, который соответствует данной точке в clients.conf (мы указали «12345»).
Ðèñóíîê 3. Íàñòðàèâàåì D-Link DWL-2100AP íà âçàèìîäåéñòâèå ñ RADIUS
Остальные точки доступа настраиваются аналогичным
Да и не только на точки доступа, а также на цифровые камеры, коммутаторы и т. д.
на правах рекламы образом, только у них будут другие IP-адреса, каналы (если они задаются вручную), а также значение поля «Radius Secret».
Создаём сертификаты Для начала несколько общих слов о том, что такое PKI. Это некая инфраструктура, каждый субъект которой обладает уникальным цифровым сертификатом, удостоверяющим его личность; помимо прочего, цифровой сертификат содержит секретный ключ. Закодированные с его помощью сообщения можно расшифровать, зная соответствующий открытый ключ. И наоборот – сообщения, зашифрованные открытым ключом, можно расшифровать только при помощи секретного ключа. Каждый субъект PKI обладает открытым и секретным ключом. Субъектом PKI может быть как пользовательский компьютер или КПК, так и любой другой элемент сетевой инфраструктуры – маршрутизатор, веб-сервер и даже сервер RADIUS, что и имеет место в нашем случае. Во главе всей этой системы стоит главный орган CA (Certificate Autority), предполагается, что ему все доверяют и его все знают – он занимается подписью сертификатов (удостоверяет, что предъявитель сертификата действительно тот, за кого себя выдаёт). Ему помогают специальные службы по приёму запросов на сертификаты и их выдаче; номера всех выданных и отозванных сертификатов хранятся в специальном реестре. В реальности всё это вроде бы большое хозяйство умещается на одном компьютере, и с ним легко управляется один человек3. Для создания сертификатов мы будем использовать скрипты, которые идут в комплекте с FreeRADIUS. ! Для начала создадим свой CA – для этого надо будет сгенерировать цифровую подпись, которой будут подписываться все выданные им сертификаты, а также открытый ключ. ! Затем создадим серверный сертификат, установим его на RADIUS. ! И в заключение сгенерируем сертификаты для установки на клиентские компьютеры. Создаём директорию /usr/local/etc/raddb/CA, копируем туда из папки /usr/ports/net/freeradius/work/freeradius-1.0.2/ scripts/ файл CA.all и файл xpextensions. CA.all – интерактивный скрипт, создающий CA, клиентский и серверный сертификаты. Xpextensions – файл, содержащий специальные ключи Microsoft «Extended Key Usage», – они необходимы для того, чтобы EAP-TLS работал с Windows-системами. Открываем файл CA.all: ! в строке 1 исправим путь – она должна выглядеть так: SSL=/usr/local/openssl
! в строке 32 исправим путь – она должна выглядеть вот так: echo “newreq.pem” | /usr/local/openssl/ssl/misc/CA.pl -newca 3
Копируем CA.all в файл СA_users.all. Затем открываем последний и оставляем текст с 48 строки по 64-ю, остальные строки удаляем – оставшееся – это секция CA.all, в которой генерируются клиентские сертификаты. Она будет многократно использоваться, поэтому её удобно выделить в отдельный скрипт. Открываем CA.all , удаляем из него строки с 48 по 64-ю – всё то, что выделили в отдельный скрипт и сохраняем его. Примечание: файлы CA.all и CA_users.all – содержат секретную фразу-пароль «whatever», которая используется как дополнительное средство обеспечения безопасности, при эмиссии сертификатов и их отзыве. Человек, не знающий эту фразу не сможет ни подписать, ни отозвать сертификат. В принципе, кроме оператора CA, она больше никому не понадобится. Для повышения безопасности нужно заменить все встречающиеся в скрипте CA.all и CA_users.all слова «whatever» на придуманный вами пароль. Его также нужно будет вписать в eap.conf в строку «private_key_password = whatever». Далее я предполагаю, что мы оставили везде пароль «whatever» без изменений. Его и будем вводить, создавая клиентские, серверные сертификаты, а также отзывая их.
Создаём CA и серверный сертификат Запускаем CA.all. Первое, что он генерирует в интерактивном режиме – корневой сертификат CA (cacert.pem), пару открытый закрытый ключ (cakey.pem), открытый ключ корневого сертификата в формате PKCS#12 (root.der), затем серверный сертификат (cert_srv.pem), который мы установим на RADIUS. Все перечисленные файлы (и даже некоторые не перечисленные) появятся в папке CA. Создаём CA (он будет называться «Administrator»): Country Name (2 letter code) [AU]:RU State or Province Name (full name) [Some-State]:Moscow Locality Name (eg, city) []:Moscow Organization Name (eg, company) [Internet Widgits Pty Ltd]:MegaCompany Co. Ltd. Organizational Unit Name (eg, section) []:megacompany.central.office Common Name (eg, YOUR name) []:Administrator Email Address []:admin@megacompany.ru
Создаём сертификат для RADIUS: Country Name (2 letter code) [AU]:RU State or Province Name (full name) [Some-State]:Moskow Locality Name (eg, city) []:Moskow Organization Name (eg, company) [Internet Widgits Pty Ltd]:MegaCompany Co. Ltd. Organizational Unit Name (eg, section) []:RADIUS Common Name (eg, YOUR name) []:RADIUS Email Address []:admin@megacompany.ru Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []:whatever An optional company name []: (press enter)
Копируем файлы /raddb/CA/cert_srv.pem и /raddb/CA/ demoCA/cacert.pem в папку /raddb/certs – установили сертификаты на сервер RADIUS.
Создаём клиентские сертификаты Для генерации клиентских сертификатов используем наш сценарий CA_users.all. Для примера создадим сертификат для пользователя user1:
Описанная структура является простейшим вариантом PKI; возможны также более сложные структуры, в которых участвует более одного CA, между которыми устанавливаются сложные иерархические доверительные отношения.
№5, май 2005
67
сети ! Открываем CA_users.all , заменяем в нём все слова certclt.* на user1.* (это нужно для того чтобы по имени файла различать какой сертификат для какого пользователя предназначен, в противном случае будет создаваться сертификат с одним и тем же именем файла (certclt.*). Мы же создадим сразу несколько сертификатов для user1, user2,3,4,5). Как вариант можно использовать говорящие названия файлов содержащих сертификат, например, SergeyPetrov, IvanIvanov и т. д. ! Пароль – «whatever» в строках 3, 4 заменяем на реальный, как это показано в листинге: Ôàéë CA_users.all 1| openssl req -new -keyout newreq.pem ↵ -out newreq.pem -days 730 -passin pass:whatever ↵ -passout pass:whatever 2| openssl ca -policy policy_anything ↵ -out newcert.pem -passin pass:whatever ↵ -key whatever -extensions xpclient_ext ↵ -extfile xpextensions -infiles newreq.pem 3| openssl pkcs12 -export -in newcert.pem ↵ -inkey newreq.pem -out user1.p12 -clcerts ↵ -passin pass:whatever -passout pass:user1_password 4| openssl pkcs12 -in user1.p12 -out user1.pem ↵ -passin pass:user1_password ↵ -passout pass:user1_password 5| openssl x509 -inform PEM -outform DER ↵ -in user1.pem -out user1.der
Для примера вводим «user1_password» – этот пароль будет спрашиваться при установке сертификата на пользовательский компьютер, его необходимо запомнить. Это, как я уже сказал, дополнительное средство аутентификации при действиях, связанных с эмиссией сертификата. ! Сохраняем и запускаем скрипт, получаем три файла user1.der, user1.pem, user1.p12 – последний есть сертификат в формате PKСS#12 для установки на Windows клиента.
Country Name (2 letter code) [AU]:RU State or Province Name (full name) [Some-State]:Moscow Locality Name (eg, city) []:Moscow Organization Name (eg, company) [Internet Widgits Pty Ltd]:MegaCompany Co. Ltd. Organizational Unit Name (eg, section) []:IT Department Common Name (eg, YOUR name) []:Mikhail Ivanov Email Address []:mikhail@megacompany.ru Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []:whatever An optional company name []:
И так далее… (я сразу создал целых 5 сертификатов). Каждый сертификат сохраняем на отдельную дискету, пишем на ней пароль для установки («userX_password»), на ту же дискету пишем открытый ключ root.der (он у всех одинаковый) и выдаём пользователю. Пользователь устанавливает сертификат на свой компьютер (об этом будет рассказано чуть позже) и кладёт дискету в сейф.
Устанавливаем сертификаты на клиентский компьютер Итак, пользователь (предположим тот, которого мы назвали user1) получил дискетку, содержимым которой являются два файла root.der и user1.p12. Также на дискете написан пароль «user1_password». Начнём с установки root.der ! два раза щелкнем мышью по файлу root.der; ! нажимаем «Установить сертификат»; ! жмём «Далее»; ! выбираем опцию «Поместить все сертификаты в следующее хранилище», жмём «Обзор» (рис. 4);
Запускаем изменённый CA_users.all. Создаём сертификат для user1: Country Name (2 letter code) [AU]:RU State or Province Name (full name) [Some-State]:Moskow Locality Name (eg, city) []:Moskow Organization Name (eg, company) [Internet Widgits Pty Ltd]:MegaCompany Co. Ltd. Organizational Unit Name (eg, section) []:IT Department Common Name (eg, YOUR name) []:Andrey Ivanov Email Address []:andrey@megacompany.ru
Ðèñóíîê 4
! выбираем «Доверенные корневые центры сертификации», жмём «ОК» (рис. 5);
Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []:whatever An optional company name []: (press enter)
Теперь генерируем пароль для пользователя user2:
! Открываем CA_users.all, заменяем в нём user1.* на user2.*
! Заменяем пароль «user1_password» на «user2_password» (не забываем его запомнить, чтобы потом установить сертификат). ! Сохраняем и запускаем скрипт – получаем файл user2.p12. Создаём сертификат для user2:
68
Ðèñóíîê 5
! жмём «Далее», затем «Готово»; ! выдаётся предупреждение системы безопасности: «Невозможно проверить, что сертификат принадлежит
на правах рекламы «Administrator …. Установить данный сертификат?» жмём «Да»; ! выдаётся сообщение «Импорт успешно выполнен.», жмём «ОК» два раза. Устанавливаем пользовательский сертификат user1.p12. ! Два раза щелкаем мышью по файлу user1.p12, жмём «Далее» два раза.
Ðèñóíîê 7
Ðèñóíîê 6
! Здесь надо ввести пароль, который мы установили для сертификата user1. В нашем примере это «user1_password» (ну или то, что вы придумали), он условно написан на дискетке с сертификатом. Вводим его и нажимаем «Далее». ! Жмём «Далее», затем «Готово» – выдаётся сообщение «Импорт успешно выполнен», жмём «ОК». Примечание: все сертификаты, которые мы установили, можно просмотреть через MMC при помощи оснастки «Certificates → Current User (Personal → Certificates)».
Настраиваем беспроводные адаптеры D-Link DWL-G650 (DWL-G520/DWL-G120) и супликант
Ðèñóíîê 8
D-Link DWL-G650 – это CardBus-адаптер, DWL-G520 – это PCI-адаптер, a DWL-G120 – это USB-адаптер. Настраиваются они совершенно идентично. Рассмотрим процедуру на примере DWL-G650. ! Достаём адаптер из коробки, откладываем его в сторону; ставим драйверы с диска, который идёт в комплекте. После установки драйвера убираем родную утилиту для настройки адаптера из автозагрузки, потому что мы будем использовать для этих целей службу настройки беспроводного оборудования, встроенную в Windows XP. Вставляем адаптер в компьютер. ! Щелкаем один раз левой кнопкой мыши по перечёркнутому значку беспроводного подключения (в системном лотке), далее выбираем пункт «Изменить дополнительные параметры» (рис. 7). ! Выбираем вкладку «Беспроводные сети», выделяем там нашу беспроводную сеть (megacompany_DWL-2100AP), заходим в «Свойства» (рис. 8). ! На вкладке «Связи» в выпадающем меню «Шифрование данных» выбираем протокол TKIP. Перемещаемся на вкладку «Проверка подлинности» (рис. 9).
Ðèñóíîê 9
№5, май 2005
69
сети ! Здесь всё оставляем без изменений, заходим в «Свойства» EAP (рис. 10).
Ðèñóíîê 12
! Нажимаем «Ok», на этом настройка сетевой карты и супликанта завершена. Ðèñóíîê 10
! Ставим переключатели, как показано на рис. 11, в окне «Доверенные корневые центры сертификации», выбираем наш CA – он будет называться Administrator (если всё сделано точно так, как описывается в разделе «Создание сертификатов»).
Проверяем работу WPA-Enterprise в нашей сети Теперь пришло долгожданное время проверить все настройки в работе. Запускаем FreeRADIUS в отладочном режиме командой «radiusd -X» и видим на экране: radius# radiusd -X Starting - reading configuration files ... reread_config: reading radiusd.conf
В конце значатся строки: Listening on authentication 192.168.0.222:1812 Listening on authentication 192.168.0.222:1813 Listening on authentication 192.168.0.222:1814 Ready to process requests.
Ну или в худшем случае написано, почему FreeRADIUS не запустился, – не стоит отчаиваться, если это произойдёт. Нужно внимательно изучить сообщение об ошибке и проверить все настройки. Щелкаем по значку беспроводного сетевого подключения, затем по беспроводной сети с именем «megacompany_DWL-2100AP». Затем переводим свой взор на монитор, на котором запущен radiusd и отображается процесс успешной аутентификации (весь серверный вывод показывать не будем, потому что он довольно большой, приведём лишь начальные и завершающие строки). Начало вывода:
Ðèñóíîê 11
! На всякий случай нажимаем «Просмотр сертификата», и изучаем, кто поставщик сертификата. Удостоверяемся, что это наш корпоративный CA «Administrator», который мы создали (рис. 12).
70
rad_recv: Access-Request packet from host 192.168.0.220:1044, id=0, length=224 Message-Authenticator = 0x19ca5978137669db3043b8f9e8fc0803 Service-Type = Framed-User User-Name = "Andrey Ivanov" Framed-MTU = 1488 Called-Station-Id = "00-11-95-8E-BD-30:megacompany_DWL-2100AP" Calling-Station-Id = "00-0D-88-88-D5-46" NAS-Identifier = "D-Link Access Point"
Далее идёт всё, что изображено на рис. 1, в том числе обмен сертификатами. Окончание вывода:
на правах рекламы User-Name = "Andrey Ivanov" Finished request 4 Going to the next request Waking up in 6 seconds... --- Walking the entire request list --Cleaning up request 0 ID 0 with timestamp 4294d303 Cleaning up request 1 ID 1 with timestamp 4294d303 Cleaning up request 2 ID 2 with timestamp 4294d303 Cleaning up request 3 ID 3 with timestamp 4294d303 Cleaning up request 4 ID 4 with timestamp 4294d303 Nothing to do. Sleeping until we see a request.
Аутентификация прошла успешно, компьютер получает IP-адрес от DHCP-сервера и теперь может работать в беспроводной сети. К слову сказать, если на компьютере установлено несколько клиентских сертификатов (такое тоже бывает), то супликант предложит выбрать, какой из них использовать для конкретной аутентификации.
Отзыв сертификатов Казалось бы, уже всё ясно – защищённая беспроводная сеть уже построена, но на самом деле остался ещё один важный аспект, который мы сейчас рассмотрим. Предположим, что надо запретить доступ в беспроводную сеть одному из компьютеров (например, личному ноутбуку одного из сотрудников), на который ранее мы установили сертификат. Причины могут быть самыми банальными – увольнение сотрудника, сокращение и т. д. Для решения этой задачи необходимо пометить в реестре (/usr/local/etc/raddb/CA/demoCA/index.txt), в котором хранится список всех подписанных сертификатов, сертификат пользователя, которому мы хотим запретить доступ в сеть, как отозванный. После этого необходимо создать (или обновить, если он уже есть) список отзыва сертификатов (CRL – Certificate Revocation List). А затем настроить RADIUS таким образом, чтобы при аутентификации пользователей он обращался к этому списку и проверял, не состоит ли в нём предъявляемый клиентский сертификат. В ходе наших предыдущих экспериментов мы создали два сертификата для user1 (Andrey Ivanov) и user2 (Mikhail Ivanov). Для примера запретим доступ в беспроводную сеть последнему. Проделаем следующие три шага.
Шаг 1 Помечаем в реестре сертификат user2 как отозванный: находясь в /usr/local/etc/raddb/CA даём команду:
radius# openssl ca -gencrl -out ca.crl Using configuration from /etc/ssl/openssl.cnf 963:error:0E06D06C:configuration file routines:NCONF_get_string:no value: /usr/src/secure/lib/libcrypto/../../../crypto/openssl/crypto/conf/conf_lib.c: 329:group=CA_default name=unique_subject Enter pass phrase for ./demoCA/private/cakey.pem: DEBUG[load_index]: unique_subject = "yes"
Снова по ходу выполнения команды требуется ввести секретный пароль «whatever». В результате в директории /raddb/CA/ появляется файл ca.crl – это и есть список отзыва. Внутри он похож на шифровку, просмотреть его можно так: radius# openssl crl -in ca.crl -text -noout Certificate Revocation List (CRL): Version 1 (0x0) Signature Algorithm: md5WithRSAEncryption Issuer: /C=RU/ST=Moskow/L=Moskow/O=MegaCompany Co. Ltd./ OU=megacompany.central.office/CN=Administrator/ emailAddress=admin@megacompany.ru Last Update: May 27 23:33:19 2005 GMT Next Update: Jun 26 23:33:19 2005 GMT Revoked Certificates: Serial Number: D734AD0E8047BD8D Revocation Date: May 27 23:13:16 2005 GMT Signature Algorithm: md5WithRSAEncryption d4:22:d6:a3:b7:70:0e:77:cd:d0:e3:73:c6:56:a7:9d:b2:d5: 0a:e1:23:ac:29:5f:52:b0:69:c8:88:2f:98:1c:d6:be:23:b1: b9:ea:5a:a7:9b:fe:d3:f7:2e:a9:a8:bc:32:d5:e9:64:06:c4: 91:53:37:97:fa:32:3e:df:1a:5b:e9:fd:95:e0:0d:35:a7:ac: 11:c2:fe:32:4e:1b:29:c2:1b:21:f8:99:cd:4b:9f:f5:8a:71: b8:c9:02:df:50:e6:c1:ef:6b:e4:dc:f7:68:da:ce:8e:1d:60: 69:48:ad:
Видим в нём один отозванный сертификат с серийным номером D734AD0E8047BD8D (он же user2, он же Mikhail Ivanov). Обратите внимание, важным свойством CRL является срок его действия. Он должен быть обновлён не позднее его истечения (Update: Jun 26 23:33:19 2005 GMT). Срок действия CRL можно задать в файле openssl.cnf (у нас был default_crl_days = 30).
Шаг 3 Подключаем список отзыва к FreeRADIUS: ! копируем файл /raddb/CA/ca.crl в /raddb/certs/ (поверх старого ca.crl, если он там есть); ! заходим в /raddb/certs/ и приклеиваем ca.crl к файлу cacert.pem:
radius# openssl ca -revoke user2.pem Using configuration from /etc/ssl/openssl.cnf 943:error:0E06D06C:configuration file routines:NCONF_get_string:no value: /usr/src/secure/lib/libcrypto/../../../crypto/openssl/crypto/conf/conf_lib.c: 329:group=CA_default name=unique_subject Enter pass phrase for ./demoCA/private/cakey.pem: DEBUG[load_index]: unique_subject = "yes" Revoking Certificate D734AD0E8047BD8F.
OpenSSL ругается, но делает то, что нам нужно. В ходе выполнения команды необходимо ввести секретную фразу-пароль («whatever»). При этом в /raddb/CA/demoCA/index.txt сертификат будет помечен как отозванный, в чём мы можем убедиться, просмотрев данный файл. Напротив записи, соответствующей отозванному сертификату, стоит буква «R».
Шаг 2 Создаём список отзыва (CRL). Если он уже есть, то он обновится. Находясь в /usr/local/etc/raddb/CA, даём команду:
№5, май 2005
cat cacert.pem
ca.crl > ca.pem
! вносим небольшие изменения в секцию TLS-файла /raddb/eap.conf # çäåñü ìû èçìåíèëè cacert.pem íà ca.pem CA_file = ${raddbdir}/certs/ca.pem CA_path = ${raddbdir}/certs #äîáàâëÿåì ýòó ñòðîêó check_crl = yes # è ýòó ñòðîêó
Попробуем аутентифицировать в сети компьютер с сертификатом user2. Аутентификация не проходит, а user1 – беспрепятственно входит в беспроводную сеть, что и требовалось доказать. Вот теперь защищённую беспроводную сеть можно считать построенной.
71
безопасность
УСТАНАВЛИВАЕМ SYMANTEC ANTIVIRUS 9.0 В КОРПОРАТИВНОЙ СЕТИ Symantec Antivirus CE 9.0 – продукт корпоративного уровня, который позволяет развернуть и сконфигурировать весь комплекс удаленно и автоматически в Windows-сетях любого масштаба. Его несомненными преимуществами являются полная автоматизация процесса установки и настройки, возможность мгновенного отражения изменений конфигурации на всех необходимых клиентах, а также грамотная защита от несанкционированного вмешательства в работу антивирусного монитора.
РОМАН МАРКОВ сли вы используете в сети компьютеры с NT-системами, то для установки и конфигурирования антивирусной защиты на всех компьютерах вам не придется отходить от своего компьютера – гибкие возможности удаленной установки и настройки помогают сделать это быстро и непринужденно. При корректном выполнении всех инструкций процесс займет не более часа, даже если количество компьютеров измеряется сотнями. Среди возможностей клиентской части имеются стандартные для антивирусов функции сканера, мониторинга в режиме реального времени, а также дополнительные возможности: онлайн-сканирование POP3/IMAP/SMTP трафика, работа с Exchange- и Lotus Domino-клиентами. Консоль администрирования выполнена в виде стандартной mmc. Недостатком продукта является отсутствие механизмов защиты от Ad-software, проявляющего в последнее время все большую активность. Продукт обладает множеством настроек, а его установка и первоначальное конфигурирование не совсем тривиальный процесс, поэтому читателю будет полезно ознакомиться с подробным описанием процесса настройки.
Установка Сначала устанавливаем сервер антивируса (их может быть несколько – для получения отказоустойчивости). Далее описывается установка с фирменного дистрибутивного диска, включающего помощник установки компонентов. Если не сработал автозапуск, открываем файл Setup.exe, находящийся в корне дистрибутивного диска. В открывшемся меню выбираем «Install Symantec Antivirus → Deploy Antivirus Server». Указываем вариант установки – новая или обновление предыдущей версии, а также устанавливаемые компоненты:
72
! Server Program; ! Alert Management System. Разумеется, что Server Program выбираем при первоначальной установке в любом случае, а вот Alert Management Console – только по желанию. Данный компонент позволяет рассылать уведомления об обнаружении вируса – по почте, в виде PopUp-сообщений и пр. При установке компоненты «Alert Management Console» в меню пуск появится одноименный ярлык. Настройка рассылки таких оповещений интуитивно понятна и не нуждается в дополнительном описании. Общее количество случаев нейтрализации опасных и подозрительных файлов даже в средних сетях очень велико, так как очень многие веб-ресурсы содержат такие объекты. Поэтому я удалил функцию Pop-Up оповещения уже через неделю после начала использования продукта. Мое сугубо субъективное мнение – данный компонент абсолютно не нужен. В следующем окне выбираем, на какой компьютер в сети необходимо установить сервер антивируса. Если вы обладаете правами администратора на требуемый компьютер, то установку можно произвести по сети. То есть необязательно осуществлять локальный вход на целевой компьютер – установку можно произвести удаленно с любой NTсистемы (используется RPC). Нажимаем «Next», при необходимости меняем путь установки (по умолчанию – Program Files\SAV). Задаем имя группы антивируса. Если в сети используется несколько разных серверов SAV, с различными настройками, то имена их групп также должны отличаться. Если несколько серверов антивируса используется для по-
безопасность лучения отказоустойчивости, то имя их группы должно быть одним и тем же. При обнаружении в сети уже существующих серверов SAV, имена их групп появятся в списке, и для присоединения нового сервера к ним достаточно кликнуть по имени группы. При запросе пароля придумываем новый пароль администратора группы серверов антивируса, либо вводим пароль существующей группы, если мы присоединяем дополнительный сервер к уже существующей группе. Далее выбираем тип запуска. Лучше, конечно, установить «Automatic Startup». Пропускаем информационные сообщения в следующих окнах и начинаем установку. В процессе инсталляции будут выведены сообщения об ошибках (если они будут), и при нормальном завершении статус изменится на Finished, а в поле «Action» появится сообщение о необходимости перезагрузить целевой компьютер. Как правило, на корректно настроенной системе ошибок не бывает (во всяком случае, я ни разу не сталкивался с этим). Если же ошибка все-таки появилась, то ее подробное описание можно найти здесь же, в дополнительном окне описания ошибки. После перезагрузки устанавливаем консоль администрирования (Symantec System Center – далее SSC). Ее также можно инсталлировать на любой компьютер сети. Исключение составляют сервера в режиме сервера приложений (терминалов) – на них установить консоль администрирования не удастся – сначала необходимо удалить службу сервера терминалов, затем добавить консоль, и только после этого восстановить службы терминалов. На сайте технической поддержки Symantec данная несовместимость объясняется (по мнению специалистов компании) тем, что установка консоли администрирования на сервер приложений представляет потенциальную опасность из-за возможности получения удаленным пользователем контроля над приложением. Помимо этого возможны конфликты и отсутствие полноценного управления даже администратором системы из-за ограниченности работы в режиме удаленного рабочего стола с ID0. Я не могу претендовать на получение статуса эксперта в области взаимодействия SSC и ОС, поэтому позволю себе воздержаться от комментариев. Проще всего добавить консоль администрирования на компьютер администратора, так как это всего лишь средство для конфигурирования удаленного сервера. Для установки заново запускаем Setup.exe в корне дистрибутивного диска, выбираем «Install Administrator Tools → Install Symantec System Center» (для работы SSC требуется Internet Explorer 5.5 и выше). Отмечаем необходимые компоненты. Если на предыдущем шаге мы отказались от Alert Management System, то и Alert Management System Console устанавливать не нужно. Оставляем все остальные компоненты – их назначение опишем позже. После завершения инсталляции необходимо снова перезагрузить компьютер. На этом установка сервера завершена. Приступаем к конфигурированию сервера и созданию конфигурационных шаблонов для клиентов.
Настраиваем сервер Запускаем SSC. Раскрываем в левой части консоли «Symantec System Center → System Hierarchy». Должны появиться имена обнаруженных групп. Если их несколько –
№5, май 2005
то в консоли отобразятся все найденные. Иначе кликаем правой клавишей мыши по значку «System Hierarchy», из контекстного меню выбираем «New → Server Group» и вводим имя созданной нами группы, а также ее пароль. Будьте внимательны при конфигурировании целевой группы. Кликаем по требуемой группе правой клавишей и выбираем «Unlock Server Group». Потребуется ввести пароль. Если не хочется вводить его в будущем – установите флажок «Save this Password». В открывшемся иерархическом списке прежде всего кликаем по значку нашего сервера и в появившемся контекстном меню выбираем «Make Server a Primary Server» и подтверждаем смену роли. Если серверов антивируса несколько, то один из них будет Primary, а остальные – резервными для отказоустойчивости. Изменения конфигурации как самого сервера, так и клиентов производятся путем вызова соответствующих консолей настройки. Все они сгруппированы в контекстное меню, вызываемое правой клавишей мыши – «All Tasks». В дальнейшем описании словосочетание «кликните правой клавишей по объекту и выберите «All Tasks → Symantec Antivirus» по умолчанию опускается – будут указываться только пункты в этом меню. Все настройки в открываемых консолях относятся к тому объекту, по которому вы кликнули при выборе требуемой опции, поэтому клик правой клавишей мыши для вызова меню необходимо производить именно на указанном объекте. Настраиваем наш основной сервер антивируса.
Управляем обновлениями: Virus Definition Manager Настраиваем порядок и расписание получения обновлений нашим сервером. Выбираем «Update the Primary Server of this Server Group only» и нажимаем «Configure». При такой настройке только Primary Server будет получать обновления из Интернета, а все остальные сервера получат их от него. Таким образом мы экономим внешний трафик. Для получения обновлений сервер антивируса должен иметь доступ к веб-ресурсам Symantec Corporation по портам HTTP (80) и FTP (20,21), либо необходимо настроить подключение через прокси-сервер, нажав кнопку «Source». Для автоматического обновления устанавливаем флажок «Schedule for automatic updates» и, нажав справа кнопку «Schedule», задаем расписание проверки обновлений. Устанавливаем «Daily → At <требуемое время>» и в «Advanced» указываем время, через которое необходимо повторять неудачные попытки обновления (Handle missed events within), а также период случайного смещения расписания обновления («Randomization Options → Perform Update within plus or minus»). Выходим в меню «Virus Definition Manager». Задаем способ получения обновлений клиентами. Выбираем «Update virus definitions from parent server» и, нажав «Settings», задаем период проверки клиентами обновлений на сервере. Значение 60 минут является гарантией того, что клиенты будут проверять наличие обновлений ежечасно. Поскольку при такой настройке клиенты проверяют обновления только на указанном внутреннем сервере, никакого трафика на внешнем канале они не создадут. Если в сети все компьютеры локальные, то устанавливаем флажок «Do not allow client to manually launch LiveUpdate», что-
73
безопасность бы принудительно запретить клиентам запускать проверку обновлений через Интернет. После того, как порядок обновлений сервера и клиентов настроен, подтверждаем изменения. Однако если имеются пользователи с мобильными компьютерами, то лучше выделить их в отдельную группу и создать персональные настройки для этой группы (в частности, разрешающие ручное обновление, чтобы сотрудник, уехавший в командировку смог при необходимости вручную обновить свой антивирус). Даже если вы запретили клиенту запуск обновления через LiveUpdate, все равно имеется возможность добавить новые сигнатуры. Для этого необходимо скачать с сайта производителя универсальное обновление «Intelligent Updater» в виде exe-файла. После запуска программа сама найдет установленные компоненты и обновит их.
Обновим антивирусные базы прямо сейчас: Update Virus Defs now Выбираем данный пункт для немедленной проверки и закачки главным сервером обновлений антивирусных баз через Интернет. Будет выведен запрос подтверждения, и после этого базы начнут обновляться. Это может занять некоторое время в зависимости от скорости вашего канала. Выделив нужный сервер, через некоторое время (первоначальное обновление имеет размер от 5 до 8 Мб) нажмите <F5>. Статус должен смениться на нормальный (синяя галочка). Если этого не произошло – проверьте в чем дело – вызовите свойства сервера и в закладке Symantec Antivirus проверьте дату обновления. Она должна быть близка к текущей дате (разница в несколько дней допускается, так как SAV указывает только дату глобального обновления, не принимая в расчет добавления одиночных записей). Если обновление очень уж старое (больше 10 дней) – значит ваш сервер по каким-либо причинам не смог обновить базы. Проверьте настройки доступа вашего сервера в Интернете, а также логи шлюза – была ли предпринята сервером попытка обновить базы. Для более подробного анализа можно просмотреть даты изменения файлов с базой вирусов – она должна показывать время последнего изменения, что позволит точнее проверить, когда произошло обновление.
Настраиваем параметры антивирусного монитора сервера: Server Auto-Protect options Настроим работу сервера антивируса в режиме online-мониторинга. Устанавливаем флаг «Enable Auto-Protect», выбираем типы файлов. Если выбрать «All types», то снижается быстродействие, но повышается защищенность. Чтобы увеличить быстродействие, опытные администраторы, способные совершенно точно предсказать, в каких файлах могут содержаться вирусы, могут установить флаг «Selected» и, нажав кнопку «Extensions», добавить необходимые типы файлов. Мастер позволяет автоматически добавить известные SAV типы «Programs» и «Documents», однако этого не всегда оказывается достаточно. Например, рекомендуется добавить вручную к приведенному списку файлы с расширением TMP, так как многие программы перед тем, как создать окончательный файл или добавить в базу информа-
74
цию, сначала создают временный файл. Таким образом, имеется возможность сразу отловить вирусный файл. Очень полезна данная опция, например, для почтового клиента The Bat!, который при получении письма сначала помещает его содержимое во временный файл. Если антивирус почтового сервера не смог обезвредить вирус (например, его описание еще не появилось в сигнатурах), то локальный монитор сможет предотвратить заражение – такое письмо просто не будет получено с POP3-сервера. Имеется в виду, что на почтовом сервере и на локальных компьютерах установлены антивирусы разных производителей – и если описание вируса не успело появиться в сигнатурах на почтовом сервере, то есть надежда, что на локальных компьютерах оно уже есть. Правее настраиваются действия, которые необходимо производить при обнаружении зараженного файла. Как правило, оптимальным является попытка вылечить объект, а если это не удалось – просто удалить файл. Если у вас большая сеть, то помещать в карантин тысячи, скорее всего, бесполезных файлов как минимум нерационально. В меню «Advanced» задаются дополнительные параметры сервера. «StartUp options» устанавливает порядок запуска (мы выбрали «System Start», однако при необходимости можно изменить этот параметр). «Changes requiring Auto-Protect reload» – действие, которое необходимо совершать при изменении параметров, требующих перезагрузки сервера антивируса. Можно выбрать «Wait until system restart», однако лучше применять изменения сразу: «Stop and reload Auto-Protect», так как сервера могут не перезагружаться годами. В поле «Scan files when» указывается, когда именно необходимо сканировать требуемые файлы. Вариант «Accessed or modified» является наиболее оптимальным, так как подразумевает максимальную защиту – проверка будет осуществляться при любом обращении к файлу, а значит ни скопировать, ни запустить зараженный файл будет невозможно (при соответствующих настройках действий с зараженными объектами – см.выше). В секции «Automatic enabler» задается время, через которое мониторинг будет автоматически включен, даже если его принудительно отключил администратор. Секция «Threat tracer» позволяет настраивать поиск и блокирование сетевой активности вирусов в случае обнаружения таковой (используется встроенный Client-Firewall). В секции «Additional advanced options» задается уровень эвристики (средний – оптимален), а также контроль за флоппи-дисководами. Так, при попытке завершения работы антивирусный монитор проверяет наличие дискеты в дисководе, и если она там есть – выдает соответствующее предупреждение, которое очень часто вводит в ступор пользователей (особенно бухгалтеров, которые часто оставляют ключевые дискеты клиент-банка). Эту проверку можно отключить, установив флаг «Do not check floppies upon system shutdown» под кнопкой «Floppies». Вернемся в основное окно «Server Auto-Protect options». В секции «Options» можно разрешить или запретить выдачу сообщения при обнаружении вируса, а также отредактировать текст этого сообщения. Как правило, в больших сетях проще это сообщение вообще отключить, иначе очень быстро надоест отвечать на тревожные звонки пользова-
безопасность телей, которые будут со страхом сообщать, что у них «обнаружен вирус!». Здесь же задаются типы и расположение файлов, которые проверять не нужно. При возможном сильном торможении исключите из проверки файлы, которые скорее всего не будут содержать вирусов, но постоянно используются. Например, файлы БД. В противном случае вы получите резкое замедление работы в этих базах. Поэтому например при использовании систем «1С:Предприятие» файловых версий не забудьте исключить из проверки файлы следующих типов: dbf, cdx, md, dd, ert, log, mlg. То же касается работы дизайнеров (файлы tiff, cdr, psd и другие), архитекторов, инженеров видеомонтажа и пр. В противном случае вам гарантированы жалобы на «торможение системы», так как постоянный мониторинг, например, нескольких гигабайтных AVI-файлов почти завесит систему. Однако в последнее время обнаруживаются совершенно непредсказуемые уязвимости при обработке вроде бы «безвредных» файлов (например последние уязвимости, связанные с переполнением буфера в GDI с помощью безобидного JPG-файла). Поэтому говорить о том, что в каком-то конкретном формате файла вирусы жить не могут, мы не имеем права. Можно лишь надеяться, что не будет найдено новых ошибок в обработке этих «безопасных» форматов. Здесь необходимо руководствоваться отношением показателя надежности к получаемому быстродействию. В опции «Drive types» снимите все галки, так как ни проверка сетевых дисков, ни сканирование CD не даст вам ничего, кроме значительного замедления работы системы. Акцентирую внимание, что отключение такой проверки абсолютно безопасно, если вы проверяете файлы при любом обращении к ним – при попытке скопировать или запустить такой файл он будет заблокирован. Таким образом оптимальное быстродействие достигается за счет фоновой проверки только тех файлов, к которым осуществляется обращение. На этом конфигурирование антивирусного монитора сервера завершено и можно переходить к настройке клиентов. Конфигурация защиты клиентов аналогична серверной, за некоторыми исключениями и дополнительными возможностями, о которых будет особо сказано далее.
Настраиваем параметры антивирусного монитора клиентов: Client Auto-Protect Options В этом окне настраивается антивирусный online-мониторинг на клиентах. Суть настроек аналогична вышеописанным для сервера, однако присутствуют и новые опции (см. рис. 1). Например, для клиентов помимо стандартной можно настраивать различные виды защиты для систем документооборота и почты: Internet E-mail (перехват и сканирование трафика POP3/SMTP), Lotus Notes и Microsoft Exchange. При перехвате POP3-сессии клиент просто не получит письмо с зараженным файлом. Насколько это будет незаметно для пользователя – решать вам, включая или отключая оповещение о вирусе, удаляя письмо вообще или вырезая из него только инфицированные вложения. Практически у каждой опции присутствует пиктограмма «замочка», который имеет два положения – «открыто» и «зак-
№5, май 2005
Ðèñóíîê 1. Ïàðàìåòðû online-ìîíèòîðèíãà êëèåíòîâ
рыто». Закрывая замочек около конкретной настройки, вы тем самым запрещаете пользователям изменять их. По умолчанию все замочки открыты, однако рекомендуется закрыть хотя бы критически важные – отключение защиты, изменение типов файлов, действие, производимое над обнаруженными вирусами и пр. В идеале лучше всего запретить пользователю любые изменения. Таким образом управлять настройками будет только Администратор, что является обязательным для корпоративной системы защиты. Итак, настраиваем защиту файловой системы аналогично серверной, запрещаем изменения настроек, при желании отключаем оповещение пользователя о найденном вирусе и переходим на следующую закладку – Internet E-mail. Разрешаем защиту и в отличие от файловой системы выбираем файлы всех типов – мало ли что пользователю пришлют по почте. Добавляем действия, производимые при обнаружении файла (лучше удалять), а также настраиваем оповещение пользователя об обнаруженном вирусе (здесь его можно и включить, чтобы не было вопросов в стиле «Где мой файл?»). Также имеется возможность изменять тему сообщения, в котором был обнаружен запрещенный объект, вставлять в текст письма предупреждение, отправлять предупредительные письма отправителю и получателю. Помните, что посылать предупреждение отправителю не приветствуется, так как очень часто при рассылке вирусов используется подстановка чужих адресов. Помимо этого, нажав на кнопку «Advanced», настраиваем дополнительные параметры (см. рис. 2). ! «Scan files inside compressed files» – проверять файлы внутри архивов, а также архивы внутри на указанную глубину (по умолчанию – 3) . К сожалению, о том, какие типы архивов поддерживаются, ни в документации, ни на сайте производителя ничего не сказано. ! «Server port numbers» – порты, по которым происходит обмен почтой. Обычно они стандартны – 25 и 110, но при необходимости можно изменить.
75
безопасность ! «Heuristic Detection» – включает эвристический анализатор активности вирусов типа «червь». Отслеживает слишком большую активность и самостоятельные действия приложений. ! «Progress notifications» – в процессе обмена почтой SAV перехватывает трафик по указанным портам и выступает посредником между почтовым сервером и клиентской почтовой программой. Флажки в этой области включают или выключают значок SAV-E-mail в трее, а также индикатор выполнения проверки при отправке писем. Если не хочется показывать пользователям лишнюю информацию о сканировании почты – отключите эти флажки. Аналогично настраивается мониторинг клиентов Lotus Notes и Microsoft Exchange.
Ðèñóíîê 2. Ïàðàìåòðû ñêàíèðîâàíèÿ ïî÷òîâîãî òðàôèêà
На этом настройка защиты клиентов закончена. Не забывайте после каждого этапа переконфигурирования параметров защиты в окне «Client Auto-Protect Options» нажимать кнопку «Reset All…» – она принудительно применяет настройки для подключенных клиентов. Несмотря на то, что дословный перевод «Reset…» – сброс, нажатие данной клавиши инициирует именно принудительное применение настроек. То есть сброс в текущее состояние.
Устанавливаем защиту от несанкционированного изменения настроек клиентской части: Client Administrator only options В данном окне настраиваются параметры отображения значка SAV в системном трее клиентских компьютеров, а также административный запрет на деинсталляцию антивируса. Таким образом при грамотной настройке даже локальный администратор рабочей станции не сможет ни остановить службу защиты, ни удалить продукт. В закладке «General» также можно указать срок устаревания антивирусных сигнатур, по истечении которого будет выдаваться сообщение об их устаревании (полезно устано-
76
вить срок в 10 дней для того, чтобы контролировать постоянное обновление баз данных и в случае сбоя получить предупреждение). Можно также просмотреть статус клиентов в SSC – они отображаются в правой части консоли. В поле Status отображается текущее состояние клиента. При неудачном обновлении, обнаружении вирусов и пр. статус изменится. Именно поэтому служба AMS не является необходимой – все события можно просмотреть, используя SSC и контекстное меню, вызываемое кликом на интересующем клиенте. На закладке Security реализуется упомянутая возможность запрета пользователям остановки службы и деинсталляции продукта. При попытке удалить программу она запросит пароль. Пароль по умолчанию, устанавливаемый производителем – «symantec». Рекомендую сразу его сменить. Переходим к установке клиентской части на компьютеры сети. На клиенты с NT-системами ее можно произвести при помощи встроенной функции удаленного развертывания (используется RPC). В случае невозможности удаленной инсталляции (например, на клиентах Windows 9X/ME) придется произвести ее дистрибутива, который помещается в сетевую папку VPHome (она автоматически становится доступна на сервере антивируса по сети). Путь к файлу установки в этом случае: \VPHOME\CLT-INST\WIN32\setup.exe. Для удаленного развертывания в SSC заходим в меню Tools и выбираем NT Client install. Запустится мастер. Выбираем «Default location», в случае, если производим стандартную инсталляцию из серверного дистрибутива. В правой части окна Select Computers выделяем целевой сервер, которому будет принадлежать этот клиент. В левой части выбираем необходимые компьютеры, выделяя их и нажимая «Add>» (хоть все сразу). После нажатия кнопки «Finish» запустится процесс подготовки необходимых файлов. Акцентируем внимание на том, что показываемая вам полоска выполнения означает только копирование файлов на исходный компьютер. Процесс установки может занять еще несколько минут. После этого рекомендуется перезагрузить все клиентские компьютеры. Если где-то не применились настройки, необходимо снова открыть в SSC «Client Auto-Protect Options» и нажать «Reset All…» Мы рассмотрели простейшую инфраструктуру, в которой все компьютеры принадлежат одной группе – главному серверу антивируса. В SAV CE 9.0 имеется возможность создавать различные настройки для разных групп компьютеров. Для этого в папке Groups создаются различные подпапки, в которые перемещаются требуемые клиенты. После этого можно производить описанные настройки независимо над участниками каждой группы. Они применятся на всех ее участников.
Подводя итоги Symantec Antivirus 9.0 Corporate Edition – один из самых популярных на сегодняшний день антивирусных продуктов корпоративного уровня. Несмотря на упомянутый в начале статьи недостаток, связанный с не самым лучшим уровнем обнаружения и удаления Ad-software, остальные его преимущества делают SAV 9.0 CE наиболее конкурентоспособным решением для централизованной защиты рабочих станций и серверов.
безопасность
КОНТРОЛИРУЕМ БЕЗОПАСНОСТЬ СЕТИ С ПОМОЩЬЮ OSSIM
Сегодня для полноценной защиты сети уже недостаточно тандема «межсетевой экран + система обнаружения атак». Для всестороннего контроля и анализа ситуации необходимо задействовать разные инструменты. Но только в том случае, когда возможно собрать все данные в одном месте, можно получить действительно полную информацию о событиях, происходящих в сети. Разработчики системы OSSIM (Open Source Security Information Management) предоставили системным администраторам такую возможность.
СЕРГЕЙ ЯРЕМЧУК тандартом де-факто для обеспечения безопасности сети считается использование систем обнаружения атак. В мире открытого кода несомненным лидером среди такого рода продуктов является Snort. Это весьма функциональный и понятный инструмент, который может очень многое рассказать о происходящем в подконтрольной сети. Но все же несмотря на достоинства систем обнаружения атак, они не всегда могут дать полную картину происходящего. Довольно часто такой инструмент, как
78
tcptrack, способен рассказать о проблемах сети гораздо больше. Кроме того, внушительный объем выдаваемой СОА информации и ошибки в определении событий приводят к тому, что администратор получает большое количество ложных тревог. Поэтому приходится использовать и другие утилиты, помогающие получить более ясное представление о событии. С другой стороны, практически все основные утилиты и Snort в том числе предназначены для сбора данных. Их ана-
безопасность лиз лежит полностью на плечах исследователя. Поэтому вполне естественно появились разработки, которые приводят полученные данные в удобный для анализа вид. Другая категория проектов своей основной задачей ставит интеграцию как можно большего числа приложений и предоставляет инструменты для анализа собранных данных. К примеру, sguil (http://sguil.sourceforge.net). Его главной особенностью (помимо интеграции различных инструментов), является вывод информации пользователю в реальном времени. Разработчики решения OSSIM основной упор делают не на развитие новых возможностей имеющихся утилит, а именно на максимальную интеграцию имеющихся приложений, создаваемых программистами всего мира. Для этого их объединяют в пределах единой открытой архитектуры, способной сохранить возможности и путем слияния и поиска взаимосвязей в собранной информации получить более точный результат. Кроме обнаружения, OSSIM осуществляет сопоставление сетевых событий, отсеивая часть ложных оповещений, и предлагает высокоуровневые индикаторы, позволяющие производить инспекцию и оценивать ситуацию в сети. В качестве детекторов может выступать любая программа, которая способна производить обработку информации (сетевой или системной) в реальном времени, все равно каким способом: сравнением с образцом или определением аномалий и выдачей предупреждения, когда такое событие происходит. В процессе обнаружения используются все три возможные фазы: ! предварительная обработка; ! коллекционирование данных; ! последующая централизованная обработка информации. Если первые две фазы можно считать традиционными, то последующая обработка собранной информации является центральным звеном всей системы OSSIM. Ведь именно на этой стадии возможно применение механизмов, позволяющих улучшить чувствительность к обнаружению различных событий, в том числе и достаточно сложных, например распределенных или растянутых по времени атак. Для этого на последней стадии события располагаются по приоритетам, производится оценка риска и сопоставление с целью выявления взаимосвязи. Для оценки приоритета события используется несколько составляющих. Так, если происходит нападение на сервер из внешней сети и к тому же сканер nessus показывает наличие уязвимости на сервисе, используемом нападающим, то такому событию присваивается более высокий приоритет, чем событию, в котором пользователь внутренний сети не может подключиться к принтеру. Если нападение направлено на сервис, не используемый в данной сети, то такое событие вообще может быть отброшено для уменьшения объема выводимой информации. Оценка риска происходит по трем факторам: ! данные, на основании которых выработано предупреждение; ! угрозы, которые представляет событие; ! вероятности успешного осуществления атаки.
№5, май 2005
настоящее время в OSSIM интегрировано большое количество разнообразных свободных инструментов: Snort, Nessus, Acid, Ntop, Nmap, P0f, Arpwatch, oinkmaster, pads, tcptrack, tcpdump и некоторые другие. Дополнительно возможен анализ данных, поставляемых другими приложениями (например, preludeIDS, Osiris, NTsyslog, Snare, Cisco Secure IDS), которые могут быть доставлены при помощи разных способов: syslog, snmp, сокетов и пр. Открытая архитектура позволяет добавить новый датчик в течение нескольких часов. На более высоком уровне система имеет монитор, названный riskmeter, оценивающий риск, накопленный в течение определенного промежутка времени для сети или группы машин. Модель корреляции позволяет создавать как образцы, позволяющие определять известные и обнаруживаемые атаки, так и образцы, определяющие неизвестные и не обнаруживаемые ранее угрозы, строить более сложные модели, а также связать детекторы (обеспечивающие индикаторы) и мониторы (обеспечивающие предупреждения) рекурсивно. Для этого применяется два принципа: ! Корреляция, основанная на последовательности событий, построенных на известных уязвимостях, связывающая известные образцы и поведение, определяющее нападение, с помощью правил, осуществляемых статическим аппаратом. Например, если происходит событие А, затем Б, необходимо выполнить действие В. Сложность состоит в составлении правил, способных анализировать события абстрактно. ! Корреляция, использующая эвристические алгоритмы, накопление по событиям и времени, что делает возможным обнаружение неизвестных вариантов атак и обеспечивает более глобальный обзор ситуации. Для этих целей используется накопление событий (как для всей сети, так и отдельных машин) с целью получения нового индикатора или моментальный снимок безопасного состояния сети. В результате создается так называемый накопленный риск, который может быть использован для оценки критических ситуаций посредством алгоритма CALM (Compromise and Attack Level Monitor). На его входе размещается множество событий, а на выходе – индикатор безопасного состояния сети. После такой обработки предупреждения (alerts), собранные детекторами и достойные внимания, будут выданы уже как тревоги (alarms). Кроме того, в OSSIM уделено внимание детальному контролю за каждой машиной, для чего используются три типа мониторинга. Каждый из этих типов существенен для системы безопасности, и без них администратор фактически слеп и не может отличить нормальную деятельность от аномальной: ! мониторинг использования, который обеспечивает общую информацию о машине, например среднее число данных, передаваемых за день; ! мониторинг профиля обеспечивает информацию об активности пользователя, позволяя вывести характер деятельности, например, «POP3-почта, http и ftp» – нормальный режим работы пользователя;
79
безопасность ! мониторинг сессии обеспечивает в реальном времени показ сессий с возможностью отображения характера активности машины в сети. Но это еще не все уровни мониторинга. На основании данных монитора сессии и монитора риска рath-монитор следит за маршрутами, используемыми различными компьютерами для связей, и вычисляет составной риск. При этом строятся графики постоянных ТСР-сессий, позволяющие идентифицировать сетевые нападения, совершаемые одновременно на несколько компьютеров, и отдельно графики хаотически изменяющихся UDP, TCP и ICMP связей. Кроме этого, OSSIM производит инвентаризацию сети, используя как активные, так и пассивные методы, запоминая тип операционной системы, МАС-адрес сетевого устройства, netbios и DNS-имя, предоставляемые сервисы и версии используемого в них программного обеспечения и пр. При выявленном отклонении сразу же генерируется предупреждение. Затем эту информацию можно получить при помощи Forensic console и Control panel. Forensic console обеспечивает доступ ко всем данным и представляет собой поисковик, который в отличие от монитора риска позволяет исследовать каждое событие, происходящее в системе, с максимальной детализацией. Сontrol panel позволяет просматривать сетевую ситуацию на более высоком уровне. С его помощью можно получить доступ ко всем инструментам мониторинга, оценить уровень риска для сетей, отслеживать машины и подсети, уровень риска которых превысил порог безопасности, оценивать производительность основных сервисов, потоки в сетях, количественные характеристики полученной пользователями почты, доступа извне, обнаруженных вирусов. Для удобства работы некоторым событиям задается порог, превышение которого свидетельствует об аномальной активности в сети. Структурно оssim может быть разделен на 4 компонента: ! агенты – призваны объединить и обеспечить занесение в базу данных информации, снятой с различных датчиков: snort, pads, ntop, tcptrack, p0f, arpwatch, nessus и пр.; ! база данных – открытый интерфейс, обеспечивающий занесение информации в реляционную базу данных (основные составляющие – MySQL, ossim, snort/acid и phpgacl); ! сервер – производит управление корреляционным движком, нормализацию данных, оценку риска и приоритета событий; ! консоль – позволяет управлять работой всей системы, анализировать данные, производить оценку риска и содержит структуры, обеспечивающие веб-интерфейс, при помощи которого производится управление (основные составляющие: Apache, PHP c ADOdb, phpgacl, rrdtool, mrtg, acid, Nessus, Nmap, Ntop, FPDF и пр.). Каждый из представленных компонентов может быть установлен на отдельном узле, при этом информация между ними передается исключительно в зашифрованном виде при помощи SSL. Естественно, возможно разместить все компоненты и на одном узле. Структурно база данных OSSIM разбита на три части (см. схему).
80
Ñõåìà. Ñòðóêòóðà ÁÄ OSSIM
OSSIM может быть установлен на любую POSIX-совместимую систему – Linux, *BSD, есть сведения об успешном использовании в Mac OS X.
Что необходимо для установки OSSIM Учитывая большое количество разнородных приложений, предназначенных для сбора и вывода информации, плюс необходимость реализации всех зависимостей, установка OSSIM дело если нетрудное, но требующее внимательного и тщательного подхода. Кроме того, на момент написания статьи последней версией была 0.9.8rc2, имеющая небольшие отличия в установке от стабильной версии 0.9.7. В основном они касаются настройки агентов. Возможно, к выходу стабильного 1.0 релиза, а, судя по активности разработчиков, он уже не за горами, ситуация изменится. Кстати, в версии 0.9.8 сделан первый шаг к интернационализации интерфейса, пока доступны только английский, французский, немецкий, португальский, испанский, чешский и японский языки. В статье будет рассмотрен процесс установки 0.9.8rc2, так как с выходом полноценного релиза читателю будет легко ориентироваться в тех местах, где будут отличия для 0.9.7, о них будет сказано дополнительно. Исходные коды OSSIM и документацию можно получить: ! http://www.ossim.net – официальный сайт проекта; ! http://sourceforge.net/projects/os-sim; ! http://freshmeat.net/projects/os-sim; ! http://www.mybizguard.com/linux/ossim – здесь кроме OSSIM можно найти дополнительную документацию и скрипты, помогающие в установке, удалении ossim и определяющие наличие необходимых компонентов в системе; ! http://www.boseco.com – есть готовый ISO-образ системы с настроенной и готовой к работе OSSIM. На сайтах, кроме исходных текстов, доступны и прекомпилированые rpm-пакеты, в том числе необходимые для удовлетворения всех зависимостей и построения датчиков, например для Fedora Core: http://www.ossim.net/download/ fedora/RPMS.ossim. Мы рассмотрим общий случай: установку из исходных текстов на один компьютер с минимально необходимой информацией по конфигурированию сопутствующих компонентов, т.к. более подробное изложение займет слишком много места. Наибольшую помощь в установке может оказать документ INSTALL.Debian, который вы найдете в архиве с исходными кодами. Это наиболее полный документ с информацией об установке, поэтому он актуален и для пользователей других дистрибутивов. Кроме того, в этом же архиве лежит несколько README файлов с более подробным описанием особенностей установки того или иного приложения.
безопасность Для установки из исходных текстов вам понадобятся:
Query OK, 1 row affected (0.00 sec) mysql> exit Bye
Далее создаем таблицы при помощи готовых шаблонов, лежащих в подкаталоге db архива. # cd $OSSIM_PATH/db # cat create_mysql.sql | mysql -u root ossim -p # cat ossim_data.sql snort_nessus.sql realsecure.sql | ↵ mysql -u root ossim -p
После чего в базе данных ossim должна появиться структура таблиц, описанная в файле $OSSIM_PATH/doc/ossim_ db_structure.txt. Для доступа к базам данных ossim использует файл /etc/ ossim/framework/ossim.conf. Чтобы не создавать его вручную, используем готовый шаблон. # mkdir /etc/ossim/ # cp $OSSIM_PATH/contrib/debian/framework/ossim.conf ↵ /etc/ossim/
Теперь редактируем этот файл. В данный момент нас интересует секция для доступа к базе ossim.
и другие приложения, необходимые для построения датчиков и удовлетворения зависимостей. При установке использовался дистрибутив ALTLinux 2.4 Master, на дисках которого можно найти подавляющее число необходимых компонентов. В крайнем случае их можно доустановить при помощи apt-get.
Создаем базы данных и таблицы Итак, начинаем с создания баз данных, необходимых для хранения информации. Распакуем архив, далее для краткости этот каталог будем обозначать как $OSSIM_PATH. Запускаем MySQL: # /etc/init.d/mysqld start Starting safe_mysqld service:
[ DONE ]
Устанавливаем пароль, если до этого MySQL не использовался. # mysqladmin -u root password root_password
Создаем две базы данных ossim и snort (эта база данных используется при построении датчика Snort). # mysql -u root -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 1 to server version: 4.0.20-log Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql> create database ossim; Query OK, 1 row affected (0.09 sec) mysql> create database snort;
№5, май 2005
################################################# # OSSIM db configuration ################################################# ossim_type=mysql ossim_base=ossim ossim_user=root ossim_pass=root_passwd ossim_host=localhost ossim_port=3306
Как видите, для доступа к базе данных используется пользователь root, имеющий максимальные права. С точки зрения безопасности, такой подход не совсем правилен. Это упрощение сделано, чтобы минимизировать объем информации. К тому же из-за большого количества элементов на этапе настройки, скорее всего, возникнут проблемы (особенно при первой попытке). Благодаря пользователю root можно быть спокойным хотя бы за этот участок работы. После отладки, уже в рабочей системе, лучше избегать такого подхода и создать для каждого случая своего пользователя с минимально необходимыми правами, частично пример такого подхода вы найдете в конце статьи. Далее для создания таблиц нам потребуются исходные тексты в Snort и Acid. Если же их планируется использовать как датчики на этом же компьютере, то устанавливаем и настраиваем, как описано в документации. Создаем базы данных для snort. # tar –xzvf snort-2.3.2.tar.gz # cd snort 2.3.2 # cat ./schemas/create_mysql | mysql -u root -p snort
В более ранних версиях скрипты находились вместо schemas в contrib. После этого переходим к таблицам Acid. На сценарии необходимо предварительно наложить патчи. # # # #
cd /var/www tar -xzvf /tmp/acid-0.9.6b23.tar.gz cd acid patch -p1 < $OSSIM_PATH /contrib/acid.patch
81
безопасность patching patching patching patching patching patching patching patching patching patching patching patching patching patching
file file file file file file file file file file file file file file
acid_cache.inc acid_common.php acid_conf.php acid_hdr2.html acid_main.php acid_output_query.inc acid_qry_common.php acid_qry_form.php acid_qry_sqlcalls.php acid_state_citems.inc acid_state_criteria.inc acid_update_db.php create_acid_tbls_mysql.sql create_acid_tbls_pgsql.sql
Далее настройка ACID происходит обычным образом, не забудьте только изменить параметры доступа к базе данных в acid_conf.php. $alert_dbname $alert_host $alert_port $alert_user $alert_password
= = = = =
"snort"; "localhost"; "3306"; "root"; "root_passwd ";
Создаем необходимые таблицы. # cat ./create_acid_tbls_mysql.sql | mysql -u root snort -p
Устанавливаем и настраиваем датчики Snort и Spade Так как мы устанавливаем все компоненты OSSIM на один компьютер, то теперь инсталлируем Snort как датчик. Для этого первым делом ставим Spade (Statistical Packet Anomaly Detection Engine). Ранее он поставлялся вместе с Snort, сейчас для удобства он поставляется вместе с ossim, его можно взять и с официального сайта (http://www.silicon defense.com). # # # #
cd $OSSIM_PATH/contrib/spade/Spade-040223.1.tgz tar -xzvf Spade-040223.1.tgz cd Spade-040223.1 vi Makefile
Редактируем переменную SNORTBASE, указывающую на месторасположение исходных текстов Snort: # make ............... Spade installed!
Накладываем патчи на Snort, номера версий в моем случае не совпадают, но проблем замечено не было: # cd snort-2.3.2 # patch -p0 < $OSSIM_PATH/contrib/snort-2.1-ossim.patch patching file src/output-plugins/spo_database.c Hunk #2 succeeded at 69 with fuzz 1. Hunk #3 succeeded at 184 (offset 1 line). Hunk #5 succeeded at 327 (offset 1 line). Hunk #6 succeeded at 684 (offset 9 lines). Hunk #7 succeeded at 860 (offset 1 line). Hunk #8 succeeded at 928 (offset 9 lines). Hunk #9 succeeded at 1735 (offset 1 line). Hunk #10 succeeded at 2844 (offset 9 lines). Hunk #11 succeeded at 2855 (offset 1 line).
И далее устанавливаем Snort обычным образом, не забывая добавить опцию --with-mysql, для того чтобы он мог заносить данные в MySQL:
82
# ./configure --with-mysql # make # make install
После чего создаем каталог /etc/snort: # mkdir /etc/snort
И копируем в образовавшийся каталог необходимые файлы: # cp snort-2.3.2/etc/snort.conf /etc/snort/ # cp snort-2.3.2/etc/unicode.map /etc/snort/ # cp $OSSIM_PATH/contrib/spade/spade.conf.sample ↵ /etc/snort/spade.conf
Далее редактируем эти файлы, при этом в snort.conf должны быть строки, настраивающие уровень критичности заносимых сообщений для syslog и параметры базы данных: ################################### # Step #3: Configure output plugins ################################### output alert_syslog: LOG_AUTH LOG_ALERT output database: alert, mysql, user=root dbname=snort ↵ host=localhost logfile=fast.log
И подключаем файл spade.conf директивой: Includespade.conf
После чего заполняем секцию в файле ossim.conf, которая отвечает за доступ к БД для сенсора Snort: # # # #
######################## # SNORT db configuration # (look at snort.conf) ######################## snort_type=mysql snort_base=snort snort_user=root snort_pass=root_passwd snort_host=localhost snort_port=3306
Настройку доступа к базе данных на этом этапе можно считать законченной.
Настраиваем сервер OSSIM Приступаем к установке сервера: # cd $OSSIM_PATH/ # ./autogen.sh
По умолчанию утилита конфигурируется с опциями ./configure --sysconfdir=/etc --localstatedir=/var, если удобнее разместить всю структуру, например в /opt/ossim их можно переопределить. # cd src/ # make
После чего в /etc/ossim должен появиться ряд подкаталогов, сейчас нас интересует только один – /etc/ossim/server, содержащий несколько XML-файлов (config.xml, directives.xml, generic.xml, trojans.xml, directives.xml). Кроме того, при установке должен быть создан каталог /var/log/ossim, предназ-
безопасность наченный для журнала, а исполняемый файл ossim-server нужно переместить в /usr/local/bin/. Проверьте их наличие, если чего-то нет – скопируйте или создайте вручную. На следующем шаге необходимо отредактировать файл /etc/ossim/server/config.xml. Структура его проста и понятна, в нем содержатся данные для доступа к базам ossim и snort, IP-адрес (не используйте 127.0.0.1, иначе не сможете подключиться к серверу) и интерфейс, на котором сервер будет слушать подключение агентов и консоли, e-mail, на который будут отсылаться предупреждения. Дополнительно могут указываться IP-адреса дублирующих (replication) серверов в случае совместной работы нескольких серверов OSSIM. Здесь становится очевидно одно из неудобств настройки OSSIM: для всех компонентов используются свои конфигурационные файлы, информация в некоторых из них (например, параметры доступа к БД) дублируются, что приводит к увеличению объема работ, а также путанице и ошибкам. Когда все готово, сервер можно запускать. # ossim-server -d -c /etc/ossim/server/config.xml
При этом не должно быть выдано никаких ошибок, а в журнале должна появиться запись: # cat /var/log/ossim/server.log OSSIM-Message: OSSIM-Message: OSSIM-Message: OSSIM-Message:
sim_thread_scheduler sim_thread_organizer sim_thread_server Waiting for connections...
Сервер готов принимать подключения.
Приступаем к настройке консоли Все настройки производятся в конфигурационном файле /etc/ossim/framework/ossim.conf, который мы использовали ранее. Кроме параметров доступа к базам ossim и snort, требуется указать пути к некоторым приложениям. ################### # Base dir ################### data_dir=/opt/ossim base_dir=/var/www/ossim # ÿ ïåðåìåñòèë ïîäêàòàëîã www ïîáëèæå ê îñòàëüíûì ôàéëàì # âåá-ñåðâåðà ossim_interface=eth0 ossim_link=/ossim/ adodb_path=/usr/share/adodb/ phpgacl_path=/var/www/phpgacl/
И в самом конце файла: jpgraph_path=/usr/share/jpgraph/
Заходим в /var/www/phpgacl/, редактируем два файла gacl.class.php и admin/gacl_admin.inc.php, где в переменных «db_type», «db_host», «db_user», «db_password» и «db_name» указываем параметры доступа к базе данных ossim (параметр «db_table_prefix» оставляем пустым). Здесь же создаем подкаталог admin/templates_c с возможностью записи в него с правами пользователя, от имени которого работает веб-сервер.
№5, май 2005
Копируем шаблон конфигурации веб-сервера. #
cp $OSSIM_PATH/etc/httpd/ossim.conf /etc/httpd/conf/
И проверяем правильность путей внутри него: <IfModule mod_alias.c> Alias /ossim "/var/www/ossim" </IfModule> <Directory /var/www/ossim> <IfModule mod_php4.c> php_value include_path .:/usr/share/ossim/php/ </IfModule> </Directory> <Directory /var/www/phpgacl> AuthType Basic AuthName OSSIM AuthUserFile /var/www/ossim-users Require valid-user AllowOverride None </Directory>
Как видите, для доступа необходимо завести пользователя ossim и задать пароль: # htpasswd -c /var/www/ossim-users ossim New password: Re-type new password: Adding password for user ossim
Теперь рассмотрим конфигурационный файл Apache httpd.conf и проверим загрузку модулей mod_php4 и mod_ssl, а также подключим при помощи параметра Include файл /etc/httpd/conf/ossim.conf. Перезапускаем веб-сервер и вводим в браузере http://localhost/phpgacl/setup.php, для настройки phpgacl. Теперь, когда phpgacl установлен, необходимо перейти к странице http://localhost/ossim/setup/ ossim_acl.php, что приведет к автоматическому заполнению базы данных с заданными по умолчанию параметрами доступа (пользователь admin пароль admin, который необходимо затем обязательно изменить, используя «Сonfiguration → Main»). Установка RRDTool проста, скачиваем последнюю версию с http://people.ee.ethz.ch/~oetiker/webtools/rrdtool/ download.html и устанавливаем обычным образом. После чего указываем в файле /etc/ossim/framework/ossim.conf местонахождение исполняемых файлов и библиотек. rrdtool_path=/usr/bin/ rrdtool_lib_path=/usr/lib/perl5/
Следующим шагом идет настройка mrtg, здесь работы немного больше. Скачиваем с http://people.ee.ethz.ch/ ~oetiker/webtools/mrtg/pub, накладываем патчи: # tar –xvzf mrtg-2.10.5.tar.gz # cd mrtg-2.10.5/bin # patch -p0 < $OSSIM_PATH/contrib/mrtg/mrtg.diff
Затем компилируем и устанавливаем, как описано в doc/ unix-guide.txt. После чего создаем необходимые каталоги и прописываем путь к ним в конфигурационных файлах. # mkdir /var/www/mrtg # cd /var/www/mrtg # mkdir host_qualification net_qualification ↵ global_qualification level_qualification
83
безопасность Теперь редактируем /etc/ossim/framework/mrtg-rrd.cfg: WorkDir: Include: Include: Include:
/var/www/mrtg /var/www/mrtg/hosts/host_qualification.cfg /var/www/mrtg/nets/net_qualification.cfg /var/www/mrtg/global/global_qualification.cfg
И в файле /etc/httpd/conf/ossim.conf редактируем переменные: mrtg_rrd_files_path=/var/www/mrtg rrdpath_host=/var/www/mrtg/host_qualification/ rrdpath_net=/var/www/mrtg/net_qualification/ rrdpath_global=/var/www/mrtg/global_qualification/ font_path=/opt/ossim/contrib/fonts
Далее необходимо, чтобы интерпретатор Perl видел модуль ossim_conf.pm. Для достижения этого можно создать символическую ссылку: # ln -s $OSSIM_PATH/include/ossim_conf.pm /usr/lib/perl5/
Можно также указать другой каталог, перечисленный в массиве @INC (вывести весь список можно, perl -e ’print «@INC\n»’), либо сделать видимым путь к $OSSIM_PATH/ include/ в массиве @INC, указав эти данные в скрипте draw_graph.pl, добавив вначале строку: use lib "/opt/ossim/include";
либо поместив модуль и скрипт в один каталог (переменная @INC обычно включает текущий каталог). Другие варианты решения смотрите perldoc -q @INC. Сам скрипт draw_graph.pl копируем каталог cgi-bin вебсервера:
консоли. Перед установкой на него необходимо наложить патчи. # tar –xzvf ntop-3.1.tar.gz # cd ntop-3.1/ # patch -p0 < $OSSIM_PATH/contrib/ntop/ntop-3.1-ossim.diff
В указанном каталоге находятся патчи для нескольких версий ntop. Далее все проходит,как описано в документации. Если все прошло нормально, на результат можно посмотреть, набрав http://localhost:3000, активируем rrdPlugin зайдя в «Admin → plugins». Редактируем файл ossim.conf: ntop_link=http://your_ntop_host:3000/ rrdpath_ntop=/var/lib/ntop/rrd
Начиная с версии 0.9.7, консоль OSSIM может создавать отчеты в формате pdf, что очень удобно при выводе на печать. Для реализации такой возможности используется FPDF – специализированный класс PHP, представляющий собой свободную (не требующую отчислений при коммерческом использовании) замену Pdflib. Установка проста. Скачиваем архив и копируем файл fpdf.php в каталог, указанный в параметре include_path т.е. /usr/share/ossim/php/ (или в php.ini) файла настройки ossim.conf веб-сервера. # tar -xzvf fpdf153.tgz # cd fpdf153 # cp fpdf.php /usr/share/ossim/php/
Интеграция OSSIM и nessus описана в README.nessus, поэтому за более подробной инструкцией обращайтесь к нему. Ничего необычного в установке нет. Заносим в /etc/ ossim/framework/ossim.conf данные для доступа к серверу nessus:
# cp $OSSIM_PATH/scripts/draw_graph.pl /var/www/cgi-bin/
Запускаем скрипт launch-mrtg, который создаст необходимые файлы: # cd $OSSIM_PATH/mrtg # ./launch-mrtg
nessus_user=ossim nessus_pass=your_password nessus_host=localhost nessus_port=1241 nessus_path=/usr/bin/nessus nessus_rpt_path=/var/www/ossim/vulnmeter/
Пароль задается так.
И обеспечиваем ему периодический запуск: # /usr/sbin/nessus-adduser # crontab -e 0-59/5 * * * * $OSSIM_PATH/mrtg/launch-mrtg
либо используя готовый шаблон: # cp $OSSIM_PATH/etc/cron.d/ossim /etc/cron.d/
Using /var/tmp as a temporary file holder Add a new nessusd user ---------------------Login : ossim Authentication (pass/cert) [pass] : Login password : your_password
Для обновления подключаемых модулей вводим: Для обновления данных, используемых утилитами mrtg и rrdtool, применяется скрипт control_panel.py, который необходимо поместить в каталог, где он будет виден переменной PATH: # cp $OSSIM_PATH/scripts/control_panel.py /usr/local/bin/ # chmod +x /usr/local/bin/control_panel.py
Ставим ntop. При построении OSSIM он может быть размещен в принципе на любом компьютере, хотя в документации описана установка на компьютер, выполняющий роль
84
# nessus-update-plugins # perl $OSSIM_PATH/scripts/update_nessus_ids.pl
Кроме того, для запуска сканирования используется Perl-скрипт $OSSIM_PATH/scripts/do_nessus.pl, который заносит результат работы в базу данных ossim.
Настраиваем работу с агентами И наконец, настройка работы с агентами. Установка управляющего скрипта (написанного на Python), при помощи ко-
безопасность торого осуществляется контроль над агентами, несколько отличается в версиях 0.9.7 и 0.9.8. Ранее необходимо было просто скопировать файлы на свое место, теперь этим руководит отдельный сценарий. При этом если просто скопировать скрипт в каталог, перечисленный в переменной PATH, то при работе выдается множество ошибок, лучше всего создать ссылку: # cd $OSSIM_PATH/agent # ln -sf `pwd` /usr/local/bin # python setup.py install
Копируем конфигурационный файл на свое место: # mkdir /etc/ossim/agent # cp $OSSIM_PATH/etc/agent/config.xml /etc/ossim/agent
и запускаем, проверяя на наличие ошибок: # ossim-agent -v
Если агент запустился без проблем и жалуется на отсутствие датчиков, то все нормально и можно открывать конфигурационный файл для редактирования. Файл config.xml имеет простую и понятную структуру, поэтому особых сложностей не предвидится. В самом начале идет описание сервера:
/usr/bin/tcptrack -i eth0 -P 40003 -F 10 –D
Записываем в файл /etc/services следующие строки: ossim-agent ossim-agent
40001/tcp 40001/udp
#ossim-agent #ossim-agent
Теперь можно запускать в боевом режиме: # ossim-agent -d -c /etc/ossim/agent/config.xml (->) Agent: (<-) Agent:
Waiting for server... Server connected
C точки зрения безопасности агентам лучше дать минимальные права для работы с базой данных: # mysql -u root -p mysql> GRANT INSERT, SELECT on snort.* to root@sensor_ip IDENTIFIED BY 'mysql_password'; mysql> GRANT INSERT, SELECT on ossim.* to root@sensor_ip IDENTIFIED BY 'mysql_password'; mysql> exit;
хотя на этапе настройки это можно пропустить.
<!-- Ip and port number where the ossim server is listening --> <serverip>192.168.0.10 </serverip> <serverport>40001</serverport> <watchdog enable="yes" interval="30"/> <logdir> /var/log/ossim</logdir>
Секция <plugins> описывает датчики. Если какой-то из датчиков не установлен, то пункт, отвечающий за его запуск, следует «закомментировать», чтобы при работе не засорять файлы журнала ненужными сообщениями об ошибках. Например, датчик snort описан так:
Ðèñóíîê 1. Ïóíêòû ìåíþ êîíôèãóðàöèè ïîçâîëÿþò ïîëó÷èòü áîëåå òî÷íûé ðåçóëüòàò
<plugin id="1001" process="snort" type="detector" ↵ start="yes" enable="yes"> <startup>/etc/init.d/snort start</startup> <shutdown>/etc/init.d/snort stop</shutdown> <source>fast</source> <interface>eth0</interface> <sensor>192.168.0.10</sensor> <location>/var/log/snort/fast.log</location> </plugin>
В принципе здесь все просто и должно быть понятно, но это не значит, что все сразу и заработает. Причин может быть две: неправильная строка запуска команды, либо команда недоступна из PATH. Поясню на примере. В ALTLinux, как и во многих других дистрибутивах, а также при установке snort из исходников, скрипт запуска называется snortd, а не snort. С Apache неразберихи еще больше, скрипт может называться и apache, и httpd, и httpd2. Поэтому проконтролируйте правильность написания названий. Во втором случае вместо строки, записанной по умолчанию в файле: tcptrack -i eth0 -P 40003 -F 10 –D
укажите полный путь к утилите (это даже считается хорошим тоном).
№5, май 2005
Ðèñóíîê 2. Ïîëó÷åíèå ïîäðîáíûõ îò÷åòîâ – îäíà èç ïîëîæèòåëüíûõ ñòîðîí OSSIM
Теперь, когда самая трудная часть позади и все настройки произведены, можно заходить в консоль. Вызываем веббраузер и вводим https://localhost/ossim, используя в качестве имени/пароля admin-admin. При первом запуске система активирует все необходимые для работы параметры и установит настройки для Control Panel. Дальнейшее изучение вы можете продолжить самостоятельно, щелкая мышкой и наблюдая за информацией выдаваемой системой.
85
образование
СВОБОДНАЯ ИНФОРМАЦИОННАЯ СИСТЕМА ДЛЯ ШКОЛ CENTRE Несмотря на стремительное развитие компьютерных технологий, до настоящего времени во многих учебных заведениях учет персональных данных школьников и студентов ведется вручную. Это отнимает много времени у преподавателей и отвлекает их от основной работы. Система Centre позволит автоматизировать рутинные задачи и облегчит повседневный труд.
СЕРГЕЙ ЯРЕМЧУК тклики, пришедшие на мой адрес после публикаций материала об ATutor [1] и OpenAdmin [2], свидетельствуют об имеющемся спросе на приложения, которые ориентированы на сферу образования. Действительно, сегодня в большинстве школ учет персональных данных ведется на бумаге либо в документах MS Word (Excel), что не только неудобно, но и малоэффективно. Поиск и отбор необходимой информации в таком случае сильно затруднен и часто происходит не без ошибок и казусов, даже для небольшой справки задействуются лишние ресурсы, которые могли бы быть использованы более рационально. Особенно большой интерес среди таких приложений вызывают открытые продукты. Свободная студенческая информационная система (Student Information System) Centre проектировалась так, чтобы обеспечить все нужды преподавателей, родителей, студентов, школьников, администраторов, и представляет собой эффективное средство сбора информации, которое может быть использовано в учебных заведениях разного уровня: от начальных школ до вузов. Гибкость Centre позволяет применять один сервер для хранения информации любого количества учебных заведений с разграничением полномочий как во внутренних сетях, так и в Интернете. Применение веб-технологий упрощает клиентскую часть и позволяет пользователям получать доступ к необходимой информации с любого компьютера, имеющего выход в Интернет. На момент написания статьи актуальной была версия 1.5, которую можно бесплатно получить с сайта поддержки проекта http://www.miller-group.net, для чего необходимо первоначально зарегистрироваться. Centre распространяется под лицензией GPL. В базу данных может быть внесена практически любая информация об учащихся, персональные данные, в том числе и медицинская информация, посещаемость, успеваемость и прочее. В Centre особое внимание уделено удобству поиска и генерации различного вида отчетов по его результатам. Так, кроме выдачи информации в браузер, отчеты могут быть сохранены в файле формата PDF, что удобно для последующей печати. На основании данных о местожительстве учащихся могут быть заполнены адреса на конвертах, это позволит организовать рассылку различного рода информации (табелей успеваемости, посещаемости, списков и пр.). Различного рода планировщики помогают эффективно распоряжаться временем учебных групп или отдельных учащихся, организовывать курсы, инструктажи. Планируемые события можно просмотреть через календарь. Сentre
86
может быть адаптирован для различных школьных программ, задано любое количество семестров или учебных периодов. Кроме того, для Centre разрабатываются дополнения, способные расширить его возможности. Главный недостаток Centre состоит в отсутствии русскоязычной локализации. Ознакомиться с работой Centre можно, зайдя по адресу http://demo.miller-group.net, используя для доступа имена пользователей admin, teacher, parent, student с таким же паролем (admin-admin, teacher-teacher и т. п.).
Установка сервера Centre Сервер Centre построен с применением свободных компонентов. Так, для хранения информации используется база данных PostgreSQL (кроме неё поддерживается Oracle, другие сервера не поддерживаются), весь код написан на PHP, в качестве веб-сервера используется Apache. Такие компоненты позволяют использовать в качестве операционной системы Linux, FreeBSD и многие другие UNIX-подобные ОС, а также Windows и Mac OS X. Кроме того, для генерации отчетов в формате PDF необходим HTMLdoc (http://www. easysw.com/htmldoc). Во время написания статьи использовался дистрибутив ALTLinux 2.4 Master. Регистрируемся на сайте, скачиваем архив сервера и распаковываем его в каталог с документами веб-сервера Apache /var/www/html (или /srv/www в SuSE). Для удобства работы переименовываем каталог. # mv /var/www/html/Centre-v.1.4
/var/www/html/centre
Устанавливаем, настраиваем и запускаем PostgreSQL: # /etc/init.d/postgresql restart Service postmaster is not running. Creating default database: Starting postmaster service: Link postgresql socket:
[PASSED] [ DONE ] [ DONE ] [ DONE ]
Теперь соединяемся с PostgreSQL и создаем базу данных, необходимую для работы (см. рис. 1) . # psql -U postgres template1
Далее создаем таблицы, используя готовый шаблон: # psql -U postgres centre ↵ < /var/www/html/centre/centre.sql > centre.log
образование Добро пожаловать в psql 7.4.3 - Интерактивный Терминал PostgreSQL. Наберите: \copyright для условий распространения \h для подсказки по SQL-командам \? для подсказки по внутренним slash-командам (\команда) \g или ";" для завершения и выполнения запроса \q для выхода template1=# CREATE DATABASE centre; CREATEDATABASE template-# \q
Ðèñóíîê 1. Ñîçäàåì áàçó äàííûõ
При этом в ходе выполнения команды могут быть получены сообщения, начинающиеся с «NOTICE: ALTER TABLE / ADD PRIMARY KEY will create implicit index», которые можно проигнорировать. Далее нужно разрешить TCP/IP-соединения с localhost в файле настройки pg_hba.conf. И чтобы сервер мог их обслуживать, добавьте ключ -i в строку запуска postmaster в файле /etc/init.d/postgresql. Для настройки доступа к базе данных сервером Centre используется файл config.inc, в который необходимо внести изменения, подправив следующие строки: // Database Setup $DatabaseType="postgres"; // oracle, postgres $DatabaseANSI=true; // ANSI compliant flag. $DatabaseServer="127.0.0.1"; // postgres = host, // oracle=SID $DatabaseUsername="postgres"; $DatabasePassword="password"; $DatabaseName="centre"; $DatabasePort="5432";
Далее необходимо ввести полный путь к файлам сервера и каталогу, в котором будут храниться фотографии студентов, и изменить название школы, которое будет выводиться в заголовке. // Server Names and Paths $CentrePath="/var/www/html/ñentre/"; $StudentPicturesPath = ="/var/www/html/ñentre/pictures"; $CentreTitle = 'Centre School Information System';
Набираем в строке браузера http://your_domain.com/ сentre/index.php и попадаем на заглавную страницу, где регистрируемся с именем пользователя admin и паролем admin (по умолчанию в системе заведены и другие тестовые пользователи, о которых говорилось в начале статьи, в целях безопасности их желательно отключить или изменить пароль). В результате будет выведено поздравление с успешной установкой. В случае неудачи появится диагностическое сообщение (рис. 2):
Далее создаем новых пользователей, вводим информацию о школе и прочие данные, необходимые для работы. Администраторы, учителя, родители могут самостоятельно создавать учетные записи. Для этого на главной странице необходимо нажать «Create Account», после чего в появившемся окне заполнить свои данные, указав действующий почтовый адрес, на который будет затем отослано сообщение об активации входа. Администратор может выбрать фильтр No Access на странице Users в строке поиска пользователей Profile, и в результате им будет получен список пользователей, не имеющих допуска (рис. 3).
Ðèñóíîê 3. Ïîíÿòíîå ìåíþ, ïîçâîëÿåò áûñòðî íàéòè ïîëüçîâàòåëÿ ïî çàäàííûì êðèòåðèÿì
Чтобы разрешить пользователю вход, измените параметр «User Profile» на необходимый, т.е. Administrator, Teacher, Parent, N/A (остальные), и не забудьте указать в параметре «School», к данным какой из школ он получит допуск. Пункт «Associate Students» позволяет указать на родителей студента. После чего на заявленный при регистрации почтовый ящик уйдет сообщение об успешной активации пользовательского входа. Для добавления в базу учащихся применяется вкладка «Students», где, выбрав «Add a Student», необходимо ввести соответствующую информацию. В дальнейшей работе можно разобраться самостоятельно, к тому же в каталоге Doc архива имеется документация на английском языке, которая может помочь в освоении Centre. Как говорилось выше, локализацию Centre можно осуществить своими силами (рис. 3) по мере ввода сервера в эксплуатацию. К сожалению, отсутствие шаблонов, собранных в одном месте, несколько затрудняет работу. В первую очередь следует заглянуть в файлы: Menu.php; Help.php; functions/ErrorMessage.fnc.php; modules/Students/ includes/General_Info.inc.php; modules/Students/Student.php; modules/Students/Search.php. И в некоторые другие, в основном находящиеся в каталогах modules/Scheduling/ и modules/Reports/. С остальными настройками вы сможете разобраться в процессе работы. Успехов!
Литература: Ðèñóíîê 2. Äèàãíîñòè÷åñêèå ñîîáùåíèÿ ïîçâîëÿþò âûÿâèòü ïðîáëåìó
№5, май 2005
1. Яремчук С. Обучение при помощи Atutor. – Журнал «Системный администратор», № 1, январь 2005 г. – 84-87 с. 2. Яремчук С. Сервер для школ. – Журнал «Системный администратор», № 4, апрель 2005 г. – 88-91 с.
87
web
БАЗОВАЯ HTTP-АВТОРИЗАЦИЯ – ЗАЩИТА ОТ ЧЕСТНЫХ ЛЮДЕЙ Базовая авторизация используется повсеместно для ограничения доступа к «личным кабинетам», «панелям управления», администраторским веб-интерфейсам, форумам и многим другим веб-ресурсам. Думаю, рядовым пользователям сети будет любопытно узнать, как работает это средство и насколько оно надёжно. Начинающим веб-мастерам будет интересно, как его подключить. А веб-программисты со стажем наверняка задавались вопросом, можно ли усилить защиту.
АЛЕКСЕЙ МИЧУРИН Basic Authorization под микроскопом За работу механизма так называемой базовой авторизации (далее просто BA – Basic Authorization) на стороне сервера отвечает не какое-то специфическое ПО, а сам сервер. Давайте рассмотрим диалог клиента и сервера при попытке получить доступ к конфиденциальной информации. Когда пользователь впервые пытается получить защищённый документ, щёлкнув мышкой по ссылке, по кнопке в форме или просто набрав URL, браузер (клиент) посылает на сервер самый обычный запрос. Это неудивительно – браузер пока не знает, что доступ к этому документу ограничен. Заголовки HTTP-запроса могут выглядеть приблизительно так:
HTTP/1.1 401 Authorization Required Date: Tue, 01 Mar 2005 11:30:10 GMT Server: Apache/1.3.33 (Unix) WWW-Authenticate: Basic realm="How about authorization?" Connection: close Content-Type: text/html; charset=iso-8859-1
Необычным в нём является статус (первая строка), который равен не 200, как при «нормальном» ответе, а 401. Также в нём имеется поле WWW-Authenticate, сообщающее браузеру детали: авторизация будет проходить по Basic-сценарию, пользователю рекомендуется сообщить указанную фразу. Вслед за этими заголовками передаётся тело документа, которое браузер пока не отображает, а выдаёт диалоговое окно с просьбой ввести имя и пароль.
GET / HTTP/1.1 Host: 127.0.0.1:8080 User-Agent: Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.7) Gecko/20041016 Firefox/0.9.3 Accept: text/xml,application/xml,application/xhtml+xml,text/html; q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5 Accept-Language: en-us,en;q=0.7,ru;q=0.3 Accept-Encoding: gzip,deflate Accept-Charset: KOI8-R,utf-8;q=0.7,*;q=0.7 Keep-Alive: 300 Connection: keep-alive
Но сервер возвращает не обычный ответ с кодом 200 (200 означает, что запрос обработан успешно, ответ отправлен), а сообщение о том, что для получения доступа требуется авторизоваться. Вот возможный набор заголовков ответа:
88
Если пользователь откажется от ввода пароля, нажав кнопку «Отмена», то браузер отображает тело полученного документа.
web Очень широко распространено заблуждение, что в ответ на отказ от ввода пароля (или после ввода неверного имени/пароля) сервер высылает документ с сообщением об ошибке 401. Это не так! Сервер высылает сообщение 401 всегда, когда запрашивает пароль. Когда пользователь нажимает «Отмена», браузер вообще не обращается к серверу1 – необходимый документ уже загружен, его осталось только показать пользователю. Если пользователь ввёл имя и пароль, то сразу после нажатия кнопки «ОК» браузер отправляет эту информацию на сервер в новом запросе, заголовок которого будет примерно таким: GET /paper/1.html HTTP/1.1 Host: localhost:8080 User-Agent: Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.7) Gecko/20041016 Firefox/0.9.3 Accept: text/xml,application/xml,application/xhtml+xml,text/html; q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5 Accept-Language: en-us,en;q=0.7,ru;q=0.3 Accept-Encoding: gzip,deflate Accept-Charset: KOI8-R,utf-8;q=0.7,*;q=0.7 Keep-Alive: 300 Connection: keep-alive Authorization: Basic MTox
Как видите, это снова обычный GET-запрос, но теперь сервер получил информацию о пароле и имени пользователя в строке Authorization. Секретная информация не защищена, а просто закодирована методом base64 (RFC 2045). Если декодировать строку MTox, то вы получите имя и пароль, разделённые двоеточием. То есть никакой секретностью тут и не пахнет. Если имя и пароль удовлетворят сервер, то пользователь получит требуемый документ. Набор заголовков ответа будет выглядеть как обычно: HTTP/1.1 200 OK Date: Tue, 01 Mar 2005 11:41:36 GMT Server: Apache/1.3.33 (Unix) Last-Modified: Tue, 01 Mar 2005 11:22:32 GMT ETag: "4e598b-33-42245078" Accept-Ranges: bytes Content-Length: 51 Connection: close Content-Type: text/html; charset=koi8-r
Если пара имя/пароль не верна, то сервер просто снова выдаст документ-запрос 401, повторно инициируя диалог браузера с пользователем. После первой авторизации браузер запоминает имя и пароль и сообщает серверу эту информацию при всех последующих обращениях. Сервер больше не будет обрабатывать ошибку 401, а от пользователя не потребуется повторного ввода пароля. Процесс авторизации прошёл успешно, но обратите внимание на то, что в результате не была открыта сессия. Иллюзию непрерывной сессии создаёт браузер, который фактически авторизуется при каждом запросе. К этому существенному недостатку BA мы ещё вернёмся. Кроме того, практически все современные браузеры оснащены менеджерами паролей и способны сохранять па1
2
роли на жёстком диске. Если ваш браузер запомнил ваш пароль неделю назад, то сегодня он может избавить вас и сервер от утомительной процедуры авторизации. Читатель, я думаю, осознаёт всю сомнительность такой «услуги» браузера, ведь всю неделю пароль был подвергнут серьёзной опасности.
Два слова о настройке Basic Authorization «Минусы» BA рассмотрим чуть позже, а сперва оценим главный её «плюс» – простоту настройки. Сегодня уже трудно найти host-провайдеров, у которых в списке предоставляемых возможностей не значилось бы «пароллирование директорий». Воспользоваться этой возможностью совсем несложно. Если вы захотели ограничить доступ к определённой директории (и всем вложенным в неё), достаточно разместить в ней файл .htacess примерно следующего содержания: AuthName "How about authorization?" AuthType Basic Require valid-user AuthUserFile /ïóòü/ê/ôàéëó/.htpasswd
или добавить подобные команды в имеющийся .htaccess. Смысл и назначение этих директив достаточно очевидны. AuthName задаёт строку, которую браузер должен показать пользователю при запросе имени и пароля. AuthType задаёт тип авторизации (Basic). Директива Require способна выполнять различные проверки легальности доступа Здесь вы видите её элементарное применение: мы потребовали, чтобы посетитель был зарегистрированным пользователем. Точнее, мы потребовали, чтобы посетитель получил доступ к файлам только в том случае, если он успешно прошёл процедуру авторизации. Директивой AuthUserFile указываем файл с паролями. Файл с паролями .htpasswd2 создаётся и дополняется утилитой htpasswd, входящей в дистрибутив Apache. Располагать его безопаснее вне дерева каталогов, доступных по HTTP. Я не сказал ещё про одну Auth-директиву – это AuthGroupFile. С её помощью можно задать файл, описывающий группы пользователей. К сожалению, информация о группе пользователя может быть использована только в директиве Require. Поэтому разбиение пользователей на группы практически ничем не расширяет возможности администратора и используется редко. Защитить паролем можно директорию и с HTML-документами, и с CGI-скриптами, и даже с графикой. Одним словом, абсолютно любую директорию, доступную через Web. Есть ещё одна инструкция, к которой мы сегодня обратимся, хотя она и не относится напрямую к авторизации. Если добавить в .htaccess строку: ErrorDocument 401 /ïóòü/äîêóìåíò_èëè_ñöåíàðèé
Строго говоря, браузер может обратиться к серверу за графикой и другими элементами, необходимыми для отображения страницы с сообщение 401. Совсем не обязательно называть его именно так.
№5, май 2005
89
web то указанный документ (или результат работы указанного сценария) будет высылаться с ответом 401. Пользователь, как вы помните, увидит этот документ, если откажется от авторизации3.
Уязвимости Basic Authorization Итак, BA страдает практически всеми возможными уязвимостями, какие только можно придумать.
Передача открытого пароля Как вы видели, пароль и имя пользователя передаются нешифрованными (base64-кодирование никак нельзя назвать защитой). Более того, секретная информация оснащена весьма броской «меткой» – текстом «Authorization», которую легко найти в общем потоке данных. Кроме того, если злоумышленник не смог вычленить из трафика пароли с первой попытки, то ему будут предоставлены новые и новые возможности, ведь имя и пароль передаётся при каждом запросе. Вам остаётся только надеяться, что ваш трафик никто не анализирует. К счастью, большинство пользователей Интернета не имеет возможности просмотра вашего трафика.
пытается ломать защиту, и вы просматриваете статистику каждый день. Если же в день ваш ресурс посещают сотни пользователей, а попытки взлома случаются раз в год, журналы (хуже! – лишь выжимки из них) вы просматриваете примерно с такой же периодичностью, то обнаружить злоумышленников довольно трудно. Кроме того, на многих хостингах у владельца нет возможности просматривать logфайлы или управлять их форматом. А используя CGI-сценарий, можно не только вести журнал, но и, скажем, формировать e-mail-сообщения администратору в «подозрительных» случаях. Вот простой пример CGI-сценария, написанного на shell. Он ведёт простой протокол, отмечая в журнале время и имя пользователя при каждой попытке авторизоваться. #!/bin/sh echo $REMOTE_ADDR ${REMOTE_USER:-nouser} `date` >>401.log cat <<'TEXT' Content-Type: text/html <html> <head><title>401</title></head> <body><h1>Auth. Req.</h1></body> </html> TEXT
Защита от перехвата Можно ли защититься от перехвата? Нет4! По крайней мере до тех пор, пока вы остаётесь в рамках протокола HTTP и механизма BA.
Возможность подбора пароля Как видите, BA не предоставляет никаких средств, ограничивающих количество неудачных попыток авторизоваться. То есть злоумышленник может сколько угодно подбирать пароль. Хуже всего то, что перебором может заняться любой пользователь Интернета. Конечно, не факт, что он отгадает ваш пароль, но, когда одновременно подбор ведёт множество «агентов», опасность взлома, как вы понимаете, умножается, даже если шансы каждого будут невелики.
Защита от подбора Этот недостаток можно частично скомпенсировать, и здесь нам поможет директива ErrorDocument. С её помощью можно назначить CGI-скрипт ответственным за обработку ошибки 401. Например: ErrorDocument 401 /cgi-bin/401.cgi
Самая простая мера, которую можно реализовать таким образом, – это ведение протокола автризаций. Журнал не избавит вас от атак, но вы хотя бы будете знать о них и об их источнике. А знание – сила. Конечно, вы можете возразить, что всю необходимую информацию можно собирать в log-файлы сервера. Это так. Пользуясь этими файлами, несложно обнаружить попытки подбора пароля, если у вас один посетитель в день, он один 3 4 5
90
Команда echo добавляет строку в журнал, а cat выдаёт на стандартный вывод минимальный заголовок и тело HTTPответа. Этот элементарный пример я привёл здесь не столько, чтобы обогатить человечество ещё одним полезным CGIсценарием, сколько для того, чтобы обсудить два важных аспекта. Во-первых, обратите внимание на использование переменной REMOTE_USER. Если эта переменная определена, то конструкция ${REMOTE_USER:-nouser} эквивалентна значению $REMOTE_USER, в противном случае вся конструкция эквивалентна строке «nouser» (о работе с переменными в shell см. man 1 sh). При первом обращении клиента к серверу, когда Authorization-информация ещё не передаётся браузером, переменная REMOTE_USER не будет определена. Но если пользователь ввёл неверные данные – попытка авторизации была, но потерпела неудачу – то наш сценарий будет вызван повторно, а в переменной REMOTE_USER будет находиться имя, под которым пользователь пытался авторизоваться (даже если учётной записи для такого пользователя вовсе не существует). Это, кстати, делает возможным определить причину ошибки 401 и разделить случаи, когда пользователь пытается войти в систему впервые и когда он делает повторную попытку5. Таким образом, наш простой пример заносит в протокол не только информацию о попытках авторизоваться, но и имена, под которыми не удалось авторизоваться. Это позволяет легко заметить, что кто-то занимается перебо-
Или, если его браузер не поддерживает авторизацию, что практически невероятно. Строго говоря, вы можете защитить пароль, реализовав обмен по протоколу SSL и, защитив всю передаваемую информацию. Конечно, это справедливо, даже если на стороне клиента используется не обычный браузер, а некое специальное средство для взлома, имитирующее работу браузера.
web ром. Если пользователь успешно авторизовался с первого раза, то в протоколе останется только запись о «nouser». В «боевых условиях» такие записи не представляют большой ценности, но при отладке они могут быть весьма полезны. Во-вторых (и это, конечно, недоработка), обратите внимание на то, что мы в сценарии не проанализировали причину его вызова. Кроме того, мы не позаботились о статусе, который возвращает наш сценарий. Если скрипт будет вызван в результате действия нашей директивы ErrorDocument, то код ответа сохранится без изменений – 401. Но никто не мешает запустить этот сценарий не как обработчик ошибки, а напрямую, просто по его непосредственному адресу (например, http://host/cgi-bin/401.cgi). Тогда клиенту будет возвращён тот же документ с обычным кодом 200. Обратите внимание, тот же сценарий, что возвращал ошибку-запрос с кодом 401, теперь вернул код 200. Это произошло потому, что сам сценарий никак не влияет на возвращаемый код, и сервер выставляет код ответа на своё усмотрение. Такие вызовы будут ошибочно зарегистрированы в протоколе. Конечно, в реальных условиях наш сценарий должен был бы проанализировать обстоятельства вызова. При первом обращении, без сообщения Authorization-информации, скрипт получает в своё распоряжение обычный набор REDIRECT-переменных: REDIRECT_REQUEST_METHOD, REDIRECT_STATUS, REDIRECT_URL, говорящие о том, что скрипт вызван не напрямую. При повторном вызове, в случае провала предыдущей попытки авторизоваться, скрипт получает вдобавок к упомянутым ещё две переменные: AUTH_TYPE, которая, конечно, равна «Basic», и REMOTE_ USER с именем «неудачника». При простом, непосредственном, вызове сценария все перечисленные переменные просто не будут созданы. Приведу пример shell-скрипта, анализирующего эти ситуации: #!/bin/sh if [ ${REDIRECT_STATUS:-)} = 401 ] then echo $REMOTE_ADDR ${REMOTE_USER:-nouser} `date` >>401.log if [ ${REMOTE_USER:-D} != D ] then mess='×òî-òî âû çà÷àñòèëè íåóäà÷íî àâòîðèçîâàòüñÿ!' else mess='Îøèáêà! (ïåðâàÿ)' fi else mess='Òàê ýòîò ñêðèïò âûçûâàòü íåëüçÿ' fi echo "Content-Type: text/html <html> <head><title>$mess</title></head> <body><h1>$mess</h1></body> </html>"
Как видите, теперь мы различаем три случая:
! первая попытка авторизоваться; ! не первая попытка авторизоваться; ! вызов скрипта напрямую, вернее, вызов не для обработки ошибки 401. Но давайте не будем увлекаться. Подобные проверки необходимы, забывать про них нельзя, но они элементарно
№5, май 2005
организуются на любом языке программирования и не заслуживают пристального внимания. Во всех последующих примерах я, для компактности, не буду их делать, предполагая, что вы при необходимости добавите соответствующий код. Приводя соображения о возможности подмены статуса, я хотел подвести вас к следующему вопросу: что произойдёт, если обработчик ошибки 401 вернёт не код 401? Вот пример такого обработчика: #!/bin/sh cat <<'TEXT' Status: 200 Content-Type: text/html <html> <head><title></title></head> <body><h1>âû íå àâòîðèçîâàëèñü è íå àâòîðèçóåòåñü</h1></body> </html> TEXT
Озадачены? В общем-то, не произойдёт ничего неожиданного. Давайте проследим всю цепочку событий. Когда неавторизованный пользователь обратится к серверу, произойдёт ошибка 401. Следуя инструкции ErrorDocument, сервер вызовет наш сценарий, который подменит код 401 на код 200 и выдаст обычный документ. Браузер получит его и отобразит, оставаясь в полном неведении, что произошло на самом деле на сервере. Пользователю не удастся получить доступ к засекреченной области, но и диалога для ввода пароля он не получит. Обращаясь к любому документу, пользователь будет получать только результат работы вашего скрипта (который в свою очередь тоже может организовать перенаправление). Мы заблокировали для пользователя возможность авторизации. Этот короткий скрипт может пока послужить только для весьма сомнительной защиты. Использовать его можно только как-нибудь так: сперва защитить директорию; потом авторизоваться, указав браузеру запомнить имя и пароль; и подключить в качестве обработчика ошибки 401 наш скрипт. Всё! Больше диалога для ввода пароля никто не увидит, и только вы сможете пользоваться ресурсом, так как вам вводить имя и пароль больше не потребуется (пока ваш браузер их помнит). Такой подход хоть и имеет право на существование, но смотрится диковато. Тем более что правильнее было бы сказать не «вы имеете доступ к ресурсу», а «любой человек, воспользовавшийся вашим «заговорённым» браузером, имеет доступ к ресурсу». Это, как вы понимаете, не одно и то же. Тем не менее все высказанные идеи можно объединить и развить, придав им более «товарный вид». Следующий сценарий также является обработчиком ошибки 401. Он разрешает авторизацию не чаще, чем раз в десять секунд. Он уже написан на Perl, и является гибридом двух предыдущих shell-скриптов. #!/usr/bin/perl use strict; my $LOGFILE='401.log'; my $lastlog = $^T-(stat $LOGFILE)[9]; if ($lastlog > 10) {
91
web my $log=$ENV{'REMOTE_ADDR'}. ($ENV{'REMOTE_USER'} or 'nouser'). localtime($^T)."\n"; $log.=join('', map {" $_ $ENV{$_}\n"} sort keys %ENV); open F, '>>'.$LOGFILE or die; print F $log; close F; # Ýòîò äîêóìåíò áóäåò âûñëàí åù¸ äî òîãî, # êàê ïîëüçîâàòåëü ââ¸ë ïàðîëü! print <<'TEXT'; Content-Type: text/html <html> <head><title>Äîêóìåíò 401</title></head> <body><h1>Äîñòóï çàêðûò</h1> <p>Ìîæíî áûëî àâòîðèçîâàòüñÿ, íî âû äîïóñòèëè îøèáêó ïðè íàáîðå ïàðîëÿ èëè èìåíè. Òåïåðü ðåãèñòðàöèÿ çàáëîêèðîâàíà íà 10 ñåêóíä.</p></body> </html> TEXT } else { # ýòîò äîêóìåíò ïîëüçîâàòåëü óâèäèò: # - è åñëè íå âîâðåìÿ ïðèø¸ë # - è åñëè ââ¸ë íåïðàâèëüíûé ïàðîëü # àíàëèçèðóéòå $REMOTE_USER äëÿ ðàçäåëåíèÿ ýòèõ ñèòóàöèé print <<'TEXT'; Status: 200 Content-Type: text/html <html> <head><title>Äîêóìåíò 200</title></head> <body><h1>Äîñòóï âîîáùå çàêðûò</h1> <p>Âû íå ìîæåòå àâòîðèçîâàòüñÿ âîîáùå. Ïîäîæäèòå 10 ñåêóíä.</p> </body> </html> TEXT }
Как видите, этот сценарий тоже ведёт протокол. По дате последней модификации log-файла мы определяем, давно ли была последняя попытка авторизоваться6. Если последняя попытка была более десяти секунд назад, то в протокол заносится ещё одна запись, а пользователю выдаётся документ с кодом 401. То есть мы даём пользователю возможность вести имя и пароль. Если последняя авторизация была менее десяти секунд назад, то клиенту выдаётся код 200. Вы, наверно, уже заметили, что у нашего сценария есть большой изъян. (Не говоря о том, что он не выполняет проверку причины запуска.) После того, как авторизовался один пользователь, на десять секунд право авторизации теряет и он, и все остальные пользователи. Избавиться от этого гораздо труднее, чем может показаться на первый взгляд, потому что нам приходится принимать решение о допустимости авторизации ещё до того, как мы получим имя пользователя. И, напротив, после того, как сервер получил имя пользователя, наш скрипт запускаться уже не будет (если имя и пароль верны). Использовать в этой ситуации IP-адреса или cookie не только ненадёжно, но и сложно. Ненадёжно потому, что разные пользователи могут приходить c одного IP-адреса, а cookie могут быть отключены (что, конечно, можно проверить, но только ценой дополнительных усложнений) или, хуже того, фальсифицированы. А сложно потому, что обрабатывать эти адреса и cookie должно нечто, не связанное с обработкой ошибки 401, нечто, работающее с уже авторизованным пользователем. То есть вам придётся самостоятельно реализовать скрипт, модуль сервера, или 6
92
иное средство, выдающее ответы 200 и сами документы. Но тогда это ваше средство должно проверять, авторизовался ли пользователь. Как видите, мы пришли к тому, что вам придётся реализовать всю (или практически всю) функциональность сервера. Но если платить такую цену, то не за базовую же авторизацию. Тогда уж лучше сделать чтонибудь понадёжнее. К счастью, во многих случаях у ресурса есть только один администратор (пользователь). Тогда указанная некорректность не играет роли. Но это ещё не беда. Настоящая проблема состоит в том, что выдача кода 200 – это, на самом деле, не совсем блокировка авторизации. Мы просто лишаем пользователя возможности ввести имя и пароль. Злоумышленник по-прежнему сможет практически беспрепятственно перебирать пароли, создавая запросы искусственно (не с помощью браузера) и варьируя информацию в поле Authorization. Конечно, ответы нашего сервера (особенно с кодом 200) могут сильно затруднить работу супостата, но вряд ли мы сможем поставить врагу действительно существенный заслон. Мы снова получили защиту от честных людей, хотя и усовершенствованную.
Невозможность «разлогиниться» Разработчик веб-ресурса никак не может заставить браузер забыть пароль и имя пользователя. За этим стоит тоже сама природа протокола HTTP: сервер не может заставить клиента выполнить какие-то действия. Сервер может только рекомендовать, но для BA и такой возможности не предусмотрено. Может показаться, что существуют возможности заставить браузер забыть пароль или заменить его на новый, неправильный. Например, можно выслать ещё раз ответ 401, созданный искусственно, и дать пользователю возможность ввести что угодно, заставив браузер «забыть» подлинную информацию. Но ни к чему хорошему это не приведёт. Если пользователь уже авторизовался, то на любой ответ 401 браузер не обращается к пользователю и не пытается изменить пароль, а просто повторяет запрос, высылая прежние имя и пароль.
Резюме Надеюсь, что теперь вам будет легче взвесить все «за» и «против», когда в следующий раз доведётся оценивать безопасность того или иного решения. Вы видите, что, несмотря на возможность многих косметических улучшений, фактически, ни одно из слабых мест BA закрыть не удаётся в принципе. Однако, принимая окончательное решение, будьте снисходительны. Помните, что BA – проверенный и надёжный (в известном смысле) механизм. Кроме того, его настройка очень проста. Не факт, что созданный вами собственный аппарат защиты не будет обладать изъянами, невзирая на все труды, которые придётся в него вложить. Одним словом, я назвал здесь много «против», но не забывайте и про «за» – простоту и безотказность. Два эти довода способны перевесить все «против», что подтверждается повсеместным использованием BA, невзирая ни на что.
Конечно, это далеко не лучший способ; здесь он используется только благодаря своей предельной простоте.
книжная полка Windows server. Трюки Митч Таллоч Перед вами перевод книги издательства O'Reilly «Windows server hacks». Материал изложен в небольших статьях, объединенных в тематические группы. Основные темы книги: общее администрирование, Acvtive Directory, управление пользователями, сетевые службы файлы и принтеры, ISS, установка системы, безопасность, управление обновлениями, резервное копирование и восстановление. После прочтения книги вы сможете эффективно иcпользовать AD для упрощения своей работы, управлять сетевыми ресурсами и такими службами, как DHCP, DNS, WINS. А также удаленно развертывать ОС на компьютерах в рамках локальной сети с помощью RIS и Sysrep, результативно использовать ASR для создания резервных копий и восстановления всей системы. Кроме этого в книге описаны методы упрощения повседневной работы администратора при помощи сценариев и средств автоматизации. Книгу можно порекомендовать администраторам Windows. Издательство «Питер», 2005 г. – 318 стр. ISBN5-469-00288-8 (ориг. ISBN 0-596-00647-0).
Sendmail. Настройка и оптимизация Ник Кристенсон Эпиграфом к книге может послужить фраза, сказанная Эриком Оллманом (создателем Sendmail): «Эта книга великолепна». В издании рассмотрен широкий круг вопросов: введение в программу sendmail, настройка режимов ретрансляции почты (описаны вопросы синхронизации, файловых систем, пространства на дисках), приема электронной почты (системы дисковых запоминающих устройств и накопителей, особенности протоколов pop и imap) и рассылки электронной почты (создание списков рассылки, управление очередями). Вы также узнаете о методах поиска и устранения «узких» мест в системе, формировании потока сообщений и тестировании. Не остались без внимания вопросы безопасности и архитектуры программы. Книгу, несомненно, можно посоветовать всем без исключения людям, занимающимся администрированием почтового сервера на базе sendmail. Главной ценностью изложенного материала является то, что это не просто информация в стиле HOWTO, а скорее «житейские» заметки и выводы, сделанные из личного опыта автора. Издательство «КУДИЦ-ОБРАЗ», 2004 г. – 272 стр. ISBN 5-93378-093-6 (ориг. 0-321-11570-8).
№5, май 2005
Qt профессиональное программирование на C++ Макс Шлее Книга является подробнейшим руководством к кроссплатформенной библиотеке Qt. В ней автор показывает, что с помощью Qt можно создавать как графические интерфейсы, так и писать достаточно сложные программы. Подробно рассмотрены вопросы программирования графики (растровые изображения, анимация, шрифты, OpenGL), звука, таймера, многопоточности, XML. Отдельные главы посвящены написанию приложений для баз данных и сетей. И, конечно же, рассматриваются вопросы создания различных интерфейсов. Затронут вопрос разработки собственных элементов управления. Книгу можно порекомендовать широкому кругу читателей – повествование начинается с азов (с «Hello, world!»), поэтому даже «новички» смогут быстро освоиться. Большое количество примеров поможет наилучшим образом усвоить материал. На прилагаемом диске вы найдете исходные коды примеров из книги и библиотеку Qt для ОС Windows и Linux. Издательство «БХВ-Петербург», 2005 г. – 544 стр. ISBN 5-94157-566-1.
Apache Tomcat для профессионалов Амит Бакор и др. Коллектив специалистов из 9 человек написал эту книгу для профессионалов, работающих с Javaвеб-приложениями. В ней приведены сведения о веб-сервере Tomcat (версии 3.x и 4.x) – установка, конфигурирование, архитектура, вопросы, связанные с безопасностью. Рассмотрены различные коннекторы веб-сервера (WARP, AJP), которые служат для интеграции Tomcat с Apache, рассказано, каким образом организовать подключения к базам данных через JDBC. Отдельные главы посвящены созданию массового виртуального хостинга при помощи Tomcat, тестированию и распределению нагрузки сервера. Также вы узнаете об автоматической компоновке веб-приложений при помощи Ant, научитесь профессионально вести журнал, используя для этого Log4J. Изложение материала сопровождается большим количеством примеров. Книга рассчитана на специалистов, знакомых с Java, имеющих представление о базах данных, XML, HTML. Издательство «КУДИЦ-ОБРАЗ», 2005 г. – 544 стр. ISBN 5-9579-0075-3 (ориг. 1-86100-773-6).
Рубрику ведет Александр Байрак
93
bugtraq Выполнение произвольных команд в Open WebMail
Повышение привилегий и отключение аудита в Oracle
Программа: Open WebMail версии до 2.51 20050430 Опасность: Низкая. Описание: Уязвимость существует при обработке входных данных в некоторых параметрах, которые передаются функции Perl open(). Удаленный пользователь может с помощью специально сформированного значения выполнить произвольные команды на целевой системе с привилегиями пользователя. URL производителей: www.openwebmail.org. Решение: Установите обновление от производителя.
Программа: Oracle Database 9i/10g. Опасность: Низкая. Описание: Уязвимость позволяет удаленному авторизованному пользователю повысить свои привилегии в СУБД и отключить Fine-Grained-Auditing для всех пользователей. 1. Уязвимость связана с тем, что Fine-Grained-Auditing не работает, когда пользователь SYS делает запрос SELECT. 2. После выполнения dbms_scheduler-job Oracle использует пользователя SYS в качестве SESSION_USER, что может позволить злоумышленнику повысить свои привилегии в VPD (Virtual Private Database) и OLS (Oracle Label Security).
Повышение привилегий и отказ в обслуживании в IBM HTTP Server Программа: IBM HTTP Server 1.3.26.x. Опасность: Низкая. Описание: Переполнение буфера существует в модуле mod_include при обработке длины тегов в SSI-документах. Локальный пользователь может создать специальным образом SSI-документ и вызвать отказ в обслуживании или выполнить произвольный код с повышенными привилегиями на системе. URL производителей: www-1.ibm.com. Решение: Установите исправление от производителя.
SQL-инъекция и межсайтовый скриптинг в PunBB Программа: PunBB 1.2.4 и более ранние версии. Опасность: Средняя. Описание: Уязвимость существует при обработке входных данных при изменении e-mail пользователя. Удаленный пользователь может выполнить произвольные SQL-команды на уязвимой системе. Межсайтовый скриптинг возможен из-за недостаточной фильтрации входных данных в некоторых сообщениях. Удаленный пользователь может с помощью специально сформированного сообщения выполнить произвольный HTMLсценарий в браузере жертвы в контексте безопасности уязвимого сайта. Пример/Эксплоит: www.securitylab.ru/53935.html. URL производителя: www.punbb.org. Решение: Установите последнюю версию (1.2.5) с сайта производителя.
Обход ограничений безопасности в libsafe Программа: libsafe 2.0.16. Опасность: Средняя. Описание: Уязвимость существует в функции _libsafe_stackVariableP() в многопотоковых приложениях. Злоумышленник может обойти ограничения фильтрации libsafe и перезаписать данные в стеке. URL производителя: http://www.research.avayalabs.com/ project/libsafe. Решение: Способов устранения уязвимости не существует в настоящее время.
URL производителей: www.oracle.com. Решение: Установите обновление от производителя.
Повышение привилегий в ядре Linux при обработке дескрипторов pktcdvd и rawdevice ioctl Программа: Linux kernel 2.6 – 2.6.12-rc4. Опасность: Низкая. Описание: Уязвимость обнаружена в файле drivers/block/ pktcdvd.c из-за некорректной обработки некоторых входных данных в дескрипторах блочных устройств rawdevice и pktcdvd. Локальный пользователь может с помощью специально сформированного параметра обойти ограничения страницы пользовательского пространства (user space limit), перезаписать данные ядра и вызвать отказ в обслуживании или выполнить произвольный код на целевой системе. Пример/Эксплоит: http://www.securitylab.ru/54690.html. URL производителей: www.kernel.org. Решение: Способов устранения уязвимости не существует в настоящее время.
SQL-инъекция и межсайтовый скриптинг в Invision Power Board Программа: Invision Power Board 2.0.3 и более ранние версии. Опасность: Средняя. Описание: SQL-инъекция существует из-за недостаточной обработки данных в сценарии sources/login.php. Удаленный пользователь может с помощью специально сформированного файла куки выполнить произвольные SQL-команды в базе данных приложения при выключенных Magic_quotes_ gpc в конфигурационном файле php. Отсутствует проверка входных данных при отображении результатов поиска в параметре highlite сценария sources/topics.php. Удаленный пользователь может с помощью специально сформированного файла куки выполнить произвольный HTML-сценарий в браузере жертвы в контексте безопасности уязвимого сайта. URL производителей: http://invisionpower.com. Решение: Установите исправление от производителя.
Составил Александр Антипов
94
подписка на II полугодие 2005 Российская Федерация ! Подписной индекс: 81655
Каталог агентства «Роспечать»
!
Объединенный каталог «Пресса России» Адресный каталог «Подписка за рабочим столом» Адресный каталог «Библиотечный каталог» Альтернативные подписные агентства: Агентство «Интер-Почта» (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
!
! Подписной индекс: 87836
!
!
! Казахстан
!
! !
СНГ В странах СНГ подписка принимается в почтовых отделениях по национальным каталогам или по списку номенклатуры АРЗИ: ! Азербайджан – по объединенному каталогу российских изданий через предприятие по распространению печати «Гасид» (370102, г. Баку, ул. Джавадхана, 21)
!
– по каталогу «Российская Пресса» через ОАО «Казпочта» и ЗАО «Евразия пресс» Беларусь – по каталогу изданий стран СНГ через РГО «Белпочта» (220050, г.Минск, пр-т Ф.Скорины, 10) Узбекистан – по каталогу «Davriy nashrlar» российские издания через агентство по распространению печати «Davriy nashrlar» (7000029, Ташкент, пл.Мустакиллик, 5/3, офис 33) Армения – по списку номенклатуры «АРЗИ» через ГЗАО «Армпечать» (375005, г.Ереван, пл.Сасунци Давида, д.2) и ЗАО «Контакт-Мамул» (375002, г. Ереван, ул.Сарьяна, 22) Грузия – по списку номенклатуры «АРЗИ» через АО «Сакпресса» ( 380019, г.Тбилиси, ул.Хошараульская, 29) и АО «Мацне» (380060, г.Тбилиси, пр-т Гамсахурдия, 42) Молдавия – по каталогу через ГП «Пошта Молдавей» (МД-2012, г.Кишинев, бул.Штефан чел Маре, 134) по списку через ГУП «Почта Приднестровья» (МD-3300, г.Тирасполь, ул.Ленина, 17) по прайслисту через ООО Агентство «Editil Periodice» (2012, г.Кишинев, бул. Штефан чел Маре, 134) Подписка для Украины: Киевский главпочтамп Подписное агентство «KSS» Телефон/факс (044)464-0220
Подписные индексы:
81655 по каталогу агентства «Роспечать»
87836 по каталогу агентства «Пресса России»
№5, май 2005
95
СИСТЕМНЫЙ АДМИНИСТРАТОР №5(30), Май, 2005 год РЕДАКЦИЯ Исполнительный директор Владимир Положевец Ответственный секретарь Наталья Хвостова sekretar@samag.ru Технический редактор Владимир Лукин Редакторы Андрей Бешков Валентин Синицын Алексей Барабанов Михаил Платов РЕКЛАМНАЯ СЛУЖБА тел./факс: (095) 928-8253 Константин Меделян reсlama@samag.ru Верстка и оформление maker_up@samag.ru Дизайн обложки Николай Петрочук По вопросам распространения обращайтесь по телефону: (095) 928-8253 (доб. 120)
ЧИТАЙТЕ В СЛЕДУЮЩЕМ НОМЕРЕ: Asterisk и Linux: миссия IP-телефония В прошлый раз мы познакомились с теоретическими основами IP-телефонии. Теперь самое время заняться вещами более «приземленными», а именно – практическим изучением возможностей одного из cамых популярных Open Source продуктов IP-телефонии – Asterisk PBX. Мы рассмотрим архитектуру системы, основные файлы конфигурации и несколько полезных примеров определения номерного плана. В процессе изучения преимущественно будут использоваться Open Source и Freeware программные продукты.
Взлом без проводов
РУКОВОДИТЕЛЬ ПРОЕКТА Петр Положевец УЧРЕДИТЕЛИ Владимир Положевец Александр Михалев ИЗДАТЕЛЬ ЗАО «Издательский дом «Учительская газета»
Беспроводные сети активно проникают в нашу жизнь, принося с собой не только удобство, но и проблемы безопасности. Интенсивность взломов растет с каждым днем, но технические подробности остаются за кадром и не разглашаются. Хотите знать, как хакеры проникают в беспроводные сети и как этому противостоять? Главным образом мы будем говорить о семействе протоколов IEEE 802.11b/g (более известном как WLAN). Статья ориентирована на кодокопателей, имеющих опыт программирования в LINUX и умеющих держать паяльник в руках.
Отпечатано типографией ГП «Московская Типография №13» Тираж 8400 экз.
Системный администратор – ищем дополнительные источники дохода
107045, г. Москва, Ананьевский переулок, дом 4/2 стр. 1 тел./факс: (095) 928-8253 Сайт журнала: www.samag.ru
Журнал зарегистрирован в Министерстве РФ по делам печати, телерадиовещания и средств массовых коммуникаций (свидетельство ПИ № 77-12542 от 24 апреля 2002 г.) За содержание статьи ответственность несет автор. За содержание рекламного обьявления ответственность несет рекламодатель. Все права на опубликованные материалы защищены.
96
Ваша сеть отлажена и работает как швейцарские часы. У вас появилось
свободное время и желание зарабатывать больше. Однако смена работы в ближайшие планы не входит, а работодатель не в состоянии увеличить зарплату. Лучший вариант в этой ситуации – искать дополнительные источники дохода. Как найти еще одну работу по специальности со свободным графиком? Как результативно провести переговоры с потенциальным заказчиком? Как достичь того, чтобы работодатели находили вас сами? Своим практическим опытом делится автор статьи.
Используем пакет ImageMagick в веб-разработке Работа с готовыми изображениями – задача достаточно распространенная в веб-программировании. Построение обычной веб-галереи требует создания уменьшенных копий картинок, компрессии, конвертации формата, возможно, и некоторых других действий по их обработке. Для подобных задач широко применяется библиотека GD, имеющая в арсенале своей второй версии GD2 довольно внушительный список функций. Она имеет широкие возможности, но качество результирующих изображений часто оставляет желать лучшего. Кроме того, с такими задачами, как изменение пропорций, «обрезка» изображения, манипуляции с цветами, вставка другого рисунка, работать хоть и возможно, но крайне неудобно. Для подобных действий идеально подходит пакет ImageMagick.
Уважаемые читатели! Спешите оформить подписку на второе полугодие 2005 года! Приобрести новые и старые номера журнала вы можете через интернет-магазины LinuxCenter.ru и Allsoft.ru. Доставка почтой в любую точку России.