Вы находитесь на странице: 1из 98

№5(30) май 2005

подписной индекс 81655


www.samag.ru

Почему MS SQL медленно работает?


Ищем причины
Строим защищенную беспроводную сеть:
WPA-Enterprise, 802.1x EAP-TLS
Настраиваем UPS под Linux
Как восстановить
удаленные файлы под BSD
Что важно знать об IP-телефонии
Устанавливаем Symantec Antivirus 9.0
в корпоративной сети
Эффективно управляем
полями пользователей в AD
Контролируем безопасность сети
с помощью OSSIM
Интервью с Ларри Уоллом –
№5(30) май 2005

создателем языка Perl


оглавление
2 РЕПОРТАЖ 48 Система вещания на основе
Windows Media Services 9. Часть 2
ИНТЕРВЬЮ Создаем маленькую радиостанцию и настраивам «жи-
вое» вещание с веб-камер.
4 Историческая неизбежность победы Михаил Платов
движения отрытого кода platov@cs.vsu.ru
Интервью с Джоном Холлом - одним из основателей
движения Open Source. 54 Автоматизация MS Windows, или AutoIt
Андрей Бешков как мечта эникейщика. Часть 2
tigrisha@sysadmins.ru Применение AutoIt для решения практических задач
администрирования.
6 Ларри Уолл: «Сегодня Perl применяется Алексей Барабанов
для решения ряда проблем, о которых alekseybb@mail.ru
я и не подозревал, создавая этот язык»
Интервью с создателем языка программирования Perl. 59 Эффективно управляем
Андрей Бешков полями пользователей в AD
tigrisha@sysadmins.ru Создаем сценарий автоматического внесения измене-
ний в свойства объектов AD.
8 ТЕНДЕНЦИИ Иван Коробко
ikorobko@prosv.ru
АДМИНИСТРИРОВАНИЕ
СЕТИ
12 FreeBSD tips: использование syslog
Понимание механизма работы syslog позволит вам эф- 64 Строим защищённую беспроводную сеть:
фективно управлять протоколированием системной ин- WPA-Enterprise, 802.1x EAP-TLS
формации. Практическое руководство.
Сергей Супрунов Андрей Платонов
amsand@rambler.ru Platonov@tayle.com

16 Крепкий орешек NUT БЕЗОПАСНОСТЬ


Настраиваем источник бесперебойного питания под Linux
с помощью Network UPS Tools. 72 Устанавливаем Symantec Antivirus 9.0
Валентин Синицын в корпоративной сети
val@linuxcenter.ru Конфигурирование одного из самых популярных анти-
вирусных продуктов корпоративного уровня – не совсем
20 Что важно знать об IP-телефонии тривиальный процесс. Поэтому будет полезно ознако-
Изучаем основные протоколы, кодеки и интерфейсы миться с его подробным описанием.
шлюзов IP-телефонии. Роман Марков
Михаил Платов stepan-razin@newmail.ru
platov@cs.vsu.ru
78 Контролируем безопасность сети
26 Alt-N MDaemon – почтовая система с помощью OSSIM
для средних и крупных компаний. Для полноценной защиты сети уже недостаточно танде-
Часть 2 ма firewall + IDS. Для всестороннего контроля необходи-
Почтовый сервер установлен и сделаны первоначаль- мо задействовать разные инструменты. Интеграция раз-
ные настройки. Переходим к дальнейшему конфигури- личных компонетов – основная задача проекта OSSIM.
рованию системы. Сергей Яремчук
Роман Марков grinder@ua.fm
stepan-razin@newmail.ru
ОБРАЗОВАНИЕ
32 Восстанавливаем удаленные файлы
под BSD 86 Свободная информационная система
Осваиваем структуру файловой системы UFS и мето- для школ Centre
дику ручного восстановления удаленных файлов. Приложение Centre позволит автоматизировать рутин-
Крис Касперски ные задачи по учету персональных данных учащихся.
kk@sendmail.ru Сергей Яремчук
grinder@ua.fm
38 Реинкарнация данных II: memo-поля
Как перенести данные из таблиц формата DBF в WEB
PostgreSQL? Несколько способов решения этой задачи
мы предложили в первой части статьи. Отдельного вни- 88 Базовая HTTP-авторизация –
мания заслуживает вопрос работы с полями типа memo. защита от честных людей
Сергей Супрунов Как работает механизм базовой авторизации и насколь-
amsand@rambler.ru ко он надёжен? Как его подключить? Можно ли усилить
защиту?
40 Почему MS SQL медленно работает? Алексей Мичурин
Ищем причины alexey@office-a.mtu-net.ru
Порой скорость работы этой базы данных падает без
видимых причин. Что же случилось? 93 КНИЖНАЯ ПОЛКА
Юлия Шабунио
yshabunio@eastwind.ru 31, 94 BUGTRAQ
№5, май 2005 1
репортаж

ИТОГИ КОНФЕРЕНЦИИ
OPEN SOURCE FORUM RUSSIA 2005
С 27 по 29 апреля в «Рэдиссон Славянская» прошла выставка и конференция
Open Source Forum 2005. Это первое в России мероприятие такого масштаба,
посвященное движению отрытого исходного кода.

ервый день назывался Open Standarts Day и был за- C самого утра по выставочным залам стали расхажи-
нят циклом докладов специалистов организации вать большие императорские пингвины, а перед началом
OASIS (Organization for the Advancement of Structured выступлений на сцене, отгоняя злых духов, танцевали с
Information Standards). Большинство выступающих акцен- бубном шаманы. Эти милые сердцу каждого админа пер-
тировало внимание слушателей на проблемах внедрения сонажи вызывали улыбки у посетителей.
открытых стандартов в ИТ индустрии. С вступительным
словом выступил коммерческий директор компании
UnitSpace Александр Гершойг. Он прояснил слушателям
различия между открытым кодом и открытыми стандарта-
ми. Открытость стандартов априори предполагает, что все
данные между сервисами будут передаваться в XML-фор-
мате. Все доклады тем или иным образом были связаны с
сервис-ориентированной архитектурой предприятия, под-
ходами к ее реализации и роли отрытых стандартов в обес-
печении безопасной взаимной совместимости платформ от
разных поставщиков. Отдельного упоминания стоят доволь-
но интересные презентации директора по стратегии разви-
тия и архитектуре Oracle Application Server Suite Вадима
Розенберга, рассказавшего о новом языке BPEL. Также лю-
бопытные мысли о методах безопасной интеграции SOA
прозвучали в речи директора по информационной безопас-
ности Microsoft в России и СНГ Владимира Мамыкина. Сто- Ôèííî-óãîðñêèå øàìàíû îòãîíÿþò çëûõ äóõîâ
ит отметить, что практически все ораторы тем или иным Первое пленарное заседание открыл президент ассо-
образом озвучили важность постепенного и безопасного циации «Руссофт» Валентин Макаров. В своей речи он упо-
внедрения открытых стандартов. Но к вечеру слушатели на- мянул, что в мероприятиях форума участвуют более 30 из-
чали засыпать – осветить столь объемную тему за один день вестнейших специалистов в области опенсорс, среди кото-
было не под силу даже столь блестящим специалистам. рых и создатель языка Perl Ларри Уолл.
Параллельно с этим в других залах шел монтаж стен- Кроме этого на форуме от лица Правительства Российс-
дов выставочного зала и Linux City. кой Федерации выступали Владимир Матюхин – руководи-
28 апреля началась регистрация для посетителей выс- тель Федерального агентства по информационным техно-
тавки и состоялось торжественное открытие форума. логиям, Церен Церенов – заместитель директора Департа-
мента корпоративного управления и новой экономики Ми-
нистерства экономического развития и торговли РФ. Пред-
ставители министерств рассказали о том, почему государ-
ственные структуры поддерживают Форум по открытому
коду, как используются программы в открытых кодах для
нужд государства и каковы перспективы их дальнейшего
внедрения в государственное управление.
Затем на сцену вышел один из выдающихся ораторов и
идеологов движения Джон Холл более известный как
maddog (интервью с ним читайте на 4 cтр.).
Доклад Джона по праву может считаться жемчужиной
форума, в нем гуру Open Source аргументированно дока-
зал, что закрытое программное обеспечение мешает рос-
ту местного рынка ПО, связывает пользователей по рукам
и ногам. Проприетарное ПО подобно черному ящику: неиз-
вестно как оно работает и ничего нельзя изменить. К тому
Ïåðâûå ïîñåòèòåëè âûñòàâêè же, с ростом корпораций, производящих закрытое ПО, уро-

2
репортаж
ладов аудитория то увеличивалась почти до сотни человек,
то вновь уменьшалась до десятка – другого слушателей.
Но самым красноречивым отражением экспансии откры-
того кода, конечно же, стал Linux City со стендами решений
на основе Linux. Среди этого мини-городка большего всего
бросались в глаза кассовые аппараты, кинотеатр, банк, ар-
битражный суд, рабочее место бухгалтера, созданное на
основе Wine и 1С.

Êîíôåðåíöèÿ ñîáðàëà áîëüøîå ÷èñëî ó÷àñòíèêîâ


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

Linux City – ìîäåëü èíôðàñòðóêòóðû ãîðîäà, óïðàâëÿåìîãî ÏÎ


ñ îòêðûòûì êîäîì
Некоторые организационные моменты прошедшего дей-
ства оставили желать лучшего. Неудобные бейджики – на
них мы видели в первую очередь логотипы спонсоров, а в
имена участников приходилось вглядываться. К сожалению
не все слушатели смогли насладиться докладами в полной
мере – синхронный перевод оставлял желать лучшего.
Несмотря на это, три дня выставки пролетели как один
час. Было весьма интересно пообщаться с таким большим
количеством компетентных специалистов.
Äæîí Õîëë ðàññêàçûâàåò î íåèçáåæíîì âûìèðàíèè çàêðûòîãî
ïðîãðàììíîãî îáåñïå÷åíèÿ
Кроме вышеназванных, было довольно много интерес-
ных докладов на тему применения Linux в корпоративном
секторе. Одним из самых запомнившихся был рассказ Ада-
ма Джолланса (Adam Jollans) из IBM о том, почему его ком-
пания решила оказывать всестороннюю поддержку 150 про-
ектам с отрытым кодом. Среди самых известных проектов
можно назвать Linux, Postfix, Eclipse, Apache, Derby, Globus
Alliance.
Сразу же после Джолланса на сцену взошел предста-
витель Novell Ричард Зайбт. Его доклад наглядно проде-
монстрировал полезность Open Source-движения как ката-
лизатора конкуренции на рынке. Для простого потребите-
ля ИТ услуг это безусловно благо, впрочем и для самих кон-
курирующих фирм – тоже неплохо. Ïèíãâèíû – îäèí èç ñèìâîëîâ äâèæåíèÿ Open Source
Одновременно с докладами метров опенсорса в течение Общее впечатление от всего произошедшего сложилось
второго и третьего дня выставки в одном из залов проходи- очень приятное. Следующим мероприятием, сравнимым по
ло мероприятие под названием «Уголок оратора». В его рам- масштабу с Open Source Forum, станет выставка Linux World,
ках выступали с докладами о своих разработках независи- которая пройдет в Москве в сентябре этого года.
мые технические специалисты. Весьма любопытными были
выступления «Возможности использования открытого кода Андрей Бешков
в закрытых продуктах» и «Открытый код – разработчикам Фото Андрея Бешкова,
Андрея Маркелова
встроенных систем». В зависимости от тем и качества док-

№5, май 2005 3


интервью

ИСТОРИЧЕСКАЯ НЕИЗБЕЖНОСТЬ ПОБЕДЫ


ДВИЖЕНИЯ ОТКРЫТОГО КОДА
Джон Холл уже много лет
считается гуру движения
открытого исходного кода.
Уже более 30 лет он работает
в компьютерной индустрии,
при этом стаж работы с UNIX-
системами – 20 лет. С 1994 года
Джон занимается продвижением
Linux-решений. На проходящей
конференции Open Source
мне удалось побеседовать
с Джоном Холлом о перспективах
развития систем на основе
открытого кода.

кажите, что вы думаете о собственный способ изобретения коле- веров, до сих пор бесперебойно рабо-
перспективах коммерческих са нет нужды. К тому же в голову сразу тающих на основе разных версий Novell
компаний, опирающихся в же приходят мысли, как на этом можно Netware, но, к сожалению, эти решения
своем бизнесе только на Linux-ре- сэкономить. уже не дают той гибкости, в которой
шения? нуждаются клиенты. В то же время, у
Все говорят, что сейчас на рынке нет Как вы относитесь к попыткам запус- Suse и Ximian нет денег для дальней-
убедительных примеров успешных кать Windows-приложения под Linux шего развития. Кроме этого, Novell
Linux-компаний, если не брать в рас- c помощью Wine? Что вы думаете о предлагает не только деньги, но и свою
чет Red Hat. Я думаю, вся проблема со- свободной реализации Windows API, хорошо налаженную сеть распростра-
стоит в том, что многие фирмы непра- называемой React OS? нения. Думаю, что подобное объедине-
вильно рассчитывают срок выхода на Мне кажется, что воссоздать API от ние приведет к появлению более каче-
уровень не только самоокупаемости, Microsoft довольно сложно, у людей, ственных продуктов. Обратите внима-
но и прибыльности. Из-за этого полу- работающих над проектом Wine, ушли ние: то же самое сейчас происходит с
чается, что большинство молодых ком- долгие годы на реализацию основных Mandrake и Connectiva, я думаю, что
паний решают уйти с рынка слишком функций. Сейчас они добились совме- это к лучшему.
рано. Это в корне неверно, посмотри- стимости с Windows 98, но ведь на дан-
те на Red Hat: для получения прилич- ный момент актуальна Windows XP. К В последние 10 лет только и разго-
ных доходов им пришлось трудиться не тому же стоит учесть, что при каждом воров, что о Linux, некоторые люди
покладая рук несколько лет. изменении, вносимом Microsoft без уже начинают считать, что Linux яв-
предупреждения, в API и ABI вся сис- ляется единственной ОС для привер-
Каковы ваши прогнозы тенденций тема перестает работать. Мне кажет- женцев движения открытых исход-
развития коммерческих UNIX-сис- ся более перспективным создавать ников. Не кажется ли вам, что вок-
тем? стандартный ABI для Linux-приложе- руг этой ОС шумиха несколько пре-
Я думаю, что коммерческие UNIX мерт- ний, тогда их можно будет запускать увеличена?
вы. Их поддержка слишком дорого об- под какой угодно ОС. Лет 10 назад ко мне пришли люди, за-
ходится производителю. В свое время нимающиеся BSD, и спросили, почему
я работал в DEC, и ежегодно мы трати- Как вы думаете, слияние Novell, Suse я ничего не говорю об их ОС в своих
ли 2 миллиона долларов на поддержку и Ximian – это объективная необхо- выступлениях. Я ответил: «Покажите
собственного диалекта UNIX. Вдумай- димость или попытка в последний мне 5 хороших форумов о BSD или
тесь в эту цифру. Как только Linux до- момент успеть вскочить на поднож- армию поклонников этой ОС». Выбор
растает до того, чтобы работать на спе- ку набирающего ход Linux-поезда? ОС никак не связан с качеством про-
цифическом оборудовании, к примеру, Продукты, поставляемые Novell, уже дукта, в сущности, это всего лишь воп-
от HP или IBM, менеджмент начинает давно завоевали славу очень стабиль- рос правильного маркетинга. Иначе
задумываться о том, что развивать свой ных решений. В мире очень много сер- Microsoft не продал бы ни единой ко-

4
интервью
жон мэддог Холл (John Hаll) изложения концепций, он стал одной
известен как один из пионеров из наиболее ярких фигур мира ИТ.
движения Open Source. Непов- Господинн Холл начинал свою карь-
торимая харизма «Бешеного еру как программист, и впоследствии
пса» снискала ему славу среди сторон- он занимал должности специалиста по
ников и противников открытого кода по разработке систем, системного админи-
всему миру. Проведя более 30 лет в ра- стратора, руководителя отдела реали-
боте в мире ИТ, сначала с UNIX, потом зации продуктов и технического дирек-
с Linux, он объездил много стран, рас- тора в таких организациях, как Western
сказывая о преимуществах и перспек- Electric Corporation, Bell Laboratories,
тивах открытого кода. С 1995 года и Aetna Life and Casualty, Digital Equipment
по сей день он является Президентом Corporation, VA Linux Systems.
и СЕО Linux International (www.li.org) – Джон Холл известен своей любо-
некоммерческой организации постав- вью к преподаванию. Он вел несколь-
щиков ИТ-услуг, выступающих в под- ко курсов лекций в Hartford State
держку развития и продвижения ОС Technical College, Merrimack College и
Linux. Он также входит в состав прав- Daniel Webster College. Именно студен-
ления нескольких компаний и неком- ты Hartford State Technical College, где
мерческих организаций, включая он был деканом факультета Computer
USENIX Association. Перу Мэддога при- Science, дали ему никнейм «maddog»,
надлежит книга «Linux for Dummies», и которым он любит себя называть до
он является автором многочисленных сих пор. Свободное время Джон Холл
статей, посвященных специфике от- посвящает своему проекту «maddog's
крытого кода. Благодаря чувству юмо- monastery for microcomputing and
ра, приветливости и оригинальности microbrewing».
Âûñòóïëåíèå Äæîíà Õîëëà
пии своих программ. Заказчик хочет можно, такая участь постигнет и эту продукты, а на предоставляемые сер-
получить решение на основе Linux, и я компанию. С другой стороны, начать висы. Грядет время сервис-ориентиро-
считаю: неправильно пытаться застав- работать в стиле открытых исходных ванной экономики, и тот, кто начнет
лять его переходить на BSD только по- кодов им будет чрезвычайно трудно. приспосабливаться к новым условиям,
тому, что кому-то она кажется более Дело не только в том, что каждая боль- первым займет очень выгодные пози-
качественной. шая структура неповоротлива и косна, ции. На данный момент, по моему мне-
но и в том, что внутри их продуктов нию, примером сервис-ориентирован-
Что вы думаете об инициативе по встроено много закрытых технологий, ной компании можно считать IBM.
уменьшению количества разновид- лицензированных у других производи-
ностей лицензий, под которыми вы- телей. Мне кажется, что Microsoft со Андрей Бешков
пускается свободное программное временем превратится в компанию, Фото Андрея Бешкова,
Андрея Маркелова
обеспечение? ориентированную не на продаваемые
Слишком много людей не понимает
отличий разных видов лицензий, и для
своих сиюминутных нужд создают все
новые и новые варианты близнецов. С
другой стороны, я бы не хотел никого
ограничивать в свободе выбора подхо-
дящей модели лицензирования свое-
го кода. Рассмотрев разные варианты
существующих лицензий, считаю, что
GPL на данный момент лучше всего,
хотя и она не совершенна.

Каковы ваши прогнозы относитель-


но будущего Microsoft?
Каждую достаточно большую фирму
можно считать живым организмом.
История эволюции доказывает, что
виды, отказывающиеся приспосабли-
ваться к меняющимся внешним усло-
виям, вымирают. Если Microsoft не нач-
нет заниматься Open Source, то, воз- Äæîí Õîëë è ðåäàêòîðû æóðíàëà Âàëåíòèí Ñèíèöûí è Àíäðåé Áåøêîâ (ñïðàâà)

№5, май 2005 5


интервью

ЛАРРИ УОЛЛ:
«СЕГОДНЯ PERL ПРИМЕНЯЕТСЯ ДЛЯ РЕШЕНИЯ
РЯДА ПРОБЛЕМ, О КОТОРЫХ Я И НЕ ПОДОЗРЕВАЛ,
СОЗДАВАЯ ЭТОТ ЯЗЫК»
Ларри Уолл – человек, ненамеренно сделавший очень многое
для распространения UNIX-систем. Он никогда не занимался
целенаправленной рекламой UNIX, но создание языка Perl
сделало его одним из самых популярных людей
Open Source-движения. Сейчас уже, наверное, невозможно
найти технического специалиста, работающего в UNIX
и не знакомого с верблюдом, изображенным на логотипе
Perl. Благодаря гибкости и переносимости Perl вышел
далеко за рамки UNIX, сейчас его довольно часто можно
встретить под Windows и многими другими платформами.
есколько лет назад Perl пози- Я думаю, всем вышеперечисленным. За выполнялись три экземпляра одного и
ционировался как лучший последние пять лет мы увидели, что того же скрипта, компиляция выполня-
язык для разработки веб-при- людям может пригодиться самый нео- лась трижды. В новой версии будет ре-
ложений. Сейчас его заметно потес- бычный и фантастический функционал, ализовано понятие разделяемой памя-
нил PHP. Что вы думаете об этой си- о котором только можно подумать. По- ти и кэша байт-кода. Это значит, что
туации? Какова экологическая ниша этому мы стараемся сделать так, что- скрипт будет компилироваться только
Perl сейчас и для чего, по вашему бы язык позволял делать многие вещи первый раз и при запуске новых экзем-
мнению, его стоит теперь применять? прозрачнее и проще, чем раньше, но в пляров этого скрипта скомпилирован-
Perl и PHP – очень разные языки. Пер- то же время не ограничивать пользова- ный код будет браться прямо из кэша
вый является языком общего назначе- теля, давая возможность реализовы- Parrot.
ния. В целом он предназначен для раз- вать сложные вещи. В новой версии
нообразных научных применений, обра- разработчик получит еще больше мо- Хотелось бы узнать приблизитель-
ботки баз данных, всевозможных мани- гущества и сможет работать гораздо ные сроки выхода Perl 6.
пуляций с текстом, системного админи- эффективнее. Представьте себе, что Сказать точно, когда это произойдет,
стрирования, быстрой разработки про- нам нужно построчно сложить значения, я не могу, делать одновременно мно-
тотипов интернет-сервисов. Благодаря хранящиеся в двух массивах, и помес- жество вещей, к сожалению, невоз-
этим качествам некоторое время по не- тить результат в третий. Традиционно можно. Как любой Open Source-проект,
доразумению он использовался как веб- для решения этой задачи нужно было мы располагаем ограниченными сред-
язык. Второй же предназначен только бы использовать цикл с операциями ствами, соответственно не можем себе
для веб-разработки и справляется с сложения и присваивания, но в новой позволить нанимать дополнительных
этой задачей очень хорошо. Неудиви- версии все это можно будет сделать работников, приходится выбирать меж-
тельно, что в этой нише он доминиру- всего лишь одним оператором. ду скоростью разработки и качеством
ет, но я не думаю, что он будет рабо- кода. Мы думаем, что лучше выпустить
тать хорошо за ее пределами. Сейчас Будет ли шестая версия языка при чуть позже очень устойчивую альфа-
Perl применяется для решения таких всех своих улучшениях работать версию, чем быстро сделать несколь-
проблем, о которых я и не подозревал, быстрее, чем пятая? ко промежуточных неотшлифованных
создавая этот язык. К примеру, он с ус- Я думаю, да. В новой версии после релизов.
пехом применяется в генетических ис- компиляции текста в байт-код добав-
следованиях, ведь ДНК принято обозна- ляется больше служебных сведений о Планируется ли в новой версии вне-
чать как набор символов, а в удобстве типах используемых данных, ходе вы- сти изменения в синтаксис языка,
работы с символами Perl нет равных. полнения кода, это помогает оптими- чтобы сделать его более друже-
зировать выполнение программы. В то ственным к пользователю?
Во время разработки новой версии же время стоит отметить, что и код са- Этим вопросом будут заниматься дру-
Perl каким качествам продукта при- мого компилятора Perl претерпел зна- гие разработчики, единственная зада-
дается первостепенное значение? чительные изменения в лучшую сторо- ча, которую я зарезервировал для
Оптимизации, гибкости и красоте ну. Обычно для каждого запускаемого себя, – транслятор Perl 5 в Perl 6. Мне
кода или наличию наибольшего ко- скрипта производилась компиляция в как лингвисту было бы очень интерес-
личества полезных функций? байт-код, соответственно, если у нас но этим заняться, но, к сожалению, пе-

6
интервью
реработка глубинных компонентов старается быть как можно более дру- уметь вычислять выражения вроде:
языка отнимает довольно много време- жественным к другим языкам. Когда ((8 + 7) * 12 - (10 * 44/11) ) %10. Через
ни. Perl уже давно перерос размеры пользователи захотели получить воз- пару дней все было готово, ведущий
проекта, который можно обслуживать можность выполнять C-код из про- разработчик был просто в восторге от
в одиночку, поэтому многие задачи де- грамм на Perl, пришлось много потру- того, что в выражениях можно исполь-
легируются специалистам в этой обла- диться, чтобы реализовать такой фун- зовать не только стандартные арифме-
сти, которые сделают работу лучше. кционал, но я думаю, что труды были тические операции, но и расчет процен-
ненапрасны, потому что это позволит тов. Оказалось, что встроить виртуаль-
Для представления строковых дан- значительно улучшить кодовую базу ную машину интерпретатора Perl в при-
ных Perl использует кодировку многих проектов. ложение было легче, чем реализовать
Unicode, и этим выгодно отличается тот же самый функционал на языке C++.
от других языков. Так было задума- Бытует мнение, что виртуальная На быстродействие получившегося про-
но изначально или пришло само со- машина Parrot по своему дизайну дукта такой симбиоз практически не по-
бой, когда разработчики столкну- очень похожа на среду выполнения влиял, а вот время работы над прило-
лись с проблемами локализации? Microsoft .Net. Не могли бы вы про- жением существенно уменьшилось. Ко-
В момент появления Perl такого поня- комментировать это утверждение? нечно, для сообщества разработчиков
тия, как Unicode, не существовало. Я думаю что .Net по особенностям реа- дальнейшее совершенствование Perl в
Мы, как и многие другие проекты, про- лизации больше похож на Microsoft Java качестве встраиваемого языка не явля-
шли через все стадии проблем с ло- Virtual Machine со свойственной ему ста- ется высшим приоритетом, но мы все
кализацией. Хранение строковых дан- тической типизацией данных. В дизайн же стараемся сделать так, чтобы он мог
ных в Unicode появилось в версии 5.6 Parrot изначально заложена способ- применяться в максимально возможном
и работало не очень хорошо. К версии ность работать в двух режимах с дина- количестве областей.
5.8 к проекту присоединились люди, мическими типами данных и со стати-
которые наконец-то довели все это до ческими. Соответственно, пользова- Расскажите, в какой компании вы
ума. тель сможет самостоятельно добавлять сейчас работаете и, если не секрет,
данные о типе переменных, используе- чем занимаетесь?
На сайте Slashdot.org несколько лет мых в программе, и это позволит управ- Большую часть времени в течение пос-
назад появилась шутка о том, что лять тем, как будет выглядеть поведе- ледних четырех лет я официально ни у
скоро должен появиться новый язык ние языка. кого не работаю. В основном средства
Parrot, который должен будет воб- к существованию получаю за счет вы-
рать в себя лучшее из Perl и Python. Что вы думаете о применении полнения грантов от Perl Foundation, раз-
Через какое-то время была разрабо- embedded Perl в качестве встроен- рабатывая новые и улучшая существу-
тана виртуальная машина Parrot, ис- ного языка для скриптования ком- ющие подсистемы Perl 6. Плюс к этому
пользуемая для выполнения компи- понентов приложения? регулярно поступают авторские отчис-
лированного байт-кода Perl 6. Как вы В данной области Perl 5 успешно при- ления от публикации книг о Perl. В об-
думаете, сможет ли Parrot когда-ни- меняется уже довольно долго. В моей щем, можно сказать, что я не бедствую
будь компилировать и выполнять практике был случай, когда один из за- и довольно легко могу позволить себе
код, написанный на Python? казчиков для своей бухгалтерской про- путешествовать по всему миру.
Perl является самым распространен- граммы попросил меня помочь реали-
ным из скриптовых языков, сообще- зовать сложные поля редактирования. Андрей Бешков
ство людей, использующих его, огром- Программа должна была понимать и Фото автора
но. Я считаю, что мы должны старать-
ся устанавливать добрососедские от-
ношения, всесторонне сотрудничать и
поддерживать сообщества разработ-
чиков других скриптовых языков. По-
этому я всегда стремился к разработ-
ке какой-то единой платформы, кото-
рая сможет запускать не только Perl и
Python.
В свою очередь сообщество разра-
ботчиков Perl 6 решило, что неплохо
было бы поддерживать этой платфор-
мой и другие языки, такие как Ruby,
Basic, Lisp, Lua. Когда работы над Perl 6
будут окончены, я думаю, мы сможем
работать в его рамках c любым язы-
ком, использующим динамическую ти-
пизацию данных. На самом деле Perl Ëàððè Óîëë è ðåäàêòîð æóðíàëà Âàëåíòèí Ñèíèöûí

№5, май 2005 7


тенденции
Корпоративные базы нием, поскольку в предыдущие годы на Центр Высоких Технологий
данных – 2005 конференции были представлены HP в Москве
20 и 21 апреля в Синем зале Президи- лишь поставщики закрытых решений. 26 апреля в Москве состоялось торже-
ума РАН в Москве проходила юбилей- В этом году слово было предоставле- ственное открытие Центра Высоких
ная, десятая по счету конференция но проекту Sedna, разрабатывающему Технологий HP (HP High Tech Center).
«Корпоративные базы данных – 2005». «прирожденную» СУБД для работы с В настоящий момент в мире насчи-
Ее организатором выступила компания документами в формате XML посред- тывается около 80 Центров HP, кото-
Центр Информационных Технологий ством языка запросов XQuery и рые подразделяются на три уровня в
(ЦИТ), известная как владелец порта- PostgreSQL, блестящее введение в зависимости от объема оказываемых
лов CITForum и CITKit, а генеральным возможности которого сделал один из ими услуг. Центр Высоких Технологий
спонсором – корпорация Microsoft. разработчиков данного продукта Олег в Москве принадлежит к первому, выс-
Первый день конференции был по- Бартунов (ГАИШ МГУ). Не были обой- шему уровню. Это пятая организация
священ коммерческим решениям. За- дены вниманием и система Ingres r3 подобного рода в мире и вторая – за
седание открыл Дмитрий Артемов компании Computer Associates, став- пределами США. Аналогичный центр
(Microsoft), представивший обзор но- шая открытой лишь в мае прошлого существует и на территории Западной
вых возможностей Microsoft SQL Server года, и Firebird SQL, базирующийся на Европы в г. Беблинген (Германия).
2005. Особое внимание было уделено исходном коде Interbase. Одну из са- Основная задача Центра Высоких
поддержке стандарта XML на уровне мых популярных открытых СУБД, Технологий в Москве – оказывать со-
ядра базы данных, интеграции с .NET MySQL, представлял Дмитрий Ленев действие российским клиентам и парт-
Framework и новым технологиям обес- (MySQL AB), член московской коман- нерам Hewlett-Packard. Первым из них
печения целостности данных. Програм- ды разработчиков. Из-за новизны те- будет предложен комплексный подход
ма конференции была построена та- матики или из-за специфики аудитории к решению возникающих бизнес-задач.
ким образом, что доклады, посвящен- (в зале то тут, то там мелькали ноут- Иными словами, клиенты Центра Высо-
ные системам управления базами дан- буки с Linux), решения Open Source ких Технологий смогут выбрать интег-
ных, чередовались с сообщениями о пользовались самым пристальным рированное решение, наилучшим обра-
технологиях интеграции, так что слу- вниманием и являлись предметом не- зом отвечающее имеющимся требова-
шатели могли лучше представить себе прерывного обсуждения «в кулуарах». ниям, организовывать тестирование,
место новейших разработок в мире Конференция закончилась выступ- производить сертификацию и т. д. При
СУБД в информационной инфраструк- лением Сергея Кузнецова (ИСП РАН), этом будут использоваться как соб-
туре предприятия. который представил прогноз возможно- ственные разработки Hewlett-Packard,
С презентациями, рассказывающи- го развития индустрии баз данных. Со- так и решения компаний-партнеров.
ми о развитии тех или иных решений гласно ему нас ждет появление новых, Поскольку область компетенции Цент-
за истекший год выступили также ком- «нечетких» типов данных, интеграция ра не ограничивается территорией Рос-
пания InterSystems, производитель СУБД с технологиями Data Mining, а так- сийской Федерации (это глобальная
СУБД Cache, SWD Software, дистрибь- же инновации в области долговремен- организация), партнеры HP будут иметь
ютор системы Empress, а также отече- ного хранения информации. Возможно, шанс вывести свои решения на новые
ственная фирма Релэкс, известная уже через некоторое время эти пока международные рынки. Оуэн Кемп под-
своей СУБД Линтер. еще не решенные проблемы станут черкнул исключительную важность дан-
Второй день был практически пол- предметом докладов на «Корпоратив- ного события, охарактеризовав Центр
ностью посвящен открытым разработ- ных базах данных – 200x»? Время по- как «окно в мир» для отечественных
кам. Это является важным нововведе- кажет. компаний. Все выступающие отмечали
высокий научный и инженерный потен-
циал российских специалистов и выра-
жали мнение, что задача HP состоит в
развитии этих возможностей.
Исполнительный вице-президент
Майкл Уинклер назвал открытие Цент-
ра новой эрой в истории этой компании.
В ближайшие пять лет в него будет
инвеcтировано около 12 млн. долларов.
По словам Марко Буркхарда, Центр бу-
дет постоянно совершенствоваться,
чтобы отвечать требованиям рынка.
В числе стратегических целей были
упомянуты банковские системы back-
office и телекоммуникации.

Валентин Синицын
Ó÷àñòíèêè êîíôåðåíöèè ñëóøàþò âûñòóïëåíèå Äìèòðèÿ Àðòåìîâà Фото автора

8
тенденции

Sun Microsystems: технологии доверия


конце 2002 года компания «Све- ма сети с секретными данными выгля-
мел» заключила договор с кор- дит таким образом: 2 сервера Sun Ray,
порацией Sun Microsystems, по один отвечает за работу с секретной ин-
которому получила исходные тексты формацией и не имеет выхода в сеть.
программного обеспечения ОС Solaris 9, Второй – для работы с обычными доку-
Sun Ray 2.0 (клиентская и серверная ча- ментами и в Интернет. У пользователя
сти) и firmware ряда технических есть 2 карты. Вставив первую карту в
средств с возможностью их исследова- терминал, он работает с секретной до-
ния, модификации, создания собствен- кументацией. Вставив вторую – получа-
ных версий программных продуктов, ет доступ в Интернет. И между этими
встраивания российских средств крип- сессиями нет возможности передавать
тографии с последующей сертификаци- данные, что исключает их утечку.
ей в уполномоченных органах РФ. Терминалы Sun Ray работают под
Технология тонких клиентов Sun Ray ОС Solaris 9, включая офисное про-
позволяет полностью избавиться от не- граммное обеспечение StarOffice7,
обходимости хранить, поддерживать и веб-браузер firefox, почтовый клиент
периодически обновлять программное thunderdird и многое другое. Естествен-
обеспечение на рабочих местах поль- но, что в любой фирме существует не-
зователей. Авторизация с помощью мало программного обеспечения, рабо-
смарт-карт позволяет получить доступ тающего только под Windows и не име-
к поль-зовательской сессии с любого ющего аналогов под Solaris. В этом слу-
доступного терминала Sun Ray. Джим чае Sun рекомендует ставить отдельный
Бейти (Jim Baty), Вице-президент Sun сервер Windows-приложений, доступ к
Microsystems, в своем выступлении де- которому можно получить с помощью
лал основной упор на возможность ра- программного пакета Citrix MetaFrame.
боты с любого терминала со своими В настоящий момент технология
документами. Человек просыпается ут- Sun Ray внедряется в МИД РФ. Анато-
ром, у него дома стоит терминал Sun лий Смирнов, руководитель Центра ин-
Ray, он читает почту, делает какие-то форматики МИД РФ, сделал доклад об
дела, потом едет в офис, с офисного успехах этой работы. По его словам,
терминала начинает работу с того мес- практически для всего программного
та, где ее прервал и т.д. В настоящее обеспечения, используемого в МИД,
время разработана концепция «flexible были найдены аналоги, работающие
office», заключающаяся в следующем. под ОС Solaris 9. Исключение состави-
У сотрудников нет фиксированных ра- ли некоторые самописные программы,
бочих мест. Сотрудник, приходя на ра- котрые в настоящий момент дорабаты-
боту, занимает любое свободное рабо- ваются. Он также отметил, что пере-
чее место. Если сотрудник покидает подготовка пользователей идет не
рабочее место больше, чем на полдня, очень гладко. Наиболее сложным ока-
он освобождает его от своих личных ве- зался психологический момент, при
щей с тем, чтобы оно могло быть ис- котором пользователю удобнее рабо-
пользовано кем-то еще. Личные вещи тать в MS Office, чем в StarOffice.
сотрудник хранит в мобильной тумбе, ко- Ну и напоследок ложка дегтя в боч-
торую он подкатывает к своему рабоче- ке меда. Раздражает множество мел-
му месту на время работы; на ночь тум- ких, но очень неприятных недочетов.
бы «паркуются» в специальном месте. Мышь в терминале без скроллинга.
Использование терминалов идеаль- USB-порты на задней стенке термина-
но для работы с секретной информаци- ла расположены очень неудобно, на-
ей. Поскольку терминал не имеет дис- пример, подключить flash-накопитель
ковых накопителей, скопировать ин- без удлинителя невозможно. Список
формацию на внешние носители невоз- можно продолжать и далее.
можно. Исключение составляют только Но в целом технология Sun Ray зас-
USB-накопители, которые сложно под- луживает пристального внимания, осо-
ключить непосредственно к терминалу, бенно в свете доработки ОС Solaris 9 с
но разрешение на их использование учетом специфики нашего региона.
легко настраивается в зависимости от
прав пользователя. Таким образом, схе- Кирилл Тихонов

10
тенденции

SoftInform Search Technology – новая технология поиска документов


оссийская компания СофтИн- ная система разграничения прав озна- для конкретных заказчиков. По его
форм (http://www.softinform.com) чает, что пользователь, не имеющий словам, возможности технологии не
представила свою технологию прав на конкретный документ, не смо- исчерпываются перечисленными типа-
поиска «SoftInform Search Technology», жет получить в окне предпросмотра ми данных и при необходимости заказ-
а также ее реализацию в новом одно- найденные в нем данные. ного решения компания готова создать
именном корпоративном продукте – Пробные Trial-версии сервера и на основе технологии поиска решение
системе поиска информации в локаль- клиента можно скачать с сайта: http:// для конкретного заказчика.
ной сети. Это SearchInform Desktop www.searchinform.com. Пока что серверная и клиентская
Edition – программа полнотекстового На пресс-конференции директор часть функционируют только на плат-
поиска на персональном компьютере компании Лев Матвеев акцентировал форме Windows. Данное неудобство ча-
и SearchInform Corporate Edition – кор- внимание на том, что это прежде все- стично компенсируется возможностью
поративная система поиска в инфор- го глобальная технология, а не только индексирования сетевых ресурсов, од-
мационной базе предприятия. единичный продукт. Сегодня компания нако для моногамных UNIX-сетей такое
Корпоративная версия состоит из «СофтИнформ» делает акцент не про- решение окажется неприемлемым.
серверной и клиентских частей (серве- сто на продажу готового продукта, а на
ров может быть несколько для увели- разработку корпоративных решений Роман Марков
чения производительности). Сервер
создает индексы указанных ресурсов,
а затем, обрабатывая клиентские зап-
росы, выдает пользователям результа-
ты поиска в зависимости от персональ-
ных прав пользователя. Позже разра-
ботчики объявили о том, что в функци-
онал добавлена возможность сквозно-
го использования системных разреше-
ний безопасности для файлов и папок
(в первых версиях права на найденную
информацию необходимо было делеги-
ровать дополнительно). В данный мо-
мент система SearchInform работает со
всеми документами Microsoft Office,
PDF-файлами, HTML, базами почтовых
клиентов от MS, тестовыми файлами
формата plain-text, базами данных
Access, MS SQL, Oracle, а также любы-
ми СУБД, поддерживающими SQL.
При поиске учитывается все множе-
ство слов, встречающихся в докумен-
те, с задействованием всех словоформ
и словаря синонимов. При выводе ре-
зультатов поиска показываются макси-
мально похожие фрагменты докумен-
тов независимо от изменений, внесен-
ных в текст (удаление части текста, за-
мена), а также указывается процент
релевантности. При этом в корпоратив-
ной версии используется трехуровневое
управление правами доступа к инфор-
мации – к самому индексу (т. е. сама
возможность поиска в конкретном ин-
дексе), к источникам данных и к проин-
дексированным файлам. Такое разгра-
ничение прав является обязательным
при работе корпоративной системы, так
как, разумеется, что сам сервер индек-
сации должен иметь права доступа ко
всем индексируемым документам. Дан-

№5, май 2005 11


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

FreeBSD TIPS: ИСПОЛЬЗОВАНИЕ SYSLOG


– Позвольте, товарищи, у меня все ходы записаны!
– Контора пишет, – сказал Остап.
И.Ильф, Е.Петров «12 стульев».

Протоколирование работы любой системы, и прежде всего сервера, – одна из важнейших


составляющих администрирования. Именно в log-файлы мы заглядываем в первую очередь,
когда в системе возникают какие-то неполадки. Оттуда черпаем уверенность, что та или иная
программа работает так как ожидается. При разработке веб-приложений log-файл становится
важнейшим источником отладочной информации. Об особенностях работы демона syslog,
отвечающего за протоколирование системной информации, и пойдет речь.
СЕРГЕЙ СУПРУНОВ
Что такое syslog Òàáëèöà 1. Óðîâíè ñîîáùåíèé
Syslog является централизованным сервисом, обеспечива-
ющим сбор и запись протокольной информации, поступа-
ющей от различных компонентов операционной системы и
пользовательских процессов. Сторонние программы, как
правило, умеют работать со своими лог-файлами самосто-
ятельно, хотя многие из них можно настроить на работу и с
демоном syslogd. К преимуществам использования syslog
можно отнести возможность управлять процессом сбора не-
обходимой информации с помощью одного конфигураци-
онного файла, что обеспечивает единообразие получаемых
log-файлов и в итоге упрощает управление ими. В таблице 1 уровни сообщений перечислены в порядке
Работа службы syslog обеспечивается демоном syslogd, убывания. Этот порядок понадобится в дальнейшем при
который автоматически запускается при старте системы. обсуждении синтаксиса конфигурационного файла.
Он постоянно находится в памяти, ожидая сообщения от Обозначения уровня сообщения, записанные в одной
других процессов и обрабатывая их в соответствии со сво- строке (например, emerg и panic), – это синонимы, и может
ими настройками. быть использовано любое из них. Однако panic, error и warn
Каждое сообщение характеризуется уровнем и источни- (указанные в таблице вторыми) считаются устаревшими, и
ком (facility). Уровень задает степень важности сообщения с следует избегать этих обозначений при редактировании
точки зрения функционирования системы. Файл syslog.h оп- конфигурационного файла. Вместо них используйте emerg,
ределяет следующие уровни (приоритеты): err и warning соответственно.

12
администрирование
Возможные источники сообщения перечислены в таб- чить требуемый уровень безопасности, исключив возмож-
лице 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

Синтаксис конфигурационного файла


Настройка протоколирования осуществляется в файле /etc/
syslog.conf. Само собой разумеется, что редактировать его
может только пользователь root. Этот файл содержит два
При настройке какого-либо приложения для работы со вида строк – условно назовем их «фильтры» и «правила».
службой syslog уточните, какой источник (facility) оно исполь- Строка-фильтр определяет программу или хост, к сооб-
зует. Некоторые программы позволяют указать источник са- щениям от которых будут применяться следующие за ней
мостоятельно. Например, демон clamd (главный процесс ан- правила. Фильтр вида «!prog» (или «#!prog») указывает на
тивируса clamav) по умолчанию использует local6, однако то, что последующие строки относятся к логам, которые ге-
позволяет задавать другой источник (параметр LogFacility нерируются указанной программой prog. Синонимом этой за-
в конфигурационном файле). В ряде случаев может быть писи является «!+prog». Строка «!-prog», наоборот, говорит
полезно объединить его сообщения с сообщениями почто- о том, что последующие правила будут применяться ко всем
вых служб, указав в качестве источника LOG_MAIL. сообщениям, кроме тех, которые исходят от программы prog.
Допускается перечислять через запятую несколько программ,
Параметры запуска демона при этом знак «+» или «-» применяется ко всему списку.
Полный список параметров запуска можно получить на Если строка-фильтр задана как «+hostname», то в каче-
странице руководства man syslogd. Здесь рассмотрим толь- стве источника сообщений, которые должны быть обрабо-
ко некоторые из них. таны последующими правилами, будет использоваться ука-
Syslog способен записывать поступающие сообщения в занный хост. Так же как и в случае с программами, симво-
лог-файлы (которые обычно размещаются в каталоге /var/ лом «-» отмечается, что правила будут применяться ко всем
log), отправлять на консоль или подключенный терминал сообщениям, кроме поступающих от указанного хоста. Че-
пользователя, пересылать на удаленный хост или отдавать рез запятую можно задавать список хостов.
на обработку внешней утилите по конвейеру. Символ «*», заданный в качестве программы или хос-
Для работы по сети syslog использует порты 514 (UDP и та, отменяет действие фильтра, установленного ранее. То
TCP). Запущенный без дополнительных параметров, syslogd есть правила, указанные после такой строки, будут приме-
будет прослушивать эти порты, ожидая входящих сообще- няться ко всем сообщениям. Фильтры с именем хоста или
ний. Ключ -s запрещает принимать входящие сообщения, программы независимы друг от друга и могут действовать
но сокеты на портах 514 по-прежнему создаются для исхо- одновременно. Например:
дящих соединений, чтобы syslogd мог отправлять сообще-
ния удаленным хостам. Удвоение ключа (-ss) запрещает и # Ïðàâèëà, ðàñïîëîæåííûå çäåñü, ïðèìåíÿþòñÿ êî âñåì
# ñîîáùåíèÿì
исходящие соединения. +my.host
По умолчанию syslogd запускается с ключом -s (см. /etc/ # Ïðàâèëà ïðèìåíÿþòñÿ êî âñåì ñîîáùåíèÿì ñ my.host
!logger
defaults/rc.conf, параметр syslogd_flags), поэтому входящие # Ïðàâèëà ïðèìåíÿþòñÿ ê ñîîáùåíèÿì îò logger ñ my.host
соединения запрещены. Если вы хотите использовать служ- # (ôèëüòð õîñòà ïðîäîëæàåò äåéñòâîâàòü)
!+su
бу syslog вашего сервера для обслуживания нескольких ма- # Ïðàâèëà ïðèìåíÿþòñÿ ê ñîîáùåíèÿì îò su ñ my.host
шин, добавьте в /etc/rc.conf следующую строчку: +*
# Ïðàâèëà ïðèìåíÿþòñÿ ê ñîîáùåíèÿì îò su ñ ëþáûõ õîñòîâ
# (ôèëüòð õîñòà îòìåíåí, ôèëüòð ïðîãðàììû ïðîäîëæàåò
syslogd_flags=”” # äåéñòâîâàòü)
!*
# Ïðàâèëà ïðèìåíÿþòñÿ êî âñåì ñîîáùåíèÿì
Она переопределит значение, установленное в /etc/ # (ôèëüòð ïðîãðàììû òàê æå îòìåíåí)
defaults/rc.conf, и syslogd сможет обслуживать входящие со-
единения. Естественно, в этом случае необходимо обеспе- Строки правил имеют следующий вид:

№5, май 2005 13


администрирование
facility.CMPlevel destination level0 и level3, будут выводиться на все подключенные тер-
миналы.
Здесь facility – источник сообщения («*» обозначает любые
источники), level – уровень сообщений, которые будут об- level0,level3.=debug *
рабатываться в соответствии с данным правилом. Служеб-
ное слово «none», указанное вместо уровня, дает указание Сообщения службы точного времени, уровень которых
полностью исключить сообщения от данного источника. выше критического (то есть emerg и alert), а также меньше
CMP – операция сравнения (допускаются символы «>», или равные notice (notice, info и debug), будут отправляться
«<», «=», «>=», «<=», а также символ отрицания «!»). Если на терминалы пользователей ntpuser и root.
символ сравнения не указан, подразумевается «больше или
равно», то есть обрабатываются все сообщения уровня level ntp.>crit,<=notice ntpuser,root
и выше.
Destination указывает, куда следует сохранять данное Все сообщения уровня warning, исключая поступающие от
сообщение. Это может быть log-файл (указывается полный почтовых служб, будут записываться в файл 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. Обратите вни- пили в силу, нужно послать процессу syslogd сигнал HUP:
мание на дефис перед именем log-файла. По умолчанию
сообщения буферизуются в памяти и записываются на диск # kill –HUP `cat /var/run/syslog.pid`
по мере заполнения буфера. Это снижает нагрузку на фай-
ловую систему, но может вызвать потерю некоторой инфор- Следует заметить, что если то или иное сообщение под-
мации при аварийном отключении машины. Дефис перед падает под действие нескольких строк в конфигурацион-
именем файла заставляет демон syslogd немедленно за- ном файле, то оно будет обработано в соответствии с каж-
писывать сообщения на диск. дой из них. Пример:

*.err -/var/log/all-err.log mail.* /var/log/maillog


*.=err /var/log/error.log

Отладочные сообщения пользовательских процессов будут В данном случае сообщения mail.err попадут как в maillog,
выводиться на терминал, к которому в настоящее время так и в error.log.
подключен пользователь vasya.
Стратегия составления
user.debug vasya конфигурационного файла
Завершая рассмотрение конфигурационного файла, ска-
Все сообщения от служб новостей и электронной почты жу несколько слов о стратегиях его составления. Помимо
будут пересылаться на 514-й порт машины syslog.host.ru. очень популярной «лишь бы работало», можно выделить
две основные, которые условно назовем «по источнику» и
mail.*,news.* @syslog.host.ru «по назначению».
! Первая стратегия, которую можно наблюдать в ряде ди-
В указанный файл будут помещаться все сообщения служ- стрибутивов GNU/Linux, заключается в том, что для каж-
бы печати, уровень которых ниже warning. Как указывалось дого источника сообщений записывается свое правило
ранее, по умолчанию используется сравнение «больше или (или группа правил, если сообщения разных уровней
равно», а символ «!» его инвертирует, заменяя на «мень- должны обрабатываться по-разному). Ее достоинство –
ше». Если нужно исключить конкретный уровень, следует простота определения, куда записываются сообщения
использовать конструкцию «!=». конкретных служб.
! Стратегия «по назначению» подразумевает создание по
lpr.!warning /var/log/printers.log возможности только одной строки для каждого «полу-
чателя» сообщения, например, файла. Такого подхода
Сообщения уровня debug (и только его), имеющие facility придерживается, в частности, FreeBSD. В итоге можно

14
администрирование
легко определить, какая информация заносится в конкрет- /var/log/pflog root:wheel 600 3 100 * JB ↵
ный лог-файл, но, например, пункты назначения для сооб- /var/run/pflog.pid 1
щений ядра приходится собирать по всему конфигураци- В соответствии с этим правилом файл pflog должен пере-
онному файлу. записываться, как только его размер превысит 100 Мб (5-е
поле) независимо от времени (символ «*» в 6-м поле). Ар-
Утилита logger хивные файлы буду т иметь имена вида pflog.X.bz2
В составе системы есть утилита logger, которая позволяет (pflog.0.bz2, pflog.1.bz2 и т. д), причем X не может быть боль-
отправлять сообщения службе syslog непосредственно из ше трех (параметр 3 в 4-м поле). Флаг J указывает, что ар-
командной строки. Ее удобно использовать при тестирова- хивный файл должен упаковываться с помощью утилиты
нии правил конфигурации, а также в разрабатываемых сце- bzip2. Благодаря флагу B в архивируемый и вновь созда-
нариях для протоколирования их работы. Примеры: ваемый файлы не будут добавляться служебные сообще-
ния о ротации, поскольку файл воспринимается как двоич-
user$ logger –p user.err “Error in user program!” ный. Вновь создаваемый файл будет принадлежать пользо-
user$ logger –h syslog.host.ru “Test it”
вателю root и группе wheel (это поле можно было бы опус-
Первый пример отправит сообщение с facility user уров- тить, поскольку этот владелец устанавливается по умолча-
ня err, которое будет обработано в соответствии с файлом нию). Права доступа будут установлены в rw------- (число-
конфигурации. Вторая команда отправит сообщение на уда- вое значение 600), то есть только владелец сможет читать
ленный хост, источник и уровень по умолчанию будут уста- этот файл и писать в него. Наконец, процессу, PID которо-
новлены как user.notice. го хранится в файле /var/run/pflog.pid, будет послан сигнал
1 (HUP), чтобы он переоткрыл свой лог-файл.
Использование механизмов ротации
Рассмотренный выше механизм протоколирования не пре- /var/log/maillog 640 7 * @T00 J
дусматривает какого-либо управления log-файлами. Сооб-
щения просто помещаются в них согласно правилам, опи- Это правило указывает параметры ротации для файла
санным в конфигурационном файле. Это значит, что фай- maillog: независимо от размера (звездочка в 5-м поле), файл
лы журналов будут постоянно расти, и если ничего не пред- будет перезаписываться каждую ночь в 00:00 (в man
принимать, то рано или поздно заполнят все доступное про- newsyslog.conf формат указания времени описан достаточ-
странство соответствующего раздела. Чтобы этого избе- но подробно). Архив должен упаковываться, будут сохра-
жать, используется механизм ротации. няться последние 8 архивов (с номерами от 0 до 7 включи-
Например, как только размер файла debug.log превысит тельно), вновь созданный файл будет принадлежать пользо-
100 Мб, он переименовывается в debug.log.0 и упаковывает- вателю root (значение по умолчанию, поэтому поле владель-
ся в debug.log.0.bz2. А вместо него создается новый debug.log. ца пропущено) и иметь права доступа rw-r-----.
Далее, когда размер и нового файла достигает 100 Мб, Для просмотра упакованных log-файлов можно исполь-
debug.log.0.bz2 переименовывается в debug.log.1.bz2, и опи- зовать утилиты zcat и bzcat (для gzip и bzip2 соответствен-
санная выше процедура повторяется. Система хранит толь- но). Midnight Commander вызывает соответствующие ути-
ко определенное количество архивных файлов, удаляя наи- литы автоматически.
более старые из них. Это и есть ротация. После редактирования файла newsyslog.conf никакие
сигналы никуда посылать не требуется – конфигурация бу-
Утилита newsyslog дет перечитана при следующем вызове newsyslog.
В системе FreeBSD за ротацию отвечает утилита newsyslog, Следует заметить, что утилита newsyslog не привязана
которая по умолчанию запускается в начале каждого часа к демону syslogd. То есть она может быть использована для
демоном cron. Изменить период ротации можно, отредак- ротации любых файлов, которые в этом нуждаются. Если
тировав файл /etc/crontab. ротация включается для логов, которые приложение ведет
Указанные в приведенном выше примере параметры ро- самостоятельно (например, к логам clamd или squid), то осо-
тации (размер файла, упаковка), а также ряд других зада- бенно внимательно отнеситесь к указанию владельца и пра-
ются в конфигурационном файле /etc/newsyslog.conf. Для вам доступа. Их неправильное указание может привести к
каждого файла, нуждающегося в ротации, в нем содержится тому, что после ротации приложение, запущенное от име-
строка в общем случае из девяти полей: имя файла, владе- ни непривилегированного пользователя, не сможет осуще-
лец и группа, права доступа, наибольший номер в имени ствлять запись во вновь созданный файл.
архивных файлов, максимальный размер файла, период
ротации, дополнительные флаги, а также путь к PID-файлу Подводя итоги
приложения, которому нужно отправить сигнал после рота- Система syslog является очень мощным и эффективным ин-
ции, и номер сигнала, который должен быть послан. (От- струментом протоколирования различных событий, проис-
правка сигнала процессу может понадобиться, например, ходящих в системе. Настройки, используемые по умолчанию,
в том случае, если процесс держит log-файл все время от- достаточно сбалансированы и вполне работоспособны для
крытым; если этого не сделать, то используемый файло- большинства систем. Тем не менее понимание механизма
вый дескриптор не будет соответствовать вновь созданно- работы syslog позволит вам существенно повысить качество
му файлу.) Некоторые поля могут быть опущены. Приве- протоколирования, настроив запись журнальной информа-
дем два примера, полный и «типичный»: ции строго в соответствии со своими потребностями.

№5, май 2005 15


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

КРЕПКИЙ ОРЕШЕК NUT


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

ВАЛЕНТИН СИНИЦЫН
радиционно для управления ИБП применяются штат- или /dev/usb/hid/hiddev/x для устройств, управляющихся че-
ные утилиты, разработанные производителем обору- рез USB1. Драйвер ИБП инкапсулирует в себе протокол, ко-
дования. Зачастую они доступны не только для торый поддерживает UPS и напрямую используется край-
Windows, но и для UNIX, Linux и других систем. Хотя эти ин- не редко. Его основная задача – привести данные, полу-
струменты можно назвать кроссплатформенными в фор- ченные от ИБП в стандартный формат и передать их демо-
мальном смысле этого слова, нередко они несут на себе «от- ну upsd через сокет UNIX, расположенный в каталоге statedir
печаток» той ОС, для которой были созданы изначально. Как (см. ниже) для последующей обработки. Сам upsd не пред-
правило, это программы с графическим пользовательским принимает никаких активных действий, но выполняет роль
интерфейсом, что делает их малопригодными для запуска в диспетчера сообщений, транслирующего все необходимые
режиме демона, к которому привыкли администраторы UNIX. сведения по запросу многочисленных клиентов, которые мо-
Более того, и сама графическая среда X Window устанавли- гут быть установлены как в локальной, так и на удаленной
вается на сервер далеко не всегда. Об очевидных пробле- системе. Именно upsd поддерживает списки контроля дос-
мах совместимости (производитель может не предоставлять тупа (ACL) и определяет, кто сможет наблюдать за выде-
ни пакеты для вашего любимого дистрибутива, ни исходные ленным ИБП, а кто – нет.
тексты для самостоятельной сборки) не стоит и говорить. Вы- Клиенты – самое высокоуровневое приложение в номен-
ходом из сложившейся ситуации может стать использова- клатуре NUT. Среди них есть непрерывно наблюдающие
ние открытых решений, об одном из которых – Network UPS за «здоровьем» ИБП (upsmon), обеспечивающие доступ к
Tools (NUT) версии 2.0 – мы и поговорим подробнее. считыванию и изменению параметров 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, кото-
будет сказано чуть позже. рый и будет останавливать систему в случае разряда бата-
Прежде чем переходить к использованию NUT, давайте рей. Рекомендуется также обеспечить средства для мони-
вкратце рассмотрим его внутреннее устройство. торинга параметров ИБП: upsc, upstat/upset и т. д.
Однако прежде чем произвести упомянутые выше дей-
Мониторинг ИБП изнутри ствия, NUT необходимо установить в вашу систему. Наи-
В терминологии NUT программный код, отвечающий за не- более общим способом является сборка из исходных тек-
посредственное взаимодействие с оборудованием, называ- стов, и поэтому мы поговорим о ней подробнее.
ется «драйвер ИБП» (UPS driver). Следует, однако, понимать,
что этот драйвер существенно отличается от драйверов тра- Собираем собственную версию NUT
диционных устройств: сетевых и звуковых карт, клавиатур, Прежде чем браться за компиляцию NUT, проверьте, суще-
«мышей» и т. п. Последние выполняются в режиме ядра и ствует ли для вашей системы готовый пакет (http://eu1.
используют его API для передачи сообщений приложениям. networkupstools.org/packages.html). Если таковой имеется,
В свою очередь драйвер ИБП – обычная программа, имею- убедитесь, что в него включен драйвер для вашей модели
щая интерфейс командной строки и периодически запраши- ИБП (учтите, что один драйвер может поддерживать не-
вающая характеристики ИБП через соответствующее уст- сколько различных устройств). Если нужный драйвер от-
ройство в файловой системе. Например, /dev/ttySx для UPS, сутствует, вам все же придется произвести самостоятель-
подключенного к последовательному порту в системе Linux ную сборку, но вы сможете использовать spec-файлы RPM,

1
NUT поддерживает как ИБП, подключающиеся к последовательному порту, так и более новые USB HID UPS и даже SNMP UPS (RFC 1628).
В последних двух случаях соответствующие драйвера (hidups, newhidups и snmp-ups) пока что имеют статус экспериментальных.

16
администрирование
build-сценарии и прочие подобные вещи, чтобы не нарушить манду «make install-conf», то сейчас сможете воспользовать-
пакетную базу данных вашего дистрибутива. ся шаблонами, сохраненными в файлах *.sample.
Загрузите архив nut-2.0.x.tar.gz с сайта http://www.net- Первый файл, в который вам предстоит внести измене-
workupstools.org и распакуйте его в любой подходящий ка- ния, называется ups.conf. Он определяет все параметры под-
талог. NUT использует стандартную среду autoconf/automake, ключенных к вашему компьютеру ИБП, а также задает неко-
и его сборка может быть выполнена привычной последова- торые глобальные опции, например, учетную запись, от име-
тельностью команд: ни которой будут выполняться драйверы (директива user) и
интервал опроса оборудования (директива pollinterval).
# ./configure <ïàðàìåòðû> && make && make install
Ëèñòèíã 1. Ïðèìåð ôàéëà ups.conf
Среди полезных параметров сценария configure назовем: user = nut
! --prefix – задает общий «корень» для всего дерева ди-
[ups0]
ректорий NUT. Значением по умолчанию является /usr/ driver = ippon
local/ups, но вы можете выбрать другой путь, например, port = /dev/ttyS0
desc = "Server UPS"
/usr/local или /usr, чтобы установить NUT в общесистем-
ные каталоги (исполняемые файлы – в /usr/bin вместо Данный файл определяет один источник бесперебойно-
/usr/local/ups/bin и т. д.). го питания, имеющий имя «ups0» и подключенный к перво-
! --with-statepath – задает каталог для хранения сокетов му последовательному порту (/dev/ttyS0). Поле «desc» явля-
UNIX, создаваемых драйверами и другой информации ется необязательным и задает текстовую строку-описание
о состоянии. Значение по умолчанию – /var/state/ups. для ИБП. Поле «driver» определяет название драйвера, ко-
Пользователь, от имени которого работает NUT (см. торый будет использоваться для связи с UPS. В данном слу-
ниже), должен иметь право чтения/записи на эту дирек- чае используется ippon, универсальный драйвер для всех
торию. ИБП одноименного производителя. Поля «driver» и «port»
! --with-port – указывает TCP-порт, используемый, в част- должны присутствовать в каждой секции файла ups.conf.
ности, демоном upsd для приема входящих соединений. Руководство пользователя NUT также рекомендует удосто-
По умолчанию NUT 2.0 использует порт 3493, а более вериться, что файл устройства (в нашем примере /dev/ttyS0)
ранние (несовместимые) версии – 3305. не доступен ни для кого, кроме пользователя «nut». После
! --with-user – задает пользователя, от имени которого бу- того как файл ups.conf создан, вы можете проверить его кор-
дут выполняться демоны NUT. Значение по умолчанию – ректность, загрузив драйвер ИБП. Для этого используется
nobody. При желании вы (или разработчики дистрибу- утилита upsdrvctl, расположенная в каталоге <prefix>/bin.
тива) можете создать для NUT специальную учетную за-
пись и группу, например, nut:nut. # upsdrvctl start
! --with-drivers – здесь указывается список драйверов ИБП,
подлежащих сборке. В подавляющем большинстве слу- Если все пойдет гладко, утилита отрапортует об успеш-
чаев необходимо выбрать лишь один из них. ном обнаружении ИБП и перейдет в фоновый режим. В про-
тивном случае будет выдано сообщение об ошибке. Проверь-
Более подробную информацию можно найти в файле те, правильно ли заполнены поля driver и port, а также удос-
docs/configure.txt в архиве с исходными текстами NUT. Пос- товерьтесь, что выбранный вами драйвер не требует указа-
ле выполнения configure наберите «make» и «make install» ния дополнительных параметров. Если таковые имеются, до-
(от имени root), чтобы завершить сборку и установку. Для бавьте их в соответствующую секцию ups.conf. Другой рас-
создания шаблонов конфигурационных файлов используй- пространенной проблемой является невозможность созда-
те «make install-conf». Помимо этого, не забудьте создать ния файлов в каталоге statepath при работе от имени пользо-
каталог для хранения сокетов (statepath) и назначить ему вателя, указанного директивой «user» в файле ups.conf (или
необходимые права доступа (0700, владелец nut:nut, где параметром --with-user сценария configure, если таковая от-
«nut» – пользователь, от имени которого будут выполнять- сутствует). Теперь, когда в вашей системе имеется новый
ся демоны). Подробности ищите в файле INSTALL, вклю- фоновый процесс, собирающий информацию о состоянии
ченном в стандартный комплект поставки. ИБП, настало время подумать и о том, как эту информацию
получать. В первую очередь необходимо настроить демон
Запускаем NUT upsd, поскольку, как мы помним, именно он отвечает за пе-
В данном разделе мы рассмотрим настройку NUT в самом редачу этих данных приложениям-клиентам.
простом случае, когда имеется один ИБП, подключенный к Конфигурация upsd сводится к построению списков кон-
одному компьютеру. В принципе NUT способен поддержи- троля доступа (ACL), которые сохраняются в файле <prefix>/
вать и более сложные системы, когда один UPS контроли- upsd.conf.
рует несколько машин. В такой ситуации компьютер, к ко-
торому подключен ИБП, является главным (master) и отве- Ëèñòèíã 2. Ïðèìåð ôàéëà upsd.conf
чает за своевременное оповещение и выключение подчи- ACL local 127.0.0.1/32
ненных (slave) систем. ACL all 0.0.0.0/0
Конфигурационные файлы NUT хранятся в каталоге ACCEPT local
<prefix>/etc. Если на предыдущем этапе вы выполнили ко- REJECT all

№5, май 2005 17


администрирование
Данный файл определяет два ACL-списка: «local» input.frequency: 50.1
(127.0.0.1/32) и «all» (все узлы Сети). Директива ACCEPT input.voltage: 208.3
output.voltage: 209.4
предписывает upsd принимать соединения с локального ups.load: 012
ups.mfr: Ippon
хоста, а директива REJECT – пресекать любые попытки ups.model: universal driver
связи с узлов «all». Upsd просматривает эти директивы в ups.status: OL
ups.temperature: 25.0
порядке перечисления до тех пор, пока не будет найдено
совпадение, поэтому можно быть уверенным, что наш ИБП Здесь ups0 – название вашего ИБП, указанное в файле
будет «виден» только с компьютера, к которому он подклю- ups.conf, а localhost – имя узла, на котором запущен демон
чен. На мой взгляд, для мониторинга ИБП с других машин upsd. Вы можете видеть различные параметры состояния:
удобнее использовать SSH-соединение или веб-интерфейс, ! заряд батарей (battery.charge2);
а не прямое подключение к демону upsd. ! температуру (battery.temperature);
Далее, необходимо создать файл <prefix>/upsd.users, в ! режим работы (ups.status: OL означает «on-line/от сети»,
котором будут перечислены учетные записи пользователей, OB – «on battery/от батарей», LB – «low battery/батареи
обладающих правами администратора. Администраторы разряжены»);
могут изменять переменные состояния драйверов и пода- ! входное и выходное напряжение (input.voltage, output.
вать команды ИБП (например, «выключить звуковое опо- voltage).
вещение»).
Полный список характеристик зависит от драйвера ИБП.
Ëèñòèíã 3. Ïðèìåð ôàéëà upsd.users Удостоверившись в работоспособности данной конфи-
[admin] гурации, можно приступать к настройке upsmon – централь-
password = my_passwd ного клиентского демона, обеспечивающего реакцию сис-
allowfrom = local
actions = set темы на сигналы ИБП.
instcmds = all
upsmon master
Останов системы
Каждому пользователю соответствует отдельная секция В режиме работы от батарей, перед самым их истощени-
файла upsd.users. В данном случае мы определили учет- ем, ИБП генерирует сообщение «battery low». Upsmon по-
ную запись «admin» с паролем «my_passwd» (обратите вни- лучает и обрабатывает этот сигнал, вызывая команду
мание, что он хранится в открытом виде), разрешили дос- «shutdown -h now» или подобную ей для корректной оста-
туп с узлов из списка «local» и предоставили право уста- новки системы. Более детально данный процесс можно опи-
навливать значения переменных (actions = set) и выполнять сать следующей схемой:
любые команды (instcmds = all). Более полное описание фор- ! ИБП генерирует событие «battery low».
мата upsd.users можно найти в соответствующем разделе ! Upsmon получает данный сигнал и инициирует выклю-
руководства man. чение:
Поскольку файлы upsd.conf и upsd.users содержат кон- ! создается специальный файл POWERDOWNFLAG,
фиденциальную информацию в незашифрованной форме, являющийся признаком того, что система находит-
следует ограничить доступ к ним: ся в режиме отключения в связи с истощением ба-
тарей ИБП;
# chown root:nut upsd.conf upsd.users ! выполняется команда SHUTDOWNCMD;
# chmod 0640 upsd.conf upsd.users
! rc-сценарий использует проверку флага POWER-
Теперь все готово к тому, чтобы запустить демон upsd. DOWNFLAG для предотвращения «энергетической
гонки» (power race).
# <prefix>/sbin/upsd
Все упомянутые выше параметры задаются в файле
Если запуск прошел нормально (о чем свидетельствует <prefix>/upsmon.conf, который может иметь следующий вид:
переход upsd в фоновый режим), вы можете наконец-то
выполнить программу-клиент. В качестве «пробы пера» хо- Ëèñòèíã 4. Ïðèìåð ôàéëà upsmon.conf
рошо подойдет upsc, простая утилита, входящая в состав MONITOR ups0@localhost 1 admin my_passwd master
NUT и позволяющая просматривать текущие параметры
RUN_AS_USER nut
состояния ИБП. POWERDOWNFLAG /killpower
SHUTDOWNCMD "/sbin/shutdown -h now"
# upsc ups0@localhost

battery.charge: 97.1 Замечание. Внимательный читатель может спросить:


battery.voltage: 13.5 хватит ли у демона upsmon, выполняющегося от имени поль-
driver.name: ippon
зователя RUN_AS_USER (в нашем примере – nut) прав на
driver.parameter.port: /dev/ttyS0
driver.version: 2.0.0 запуск команды «shutdown»? Да, поскольку во время стар-
driver.version.internal: 0.02 та upsmon специально «резервирует» для этих целей про-

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

18
администрирование
Аппаратные аспекты
Непосредственное подключение UPS к системному блоку, что здесь опасна как перегрузка, так и «недогрузка». С пер-
как правило, не вызывает затруднений и подробно описы- вой из них все понятно: подключение к ИБП лазерного прин-
вается в документации к оборудованию. Проблема состоит тера, утюга или электрочайника приведет к срабатыванию
в другом: как настроить компьютер таким образом, чтобы предохранителя и немедленному отключению потребите-
он не только корректно выключался, но и автоматически лей тока. Никакого сигнала «battery low» в данном случае
включался? сгенерировано не будет, так что upsmon, upsd и прочие ока-
С точки зрения компьютера (не операционной системы!), жутся бесполезными.
истощение батарей ИБП есть сбой электропитания (UPS Как это ни удивительно, «недогрузка» зачастую грозит
просто перестает генерировать выходное напряжение, как теми же последствиями. В некоторые ИБП встраивается так
только процент разрядки превысит некоторый критический называемая «зеленая функция» (green function), предотвра-
порог). Современные версии BIOS позволяют настроить щающая работу на холостом ходу при малой внешней на-
реакцию системы на события такого рода. Соответствую- грузке. Опыт показывает, что ИБП Ippon Back Power Pro 400
щая опция обычно называется «After power fail» или подоб- не замечает «народный сервер» Celeron-600/256 RAM/HDD
ным образом и может быть найдена в самых различных без монитора. Симптомы, свидетельствующие о срабаты-
подменю. Заводская установка – «Off» означает «требует- вании «зеленой функции», таковы: слишком малое время
ся ручное включение». Измените ее на «On», и тогда ком- работы от аккумулятора (5-10 минут), несмотря на то, что
пьютер будет автоматически включаться при появлении на- подключенный к ИБП компьютер имеет небольшую мощ-
пряжения на входных клеммах блока питания. Поскольку ность; некорректный останов ОС при условии наличия пра-
ИБП, переходя в режим работы «от сети», сразу же подает вильно настроенной системы слежения (NUT или подобной).
ток на все обслуживаемые устройства, от администратора Для устранения «неполадки» можно обратиться в сервис-
больше не требуется никаких настроек. ный центр или же решить проблему с другого конца – по-
Другим важным аспектом является мощность нагрузки. высить общую мощность, например, подключив к компью-
Памятуя поговорку «все крайности плохи», можно сказать, теру дополнительные жесткие диски.

цесс, работающий с привилегиями суперпользователя. Уг- несмотря на то, что батареи ИБП истощены), мы подо-
роза для безопасности системы здесь невелика, поскольку зреваем «энергетическую гонку» и принудительно пе-
сетевое взаимодействие и прочая активность upsmon про- резагружаем систему.
исходит в другом процессе. При возникновении критичес-
кой ситуации непривилегированный процесс-потомок сооб- Для проверки флага лучше использовать не стандарт-
щает об этом «дремлющему» родителю, который и выпол- ные средства bash (оператор -f), а специальный параметр
няет команду SHUTDOWNCMD. командной строки утилиты upsmon, -K. В данном случае код
Директива MONITOR задает ИБП, за которым будет завершения upsmon будет равен EXIT_SUCCESS (0), если
наблюдать upsmon (в нашем примере – ups0@localhost) и флаг присутствует и EXIT_FAILURE в противном случае. Это
реквизиты пользователя. Поскольку последние содержат- обеспечивает более надежное функционирование сценария.
ся в файле upsmon.conf в открытом виде, необходимо сно-
ва позаботиться об ограничении доступа (см. выше). Ëèñòèíã 5. rc-ñöåíàðèé, îáåñïå÷èâàþùèé çàùèòó îò power race
«Энергетической гонкой» называется ситуация, когда /usr/local/ups/sbin/upsmon -K >/dev/null 2>&1
ИБП переходит в режим работы от сети вскоре после гене- if [ $? = 0 ]; then
KILLPOWER=1
рации сигнала «battery low», в процессе останова системы. else
В этом случае компьютер, настроенный на автоматическое KILLPOWER=0
fi
включение после сбоя электропитания (см. раздел «Аппа- # ...ðàçìîíòèðîâàíèå ÔÑ, îñòàíîâ äåìîíîâ
ратные аспекты») окажется заложником собственной «ос- if [ $KILLPOWER = 1 ]; then
echo "Swithching UPS off, please wait"
торожности», ведь фактически никакого сбоя не произой- /usr/local/ups/bin/upsdrvctl shutdown
дет! Мне приходилось слышать, что некоторые модели UPS sleep 120
разрешают данную проблему автоматически, однако, «во # Power-race workaround
избежание» предлагаю вам использовать следующий ме- echo “Hmm... Still alive?!”
reboot -d -f -i
ханизм, обеспечивающий корректную работу системы даже fi
в случае «глупого» ИБП (см. листинг 5):
! В начале своего выполнения rc-сценарий, отвечающий В рамках одной статьи сложно осветить все возможно-
за останов системы (/etc/rc.d/halt, rc.halt и т. п.) прове- сти такого богатого инструмента, как NUT. «За бортом» ос-
ряет наличие флага POWERDOWNFLAG. тались и веб-приложения, и поддержка SSL, и многие дру-
! Если флаг присутствует, сценарий выполняет все дей- гие вопросы. Однако, я надеюсь, изложенных здесь сведе-
ствия, необходимые для корректного завершения рабо- ний будет достаточно, чтобы понять, нужен ли вам NUT, по-
ты (выгружает демоны, размонтирует файловые систе- лучить представление о его архитектуре и базовые навыки
мы и т. п.), после чего засыпает на непродолжительное конфигурирования. За более подробной информацией вы
время, например на 2-3 минуты. всегда сможете обратиться к страницам руководства и спра-
! Если по истечении этого времени rc-сценарию верну- вочной документации, распространяющимися вместе с ис-
лось управление (т.е. компьютер остался включенным, ходными текстами NUT. Успехов!

№5, май 2005 19


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

ЧТО ВАЖНО ЗНАТЬ ОБ IP-ТЕЛЕФОНИИ?

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

МИХАИЛ ПЛАТОВ
20
администрирование
Пять причин использовать IP-телефонию Данное направление систем IP-телефонии очень хоро-
С помощью IP-телефонии вы сможете: шо развито производителями оборудования. Наиболее
1. Сократить расходы на междугородные и междуна- известными поставщиками являются такие компании
родные переговоры. Один из наиболее распространен- как, Cisco Systems, Avaya, Nortel Networks.
ных вариантов использования IP-телефонии. Связь че- 3. Получить дополнительные возможности, не свой-
рез IP получается дешевле по ряду причин. Во-первых, ственные обычным телефонным сетям: сlick2Dial –
в IP-телефонии используются широко распространен- возможность совершить звонок (например, менеджеру
ные (и дешевые) сети с коммутацией пакетов1 (в отли- продаж или в службу тех. поддержки) прямо с веб-сайта
чие от более дорогостоящих сетей с коммутацией кана- компании, голосовые авто-информаторы на основе IVR
лов, применяемых в традиционной телефонии). Во-вто- (Interactive Voice Response), аудио- и видеоконференций,
рых, благодаря использованию голосовых кодеков (во- голосовую почту и историю пропущенных звонков через
кодеров, voice coders) достигается существенное сжа- web, определение присутствия абонента в сети и т. д.
тие речевой информации. Так, при передаче голосово- 4. Обеспечить «дешевую связь» в пределах зон Wi-Fi.
го потока в системах цифровой телефонии2 требуется Пользователь, находящийся в пределах беспроводной
канал 64 кБит/с (ISDN). В системах IP-телефонии, при точки доступа 802.11 может применять VOIP (вместо
использовании наиболее популярных на сегодняшний сотовой связи)5.
день кодеков, требуется гораздо меньшая пропускная 5. Организовать сеансы аудиосвязи или связи типа точ-
способность (6-13 кБит/с). ка-точка через Интернет. Используя стандартное обо-
Можно выделить два наиболее популярных варианта рудование IP-телефонии, можно организовать сеанс
подключения к провайдерам междугородной и между- связи между пользователями Интернет (например, c ис-
народной телефонии: пользованием Microsoft NetMeeting) или соединить не-
! Через ТФОП (Телефонная сеть Общего Пользова- сколько географически отдаленных филиалов.
ния) – при подключении пользователь набирает «го-
родской» номер сервера IP-телефонии провайдера, Протоколы IP-телефонии
проходит аутентификацию (по pin-коду) и набирает На данный момент существует несколько стандартизован-
нужный ему номер. Чтобы пользоваться IP-телефо- ных протоколов, на базе которых строятся системы IP-те-
нией по этой схеме, достаточно иметь обычный го- лефонии. Рассмотрим некоторые из них более подробно.
родской номер.
! С помощью специальных «шлюзов» – в этом случае Протокол H.323
пользователь приобретает специальное устройство – Автором данного стандарта является организация ITU-T
шлюз IP-телефонии, с помощью которого получает (International Telecommunication Union). Существует несколь-
возможность совершать звонки без использования ко версий стандарта H323. Первая была выпущена в 1996
ТФОП (через интернет-канал, предоставляемый про- году. Последующие являются эволюционным развитием
вайдером). В место шлюзов также можно применять (большая гибкость, масштабируемость и надежность). Пос-
программные (в том числе и бесплатные) и аппарат- ледняя на данный момент версия 4 появилась в 2000 году.
ные IP-телефоны. На данный момент протокол H.323 является стандартом де-
2. Построить корпоративную телефонную сеть. В дан- факто для междугородной и международной телефонии.
ном случае для ведения телефонных разговоров в рам- Если вы захотите воспользоваться предложением одного из
ках предприятия используется внутренняя IP-сеть3. Од- транснациональных операторов IP-телефонии, то придется
нако в минимальном варианте такие системы использу- обратить внимание именно на H.323. Стандарт определяет
ются достаточно редко4 и как правило, корпоративные си- базовую архитектуру сети передачи мультимедиаданных:
стемы IP-телефонии также решают следующие задачи:
! обеспечение «мобильности» внутренних пользова-
телей;
! организация связи между географически отдален-
ными филиалами;
! объединение телефонной емкости филиалов в еди-
ный номерной план;
! организация аудио- и видеоконференций;
! построение центров обработки вызовов (call-центров). Ðèñóíîê 1. Âîçìîæíàÿ ñòðóêòóðà H323-ñåòè

1
Необходимо отметить, что, хотя в сетях IP-телефонии для передачи голоса и используется IP-сеть, она не является IP-сетью в обычном
понимании. Так, в голосовых IP-сетях особое внимание уделяется обеспечению гарантированного качества обслуживания QoS (DiffServ,
IntServ, MPLS), хотя это вовсе не означает, что в IP-сетях без QoS IP-телефония не будет работать.
2
Которые в виду своей стоимости так и не «ушли в массы».
3
Вариант может быть особенно интересен предприятиям, еще не имеющим коммуникационной инфраструктуры, т.к. при использовании IP-
телефонии можно полностью отказаться от прокладки «двойной проводки».
4
Все-таки основным преимуществом корпоративных сетей является функциональность, а не стоимость.
5
Инсталляции, работающие по такому принципу, существуют в некоторых западных образовательных учреждениях.

№5, май 2005 21


администрирование
К числу объектов стандарта H.323 относятся: «сессий» между одним или несколькими участниками. По-
! Терминал (Terminal). нятие «сессии» в протоколе SIP достаточно широкое. Под
! Шлюз (Gataway). «сессией» могут подразумеваться не только телефонные
! Устройство управления конференциями (Multipoint звонки, но и передача данных, конференции, децентрали-
Control Unit – MCU). зованные игры и т. д.
! Привратник (GateKeeper). SIP регламентирует только процедуру установки соеди-
нения между устройствами, поэтому обычно наряду с SIP
Терминал используется протокол передачи информации. В случае IP-
Конечное H.323-устройство пользователя. Может быть как телефонии в качестве таких протоколов выступают RTP8 и
программным (приложение на компьютере), так и аппарат- SDP9.
ным (телефонный аппарат). Терминалам могут назначать- Разработкой протокола SIP занимался комитет MMUSIC10
ся один или несколько псевдонимов (номера телефонов, организации IETF, поэтому в отличие от протокола H.323
названия). (разработанного телефонистами из ITU-T) протокол SIP яв-
ляется более интернет-ориентированным и предназначен
Шлюз для предоставления несколько других (по сравнению с
Устройство, предназначенное для сопряжения разнородных H.323) услуг.
сетей. Так, рекомендации ITU-T содержат информацию по Ключевые возможности протокола SIP:
сопряжению H.323-устройств с устройствами сетей ISDN, ! Мультимедийность.
ATM и ТФОП. ! Персональная мобильность пользователей. Пользова-
тели могут перемещаться без ограничений в пределах
Привратник сети, поэтому услуги связи должны предоставляться им
Основной управляющий6 элемент сети H.323, координиру- в любом месте этой сети. Пользователю присваивается
ющий и контролирующий работу всех ее устройств. К его уникальный идентификатор, а сеть предоставляет ему ус-
задачам относятся: луги связи вне зависимости от того, где он находится.
! аутентификация; ! Масштабируемость сети. Она характеризуется в первую
! авторизация; очередь возможностью увеличения количества элемен-
! разрешение имен; тов сети при её расширении. Серверная структура сети,
! управление пропускной способностью, используемой построенной на базе протокола SIP, в полной мере от-
H.323-устройствами. вечает этому требованию.
! Открытость и простота. По убеждению авторов и спе-
Как правило, сеть H.323 разбивается на «зоны», в каж- циалистов, SIP позволит наполнить решения и продук-
дой из которых присутствует привратник, управляющий вве- ты новыми сервисами и возможностями. Что касается
ренными ему устройствами. Для обеспечения большей на- простоты, то достаточно сказать, что все используемые
дежности одну «зону» могут обслуживать несколько при- в SIP сообщения имеют текстовый формат и поддержи-
вратников, тогда один из них называется «главным», а ос- вают вложение любых типов данных. Поэтому голосовое
тальные – «альтернативными». Помимо управления и цен- соединение может сопровождаться обменом данными
трализованного разрешения имен абонентов, привратники между приложениями. Так, разговор по протоколу SIP
также могут предоставлять дополнительные возможности, свободно дополняется передачей данных от одного або-
например, выполнять функции прокси-сервера для сигналь- нента другому, например, электронной визитки, цифро-
ных и медиаданных. вых фотографий или даже файла MP3.
! Клиент-серверная архитектура.
MCU7 ! Возможность реакции на события. Так, клиент может
Предназначено для организации конференций с числом «подписаться» на определенное событие (например, об-
участников более 3. Оно координирует передачу управля- новление статуса пользователя), и как только оно на-
ющей (и опционально мультимедийной) информации меж- ступит, сервер вышлет соответствующее обновление.
ду участниками конференций. Работу с устройствами H323
мы рассмотрим на примере привратника GNU GateKeeper Протокол SIP во многом схож с широко используемым
и открытых программных телефонов. протоколом HTTP, который также можно считать сигналь-
ным (клиенты запрашивают у сервера нужные им докумен-
Протокол SIP ты). При установке соединения параметры сессии описы-
SIP – Session Initiation Protocol (протокол управления сесси- ваются в соответствии с SDP и вместе с заголовками про-
ями) – используется для создания, изменения и разрыва токола SIP передаются клиенту. Коды ответов протокола

6
Для сетей сетей H323 наличие «привратника» не является обязательным. В этом случае H323-устройства работают в режиме Peer to Peer
и самостоятельно разрешают имена в IP-адреса.
7
Устройство управления конференциями.
8
Real-Time Protocol – для передачи «голоса».
9
Session Description Protocol – для описания параметров сессии.
10
Multiparty Multimedia Session Control.

22
администрирование
SIP также очень похожи на стандартные коды протокола шения. Могут использоваться для более интеллектуаль-
HTTP. В случае удачного ответа клиенту посылается код ной маршрутизации (перенаправление вызовов, голо-
200, адрес не найден (404), ошибка авторизации (403) и др. совая почта, дополнительная обработка вызовов и т. д.),
Клиенты SIP-сети идентифицируются по универсальным могут самостоятельно повторно пересылать пакеты (в
идентификаторам SIP-URI, внешне похожим на адреса элек- случае если они были потеряны при передаче). Платой
тронной почты: sip:platov@cs.vsu.ru. Таким образом, имя за дополнительные возможности является более слож-
клиента SIP состоит из персональной части (до знака @), ная реализация и большие требования в вычислитель-
идентифицирующей пользователя, и доменной части (пос- ной мощности сервера (из-за необходимости хранить
ле @), определяющей, например, организацию. В качестве информацию о каждой SIP-сессии). Наиболее популяр-
доменной части возможно использование DNS-имени. ным Open Source stateful прокси-сервером, работающим
Протокол SIP выделяет следующие типы объектов сети: по протоколу SIP, является Asterisk – The Open Source
! Агенты. Linux PBX13.
! Серверы регистрации.
! Серверы перенаправления.
! Прокси-серверы.

Агенты
Под агентами подразумеваются конечные устройства поль-
зователя (телефоны, программные телефоны, мобильные Ðèñóíîê 3. Òèïè÷íàÿ ñõåìà èñïîëüçîâàíèÿ SIP-ïðîêñè-ñåðâåðà
телефоны, наладонные компьютеры, шлюзы в ТФОП, сис- Если пользователь A1@a.com захочет позвонить пользо-
темы голосовых меню и т. д.) вателю B1@b.com, то он передаст запрос INVITE B1 свое-
В составе агентов выделяются две логические состав- му прокси-серверу, который перенаправит вызов прокси-
ляющие: серверу b.com абонента B1.
! агент-клиент (UAC – user agent client) – посылает запро-
сы и получает ответы; Сервер регистрации (REGISTRAR)
! агент-сервер (UAS – user agent server) – принимает зап- Перед работой в сети каждое устройство должно зарегист-
росы и посылает ответы. рироваться с помощью специального сообщения REGISTER.
При этом клиент сообщает серверу свое имя в формате:
IP-адрес, номер порта, SIP-URI и пароль доступа. В случае
успешной регистрации информация о клиенте заносится в
специальную базу данных (используется в дальнейшем для
нахождения клиента) и клиенту высылается сообщение:
«200 OK». С определенной периодичностью этот процесс
повторяется, таким образом обеспечивается «актуальность»
данных о клиентах. Как правило, серверы REGISTRAR со-
вмещаются с прокси-серверами. PBX Asterisk, рассмотре-
нию которого будет посвящена отдельная статья, в этом от-
Ðèñóíîê 2. Âçàèìîäåéñòâèå UAC è UAS ношении не является исключением и может выполнять как
Ввиду того, что большинству устройств необходимо как функции прокси-сервера, так и сервера регистрации.
передавать, так и принимать данные, в реальных устрой-
ствах присутствует как UAC, так и UAS11. SCCP (Skinny Client Control Protocol)
Данный протокол является корпоративным. Он разработан
Прокси-серверы компанией Cisco Systems для организации работы IP-теле-
Являются неотъемлемой частью SIP-сети, отвечают за мар- фонов Cisco под управлением ПО Cisco Call Manager, явля-
шрутизацию сообщений, а также аутентификацию и авто- ющегося в том числе и шлюзом в сети H.323. Идея подхо-
ризацию пользователей. В стандарте определяется два типа да, лежащего в основе разработки протокола SCCP, зак-
SIP-прокси-серверов: лючалась в переносе логики обработки H.323 соединений
! Без учета состояния (stateless). Такие серверы не от- из конечных устройств в ПО Cisco Call Manager. Таким об-
слеживают состояния SIP-сессий и передают сообще- разом, существенно упрощалась (и удешевлялась) реали-
ния, используя внутренние правила маршрутизации. Их зация конечного устройства клиента.
основное применение – распределение нагрузки и мар-
шрутизация. Open Source-примером stateless SIP-про- Как оценить качество систем
кси-сервера является SER12 (SIP Express Router). IP-телефонии
! С учетом состояния (stateful). Отслеживают состояние Существуют различные методики оценки качества систем
каждой SIP-сессии от момента ее создания до завер- IP-телефонии. Наиболее известные из них MOS (Mean

11
Более детально к вопросу о UAC и UAS мы вернемся при рассмотрении тестовых утилит для SIP.
12
http://www.iptel.org.
13
http://www.asterisk.org.

№5, май 2005 23


администрирование
Opinion Score или «усредненная субъективная оценка экс- варительное накопление пакетов перед их дальнейшей
пертов»), представляющая собой численную оценку, харак- передачей декодеру. Очевидно, что буфер дрожания
теризующую «качество» сети телефонии. Идея MOS очень также вносит некоторую задержку в процесс передачи
проста: специально сформированной группе людей предо- голоса, поэтому желательным является использование
ставляют возможность воспользоваться системой связи и такого размера буфера дрожания, которое, с одной сто-
просят поставить оценку от 1 (ужасно) до 5 (отлично)14. Ус- роны, обеспечивает приемлемое качество речи, а с дру-
редненные данные такого исследования и называются MOS. гой – минимизирует общее значение бюджета двусто-
Кроме того, для оценки качества речи также существуют и ронней задержки до значения 300 мс.
объективные методы, например, рекомендация ITU-T G.113 ! Потеря пакетов. Как известно, в сетях Ethernet допус-
(измерение качества речи системы телефонии на основе кается потеря пакетов. Влияние потери пакетов на ка-
искажений, вносимых каждым ее элементом), PSQM (оцен- чество речи определяется размером пакета15, а также
ка качества работы вокодеров), PESQ (развитие PSQM для используемым алгоритмом сжатия речи16. Речевая ин-
оценки сетей телефонии). Не вдаваясь в детали методов формация в большей степени устойчива к пропаже оди-
оценки качества, давайте лучше рассмотрим основные па- ночных пакетов, нежели целых серий. В любом случае,
раметры, оказывающие на него непосредственное влияние: согласно рекомендации ITU-T, для нормальной работы
! используемый кодек; систем IP-телефонии допускается потеря не более 1%
! наличие/отсутствие «эха»; пакетов, в противном случае ухудшение качества речи
! параметры каналов связи. будет заметно. Для улучшения качества в условиях заг-
руженных сетей можно использовать QoS либо, если па-
Все используемые на данный момент в IP-телефонии кеты теряются из-за природы самой сети (например,
кодеки обеспечивают «сжатие с потерями». В зависимости беспроводная сеть), то для улучшения качества можно
от используемых алгоритмов эти «потери» могут быть по- использовать более помехоустойчивый кодек или умень-
разному различимы «на слух» именно в этом аспекте рас- шать размер кодируемого кадра.
сматривается влияние кодеков на качество речи.
При ведении разговоров на больших расстояниях начи- Кодеки IP-телефонии
нает проявляться эффект «эха». Существуют различные За все время существования данного направления было
алгоритмы, призванные с этим бороться (G.165, G.168, разработано большое количество кодеков, используемых
G.168 2000, и др.), и в подавляющем большинстве устройств для передачи аудио- и видеоинформации в системах IP-те-
какой-нибудь из них обязательно должен присутствовать. лефонии. Наиболее популярными (по количеству пользо-
Приведу три основных параметра канала связи, оказы- вателей и поддержки в конечных устройствах) в настоящее
вающих воздействие на качество систем телефонии: время являются:
! Задержка (latency). При передаче голоса или видео су- ! G711 – стандартизованный ITU-T кодек, используемый в
ществуют определенные требования к максимально до- устройствах ISDN. Требуемая пропускная способность –
пустимой задержке. Различные исследования показы- 64 кбит/сек. Существуют две разновидности кодека a-
вают, что для ведения нормального диалога необходи- law и u-law, отличающиеся алгоритмами кодирования.
мо, чтобы «двойная задержка» при передаче голоса не Кодек поддерживается практически всеми устройства-
превышала 250-300 мс (бюджет задержки). При превы- ми IP-телефонии.
шении этого порога участники начинают испытывать ! G729 – стандартизованный ITU-T кодек, предназначенный
дискомфорт и стремятся закончить разговор. Таким для передачи речи с «хорошим качеством» при использо-
образом, для ведения комфортного разговора односто- вании небольшой пропускной способности (8 кбит/сек).
ронняя задержка не должна превышать 150 мс (задер- Существуют две популярные (и несовместимые между
жка канала + алгоритмическая задержка кодека), что собой) версии данного стандарта: Annex A (более «про-
совпадает с рекомендацией ITU-T G.114. Для уменьше- стая» схема кодирования) и Annex B (с использованием
ния задержки, вносимой сетью, необходимо использо- алгоритмов сжатия пауз). По субъективным оценкам,
вать QoS (Quality of Service) данный кодек обладает качеством лучшим, чем у G.723,
! Джиттер (jitter). Ethernet является сетью с коммутаци- но худшим, чем G71117. Поддерживается практически
ей пакетов. В общем случае это означает, что пакеты всеми производителями оборудования. При коммерчес-
могут быть получены клиентом не в том порядке, в ка- ком использовании требуется лицензия.
ком они были ему отправлены (для доставки пакетов ! G723.1 – кодек, стандартизованный ITU-T. Отличитель-
могли использоваться различные маршруты). Что в та- ной особенностью является возможность работы при
ком случае делать декодеру? Для решения таких про- очень низком потоке (5.3, 6.3 кбит/сек). По субъектив-
блем используются специальные «jitter buffers» (сглажи- ными оценкам, обладает самым плохим качеством (сре-
вающий буфер). Задачей этих буферов является пред- ди рассматриваемых кодеков) речи. Поддерживается

14
На практике MOS редко превышает 4.5.
15
Чем больше размер пакета, тем сильнее скажется его пропажа на восстановленном голосе.
16
Различные алгоритмы обладают разной степенью устойчивости к пропаже пакетов (при восстановлении используется информация «со-
седних» кадров).
17
Эти данные также подтверждаются оценкой MOS.

24
администрирование
значительной частью устройств IP-телефонии. При ком- таким интерфейсом могут подключаться обычные те-
мерческом использовании требуется лицензия. лефонные аппараты, факсы и другие абонентские уст-
! GSM (RPE-LTP) – голосовой кодек, разработанный для ройства. Фактически, интерфейс FXS это то, что прихо-
использования в системах сотовой связи стандарта дит к нам по телефонному кабелю от городской или
GSM. При кодировании кадра используется информа- мини-АТС. В задачу устройств, реализующих этот ин-
ция предыдущего кадра, кодирование осуществляется терфейс, входят: генерация сигнала готовности АТС (гу-
блоками по 20 мс со скоростью 13 кбит/с. Поддержива- док в линии), сигналов вызова абонента и т. д.
ется производителями оборудования, в основном в шлю- ! FXO (Foreign eXchange Office) – аналоговый интерфейс
зах между сотовыми и VoIP-сетями. абонентских устройств телефонных станций. Устройства
! iLBC (Internet low bitrate codec) – открытый (не требу- с таким интерфейсом подключаются к интерфейсу FXS.
ются лицензионные отчисления) голосовой кодек. Пред- Так те же самые факсовые аппараты, телефоны, моде-
назначен для кодирования с потоком 13.33 кбит/сек (при мы реализуют интерфейс FXO. Существует такое про-
размере кадра 30 мс) и 15.20 кбит/сек (при размере кад- стое правило – если есть провод, соединяющий два ана-
ра 20 мс). По субъективным оценкам экспертов, каче- логовых устройства телефонии, то с одной стороны это-
ство речи данного кодека превышает G.729A. Кроме го провода должен быть FXS (АТС), а с другой – FXO
того, кодек более устойчив (по сравнению с g729) к по- (телефон). Таким образом, шлюзы с интерфейсом FXO
тере кадров, что позволяет эффективно использовать подключаются вместо телефона. С их помощью можно
его при организации сеансов связи через сеть Интер- организовать связь с ТФОП или предоставить доступ к
нет. Примером этому является популярная сеть IP-те- IP-телефонии, используя «внутренние» (более дешевые)
лефонии – Skype18. Поддерживается ограниченным чис- линии мини-АТС. Так как шлюзы FXO фактически «эму-
лом производителей оборудования. лирует телефон», зачастую для них бывает необходи-
ма настройка «отбоя». Для того чтобы шлюз «клал труб-
Сравнительные характеристики кодеков приводятся в ку», нужно научить его понимать сигнал «занято» той
таблице: мини-АТС, к которой он подключен.
Òàáëèöà. Îñíîâíûå ïàðàìåòðû êîäåêîâ IP-òåëåôîíèè

Ðèñóíîê 4. Cîïðÿæåíèå ïîðòîâ FXO è FXS


! E1 – цифровой интерфейс, используемый для создания
Таким образом, по показателю качества кодеки можно высокоскоростных магистралей. В цифровом потоке E1
расположить следующим образом (в порядке ухудшения ка- имеется 32 канала (2 из них служебные) по 64 кБит21.
чества): G711, iLBC, G729, gsm, G723. По используемой про- Таким образом, используя 1 поток E1, возможно орга-
пускной способности (в порядке увеличения:) G723, iLBC, низовать до 30 одновременных телефонных разговоров.
G729, GSM, G711. В IP-телефонии такие интерфейсы часто используются
для организации связи с ТФОП или для организации
Интерфейсы телефонии связи между АТС. В каналах E1 может использоваться
Наиболее часто используемым оборудованием в IP-теле- различная сигнализация (CAS, SS7, R2, R1.5, Q.931), и
фонии являются шлюзы. Как было сказано выше, задачей при подключении устройств по E1 это необходимо учи-
шлюза является сопряжение «обычных» телефонных сетей тывать.
с IP. И если с одной стороны этого шлюза всегда будет IP,
то количество интерфейсов с другой стороны запросто мо- Заключение
жет поставить в тупик неподготовленного человека. Попро- Итак, после того как мы получили представление об основ-
буем развеять эту неопределенность и рассмотрим наибо- ных протоколах и кодеках, используемых в IP-телефонии,
лее известные «телефонные» интерфейсы: можно приступить к практической части – рассмотрению
! FXS (Foreign eXchange Subscriber) – аналоговый ин- конкретных программ и устройств, реализующих эти про-
терфейс телефонных станций. К голосовым шлюзам с токолы. Об этом читайте во второй статье цикла.

18
Бесплатная для звонков компьютер-компьютер.
19
Некоторые кодеки поддерживают несколько размеров пакетов.
20
При передаче через Ethernet к пакет «обрастает» различными заголовками (MAC, IP, RTP). В даной колонке приводится суммарная про-
пускная способность (без сжатия заголовков RTP, удаления пауз и потерь при передаче). В таблице приводятся данные для одного госо-
лового канала, в то время как при сеансе их обычно 2 (прямой и обратный).
21
Кроме Е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.
Сегодня более подробно рассмотрим
способы доставки почты до самого
почтового сервера, а также основные
настройки безопасности. Правильное
понимание этих принципов – основа
успешного внедрения собственного
почтового сервера.

РОМАН МАРКОВ
Выбираем способ доставки актуально (низкая исходящая скорость канала, высокая сто-
исходящей почты имость исходящего трафика). Дело в том, что MDaemon, яв-
В меню «Setup → Primary Domain», закладка «Delivery», ука- ляясь полноценным почтовым сервером, имеет возможность
зывается способ отправки писем нашим почтовым серве- прямой отправки писем адресатам по протоколу SMTP. Этот
ром во внешний мир. процесс абсолютно стандартен, однако иногда становится
«Always send every outbound email to the server specified непонятным для начинающих администраторов, которые кон-
below» – всегда отправлять исходящие сообщения на сер- фигурируют почтовый сервер впервые. При использовании
вер, указанный в поле «Mail server». Данную опцию предпоч- SMTP-сервера провайдера происходит отсылка одной копии
тительно использовать при большом количестве адресатов письма, независимо от количества указанных в нем получа-
в исходящих сообщениях и слабых ресурсах почтового сер- телей, а доставкой конечным адресатам занимается уже
вера, а также для экономии исходящего трафика, если это именно сервер провайдера, поэтому этот процесс обычно

26
администрирование
скрыт от конечных пользователей. В случае прямой отправ- нию выберите опцию «Click here to configure how undeliverable
ки писем сервером MDaemon, каждая копия письма для ука- mail is handled».
занных получателей отправляется отдельно, так как достав-
ляется прямо на почтовый сервер адресата (согласно полу- Настраиваем интегрированный
ченной от DNS-сервера MX-записи для домена получателя). антивирус
Поэтому исходящий трафик от одного письма для 50 адре- Устанавливаем интегрируемый в MDaemon антивирус. Ска-
сатов, отправленного через сервер провайдера, будет ра- чиваем дистрибутив оттуда же, откуда загружали сам
вен размеру этого письма, а при прямой доставке на серве- MDaemon (http://www.altn.com/download) и запускаем файл.
ра получателей – 50-кратному размеру этого письма. Поэто- В окне мастера выбираем язык, а также путь установки.
му если вы осуществляете рассылки больших объемов ин- Можно, например, создать папку антивируса внутри самой
формации для своих подписчиков (например, ежедневные папки MDaemon. Инсталлятор автоматически останавлива-
прайс-листы), а исходящая скорость канала мала, или вы ет почтовый сервер, копирует нужные файлы и предлагает
оплачиваете исходящий трафик, опция «Always send every перезапустить MDaemon уже с интегрированным антиви-
outbound email to the server specified below» будет для вас русом. Соглашаемся с предложением мастера и после за-
оптимальным решением. Минусом этого метода является пуска сервера регистрируем наш антивирусный продукт.
отсутствие возможности проанализировать протокол достав- Его регистрация не требует дополнительной активации и
ки сообщения с конечным сервером получателя, так как наш осуществляется вводом серийного номера. Меню «Help →
почтовый сервер будет записывать только протокол обмена About MDaemon → Antivirus». Вводим в данной закладке вы-
с SMTP-сервером провайдера. данный нам при покупке серийный номер и перезагружаем
В поле «Mail server» указывается SMTP-сервер вашего почтовый сервер («Пуск → MDaemon → Stop MDaemon →
провайдера (или любой другой сервер, позволяющий осу- Start MDaemon»). После установки антивирус может запус-
ществлять ретрансляцию почты). Если данный сервер тре- тить процедуру автоматического обновления. Если в этот
бует аутентификации пользователя при отправке, укажите момент ваш компьютер имеет подключение к Интернету,
учетные данные для аутентификации в поле «Access to the то новые базы будут автоматически установлены.
above mail server requires a log in». Если SMTP-сервер про- Сразу же настроим параметры антивируса: период про-
вайдера предъявляет требование проверить существующий верки обновлений, режим сканирования, действия при об-
POP3-ящик для доступа к отправке почты, укажите пара- наружении вируса или запрещенного вложения. Меню
метры этого ящика, кликнув по опции «Access to the above «Security → Antivirus». На основной закладке («Antivirus»)
mail server requires a POP mailbox check». выбираем «Enable Antivirus scanner». Если необходимо,
«Try direct delivery but send problem emails to the server здесь же можно задать отправителей/получателей, письма
specified below» – наиболее предпочтительный способ дос- которых сканироваться не будут. В секции «Scanner
тавки ваших писем, если предыдущие замечания не повли- Configuration» настраиваются действия, которые будут пред-
яют на экономические и качественные показатели почто- приниматься к инфицированным письмам.
вой системы. То есть если исходящая скорость канала ве- Наиболее универсальное решение – попытаться выле-
лика, а исходящий трафик бесплатен (дешев). При выборе чить зараженное вложение, а при неудаче – удалить его
данного способа доставки почтовый сервер будет пытать- («Clean the infected attachment»). Можно помещать заражен-
ся отправить почту напрямую каждому адресату, исполь- ные вложения в карантин, сразу удалять их, а также полнос-
зуя данные его MX-записи, а в случае неудачи (например, тью удалять содержащие их письма. Опция «Quarantine
отсекание почты от отправителя, IP-адрес которого не имеет messages that cannot be scanned» перемещает в карантин те
обратной DNS-записи, соответствующей его почтовому сообщения, которые не получилось проверить. В противном
домену) – на указанный в поле «Mail-Server» хост. Преиму- случае такие вложения отрезаются. Здесь же можно отре-
щества способа заключаются в возможности анализа фай- дактировать сообщение, которое будет посылаться в каче-
лов протоколов обмена при прямой доставке писем для стве оповещения об обнаружении вируса. Рекомендуем до-
локализации проблемы на основе этих данных. бавить в сообщение по умолчанию (на английском языке)
«Always send all outbound email directly to the recipient’s несколько русских фраз в стиле: «В данном сообщении со-
mail server» – данная опция указывает, что MDaemon дол- держался вирус, который был удален. Нет причины для бес-
жен всегда доставлять письма только напрямую, не исполь- покойства – ваш компьютер защищен». В противном случае
зуя сервер провайдера. В случае невозможности доставить администратор вынужден будет получать множество жалоб
почту указанному адресату при существующей MX-записи от пользователей, у которых «обнаружен вирус!». При необ-
для него, MDaemon поставит такие письма в очередь систе- ходимости данное оповещение можно вообще отключить.
мы повтора (Retry Queue System) и будет предпринимать В закладке «Antivirus Updater» настроим ежечасную про-
повторные попытки доставки в соответствии с настройками верку обновлений антивирусных баз через Интернет (об-
удержания таких писем в этой очереди (по умолчанию – по- новляя базы реже, вы рискуете пропустить в свою сеть све-
стоянно в течение 60 минут, а затем раз в 240 минут в тече- жий вирус, описание которого уже добавлено в антивирус-
ние 5 дней). В случае невозможности доставки письма в те- ные базы). В этой закладке также можно просмотреть те-
чение первого периода пользователь получит об этом опо- кущее состояние версии антивирусного ПО и вирусных сиг-
вещение. После окончания 5-дневного срока пользователь натур. Опция «Activate Urgent Updates» позволяет вам под-
также получит уведомление о том, что его письмо по-пре- писаться на срочные критические обновления, которые бу-
жнему не доставлено. Для изменения настроек по умолча- дут высылаться на системную учетную запись домена. Для

№5, май 2005 27


администрирование
изменения расписания проверки обновлений нажимаем server does not relay mail for foreign domains» – главный пе-
кнопку «Scheduler», отмечаем все дни недели, устанавли- реключатель, запрещающий доставлять почту для чужих
ваем время «Every hour» и нажимаем «Add». К нашему рас- доменов. Обязательно установите его! Если флажок уста-
писанию добавится ежечасная проверка обновлений. Здесь новлен, то любые сообщения, которые не имеют в поле
же можно установить расписание обновлений баз Antispam- FROM: или TO: локального доменного адреса, будут отвер-
engine, позволяющих проводить анализ и помечать письма гаться. Однако этого недостаточно для спокойствия адми-
от отправителей, входящих в эти базы как спам. Данное нистратора. «Refuse to accept mail for unknown local users»,
обновление можно производить не чаще одного раза в сут- отвергает почту для несуществующих локальных адресов.
ки (что в принципе является достаточным интервалом). «Sender’s address must be valid if it claims to be from a local
На закладке «Admins → Attachments» задаются образ- domain» проверяет реальное существование ящика отпра-
цы вложений, которые запрещены к пересылке. Имеется вителя. Все три флажка необходимо установить. Оставши-
два варианта – разрешить только определенные файлы (лю- еся три флажка можно устанавливать при необходимости:
бые вложения, не удовлетворяющие этому условию, будут «Mail addressed to known aliases can always be relayed» по-
отрезаны) или запретить конкретные, разрешив остальные. зволяет отправлять почту на локальные алиасы к нело-
Второй способ предпочтительней. По современным кано- кальным почтовым ящикам, «Mail addressed to known aliases
нам безопасности рекомендуется запрещать пересылку can always be relayed» всегда разрешает перенаправлять
любых исполняемых файлов в оригинальном виде (при пе- почту, если она отправлена через аутентифицированную
ресылке их необходимо архивировать в неисполняемый вид, SMTP-сессию.
либо переименовывать). Поэтому запрет исполняемых фай- В закладке «Trusted Hosts» можно добавить IP-адреса
лов по маске устанавливается по умолчанию. Туда же для (диапазоны) и домены, на которые не будут действовать
примера добавлены некоторые файловые маски (например, правила запрета при отправке почты, однако делать это не
THE_FLY.*). Вы можете самостоятельно редактировать спи- рекомендуется из соображений безопасности.
сок разрешенных/запрещенных вложений, а также список Закладка «Tarpit Settings» позволяет анализировать и
адресов-исключений, почта с/для которых не будет прове- блокировать попытки массовых рассылок. Параметр «SMTP
ряться на наличие запрещенных вложений. Также можно RCPT tarpit threshold» задает количество адресов, на кото-
задать адреса администраторов Content Filter, которые бу- рые возможна отправка писем за одну сессию. Если это
дут получать уведомления об отсеченных вложениях. количество будет превышено, то каждый последующий
В закладке «Notifications» имеется возможность указать адрес будет обрабатываться с задержкой, указанной в па-
других получателей уведомлений о действиях антивирус- раметре «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-адрес, с которого про-
Защищаем SMTP-сервер изводилась отправка, имеет соответствующую запись в
от несанкционированного использования DNS. Установив флажки «Send 501…», вы можете получить
Для того чтобы предотвратить использование спамерами большое количество жалоб, связанных с невозможностью
нашего Relay-сервера (SMTP) необходимо настроить поли- отправить почту на ваш домен. MDaemon поддерживает
тику безопасности. Причем это рекомендуется сделать не- популярные антиспам-технологии, например такие, как SPF,
зависимо от того, какой способ получения почты для наше- Bayesian, SURBL. Разумеется, что стандартный опрос баз
го домена мы выбрали – прямую доставку по протоколу RBL (список редактируется) также присутствует.
SMTP или закачку от провайдера по POP3 (см. далее). Даже Далее в меню «Security → IP-Shielding → AUTH → POP
если подключение извне по порту TCP/25 запрещено бран- before SMTP» для полной защиты от несанкционированной
дмауэром, лучше настроить дополнительные параметры рассылки на закладке SMTP Authentication рекомендуется
безопасности. Итак, меню «Security → Relay → Trust → Tarpit включить следующие режимы (см. рис. 1).
→ Reverse Lookup…» ! «Authenticated senders are valid regardless of the IP they
Закладка «Relay Settings». Самый первый флажок «This are using» – при успешной авторизации пользователю

28
администрирование
Проверим наш сервер вручную на элементарные уязви-
мости, попробовав отправить письмо от пользователя
postmaster:

telnet mailserver 25

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


тся, а теперь «угадаем», что в системе есть пользователь
roman, и снова попробуем отправить:

telnet mailserver 25

Аналогично – ретрансляция почты запрещена без авто-


ризации пользователя. На ресурсах, подобных abuse.com,
Ðèñóíîê 1. Íàñòðîéêà çàùèòû îò íåñàíêöèîíèðîâàííîé ðàññûëêè есть тесты на open relay. Использовать их более правиль-
будет разрешено отправить письмо, даже если его IP- но, однако перед запуском такого теста необходимо убе-
адрес находится в черном списке. диться в элементарной защите.
! «Authenticated users are exempt from the POP before SMTP
requirement» – в случае прохождения авторизации от Веб-интерфейс
пользователя не потребуют проверить POP3-ящик перед MDaemon имеет очень полезный встроенный функционал
отправкой письма (при включенной опции «POP before для предоставления доступа к почтовым ящикам и адми-
SMTP»). нистративным функциям через веб-интерфейс – WorldClient
! «Authentication is always required when mail is from local и WebAdmin (WebAdmin скачивается с сайта Alt-N и уста-
accounts» – требовать аутентификацию даже от локаль- навливается отдельно). Минимальную настройку осуществ-
ных отправителей. ляем в меню «Setup → WorldClient». По умолчанию веб-сер-
! Флаг «Mail from ‘Postmaster’ alias requires an authenticated вер MDaemon использует порт 3000. Таким образом, для
session» обязует пользователя Postmaster проходить ав- получения доступа к почте через Web клиентам необходи-
торизацию (по умолчанию такой алиас всегда существу- мо набрать в строке адреса своего браузера ссылку вида:
ет, и если галка снята – данная учетная запись может http://mail.domain.com:3000. Вместо имени может выступать
использоваться для несанкционированной рассылки). IP-адрес, а если вы организуете на брандмауэре прохожде-
Обязательно установите этот флаг, так как при его от- ние пакетов на этот порт извне, ваши сотрудники смогут
сутствии ваш сервер смогут использовать спаммеры (это получать свою почту из любой точки земного шара, не нуж-
известная ошибка начинающих администраторов, настра- даясь в настройке почтового клиента – его заменит любой
ивающих MDaemon). По умолчанию в MDaemon письма браузер для просмотра веб-страниц. Для стандартизации
от пользователя postmaster принимаются и пересылают- запросов можно поменять порт на стандартный HTTP:80.
ся в любом случае – об этом знают спаммеры и ищут, где Тогда клиентам не придется указывать в строке адреса еще
неопытные настройщики упустили это. Если этот флаг и номер порта. После смены номера порта необходимо пе-
установить, то письмо от пользователя postmaster дан- резапустить сервис WorldClient – для этого служит кнопка
ного домена будет требовать SMTP-Auth, и если она бу- внизу закладки «Web Server». Здесь же настраивается ис-
дет некорректной, в приеме будет отказано. пользование календаря, однако его конфигурирование вы-
! «Authentication credentials must match those of the email ходит за рамки данной статьи. В закладке Options можно
sender» – данная опция принуждает пользователей ав- выбрать язык веб-интерфейса, тему оформления и формат
торизоваться только собственным именем, что предотв- даты для каждого из созданных доменов, а также настро-
ращает пересылку писем от других ящиков, авторизуясь ить дополнительные параметры. Будьте внимательны с оп-
при помощи локальных учетных данных. Это означает, что цией «Allow users to create new accounts…». Если устано-
допускается отправка писем только со значением FROM, вить это переключатель, то на веб-странице приглашения
совпадающим с использованным в аутентификации. MDaemon появится опция создания новой учетной записи
любым из пользователей, что может привести в лучшем
После включения SMTP-авторизации необходимо так- случае к бесконтрольному заведению пользователями, а в
же установить соответствующий переключатель в настрой- худшем – к использованию вас спамерами в качестве ано-
ках сервера исходящей почты на клиентах («сервер исхо- нимного Relay-сервера.
дящей почты требует авторизации») и задать авторизацию Примечание: некоторые стили оформления (например,
«как на сервере входящей почты – POP3». LookOut) корректно работают только с IE 6.0 и выше. В слу-

№5, май 2005 29


администрирование
чае необходимости получить доступ к почте при помощи запустить указанный bat-файл и затем удалить сообщение.
других веб-браузеров выберите в настройках личных пред- Таким образом, отправив со строго определенного ящика
почтений другой стиль – например, Standart. письмо на специальный ящик и указав в поле «Тема» спе-
циальное выражение, мы можем выполнить практически
Антиспам любое действие (например, запустить программу, которая
Помимо этого можно настроить встроенную антиспам-сис- сделает архив базы данных и отправит его по электронной
тему. Для этого в меню Security служат две опции: «Spam почте). Большое количество вариантов условий делает дан-
Blocker» и «Spam Filter». Следует быть также предельно ос- ный сервис удобным и полезным. Такое большое количе-
торожными с настройкой данных опций, так как чрезмер- ство условий необходимо, чтобы при получении любого
ное усердие или недопонимание некоторых функций могут другого письма на данный ящик указанное действие не вы-
отнести к спаму и заказанную пользователями корреспон- зывалось. Даже если кому-то удастся подобрать пароль к
денцию. В любом случае имеется возможность просто по- данному ящику, это ничего не даст: правила Content Filter
мечать письма как спам, продолжая их доставку пользова- может создавать только администратор почтовой системы.
телям. И только собрав отзывы и убедившись в приемле-
мом функционировании данной системы, можно отсекать Осуществляем обновление, перенос
такие письма. на другой сервер, создаем резервные
копии
Создаем правила сортировки Существует два пути. В любом случае не забывайте де-
В MDaemon имеются гибкие механизмы для сортировки лать резервную копию каталога MDaemon – его архивиро-
почты. Наиболее употребимым является Content Filter (меню вание и есть простейший путь к созданию полной резерв-
«Security → Content Filter»). По умолчанию уже имеется не- ной копии MDaemon (как уже говорилось выше – все на-
сколько правил – для отсечения фрагментированных сооб- стройки хранятся в текстовых файлах).
щений и пр. Первый способ: установка MDaemon поверх старой вер-
сии. Установщик сам произведет конвертацию старых ус-
тановок для новой версии (рекомендуется следующая пос-
ледовательность обновления очень старых версий: 3.х.х
обновляются до 4.х.х, затем до 5.х.х и, наконец, до 7.х.х).
Второй способ: установка MDaemon в новый каталог и пе-
ренос туда конфигурационных файлов старой версии, ко-
торые находятся в каталоге MDaemon\App и имеют расши-
рение *.dat, а также каталога Users. Перенос MDaemon на
другой сервер также прост: переносим всю папку MDaemon
и устанавливаем поверх новую (или такую же) версию для
создания системных привязок.

Подводя итоги
MDaemon – мощный корпоративный почтовый сервер с
большим набором разносторонних режимов и возможнос-
тей. К минусам можно отнести отсутствие штатной возмож-
ности интегрировать с ним антивирусные продукты других
Ðèñóíîê 2. Íàñòðîéêà ïðàâèë ñîðòèðîâêè производителей, кроме Kaspersky Labs. Помимо этого было
Здесь можно создать практически любое правило для бы полезным сделать более жесткими настройки безопас-
сортировки и произведения необходимых действий. Рас- ности по умолчанию (например, принудительная аутенти-
сматривать все правила мы не будем – они интуитивно по- фикация независимо от IP-адреса и пр.) К сожалению, даже
нятны. Для примера создадим гибкое правило для писем. в двух статьях невозможно описать настройку всех возмож-
«New Rule» – задаем интуитивно понятное имя для даль- ностей продукта. Например, мы не смогли более подробно
нейшего анализа правил. рассказать про более тонкое конфигурирование веб-интер-
Поле «Select Conditions For This Rule» – устанавливаем фейса, общую адресную книгу, использование календаря
флаги «If the FROM HEADER contains», «If the TO HEADER и планировщика GroupWare, антиспам-систему, настройку
contains» – «If the SUBJECT HEADER contains». Content-Filter, создание автоматической подписки на кли-
Затем в поле «Select Actions For This Rule» отмечаем ентскую рассылку, используя веб-сайт компании и многие
флаги «Send a note 1 to:», «Run a program…» и «Delete the другие возможности. Расположение всех файлов конфигу-
message». рации в текстовых файлах формата Plain-text открывает
Перейдем в третье поле – «Rule Description», в котором широкие возможности для конфигурирования сервера, не
зададим условия в созданном нами правиле. Укажем, что используя GUI-интерфейс, а также для написания скрип-
правило распространяется только на письма, содержащие тов автоматического конфигурирования. Если отзывы чи-
в полях FROM, TO и SUBJECT строго определенные значе- тателей покажут, что развитие темы будет интересным для
ния, укажем, что при получении таких писем необходимо них, мы постараемся найти возможность продолжить цикл
отсылать сообщение на определенный ящик, после этого статей про MDaemon.

30
bugtraq

Отказ в обслуживании в qmail Раскрытие данных в реализациях IPSec


Программа: qmail на 64-битных платформах. Опасность: Средняя.
Опасность: Средняя. Описание: Уязвимость позволяет удаленному пользовате-
Описание: Уязвимость позволяет удаленному пользовате- лю изменить IP-адрес источника пакета, расшифровать и
лю вызвать отказ в обслуживании приложения. перехватить потенциально важные данные. IPSec состоит
1. Целочисленное переполнение существует в функции из нескольких отдельных протоколов, которые включают:
stralloc_readyplus(). Удаленный пользователь может под- 2. Authentication Header (AH) – обеспечивает аутентичность
ключиться к SMTP-службе и послать большое количе- пакета, добавляя к нему стойкую криптографическую
ство данных, что приведет к аварийному завершению контрольную сумму.
работы службы. 3. Encapsulating Security Payload (ESP) – обеспечивает кон-
2. Переполнение буфера в SMTP-службе обнаружено при фиденциальность пакета, шифруя пакет с помощью ал-
обработке параметров команды HELO. Удаленный горитмов шифрования. ESP также обеспечивает необя-
пользователь может вызвать отказ в обслуживании сер- зательную службу аутентификации для пакетов.
виса. Уязвимость существует в файле commands.c. 4. Internet Key Exchange (IKE) – обеспечивает безопасный
3. Удаленный пользователь может с помощью специаль- обмен внешними ключами.
но сформированной команды RCPT TO вызвать отказ в
обслуживании приложения. Переполнение буфера су- ESP и AH могут использовать два режима: туннельный
ществует в файле qmail_put/substdio_put. (tunnel mode) и транспортный (transport mode). При исполь-
зовании туннельного режима в ESP, IP-пакет (внутренний
URL производителей: www.qmail.org. пакет) полностью шифруется и используется для форми-
Решение: Способов устранения уязвимости не существу- рования payload нового пакета (внешний пакет). Обычно
ет в настоящее время. ESP использует CBC-режим шифрования для обеспечения
конфиденциальности. Без защиты целостности, зашифро-
Межсайтовый скриптинг и выполнение ванные данные в режиме CBC могут быть модифицирова-
произвольного кода в Mozilla Firefox ны атакующим.
Программа: Mozilla Firefox 1.0.3. Атакующий может определенным образом внести изме-
Опасность: Критическая. нения во внешний пакет, которые затронут данные внут-
Описание: Уязвимости позволяют удаленному пользовате- реннего пакета. Поскольку расшифровкой данных занима-
лю выполнить произвольный код на целевой системе. ется программное обеспечение уровня IP, все содержимое
1. Уязвимость существует при обработке IFRAME. Удален- внутреннего пакета в открытом виде, или ICMP-сообщение
ный пользователь может создать специально сформи- об ошибке могут быть отправлены атакующему.
рованную HTML-страницу и выполнить HTML-сценарий Решение: Способов устранения уязвимости не существу-
в браузере жертвы в контексте безопасности произволь- ет в настоящее время. В качестве временного решения ре-
ного сайта. комендуется:
2. Уязвимость существует при обработке входных данных 1. Сконфигурировать ESP для использования защиты кон-
в параметре IconURL функции InstallTrigger.install(). Уда- фиденциальности и целостности данных.
ленный пользователь может с помощью специально 2. Использовать AH-протокол совместно с ESP для защи-
сформированной страницы установить и выполнить про- ты целостности данных.
извольное программное обеспечение. 3. Запретить ICMP-сообщения об ошибке с помощью меж-
сетевого экрана.
Пример/Эксплоит: www.securitylab.ru/54526.html.
URL производителей: www.mozilla.org. SQL-инъекция в Invision Power Board
Решение: Способов устранения уязвимости не существу- Программа: Invision Power Board 1.3.1 и ранние версии.
ет в настоящее время. Опасность: Средняя.
Описание: Уязвимость существует из-за некорректной
Повышение привилегии в ядре Linux фильтрации входных данных в переменной $this->first (па-
Программа: Linux kernel 2.2 – 2.2.27-rc2, 2.4 – 2.4.31-pre1, раметр st) функции Members сценария memberlist.php. Уда-
2.6 – 2.6.12-rc4. ленный пользователь может с помощью специально сфор-
Опасность: Низкая. мированного URL выполнить произвольные SQL-команды
Описание: Уязвимость существует в функции сброса дам- в базе данных приложения. Пример:
па elf_core_dump() в файле fs/binfmt_elf.c. Локальный поль- http://[target]/forums/index.php?act=Members
зователь может создать специально сформированный ELF- &max_results=30&filter=1&sort_order=asc&
sort_key=name&st=SQL_INJECTION
бинарник и вызвать отказ в обслуживании системы или
выполнить произвольный код с root-привилегиями. URL производителя: www.invisionboard.com.
URL производителей: www.kernel.org. Решение: Способов устранения уязвимости не существу-
Решение: Способов устранения уязвимости не существу- ет в настоящее время.
ет в настоящее время.
Составил Александр Антипов

№5, май 2005 31


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

ВОССТАНАВЛИВАЕМ УДАЛЕННЫЕ ФАЙЛЫ


ПОД BSD
Командной строке посвящается…

UFS – это основная файловая система для BSD-систем, устанавливаемая по умолчанию.


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

КРИС КАСПЕРСКИ
Немного истории Все последующие версии линейки 4.x BSD прошли под
UFS ведет свою историю от S5 FS – самой первой файло- знаменем FFS, но в 5.x BSD файловая система вновь из-
вой системы, написанной для UNIX в далеком 1974 году. менилась. Для поддержки дисков большого объема шири-
S5 FS была крайне простой и неповоротливой (по некото- ну всех адресных полей пришлось удвоить: 32-битная ну-
рым данным, средняя производительность FS составляла мерация фрагментов уступила место 64-битной. Были вне-
всего лишь 2%-5% от «сырой» производительности жест- сены и другие менее существенные усовершенствования.
кого диска), но понятия суперблока (super-block), файло- Фактически мы имеем дело с тремя различными фай-
вых записей (inodes) и блоков данных (blocks) в ней уже ловыми системами, не совместимыми друг с другом на уров-
существовали. не базовых структур данных, однако, некоторые источники
В процессе работы над дистрибутивом 4.2 BSD, вышед- склонны рассматривать FFS как надстройку над UFS. «UFS
шим в 1983 году, S5 FS претерпела некоторые улучшения. (and UFS2) define on-disk data layout. FFS sits on top of UFS
Были добавлены длинные имена, символические ссылки (1 or 2) and provides directory structure information, and a variety
и т. д. Так родилась UFS. of disk access optimizations» говорит «Little UFS2 FAQ» (UFS/
В 4.3 BSD, увидевшей свет уже в 1984 году, улучшения UFS2 определяет раскладку данных на диске. FFS реализо-
носили намного более радикальный, если не сказать рево- вана поверх UFS 1 или 2 и отвечает за структуру директо-
люционный, характер. Появились концепции фрагментов рий и некоторые оптимизации доступа к диску). Если загля-
(fragments) и групп цилиндров (cylinder groups). Быстродей- нуть в исходные тексты файловой системы, действительно,
ствие файловой системы существенно возросло, что и оп- можно обнаружить два подкаталога – /ufs и /ffs. В /ffs нахо-
ределило ее название FFS – Fast File System (быстрая фай- дится определение суперблока (базовой структуры, отвеча-
ловая система). ющей за раскладку данных), а в /ufs – определение inode и

32
администрирование
структуры директорий, что опровергает данный тезис, с по- В начале раздела расположен загрузочный сектор, за-
зиций которого все должно быть с точностью до наоборот. тем следует суперблок, за которым находится одна или не-
Чтобы не увязнуть в болоте терминологических тонко- сколько групп цилиндров. Для перестраховки копия супер-
стей, под UFS мы будем понимать основную файловую си- блока дублируется в каждой группе. Загрузочный сектор
стему 4.5 BSD, а под UFS2 – основную файловую систему не дублируется, но по соображениям унификации и едино-
5.х BSD. образия под него просто выделяется место. Таким обра-
зом, относительная адресация блоков в каждой группе ос-
Структура UFS тается неизменной.
Внешне UFS очень похожа на ext2fs – те же inode, блоки
данных, файлы, директории… Но есть и отличия. В ext2fs
имеется только одна группа inode и только одна группа бло-
ков данных для всего раздела. UFS же делит раздел на не-
сколько зон одинакового размера, называемых группами
цилиндров. Каждая зона имеет свою группу inode и свою
группу блоков данных, независимую от всех остальных зон.
Другим словами, inodе описывают блоки данных той и толь-
ко той зоны, к которой они принадлежат. Это увеличивает
быстродействие файловой системы (головка жесткого дис-
ка совершает более короткие перемещения) и упрощает
процедуру восстановления при значительном разрушении Ðèñóíîê 2. Ïîñëåäîâàòåëüíî ðàñïîëîæåííûå ãðóïïû öèëèíäðîâ
данных, поскольку, как показывает практика, обычно гиб- В UFS cуперблок располагается по смещению 8192 байт
нет только первая группа inode. Чтобы погибли все груп- от начала раздела, что соответствует 16-му сектору. В UFS2
пы… я даже не знаю, что же такое с жестким диском нужно он «переехал» на 65536 байт (128 секторов) от начала, ос-
сделать. А! Знаю! Под пресс положить! вобождая место для дисковой метки и первичного загруз-
В UFS каждый блок разбит на несколько фрагментов чика операционной системы, а для действительно больших
фиксированного размера, предотвращающих потерю сво- (в исходных текстах – piggy) систем предусмотрена возмож-
бодного пространства в хвостах файлов. Благодаря этому, ность перемещения суперблока по адресу 262144 байт (це-
использование блоков большого размера уже не кажется лых 512 секторов)!
расточительной идеей, напротив, это увеличивает произ- Среди прочей информации суперблок содержит:
водительность и уменьшает фрагментацию. Если файл ис-
пользует более одного фрагмента в двух несмежных бло- ! fs_cblkno – смещение первой группы блока цилиндров,
ках, он автоматически перемещается на новое место, в измеряемый в фрагментах, отсчитываемых от начала
наименее фрагментированный регион свободного про- раздела;
странства. Поэтому фрагментация в UFS очень мала или ! 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) sec_n(fragment_offset) = fragment_offset*fs_fsize/512
Адресация ведется либо по физическим смещениям, из-
меряемых в байтах и отсчитываемых от начала группы ци- Структура суперблока определена в файле /src/ufs/ffs/fs.h
линдров (реже – UFS-раздела), либо в номерах фрагментов, и в упрощенном виде выглядит так:
отсчитываемых от тех же самых точек. Допустим, размер бло-
ка составляет 16 Кб, разбитых на 8 фрагментов. Тогда 69-й Ëèñòèíã 1. Ôîðìàò ñóïåðáëîêà (âòîðîñòåïåííûå ïîëÿ îïóùåíû)
сектор будет иметь смещение 512 х 69 == 35328 байт или struct fs {
1024 x (16/8)/512 x 69 = 276 фрагментов. /* historic file system linked list, */

№5, май 2005 33


администрирование
/* 0x00 */ int32_t fs_firstfield; ! cg_ndblk – количество блоков данных в данной группе;
/* used for incore super blocks */ ! csum – количество свободных inode и блоков данных в
/* 0x04 */ int32_t fs_unused_1;
/* addr of super-block in filesys */ данной группе;
/* 0x08 */ ufs_daddr_t fs_sblkno; ! cg_iusedoff – смещение карты занятых inode, отсчитыва-
/* offset of cyl-block in filesys */
/* 0x0C */ ufs_daddr_t fs_cblkno; емое от начала данной группы и измеряемое в байтах;
/* offset of inode-blocks in filesys */ ! cg_freeoff – смещение карты свободного пространства
/* 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; Структура cg определена в файле /src/ufs/ffs/fs.h и выг-
/* used to calc mod fs_ntrak */ лядит следующим образом:
/* 0x1C */ int32_t fs_cgmask;
/* last time written */
/* 0x20 */ time_t fs_time; Ëèñòèíã 2. Ñòðóêòóðà îïèñàòåëÿ ãðóïïû öèëèíäðîâ
/* number of blocks in fs */
/* 0x24 */ int32_t fs_size; #define CG_MAGIC 0x090255
/* number of data blocks in fs */ #define MAXFRAG 8
/* 0x28 */ int32_t fs_dsize; struct cg {
/* number of cylinder groups */ /* historic cyl groups linked list */
/* 0x2C */ int32_t fs_ncg; /* 0x00 */ int32_t cg_firstfield;
/* size of basic blocks in fs */ /* magic number */
/* 0x30 */ int32_t fs_bsize; /* 0x04 */ int32_t cg_magic;
/* size of frag blocks in fs */ /* time last written */
/* 0x34 */ int32_t fs_fsize; /* 0x08 */ int32_t cg_old_time;
/* number of frags in a block in fs */ /* we are the cgx'th cylinder group */
/* 0x38 */ int32_t fs_frag; /* 0x0Ñ */ int32_t cg_cgx;
/* number of cyl's this cg */
/* these are configuration parameters */ /* 0x10 */ int16_t cg_old_ncyl;
/* minimum percentage of free blocks */ /* number of inode blocks this cg */
/* 0x3Ñ */ int32_t fs_minfree; /* 0x12 */ int16_t cg_old_niblk;
/* num of ms for optimal next block */ /* number of data blocks this cg */
/* 0x40 */ int32_t fs_rotdelay; /* 0x14 */ int32_t cg_ndblk;
/* disk revolutions per second */ /* cylinder summary information */
/* 0x44 */ int32_t fs_rps; /* 0x18 */ struct csum cg_cs;
/* position of last used block */
/* sizes determined by number of cylinder groups */ /* 0x28 */ int32_t cg_rotor;
/* and their sizes */ /* position of last used frag */
/* blk addr of cyl grp summary area */ /* 0x2Ñ */ int32_t cg_frotor;
/* 0x98 */ ufs_daddr_t fs_csaddr; /* position of last used inode */
/* size of cyl grp summary area */ /* 0x30 */ int32_t cg_irotor;
/* 0x9C */ int32_t fs_cssize; /* counts of available frags */
/* cylinder group size */ /* 0x34 */ int32_t cg_frsum[MAXFRAG];
/* 0xA0 */ int32_t fs_cgsize; /* (int32) block totals per cylinder */
/* 0x54 */ int32_t cg_old_btotoff;
/* these fields can be computed from the others */ /* (u_int16) free block positions */
/* cylinders per group */ /* 0x58 */ int32_t cg_old_boff;
/* 0xB4 */ int32_t fs_cpg; /* (u_int8) used inode map */
/* inodes per group */ /* 0x5Ñ */ int32_t cg_iusedoff;
/* 0xB8 */ int32_t fs_ipg; /* (u_int8) free block map */
/* blocks per group * fs_frag */ /* 0x60 */ int32_t cg_freeoff;
/* 0xBC */ int32_t fs_fpg; /* (u_int8) next available space */
/* 0x64 */ int32_t cg_nextfreeoff;
/* these fields are cleared at mount time */ /* (u_int32) counts of avail clusters */
/* super block modified flag */ /* 0x68 */ int32_t cg_clustersumoff;
/* 0xD0 */ int8_t fs_fmod; /* (u_int8) free cluster map */
/* file system is clean flag */ /* 0x6Ñ */ int32_t cg_clusteroff;
/* 0xD1 */ int8_t fs_clean; /* number of clusters this cg */
/* mounted read-only flag */ /* 0x70 */ int32_t cg_nclusterblks;
/* 0xD2 */ int8_t fs_ronly; /* number of inode blocks this cg */
/* see FS_ flags below */ /* 0x74 */ int32_t cg_niblk;
/* 0xD3 */ int8_t fs_flags; /* last initialized inode */
/* name mounted on */ /* 0x78 */ int32_t cg_initediblk;
/* 0xD4 */ u_char fs_fsmnt[MAXMNTLEN]; /* 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 */
cg (далее по тексту – описатель группы цилиндров, термин /* 0x00 */ u_int8_t cg_space[1];
автора), содержащая магическую последовательность /* actually longer */
55h 02h 09h, позволяющая находить уцелевшие группы ци-
линдров даже при полном разрушении суперблока (если Между описателем группы цилиндров и группой inode
же суперблок цел, стартовые адреса всех последующих расположена карта занятых inode и карта свободного дис-
групп вычисляются путем умножения номера группы на ее кового пространства, представляющие собой обыкновен-
размер, содержащийся в поле fs_cgsize). ные битовые поля, точно такие же, как в NTFS или ext2fs/
Другие важные параметры описателя группы цилиндров: ext3fs. При восстановлении удаленных файлов без этих карт
! cg_cgx – порядковой номер группы, отсчитываемый от никуда! Отделяя зерна от плевел, они существенно сужают
нуля; круг поиска, что особенно хорошо заметно на дисках, за-
! cg_old_niblk – количество inode в данной группе; полненных более чем наполовину.

34
администрирование
За картами следует массив 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; Ðèñóíîê 3. Ñõåìàòè÷íîå èçîáðàæåíèå inode. Ê ïîëþ Extensions
/* 20: Last access time. */ îòíîñèòñÿ âñå, ÷òî íàõîäèòñÿ íèæå di_ib
/* 0x14 */ int32_t di_atimensec;
/* 24: Last modified time. */ Ëèñòèíã 4. Ñòðóêòóðà inode â USF2
/* 0x18 */ int32_t di_mtime;
/* 28: Last modified time. */ struct ufs2_dinode {
/* 0x1C */ int32_t di_mtimensec; /* 0: IFMT, permissions; see below. */
/* 32: Last inode change time. */ /* 0x00 */ u_int16_t di_mode;
/* 0x20 */ int32_t di_ctime; /* 2: File link count. */
/* 36: Last inode change time. */ /* 0x02 */ int16_t di_nlink;
/* 0x24 */ int32_t di_ctimensec; /* 4: File owner. */
/* 40: Direct disk blocks. */ /* 0x04 */ u_int32_t di_uid;
/* 0x28 */ ufs_daddr_t di_db[NDADDR]; /* 8: File group. */
/* 88: Indirect disk blocks. */ /* 0x08 */ u_int32_t di_gid;
/* 0x58 */ ufs_daddr_t di_ib[NIADDR]; /* 12: Inode blocksize. */
/* 100: Status flags (chflags). */ /* 0x0C */ u_int32_t di_blksize;
/* 0x64 */ u_int32_t di_flags; /* 16: File byte count. */
/* 104: Blocks actually held. */ /* 0x10 */ u_int64_t di_size;
/* 0x68 */ int32_t di_blocks; /* 24: Bytes actually held. */
/* 108: Generation number. */ /* 0x18 */ u_int64_t di_blocks;
/* 0x6C */ int32_t di_gen; /* 32: Last access time. */
/* 112: File owner. */ /* 0x20 */ ufs_time_t di_atime;
/* 0x70 */ u_int32_t di_uid; /* 40: Last modified time. */
/* 116: File group. */ /* 0x28 */ ufs_time_t di_mtime;
/* 0x74 */ u_int32_t di_gid; /* 48: Last inode change time. */
/* 120: Reserved; currently unused */ /* 0x30 */ ufs_time_t di_ctime;
/* 0x78 */ int32_t di_spare[2]; /* 56: Inode creation time. */
}; /* 0x38 */ ufs_time_t di_birthtime;
/* 64: Last modified time. */
/* 0x40 */ int32_t di_mtimensec;
В UFS2 формат inode был существенно изменен – по- /* 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;
го, а общий принцип работы с inode остался прежним (см. /* 80: Generation number. */
листинг 4). /* 0x50 */ int32_t di_gen;

№5, май 2005 35


администрирование
/* 84: Kernel flags. */ На этом описание файловой системы UFS можно счи-
/* 0x54 */ u_int32_t di_kernflags; тать законченным. Для ручного восстановления данных
/* 88: Status flags (chflags). */
/* 0x58 */ u_int32_t di_flags; приведенной информации вполне достаточно.
/* 92: External attributes block. */
/* 0x5C */ int32_t di_extsize;
/* 96: External attributes block. */ На обломках империи
/* 0x60 */ ufs2_daddr_tdi_extb[NXADDR]; При удалении файла на UFS-разделе происходит следую-
/* 112: Direct disk blocks. */
/* 0x70 */ ufs2_daddr_tdi_db[NDADDR]; щее (события перечислены в порядке расположения соот-
/* 208: Indirect disk blocks. */ ветствующих структур в разделе и могут не совпадать с
/* 0xD0 */ ufs2_daddr_tdi_ib[NIADDR];
/* 232: Reserved; currently unused */ порядком их возникновения):
/* 0xE8 */ int64_t di_spare[3]; ! в суперблоке обновляется поле fs_time (время после-
};
днего доступа к разделу);
Имена файлов хранятся в директориях. В inode их нет. ! в суперблоке обновляется структура fs_cstotal (количе-
С точки зрения UFS, директории являются обыкновенными ство свободных inode и блоков данных в разделе);
файлами и могут храниться в любом месте, принадлежа- ! в группе цилиндров обновляются карты занятых inode и
щем группе цилиндров. блоков данных – inodе, и все блоки данных удаляемого
Файловая система UFS поддерживает несколько типов файла помечаются как освобожденные;
хеширования директорий, однако на структуре хранения ! в inode материнского каталога обновляются поля вре-
имен это никак не отражается. Имена хранятся в блоках, мени последнего доступа и модификации;
называемых DIRECT BLOCK в структурах типа direct, вы- ! в inode материнского каталога обновляется поле вре-
ровненных по 4-байтовой границе. мени последнего изменения inode;
! в inode удаляемого файла поля di_mode (IFMT – Input
Format – формат файла, permissions – права доступа),
di_nlink (количество ссылок на файл) и di_size (размер
Ðèñóíîê 4. Õðàíåíèå èìåí ôàéëîâ è äèðåêòîðèé файла) варварски обнуляются (замечание: если счет-
Структура direct определена в файле /src/ufs/ufs/dir.h и чик ссылок был больше единицы, то при удалении од-
содержит: номер inode, описывающий данный файл, тип ной из таких ссылок поле di_nlink уменьшается на еди-
файла, его имя, а также длину самой структуры direct, ис- ницу, но удаления самого файла не происходит);
пользуемую для нахождения следующего direct в блоке. ! в inode удаляемого файла поля di_db (массив указате-
лей на 12 первых блоков файла), и di_ib (указатель на
Ëèñòèíã 5. Ñòðóêòóðà direct, îòâå÷àþùàÿ çà õðàíåíèå èìåí блок косвенной адресации) безжалостно обнуляется;
ôàéëîâ è äèðåêòîðèé
! в inode удаляемого файла обновляются поля времени
struct direct { последней модификации и изменения inodе, время пос-
/* inode number of entry */
/* 0x00 */ u_int32_t d_ino; леднего доступа при этом остается неизменным;
/* length of this record */
/* 0x04 */ u_int16_t d_reclen;
! в inode удаляемого файла обновляется поле di_spare. В
/* file type, see below */ исходных текстах оно помечено как «Reserved; currently
/* 0x06 */ u_int8_t d_type; unused», но просмотр дампа показывает, что это не так.
/* length of string in d_name */
/* 0x07 */ u_int8_t d_namlen; Здесь хранится нечто вроде последовательности обнов-
/* name with length <= MAXNAMLEN */ ления (update sequence), используемой для контроля
/* 0x08 */ char d_name[MAXNAMLEN + 1];
}; целостности indoe, однако это только предположение;

Чем восстанавливать? 2. The Sleuth Kit представляет собой бесплатно распрост-


1. Компания Stellarinfo (www.stellarinfo.com) выпустила ути- раняемый комплект утилит для ручного восстановления
литу «Phoenix», предназначенную для восстановления файловой системы, который можно найти по адресу
данных и поддерживающую практически все популярные (http://www.sleuthkit.org), там же (http://www.sleuthkit.org/
файловые системы, которые только известны на сегод- sleuthkit/docs/ref_fs.html) находится краткий how-to. Увы,
няшний день (и UFS в том числе). Демонстрационную чудес не бывает, и вся методика восстановления сво-
копию можно скачать по адресу: http://www.stellarinfo.com/ дится к сканированию свободного пространства на пред-
spb.exe. Обратите внимание на расширение файла. Это мет поиска фрагментов с известным содержимым.
«.exe». Судя по графе «Platform Supported», он рассчи- 3. Foremost – еще одна бесплатная утилита для восста-
тан на BSD. Но в BSD он не запустится! Потребуется ус- новления удаленных файлов, основанная формате их
танавливать в систему дополнительный винчестер с ра- заголовков на особенностях структуры. Естественно,
бочей Windows и инсталлировать Phoenix поверх нее. Под она работает только с теми файлами, чье строение ей
Windows PE он работать отказывается… На Windows 2000 известно. Тем не менее, по сравнению с ее предшествен-
запускается, но при попытке анализа заведомо исправ- ницами это большой шаг вперед! Кстати говоря, утили-
ного раздела он аварийно завершается с сообщением о та взаимодействует с файловой системой не напрямую,
критической ошибке. На других системах я его не прове- а обрабатывает файлы, полученные командой dd или
рял. Тем не менее ссылку на файл все-таки даю. Во-пер- набором Sleuth Kit, благодаря чему она «поддержива-
вых, вы будете знать, что это за продукт, а во-вторых, не ет» все файловые системы. Последняя версия лежит на
исключено, что у кого-то он все-таки сработает. сервере http://foremost.sourceforge.net.

36
администрирование
! в директории удаленного файла размер предшествую- идеале это будет один непрерывный регион. Хуже, если
щей структуры direct увеличивается на d_reclen, в ре- первый фрагмент расположен в «чужом» блоке (т.е. блоке,
зультате чего она как бы «поглощает» имя удаляемого частично занятом другим файлом), а оставшиеся 12 бло-
файла, однако его перезаписывания не происходит, во ков находятся в одном или нескольких регионах. Вообще-
всяком случае оно уничтожается не сразу, а только тог- то достаточно трудно представить себе ситуацию, в кото-
да, когда в этом возникнет реальная необходимость. рой первые 13 блоков были бы сильно фрагментированы
(а поддержка фоновой дефрагментации в UFS на что?). Та-
Как мы будем действовать кое может произойти только при интересной «перегруппи-
После непреднамеренного удаления одного или нескольких ровке» большого количеств файлов, что в реальной жизни
файлов немедленно демонтируйте раздел и запустите дис- практически никогда не встречается (ну разве только что
ковый редактор, работающий на уровне секторов. Например, вы задумали навести порядок на своем жестком диске).
можно воспользоваться BSD-портом уже известной нам Итак, будем считать, что 13-й блок файла найден. В мас-
утилитой lde. К сожалению, на моей системе (4.5 BSD) она сив непосредственной адресации он уже не помещается
работает крайне нестабильно и не отображает основных (там содержатся только 12 блоков), и ссылка на него, как и
структур данных в удобочитаемом виде, хотя поддержка на все последующие блоки файла, должна содержаться в
UFS в ней заявлена. При наличии достаточного количества блоках косвенной адресации, которые при удалении фай-
свободного места можно скопировать раздел в файл и от- ла помечаются как свободные, но не перезаписывается, точ-
крыть его с помощью любого hex-редактора (например, нее, перезаписывается, но не сразу. Большинство файлов
biew) или обратиться непосредственно к самому устройству обходятся только одним косвенным блоком, что существен-
раздела (например, /dev/ad0s1a). но упрощает нашу задачу.
А еще можно вставить в привод загрузочный CD-ROM с Как найти этот блок на диске? Вычисляем смещение
Windows PE и воспользоваться любым Windows-редактором 13-го блока файла от начала группы цилиндров, перево-
от Microsoft Disk Probe до Runtime Disk Explorer. То же са- дим его в фрагменты, записываем получившееся число
мое справедливо и для Norton Disk Editor, запущенного c задом наперед (так, чтобы младшие байты располагались
дискеты из-под MS-DOS (правда, ни диски большого объе- по меньшим адресами) и осуществляем контекстный по-
ма, ни SCSI-устройства он не поддерживает). Еще можно иск в свободном пространстве.
запустить KNOPPIX или любой Live LINUX, ориентирован- Отличить блок косвенной адресации от всех остальных
ный на восстановление (правда, в большинстве «реанима- типов данных очень легко – он представляет собой массив
ционных» дистрибутивов, и в частности, Frenzy 0.3, ника- указателей на блоки, а в конце идут нули. Остается только
кого дискового редактора вообще нет!). извлечь эти блоки с диска и записать их в файл, обрезая
В общем, как говорится, на вкус и цвет товарищей нет… его по нужной длине.
Внимание! Если вы нашли несколько «кандидатов» в
Техника восстановления файлов блоки косвенной адресации, это означает, что 13-й блок
Начнем с грустного. Поскольку при удалении файла ссыл- удаленного файла в разное время принадлежал различным
ки на 12 первых блоков и 3 блока косвенной адресации файлам (а так, скорее всего, и будет). Не все косвенные
необратимо затираются, автоматическое восстановление блоки были затерты, вот ссылки и остались. Как отличить
данных невозможно в принципе. Найти удаленный файл «наш» блок от «чужих»? Если хотя бы одна из ссылок ука-
можно только по его содержимому. Искать, естественно, зывает на уже занятый блок данных (что легко определить
необходимо в свободном пространстве. Вот тут-то нам и по карте), такой блок можно сразу откинуть. Оставшиеся
пригодятся карты, расположенные за концом описателя блоки перебираются вручную до получения работоспособ-
группы цилиндров. ной копии файла. Имя файла (если оно еще не затерто)
Если нам повезет и файл окажется нефрагментирован- можно извлечь из директории. Естественно, при восстанов-
ным (а на UFS, как уже отмечалось, фрагментация обычно лении нескольких файлов мы не можем однозначно ска-
отсутствует или крайне невелика), остальное будет делом зать, какое из имен какому файлу принадлежит, тем не
техники. Просто выделяем группу секторов и записываем менее это все же лучше, чем совсем ничего. Директории
ее на диск, но только ни в коем случае не на сам восста- восстанавливаются точно так же, как и обыкновенные фай-
навливаемый раздел! (Например, файл можно передать на лы, хотя, по правде говоря, в них, кроме имен файлов, не-
соседнюю машину по сети). чего и восстанавливать…
К сожалению, поле длины файла безжалостно затира-
ется при его удалении и актуальный размер приходится Заключение
определять «на глазок». Звучит намного страшнее, чем Описанный метод восстановления данных страдает мно-
выглядит. Неиспользуемый хвост последнего фрагмента жеством ограничений. В частности, при удалении большо-
всегда забивается нулями, что дает хороший ориентир. го количества сильно фрагментированных двоичных фай-
Проблема в том, что некоторые типы файлов содержат в лов он ничем не поможет. Вы только убьете свое время, но
своем конце некоторое количество нулей, при отсечении навряд ли найдете среди обломков файловой системы что-
которых их работоспособность нарушается, поэтому тут то полезное. Но как бы там ни было, другого выхода про-
приходится экспериментировать. сто нет (если, конечно, не считать резервной копию, кото-
А если файл фрагментирован? Первые 13 блоков (имен- рой тоже, скорее всего, нет), поэтому я все-таки считаю,
но блоков, а не фрагментов!) придется собирать руками. В что данная статья будет совсем небесполезной.

№5, май 2005 37


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

РЕИНКАРНАЦИЯ ДАННЫХ II: memo-ПОЛЯ

В прошлом номере журнала мы рассмотрели


несколько способов переноса данных
из таблиц формата DBF в PostgreSQL.
Однако чтобы не перегружать статью, вопрос
работы с полями типа memo, достаточно
широко используемыми в FoxPro,
был оставлен без внимания. Теперь пришло
время восполнить данный пробел.

СЕРГЕЙ СУПРУНОВ
Формат memo-полей писи данных будут начинаться с блока 8 (длина заголовка
Если нужно сохранить в одном поле данные большого или 512, деленная на размер блока 64).
неопределенного объема, в FoxPro (как и в некоторых дру-
гих СУБД) используются поля специального типа – так на- С чем предстоит бороться
зываемые memo-поля. Данные такого поля физически со- Теоретически формат DBF позволяет хранить в поле типа
храняются в отдельном файле (в случае с FoxPro он имеет memo до 4 Гб данных. Однако на практике из-за внутренних
то же имя, что и dbf-файл, но с расширением fpt). Логичес- ограничений FoxPro на длину строки оперировать с полями
ки мемо-поля связываются с таблицей таким образом, что свыше 65504 символов становится проблематично. На прак-
доступны, как и любое другое поле текущей записи. тике длина этого поля редко превышает несколько тысяч
Файл fpt для упрощения работы с данными хранит их символов. Поэтому вполне допустимо полагать, что данные
поблочно. Размер блока по умолчанию в FPD 2.6 составля- из поля типа memo могут быть размещены в поле типа text
ет 64 байта. Заголовок fpt-файла имеет размер 512 байт, таблицы PostgreSQL (максимальное значение поля – 1 Гб).
структура его следующая: Так что размеры полей проблемой считать не будем.
Òàáëèöà. Ñòðóêòóðà çàãîëîâêà fpt-ôàéëà Сложнее то, что memo-поля могут содержать разнооб-
разные символы, включая символ перевода строки. По-
скольку при обработке текстового файла PostgreSQL вос-
принимает этот символ как разделитель записей, то необ-
ходимо позаботиться об его экранировании. Причем в слу-
чае формата конца строки в стиле DOS (CR+LF) экраниро-
Начиная с 513-го байта от начала файла, располагают- вать нужно как символ перевода строки (0x0D), так и сим-
ся блоки данных. Значение поля может занимать один или вол возврата каретки (0x0A).
несколько блоков. Каждый блок, являющийся первым для Можно использовать формат CSV для загрузки в
записи, содержит 8-байтный заголовок (4 байта сигнатура PostgreSQL – в этом случае значением поля будут считать-
0х00000001 и 4 байта – длина поля), после которого следу- ся все символы, заключенные в «кавычки». «Кавычками»
ют собственно данные. в данном случае может выступать любой символ, он зада-
Для обеспечения связи таблицы с данными в fpt-файле ется как параметр команды COPY. Теперь внутри поля нуж-
в каждой записи dbf-файла memo-полю отводится 10 байт, но экранировать «кавычки» (путем удвоения), однако в дан-
в которые заносится номер первого блока данных. Причем ном случае больше шансов найти подходящий символ, мало
номер хранится в символьном виде с ведущими пробела- используемый внутри поля данных. К тому же исключают-
ми. Например, для указания на блок 8 данное поле будет ся проблемы с различными стилями перевода строки.
содержать значение « 8» (в шестнадцатеричном виде
«20 20 20 20 20 20 20 20 20 38», где 38 – ASCII-код символа Реализация на FoxPro
«8»). Нумерация блоков идет от начала файла, то есть вклю- FoxPro работает с memo-полями прозрачно, так что никаких
чает и заголовок. усилий со стороны программиста не требуется. Не забудь-
Например, при стандартной длине блока 64 байта за- те поставить символ «\» перед символами-разделителями:

38
администрирование
Ëèñòèíã 1. Ôàéë memo2pg.prg (FoxPro) if fields[i].type == 'M':
fld = memo2pg(fld)
close databases # ----------^^^^^^^
* Ýòî – êîììåíòàðèé ñ íà÷àëà ñòðîêè
&& À òàê âûäåëÿþòñÿ êîììåíòàðèè â ïðîèçâîëüíîì ìåñòå ñòðîêè if fields[i].type == 'D':
fld = fld[:4] + '-' + ↵
use wmem && Îòêðûâàåì òàáëèöó ñ memo-ïîëÿìè fld[4:6] + '-' + ↵
m.delimiter = chr(9) && ñèìâîë Tab fld[6:]
m.txf = fcreate('memo2pg.txt') .. .. ..
scan Здесь при обнаружении поля типа memo считанное зна-
* Òåêñòîâîå ïîëå – ýêðàíèðóåì ðàçäåëèòåëè è ñèìâîë «\»
m.descr = strtran(Descr, '\', '\\') чение трактуется как содержащее номер первого блока дан-
m.descr = strtran(m.descr, m.delimiter, ; ных, и вызывается функция разбора fpt-файла:
'\' + m.delimiter)
* Â memo-ïîëå äîïîëíèòåëüíî ýêðàíèðóåì ñèìâîëû
* êîíöà ñòðîêè (ASCII-êîäû 10 è 13) Ëèñòèíã 3. Ôðàãìåíò ñöåíàðèÿ dbf2pg.py, ôóíêöèÿ memo2pg
m.memfld = strtran(Memfld, '\', '\\')
m.memfld = strtran(m.memfld, m.delimiter, ; def memo2pg(startblock):
'\' + m.delimiter) # Íîìåð áëîêà ïðåîáðàçóåì â ÷èñëî
m.memfld = strtran(m.memfld, chr(13), ; startblock = int(startblock)
'\' + chr(13))
m.memfld = strtran(m.memfld, chr(10), ; fpt = open(basetabname + '.fpt', 'rb')
'\' + chr(10)) fpt.read(6)
* Çàïèñûâàåì ðåçóëüòàò â ôàéë, ðàçäåëÿÿ ïîëÿ
* ñèìâîëîì, õðàíÿùèìñÿ â ïåðåìåííîé m.delimiter # Ñ÷èòûâàåì ðàçìåð áëîêà
=fputs(m.txf, m.descr + ; blocksize = int(ord(fpt.read(1)) * 256 + ord(fpt.read(1)))
m.delimiter + ;
m.memfld) # Ñìåùàåìñÿ ê íà÷àëó áëîêà äàííûõ
endscan fpt.seek(blocksize * startblock)
=fclose(m.txf) fpt.read(4)
wait window 'Finished.'
# Ñ÷èòûâàåì ðàçìåð ïîëÿ äàííûõ
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

Наконец, нужно позаботиться, чтобы Python не обраба-


Ðèñóíîê. Ðàáî÷åå îêíî FoxPro тывал символы перевода строки самостоятельно, для чего
Если вы решите работать с CSV-форматом, то вместо вместо вывода каждой сформированной строки с помощью
табуляции в качестве разделителя будет использоваться за- оператора print мы будем осуществлять запись в файл, от-
пятая, а каждое поле данных, независимо от типа, нужно крытый в двоичном режиме, и формировать конец строки
будет окружить символом-«кавычкой», например «”», ко- вручную так, как нам нужно:
торый используется по умолчанию. Ну и внутри полей все
«кавычки» должны быть удвоены, чтобы исключить их спе- Ëèñòèíã 4. Ôðàãìåíò ñöåíàðèÿ dbf2pg.py, çàïèñü ñòðîêè â ôàéë
циальную интерпретацию. .. .. ..
# print line[:-1]
outfile.write(line[:-1] + '\r\n')
Реализация на Python .. .. ..
А вот здесь нам придется применить все накопленные выше
знания по формату файлов DBF и FPT. Поскольку полнос- В результате dbf2pg.py теперь может обрабатывать и
тью сценарий разбора DBF-файла приводился в прошлой memo-поля.
статье, здесь ограничимся только той частью, которая от-
вечает за получение данных из мемо-поля. За основу взят Заключение
сценарий dbf2pg.py, рассмотренный в предыдущей статье Язык FoxPro предоставляет развитые средства для работы
(см. листинг 2). В него добавлена обработка полей типа «M» со своими файлами (выглядело бы странно, если бы это
в цикл, обрабатывающий каждую запись (соответствующие было не так), и осуществить конвертирование файла DBF
строки выделены красным шрифтом): в другой формат c его помощью – дело нескольких строк
кода. Однако не беда, если вы не очень дружны с ним или
Ëèñòèíã 2. Ôðàãìåíò ñöåíàðèÿ dbf2pg.py, äîáàâëåííûå ñòðîêè не можете им воспользоваться по каким-то причинам. Дво-
.. .. .. ичный формат DBF, как вы могли убедиться, достаточно
for i in range(num): прост и удобен. Так что при необходимости реализовать
fld = dbf.read(fields[i].len)
его обработку имеющимися подручными средствами тру-
# Äîáàâëåíî: vvvvvvv да не составит.

№5, май 2005 39


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

ПОЧЕМУ MS SQL МЕДЛЕННО РАБОТАЕТ?


ИЩЕМ ПРИЧИНЫ
«Сервер тормозит! Ничего не выполняется!
Весь отдел не может работать!» – не таков
ли ночной кошмар многих администраторов
Microsoft SQL Server? Увы, порой скорость
работы этой базы данных падает без
видимых причин. Что же случилось?

ЮЛИЯ ШАБУНИО
абота администратора базы 2000. Основные причины замедления Представьте себе, что у вас есть таб-
данных Microsoft SQL Server по- работы будут актуальны и для 2005-й лица заказов с полями Data и Status. И
рой бывает легка и необремени- версии, но способы решения для них вас интересуют невыполненные заказы
тельна. В самом деле, если настроена могут заметно отличаться (впрочем, в за последние полгода. Если вы попы-
регулярная архивация, вдумчиво про- 2005-й наверняка появятся свои соб- таетесь получить информацию через
писаны права пользователей, везде ственные, уникальные способы работать запрос с параметрами, то сервер, ско-
стоит последняя версия клиентского медленно). Результаты DBCC-запросов рее всего, выберет индекс по дате. Про-
приложения, то заняться бывает не- и структура системных таблиц могут сто потому, что Status, как правило, оди-
чем. Но увы, рано или поздно звонит для них заметно отличаться, но общая наков для всех («Выполнен»), а вот дата
(а то и прибегает) какой-нибудь «Глав- логика работы остаётся прежней. принимает огромное число разных зна-
ный Пользователь» и громко жалует- чений, и условие по ней может вернуть
ся на то, что «всё тормозит и ничего Причина первая. как большой, так и очень маленький ре-
не работает». При этом беглый анализ Ошибки в индексах зультирующий набор. Мы-то знаем, что
ситуации показывает, что вроде бы всё Они встречаются чаще всего. Когда нас интересуют только невыполненные
в порядке, сервисы запущены, в логах программист создаёт индекс на табли- заказы, которых совсем мало, и при их
ошибок нет. То есть всё работает. Но це базы данных, таблица чаще всего поиске индекс по статусу сработал бы
очень медленно. И приходится адми- или совсем пуста, или заполнена не- великолепно. Но серверу на момент
нистратору базы данных, а то и про- сколькими тестовыми строчками. Про- компиляции запроса не известно, какое
граммисту из службы техподдержки верить эффективность выбранных ин- значение мы подставим в параметр
брать универсальные инструменты дексов в данной ситуации практически @Status – «Выполнен» или «Не выпол-
Microsoft – EM (SQL Server Enterprise невозможно. Поэтому индексируемые нен». Поэтому он не может использо-
Manager) и QA (SQL Query Analyzer) и поля выбираются или наугад, или в со- вать индекс по статусу, так как в том
браться за решение проблемы произ- ответствии со стандартными подсказ- случае, когда параметр равен «Выпол-
водительности Microsoft SQL Server. ками Microsoft SQL Server. Например, нен», этот индекс бесполезен. Вместо
Мой опыт показывает, что причин EM автоматически создаёт кластерный этого сервер предпочтёт индекс по дате,
внезапных «торможений» не так уж и индекс по суррогатному первичному который даст более-менее приемлемую
много. ключу, что довольно редко является скорость в любом случае.
идеальным решением. Из проблем про- Таким образом, упускается возмож-
изводительности эта наиболее прият- ность использовать индекс по статусу,
ная, так как простое изменение схемы позволяющий мгновенно выбрать невы-
базы данных позволяет совершить ма- полненные заказы. И неэффективный
ленькое чудо. план выполнения заставляет систему
задуматься в самом неожиданном мес-
Причина вторая. те, где в нормальных условиях сервер
Неправильные планы запросов зависать не должен.
Microsoft SQL Server обладает очень Отмечу, что не только запрос с па-
неплохим оптимизатором запросов. Но раметрами может порождать неудачные
Все примеры в данной статье рас- и он иногда ошибается. Типичная при- планы запросов. Не менее часто встре-
смотрены на базе Microsoft SQL Server чина ошибок – запрос с параметрами. чаются сбои из-за нехватки памяти и

40
администрирование
некорректной статистики содержимого рабатывать эту ситуацию, и поэтому дить постоянно, и лучше в автоматичес-
таблицы. они обычно проявляют себя не в виде ком режиме. Исчерпание пропускной
замедления работы, а в виде частых способности дисков вызывает только
Причина третья. ошибок заданий (jobs) и откатов кли- замедление работы, но зато справить-
Распределённые блокировки ентских транзакций. Появление сооб- ся с нею гораздо сложнее, приходится
Microsoft SQL Server обеспечивает изо- щений о дедлоках означает, что со стра- задуматься о серьёзной реорганизации
ляцию транзакций с помощью блокиро- тегией блокировок не всё в порядке и дискового массива. Проблема с недо-
вок строк, страниц и таблиц базы дан- распределённая блокировка уже где- статком оперативной памяти внешне
ных. При этом если два потока пытают- то рядом. выглядит очень похоже, с единственной
ся установить несовместимые типы разницей, что проблема касается не
блокировок на один и тот же объект, то только SQL-сервера, но и всей опера-
одному из них придётся ждать, пока вто- ционной системы (так как современные
рой не закончит работу с этим объек- компьютеры всегда стараются скомпен-
том. Таким образом замедляется рабо- сировать недостаток памяти за счёт
та как отдельных процессов, так и всей дискового пространства, серьёзно на-
системы. Иногда возникает такая ситу- Ðèñóíîê 2. Deadlock гружая при этом подсистему ввода-вы-
ация, что первый процесс надолго зах- Когда дедлок происходит на двух от- вода). Процессор, как ни странно, очень
ватил объект А, второй захватил B и дельных объектах базы данных из-за редко бывает камнем преткновения в
ждёт, пока освободится А, третий зах- доступа к ним в разном порядке (как работе MS SQL и никогда не приводит
ватил важный для всех объект C и пы- изображено на рис. 2), тогда он весьма к резкому замедлению. Если загрузка
тается обработать B, а еще огромное просто находится и проблема снимает- процессора подскочила до 100% вне-
множество процессов ждёт С, порой ся. Хуже бывает, когда дедлок проис- запно, то это не исчерпание ресурса
захватив еще что-нибудь (рис. 1). ходит внутри одной таблицы – если про- процессора, а появление какого-то не-
цессы сначала работали в разных её ча- корректно работающего приложения.
стях, а потом каждый захотел заглянуть Перед тем как принимать решение
на территорию другого. В этом случае о необходимости масштабного обнов-
дедлок может возникнуть даже без яв- ления, обязательно надо проверить, всё
ной транзакции, во время самого обыч- ли в порядке с тем оборудованием, что
ного обновления большой таблицы. уже есть. Мне известны случаи, когда
случайно отключенный кэш записи на
Причина пятая. контроллере дискового массива приво-
Проблемы с памятью, диском дил к падению скорости работы всей
и процессором системы в четыре раза. И нельзя забы-
Бывает и так, что в базе идеально на- вать, что проблемы на железном уров-
Ðèñóíîê 1. Ðàñïðåäåë¸ííàÿ áëîêèðîâêà строены все индексы, запросы выпол- не могут быть следствием одной из пре-
При этом создаётся впечатление, няются по оптимальным планам, вза- дыдущих причин. Например, непра-
что не работает вообще ничего. Порой имных блокировок процессов нет во- вильный план запроса может создать
не получается даже запустить EM, так обще – а работа всё равно происходит большую нагрузку на жесткий диск, что
как блокировки есть на используемых медленно. Увы, любая система в конце не справится никакой RAID. Поэтому
им системных таблицах. Такую ситуа- концов упирается в «железные» огра- аппаратной частью имеет смысл зани-
цию я называю распределённой блоки- ничения, в размер оперативной памя- маться только в том случае, если исклю-
ровкой, и это одна из очень неприятных ти, в пропускную способность и объём чены все остальные причины.
проблем. В огромной куче заблокиро- жестких дисков, в максимальную про-
вавших друг друга процессов бывает изводительность процессора. Исчерпа- Поиск причин проблемы
довольно сложно найти тот, который во ние любого из этих ресурсов может вы- Итак, давайте вернёмся к исходной си-
всём виноват. А им не всегда является зывать замедление работы. Проще туации. Мы имеем недовольных пользо-
самый первый процесс. В рассмотрен- всего обнаруживается (да, пожалуй, и вателей и сервер, который работает
ной ситуации виноват скорее тот, кто лечится) нехватка места на жёстком очень медленно. С какой стороны на-
захватил С. диске. Причём последствия этой не- чинать? Первое, что надо сделать – это
хватки могут быть просто катастрофи- определить масштабы происшествия
Причина четвертая. ческими. Например, прекращение рабо- (рис. 3). Если пользователи жалуются,
Дедлоки (Deadlocks) ты резервного копирования, остановка что не работает вообще ничего, всё сто-
Особый случай блокировок. Знакомая сервисов, работающих с диском, паде- ит, приложение не запускается, то, ско-
всем ситуация – процесс 1 захватил ние сервиса SQL и наконец аварийная рее всего, мы имеем дело с распреде-
объект А и ждёт доступа к Б, а процесс 2 остановка операционной системы без лённой блокировкой или же с аппарат-
захватил Б и ждёт доступа к А (рис. 2). возможности нормальной загрузки. В ными проблемами (во втором случае
Если бы не система обнаружения дед- результате можно потерять базу данных жалобы будут менее интенсивными,
локов, они бы прождали вечно. К сча- и все последние данные резервного зато гораздо более продолжительными,
стью, MS SQL Server хорошо умеет об- копирования, так что за этим нужно сле- так как распределённая блокировка

№5, май 2005 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
-- Êàêèå ïðîöåññû îæèäàþò çàõâàòà êàêèõ ðåñóðñîâ.
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
Ðèñóíîê 3. Ïåðâîíà÷àëüíàÿ îöåíêà ñèòóàöèè , 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()
определяются процедурой sp_lock. Но вот скажите честно, and l.Status in ( 'GRANT', 'CNVT')
что можно понять, глядя на выводимый ею результат... and exists ( select *
from #LOCK l2
where l2.Status not in ( 'GRANT', ↵
spid dbid ObjId IndId Type Resource Mode Status 'CNVT')
------ ------ ----------- ------ ---- ---------------- -------- ------ and l2.dbid = db_id()
51 5 0 0 DB S GRANT and l.ObjId = l2.ObjId
53 5 0 0 DB S GRANT and l.Resource = l2.Resource
54 5 0 0 DB S GRANT )
55 5 0 0 DB S GRANT group by o.name, l.Status, l.Type, l.Mode, l.spid
57 5 308912172 0 TAB IS GRANT
.... 375 строк
200 5 64719283 2 PAG 5:1730834 IX GRANT ! Функции left используются для того, чтобы сократить ши-
200 5 0 0 PAG 4:133248 IX GRANT рину вывода (он и так получается очень широкий). При
200 5 475148738 1 PAG 6:122208 SIX GRANT
200 5 571149080 0 TAB IX GRANT
необходимости можно увеличить отображаемую часть
полей.
На её основе можно разве что сформулировать утвержде- ! Функция max() используется для того, чтобы отобразить
ние «блокировки на сервере есть». Если вы регулярно за- поле, не участвующее в group by, но при этом точно
пускаете sp_lock, то вы можете оценить лишь среднее чис- имеющее однозначное значение. Это работает, так как
ло блокировок и убедиться, что сейчас их «больше», «мень- max из списка одинаковых значений равен тому же са-
ше» или «как обычно». Для более серьёзного анализа та- мому значению.

42
администрирование
Как правило, бывает достаточно несколько раз выполнить но, возможно, даже потребуется вынести в отдельное зада-
скрипт 1, чтобы полностью оценить картину – какие про- ние выполнение запросов и сохранение результатов в спе-
цессы блокируют какие ресурсы и кому при этом мешают. циальной таблице, чтобы потом проанализировать статис-
Я не стану приводить полное описание полей запроса, тику и понять, какие процессы чаще всего «цепляются».
так как это простое соединение (join) результата sp_lock с
системными таблицами sysobjects (анализируются только Анализ блокировок отдельного процесса
блокировки на текущей БД) и master..sysprocesses, их поля Тот же метод сохранения блокировок во временной табли-
описаны в BOL (Books Online), да и сами по себе они доволь- це может быть использован и для анализа текущего состо-
но очевидны. Хочу сразу предупредить о возможной пробле- яния отдельного процесса. Конечно, надёжнее всего отсле-
ме. Sp_lock даёт мгновенный снимок ситуации. К тому вре- дить его работу с помощью профайлера. Но бывает так,
мени, когда выполнение добирается до sysobjects и что профайлер не может помочь, ведь он показывает текст
master..sysprocesses, уже может не оказаться тех процессов, запроса только в момент начала или окончания его обра-
что создавали блокировки, зато могут появиться новые про- ботки. А что делать, если начало мы уже пропустили, а ко-
цессы (причём с тем же spid), и запрос даст неправильный нец будет неизвестно когда, так как процесс подвис? Кро-
результат. Особенно это актуально, когда система «живёт», ме того, далеко не всегда есть время (или возможность)
и в ней в каждый момент времени появляется и исчезает запустить и настроить профайлер.
большое число процессов и выполняется много запросов. В этой ситуации может помочь разобраться вот такой
Но в случае распределённой блокировки или же просто слож- скрипт (выполняемый после сохранения блокировок в
ной ситуации нужные вам процессы останутся на месте. Хуже #LOCK):
того, я советую не принимать решений по первому же ре-
зультату. Выполните этот запрос несколько раз, чтобы по- Ñêðèïò 2
нять, какие процессы были заблокированы случайно и нена- select count(*) as LockCnt, left(o.name, 32 ) as ObjectName
долго, а какие стабильно присутствуют и являются основой , l.Status, l.Type, l.Mode, l.spid
, max(Resource) as SampleResource
распределённой блокировки. Тот же самый скрипт 1 помо- , 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

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


Проанализируем результат работы скрипта 1 (вывод см. бам блокировки и названию таблицы, тут мы имеем дело
ниже). Думаю, читатель оценит уровень его информатив- со штатной ситуацией синхронизации потоков с помо-
ности (особенно в сравнении с результатом sp_lock). щью блокировок и наше вмешательство не требуется.
1. Задание 0x08989EF05DAC704E94F6D25A2EB2FB75 дер- 3. В эксклюзивное пользование захвачен объект sp_Run-
жит X (эксклюзивную) блокировку на таблицу Calls. Само Commands. Обратите внимание, что это не таблица, а
по себе это нормально, но мешает работать четырём процедура. На неё устанавливается X-блокировка толь-
другим задачам, которые, кстати, не планируют захва- ко на время перекомпиляции. Однако возможности пе-
тывать таблицу целиком. Вместо этого они ждут воз- рекомпилировать эту процедуру ждут ещё два процесса.
можности установить IX (эксклюзивная блокировка на- Значит, она из числа тех, чей план запроса не сохраняет-
мерения) на неё, чтобы потом использовать эксклюзив- ся в кэше, а каждый раз генерируется заново (например,
ные блокировки на уровне страниц или ключей. Это в ней может использоваться созданная «снаружи» вре-
проблема, и её размеры зависят от значимости табли- менная таблица). Как видите, такие процедуры не толь-
цы Calls в системе и от целей всех этих пяти заданий. ко съедают ресурсы сервера при каждом выполнении, но
2. В таблице DCLocks захвачен один диапазон. Этот же и служат причиной блокировок и ожиданий, если исполь-
диапазон ждут три других процесса, планируя в свою зуются несколькими потоками одновременно.
Cnt ObjectName Status Type Mode spid SampleResource loginname lastwaittype hostname full_program_name
--- -------------- ------ ---- ---- ----- ---------------- ---------------- ------------ -------- -------------------------------------------------------------------------
1 Calls WAIT TAB IX 96 ES\RootUserLogin LCK_M_IX BUSINESS SQLAgent - TSQL JobStep (Job 0xA52C73583FBDDA43B93ABD532E9C88DD : Step 1)
1 Calls WAIT TAB IX 103 ES\RootUserLogin LCK_M_IX BUSINESS SQLAgent - TSQL JobStep (Job 0x4534BA77AA627843AE48F80997D8E4C8 : Step 1)
1 Calls WAIT TAB IX 168 ES\RootUserLogin LCK_M_IX BUSINESS SQLAgent - TSQL JobStep (Job 0x8F60801B8AC0B44B809F7AE0AEC4FCF7 : Step 1)
1 Calls WAIT TAB IX 175 ES\RootUserLogin LCK_M_IX BUSINESS SQLAgent - TSQL JobStep (Job 0x86BB523C4DEE964EA16A4AD23348997B : Step 1)
1 DCLocks WAIT KEY X 55 (010041dc3da7) ES\Admin LCK_M_X SM2 DeviceManager
1 DCLocks WAIT KEY X 79 (010041dc3da7) ES\Admin LCK_M_X SM2 DeviceManager
1 DCLocks WAIT KEY X 111 (010041dc3da7) ES\Admin LCK_M_X SM2 DeviceManager
1 sp_RunCommands WAIT TAB X 81 [COMPILE] ES\Admin PAGELATCH_SH SM2 DeviceManager
1 sp_RunCommands WAIT TAB X 114 [COMPILE] ES\Admin LCK_M_X SM2 DeviceManager

Cnt ObjectName Status Type Mode spid SampleResource loginname lastwaittype hostname full_program_name
--- -------------- ------ ---- ---- ----- ---------------- ---------------- ------------ -------- -------------------------------------------------------------------------
1 Calls GRANT TAB X 127 ES\RootUserLogin WRITELOG BUSINESS SQLAgent - TSQL JobStep (Job 0x08989EF05DAC704E94F6D25A2EB2FB75 : Step 1)
1 DCLocks GRANT KEY X 53 (010041dc3da7) ES\Admin PAGELATCH_UP SM2 DeviceManager
1 sp_RunCommands GRANT TAB X 59 [COMPILE] ES\Admin WRITELOG SM2 DeviceManager

№5, май 2005 43


администрирование
Как видите, он просто возвращает список всех блоки- да spid вам реально пригодится, если процесс запущен с
ровок, которые осуществляет данный процесс. Если вам вашей же машины под вашим логином и из приложения
известен spid процесса, то можно в условии использовать Query Analyzer. Тогда вам останется просто перебрать все
прямо его. При желании вам доступен весь спектр полей открытые окна QA в поисках нужного. (В окне QA иденти-
master..sysmessges, позволяющий отобрать процесс по фикатор процесса написан в статусной строке, это число в
имени приложения, логину пользователя, названию клиен- скобках после имени пользователя.) В любых других слу-
тского компьютера или любым другим сочетанием условий. чаях надо искать более конкретную информацию о том, кто
Результат этого запроса позволяет понять, к каким табли- же является хозяином процесса.
цам ваш процесс сейчас осуществляет доступ. Часто этого В первую очередь посмотрите на master..sysprocesses (са-
бывает достаточно, чтобы оценить точку выполнения с точ- мые полезные поля из нее сразу выводятся скриптом 1).
ностью до строки кода. Как правило, вы увидите имя пользователя, компьютера и
приложения, запустившего нужный вам процесс. Очень ча-
Распределённая блокировка и sp_who2 сто этого бывает достаточно. Если приложение называет-
Прежде чем переходить к следующей части, нельзя не ся как-то вроде «Job 0x08989EF05DAC704E94F6D25
вспомнить более известный способ поиска головного про- A2EB2FB75 Step 2» – значит, за этот процесс отвечает за-
цесса в распределённой блокировке. дание сервера. Его «настоящее имя» (то есть то, которое
Это – системная процедура sp_who2. Она показывает в можно увидеть в папке <ИмяСервера>/Management/SQL
поле BlkBy важнейшую информацию – ожидает ли конкрет- Server Agent/Jobs приложения EM) узнать очень просто:
ный процесс завершения работы другого, и какого именно. выполните в QA запрос:
По результатам выполнения sp_who2 довольно легко най-
ти тот spid, который никем не заблокирован, но при этом select convert( varbinary(30), job_id), ↵
name from msdb..sysjobs order by name
блокирует всех остальных.
Я предпочитаю обработанный вывод sp_lock, так как он и найдите в списке код нужного вам задания.
показывает, не только какой процесс является причиной бло- Если на вашем сервере задания играют существенную
кировок, но и какие объекты являются причиной столкнове- роль, вам скоро надоест делать поиск по этому списку, и вы,
ния интересов. Ведь порой бывает, что вносить исправле- вероятно, захотите сразу видеть имя нужной вам задачи в
ния надо вовсе не в головной процесс, а в один из заблоки- выводе скрипта.
рованных им (например, добавить в их код подсказку nolock, Но тут имеется небольшая проблема – когда вы делаете
чтобы они больше не зависели от головного процесса). запрос в QA, он автоматически преобразует для вас varbinary
Но если вам сложно оказалось разобраться в огромном в нужную форму. А чтобы сделать то же самое программно,
списке ожидающих и ожидаемых процессов, возвращаемых понадобится небольшая процедура:
скриптом 1, то sp_who2 может вам помочь.
Учитывайте только, что при совместном использовании Ñêðèïò 3
скрипта 1 и sp_who2 их стоит запускать в одном и том же create function dbo.uniqueidentifier_to_varchar ↵
пакете (batch), чтобы минимизировать время между снимка- ( @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'
Итак, тем или иным способом вы нашли spid процесса, ко-
while ( @i <= 16 )
торый виноват в замедлении работы. Но обычно по spid begin
сложно понять, что же этот процесс делает и как изменить select @byte = substring(@binary, @i, 1)
select @hex = case when @byte/16 < 10
его, чтобы устранить проблему. Единственный случай, ког- then char( ascii('0') + @byte/16 )

Безобидная разделяемая блокировка ют или обновляют множество процессов, то один пользо-


Мне часто встречалась одна характерная ошибка, и я хочу ватель, решивший выполнить сканирование таблицы и за-
предостеречь от нее вас. А именно – при анализе блокиро- получивший на нее табличную S-блокировку, способен пол-
вок полностью не принимаются во внимание блокировки ностью застопорить работу всей системы с помощью «бе-
типа S (Share, разделяемая) и IS (Intent Share, разделяе- зобидной» блокировки на чтение.
мая блокировка намерения). Считается, что эти блокиров- Поэтому, например, правилом хорошего тона является
ки «безобидные». Такой вывод делается потому, что бло- всегда писать nolock при сканировании большой и часто
кировки S от разных процессов совместимы между собой, обновляемой таблицы в рабочей базе данных.
и много приложений могут рассматривать объект одновре- Единственной по-настоящему безобидной блокировкой
менно, в противоположность X-блокировкам, которые зах- является Sch-S, означающая запрет на изменение структу-
ватывают объект в личное пользование и несовместимы ры таблицы и ничего больше. Если процесс наложил такую
ни с чем. Но нельзя забывать о том, что S-блокировки не блокировку, значит, он читает её в nolock-режиме или его
совместимы с X. уровень изоляции транзакции допускает «грязное чтение»,
Например, если какую-то таблицу постоянно дописыва- что по сути означает то же самое.

44
администрирование
else char( ascii('A') + @byte/16 - 10 ) темные таблицы, он сам попадает в число заблокирован-
end + ных процессов и не способен сообщить вообще ничего
case when @byte%16 < 10
then char( ascii('0') + @byte%16 ) (cкрипты же специально на этот случай обращаются к сис-
else char( ascii('A') + @byte%16 - 10 ) темным таблицам с nolock).
end
select @res = @res + @hex, @i = @i + 1 Еще одна особенность EM по сравнению с приведён-
end ными скриптами – он не ограничен текущей базой данных
return @res и показывает картину процессов всего сервера (сами ре-
end шайте, плюс это минус).
Теперь можно найти нужную задачу напрямую, например, так: Чтобы получить доступ к блокировкам на нескольких
конкретных базах данных сразу, в скрипт достаточно бу-
select name from msdb..sysjobs where ↵ дет добавить несколько разных таблиц sysobjects, но сде-
dbo.uniqueidentifier_to_varchar( job_id ) = ↵
'0x07E7726D989CCA4E9103F874F473C2AF' лать его полностью универсальным можно только с помо-
щью представления (view) или динамического запроса (см.
или так: таблицу).
Òàáëèöà. Ñðàâíåíèå äâóõ ìåòîäîâ àíàëèçà áëîêèðîâîê
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)) и использовать Представьте, вы выполняете запрос, показывающий состо-
её в запросах, обновляя по мере необходимости. Это чре- яние блокировок, а он говорит, что блокировок на базе дан-
вато рассинхронизацией данных, однако задания доволь- ных нет! Несколько последующих запросов выдают ту же
но редко создаются, так что вполне можно работать, об- самую картину, а сообщения о проблемах продолжаются.
новляя табличку по мере необходимости. Увы, в этом случае нет однозначного рецепта. Начать сто-
Если всего вышерепечисленного оказалось недостаточ- ит с проверки разнообразных логов – начиная с журналов
но, попробуйте выполнить: заданий и SQL Server и заканчивая журналами Windows.
Возможно, причиной замедления работы явился какой-то
dbcc inputbuffer( <Íîìåð ïðîöåññà> ) ресурсоёмкий процесс, вроде резервного копирования, пе-
рестройки индексов или проверки физической целостнос-
Этот dbcc-запрос покажет, какой именно код выполня- ти базы данных. Если сервер работает на пределе мощно-
ет процесс, указанный в качестве его параметра. Помните, сти, то такие процессы способны в разы замедлить его ре-
что размер буфера ограничен и что-нибудь «многоэтажное» акцию.
может оказаться почти полностью за его рамками. Но того, Для выявления самых ресурсоёмких процессов можно
что есть, обычно оказывается достаточно, чтобы понять, использовать запрос, подобный следующему:
«откуда ветер дует».
Читатель может заметить, что предлагаемые мною скрип- Ñêðèïò 4
ты не добавляют никакой новой информации. Практически select top 10
всё это можно получить с помощью EM (<ServerName>/ physical_io/(datediff( second,
login_time,
Management/current Activity). На это я могу сказать только dateadd( second, 2, getdate())
одно – если вам так удобнее, используйте EM! )
)
Образы мышления людей, предпочитающих табличное , physical_io, spid
и древовидное представления, очень отличаются друг от , datediff( second
, login_time
друга. Но и тем, кто предпочитает дерево, мой запрос мо- , dateadd( second, 2, getdate())
жет пригодиться. )
, program_name, *
Ведь EM не отличается высокой скоростью работы на from master..sysprocesses
медленных соединениях, и вам придётся очень долго ждать order by physical_io/(datediff( second
, login_time
реакции (и не получится обновлять представление доста- , dateadd( second, 2, ↵
точно часто, чтобы увидеть динамику происходящего). Кро- getdate())
)
ме того, запрашивая информацию об объектах, EM созда- ) desc
ёт блокировки на таблицах. А это значит, что в случае гло-
бальной распределённой блокировки, затрагивающей сис- Его действие основано на том, что для каждого процес-

№5, май 2005 45


администрирование
са сервер ведёт счётчик использования основных ресур- процессор за два отдельных и соответственно планировал
сов – памяти, диска, процессора. Сами по себе показания запросы.
счётчика дают немного, и при упорядочении по ним вперёд В решении аппаратных проблем порой помогают счёт-
вырываются системные процессы – те, что работают с мо- чики производительности (performance counters). Они при-
мента включения системы и до момента её выключения. гождаются и для решения специфических для SQL задач,
Но если поделить значение счётчика на время жизни про- так как сервер позволяет наблюдать огромное число своих
цесса, мы получим интенсивность использования ресурсов, параметров. Мне часто приходилось работать в ситуации,
что даёт неплохую возможность найти самый нагружающий когда я не имела доступа к удалённой консоли, да и просто
сервер процесс. не могла выполнить Windows-логин на сервер (или это было
Только не стоит обращать внимание на короткоживущие долго и неудобно), но имела права на выполнение xp_
процессы, на секунду выпрыгивающие наверх и исчезаю- cmdshell. В этой ситуации можно более-менее комфорта-
щие при повторном запросе. Они попадают в лидеры толь- бельно смотреть на счётчики производительности с помо-
ко из-за маленького времени жизни и впоследствии не ока- щью утилиты typeperf. Она входит в Microsoft Windows NT
зывают большого влияния на сервер. Кроме physical_io, Workstation 4.0 Resource Kit, Windows 2000 Resource Kit или
можно точно так же строить запросы на основе полей cpu и в Windows XP. Пример выполнения этой процедуры из QA
memusage. приведён в скрипте 5. Результат её работы можно посмот-
Если и здесь не получилось найти виновного, то при- реть в разделе «Пример работы утилиты typeprf».
дётся спускаться на аппаратный уровень (а даже если и
получилось, то надо учитывать, что когда ресурсов доста- Ñêðèïò 5
точно, никакой dbcc checkdb не должен замедлять работу -- Äëÿ òîãî ÷òîáû ïîñ÷èòàòü ïðîöåññîðû è ëîãè÷åñêèå äèñêè
сервера). -- è ïîëó÷èòü ñïèñîê äîñòóïíûõ ñ÷¸ò÷èêîâ, ðàñêîììåíòèðóéòå
-- ñëåäóþùèå çàïðîñû.
Этот вопрос, вообще говоря, выходит за рамки данной -- 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 на
RAID выполняет интеграцию нового диска в массив, то он сервер. Может статься так, что у вас будет очень ограничен-
не только работает в несколько раз медленнее, но и нахо- ное время на анализ ситуации, и тогда доступ к Windows-
дится в очень нестабильном состоянии (если сбой питания счётчикам без стандартной утилиты администрирования
для обычного жесткого диска слегка неприятен, то для RAID- Perfomance monitor вам очень пригодится. Очевидно, что
массива в состоянии перестройки практически смертелен). подобным же образом можно смотреть журналы любых
Сбои в памяти чреваты целым спектром проблем от про- приложений (очень рекомендую стандартные GNU-утлиты
стого замедления до появления ошибочных данных и пол- tail, head и grep), в том числе Windows логи и даже логи Sql
ного разрушения базы. Server (из EM до них порой не добраться).
Процессор тоже может влиять на поведение сервера не- Итак, в первой части статьи мы рассмотрели методы
предсказуемым образом. Однажды мне пришлось решать локализации проблем производительности Microsoft SQL
следующую проблему. Все процессы начинали работу в хо- Server в случае глобальнного замедления работы. Нам ос-
рошем темпе. Однако спустя некоторое время скорость ра- талось рассмотреть, как найти проблемную точку в зара-
боты падала в несколько раз. Ситуацию спасло отключе- нее известном процессе, локализовать дедлоки, и обсудить
ние Hyper Threading. Возможно, оптимизатор параллель- методы решения обнаруженных проблем. Этим вопросам
ных процессов Microsoft SQL Server принимал «сдвоенный» будет посвящена вторая часть статьи.

Пример работы утилиты typeperf


output
Cистема прилично загружена, средняя длина -----------------------------------------------------------------------------
очереди составляет 1-2 пакета, тогда как в нор- 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"
дисков уже маленькое (диски простаивают от 50 "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"
до 5% времени, т.е. иногда они загружены на "04/13/2005 19:13:01.846","29,687050","91,170583","0,911706","19,050122","0,000000"
95%). Но прямо сейчас они не должны замед- "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"
трольная точка (Checkpoint) проходит стабильно "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"
за 1-2 секунды, значит, производительность за- "04/13/2005 19:14:07.846","22,460444","153,620983","1,536210","10,510067","0,000000"
Exiting please wait...
писи на диск достаточная. Стоит проверить счёт- The command completed successfully.
чики, ориентированные именно на чтение.

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

СИСТЕМА ВЕЩАНИЯ НА ОСНОВЕ


WINDOWS MEDIA SERVICES 9
ЧАСТЬ 2

В прошлый раз мы установили медиасервер,


настроили многоадресное вещание с TV-тюнера
и обеспечили on-demand доступ к небольшой
видеотеке. Сегодня мы продолжим наше
знакомство с Windows Media Services 9,
в процессе которого создадим маленькую
радиостанцию, а также рассмотрим варианты
настройки «живого» вещания с веб-камер.

МИХАИЛ ПЛАТОВ
Делаем радиостанцию ся файлы в формат .wma с жестко заданным битрейтом (на-
Для нашей радиостанции мы будем использовать набор пример, 32 Кбит). Для решения этой задачи теоретически
файлов, расположенных в определенной папке жесткого можно воспользоваться уже знакомым нам интерфейсом
диска. Несмотря на то что сервер Windows Media позволя- кодировщика Windows Media Encoder, однако на практике
ет организовывать вещание музыкальных файлов, храня- так лучше не делать. Интерфейс не позволяет выбрать для
щихся как в формате .mp3, так и формате wma, предпочти- кодирования сразу несколько файлов (или папок), поэтому
тельным является использование «родного» формата – такой процесс перекодирования может несколько утомить.
wma. Дело в том, что при использовании файлов mp3 ве- Но тот факт, что «интерфейс не позволяет», еще не означа-
щание все равно будет вестись в формате wma, при этом ет, что «кодировщик не умеет». В нашем случае необходи-
сервер «на лету» будет перекодировать поток в wma. Кро- мой функциональностью обладает скрипт 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) ко-
щания необходимо заранее перекодировать все имеющие- дировщик сообщит о возможных ключах вызова.

48
администрирование
Полный список ключей очень велик, поэтому позволю editor», в появившемся окне выберем «Create a new playlist»
себе привести пример вызова данного скрипта, при котором и нажмем «OK». Перед нами предстанет окно редактора
кодировщик в два прохода перекодирует содержимое папки списков воспроизведения – Windows Media Playlist Editor. Ин-
c:\music_mp3 к формату .wma с постоянным битрейтом 32К1: терфейс добавления объектов в список воспроизведения
интуитивно понятен, а вот на типах добавляемых объектов
cscript WMCmd.vbs -input "e:\music_mp3" ↵ остановимся более подробно. В редакторе play-листов мож-
-output "e:\music_wma" -a_mode 1 -profile a32
но определить элементы следующих типов:
! Media – основной элемент любого списка воспроизве-
Пишем ноты для оркестра дения. Используется для указания медиа-ресурса (фай-
Таким образом, подготовительная часть закончена, и теперь лы, потоки с кодировщика или медиа-сервера и т. д.),
можно приступить непосредственно к настройке сервера. вещаемого в сеть.
В принципе, для решения поставленной задачи вполне мож- ! Advertisement – позволяет вставить в список реклам-
но обойтись способом вещания всех файлов из папки, рас- ный ролик. Данный пункт особенно интересен, когда в
смотренным в предыдущей статье [1]. Но для разнообра- качестве источника рекламных вставок используется
зия мы рассмотрим другой способ – с использованием сер- ASP- и CGI-скрипт.
верных списков воспроизведения (server-side playlist). В этом ! Sequence – объект-последовательность. Определяет
случае из произвольного набора файлов, папок, потоков с последовательность воспроизведения. Все медиа-источ-
кодировщиков и с других точек распространения можно ники, перечисленные в рамках элемента sequence, бу-
собрать общий список воспроизведения, содержимое ко- дут воспроизводиться в строго указанном порядке.
торого будет «вещаться» в указанном нами режиме (unicast ! Switch – объект-переключатель. Позволяет определить
или multicast) и порядке. Кроме того, вышеперечисленный «альтернативные» медиа-источники, которые будут ис-
контент можно дополнительно «разбавить» с помощью так пользованы в случае, если основной источник будет не-
называемых «рекламных заставок», (например, медиафай- доступен. Данный объект очень полезен при организа-
лы, описывающие нашу радиостанцию, рекламу спонсора ции вещания «живых» источников, например, его мож-
или хостинг-провайдера)2. но использовать для обработки ситуаций, в которых ис-
Итак, откроем уже знакомую нам оснастку сервера точник временно не доступен.
Windows Media и создадим broadcast-точку вещания radio, ! Exclusive – позволяет определить набор медиа-источ-
работающую по списку воспроизведения (см. рис. 1). ников, порядок воспроизведения которых может менять-
ся (например, один медиа-файл может «прерывать» вос-
произведение другого).
! priorityClass – данный параметр определяет, как один
объект прерывает воспроизведение другого. Обычно он
используется совместно с параметром Exclusive.
! clientData – позволит отображать дополнительную ин-
формацию (исполнитель, название альбома и т. д.) о
медиа-источнике во время ее воспроизведения.

Итак, перейдем к созданию простого списка воспроиз-


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

Ðèñóíîê 1. Ñîçäàíèå òî÷êè ðàñïðîñòðàíåíèÿ äëÿ ðàäèîñòàíöèè


Выберем только что созданную точку вещания, перей-
дем на закладку «Source», нажмем на кнопку «View playlist Ðèñóíîê 2. Ðåäàêòîð ñïèñêîâ âîñïðîèçâåäåíèÿ

1
Для потока, доступного через dial-up рекомендуется кодировать с битрейтом 64 Кбит (ключ -a64).
2
Хотя для вставки «настоящей» рекламы все же лучше использовать вещание на основе скриптов.
3
При желании можно использовать и более сложную структуру списка воспроизведения. Например, с помощью объектов sequence можно
разбить день на несколько отрезков, в рамках которых будет вестись вещание музыки определенного жанра.

№5, май 2005 49


администрирование
Сохраним список воспроизведения и перейдем к на- ностью не более 70 Кбит. Для вещания в режиме multicast
стройке параметров точки вещания. включим плагин «WMS Multicast Data Writer» (категория
«Multicast Streaming»).
Учим сервер «петь» С помощью «Multicast Announcement Wizard» создадим
В предыдущий раз [1] мы определяли параметры вещания файлы анонса, необходимые для доступа к точке вещания
в разделе «Properties» соответствующей точки распрост- со стороны клиентов6.
ранения. Это место не является единственным. В Windows
Media Services параметры точки распространения опреде-
ляются на двух уровнях: для всего сервера4 и для каждой
конкретной точки распространения. Параметры точки рас-
пространения (если, конечно, они заданы) имеют более вы-
сокий приоритет и переопределяют соответствующие на-
стройки уровня сервера. В то же время некоторые из них
(например, для плагинов протоколов HTTP, RTSP и MMS
встроенные парсеры медиа-форматов mp3, jpeg и др.) мож-
но задать только для сервера. К серверным настройкам мы
еще вернемся, а пока займемся точками распространения.
Первым делом включим режимы «Loop» и «Shuffle» (что-
бы медиа-файлы бесконечно долго воспроизводились в слу-
чайном порядке). Для этого соответствующим образом из-
меним параметры плагина: «Playlist Transform → WMS Playlist
Transform → Properties».
В разделе «General» отключим опцию «Start publishing Ðèñóíîê 3. Âàðèàíò èíòåðôåéñà ìóçûêàëüíîãî ñåðâåðà
point when first client connects» (для работы в режиме multicast) После размещения этих файлов на веб-сервере мы по-
и включим опции «Enable Broadcast Auto-Start» и «Enable лучим собственную радиостанцию с доступом из Интерне-
Advanced Fast Start»5. та7, подключиться к которой смогут все пользователи, име-
Перейдем к настройкам аутентификации. В Windows ющие проигрыватель Windows Media Player 9 или выше.
Media поддерживается три варианта аутентификации:
! Anonymous. При использовании данного варианта до- Выбор веб-камеры
ступ к медиа-файлам осуществляется с правами задан- Согласно разработанному в прошлый раз «генеральному
ного для точки вещания (или для всего сервера) пользо- плану» [1], мы хотим организовать вещание с веб-камер,
вателя. Схема удобна при организации доступа к ре- установленных в интересующих нас местах. Какую камеру
сурсу со стороны большого количества пользователей, выбрать, как правильно ее подключить? Постараемся ра-
в особенности из Интернета. зобраться в этом вопросе и посмотрим, какие типы реше-
! NTLM/Kerberos. Способ удобен при разграничении прав ний присутствуют на рынке. Мне известно о существова-
доступа к контенту для клиентов, находящихся в одном нии 3 типов веб-камер:
домене (или в доменах, с которыми установлены отно- ! Веб-камеры с интерфейсом USB. Самые дешевые
шения доверия). Как следует из названия, при аутенти- представители камер данного типа не умеют ничего, кро-
фикации используются протоколы NTLM или Kerberos. ме как показывать то, на что их настроили. «Продвину-
! Digest. Этот метод аутентификации применяется в тех тые» модели данного вида могут комплектоваться бо-
случаях, когда использовать NTLM/Kerberos оказывается лее функциональным ПО, обладать более высокой раз-
затруднительно. Например, при необходимости разгра- решающей способностью, способны передавать звук и
ничить доступ к точкам вещания для клиентов, подклю- изменять угол обзора. Как самые дешевые, так и более
чающихся через Интернет. дорогие USB-веб-камеры с легкостью используются в
системах вещания на базе Windows Media, т.к. главным
Мы планируем предоставлять открытый доступ к точке условием работы является наличие Capture-драйвера,
вещания для пользователей Интернета, поэтому включим осуществляющего захват картинки. Самый большой
плагин «WMS Anonymous User Authentication». При необхо- плюс камер данного типа – цена (от 30$), минус – рас-
димости зададим имя и пароль для пользователя аноним- стояние, на которое такую камеру можно «отнести» от
ного доступа. Также не лишней будет установка ограниче- компьютера (по спецификации USB не более 5 метров8).
ний для точки вещания (раздел «Limits»). Разрешим два од- ! Веб-камеры c интерфейсом Ethernet. Данные каме-
новременных подключения с суммарной пропускной способ- ры подключаются напрямую к сети Ethernet. Управле-

4
Доступны в разделе «Properties», когда в дереве навигации (слева) выбран сам сервер.
5
Последние две опции появляются после установки Service Pack 1 для Windows Server 2003.
6
Описание процедуры анонсирования multicast-точки распространения можно найти в [1] или в документации для Winows Media Services 9.
7
Для того чтобы наша радиостанция была реально доступна из Интернета (поток unicast), возможно, потребуется дополнительная настрой-
ка маршрутизаторов и межсетевых экранов (открыть TCP-порты 554 и 1755).
8
Как можно увеличить это число, будет показано позже.

50
администрирование
ние ими может осуществляться либо через встроенный банально не хватить, а внешнего интерфейса питания
веб-сервер, либо при помощи специализированного ПО, на USB-веб-камерах обычно не бывает.
устанавливаемого на компьютер администратора. Не- ! Способ 3. Использование «специализированных» USB-
которые модели имеют возможность записи по сигналу удлинителей. С их помощью можно работать с USB-ус-
от встроенного детектора движения, что является не- тройствами, отдаленными на достаточно большое рас-
маловажным в системах наблюдения. Отличительным стояние (до 500 м) [2]. В состав таких удлинителей вхо-
плюсом камер данного типа является то, что благодаря дят два модуля – локальный (устанавливается в компь-
использованию интерфейса Ethernet, камеру можно «от- ютер) и удаленный (устанавливается поблизости от USB-
нести» от компьютера-кодировщика практически на устройства). Для соединения модулей используется либо
любое расстояние9. Платой за такую «переносимость» обычная витая пара 5-й категории (до 100 м) либо опто-
является цена, которая в среднем превышает значения волокно (до 500 м). Использование такого рода удлини-
для аналогичных USB-собратьев. телей для веб-камер мне кажется несколько сомнитель-
! Беспроводные веб-камеры. Во многом похожи на ка- ным хотя бы потому, что стоимость одного удлинителя
меры второго типа, за исключением того, что вместо скорее всего будет в несколько раз превышать сто-
проводного Ethernet 802.3 беспроводные камеры ис- имость веб-камеры.
пользуют 802.11a/b/g. Соответственно, для них обяза-
тельным условием является наличие отдельного пита- Будем считать, что, используя вышеприведенную инфор-
ния. мацию, мы смогли выбрать и разместить камеры, и теперь
самое время перейти к их настройке, но сначала:
Теоретически в системах вещания на основе Windows
Media можно использовать любые типы веб-камер, главное, «Обучаем» сервер
чтобы на компьютере-кодировщике был установлен соот- При работе с веб-камерами мы будем использовать режим
ветствующий драйвер захвата изображения (если для дан- «push», инициатором передачи в котором выступает сама
ного типа камеры он вообще существует). Если такой драй- машина с веб-камерой. Первое, что нам необходимо сде-
вер для камеры есть, то для просмотра «картинки» можно лать, – создать «шаблон точки распространения», который
использовать не только прилагаемое в комплекте ПО (или будут использовать все кодировщики при создании соб-
встроенный веб-сервер), но и обычный проводник Windows ственных «точек» на медиасервере. Для этого откроем уже
и кодировщик Windows Media. Описываемая далее систе- знакомую нам оснастку «Windows Media Services» и созда-
ма вещания будет создаваться с использованием самых дим точку распространения wc_template:
обычных (и, вероятно, наиболее распространенных) веб-ка-
мер Logitech QuickCam Express с интерфейсом USB.

Основная проблема при работе с USB-камерами – не-


достаточная длина USB-кабеля (все-таки на 1,8 метра осо-
бо не разгуляешься). Для ее устранения можно воспользо-
ваться как минимум тремя способами:
! Способ 1. Кабель USB удлиняется с помощью обычных
пассивных удлинителей, продающихся во всех компью-
терных магазинах. Таким способом вы сможете увели-
чить длину кабеля еще метра на три10. Еще немного (до
+1 метра) вы выиграете, если самостоятельно изгото-
вите USB-удлинитель, использовав при этом экраниро-
ванную витую пару (STP). Хотя лучше, конечно, обра-
тить внимание на следующий способ.
! Способ 2. Для увеличения длины USB можно использо-
вать активные USB-удлинители. С их помощью удава-
лось «относить» камеру метров на 15 от компьютера. И
хотя на некоторых форумах имеется информация о воз-
можности достижения гораздо большей длины, все-таки
использовать более 2 активных удлинителей лучше не
стоит. Все-таки веб-камеры, как и активные USB-удли-
нители, для питания используют USB. Соответственно,
при злоупотреблении вторыми питания камере может Ðèñóíîê 4. Ñîçäàíèå øàáëîíà push-âåùàíèÿ äëÿ âåá-êàìåð

9
Особенно если попутно использовать модели, поддерживающие Power over Ethernet (PoE).
10
Максимальное «увеличение» длины определяется конкретной связкой 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 Ðèñóíîê 5. Íàñòðîéêà áåçîïàñíîñòè DCOM-êîìïîíåíòîâ WMS
! Cache/Proxy → Stream splitting expiration → Immediately На этом процесс создания «шаблон вещания» будем счи-
тать законченным, самое время перейти к кодировщикам.
Для предоставления доступа к веб-камерам из Интерне-
та определим следующее: «Authentication → WMS Anonymous Настройка кодировщика
User Authentication → Enable». Отличия от уже рассмотренного нами в прошлый раз спо-
На всякий случай настроим централизованную запись соба минимальны. Во-первых, при вещании можно не ко-
со всех веб-камер: «Archiving → WMS Archive Data Writer → дировать звук, т.к. используемая мною Logitech QuickCam
Enable» (в свойствах плагина отметим «Start archiving when Express (впрочем, как и подавляющее большинство недо-
publishing point starts», а также при необходимости изме- рогих USB-веб-камер) попросту не позволяет его записы-
ним путь расположения файлов архива). вать. Второе отличие заключается в использовании друго-
Как нам уже известно, при использовании режима push, го режима. При использовании режима push нам необхо-
кодировщик сам «помещает» поток на сервер, при этом димо определить значения 3 параметров. В качестве «име-
пользователь, с правами которого работает кодировщик, ни сервера» укажем полное DNS-имя сервера с WMS HTTP-
проходит аутентификацию и авторизацию (в режиме pull портом:
этого естетственно нет). Из соображений безопастности,
при настроках по умолчанию только администраторы имеют wms.local.ru:7979
право помещать медиа-потоки на сервер. А так как лишняя
программа, работающая с правами доменного администра- В поле «Publishing point» укажем имя точки вещания для
тора нам не нужна, создадим обычного доменного пользо- данного кодировщика – wc1. В третьем поле укажем имя
вателя webcams и добавим ему необходимые права12. созданного нами шаблона – wc_template, параметры кото-
На сервере Windows Media включим плагин: «Control рого будут использоваться при создании точки вещания13.
protocol → WMS HTTP Server Control Protocol → Enable», с Значение «Remove publishing point automatically» оставим
привязкой к порту с номером 7979. без изменений и нажмем «Next». В следующих диалоговых
Кроме того, определим следующие параметры для точ- окнах определим параметры сжатия14 и дополнительные
ки вещания: атрибуты потока. При нажатии кнопки «Finish» кодировщик
! 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 удаленный доступ, запуск и активацию
объекта. Ðèñóíîê 6. Îøèáêà êîäèðîâùèêà

11
В этом случае клиенты, которые не смогли подключиться с использованием multicast, будут автоматически подключаться с использовани-
ем unicast.
12
В случае если домена нет, можно попробовать создать на сервере Windows Media и всех машинах-кодировщиках локального пользовате-
ля с одним и тем же именем и паролем.
13
Так как в режиме push кодировщик «помещает» медиапоток на сервер, пользователь, с правами которого запущен кодировщик, должен
иметь соответствующие права на медиасервере. В нашем случае эти права есть у пользователя webcam и всех администраторов домена.
14
По субъективным наблюдениям, «сносное» качество при разрешении 320х240 и кодеке wmv9 начинается с потока 100 Кбит.

52
администрирование
Если же все пройдет успешно, то мы увидим уже знако- Использовать службу достаточно просто. Первое, что
мый нам диалог анонсирования multicast-точек распрост- вам потребуется сделать, – настроить кодирование с тре-
ранения15. Создадим файлы анонса и поместим их на веб- буемыми параметрами с помощью стандартного кодиров-
сервер. При правильных настройках после нажатия кнопки щика Windows Media. Затем необходимо убедиться, что
«Start Encoding» кодировщик примется за работу, на сер- все работает как нужно, и сохранить настройки в файле с
вере Windows Media автоматически активизируется точка расширением .wme. После чего необходимо скомпилиро-
вещания, и поток с камеры «польется» ко всем клиентам вать исполняемый файл службы и зарегистрировать его
(не забываем, что мы используем multicast). в системе с помощью прилагаемой утилиты (попутно ука-
зав имя учетной записи, с правами которой служба будет
Когда возможностей кодировщка работать). Сразу же после этого, если все настройки за-
не хватает даны правильно, служба запустится, создаст все необхо-
Иногда при использовании служб Windows Media возмож- димые файлы анонсов и начнет кодирование. На сервере
ностей стандартного кодировщика оказывается недоста- в это время будет активирована соответствующая точка
точно. Например, при организации вещания с большого вещания, и передаваемый поток станет доступен вам для
количества веб-камер настраивать и запускать кодиров- просмотра:
щик вручную на каждой машине надоедает достаточно
быстро. Кроме того, если для кодирования используются
современные офисные машины (производительности ко-
торых с лихвой хватает для работы офисных приложений),
то работающим за этими машинами людям может не по-
нравиться постоянное присутствие «постороннего прило-
жения».
Еще больше данная ситуация не будет нравиться адми-
нистратору, которому для обеспечения нормальной рабо-
ты камер придется «бороться» с пользователями, закры-
вающими «лишние окна». И хотя попытаться «скрыть» ра-
боту кодировщика можно и с помощью стандартных средств
(например, при помощи описанной выше «VBS-обертки»,
работающей в командной строке), получить стабильно ра-
ботающее решение таким способом вряд ли получится.
В этом случае на помощь приходит пакет Windows Media
Encoder SDK. Как и другие пакеты для разработчиков, дан- Ðèñóíîê 7. Ñèñòåìà âåùàíèÿ ñ âåá-êàìåð
ный SDK содержит все необходимое для создания собствен- Само приложение, а также инструкцию по его сборке и
ных приложений с использованием функциональности ко- установке можно найти на сайте проекта [3].
дировщика Windows Media Encoder. Помимо исчерпываю-
щей документации, описывающей интерфейсы объектов ко- Подводим итоги
дировщика, в состав SDK также входят законченные при- Итак, теперь наш медиасервер способен передавать видео-
ложения и примеры вызовов методов объектов для трех данные с TV-тюнера (часть 1) и веб-камер, предоставлять
языков программирования: C++, C# и Visual Basic. совместный доступ к музыкальным файлам, а также к ма-
С использованием этого богатого инструментария было териалам маленькой видеотеки. Но не следует думать, что
разработано специальное приложение-кодировщик, обла- на этом возможности Windows Media заканчиваются. Вме-
дающее следующими возможностями: сте с технологией DRM (Digital Rights Managment) возмож-
! Работа в качестве системной службы. но создание коммерческих систем17, совместно с Microsoft
! Автоматическое возобновление сессии кодирования Producer for PowerPoint можно с легкостью организовывать
после сбоев (при временном извлечении камеры или вещание презентаций, а благодаря наличию хорошего SDK
потере связи с сервером). ко всем компонентам применение Windows Media ограни-
! Работа со стандартными файлами кодировщика (.wme). чивается только одним – полетом ваших мыслей!
! Автоматическое создание файлов анонсов.
! Возможности журналирования и оперативного оповеще- Литература, ссылки:
ния (системный журнал, e-mail). 1. Платов М. Система вещания на основе Windows Media
! Автоматическая активация драйвера веб-камеры16. Services 9. – Журнал «Системный администратор», №4,
апрель 2005 г. – 28-33 с.
На данный момент приложение распространяется толь- 2. http://www.ihse.de/russian/417-xx.htm.
ко в исходных кодах, для компиляции которых использует- 3. http://sourceforge.net/projects/wcstreaming.
ся среда MS Visual Studio.NET 2003.

15
При использовании режима push анонс делается только на кодировщике.
16
В случае если драйвер отключен и у службы есть соответствующие права.
17
http://www.mtv.com/overdrive.

№5, май 2005 53


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

АВТОМАТИЗАЦИЯ MS WINDOWS,
ИЛИ AUTOIT КАК МЕЧТА ЭНИКЕЙЩИКА
ЧАСТЬ 2
С базовым функционалом AutoIt вы уже познакомились
в первой части статьи и представляете, как использовать
его для автоматизации простейших операций в MS Windows.
Расcмотрим применение AutoIt при решении практических
задач администрирования.

АЛЕКСЕЙ БАРАБАНОВ
Локализации ный перехватчик данных. В версии 3 он называется «AutoIt
v3 Active Window Info». За основу разработки берем любой
Отправляйте срочную почту ЗАГЛАВHЫМИ БУКВАМИ.
из аналогичных текстов, рассмотренных в [1], из которого в
Hаш почтовый сервер ее распознает и отправит быстрее всего!
процессе редактирования выкидываем всё лишнее (не за-
Отдельно рассмотрим вопрос о приложениях с кирилличес- бывайте, добродетель сисадмина – лень). Затем устанав-
кими текстами внутри окон. Проиллюстрируем решение ливаем наше приложение. Дождавшись первого вопроса к
этой проблемы на примере установки русифицированной оператору, анализируем, как можно «поймать» это окно в
программы. Выберем почтовый клиент Mozilla Thunderbird. AutoIt. В отношении кириллических текстов есть такая под-
Как и в первом случае (см. начало статьи [1]), процедура сказка, что надо пользоваться процедурой «cut-and-paste»
разработки заключается в том, что запускается специаль- для получения правильной кодировки. Но, к сожалению, это

54
администрирование
не срабатывает. Как видно на рис. 1, попытка перенести Send ( '{ENTER}' )
текст из «перехватчика» окон в редактор с программой при- MsgBox ( 0, 'AutoIt', 'Done' )
Exit
водит к появлению нечитаемого набора символов. Предпо-
ложение, что так и должно быть, не выдерживает элемен- После запуска эта программа приводит нас к следую-
тарной проверки. щему этапу разработки, смотрите рис. 3. Далее все дела-
ется аналогично тому, как создавалась программа для ус-
тановки AutoIt v3 [1].

Ðèñóíîê 1
Может быть, стоит сменить редактор? Ведь секрет в том,
что надо записать в текст скрипта требуемую фразу в ори- Ðèñóíîê 3
гинальной кодировке. То есть редактор должен позволять Вот что должно получиться в конце концов:
точно указывать кодировку документа при сохранении. Из
находящихся под рукой подходит MS Word. При этом, как и AutoItSetOption ( "WinTitleMatchMode", 2 )
AutoItSetOption ( "WinDetectHiddenText", 1 )
ожидалось, «cut-and-paste» тоже не приводит к появлению ; open free desktop
текста в правильной кодировке. Но текст, введенный «вруч- WinMinimizeAll ( )
Sleep ( 1000 )
ную», можно сохранить в нужной кодировке. В данном слу- Run ( 'Thunderbird_Setup_1.0.exe' )
чае предполагаем, что заголовок окна установщика Mozilla ;Run ( $CmdLine[1] )
Thunderbird написан в cp1251, и поэтому сохраняем текст в WinWait ( 'Mozilla Thunderbird Óñòàíîâêà' )
кириллице (Windows). Все описанное продемонстрировано Send ( '{ENTER}' )
WinWait ( 'Óñòàíîâêà Thunderbird - Ëèöåíçèîííîå ñîãëàøåíèå' )
на рис. 2. 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 → Начало установки». Окно сопро-
Ðèñóíîê 2 вождает процесс непосредственного разворачивания при-
В конце первого этапа разработки получаем следующий ложения. И можно, конечно, в программе дождаться его за-
текст: вершения, но разумнее просто «поймать» появление сле-
дующего окна. Что и было сделано.
AutoItSetOption ( "WinTitleMatchMode", 2 ) Если кодировка кириллицы на экране совпадает с ос-
AutoItSetOption ( "WinDetectHiddenText", 1 )
WinMinimizeAll ( ) новной кодировкой по умолчанию в MS Windows, то есть
Sleep ( 1000 ) cp1251, то можно снова вернуться к использованию Notepad
Run ( 'Thunderbird_Setup_1.0.exe' )
как редактора программ на AutoIt. Кстати сказать, исполь-
WinWait ( 'Mozilla Thunderbird Óñòàíîâêà' ) зование точно такого же приема для детектирования окон

№5, май 2005 55


администрирование
с текстами в кодировке koi8-r, например, от браузера Ин- тит его иконку на рабочий стол. Далее приведен ее текст,
тернета, не приводит к успеху. То есть такие окна надо оп- где «Office VPN» – это название соединения, а «office.enter-
ределять по косвенным признакам. prise.domain» – доменное имя сервера PPtP, доступное из
Интернета. Если сервер VPN не зарегистрирован в DNS, то
AutoIt – это бот сисадмина нужно указать его IP-адрес.
Если сисадмин ест на своем рабочем месте,
AutoItSetOption ( "WinTitleMatchMode", 2 )
выложите ему все свои проблемы и ждите AutoItSetOption ( "WinDetectHiddenText", 1 )
немедленного ответа. Мы существуем, AutoItSetOption ( "SendAttachMode", 1 )
чтобы служить другим, и всегда готовы подумать ; open free desktop
о починке компьютеров. WinMinimizeAll ( )
Sleep ( '1000' )
Сфера применимости AutoIt не ограничена только автома- ; network connection wizard
Run ( @ComSpec & " /c rundll32.exe netshell.dll,StartNCW" )
тизацией установки прикладных программ. Очень эффек- ; 1
тивно с помощью него программировать наборы стандарт- If WinWaitActive ( 'Ìàñòåð íîâûõ ïîäêëþ÷åíèé','','10' ) == 0 ↵
Then
ных действий в графической среде MS Windows. Многие Exit
такие действия инициируются с использованием внутрен- EndIf
Send ( '{ENTER}' )
ней команды MS Windows – rundll32. В Сети есть ряд ресур- ; 2
сов, посвященных разгадыванию и коллекционированию ин- WinWaitActive ( 'Ìàñòåð íîâûõ ïîäêëþ÷åíèé', ↵
'Ïîäêëþ÷èòü ê Èíòåðíåòó','5' )
формации об этой слабо документированной команде. На- Send ( '{DOWN}{ENTER}' )
чиная с официального описания http://support. microsoft.com/ ; 3
WinWaitActive ( 'Ìàñòåð íîâûõ ïîäêëþ÷åíèé', ↵
default.aspx?scid=KB;EN-US;q164787& и продолжая суще- 'Ñîçäàòü ïîäêëþ÷åíèå:','5' )
ственно более информативным http://www.dx21.com/ Send ( '{DOWN}{ENTER}' )
; 4
SCRIPTING. Для примера решим задачу автоматической WinWaitActive ( 'Ìàñòåð íîâûõ ïîäêëþ÷åíèé', ↵
настройки подключения к VPN. Эта задача интересна тем, 'Ââåäèòå â ñëåäóþùåì ïîëå èìÿ äëÿ ýòîãî ïîäêëþ÷åíèÿ','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. Теперь
метром, задающим таймаут в секундах. Если WinWaitActive надо позаботиться о передаче этой программы конечному
успевает обнаружить нужное окно до истечения таймаута, пользователю. Далее будем исходить из условия, что сер-
то возвращает «1», в противном случае – «0». Это позво- вер VPN и почтовый сервер созданы на платформе GNU/
лит в случае ошибочной ситуации просто завершить скрипт. Linux, а не MS Windows. Это очевидно, учитывая необходи-
На рис. 4 изображена начальная стадия разработки. мость его работы на открытом для доступа из Интернета
сетевом соединении. Предположим, все административные
скрипты и данные записываются в /root/bin. Сперва получен-
ная программа упаковывается в архив и копируется в ту же
папку:

# zip -9 setup_pptp.exe.zip setup_pptp.exe

adding: setup_pptp.exe (deflated 4%)

# cp setup_pptp.exe.zip ~/bin

Затем создается простенький скрипт. При настройке ло-


гина VPN он будет отсылать осчастливленному пользова-
телю локальное электронное сообщение об этом вместе с
присоединенным архивом программы автонастройки. Та-
кой способ передачи позволяет доставить аутентификаци-
онные данные безопасным образом. Заодно и архив с про-
граммой помещается в почтовый ящик пользователя в об-
Ðèñóíîê 4 ход антивирусных средств, фильтрующих smtp-почту. Поль-
Вот таким образом, шаг за шагом, напишем маленькую зователь должен сохранить письмо и архив на дискете или
программку, которая создаст нужное соединение и помес- USB Flash-диске и принести его таким образом на компью-

56
администрирование
тер, где нужно настроить подключение к офисному VPN. телям по телефону, что и как надо открыть, запустить и
Далее останется лишь запустить разархивированную про- посмотреть. Но ведь можно заранее подготовить програм-
грамму, которая настроит соединение, и при подключении му, которая проделает все манипуляции, проверит ответы
указать логин и пароль из текста письма. После выполне- и напишет резюме. Что нам потребуется, если придется про-
ния всех манипуляций дискету или USB Flash диск придет- вести удаленную диагностику? Правильно – исправность
ся уничтожить... Шутка, конечно, но позаботиться об унич- сети! Именно это и надо проверить автономно и без учас-
тожении информации надо обязательно! тия сисадмина. Далее приведен вариант такой программы:
Поскольку сервер VPN сделан на GNU/Linux, то скрипт,
который настраивает пользовательский логин на сервере, AutoItSetOption ( "WinTitleMatchMode", 2 )
AutoItSetOption ( "WinDetectHiddenText", 1 )
можно написать на языке интерпретатора bash. Например, AutoItSetOption ( "SendAttachMode", 1 )
так: ; open free desktop
WinMinimizeAll ( )
Sleep ( '1000' )
#!/bin/sh ; îáíîâèì dhcp-àäðåñà
FCHAP=/etc/ppp/chap-secrets RunWait ( @ComSpec & " /c ipconfig /renew" )
UNAME=$1 If StringLeft( @IPAddress1, 3 ) == '127' Then
UIP=$2 MsgBox ( 0, 'Network Status', ↵
( [ "$UNAME" != "" ] && [ "$UIP" != "" ] ) || { 'Íåèñïðàâåí ñåòåâîé àäàïòåð èëè êàáåëü ↵
echo "Use as : $SELF <user-name> <ip>"; exit -1 ; } íå ïîäêëþ÷åí', 100 )
D=`cat $FCHAP | grep -e "^$UNAME[[:space:]]"` Else
[ "$D" == "" ] || { If StringLeft( @IPAddress1, 3 ) == '169' Then
echo "User \"$UNAME\" already in database"; exit -1 ; } MsgBox ( 0, 'Network Status', ↵
T=`getent passwd | grep ^$UNAME:` 'Íåäîñòóïåí ñåðâåð èëè íå ïîäêëþ÷åí ↵
[ "$T" != "" ] || { ñåòåâîé êàáåëü', 100 )
echo "Chosed <user-name>=$UNAME not found in passwd"; ↵ Else
exit -1 ; } If StringLeft( @IPAddress1, 10 ) == '192.168.0.' Then
PSW=`pwgen -c -n 9 1` ;------ address OK
H="officepptp" $i = URLDownloadToFile ( 'http://www.localservernet/' , ↵
echo -e "$UNAME\t\"$H\"\t$PSW\t\"$UIP\"" >> $FCHAP @MyDocumentsDir & '\tmp.html' )
SRV=office.enterprice.domain FileDelete ( @MyDocumentsDir & '\tmp.html' )
cat <<EOT | ↵
biabam /root/bin/setup_pptp.exe.zip ↵ If $i == 1 Then
-s "Extern login for pptp vpn access." $UNAME@localhost $j = URLDownloadToFile ( 'http://www.google.com/' , ↵
Dear user. @MyDocumentsDir & '\tmp.html' )
FileDelete ( @MyDocumentsDir & '\tmp.html' )
IT staff has prepared extern login to enterprise network using If $i == 1 Then
PPtP VPN for you personally. Tweak PPtP client on workstation MsgBox ( 0, 'Network Status', 'Ñåðâåð èñïðàâåí. ↵
to connect on extern IP-address or FQDN $SRV. Äîñòóï â Èíòåðíåò ðàçðåøåí', 100 )
You must login as "$UNAME" with passphrase "$PSW". Else
MsgBox ( 0, 'Network Status', 'Ñåðâåð èñïðàâåí. ↵
Dont forget or loss passphrase ! If this case you must inform Èíòåðíåò íåäîñòóïåí', 100 )
IT staff urgently ! After correction we will send new passphrase EndIf
to you by local e-mail. Else
MsgBox ( 0, 'Network Status', 'Ñåðâåð íå îòâå÷àåò', 100 )
IT staff. EndIf
EOT ;------
exit Else
MsgBox ( 0, 'Network Status', ↵
'Íåèçâåñòíûé àäðåñíûé äèàïàçîí', 100 )
Перед вами очень простой скрипт. Он запускается с двумя EndIf
EndIf
параметрами – пользовательский логин и адрес, который EndIf
выделяется для удаленного компьютера при создании крип- Exit
тованного туннеля. Если этот скрипт запускается на компь-
ютере, где создаются VPN-бюджеты для нелокальных Программа заставляет компьютер заново запросить ди-
пользователей, то проверку «getent passwd» надо исклю- намический адрес и по установившемуся значению диагно-
чить. Применение описанной технологии позволяет избе- стирует состояние сети. Здесь предполагается, что правиль-
жать проблем в тех случаях, когда в ответ на радостное ный адрес выдается DHCP из диапазона 192.168.0.0/24. Да-
сообщение сисадмина о выделении пользователю логина лее, если локальная сеть работает, делается попытка под-
VPN следует вопрос, «как это настроить», а визит к пользо- ключиться к тестовому внутреннему http-ресурсу и затем
вателю домой не входит в планы сисадмина. еще к аналогичному внешнему. Так определяется, «жив»
ли внутренний сервер и есть ли доступ к исходящему кана-
Автоматизируем службу поддержки лу в Интернет. Число тестов можно расширить. Например,
если запрос http://domain.name не проходит, но удовлетво-
Если вы столкнулись с сисадмином в выходной день в гастрономе, ряется запрос по IP-адресу, то можно сделать вывод о про-
задайте ему компьютерный вопрос. Мы работаем 24 часа в сутки
7 дней в неделю, даже в гастрономе в выходной день.
блемах с DNS. Для того чтобы воспользоваться приведен-
ной программой, надо скомпилировать ee в исполняемый
Вплотную к вопросам настройки удаленных подключений файл. Затем поместить результат, например, в директорию,
примыкают вопросы, точнее, подозрения пользователей о содержащую общий рабочий стол. Таким образом, она бу-
исправности их рабочих станций. Зачастую, когда эти воп- дет доступна всем пользователям компьютера. Либо мож-
росы на самом деле вызваны какими-то проблемами и у но поместить ее в персональный рабочий стол в профилях
сисадмина совершенно нет возможности провести диагно- прямо на сервере, что приведет к размножению ее копий
стику удаленно, приходится долго втолковывать пользова- по локальным копиям профилей после следующей же пе-

№5, май 2005 57


администрирование
резагрузки. Теперь остается приучить всех пользователей ет задачу сохранения пользовательского окружения и даже
перед истеричным звонком сисадмину запускать эту про- позволяет в случае возникновения проблем с некоторыми
грамму. В первую очередь они должны будут руководство- рабочими местами воспользоваться другими компьютера-
ваться результатами теста, а уже потом эмоциями и пред- ми взамен поврежденных, как временной мерой.
положениями. Получается, что ключевой вопрос – это автоматизиро-
ванная установка рабочей станции, включая операционную
Практический пример систему и все необходимое для работы прикладное про-
граммное обеспечение. Итак, в результате задача свелась
Если сисадмин сказал, что придет прямо сейчас, к выбору способа автоустановки MS Windows и программ в
выйдите из сети и отправляйтесь пить кофе.
Для нас не проблема запомнить 2700 сетевых паролей.
этой ОС. Почему к «выбору», а не «поиску» или «созда-
нию». Да потому, что автоустановка является штатным
Ну что ж, установка программ и выполнение стандартных свойством этой операционной системы. И ничего тут не надо
действий автоматизирована. Как это поможет вам в прак- сочинять и изобретать, ну разве что надо угадывать, так
тической работе? Рассмотрим случай из практики IT-аут- как документация путаная, а многочисленные описания
сорсинга. процесса противоречат друг другу. «Выбор» заключается
Итак, самое главное в работе сисадмина-аутсорсера – в определении места размещения дистрибутива. Рассмот-
не переработать. Для практикующих этот тяжкий труд по- рим подробнее.
казатель успеха прямо пропорционален числу одновремен- Способы размещения определяются используемым ди-
но обслуживаемых рабочих мест. Основным регулирующим стрибутивным носителем. Носителей информации ровно
фактором становится скорость восстановления рабочих столько, сколько предоставляет современная технология.
станций. Именно восстановления, а не первоначальной ус- Автору представляется очень изящным решением установ-
тановки. Поэтому будем рассматривать деятельность сис- ка с сетевого носителя, например с tftp, вместе с сетевой
темного администратора в непрерывном цикле. И в пер- загрузкой. Многие системные администраторы практику-
вом приближении надо выполнить два условия. ют этот способ. На этом экономится как минимум 15-20 у.е.
Во-первых, следует максимально снизить необходи- стоимости каждого рабочего места – столько же стоит CD-
мость, как в локальном присутствии сисадмина, так и по- ROM. Но мы рассматриваем не просто абстрактное адми-
требность в удаленном управлении. Для этого дадим пол- нистрирование, а аутсорсинг. Здесь нельзя полагаться на
ную свободу пользователям в пределах собственного ра- какие-то внешние средства, кроме тех, что включены в со-
бочего места – сделаем их локальными администратора- став рабочей станции. А вдруг непредвиденное поврежде-
ми. Скорее всего услышим возражения: это не верно, пра- ние рабочего места и было связано с проблемами локаль-
вильно ограничить права локальных пользователей, научи- ной сети. Кроме того, существует совершенно рядовая для
тесь пользоваться политиками и т. д. Безусловно, такая современного офиса ситуация, когда надо обеспечить уда-
точка зрения имеет право быть. Безусловно, есть предпри- ленный доступ к внутренним ресурсам не только для си-
ятия с развитой корпоративной культурой. Но в массе, если садмина, но и для других сотрудников. А это значит, что
речь идет об отечественной индустрии, то сисадмину пре- надо, точно так же, как и в офисе, произвести установку
доставляется на выбор: открыть курсы компьютерной гра- типового программного обеспечения и на их персональные
мотности за свой счет или предоставить локальным пользо- компьютеры. Безусловно, приватные визиты могут внести
вателям максимальную свободу. Выберем последнее. По- разнообразие в монотонную жизнь системного админист-
скольку это делает: ратора, но скорее всего включение приватных компьюте-
! локальных пользователей ответственными за состояние ров в число оплачиваемых будет отрицательно воспринято
собственного рабочего места; заказчиком. Поэтому, выбор в качестве дистрибутивного
! избавляет сисадмина от частых визитов по пустякам; носителя CD-ROM представляется разумным деловым ком-
! создает впечатление независимости деятельности со- промиссом. Тем более что в перспективе можно без излиш-
трудников обслуживаемого предприятия и избавляет от них проблем перейти на DVD-ROM, значительно увеличив
конфликтов, так как не позволяет им переложить ответ- тем самым число устанавливаемых программ. Теперь рас-
ственность на сисадмина. смотрим подробнее процесс установки MS Windows XP
Professional SP2 Rus, которую выберем в качестве ОС для
Во-вторых, необходимо обеспечить максимально быст- создания рабочих станций. Ведь именно этот процесс да-
рый способ восстановления рабочих станций и создать ус- лее предстоит автоматизировать.
ловия для удаленного управления локальными рабочими Итак, в следующей части рассмотрим подробнее про-
местами. Здесь должно быть все понятно: предоставив цесс установки MS Windows XP Professional SP2 Rus, кото-
пользователям видимость свободы, надо создать средство рую выберем в качестве ОС для создания рабочих стан-
для ликвидации последствий такой демократизации. Очень ций. Ведь именно этот процесс далее предстоит автомати-
часто единственный рациональный путь «лечения» рабо- зировать.
чих станций на платформе MS Windows заключается в пол-
ной повторной переустановке. Конечно, надо обеспечить Литература:
сохранение пользовательского окружения, т.е. профиля. 1. Барабанов А. Автоматизация MS Windows, или AutoIt как
Настройка внутренней сети для работы в составе домена мечта эникейщика. Часть 1. – Журнал «Системный ад-
Microsoft с перемещаемыми профилями полностью реша- министратор», №4, апрель 2005 г. – 11-15 с.

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

ЭФФЕКТИВНО УПРАВЛЯЕМ
ПОЛЯМИ ПОЛЬЗОВАТЕЛЕЙ В AD

Предположим, вам необходимо внести ряд однотипных изменений в свойствах всех пользователей
или пользователей в пределах группы в Active Directory. Сделать их в одном поле у 10-20
пользователей не составит труда. А как быть, если количество полей 2-3, а объектов 200-300?

ИВАН КОРОБКО
ля этих целей рекомендуется использовать сцена- Параметры командной строки
рий, с помощью которого можно автоматически вне- Для успешной работы сценария необходимы следующие
сти необходимые изменения в свойства объектов параметры командной строки:
AD, практически исключив влияние человеческого ! Домен. Может быть определен в автоматическом режи-
фактора. О создании такого скрипта и пойдет речь в этой ме. Задавать его в явном виде нет необходимости.
статье. ! Название группы, к членам которой применяется скрипт,
либо наоборот: скрипт будет применен ко всем пользо-
Функционал сценария вателям домена, кроме тех, которые входят в эту груп-
Предлагаемый сценарий обеспечивает следующий функ- пу.
ционал: корректировку профиля, сценария загрузки, кор- ! Название сценария регистрации пользователей в сети.
ректировку домашнего каталога (в случае необходимости ! UNC-путь к профилю.
создание домашнего каталога по указанному шаблону и ! UNC и локальный путь к домашнему каталогу.
его предоставление в общий доступ). Все эти свойства дол-
жны быть применены только для всех пользователей, вхо- Замечание: сценарий должен запускаться только с сер-
дящих в указанную группу, либо для всех пользователей, вера, на котором необходимо корректировать домашние
не входящих в указанную группу. Выполнение одного или каталоги.
второго условия зависит исключительно от трудозатрат на
включения пользователей в группу. Определение имени домена
Имя домена может быть определено с помощью одного из
Язык создания сценария провайдеров доступа к AD: WinNT или LDAP. При выборе
В качестве языка программирования рекомендуется исполь- провайдера необходимо учесть, что WinNT в качестве ре-
зовать VBScript, т.к. он имеет ряд преимуществ перед дру- зультата выдает массив, содержащий не только текущий
гими языками программирования: домен, но и доступные рабочие группы, если таковые име-
! VBScript – встроенный в операционную систему Windows ются. Рабочие группы могут временно появиться при под-
стандартный скриптовой язык. ключении одной из рабочих станций к домену или в случае
! Поддерживает OLE-объекты, что позволяет получить подключения стороннего портативного компьютера к ресур-
доступ к AD. сам сети. Поэтому, несмотря на громоздкий синтаксис, ре-
! В нем реализована поддержка файловых систем FAT и комендуется использовать провайдер LDAP, с помощью ко-
NTFS – можно производить операции с файлами и папка- торого можно определить как длинное имя домена, так и
ми, управлять уровнями доступа к файлам (только NTFS). короткое:

№5, май 2005 59


администрирование
set rootDSE_ = GetObject("LDAP://RootDSE") temp=temp+Member.Name
d_def=rootDSE_.Get("defaultNamingContext") Next
long_Ldap_name = "LDAP://" + d_def MsgBox temp
short_winnt_name= mid(d_def, instr(d_def,"=")+1, ↵
instr(d_def,",")-instr(d_def,"=")-1) где short_winnt_name – короткое имя домена, GroupName –
wscript.echo long_Ldap_name
wscript.echo short_winnt_name имя группы безопасности, членов которой необходимо оп-
ределить.

Определение параметров Управление свойствами пользователя


командной строки с помощью провайдера WINNT
Для определения параметров, переданных скрипту из коман- Учетные записи пользователей домена содержатся в под-
дной строки, необходимо использовать свойство Arguments классе User. Подкласс включает в себя более 20 парамет-
объекта WScript. Параметры командной строки считывают- ров (их описание см. в таблице 1), некоторые из которых
ся сценарием как элементы массива: не поддерживаются Windows 2k.
Пример чтения полей пользователя USER (переменная
Set objArgs=Wscript.Arguments UserName):
For Each arg in objArgs
t = t & arg & chr(13)
Next Set UserName="USER"
MsgBox t Set user=GetObject("WinNT://" & short_winnt_name ↵
& "/"& UserName)
Количество параметров, заданных в командной строке, u1="FullName: "+ cstr(user.FullName)+chr(13)
u2="UserFlags: "+ cstr(user.UserFlags)+chr(13)
определяется с помощью функции Wscript.Arguments.Count u3="LoginScript: "+ cstr(user.LoginScript)+chr(13)
Поскольку все параметры в данной ситуации обязатель- u4="MaxBadPasswordsAllowed: "+ ↵
cstr(user.MaxBadPasswordsAllowed)+chr(13)
ны, то рекомендуется вставить обработчик ошибок: u5="PasswordHistoryLength: "+ ↵
cstr(user.PasswordHistoryLength)+chr(13)
Set objArgs=Wscript.Arguments u6="AutoUnlockInterval: "+ ↵
cstr(user.AutoUnlockInterval)+chr(13)
u7="PasswordAge: "+ cstr(user.PasswordAge)+chr(13)
If len(cstr(objArgs(3)))=0 then u8="PasswordExpired: "+ cstr(user.PasswordExpired)+chr(13)
strShare="c:\root\home\"
strShare=InputBox("Share","ShareFolder","c:\root\home\") temp=""
temp=u1+u2+u3+u4+u5+u6+u7+u8
else MsgBox temp
strShare= cstr(objArgs(3))

If len(cstr(objArgs(2)))=0 then Изменение свойств полей осуществляется с помощью


strFolder="\\moscow\root\home\" метода SetInfo после банального присвоения нового значе-
strFolder = InputBox("Folder:", "Home dir \%username%", ↵
"\\moscow\root\home\") ния какого-либо параметра:
else
strFolder= cstr(objArgs(2)) User.HomeDirDrive="Y:"
………………………………… User.HomeDirectory="\\" & strDomain & "\" ↵
End if
End if & user.name & "$"
User.LoginScript=strScript
User.Profile=strProfile & user.name
где: User.setinfo
! strShare – локальный путь к папке, в которой будет со-
здан домашний каталог. Его физическое имя совпада- Таким образом, переданные сценарию параметры из
ет с именем пользователя в сети (login), а название пап- командной строки, определение членов группы и механизм
ки в сети (share name) совпадает с именем пользовате- изменения свойств можно объединить в единое целое:
ля в сети со знаком доллара (hidden share).
! strFolder – сетевой путь к этой же папке. set rootDSE_ = GetObject("LDAP://RootDSE")
d_def=rootDSE_.Get("defaultNamingContext")
! strProfile – сетевой путь к профилям пользователей. Если short_winnt_name = "LDAP://" + d_def
этот параметр не задан, то профили пользователей бу-
For each user in users_domain
дут локальными. i=0
! strGroup – имя группы безопасности в AD. a=user.name
! strScript – содержит имя сценария загрузки пользовате- 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
Провайдер WINNT был разработан для операционной сис- i=1
темы Win 4.0, когда еще не было AD. Структура объектов end if
next
WINNT одноуровневая, неиерархическая, поэтому чтение
необходимых объектов осуществляется с помощью фильт- if i=0 then
User.HomeDirDrive="Y:"
ров, в данном случае «group»: User.HomeDirectory="\\" & short_winnt_name ↵
& "\" & user.name & "$"
Set GroupName="Value_Group" User.LoginScript=strScript
Set user_group=GetObject("WinNT://" & ↵ if not User.Profile="" then
User.Profile=strProfile & user.name
short_winnt_name & "/"& GroupName & ", group") end if
For each obj inGroup.Members
User.setinfo

60
администрирование
end if ! сделать необходимые изменения в свойствах учетной
next записи пользователя в AD.
В приведенном примере обрабатываются учетные за-
писи пользователей, не входящих в группу strGroup. Для Создание и удаление папок
того чтобы изменить условие, т.е. производить действия над Создание и удаление каталогов осуществляется с помощью
пользователями, принадлежащими группе, необходимо из- методов CreateFolder(path) и DeleteFolder(path) объекта USER.
менить условие цикла if с «if i=0 then» на «if i=1 then» или «if Параметром каждого из этих методов является путь к ка-
i<>0 then». талогу – path. Применяя эти методы, необходимо проверять
наличие или отсутствие папки перед выполнением опера-
Управление домашним каталогом ции. Приведем два примера: первым из них проиллюстри-
Сценарий должен последовательно выполнять следующие руем процесс создания новой папки C:\TempFolder, исполь-
действия: зуя обработчик ошибок; во втором – удаления папки.
! определить, существует ли у домашнего пользователя Создание папки:
каталог;
! предоставить папку в доступ с правильным именем (сме- path="C:\TempFolder"
Temp=""
на sharename); Set user=WScript.CreateObject("Scripting.FileSystemObject")
! изменить права на файловую структуру NTFS в соот- If user.FolderExists(path)=0 then
user.CreateFolder(path)
ветствии с установленными правилами; Temp= "Folder " + path + " Created "
Òàáëèöà 1. Îïèñàíèå ïàðàìåòðîâ ïîäêëàññà User

№5, май 2005 61


администрирование
Else Sequrity.dll, входящей в комплект поставки ADSI Resource
Temp= "Folder " + path + " Already Exists" Kit (http://www.microsoft.com/ntserver/nts/downloads/other/
End If
MsgBox Temp ADSI25/default.asp).
Перед использованием библиотеки ее необходимо за-
Удаление папки: регистрировать на компьютере, на котором будет запускать-
ся сценарий. Команда регистрации библиотеки выглядит
path="C:\TempFolder" следующим образом:
Temp=""
Set user=WScript.CreateObject("Scripting.FileSystemObject")
If user.FolderExists(path)<>0 then regsvr32.exe /s ADsSequrity.dll
user.DeleteFolder(path)
Temp= "Folder " + path + " Deleted"
Else Доступ к вышеуказанной библиотеке осуществляется с
Temp= "Folder " + path + " is Absent "
End If помощью функции CreateObject(«ADsSecurity») по следую-
MsgBox Temp щему сценарию:

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) + ↵
пользуется контейнер LanmanServer (см. таблицу 2). chr(13)+chr(10)
Next
Создание совместно используемого ресурса осуществ- Wscript.Echo dacl.AceCount
ляется с помощью метода Create. В свойствах метода ука-
зывается тип создаваемого ресурса, в данном случае Как видно из примера, для управления правами необ-
fileshare, и название ресурса (ShareName). Метод Create обя- ходимо создать новый экземпляр объекта ADsSecurity и
зательно сопровождается методом Path, с помощью кото- указать к нему путь, который является параметром функ-
рого задается путь к ресурсу, и методом SetInfo, который ции GetSecurityDescriptor(). Таким образом, можно получить
сохраняет сделанные изменения. Пример, в котором пре- доступ к коллекции DiscretionaryAcl, членами которой явля-
доставим в общее пользование папку, локальный путь к ются Trustee, AccessMask, AceType, AceCount и не фигури-
которой «c:\folder001». Сетевой путь папки должен быть рующий в данном шаблоне RemoveAcl (см. таблицы 3-5).
«\\1000pc\Share1». Описание папки – «Shared Folder #1»:
Добавление новых объектов
Set PC_Name="1000pc" В качестве новых объектов могут выступать пользователи
Set Share_Name="Share1"
Set Folder_Path="c:\Folder1" или группы. Приведем пример добавления нового пользо-
Set Description_Name="Shared Folder #1" вателя:
Set object=GetObject("WinNT://" & short_winnt_name ↵
&"/" & PC_Name &"/LanmanServer") Set sec = CreateObject("ADsSecurity")
Set element=object.Create("fileshare", Share_Name) Set sd = sec.GetSecurityDescriptor("FILE://c:\Folder")
element.Path= Folder_Path Set dacl = sd.DiscretionaryAcl
element.Description= Description_Name
element.MaxUserCount =10 Set ace = CreateObject("AccessControlEntry")
element.SetInfo ace.Trustee = "Domain\Administrator"
ace.AccessMask = &h20000000
ace.AceType = &h0
Для удаления используемого ресурса вместо метода Create ace.AceFlags = &h3
используют Delete. Изменения вступают в силу немедленно: dacl.AddAce ace1
sd.DiscretionaryAcl = dacl
sec.SetSecurityDescriptor sd
Set PC_Name="1000pc" set dacl=nothing
Set Share_Name="Share1" set sec=nothing
Set Folder_Path="c:\Folder1"
Set Description_Name="Shared Folder #1" Если требуется добавить сразу несколько новых объек-
Set object=GetObject("WinNT://" & short_winnt_name &"/" ↵ тов, то необходимо учесть некоторые нюансы, о которых
& PC_Name &"/LanmanServer") подробнее читайте после примера:
Call object.Delete("fileshare", Share_Name)
Set sec = CreateObject("ADsSecurity")
Set sd = sec.GetSecurityDescriptor("FILE://c:\Folder")
Управление правами доступа Set dacl = sd.DiscretionaryAcl
на файлы и папки Set ace1 = CreateObject("AccessControlEntry")
Создав домашний каталог для пользователя, рекоменду- ace1.Trustee = "domain\user1"
ется изменить созданные по умолчанию права. Оставив ace1.AccessMask = &h20000000
ace1.AceType = &h0
права Full Control членам группы Domain Administrators и ace1.AceFlags = &h3
самому пользователю – права Modify. dacl.AddAce ace1

for i=0 to 10000000


Библиотека ADsSequrity.dll next
Программное управление правами доступа к файлам и пап- Set ace2 = CreateObject("AccessControlEntry")
кам можно реализовать с помощью библиотеки ADs- ace2.Trustee = "domain\user2"

62
администрирование
ace2.AccessMask = &h20000000 Òàáëèöà 2. Îïèñàíèå ïàðàìåòðîâ êîíòåéíåðà LanmanServer
ace2.AceType = &h0
ace2.AceFlags = &h3
dacl.AddAce ace2
sd.DiscretionaryAcl = dacl
sec.SetSecurityDescriptor sd
set dacl=nothing
set sec=nothing

Внимательно изучив пример, можно обнаружить две осо-


бенности:
! Для каждого нового добавляемого объекта необходи-
мо создать свой собственный объект AccessControlEntry,
при этом описание объекта GetSecurityDescriptor и Òàáëèöà 3. Îáúåêòû êîëëåêöèè DiscretionaryAcl
ADsSecurity у них может быть общим.
! После добавления нового объекта должно пройти неко-
торое время (особенно, если сценарий находится на од-
ном сервере, a объект, права доступа на который необ-
ходимо изменить, на другом), прежде чем он станет до-
ступен для последующих действий. Для этого необхо-
димо сделать в сценарии паузу. Поскольку в VBScript
не существует такой функции, то предлагается исполь-
зовать следующую: Òàáëèöà 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 Set ace2 = CreateObject("AccessControlEntry")
On Error Resume Next ace2.Trustee = short_winnt_name +" \ "+ user.name
ace2.AccessMask = &h20+&h1000+&h40000000+&80000000
ShareServiceObj.Delete "Fileshare", user.name&"$" ace2.AceType = &h0
set NewShare = ShareServiceObj.Create("Fileshare",user.name&"$") ace2.AceFlags = &h3
dacl.AddAce ace2
Set sec = CreateObject("ADsSecurity")
Set sd = sec.GetSecurityDescriptor("FILE://"& strShare) sd.DiscretionaryAcl = dacl
Set dacl = sd.DiscretionaryAcl sec.SetSecurityDescriptor sd
For Each ace In dacl set dacl=nothing
If (ace.Trustee="EveryOne") set sec=nothing
dacl.RemoveAce ace
end if NewShare.Path = strShare&user.name
Next NewShare.MaxUserCount = 10
Set ace1 = CreateObject("AccessControlEntry") NewShare.setinfo
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 63


сети

СТРОИМ ЗАЩИЩЁННУЮ БЕСПРОВОДНУЮ СЕТЬ:


WPA-ENTERPRISE, 802.1X EAP-TLS

Существует добрая сотня статей о небезопасности беспроводных сетей. Причём многие


совершенно идентичны и бесполезны: в них говорится о том, что WEP-это плохо, что MAC-
адреса подменяются легко, и в заключение пишется: «Есть единственный выход и спасение.
Нужно использовать WPA.» И точка. Данный материал содержит именно то, что вы хотели
услышать после «точки» – практическое руководство по организации хорошо защищённой
беспроводной сети.
АНДРЕЙ ПЛАТОНОВ
Безопасный небезопасный Wi-Fi ства для аутентификации пользователей, шифрование при
На сегодняшний день становится очевидным, что, несмотря помощи динамических WEP-ключей (TKIP/MIC). Затем
на все проблемы, связанные c безопасностью, надёжностью 802.11i наконец-то закончили, и на свет появился WPA2.
и сложностью эксплуатации, беспроводные решения семей- Ко всему вышеперечисленному добавилась поддержка бо-
ства 802.11a/b/g всё же стали неотъемлемой частью инфра- лее стойкого шифрования AES (Advanced Encryption
структуры многих корпоративных, домашних и даже опера- Standard), которое работает совместно с протоколом безо-
торских сетей. Отчасти это произошло, потому что большин- пасности CCMP (Counter with Cipher Block Chaining Message
ство этих проблем на современном этапе развития Wi-Fi ушли Authentication Code Protocol – это более совершенный ана-
в прошлое. Беспроводные сети во всех отношениях стали лог TKIP в WPA). WPA2 постепенно стал появляться в но-
намного умнее и быстрее: появился QoS, интеллектуальные вых моделях точек доступа (например, D-Link DWL-3200AP),
антенны (технология MIMO), реальные скорости достигли 40 но пока это скорее экзотика. Все продукты, поддерживаю-
Мбит/c (например, технологии SuperG, SuperAG от Atheros). щие WPA2, обратно совместимы с оборудованием, поддер-
Кроме этого, большие изменения произошли и в наборе тех- живающим WPA.
нологий, обеспечивающих безопасность беспроводных се- И WPA, и WPA2 включают в себя развитые средства кон-
тей. Об этом поговорим более подробно. троля доступа к беспроводной сети на основе стандарта
Во времена, когда Wi-Fi был только для избранных, для IEEE 802.1x. В архитектуре 802.1x используется несколько
защиты беспроводных сетей использовалось WEP-шифро- обязательных логических элементов:
вание и MAC-фильтры. Всего этого быстро стало не хва- ! Клиент. В роли клиента выступает Supplicant– програм-
тать, WEP признали небезопасным из-за статичности клю- ма на клиентском компьютере управляющая процессом
чей шифрования и отсутствия механизмов аутентификации, аутентификации.
MAC-фильтры особой безопасности тоже не придавали. На- ! Аутентификатор. Это точка доступа, которая выполня-
чалась разработка нового стандарта IEEE 802.11i, который ет функции посредника между клиентом и сервером
был призван решить все назревшие проблемы безопасно- аутентификации. Аутентификатором в том числе может
сти. На полпути к 802.11i появился набор технологий под быть и проводной коммутатор, т.к. 802.1x используется
общим названием WPA (Wi-Fi Protected Access) – часть ещё в различных сетях.
не готового стандарта 802.11i. WPA включает в себя сред- ! Сервер аутентификации – RADIUS-сервер.

64
на правах рекламы
В IEEE 802.1x допускается использование различных ме- рационной системе есть встроенный супликант, а недавно
тодов и алгоритмов аутентификации. Это возможно благо- выпущенный корпорацией Microsoft update добавляет и под-
даря протоколу EAP (Extensible Authentication Protocol), в ко- держку WPA2.
торый «вкладываются» атрибуты, соответствующие тому или
иному методу аутентификации. Поэтому существует много Устанавливаем и настраиваем
разновидностей 802.1x EAP: EAP-MD5, EAP-PEAP, EAP- OpenSSL и FreeRADIUS
LEAP, EAP-SIM и т. д. В данной статье будет описана реали- Предполагается, что в системе FreeBSD 5.3 установлена
зация аутентификации в беспроводной сети на основе циф- одна сетевая карта, обновлена коллекция портов, присут-
ровых сертификатов – 802.1x EAP-TLS. Этот метод наибо- ствует Midnight Commander, а сам компьютер подключён к
лее часто используется в корпоративных беспроводных се- Интернету. В дальнейшем будем предполагать, что беспро-
тях и отличается достаточно высокой степенью защищённо- водная сеть развёртывается в корпоративной сети c мас-
сти. Кроме того, EAP-TLS иногда является одним из основ- кой 192.168.0.0/24.
ных методов защиты в сетях беспроводных провайдеров. Загружаем с ftp://ftp.openssl.org/snapshot последний ста-
бильный «снимок» (snapshot) OpenSSL (я, например, ис-
Аутентификация 802.1x EAP-TLS пользовал openssl-0.9.7-stable-SNAP-20050524.tar.gz ). Рас-
В основе EAP-TLS лежит протокол SSL v3.0, однако в отли- паковываем, конфигурируем, компилируем и инсталлиру-
чие от традиционной аутентификации по протоколу SSL (на- ем его стандартным образом:
пример, при организации защищенного http-соединения –
HTTPS) в EAP-TLS происходит взаимная аутентификация # ./config shared --prefix=/usr/local/openssl
# make
клиента и сервера. Клиент (супликант) и сервер RADIUS # make install
должны поддерживать метод аутентификации EAP-TLS;
точка доступа должна поддерживать аутентификацию В принципе на этом работу с OpenSSL можно и завер-
802.1x/EAP и не обязательно должна знать, какой метод шить. В дальнейшем он потребуется нам для генерации сер-
аутентификации используется в конкретном случае. На тификатов.
рисунке ниже изображён процесс аутентификации в бес- FreeRADIUS – довольно объёмный пакет, поэтому его, в
проводной сети с использованием EAP-TLS. отличие от 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
Здесь уместно закончить небольшое лирически-теоре- создаётся файл dh.
тическое отступление, которое необходимо, для того чтобы ! Там же даём команду:
получить примерное представление о том, что кроется в не-
драх безопасной беспроводной сети. Далее будет предло- # dd if=/dev/random of =random count=2
жена практическая реализация описанных выше концепций.
В качестве сервера RADIUS будет использоваться компью- создаётся файл random.
тер под управлением FreeBSD 5.3 c пакетом FreeRADIUS. Для ! Создаём папку raddb/sample и переносим в неё из raddb
организации инфраструктуры PKI (Public Key Infrastructure) все файлы с расширением .sample. Из sample обратно
будет применен пакет OpenSSL. Вся беспроводная сеть бу- в raddb копируем с изменением имени (без расширения
дет строиться на базе недорогого и надёжного беспровод- .sample) файлы: acct_users, clients.conf, dictionary,
ного оборудования D-Link. Предполагается, что на клиент- eap.conf, hints, huntgroups, preproxy_users, proxy.conf,
ских машинах установлена Windows XP SP2, т.к. в этой опе- radiusd.conf, snmp.conf, sql.conf, users1.

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

№5, май 2005 65


сети
! Правим следующие конфигурационные файлы: можно настроить на любой из 13 каналов, кроме того, мож-
но включить функцию автоматической настройки на сво-
clients.conf бодный канал. Так мы и сделаем.
client 192.168.0.220 { # IP-àäðåñ òî÷êè äîñòóïà Если в сети есть мобильные абоненты, которые пере-
# Ñåêðåòíîå ñëîâî, êîòîðîå çàäà¸òñÿ íà òî÷êå äîñòóïà мещаются по всей зоне покрытия, можно задать всем точ-
secret = 12345
shortname = D-Link_DWL-2100AP кам одинаковое имя беспроводной сети – SSID, тогда або-
nastype = other } нент будет автоматически подключаться к новой точке, при
client 192.168.0.219 { # IP-àäðåñ òî÷êè потере соединения с предыдущей. При этом он будет про-
secret = 54321 # Ñåêðåòíîå ñëîâî ходить повторную аутентификацию, которая в зависимос-
shortname = D-Link_DWL-2700AP
nastype = other ти от супликанта будет занимать от нескольких секунд и
} # è ò.ä. более. Так реализуется самый простой неинтеллектуаль-
eap.conf ный роуминг внутри сети. Ещё один вариант: если у каж-
дой точки свой SSID, то можно настроить несколько про-
#  ñàìîì íà÷àëå, ïîñëå « 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 Настраиваем DWL-2100AP на взаимодействие с RADIUS.
random_file = ${raddbdir}/certs/random
fragment_size = 1750
! Заходим на веб-интерфейс точки доступа (как это сде-
} лать, написано в инструкции к точке), сразу меняем па-
роль по умолчанию на вкладке TOOLS/ADMIN/.
radiusd.conf
bind_address = 192.168.0.222 ! На вкладке HOME/LAN назначаем точке доступа IP-ад-
port = 1812 рес, который задали в clients.conf: 192.168.0.220.
log_auth = yes # äëÿ îòëàäêè
log_auth_badpass = yes
log_auth_goodpass = yes

На этом настройка RADIUS завершена.

Настраиваем точки доступа


Для построения беспроводной сети мы будем использовать
несколько точек доступа D-Link DWL-2100AP и одну более
мощную точку D-Link DWL-2700AP. Это сертифицирован-
ные точки доступа стандарта 802.11b/g (до 54 Мбит/c), в
них реализована полная поддержка WPA (впрочем, как и Ðèñóíîê 2. Ïðèñâàèâàåì D-Link DWL-2100AP IP-àäðåñ,
во всех остальных точках доступа D-Link). Во всех точках îòëè÷íûé îò àäðåñà ïî óìîë÷àíèþ
используются последние прошивки, которые можно загру- ! На вкладке HOME/WIRELESS делаем всё, как показано
зить отсюда: ftp://ftp.dlink.ru/pub/Wireless. на рис. 3; в поле «Radius Secret» указываем пароль, ко-
Для начала несколько слов о настройке беспроводной торый соответствует данной точке в clients.conf (мы ука-
сети, а затем приведем пример конфигурирования D-Link зали «12345»).
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 íà âçàèìîäåéñòâèå
полосный сигнал точки доступа занимает 3 канала диапа- ñ RADIUS
зона). Точки доступа D-Link DWL-2100AP и DWL-2700AP Остальные точки доступа настраиваются аналогичным

2
Да и не только на точки доступа, а также на цифровые камеры, коммутаторы и т. д.

66
на правах рекламы
образом, только у них будут другие IP-адреса, каналы (если Копируем CA.all в файл СA_users.all. Затем открываем
они задаются вручную), а также значение поля «Radius последний и оставляем текст с 48 строки по 64-ю, осталь-
Secret». ные строки удаляем – оставшееся – это секция CA.all, в
которой генерируются клиентские сертификаты. Она будет
Создаём сертификаты многократно использоваться, поэтому её удобно выделить
Для начала несколько общих слов о том, что такое PKI. Это в отдельный скрипт. Открываем CA.all , удаляем из него
некая инфраструктура, каждый субъект которой обладает строки с 48 по 64-ю – всё то, что выделили в отдельный
уникальным цифровым сертификатом, удостоверяющим скрипт и сохраняем его.
его личность; помимо прочего, цифровой сертификат со- Примечание: файлы CA.all и CA_users.all – содержат сек-
держит секретный ключ. Закодированные с его помощью ретную фразу-пароль «whatever», которая используется как
сообщения можно расшифровать, зная соответствующий дополнительное средство обеспечения безопасности, при
открытый ключ. И наоборот – сообщения, зашифрованные эмиссии сертификатов и их отзыве. Человек, не знающий
открытым ключом, можно расшифровать только при помо- эту фразу не сможет ни подписать, ни отозвать сертификат.
щи секретного ключа. Каждый субъект PKI обладает откры- В принципе, кроме оператора CA, она больше никому не по-
тым и секретным ключом. надобится. Для повышения безопасности нужно заменить все
Субъектом PKI может быть как пользовательский ком- встречающиеся в скрипте CA.all и CA_users.all слова
пьютер или КПК, так и любой другой элемент сетевой инф- «whatever» на придуманный вами пароль. Его также нужно
раструктуры – маршрутизатор, веб-сервер и даже сервер будет вписать в eap.conf в строку «private_key_password =
RADIUS, что и имеет место в нашем случае. Во главе всей whatever». Далее я предполагаю, что мы оставили везде
этой системы стоит главный орган CA (Certificate Autority), пароль «whatever» без изменений. Его и будем вводить, со-
предполагается, что ему все доверяют и его все знают – он здавая клиентские, серверные сертификаты, а также от-
занимается подписью сертификатов (удостоверяет, что зывая их.
предъявитель сертификата действительно тот, за кого себя
выдаёт). Ему помогают специальные службы по приёму зап- Создаём CA и серверный сертификат
росов на сертификаты и их выдаче; номера всех выданных Запускаем CA.all. Первое, что он генерирует в интерактив-
и отозванных сертификатов хранятся в специальном реес- ном режиме – корневой сертификат CA (cacert.pem), пару
тре. В реальности всё это вроде бы большое хозяйство уме- открытый закрытый ключ (cakey.pem), открытый ключ кор-
щается на одном компьютере, и с ним легко управляется невого сертификата в формате PKCS#12 (root.der), затем
один человек3. серверный сертификат (cert_srv.pem), который мы устано-
Для создания сертификатов мы будем использовать вим на RADIUS. Все перечисленные файлы (и даже некото-
скрипты, которые идут в комплекте с FreeRADIUS. рые не перечисленные) появятся в папке CA.
! Для начала создадим свой 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
на RADIUS. Email Address []:admin@megacompany.ru
! И в заключение сгенерируем сертификаты для установ-
ки на клиентские компьютеры. Создаём сертификат для RADIUS:

Country Name (2 letter code) [AU]:RU


Создаём директорию /usr/local/etc/raddb/CA, копируем State or Province Name (full name) [Some-State]:Moskow
туда из папки /usr/ports/net/freeradius/work/freeradius-1.0.2/ Locality Name (eg, city) []:Moskow
Organization Name (eg, company) [Internet Widgits Pty Ltd]:MegaCompany Co. Ltd.
scripts/ файл CA.all и файл xpextensions. CA.all – интерак- Organizational Unit Name (eg, section) []:RADIUS
Common Name (eg, YOUR name) []:RADIUS
тивный скрипт, создающий CA, клиентский и серверный сер- Email Address []:admin@megacompany.ru
тификаты. Xpextensions – файл, содержащий специальные
Please enter the following 'extra' attributes
ключи Microsoft «Extended Key Usage», – они необходимы to be sent with your certificate request
A challenge password []:whatever
для того, чтобы EAP-TLS работал с Windows-системами. An optional company name []: (press enter)
Открываем файл CA.all:
! в строке 1 исправим путь – она должна выглядеть так: Копируем файлы /raddb/CA/cert_srv.pem и /raddb/CA/
demoCA/cacert.pem в папку /raddb/certs – установили сер-
SSL=/usr/local/openssl тификаты на сервер RADIUS.

! в строке 32 исправим путь – она должна выглядеть вот Создаём клиентские сертификаты
так: Для генерации клиентских сертификатов используем наш
сценарий CA_users.all. Для примера создадим сертификат
echo “newreq.pem” | /usr/local/openssl/ssl/misc/CA.pl -newca для пользователя user1:

3
Описанная структура является простейшим вариантом PKI; возможны также более сложные структуры, в которых участвует более одного
CA, между которыми устанавливаются сложные иерархические доверительные отношения.

№5, май 2005 67


сети
! Открываем CA_users.all , заменяем в нём все слова cert- Country Name (2 letter code) [AU]:RU
State or Province Name (full name) [Some-State]:Moscow
clt.* на user1.* (это нужно для того чтобы по имени фай- 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
ся сертификат с одним и тем же именем файла (cert-
clt.*). Мы же создадим сразу несколько сертификатов Please enter the following 'extra' attributes
to be sent with your certificate request
для user1, user2,3,4,5). Как вариант можно использовать A challenge password []:whatever
говорящие названия файлов содержащих сертификат, An optional company name []:

например, SergeyPetrov, IvanIvanov и т. д. И так далее… (я сразу создал целых 5 сертификатов).


! Пароль – «whatever» в строках 3, 4 заменяем на реаль- Каждый сертификат сохраняем на отдельную дискету,
ный, как это показано в листинге: пишем на ней пароль для установки («userX_password»),
на ту же дискету пишем открытый ключ root.der (он у всех
Ôàéë 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 ↵ ли user1) получил дискетку, содержимым которой являют-
-inkey newreq.pem -out user1.p12 -clcerts ↵ ся два файла root.der и user1.p12. Также на дискете напи-
-passin pass:whatever -passout pass:user1_password
сан пароль «user1_password».
4| openssl pkcs12 -in user1.p12 -out user1.pem ↵ Начнём с установки root.der
-passin pass:user1_password ↵
-passout pass:user1_password ! два раза щелкнем мышью по файлу root.der;
5| openssl x509 -inform PEM -outform DER ↵
! нажимаем «Установить сертификат»;
-in user1.pem -out user1.der ! жмём «Далее»;
! выбираем опцию «Поместить все сертификаты в сле-
Для примера вводим «user1_password» – этот пароль дующее хранилище», жмём «Обзор» (рис. 4);
будет спрашиваться при установке сертификата на поль-
зовательский компьютер, его необходимо запомнить.
Это, как я уже сказал, дополнительное средство аутен-
тификации при действиях, связанных с эмиссией сер-
тификата.
! Сохраняем и запускаем скрипт, получаем три файла
user1.der, user1.pem, user1.p12 – последний есть серти-
фикат в формате PKСS#12 для установки на Windows
клиента.

Запускаем изменённый CA_users.all. Создаём сертифи-


кат для user1:

Country Name (2 letter code) [AU]:RU Ðèñóíîê 4


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 ции», жмём «ОК» (рис. 5);
Common Name (eg, YOUR name) []:Andrey Ivanov
Email Address []:andrey@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)

Теперь генерируем пароль для пользователя user2:


! Открываем CA_users.all, заменяем в нём user1.* на
user2.*
! Заменяем пароль «user1_password» на «user2_password»
(не забываем его запомнить, чтобы потом установить
сертификат).
! Сохраняем и запускаем скрипт – получаем файл Ðèñóíîê 5
user2.p12. ! жмём «Далее», затем «Готово»;
! выдаётся предупреждение системы безопасности: «Не-
Создаём сертификат для user2: возможно проверить, что сертификат принадлежит

68
на правах рекламы
«Administrator …. Установить данный сертификат?»
жмём «Да»;
! выдаётся сообщение «Импорт успешно выполнен.», жмём
«ОК» два раза.
Устанавливаем пользовательский сертификат user1.p12.
! Два раза щелкаем мышью по файлу user1.p12, жмём
«Далее» два раза.

Ðèñóíîê 7

Ðèñóíîê 6
! Здесь надо ввести пароль, который мы установили для
сертификата user1. В нашем примере это «user1_pass-
word» (ну или то, что вы придумали), он условно напи-
сан на дискетке с сертификатом. Вводим его и нажима-
ем «Далее».
! Жмём «Далее», затем «Готово» – выдаётся сообщение
«Импорт успешно выполнен», жмём «ОК».

Примечание: все сертификаты, которые мы установи-


ли, можно просмотреть через 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 Проверяем работу WPA-Enterprise


! Ставим переключатели, как показано на рис. 11, в окне в нашей сети
«Доверенные корневые центры сертификации», выби- Теперь пришло долгожданное время проверить все настрой-
раем наш CA – он будет называться Administrator (если ки в работе. Запускаем 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


не запустился, – не стоит отчаиваться, если это произой-
дёт. Нужно внимательно изучить сообщение об ошибке и
проверить все настройки.
Щелкаем по значку беспроводного сетевого подключе-
ния, затем по беспроводной сети с именем «mega-
company_DWL-2100AP». Затем переводим свой взор на мо-
нитор, на котором запущен radiusd и отображается процесс
успешной аутентификации (весь серверный вывод показы-
вать не будем, потому что он довольно большой, приведём
лишь начальные и завершающие строки).
Начало вывода:
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"
Ðèñóíîê 11 Calling-Station-Id = "00-0D-88-88-D5-46"
! На всякий случай нажимаем «Просмотр сертификата», NAS-Identifier = "D-Link Access Point"

и изучаем, кто поставщик сертификата. Удостоверяем- Далее идёт всё, что изображено на рис. 1, в том числе
ся, что это наш корпоративный CA «Administrator», ко- обмен сертификатами.
торый мы создали (рис. 12). Окончание вывода:

70
на правах рекламы
User-Name = "Andrey Ivanov" radius# openssl ca -gencrl -out ca.crl
Finished request 4
Using configuration from /etc/ssl/openssl.cnf
Going to the next request 963:error:0E06D06C:configuration file routines:NCONF_get_string:no value:
Waking up in 6 seconds... /usr/src/secure/lib/libcrypto/../../../crypto/openssl/crypto/conf/conf_lib.c:
--- Walking the entire request list --- 329:group=CA_default name=unique_subject
Cleaning up request 0 ID 0 with timestamp 4294d303 Enter pass phrase for ./demoCA/private/cakey.pem:
Cleaning up request 1 ID 1 with timestamp 4294d303 DEBUG[load_index]: unique_subject = "yes"
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.
секретный пароль «whatever». В результате в директории
/raddb/CA/ появляется файл ca.crl – это и есть список отзы-
Аутентификация прошла успешно, компьютер получает ва. Внутри он похож на шифровку, просмотреть его можно
IP-адрес от DHCP-сервера и теперь может работать в бес- так:
проводной сети. К слову сказать, если на компьютере ус-
тановлено несколько клиентских сертификатов (такое тоже 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:
пометить в реестре (/usr/local/etc/raddb/CA/demoCA/index.txt), b8:c9:02:df:50:e6:c1:ef:6b:e4:dc:f7:68:da:ce:8e:1d:60:
в котором хранится список всех подписанных сертификатов, 69:48:ad:
сертификат пользователя, которому мы хотим запретить
доступ в сеть, как отозванный. После этого необходимо со- Видим в нём один отозванный сертификат с серийным
здать (или обновить, если он уже есть) список отзыва серти- номером D734AD0E8047BD8D (он же user2, он же Mikhail
фикатов (CRL – Certificate Revocation List). А затем настро- Ivanov).
ить RADIUS таким образом, чтобы при аутентификации Обратите внимание, важным свойством CRL является
пользователей он обращался к этому списку и проверял, не срок его действия. Он должен быть обновлён не позднее
состоит ли в нём предъявляемый клиентский сертификат. его истечения (Update: Jun 26 23:33:19 2005 GMT). Срок дей-
В ходе наших предыдущих экспериментов мы создали ствия CRL можно задать в файле openssl.cnf (у нас был
два сертификата для user1 (Andrey Ivanov) и user2 (Mikhail default_crl_days = 30).
Ivanov). Для примера запретим доступ в беспроводную сеть
последнему. Проделаем следующие три шага. Шаг 3
Подключаем список отзыва к FreeRADIUS:
Шаг 1 ! копируем файл /raddb/CA/ca.crl в /raddb/certs/ (поверх
Помечаем в реестре сертификат user2 как отозванный: старого ca.crl, если он там есть);
находясь в /usr/local/etc/raddb/CA даём команду: ! заходим в /raddb/certs/ и приклеиваем ca.crl к файлу
cacert.pem:
radius# openssl ca -revoke user2.pem
Using configuration from /etc/ssl/openssl.cnf cat cacert.pem ca.crl > ca.pem
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:
! вносим небольшие изменения в секцию TLS-файла
DEBUG[load_index]: unique_subject = "yes" /raddb/eap.conf
Revoking Certificate D734AD0E8047BD8F.

OpenSSL ругается, но делает то, что нам нужно. В ходе вы- # çäåñü ìû èçìåíèëè cacert.pem íà ca.pem
CA_file = ${raddbdir}/certs/ca.pem
полнения команды необходимо ввести секретную фразу-па- CA_path = ${raddbdir}/certs #äîáàâëÿåì ýòó ñòðîêó
роль («whatever»). При этом в /raddb/CA/demoCA/index.txt check_crl = yes # è ýòó ñòðîêó
сертификат будет помечен как отозванный, в чём мы можем
убедиться, просмотрев данный файл. Напротив записи, со- Попробуем аутентифицировать в сети компьютер с сер-
ответствующей отозванному сертификату, стоит буква «R». тификатом user2. Аутентификация не проходит, а user1 –
беспрепятственно входит в беспроводную сеть, что и тре-
Шаг 2 бовалось доказать.
Создаём список отзыва (CRL). Если он уже есть, то он об- Вот теперь защищённую беспроводную сеть можно счи-
новится. Находясь в /usr/local/etc/raddb/CA, даём команду: тать построенной.

№5, май 2005 71


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

УСТАНАВЛИВАЕМ
SYMANTEC ANTIVIRUS 9.0
В КОРПОРАТИВНОЙ СЕТИ
Symantec Antivirus CE 9.0 – продукт
корпоративного уровня, который позволяет
развернуть и сконфигурировать весь
комплекс удаленно и автоматически
в Windows-сетях любого масштаба.
Его несомненными преимуществами являются
полная автоматизация процесса установки
и настройки, возможность мгновенного
отражения изменений конфигурации
на всех необходимых клиентах, а также
грамотная защита от несанкционированного
вмешательства в работу антивирусного
монитора.

РОМАН МАРКОВ
сли вы используете в сети компьютеры с NT-система- ! Server Program;
ми, то для установки и конфигурирования антивирус- ! Alert Management System.
ной защиты на всех компьютерах вам не придется от-
ходить от своего компьютера – гибкие возможности удален- Разумеется, что Server Program выбираем при первона-
ной установки и настройки помогают сделать это быстро и чальной установке в любом случае, а вот Alert Management
непринужденно. При корректном выполнении всех инструк- Console – только по желанию. Данный компонент позволя-
ций процесс займет не более часа, даже если количество ет рассылать уведомления об обнаружении вируса – по
компьютеров измеряется сотнями. Среди возможностей кли- почте, в виде PopUp-сообщений и пр. При установке ком-
ентской части имеются стандартные для антивирусов функ- поненты «Alert Management Console» в меню пуск появится
ции сканера, мониторинга в режиме реального времени, а одноименный ярлык. Настройка рассылки таких оповеще-
также дополнительные возможности: онлайн-сканирование ний интуитивно понятна и не нуждается в дополнительном
POP3/IMAP/SMTP трафика, работа с Exchange- и Lotus описании. Общее количество случаев нейтрализации опас-
Domino-клиентами. Консоль администрирования выполнена ных и подозрительных файлов даже в средних сетях очень
в виде стандартной mmc. Недостатком продукта является велико, так как очень многие веб-ресурсы содержат такие
отсутствие механизмов защиты от Ad-software, проявляюще- объекты. Поэтому я удалил функцию Pop-Up оповещения
го в последнее время все большую активность. Продукт об- уже через неделю после начала использования продукта.
ладает множеством настроек, а его установка и первоначаль- Мое сугубо субъективное мнение – данный компонент аб-
ное конфигурирование не совсем тривиальный процесс, по- солютно не нужен.
этому читателю будет полезно ознакомиться с подробным В следующем окне выбираем, на какой компьютер в сети
описанием процесса настройки. необходимо установить сервер антивируса. Если вы обла-
даете правами администратора на требуемый компьютер,
Установка то установку можно произвести по сети. То есть необяза-
Сначала устанавливаем сервер антивируса (их может быть тельно осуществлять локальный вход на целевой компью-
несколько – для получения отказоустойчивости). Далее опи- тер – установку можно произвести удаленно с любой NT-
сывается установка с фирменного дистрибутивного диска, системы (используется RPC). Нажимаем «Next», при необ-
включающего помощник установки компонентов. Если не ходимости меняем путь установки (по умолчанию – Program
сработал автозапуск, открываем файл Setup.exe, находящий- Files\SAV).
ся в корне дистрибутивного диска. В открывшемся меню вы- Задаем имя группы антивируса. Если в сети использу-
бираем «Install Symantec Antivirus → Deploy Antivirus Server». ется несколько разных серверов SAV, с различными на-
Указываем вариант установки – новая или обновление пре- стройками, то имена их групп также должны отличаться.
дыдущей версии, а также устанавливаемые компоненты: Если несколько серверов антивируса используется для по-

72
безопасность
лучения отказоустойчивости, то имя их группы должно быть то в консоли отобразятся все найденные. Иначе кликаем
одним и тем же. При обнаружении в сети уже существую- правой клавишей мыши по значку «System Hierarchy», из
щих серверов SAV, имена их групп появятся в списке, и для контекстного меню выбираем «New → Server Group» и вво-
присоединения нового сервера к ним достаточно кликнуть дим имя созданной нами группы, а также ее пароль.
по имени группы. При запросе пароля придумываем новый Будьте внимательны при конфигурировании целевой
пароль администратора группы серверов антивируса, либо группы. Кликаем по требуемой группе правой клавишей и
вводим пароль существующей группы, если мы присоеди- выбираем «Unlock Server Group». Потребуется ввести па-
няем дополнительный сервер к уже существующей группе. роль. Если не хочется вводить его в будущем – установите
Далее выбираем тип запуска. Лучше, конечно, устано- флажок «Save this Password». В открывшемся иерархичес-
вить «Automatic Startup». Пропускаем информационные со- ком списке прежде всего кликаем по значку нашего сервера
общения в следующих окнах и начинаем установку. В про- и в появившемся контекстном меню выбираем «Make Server
цессе инсталляции будут выведены сообщения об ошиб- a Primary Server» и подтверждаем смену роли. Если серве-
ках (если они будут), и при нормальном завершении статус ров антивируса несколько, то один из них будет Primary, а
изменится на Finished, а в поле «Action» появится сообще- остальные – резервными для отказоустойчивости.
ние о необходимости перезагрузить целевой компьютер. Изменения конфигурации как самого сервера, так и кли-
Как правило, на корректно настроенной системе ошибок ентов производятся путем вызова соответствующих консо-
не бывает (во всяком случае, я ни разу не сталкивался с лей настройки. Все они сгруппированы в контекстное меню,
этим). Если же ошибка все-таки появилась, то ее подроб- вызываемое правой клавишей мыши – «All Tasks». В даль-
ное описание можно найти здесь же, в дополнительном окне нейшем описании словосочетание «кликните правой кла-
описания ошибки. вишей по объекту и выберите «All Tasks → Symantec
После перезагрузки устанавливаем консоль админист- Antivirus» по умолчанию опускается – будут указываться
рирования (Symantec System Center – далее SSC). Ее так- только пункты в этом меню. Все настройки в открываемых
же можно инсталлировать на любой компьютер сети. Ис- консолях относятся к тому объекту, по которому вы кликну-
ключение составляют сервера в режиме сервера приложе- ли при выборе требуемой опции, поэтому клик правой кла-
ний (терминалов) – на них установить консоль админист- вишей мыши для вызова меню необходимо производить
рирования не удастся – сначала необходимо удалить служ- именно на указанном объекте.
бу сервера терминалов, затем добавить консоль, и только Настраиваем наш основной сервер антивируса.
после этого восстановить службы терминалов. На сайте
технической поддержки Symantec данная несовместимость Управляем обновлениями:
объясняется (по мнению специалистов компании) тем, что Virus Definition Manager
установка консоли администрирования на сервер приложе- Настраиваем порядок и расписание получения обновлений
ний представляет потенциальную опасность из-за возмож- нашим сервером. Выбираем «Update the Primary Server of
ности получения удаленным пользователем контроля над this Server Group only» и нажимаем «Configure». При такой
приложением. Помимо этого возможны конфликты и отсут- настройке только Primary Server будет получать обновле-
ствие полноценного управления даже администратором ния из Интернета, а все остальные сервера получат их от
системы из-за ограниченности работы в режиме удаленно- него. Таким образом мы экономим внешний трафик. Для
го рабочего стола с ID0. Я не могу претендовать на получе- получения обновлений сервер антивируса должен иметь
ние статуса эксперта в области взаимодействия SSC и ОС, доступ к веб-ресурсам Symantec Corporation по портам HTTP
поэтому позволю себе воздержаться от комментариев. Про- (80) и FTP (20,21), либо необходимо настроить подключение
ще всего добавить консоль администрирования на компь- через прокси-сервер, нажав кнопку «Source». Для автома-
ютер администратора, так как это всего лишь средство для тического обновления устанавливаем флажок «Schedule for
конфигурирования удаленного сервера. Для установки за- automatic updates» и, нажав справа кнопку «Schedule», за-
ново запускаем Setup.exe в корне дистрибутивного диска, даем расписание проверки обновлений. Устанавливаем
выбираем «Install Administrator Tools → Install Symantec «Daily → At <требуемое время>» и в «Advanced» указыва-
System Center» (для работы SSC требуется Internet Explorer ем время, через которое необходимо повторять неудачные
5.5 и выше). Отмечаем необходимые компоненты. Если на попытки обновления (Handle missed events within), а также
предыдущем шаге мы отказались от Alert Management период случайного смещения расписания обновления
System, то и Alert Management System Console устанавли- («Randomization Options → Perform Update within plus or
вать не нужно. Оставляем все остальные компоненты – их minus»). Выходим в меню «Virus Definition Manager».
назначение опишем позже. После завершения инсталля- Задаем способ получения обновлений клиентами. Вы-
ции необходимо снова перезагрузить компьютер. бираем «Update virus definitions from parent server» и, нажав
На этом установка сервера завершена. Приступаем к «Settings», задаем период проверки клиентами обновлений
конфигурированию сервера и созданию конфигурационных на сервере. Значение 60 минут является гарантией того,
шаблонов для клиентов. что клиенты будут проверять наличие обновлений ежечас-
но. Поскольку при такой настройке клиенты проверяют об-
Настраиваем сервер новления только на указанном внутреннем сервере, ника-
Запускаем SSC. Раскрываем в левой части консоли кого трафика на внешнем канале они не создадут. Если в
«Symantec System Center → System Hierarchy». Должны по- сети все компьютеры локальные, то устанавливаем фла-
явиться имена обнаруженных групп. Если их несколько – жок «Do not allow client to manually launch LiveUpdate», что-

№5, май 2005 73


безопасность
бы принудительно запретить клиентам запускать проверку цию, сначала создают временный файл. Таким образом,
обновлений через Интернет. имеется возможность сразу отловить вирусный файл. Очень
После того, как порядок обновлений сервера и клиен- полезна данная опция, например, для почтового клиента
тов настроен, подтверждаем изменения. Однако если име- The Bat!, который при получении письма сначала помеща-
ются пользователи с мобильными компьютерами, то луч- ет его содержимое во временный файл. Если антивирус
ше выделить их в отдельную группу и создать персональ- почтового сервера не смог обезвредить вирус (например,
ные настройки для этой группы (в частности, разрешаю- его описание еще не появилось в сигнатурах), то локаль-
щие ручное обновление, чтобы сотрудник, уехавший в ко- ный монитор сможет предотвратить заражение – такое пись-
мандировку смог при необходимости вручную обновить свой мо просто не будет получено с POP3-сервера. Имеется в
антивирус). Даже если вы запретили клиенту запуск обнов- виду, что на почтовом сервере и на локальных компьюте-
ления через LiveUpdate, все равно имеется возможность рах установлены антивирусы разных производителей – и
добавить новые сигнатуры. Для этого необходимо скачать с если описание вируса не успело появиться в сигнатурах на
сайта производителя универсальное обновление «Intelligent почтовом сервере, то есть надежда, что на локальных ком-
Updater» в виде exe-файла. После запуска программа сама пьютерах оно уже есть.
найдет установленные компоненты и обновит их. Правее настраиваются действия, которые необходимо
производить при обнаружении зараженного файла. Как
Обновим антивирусные базы прямо сейчас: правило, оптимальным является попытка вылечить объект,
Update Virus Defs now а если это не удалось – просто удалить файл. Если у вас
Выбираем данный пункт для немедленной проверки и за- большая сеть, то помещать в карантин тысячи, скорее все-
качки главным сервером обновлений антивирусных баз че- го, бесполезных файлов как минимум нерационально.
рез Интернет. Будет выведен запрос подтверждения, и пос- В меню «Advanced» задаются дополнительные парамет-
ле этого базы начнут обновляться. Это может занять некото- ры сервера. «StartUp options» устанавливает порядок за-
рое время в зависимости от скорости вашего канала. Выде- пуска (мы выбрали «System Start», однако при необходи-
лив нужный сервер, через некоторое время (первоначаль- мости можно изменить этот параметр). «Changes requiring
ное обновление имеет размер от 5 до 8 Мб) нажмите <F5>. Auto-Protect reload» – действие, которое необходимо совер-
Статус должен смениться на нормальный (синяя галочка). шать при изменении параметров, требующих перезагруз-
Если этого не произошло – проверьте в чем дело – вызовите ки сервера антивируса. Можно выбрать «Wait until system
свойства сервера и в закладке Symantec Antivirus проверьте restart», однако лучше применять изменения сразу: «Stop
дату обновления. Она должна быть близка к текущей дате and reload Auto-Protect», так как сервера могут не перезаг-
(разница в несколько дней допускается, так как SAV указы- ружаться годами. В поле «Scan files when» указывается,
вает только дату глобального обновления, не принимая в когда именно необходимо сканировать требуемые файлы.
расчет добавления одиночных записей). Если обновление Вариант «Accessed or modified» является наиболее опти-
очень уж старое (больше 10 дней) – значит ваш сервер по мальным, так как подразумевает максимальную защиту –
каким-либо причинам не смог обновить базы. Проверьте на- проверка будет осуществляться при любом обращении к
стройки доступа вашего сервера в Интернете, а также логи файлу, а значит ни скопировать, ни запустить зараженный
шлюза – была ли предпринята сервером попытка обновить файл будет невозможно (при соответствующих настройках
базы. Для более подробного анализа можно просмотреть действий с зараженными объектами – см.выше).
даты изменения файлов с базой вирусов – она должна пока- В секции «Automatic enabler» задается время, через ко-
зывать время последнего изменения, что позволит точнее торое мониторинг будет автоматически включен, даже если
проверить, когда произошло обновление. его принудительно отключил администратор. Секция
«Threat tracer» позволяет настраивать поиск и блокирова-
Настраиваем параметры ние сетевой активности вирусов в случае обнаружения та-
антивирусного монитора сервера: ковой (используется встроенный Client-Firewall). В секции
Server Auto-Protect options «Additional advanced options» задается уровень эвристики
Настроим работу сервера антивируса в режиме online-мо- (средний – оптимален), а также контроль за флоппи-диско-
ниторинга. Устанавливаем флаг «Enable Auto-Protect», вы- водами. Так, при попытке завершения работы антивирус-
бираем типы файлов. Если выбрать «All types», то снижа- ный монитор проверяет наличие дискеты в дисководе, и
ется быстродействие, но повышается защищенность. Что- если она там есть – выдает соответствующее предупреж-
бы увеличить быстродействие, опытные администраторы, дение, которое очень часто вводит в ступор пользователей
способные совершенно точно предсказать, в каких файлах (особенно бухгалтеров, которые часто оставляют ключевые
могут содержаться вирусы, могут установить флаг «Selected» дискеты клиент-банка). Эту проверку можно отключить, ус-
и, нажав кнопку «Extensions», добавить необходимые типы тановив флаг «Do not check floppies upon system shutdown»
файлов. под кнопкой «Floppies».
Мастер позволяет автоматически добавить известные Вернемся в основное окно «Server Auto-Protect options».
SAV типы «Programs» и «Documents», однако этого не все- В секции «Options» можно разрешить или запретить выда-
гда оказывается достаточно. Например, рекомендуется до- чу сообщения при обнаружении вируса, а также отредак-
бавить вручную к приведенному списку файлы с расшире- тировать текст этого сообщения. Как правило, в больших
нием TMP, так как многие программы перед тем, как со- сетях проще это сообщение вообще отключить, иначе очень
здать окончательный файл или добавить в базу информа- быстро надоест отвечать на тревожные звонки пользова-

74
безопасность
телей, которые будут со страхом сообщать, что у них «об-
наружен вирус!». Здесь же задаются типы и расположение
файлов, которые проверять не нужно. При возможном силь-
ном торможении исключите из проверки файлы, которые
скорее всего не будут содержать вирусов, но постоянно ис-
пользуются. Например, файлы БД. В противном случае вы
получите резкое замедление работы в этих базах. Поэтому
например при использовании систем «1С:Предприятие»
файловых версий не забудьте исключить из проверки фай-
лы следующих типов: dbf, cdx, md, dd, ert, log, mlg. То же
касается работы дизайнеров (файлы tiff, cdr, psd и другие),
архитекторов, инженеров видеомонтажа и пр. В противном
случае вам гарантированы жалобы на «торможение систе-
мы», так как постоянный мониторинг, например, несколь-
ких гигабайтных AVI-файлов почти завесит систему.
Однако в последнее время обнаруживаются совершен-
но непредсказуемые уязвимости при обработке вроде бы
«безвредных» файлов (например последние уязвимости,
связанные с переполнением буфера в GDI с помощью бе-
зобидного JPG-файла). Поэтому говорить о том, что в ка-
ком-то конкретном формате файла вирусы жить не могут,
мы не имеем права. Можно лишь надеяться, что не будет Ðèñóíîê 1. Ïàðàìåòðû online-ìîíèòîðèíãà êëèåíòîâ
найдено новых ошибок в обработке этих «безопасных» рыто». Закрывая замочек около конкретной настройки, вы
форматов. Здесь необходимо руководствоваться отноше- тем самым запрещаете пользователям изменять их. По
нием показателя надежности к получаемому быстродей- умолчанию все замочки открыты, однако рекомендуется зак-
ствию. рыть хотя бы критически важные – отключение защиты, из-
В опции «Drive types» снимите все галки, так как ни про- менение типов файлов, действие, производимое над обна-
верка сетевых дисков, ни сканирование CD не даст вам ни- руженными вирусами и пр.
чего, кроме значительного замедления работы системы. Ак- В идеале лучше всего запретить пользователю любые
центирую внимание, что отключение такой проверки абсо- изменения. Таким образом управлять настройками будет
лютно безопасно, если вы проверяете файлы при любом только Администратор, что является обязательным для кор-
обращении к ним – при попытке скопировать или запустить поративной системы защиты.
такой файл он будет заблокирован. Таким образом опти- Итак, настраиваем защиту файловой системы аналогич-
мальное быстродействие достигается за счет фоновой про- но серверной, запрещаем изменения настроек, при жела-
верки только тех файлов, к которым осуществляется обра- нии отключаем оповещение пользователя о найденном ви-
щение. русе и переходим на следующую закладку – Internet E-mail.
На этом конфигурирование антивирусного монитора Разрешаем защиту и в отличие от файловой системы вы-
сервера завершено и можно переходить к настройке кли- бираем файлы всех типов – мало ли что пользователю
ентов. Конфигурация защиты клиентов аналогична сервер- пришлют по почте. Добавляем действия, производимые при
ной, за некоторыми исключениями и дополнительными воз- обнаружении файла (лучше удалять), а также настраиваем
можностями, о которых будет особо сказано далее. оповещение пользователя об обнаруженном вирусе (здесь
его можно и включить, чтобы не было вопросов в стиле «Где
Настраиваем параметры мой файл?»). Также имеется возможность изменять тему
антивирусного монитора клиентов: сообщения, в котором был обнаружен запрещенный объект,
Client Auto-Protect Options вставлять в текст письма предупреждение, отправлять пре-
В этом окне настраивается антивирусный online-мониторинг дупредительные письма отправителю и получателю. Помни-
на клиентах. Суть настроек аналогична вышеописанным для те, что посылать предупреждение отправителю не привет-
сервера, однако присутствуют и новые опции (см. рис. 1). ствуется, так как очень часто при рассылке вирусов исполь-
Например, для клиентов помимо стандартной можно на- зуется подстановка чужих адресов.
страивать различные виды защиты для систем документо- Помимо этого, нажав на кнопку «Advanced», настраи-
оборота и почты: Internet E-mail (перехват и сканирование ваем дополнительные параметры (см. рис. 2).
трафика POP3/SMTP), Lotus Notes и Microsoft Exchange. При ! «Scan files inside compressed files» – проверять файлы
перехвате POP3-сессии клиент просто не получит письмо с внутри архивов, а также архивы внутри на указанную
зараженным файлом. Насколько это будет незаметно для глубину (по умолчанию – 3) . К сожалению, о том, какие
пользователя – решать вам, включая или отключая опове- типы архивов поддерживаются, ни в документации, ни
щение о вирусе, удаляя письмо вообще или вырезая из него на сайте производителя ничего не сказано.
только инфицированные вложения. ! «Server port numbers» – порты, по которым происходит
Практически у каждой опции присутствует пиктограмма обмен почтой. Обычно они стандартны – 25 и 110, но
«замочка», который имеет два положения – «открыто» и «зак- при необходимости можно изменить.

№5, май 2005 75


безопасность
! «Heuristic Detection» – включает эвристический анали- вить срок в 10 дней для того, чтобы контролировать посто-
затор активности вирусов типа «червь». Отслеживает янное обновление баз данных и в случае сбоя получить пре-
слишком большую активность и самостоятельные дей- дупреждение). Можно также просмотреть статус клиентов в
ствия приложений. SSC – они отображаются в правой части консоли. В поле
! «Progress notifications» – в процессе обмена почтой SAV Status отображается текущее состояние клиента. При неудач-
перехватывает трафик по указанным портам и выступа- ном обновлении, обнаружении вирусов и пр. статус изме-
ет посредником между почтовым сервером и клиентской нится. Именно поэтому служба AMS не является необходи-
почтовой программой. Флажки в этой области включают мой – все события можно просмотреть, используя SSC и кон-
или выключают значок SAV-E-mail в трее, а также инди- текстное меню, вызываемое кликом на интересующем кли-
катор выполнения проверки при отправке писем. Если енте. На закладке Security реализуется упомянутая возмож-
не хочется показывать пользователям лишнюю инфор- ность запрета пользователям остановки службы и деинстал-
мацию о сканировании почты – отключите эти флажки. ляции продукта. При попытке удалить программу она запро-
сит пароль. Пароль по умолчанию, устанавливаемый произ-
Аналогично настраивается мониторинг клиентов Lotus водителем – «symantec». Рекомендую сразу его сменить.
Notes и Microsoft Exchange. Переходим к установке клиентской части на компьюте-
ры сети. На клиенты с NT-системами ее можно произвести
при помощи встроенной функции удаленного развертыва-
ния (используется RPC). В случае невозможности удален-
ной инсталляции (например, на клиентах Windows 9X/ME)
придется произвести ее дистрибутива, который помещает-
ся в сетевую папку VPHome (она автоматически становится
доступна на сервере антивируса по сети). Путь к файлу ус-
тановки в этом случае: \VPHOME\CLT-INST\WIN32\setup.exe.
Для удаленного развертывания в SSC заходим в меню
Tools и выбираем NT Client install. Запустится мастер. Вы-
бираем «Default location», в случае, если производим стан-
дартную инсталляцию из серверного дистрибутива. В пра-
вой части окна Select Computers выделяем целевой сервер,
которому будет принадлежать этот клиент. В левой части
выбираем необходимые компьютеры, выделяя их и нажи-
мая «Add>» (хоть все сразу). После нажатия кнопки «Finish»
запустится процесс подготовки необходимых файлов. Ак-
центируем внимание на том, что показываемая вам полос-
ка выполнения означает только копирование файлов на ис-
ходный компьютер. Процесс установки может занять еще
несколько минут. После этого рекомендуется перезагрузить
Ðèñóíîê 2. Ïàðàìåòðû ñêàíèðîâàíèÿ ïî÷òîâîãî òðàôèêà все клиентские компьютеры.
На этом настройка защиты клиентов закончена. Не за- Если где-то не применились настройки, необходимо сно-
бывайте после каждого этапа переконфигурирования па- ва открыть в SSC «Client Auto-Protect Options» и нажать
раметров защиты в окне «Client Auto-Protect Options» на- «Reset All…»
жимать кнопку «Reset All…» – она принудительно применя- Мы рассмотрели простейшую инфраструктуру, в кото-
ет настройки для подключенных клиентов. Несмотря на то, рой все компьютеры принадлежат одной группе – главно-
что дословный перевод «Reset…» – сброс, нажатие данной му серверу антивируса. В SAV CE 9.0 имеется возможность
клавиши инициирует именно принудительное применение создавать различные настройки для разных групп компью-
настроек. То есть сброс в текущее состояние. теров. Для этого в папке Groups создаются различные под-
папки, в которые перемещаются требуемые клиенты. Пос-
Устанавливаем защиту ле этого можно производить описанные настройки незави-
от несанкционированного изменения симо над участниками каждой группы. Они применятся на
настроек клиентской части: всех ее участников.
Client Administrator only options
В данном окне настраиваются параметры отображения Подводя итоги
значка SAV в системном трее клиентских компьютеров, а Symantec Antivirus 9.0 Corporate Edition – один из самых
также административный запрет на деинсталляцию анти- популярных на сегодняшний день антивирусных продуктов
вируса. Таким образом при грамотной настройке даже ло- корпоративного уровня. Несмотря на упомянутый в начале
кальный администратор рабочей станции не сможет ни ос- статьи недостаток, связанный с не самым лучшим уровнем
тановить службу защиты, ни удалить продукт. обнаружения и удаления Ad-software, остальные его пре-
В закладке «General» также можно указать срок устаре- имущества делают SAV 9.0 CE наиболее конкурентоспособ-
вания антивирусных сигнатур, по истечении которого будет ным решением для централизованной защиты рабочих
выдаваться сообщение об их устаревании (полезно устано- станций и серверов.

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

КОНТРОЛИРУЕМ БЕЗОПАСНОСТЬ СЕТИ


С ПОМОЩЬЮ OSSIM

Сегодня для полноценной защиты сети уже недостаточно тандема «межсетевой экран +
система обнаружения атак». Для всестороннего контроля и анализа ситуации необходимо
задействовать разные инструменты. Но только в том случае, когда возможно собрать все
данные в одном месте, можно получить действительно полную информацию о событиях,
происходящих в сети. Разработчики системы OSSIM (Open Source Security Information
Management) предоставили системным администраторам такую возможность.
СЕРГЕЙ ЯРЕМЧУК
тандартом де-факто для обеспечения безопаснос- tcptrack, способен рассказать о проблемах сети гораздо
ти сети считается использование систем обнаруже- больше. Кроме того, внушительный объем выдаваемой СОА
ния атак. В мире открытого кода несомненным ли- информации и ошибки в определении событий приводят к
дером среди такого рода продуктов является Snort. Это тому, что администратор получает большое количество
весьма функциональный и понятный инструмент, который ложных тревог. Поэтому приходится использовать и дру-
может очень многое рассказать о происходящем в подкон- гие утилиты, помогающие получить более ясное представ-
трольной сети. Но все же несмотря на достоинства систем ление о событии.
обнаружения атак, они не всегда могут дать полную карти- С другой стороны, практически все основные утилиты и
ну происходящего. Довольно часто такой инструмент, как Snort в том числе предназначены для сбора данных. Их ана-

78
безопасность
лиз лежит полностью на плечах исследователя. Поэтому настоящее время в OSSIM интегрировано большое
вполне естественно появились разработки, которые при- количество разнообразных свободных инструментов:
водят полученные данные в удобный для анализа вид. Snort, Nessus, Acid, Ntop, Nmap, P0f, Arpwatch,
Другая категория проектов своей основной задачей ста- oinkmaster, pads, tcptrack, tcpdump и некоторые другие. До-
вит интеграцию как можно большего числа приложений и полнительно возможен анализ данных, поставляемых дру-
предоставляет инструменты для анализа собранных дан- гими приложениями (например, preludeIDS, Osiris, NTsyslog,
ных. К примеру, sguil (http://sguil.sourceforge.net). Его глав- Snare, Cisco Secure IDS), которые могут быть доставлены
ной особенностью (помимо интеграции различных инстру- при помощи разных способов: syslog, snmp, сокетов и пр.
ментов), является вывод информации пользователю в ре- Открытая архитектура позволяет добавить новый датчик в
альном времени. течение нескольких часов.
Разработчики решения OSSIM основной упор делают не
на развитие новых возможностей имеющихся утилит, а На более высоком уровне система имеет монитор, на-
именно на максимальную интеграцию имеющихся прило- званный riskmeter, оценивающий риск, накопленный в те-
жений, создаваемых программистами всего мира. Для это- чение определенного промежутка времени для сети или
го их объединяют в пределах единой открытой архитекту- группы машин. Модель корреляции позволяет создавать как
ры, способной сохранить возможности и путем слияния и образцы, позволяющие определять известные и обнаружи-
поиска взаимосвязей в собранной информации получить ваемые атаки, так и образцы, определяющие неизвестные
более точный результат. Кроме обнаружения, OSSIM осу- и не обнаруживаемые ранее угрозы, строить более слож-
ществляет сопоставление сетевых событий, отсеивая часть ные модели, а также связать детекторы (обеспечивающие
ложных оповещений, и предлагает высокоуровневые инди- индикаторы) и мониторы (обеспечивающие предупрежде-
каторы, позволяющие производить инспекцию и оценивать ния) рекурсивно. Для этого применяется два принципа:
ситуацию в сети. ! Корреляция, основанная на последовательности собы-
В качестве детекторов может выступать любая програм- тий, построенных на известных уязвимостях, связыва-
ма, которая способна производить обработку информации ющая известные образцы и поведение, определяющее
(сетевой или системной) в реальном времени, все равно нападение, с помощью правил, осуществляемых стати-
каким способом: сравнением с образцом или определени- ческим аппаратом. Например, если происходит собы-
ем аномалий и выдачей предупреждения, когда такое со- тие А, затем Б, необходимо выполнить действие В.
бытие происходит. Сложность состоит в составлении правил, способных
В процессе обнаружения используются все три возмож- анализировать события абстрактно.
ные фазы: ! Корреляция, использующая эвристические алгоритмы,
! предварительная обработка; накопление по событиям и времени, что делает возмож-
! коллекционирование данных; ным обнаружение неизвестных вариантов атак и обес-
! последующая централизованная обработка информации. печивает более глобальный обзор ситуации. Для этих
целей используется накопление событий (как для всей
Если первые две фазы можно считать традиционными, сети, так и отдельных машин) с целью получения ново-
то последующая обработка собранной информации явля- го индикатора или моментальный снимок безопасного
ется центральным звеном всей системы OSSIM. Ведь имен- состояния сети. В результате создается так называемый
но на этой стадии возможно применение механизмов, по- накопленный риск, который может быть использован для
зволяющих улучшить чувствительность к обнаружению раз- оценки критических ситуаций посредством алгоритма
личных событий, в том числе и достаточно сложных, на- CALM (Compromise and Attack Level Monitor). На его вхо-
пример распределенных или растянутых по времени атак. де размещается множество событий, а на выходе – ин-
Для этого на последней стадии события располагаются по дикатор безопасного состояния сети.
приоритетам, производится оценка риска и сопоставление
с целью выявления взаимосвязи. Для оценки приоритета После такой обработки предупреждения (alerts), собран-
события используется несколько составляющих. Так, если ные детекторами и достойные внимания, будут выданы уже
происходит нападение на сервер из внешней сети и к тому как тревоги (alarms).
же сканер nessus показывает наличие уязвимости на сер- Кроме того, в OSSIM уделено внимание детальному кон-
висе, используемом нападающим, то такому событию при- тролю за каждой машиной, для чего используются три типа
сваивается более высокий приоритет, чем событию, в ко- мониторинга. Каждый из этих типов существенен для сис-
тором пользователь внутренний сети не может подключить- темы безопасности, и без них администратор фактически
ся к принтеру. Если нападение направлено на сервис, не слеп и не может отличить нормальную деятельность от ано-
используемый в данной сети, то такое событие вообще мальной:
может быть отброшено для уменьшения объема выводи- ! мониторинг использования, который обеспечивает об-
мой информации. щую информацию о машине, например среднее число
Оценка риска происходит по трем факторам: данных, передаваемых за день;
! данные, на основании которых выработано предупреж- ! мониторинг профиля обеспечивает информацию об ак-
дение; тивности пользователя, позволяя вывести характер де-
! угрозы, которые представляет событие; ятельности, например, «POP3-почта, http и ftp» – нор-
! вероятности успешного осуществления атаки. мальный режим работы пользователя;

№5, май 2005 79


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

Но это еще не все уровни мониторинга. На основании


данных монитора сессии и монитора риска рath-монитор
следит за маршрутами, используемыми различными ком-
пьютерами для связей, и вычисляет составной риск. При Ñõåìà. Ñòðóêòóðà ÁÄ OSSIM
этом строятся графики постоянных ТСР-сессий, позволяю- OSSIM может быть установлен на любую POSIX-совме-
щие идентифицировать сетевые нападения, совершаемые стимую систему – Linux, *BSD, есть сведения об успешном
одновременно на несколько компьютеров, и отдельно гра- использовании в Mac OS X.
фики хаотически изменяющихся UDP, TCP и ICMP связей.
Кроме этого, OSSIM производит инвентаризацию сети, ис- Что необходимо для установки OSSIM
пользуя как активные, так и пассивные методы, запоминая Учитывая большое количество разнородных приложений,
тип операционной системы, МАС-адрес сетевого устрой- предназначенных для сбора и вывода информации, плюс
ства, netbios и DNS-имя, предоставляемые сервисы и вер- необходимость реализации всех зависимостей, установка
сии используемого в них программного обеспечения и пр. OSSIM дело если нетрудное, но требующее внимательного
При выявленном отклонении сразу же генерируется пре- и тщательного подхода. Кроме того, на момент написания
дупреждение. статьи последней версией была 0.9.8rc2, имеющая неболь-
Затем эту информацию можно получить при помощи шие отличия в установке от стабильной версии 0.9.7. В ос-
Forensic console и Control panel. Forensic console обеспечи- новном они касаются настройки агентов. Возможно, к вы-
вает доступ ко всем данным и представляет собой поиско- ходу стабильного 1.0 релиза, а, судя по активности разра-
вик, который в отличие от монитора риска позволяет ис- ботчиков, он уже не за горами, ситуация изменится. Кста-
следовать каждое событие, происходящее в системе, с мак- ти, в версии 0.9.8 сделан первый шаг к интернационализа-
симальной детализацией. Сontrol panel позволяет просмат- ции интерфейса, пока доступны только английский, фран-
ривать сетевую ситуацию на более высоком уровне. С его цузский, немецкий, португальский, испанский, чешский и
помощью можно получить доступ ко всем инструментам мо- японский языки. В статье будет рассмотрен процесс уста-
ниторинга, оценить уровень риска для сетей, отслеживать новки 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 – здесь кроме
Структурно оssim может быть разделен на 4 компонента: OSSIM можно найти дополнительную документацию и
! агенты – призваны объединить и обеспечить занесение скрипты, помогающие в установке, удалении ossim и оп-
в базу данных информации, снятой с различных датчи- ределяющие наличие необходимых компонентов в сис-
ков: snort, pads, ntop, tcptrack, p0f, arpwatch, nessus и пр.; теме;
! база данных – открытый интерфейс, обеспечивающий ! http://www.boseco.com – есть готовый ISO-образ систе-
занесение информации в реляционную базу данных (ос- мы с настроенной и готовой к работе OSSIM.
новные составляющие – MySQL, ossim, snort/acid и
phpgacl); На сайтах, кроме исходных текстов, доступны и преком-
! сервер – производит управление корреляционным движ- пилированые rpm-пакеты, в том числе необходимые для
ком, нормализацию данных, оценку риска и приоритета удовлетворения всех зависимостей и построения датчиков,
событий; например для Fedora Core: http://www.ossim.net/download/
! консоль – позволяет управлять работой всей системы, fedora/RPMS.ossim.
анализировать данные, производить оценку риска и со- Мы рассмотрим общий случай: установку из исходных
держит структуры, обеспечивающие веб-интерфейс, при текстов на один компьютер с минимально необходимой ин-
помощи которого производится управление (основные формацией по конфигурированию сопутствующих компо-
составляющие: Apache, PHP c ADOdb, phpgacl, rrdtool, нентов, т.к. более подробное изложение займет слишком
mrtg, acid, Nessus, Nmap, Ntop, FPDF и пр.). много места. Наибольшую помощь в установке может ока-
зать документ INSTALL.Debian, который вы найдете в архи-
Каждый из представленных компонентов может быть ус- ве с исходными кодами. Это наиболее полный документ с
тановлен на отдельном узле, при этом информация между информацией об установке, поэтому он актуален и для
ними передается исключительно в зашифрованном виде пользователей других дистрибутивов.
при помощи SSL. Естественно, возможно разместить все Кроме того, в этом же архиве лежит несколько README
компоненты и на одном узле. Структурно база данных файлов с более подробным описанием особенностей уста-
OSSIM разбита на три части (см. схему). новки того или иного приложения.

80
безопасность
Для установки из исходных текстов вам понадобятся: 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.

#################################################
# OSSIM db configuration
#################################################
ossim_type=mysql
ossim_base=ossim
и другие приложения, необходимые для построения датчи- ossim_user=root
ков и удовлетворения зависимостей. ossim_pass=root_passwd
ossim_host=localhost
При установке использовался дистрибутив ALTLinux 2.4 ossim_port=3306
Master, на дисках которого можно найти подавляющее чис-
ло необходимых компонентов. В крайнем случае их можно Как видите, для доступа к базе данных используется
доустановить при помощи apt-get. пользователь root, имеющий максимальные права. С точки
зрения безопасности, такой подход не совсем правилен. Это
Создаем базы данных и таблицы упрощение сделано, чтобы минимизировать объем инфор-
Итак, начинаем с создания баз данных, необходимых для мации. К тому же из-за большого количества элементов на
хранения информации. Распакуем архив, далее для крат- этапе настройки, скорее всего, возникнут проблемы (осо-
кости этот каталог будем обозначать как $OSSIM_PATH. бенно при первой попытке). Благодаря пользователю root
Запускаем MySQL: можно быть спокойным хотя бы за этот участок работы.
После отладки, уже в рабочей системе, лучше избегать та-
# /etc/init.d/mysqld start кого подхода и создать для каждого случая своего пользо-
Starting safe_mysqld service: [ DONE ] вателя с минимально необходимыми правами, частично
пример такого подхода вы найдете в конце статьи.
Устанавливаем пароль, если до этого MySQL не исполь- Далее для создания таблиц нам потребуются исходные
зовался. тексты в Snort и Acid. Если же их планируется использо-
вать как датчики на этом же компьютере, то устанавлива-
# mysqladmin -u root password root_password ем и настраиваем, как описано в документации.
Создаем базы данных для snort.
Создаем две базы данных ossim и snort (эта база дан-
ных используется при построении датчика Snort). # tar –xzvf snort-2.3.2.tar.gz
# cd snort 2.3.2
# cat ./schemas/create_mysql | mysql -u root -p snort
# mysql -u root -p

Enter password: В более ранних версиях скрипты находились вместо


Welcome to the MySQL monitor. Commands end with ; or \g. schemas в contrib.
Your MySQL connection id is 1 to server version: 4.0.20-log После этого переходим к таблицам Acid. На сценарии
Type 'help;' or '\h' for help. Type '\c' to clear the buffer. необходимо предварительно наложить патчи.

mysql> create database ossim; # cd /var/www


Query OK, 1 row affected (0.09 sec) # tar -xzvf /tmp/acid-0.9.6b23.tar.gz
# cd acid
mysql> create database snort; # patch -p1 < $OSSIM_PATH /contrib/acid.patch

№5, май 2005 81


безопасность
patching file acid_cache.inc # ./configure --with-mysql
patching file acid_common.php # make
patching file acid_conf.php
# make install
patching file acid_hdr2.html
patching file acid_main.php После чего создаем каталог /etc/snort:
patching file acid_output_query.inc
patching file acid_qry_common.php # mkdir /etc/snort
patching file acid_qry_form.php
patching file acid_qry_sqlcalls.php
patching file acid_state_citems.inc
patching file acid_state_criteria.inc
И копируем в образовавшийся каталог необходимые
patching file acid_update_db.php файлы:
patching file create_acid_tbls_mysql.sql
patching file create_acid_tbls_pgsql.sql # cp snort-2.3.2/etc/snort.conf /etc/snort/
# cp snort-2.3.2/etc/unicode.map /etc/snort/
Далее настройка ACID происходит обычным образом, # cp $OSSIM_PATH/contrib/spade/spade.conf.sample ↵
не забудьте только изменить параметры доступа к базе /etc/snort/spade.conf
данных в acid_conf.php.
Далее редактируем эти файлы, при этом в snort.conf
$alert_dbname = "snort"; должны быть строки, настраивающие уровень критичнос-
$alert_host = "localhost";
$alert_port = "3306"; ти заносимых сообщений для syslog и параметры базы дан-
$alert_user = "root"; ных:
$alert_password = "root_passwd ";

Создаем необходимые таблицы. ###################################


# Step #3: Configure output plugins
###################################
# cat ./create_acid_tbls_mysql.sql | mysql -u root snort -p output alert_syslog: LOG_AUTH LOG_ALERT
output database: alert, mysql, user=root dbname=snort ↵
host=localhost logfile=fast.log

Устанавливаем и настраиваем И подключаем файл spade.conf директивой:


датчики Snort и Spade
Так как мы устанавливаем все компоненты OSSIM на один Includespade.conf
компьютер, то теперь инсталлируем Snort как датчик. Для
этого первым делом ставим Spade (Statistical Packet Anomaly После чего заполняем секцию в файле ossim.conf, кото-
Detection Engine). Ранее он поставлялся вместе с Snort, сей- рая отвечает за доступ к БД для сенсора Snort:
час для удобства он поставляется вместе с ossim, его можно
взять и с официального сайта (http://www.silicon defense.com). # ########################
# # SNORT db configuration
# # (look at snort.conf)
# cd $OSSIM_PATH/contrib/spade/Spade-040223.1.tgz # ########################
# tar -xzvf Spade-040223.1.tgz snort_type=mysql
# cd Spade-040223.1 snort_base=snort
# vi Makefile snort_user=root
snort_pass=root_passwd
snort_host=localhost
Редактируем переменную SNORTBASE, указывающую snort_port=3306
на месторасположение исходных текстов Snort:
Настройку доступа к базе данных на этом этапе можно
# make считать законченной.
...............
Spade installed!
Настраиваем сервер OSSIM
Накладываем патчи на Snort, номера версий в моем Приступаем к установке сервера:
случае не совпадают, но проблем замечено не было:
# cd $OSSIM_PATH/
# cd snort-2.3.2 # ./autogen.sh
# patch -p0 < $OSSIM_PATH/contrib/snort-2.1-ossim.patch
По умолчанию утилита конфигурируется с опциями
patching file src/output-plugins/spo_database.c ./configure --sysconfdir=/etc --localstatedir=/var, если удоб-
Hunk #2 succeeded at 69 with fuzz 1.
Hunk #3 succeeded at 184 (offset 1 line). нее разместить всю структуру, например в /opt/ossim их
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).
# cd src/
# make
Hunk #9 succeeded at 1735 (offset 1 line).
Hunk #10 succeeded at 2844 (offset 9 lines).
Hunk #11 succeeded at 2855 (offset 1 line). После чего в /etc/ossim должен появиться ряд подкатало-
гов, сейчас нас интересует только один – /etc/ossim/server,
И далее устанавливаем Snort обычным образом, не за- содержащий несколько XML-файлов (config.xml, directives.xml,
бывая добавить опцию --with-mysql, для того чтобы он мог generic.xml, trojans.xml, directives.xml). Кроме того, при уста-
заносить данные в MySQL: новке должен быть создан каталог /var/log/ossim, предназ-

82
безопасность
наченный для журнала, а исполняемый файл ossim-server Копируем шаблон конфигурации веб-сервера.
нужно переместить в /usr/local/bin/. Проверьте их наличие,
если чего-то нет – скопируйте или создайте вручную. # cp $OSSIM_PATH/etc/httpd/ossim.conf /etc/httpd/conf/
На следующем шаге необходимо отредактировать файл
/etc/ossim/server/config.xml. Структура его проста и понят- И проверяем правильность путей внутри него:
на, в нем содержатся данные для доступа к базам ossim и
snort, IP-адрес (не используйте 127.0.0.1, иначе не сможете <IfModule mod_alias.c>
Alias /ossim "/var/www/ossim"
подключиться к серверу) и интерфейс, на котором сервер </IfModule>
будет слушать подключение агентов и консоли, e-mail, на
<Directory /var/www/ossim>
который будут отсылаться предупреждения. Дополнитель- <IfModule mod_php4.c>
но могут указываться IP-адреса дублирующих (replication) php_value include_path .:/usr/share/ossim/php/
</IfModule>
серверов в случае совместной работы нескольких серве- </Directory>
ров OSSIM.
<Directory /var/www/phpgacl>
Здесь становится очевидно одно из неудобств настрой- AuthType Basic
ки OSSIM: для всех компонентов используются свои кон- AuthName OSSIM
AuthUserFile /var/www/ossim-users
фигурационные файлы, информация в некоторых из них Require valid-user
(например, параметры доступа к БД) дублируются, что при- AllowOverride None
</Directory>
водит к увеличению объема работ, а также путанице и
ошибкам. Как видите, для доступа необходимо завести пользова-
Когда все готово, сервер можно запускать. теля ossim и задать пароль:

# ossim-server -d -c /etc/ossim/server/config.xml # htpasswd -c /var/www/ossim-users ossim

New password:
При этом не должно быть выдано никаких ошибок, а в Re-type new password:
Adding password for user ossim
журнале должна появиться запись:
Теперь рассмотрим конфигурационный файл Apache
# cat /var/log/ossim/server.log httpd.conf и проверим загрузку модулей mod_php4 и mod_ssl,
OSSIM-Message: sim_thread_scheduler а также подключим при помощи параметра Include файл
OSSIM-Message: sim_thread_organizer /etc/httpd/conf/ossim.conf. Перезапускаем веб-сервер и вво-
OSSIM-Message: sim_thread_server
OSSIM-Message: Waiting for connections...
дим в браузере http://localhost/phpgacl/setup.php, для на-
стройки phpgacl. Теперь, когда phpgacl установлен, необ-
Сервер готов принимать подключения. ходимо перейти к странице http://localhost/ossim/setup/
ossim_acl.php, что приведет к автоматическому заполнению
Приступаем к настройке консоли базы данных с заданными по умолчанию параметрами дос-
Все настройки производятся в конфигурационном файле тупа (пользователь admin пароль admin, который необходи-
/etc/ossim/framework/ossim.conf, который мы использовали мо затем обязательно изменить, используя «Сonfiguration →
ранее. Кроме параметров доступа к базам ossim и snort, Main»).
требуется указать пути к некоторым приложениям. Установка RRDTool проста, скачиваем последнюю вер-
сию с http://people.ee.ethz.ch/~oetiker/webtools/rrdtool/
################### download.html и устанавливаем обычным образом. После
# Base dir
################### чего указываем в файле /etc/ossim/framework/ossim.conf ме-
data_dir=/opt/ossim стонахождение исполняемых файлов и библиотек.
base_dir=/var/www/ossim
# ÿ ïåðåìåñòèë ïîäêàòàëîã www ïîáëèæå ê îñòàëüíûì ôàéëàì
# âåá-ñåðâåðà rrdtool_path=/usr/bin/
ossim_interface=eth0 rrdtool_lib_path=/usr/lib/perl5/
ossim_link=/ossim/
adodb_path=/usr/share/adodb/ Следующим шагом идет настройка mrtg, здесь работы
phpgacl_path=/var/www/phpgacl/
немного больше. Скачиваем с http://people.ee.ethz.ch/
И в самом конце файла: ~oetiker/webtools/mrtg/pub, накладываем патчи:

jpgraph_path=/usr/share/jpgraph/ # tar –xvzf mrtg-2.10.5.tar.gz


# cd mrtg-2.10.5/bin
# patch -p0 < $OSSIM_PATH/contrib/mrtg/mrtg.diff
Заходим в /var/www/phpgacl/, редактируем два файла
gacl.class.php и admin/gacl_admin.inc.php, где в переменных Затем компилируем и устанавливаем, как описано в doc/
«db_type», «db_host», «db_user», «db_password» и «db_name» unix-guide.txt. После чего создаем необходимые каталоги и
указываем параметры доступа к базе данных ossim (пара- прописываем путь к ним в конфигурационных файлах.
метр «db_table_prefix» оставляем пустым). Здесь же созда-
ем подкаталог admin/templates_c с возможностью записи в # mkdir /var/www/mrtg
# cd /var/www/mrtg
него с правами пользователя, от имени которого работает # mkdir host_qualification net_qualification ↵
веб-сервер. global_qualification level_qualification

№5, май 2005 83


безопасность
Теперь редактируем /etc/ossim/framework/mrtg-rrd.cfg: консоли. Перед установкой на него необходимо наложить
патчи.
WorkDir: /var/www/mrtg
Include: /var/www/mrtg/hosts/host_qualification.cfg # tar –xzvf ntop-3.1.tar.gz
Include: /var/www/mrtg/nets/net_qualification.cfg # cd ntop-3.1/
Include: /var/www/mrtg/global/global_qualification.cfg
# patch -p0 < $OSSIM_PATH/contrib/ntop/ntop-3.1-ossim.diff

И в файле /etc/httpd/conf/ossim.conf редактируем пере- В указанном каталоге находятся патчи для нескольких
менные: версий ntop. Далее все проходит,как описано в документа-
ции. Если все прошло нормально, на результат можно по-
mrtg_rrd_files_path=/var/www/mrtg смотреть, набрав http://localhost:3000, активируем rrdPlugin
rrdpath_host=/var/www/mrtg/host_qualification/
rrdpath_net=/var/www/mrtg/net_qualification/ зайдя в «Admin → plugins».
rrdpath_global=/var/www/mrtg/global_qualification/ Редактируем файл ossim.conf:
font_path=/opt/ossim/contrib/fonts

Далее необходимо, чтобы интерпретатор Perl видел мо- ntop_link=http://your_ntop_host:3000/


rrdpath_ntop=/var/lib/ntop/rrd
дуль ossim_conf.pm. Для достижения этого можно создать
символическую ссылку: Начиная с версии 0.9.7, консоль OSSIM может созда-
вать отчеты в формате pdf, что очень удобно при выводе
# ln -s $OSSIM_PATH/include/ossim_conf.pm /usr/lib/perl5/ на печать. Для реализации такой возможности использует-
ся FPDF – специализированный класс PHP, представляю-
Можно также указать другой каталог, перечисленный в щий собой свободную (не требующую отчислений при ком-
массиве @INC (вывести весь список можно, perl -e ’print мерческом использовании) замену Pdflib. Установка проста.
«@INC\n»’), либо сделать видимым путь к $OSSIM_PATH/ Скачиваем архив и копируем файл fpdf.php в каталог, ука-
include/ в массиве @INC, указав эти данные в скрипте занный в параметре include_path т.е. /usr/share/ossim/php/
draw_graph.pl, добавив вначале строку: (или в php.ini) файла настройки ossim.conf веб-сервера.

use lib "/opt/ossim/include"; # tar -xzvf fpdf153.tgz


# cd fpdf153
# cp fpdf.php /usr/share/ossim/php/
либо поместив модуль и скрипт в один каталог (перемен-
ная @INC обычно включает текущий каталог). Другие ва- Интеграция OSSIM и nessus описана в README.nessus,
рианты решения смотрите perldoc -q @INC. поэтому за более подробной инструкцией обращайтесь к
Сам скрипт draw_graph.pl копируем каталог cgi-bin веб- нему. Ничего необычного в установке нет. Заносим в /etc/
сервера: ossim/framework/ossim.conf данные для доступа к серверу
nessus:
# cp $OSSIM_PATH/scripts/draw_graph.pl /var/www/cgi-bin/
nessus_user=ossim
nessus_pass=your_password
Запускаем скрипт launch-mrtg, который создаст необ- nessus_host=localhost
ходимые файлы: nessus_port=1241
nessus_path=/usr/bin/nessus
nessus_rpt_path=/var/www/ossim/vulnmeter/
# cd $OSSIM_PATH/mrtg
# ./launch-mrtg
Пароль задается так.
И обеспечиваем ему периодический запуск:
# /usr/sbin/nessus-adduser
# crontab -e
Using /var/tmp as a temporary file holder
0-59/5 * * * * $OSSIM_PATH/mrtg/launch-mrtg
Add a new nessusd user
----------------------
либо используя готовый шаблон: Login : ossim
Authentication (pass/cert) [pass] :
# cp $OSSIM_PATH/etc/cron.d/ossim /etc/cron.d/ Login password : your_password

Для обновления подключаемых модулей вводим:


Для обновления данных, используемых утилитами mrtg
и rrdtool, применяется скрипт control_panel.py, который не- # nessus-update-plugins
# perl $OSSIM_PATH/scripts/update_nessus_ids.pl
обходимо поместить в каталог, где он будет виден пере-
менной PATH: Кроме того, для запуска сканирования используется
Perl-скрипт $OSSIM_PATH/scripts/do_nessus.pl, который за-
# cp $OSSIM_PATH/scripts/control_panel.py /usr/local/bin/ носит результат работы в базу данных ossim.
# chmod +x /usr/local/bin/control_panel.py

Ставим ntop. При построении OSSIM он может быть раз- Настраиваем работу с агентами
мещен в принципе на любом компьютере, хотя в докумен- И наконец, настройка работы с агентами. Установка управ-
тации описана установка на компьютер, выполняющий роль ляющего скрипта (написанного на Python), при помощи ко-

84
безопасность
торого осуществляется контроль над агентами, несколь- /usr/bin/tcptrack -i eth0 -P 40003 -F 10 –D
ко отличается в версиях 0.9.7 и 0.9.8. Ранее необходимо
было просто скопировать файлы на свое место, теперь этим Записываем в файл /etc/services следующие строки:
руководит отдельный сценарий. При этом если просто ско-
пировать скрипт в каталог, перечисленный в переменной ossim-agent 40001/tcp #ossim-agent
ossim-agent 40001/udp #ossim-agent
PATH, то при работе выдается множество ошибок, лучше
всего создать ссылку: Теперь можно запускать в боевом режиме:

# cd $OSSIM_PATH/agent # ossim-agent -d -c /etc/ossim/agent/config.xml


# ln -sf `pwd` /usr/local/bin
# python setup.py install (->) Agent: Waiting for server...
(<-) Agent: Server connected

Копируем конфигурационный файл на свое место: C точки зрения безопасности агентам лучше дать ми-
нимальные права для работы с базой данных:
# mkdir /etc/ossim/agent
# cp $OSSIM_PATH/etc/agent/config.xml /etc/ossim/agent # mysql -u root -p
и запускаем, проверяя на наличие ошибок: mysql> GRANT INSERT, SELECT on snort.* to root@sensor_ip
IDENTIFIED BY 'mysql_password';
# ossim-agent -v mysql> GRANT INSERT, SELECT on ossim.* to root@sensor_ip
IDENTIFIED BY 'mysql_password';
mysql> exit;
Если агент запустился без проблем и жалуется на отсут-
ствие датчиков, то все нормально и можно открывать кон- хотя на этапе настройки это можно пропустить.
фигурационный файл для редактирования. Файл config.xml
имеет простую и понятную структуру, поэтому особых слож-
ностей не предвидится.
В самом начале идет описание сервера:

<!-- 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> описывает датчики. Если какой-то из


датчиков не установлен, то пункт, отвечающий за его за-
пуск, следует «закомментировать», чтобы при работе не
засорять файлы журнала ненужными сообщениями об Ðèñóíîê 1. Ïóíêòû ìåíþ êîíôèãóðàöèè ïîçâîëÿþò ïîëó÷èòü
áîëåå òî÷íûé ðåçóëüòàò
ошибках. Например, датчик snort описан так:

<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 неразберихи еще больше, скрипт
Ðèñóíîê 2. Ïîëó÷åíèå ïîäðîáíûõ îò÷åòîâ – îäíà èç ïîëîæèòåëüíûõ
может называться и apache, и httpd, и httpd2. Поэтому про- ñòîðîí OSSIM
контролируйте правильность написания названий. Во вто- Теперь, когда самая трудная часть позади и все настрой-
ром случае вместо строки, записанной по умолчанию в ки произведены, можно заходить в консоль. Вызываем веб-
файле: браузер и вводим https://localhost/ossim, используя в качестве
имени/пароля admin-admin. При первом запуске система ак-
tcptrack -i eth0 -P 40003 -F 10 –D тивирует все необходимые для работы параметры и устано-
вит настройки для Control Panel. Дальнейшее изучение вы
укажите полный путь к утилите (это даже считается хоро- можете продолжить самостоятельно, щелкая мышкой и на-
шим тоном). блюдая за информацией выдаваемой системой.

№5, май 2005 85


образование

СВОБОДНАЯ ИНФОРМАЦИОННАЯ СИСТЕМА


ДЛЯ ШКОЛ CENTRE
Несмотря на стремительное развитие компьютерных технологий, до настоящего времени
во многих учебных заведениях учет персональных данных школьников и студентов ведется
вручную. Это отнимает много времени у преподавателей и отвлекает их от основной работы.
Система Centre позволит автоматизировать рутинные задачи и облегчит повседневный труд.

СЕРГЕЙ ЯРЕМЧУК
тклики, пришедшие на мой адрес после публика- может быть адаптирован для различных школьных программ,
ций материала об ATutor [1] и OpenAdmin [2], сви- задано любое количество семестров или учебных периодов.
детельствуют об имеющемся спросе на приложе- Кроме того, для Centre разрабатываются дополнения, спо-
ния, которые ориентированы на сферу образования. Дей- собные расширить его возможности.
ствительно, сегодня в большинстве школ учет персональ- Главный недостаток Centre состоит в отсутствии русско-
ных данных ведется на бумаге либо в документах MS Word язычной локализации. Ознакомиться с работой Centre мож-
(Excel), что не только неудобно, но и малоэффективно. По- но, зайдя по адресу http://demo.miller-group.net, используя для
иск и отбор необходимой информации в таком случае силь- доступа имена пользователей admin, teacher, parent, student
но затруднен и часто происходит не без ошибок и казусов, с таким же паролем (admin-admin, teacher-teacher и т. п.).
даже для небольшой справки задействуются лишние ре-
сурсы, которые могли бы быть использованы более рацио- Установка сервера Centre
нально. Особенно большой интерес среди таких приложе- Сервер Centre построен с применением свободных компо-
ний вызывают открытые продукты. нентов. Так, для хранения информации используется база
Свободная студенческая информационная система данных PostgreSQL (кроме неё поддерживается Oracle, дру-
(Student Information System) Centre проектировалась так, что- гие сервера не поддерживаются), весь код написан на PHP,
бы обеспечить все нужды преподавателей, родителей, сту- в качестве веб-сервера используется Apache. Такие ком-
дентов, школьников, администраторов, и представляет со- поненты позволяют использовать в качестве операционной
бой эффективное средство сбора информации, которое мо- системы Linux, FreeBSD и многие другие UNIX-подобные ОС,
жет быть использовано в учебных заведениях разного уров- а также Windows и Mac OS X. Кроме того, для генерации
ня: от начальных школ до вузов. Гибкость Centre позволяет отчетов в формате PDF необходим HTMLdoc (http://www.
применять один сервер для хранения информации любого easysw.com/htmldoc). Во время написания статьи исполь-
количества учебных заведений с разграничением полномо- зовался дистрибутив ALTLinux 2.4 Master.
чий как во внутренних сетях, так и в Интернете. Применение Регистрируемся на сайте, скачиваем архив сервера и
веб-технологий упрощает клиентскую часть и позволяет распаковываем его в каталог с документами веб-сервера
пользователям получать доступ к необходимой информации Apache /var/www/html (или /srv/www в SuSE). Для удобства
с любого компьютера, имеющего выход в Интернет. На мо- работы переименовываем каталог.
мент написания статьи актуальной была версия 1.5, кото-
рую можно бесплатно получить с сайта поддержки проекта # mv /var/www/html/Centre-v.1.4 /var/www/html/centre
http://www.miller-group.net, для чего необходимо первоначаль-
но зарегистрироваться. Centre распространяется под лицен- Устанавливаем, настраиваем и запускаем PostgreSQL:
зией GPL. В базу данных может быть внесена практически
любая информация об учащихся, персональные данные, в # /etc/init.d/postgresql restart
том числе и медицинская информация, посещаемость, ус- Service postmaster is not running. [PASSED]
певаемость и прочее. В Centre особое внимание уделено Creating default database: [ DONE ]
Starting postmaster service: [ DONE ]
удобству поиска и генерации различного вида отчетов по его Link postgresql socket: [ DONE ]
результатам. Так, кроме выдачи информации в браузер, от-
четы могут быть сохранены в файле формата PDF, что удоб- Теперь соединяемся с PostgreSQL и создаем базу дан-
но для последующей печати. На основании данных о место- ных, необходимую для работы (см. рис. 1) .
жительстве учащихся могут быть заполнены адреса на кон-
вертах, это позволит организовать рассылку различного рода # psql -U postgres template1
информации (табелей успеваемости, посещаемости, спис-
ков и пр.). Различного рода планировщики помогают эффек- Далее создаем таблицы, используя готовый шаблон:
тивно распоряжаться временем учебных групп или отдель-
ных учащихся, организовывать курсы, инструктажи. Плани- # psql -U postgres centre ↵
< /var/www/html/centre/centre.sql > centre.log
руемые события можно просмотреть через календарь. Сentre

86
образование
Добро пожаловать в psql 7.4.3 - Интерактивный Терминал PostgreSQL. Далее создаем новых пользователей, вводим информа-
цию о школе и прочие данные, необходимые для работы.
Наберите: \copyright для условий распространения
\h для подсказки по SQL-командам Администраторы, учителя, родители могут самостоятель-
\? для подсказки по внутренним slash-командам (\команда) но создавать учетные записи. Для этого на главной стра-
\g или ";" для завершения и выполнения запроса
\q для выхода нице необходимо нажать «Create Account», после чего в по-
явившемся окне заполнить свои данные, указав действую-
template1=# CREATE DATABASE centre;
CREATEDATABASE щий почтовый адрес, на который будет затем отослано со-
общение об активации входа. Администратор может выб-
template-# \q
рать фильтр No Access на странице Users в строке поиска
Ðèñóíîê 1. Ñîçäàåì áàçó äàííûõ пользователей Profile, и в результате им будет получен спи-
При этом в ходе выполнения команды могут быть полу- сок пользователей, не имеющих допуска (рис. 3).
чены сообщения, начинающиеся с «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"; Ðèñóíîê 3. Ïîíÿòíîå ìåíþ, ïîçâîëÿåò áûñòðî íàéòè
ïîëüçîâàòåëÿ ïî çàäàííûì êðèòåðèÿì
Далее необходимо ввести полный путь к файлам сер- Чтобы разрешить пользователю вход, измените параметр
вера и каталогу, в котором будут храниться фотографии «User Profile» на необходимый, т.е. Administrator, Teacher,
студентов, и изменить название школы, которое будет вы- Parent, N/A (остальные), и не забудьте указать в параметре
водиться в заголовке. «School», к данным какой из школ он получит допуск. Пункт
«Associate Students» позволяет указать на родителей сту-
// Server Names and Paths дента. После чего на заявленный при регистрации почто-
$CentrePath="/var/www/html/ñentre/";
$StudentPicturesPath = ="/var/www/html/ñentre/pictures"; вый ящик уйдет сообщение об успешной активации пользо-
$CentreTitle = 'Centre School Information System'; вательского входа. Для добавления в базу учащихся при-
меняется вкладка «Students», где, выбрав «Add a Student»,
Набираем в строке браузера http://your_domain.com/ необходимо ввести соответствующую информацию. В даль-
сentre/index.php и попадаем на заглавную страницу, где ре- нейшей работе можно разобраться самостоятельно, к тому
гистрируемся с именем пользователя admin и паролем же в каталоге Doc архива имеется документация на анг-
admin (по умолчанию в системе заведены и другие тесто- лийском языке, которая может помочь в освоении Centre.
вые пользователи, о которых говорилось в начале статьи, Как говорилось выше, локализацию Centre можно осу-
в целях безопасности их желательно отключить или изме- ществить своими силами (рис. 3) по мере ввода сервера в
нить пароль). В результате будет выведено поздравление с эксплуатацию. К сожалению, отсутствие шаблонов, собран-
успешной установкой. В случае неудачи появится диагнос- ных в одном месте, несколько затрудняет работу.
тическое сообщение (рис. 2): В первую очередь следует заглянуть в файлы: 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/.
С остальными настройками вы сможете разобраться в
процессе работы. Успехов!

Литература:
1. Яремчук С. Обучение при помощи Atutor. – Журнал «Си-
стемный администратор», № 1, январь 2005 г. – 84-87 с.
2. Яремчук С. Сервер для школ. – Журнал «Системный
Ðèñóíîê 2. Äèàãíîñòè÷åñêèå ñîîáùåíèÿ ïîçâîëÿþò âûÿâèòü
ïðîáëåìó администратор», № 4, апрель 2005 г. – 88-91 с.

№5, май 2005 87


web

БАЗОВАЯ HTTP-АВТОРИЗАЦИЯ –
ЗАЩИТА ОТ ЧЕСТНЫХ ЛЮДЕЙ

Базовая авторизация используется повсеместно


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

АЛЕКСЕЙ МИЧУРИН
Basic Authorization под микроскопом HTTP/1.1 401 Authorization Required
За работу механизма так называемой базовой авториза- Date: Tue, 01 Mar 2005 11:30:10 GMT
Server: Apache/1.3.33 (Unix)
ции (далее просто BA – Basic Authorization) на стороне сер- WWW-Authenticate: Basic realm="How about authorization?"
вера отвечает не какое-то специфическое ПО, а сам сер- Connection: close
вер. Content-Type: text/html; charset=iso-8859-1

Давайте рассмотрим диалог клиента и сервера при по- Необычным в нём является статус (первая строка), ко-
пытке получить доступ к конфиденциальной информации. торый равен не 200, как при «нормальном» ответе, а 401.
Когда пользователь впервые пытается получить защи- Также в нём имеется поле WWW-Authenticate, сообщающее
щённый документ, щёлкнув мышкой по ссылке, по кнопке браузеру детали: авторизация будет проходить по Basic-сце-
в форме или просто набрав URL, браузер (клиент) посыла- нарию, пользователю рекомендуется сообщить указанную
ет на сервер самый обычный запрос. Это неудивительно – фразу.
браузер пока не знает, что доступ к этому документу огра- Вслед за этими заголовками передаётся тело докумен-
ничен. Заголовки HTTP-запроса могут выглядеть прибли- та, которое браузер пока не отображает, а выдаёт диало-
зительно так: говое окно с просьбой ввести имя и пароль.
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 – необходимый документ уже загружен, его осталось
только показать пользователю. Два слова о настройке
Если пользователь ввёл имя и пароль, то сразу после Basic Authorization
нажатия кнопки «ОК» браузер отправляет эту информацию «Минусы» BA рассмотрим чуть позже, а сперва оценим глав-
на сервер в новом запросе, заголовок которого будет при- ный её «плюс» – простоту настройки.
мерно таким: Сегодня уже трудно найти host-провайдеров, у которых
в списке предоставляемых возможностей не значилось бы
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 неё), достаточно разместить в ней файл .htacess примерно
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 AuthName "How about authorization?"
Connection: keep-alive AuthType Basic
Authorization: Basic MTox
Require valid-user
AuthUserFile /ïóòü/ê/ôàéëó/.htpasswd
Как видите, это снова обычный GET-запрос, но теперь
сервер получил информацию о пароле и имени пользова- или добавить подобные команды в имеющийся .htaccess.
теля в строке Authorization. Секретная информация не за- Смысл и назначение этих директив достаточно очевидны.
щищена, а просто закодирована методом base64 (RFC AuthName задаёт строку, которую браузер должен показать
2045). Если декодировать строку MTox, то вы получите имя пользователю при запросе имени и пароля. AuthType зада-
и пароль, разделённые двоеточием. То есть никакой сек- ёт тип авторизации (Basic). Директива Require способна вы-
ретностью тут и не пахнет. полнять различные проверки легальности доступа Здесь
Если имя и пароль удовлетворят сервер, то пользова- вы видите её элементарное применение: мы потребовали,
тель получит требуемый документ. Набор заголовков отве- чтобы посетитель был зарегистрированным пользователем.
та будет выглядеть как обычно: Точнее, мы потребовали, чтобы посетитель получил дос-
туп к файлам только в том случае, если он успешно про-
HTTP/1.1 200 OK
Date: Tue, 01 Mar 2005 11:41:36 GMT
шёл процедуру авторизации. Директивой AuthUserFile ука-
Server: Apache/1.3.33 (Unix) зываем файл с паролями.
Last-Modified: Tue, 01 Mar 2005 11:22:32 GMT Файл с паролями .htpasswd2 создаётся и дополняется
ETag: "4e598b-33-42245078"
Accept-Ranges: bytes утилитой htpasswd, входящей в дистрибутив Apache. Рас-
Content-Length: 51 полагать его безопаснее вне дерева каталогов, доступных
Connection: close
Content-Type: text/html; charset=koi8-r
по HTTP.
Я не сказал ещё про одну Auth-директиву – это Auth-
Если пара имя/пароль не верна, то сервер просто снова GroupFile. С её помощью можно задать файл, описываю-
выдаст документ-запрос 401, повторно инициируя диалог щий группы пользователей. К сожалению, информация о
браузера с пользователем. группе пользователя может быть использована только в ди-
После первой авторизации браузер запоминает имя и рективе Require. Поэтому разбиение пользователей на груп-
пароль и сообщает серверу эту информацию при всех пос- пы практически ничем не расширяет возможности админи-
ледующих обращениях. Сервер больше не будет обраба- стратора и используется редко.
тывать ошибку 401, а от пользователя не потребуется по- Защитить паролем можно директорию и с HTML-доку-
вторного ввода пароля. Процесс авторизации прошёл ус- ментами, и с CGI-скриптами, и даже с графикой. Одним
пешно, но обратите внимание на то, что в результате не словом, абсолютно любую директорию, доступную через
была открыта сессия. Иллюзию непрерывной сессии созда- Web.
ёт браузер, который фактически авторизуется при каждом Есть ещё одна инструкция, к которой мы сегодня обра-
запросе. К этому существенному недостатку BA мы ещё тимся, хотя она и не относится напрямую к авторизации.
вернёмся. Если добавить в .htaccess строку:
Кроме того, практически все современные браузеры ос-
нащены менеджерами паролей и способны сохранять па- ErrorDocument 401 /ïóòü/äîêóìåíò_èëè_ñöåíàðèé

1
Строго говоря, браузер может обратиться к серверу за графикой и другими элементами, необходимыми для отображения страницы с
сообщение 401.
2
Совсем не обязательно называть его именно так.

№5, май 2005 89


web
то указанный документ (или результат работы указанного пытается ломать защиту, и вы просматриваете статистику
сценария) будет высылаться с ответом 401. Пользователь, каждый день. Если же в день ваш ресурс посещают сотни
как вы помните, увидит этот документ, если откажется от пользователей, а попытки взлома случаются раз в год, жур-
авторизации3. налы (хуже! – лишь выжимки из них) вы просматриваете
примерно с такой же периодичностью, то обнаружить зло-
Уязвимости Basic Authorization умышленников довольно трудно. Кроме того, на многих хо-
Итак, BA страдает практически всеми возможными уязви- стингах у владельца нет возможности просматривать log-
мостями, какие только можно придумать. файлы или управлять их форматом. А используя CGI-сце-
нарий, можно не только вести журнал, но и, скажем, фор-
Передача открытого пароля мировать e-mail-сообщения администратору в «подозри-
Как вы видели, пароль и имя пользователя передаются не- тельных» случаях.
шифрованными (base64-кодирование никак нельзя назвать Вот простой пример CGI-сценария, написанного на shell.
защитой). Более того, секретная информация оснащена Он ведёт простой протокол, отмечая в журнале время и имя
весьма броской «меткой» – текстом «Authorization», кото- пользователя при каждой попытке авторизоваться.
рую легко найти в общем потоке данных. Кроме того, если
злоумышленник не смог вычленить из трафика пароли с #!/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! По крайней мере Команда echo добавляет строку в журнал, а cat выдаёт
до тех пор, пока вы остаётесь в рамках протокола HTTP и на стандартный вывод минимальный заголовок и тело HTTP-
механизма BA. ответа.
Этот элементарный пример я привёл здесь не столько,
Возможность подбора пароля чтобы обогатить человечество ещё одним полезным CGI-
Как видите, BA не предоставляет никаких средств, ограни- сценарием, сколько для того, чтобы обсудить два важных
чивающих количество неудачных попыток авторизоваться. аспекта.
То есть злоумышленник может сколько угодно подбирать Во-первых, обратите внимание на использование пере-
пароль. Хуже всего то, что перебором может заняться лю- менной REMOTE_USER. Если эта переменная определена,
бой пользователь Интернета. Конечно, не факт, что он от- то конструкция ${REMOTE_USER:-nouser} эквивалентна
гадает ваш пароль, но, когда одновременно подбор ведёт значению $REMOTE_USER, в противном случае вся конст-
множество «агентов», опасность взлома, как вы понимае- рукция эквивалентна строке «nouser» (о работе с перемен-
те, умножается, даже если шансы каждого будут невелики. ными в shell см. man 1 sh).
При первом обращении клиента к серверу, когда
Защита от подбора Authorization-информация ещё не передаётся браузером,
Этот недостаток можно частично скомпенсировать, и здесь переменная REMOTE_USER не будет определена. Но если
нам поможет директива ErrorDocument. С её помощью мож- пользователь ввёл неверные данные – попытка авториза-
но назначить CGI-скрипт ответственным за обработку ошиб- ции была, но потерпела неудачу – то наш сценарий будет
ки 401. Например: вызван повторно, а в переменной REMOTE_USER будет
находиться имя, под которым пользователь пытался авто-
ErrorDocument 401 /cgi-bin/401.cgi ризоваться (даже если учётной записи для такого пользо-
вателя вовсе не существует).
Самая простая мера, которую можно реализовать та- Это, кстати, делает возможным определить причину
ким образом, – это ведение протокола автризаций. Жур- ошибки 401 и разделить случаи, когда пользователь пыта-
нал не избавит вас от атак, но вы хотя бы будете знать о ется войти в систему впервые и когда он делает повторную
них и об их источнике. А знание – сила. попытку5.
Конечно, вы можете возразить, что всю необходимую Таким образом, наш простой пример заносит в прото-
информацию можно собирать в log-файлы сервера. Это так. кол не только информацию о попытках авторизоваться, но
Пользуясь этими файлами, несложно обнаружить попытки и имена, под которыми не удалось авторизоваться. Это
подбора пароля, если у вас один посетитель в день, он один позволяет легко заметить, что кто-то занимается перебо-

3
Или, если его браузер не поддерживает авторизацию, что практически невероятно.
4
Строго говоря, вы можете защитить пароль, реализовав обмен по протоколу SSL и, защитив всю передаваемую информацию.
5
Конечно, это справедливо, даже если на стороне клиента используется не обычный браузер, а некое специальное средство для взлома,
имитирующее работу браузера.

90
web
ром. Если пользователь успешно авторизовался с первого организуются на любом языке программирования и не зас-
раза, то в протоколе останется только запись о «nouser». В луживают пристального внимания. Во всех последующих
«боевых условиях» такие записи не представляют большой примерах я, для компактности, не буду их делать, предпо-
ценности, но при отладке они могут быть весьма полезны. лагая, что вы при необходимости добавите соответствую-
Во-вторых (и это, конечно, недоработка), обратите вни- щий код.
мание на то, что мы в сценарии не проанализировали при- Приводя соображения о возможности подмены стату-
чину его вызова. Кроме того, мы не позаботились о стату- са, я хотел подвести вас к следующему вопросу: что про-
се, который возвращает наш сценарий. Если скрипт будет изойдёт, если обработчик ошибки 401 вернёт не код 401?
вызван в результате действия нашей директивы Error- Вот пример такого обработчика:
Document, то код ответа сохранится без изменений – 401.
Но никто не мешает запустить этот сценарий не как обра- #!/bin/sh
ботчик ошибки, а напрямую, просто по его непосредствен- cat <<'TEXT'
ному адресу (например, http://host/cgi-bin/401.cgi). Тогда Status: 200
Content-Type: text/html
клиенту будет возвращён тот же документ с обычным ко-
дом 200. Обратите внимание, тот же сценарий, что возвра- <html>
<head><title></title></head>
щал ошибку-запрос с кодом 401, теперь вернул код 200. <body><h1>âû íå àâòîðèçîâàëèñü è
Это произошло потому, что сам сценарий никак не влияет íå àâòîðèçóåòåñü</h1></body>
</html>
на возвращаемый код, и сервер выставляет код ответа на TEXT
своё усмотрение. Такие вызовы будут ошибочно зарегист-
рированы в протоколе. Озадачены? В общем-то, не произойдёт ничего неожидан-
Конечно, в реальных условиях наш сценарий должен ного. Давайте проследим всю цепочку событий. Когда не-
был бы проанализировать обстоятельства вызова. При пер- авторизованный пользователь обратится к серверу, про-
вом обращении, без сообщения Authorization-информации, изойдёт ошибка 401. Следуя инструкции ErrorDocument,
скрипт получает в своё распоряжение обычный набор сервер вызовет наш сценарий, который подменит код 401
REDIRECT-переменных: REDIRECT_REQUEST_METHOD, на код 200 и выдаст обычный документ. Браузер получит
REDIRECT_STATUS, REDIRECT_URL, говорящие о том, что его и отобразит, оставаясь в полном неведении, что про-
скрипт вызван не напрямую. При повторном вызове, в слу- изошло на самом деле на сервере. Пользователю не удас-
чае провала предыдущей попытки авторизоваться, скрипт тся получить доступ к засекреченной области, но и диало-
получает вдобавок к упомянутым ещё две переменные: га для ввода пароля он не получит. Обращаясь к любому
AUTH_TYPE, которая, конечно, равна «Basic», и REMOTE_ документу, пользователь будет получать только результат
USER с именем «неудачника». работы вашего скрипта (который в свою очередь тоже мо-
При простом, непосредственном, вызове сценария все жет организовать перенаправление). Мы заблокировали
перечисленные переменные просто не будут созданы. для пользователя возможность авторизации.
Приведу пример shell-скрипта, анализирующего эти си- Этот короткий скрипт может пока послужить только для
туации: весьма сомнительной защиты. Использовать его можно
только как-нибудь так: сперва защитить директорию; по-
#!/bin/sh том авторизоваться, указав браузеру запомнить имя и па-
if [ ${REDIRECT_STATUS:-)} = 401 ] роль; и подключить в качестве обработчика ошибки 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. Он разрешает авторизацию не чаще, чем раз
Как видите, теперь мы различаем три случая: в десять секунд. Он уже написан на Perl, и является гибри-
! первая попытка авторизоваться; дом двух предыдущих shell-скриптов.
! не первая попытка авторизоваться;
! вызов скрипта напрямую, вернее, вызов не для обра- #!/usr/bin/perl
ботки ошибки 401. use strict;
my $LOGFILE='401.log';
my $lastlog = $^T-(stat $LOGFILE)[9];
Но давайте не будем увлекаться. Подобные проверки
необходимы, забывать про них нельзя, но они элементарно if ($lastlog > 10) {

№5, май 2005 91


web
my $log=$ENV{'REMOTE_ADDR'}. иное средство, выдающее ответы 200 и сами документы.
($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>Ìîæíî áûëî àâòîðèçîâàòüñÿ, íî âû Но это ещё не беда. Настоящая проблема состоит в том,
äîïóñòèëè îøèáêó ïðè íàáîðå ïàðîëÿ что выдача кода 200 – это, на самом деле, не совсем блоки-
èëè èìåíè. Òåïåðü ðåãèñòðàöèÿ
çàáëîêèðîâàíà íà 10 ñåêóíä.</p></body> ровка авторизации. Мы просто лишаем пользователя воз-
</html> можности ввести имя и пароль. Злоумышленник по-прежне-
TEXT
} else { му сможет практически беспрепятственно перебирать паро-
# ýòîò äîêóìåíò ïîëüçîâàòåëü óâèäèò: ли, создавая запросы искусственно (не с помощью браузе-
# - è åñëè íå âîâðåìÿ ïðèø¸ë
# - è åñëè ââ¸ë íåïðàâèëüíûé ïàðîëü ра) и варьируя информацию в поле Authorization. Конечно,
# àíàëèçèðóéòå $REMOTE_USER äëÿ ðàçäåëåíèÿ ýòèõ ñèòóàöèé ответы нашего сервера (особенно с кодом 200) могут силь-
print <<'TEXT';
Status: 200 но затруднить работу супостата, но вряд ли мы сможем по-
Content-Type: text/html ставить врагу действительно существенный заслон.
<html> Мы снова получили защиту от честных людей, хотя и
<head><title>Äîêóìåíò 200</title></head> усовершенствованную.
<body><h1>Äîñòóï âîîáùå çàêðûò</h1>
<p>Âû íå ìîæåòå àâòîðèçîâàòüñÿ âîîáùå.
Ïîäîæäèòå 10 ñåêóíä.</p> Невозможность «разлогиниться»
</body>
</html> Разработчик веб-ресурса никак не может заставить брау-
TEXT зер забыть пароль и имя пользователя. За этим стоит тоже
}
сама природа протокола HTTP: сервер не может заставить
Как видите, этот сценарий тоже ведёт протокол. По дате клиента выполнить какие-то действия. Сервер может толь-
последней модификации log-файла мы определяем, давно ко рекомендовать, но для BA и такой возможности не пре-
ли была последняя попытка авторизоваться6. дусмотрено.
Если последняя попытка была более десяти секунд на- Может показаться, что существуют возможности заста-
зад, то в протокол заносится ещё одна запись, а пользова- вить браузер забыть пароль или заменить его на новый,
телю выдаётся документ с кодом 401. То есть мы даём неправильный. Например, можно выслать ещё раз ответ
пользователю возможность вести имя и пароль. Если пос- 401, созданный искусственно, и дать пользователю возмож-
ледняя авторизация была менее десяти секунд назад, то ность ввести что угодно, заставив браузер «забыть» под-
клиенту выдаётся код 200. линную информацию. Но ни к чему хорошему это не приве-
Вы, наверно, уже заметили, что у нашего сценария есть дёт. Если пользователь уже авторизовался, то на любой
большой изъян. (Не говоря о том, что он не выполняет про- ответ 401 браузер не обращается к пользователю и не пы-
верку причины запуска.) После того, как авторизовался тается изменить пароль, а просто повторяет запрос, высы-
один пользователь, на десять секунд право авторизации лая прежние имя и пароль.
теряет и он, и все остальные пользователи. Избавиться от
этого гораздо труднее, чем может показаться на первый Резюме
взгляд, потому что нам приходится принимать решение о Надеюсь, что теперь вам будет легче взвесить все «за» и
допустимости авторизации ещё до того, как мы получим «против», когда в следующий раз доведётся оценивать бе-
имя пользователя. И, напротив, после того, как сервер по- зопасность того или иного решения. Вы видите, что, несмот-
лучил имя пользователя, наш скрипт запускаться уже не ря на возможность многих косметических улучшений, фак-
будет (если имя и пароль верны). тически, ни одно из слабых мест BA закрыть не удаётся в
Использовать в этой ситуации IP-адреса или cookie не принципе. Однако, принимая окончательное решение, будь-
только ненадёжно, но и сложно. Ненадёжно потому, что те снисходительны. Помните, что BA – проверенный и на-
разные пользователи могут приходить c одного IP-адреса, дёжный (в известном смысле) механизм. Кроме того, его
а cookie могут быть отключены (что, конечно, можно про- настройка очень проста. Не факт, что созданный вами соб-
верить, но только ценой дополнительных усложнений) или, ственный аппарат защиты не будет обладать изъянами, не-
хуже того, фальсифицированы. А сложно потому, что об- взирая на все труды, которые придётся в него вложить. Од-
рабатывать эти адреса и cookie должно нечто, не связан- ним словом, я назвал здесь много «против», но не забывай-
ное с обработкой ошибки 401, нечто, работающее с уже те и про «за» – простоту и безотказность. Два эти довода
авторизованным пользователем. То есть вам придётся са- способны перевесить все «против», что подтверждается по-
мостоятельно реализовать скрипт, модуль сервера, или всеместным использованием BA, невзирая ни на что.

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

92
книжная полка
Windows server. Qt
Трюки профессиональное
Митч Таллоч программирование
Перед вами перевод книги из- на C++
дательства O'Reilly «Windows Макс Шлее
server hacks». Материал изло- Книга является подробнейшим
жен в небольших статьях, руководством к кроссплатфор-
объединенных в тематичес- менной библиотеке Qt. В ней
кие группы. Основные темы автор показывает, что с помо-
книги: общее администриро- щью Qt можно создавать как
вание, Acvtive Directory, уп- графические интерфейсы, так
равление пользователями, и писать достаточно сложные
сетевые службы файлы и программы. Подробно рас-
принтеры, ISS, установка си- смотрены вопросы программи-
стемы, безопасность, управление обновлениями, резерв- рования графики (растровые изображения, анимация, шриф-
ное копирование и восстановление. После прочтения кни- ты, OpenGL), звука, таймера, многопоточности, XML. Отдель-
ги вы сможете эффективно иcпользовать AD для упроще- ные главы посвящены написанию приложений для баз дан-
ния своей работы, управлять сетевыми ресурсами и таки- ных и сетей. И, конечно же, рассматриваются вопросы со-
ми службами, как DHCP, DNS, WINS. А также удаленно раз- здания различных интерфейсов. Затронут вопрос разработ-
вертывать ОС на компьютерах в рамках локальной сети с ки собственных элементов управления. Книгу можно поре-
помощью RIS и Sysrep, результативно использовать ASR комендовать широкому кругу читателей – повествование
для создания резервных копий и восстановления всей сис- начинается с азов (с «Hello, world!»), поэтому даже «нович-
темы. Кроме этого в книге описаны методы упрощения по- ки» смогут быстро освоиться. Большое количество приме-
вседневной работы администратора при помощи сценари- ров поможет наилучшим образом усвоить материал. На при-
ев и средств автоматизации. Книгу можно порекомендовать лагаемом диске вы найдете исходные коды примеров из кни-
администраторам Windows. ги и библиотеку Qt для ОС Windows и Linux.
Издательство «Питер», 2005 г. – 318 стр. ISBN5-469-00288-8 Издательство «БХВ-Петербург», 2005 г. – 544 стр.
(ориг. ISBN 0-596-00647-0). ISBN 5-94157-566-1.

Sendmail. Apache Tomcat


Настройка для
и оптимизация профессионалов
Ник Кристенсон Амит Бакор и др.
Эпиграфом к книге может Коллектив специалистов
послужить фраза, сказан- из 9 человек написал эту
ная Эриком Оллманом (со- книгу для профессиона-
здателем Sendmail): «Эта лов, работающих с Java-
книга великолепна». В из- веб-приложениями. В ней
дании рассмотрен широкий приведены сведения о
круг вопросов: введение в веб-сервере Tomcat (вер-
программу sendmail, на- сии 3.x и 4.x) – установка,
стройка режимов ретранс- конфигурирование, архи-
ляции почты (описаны воп- тектура, вопросы, связан-
росы синхронизации, файловых систем, пространства на ные с безопасностью. Рассмотрены различные коннекторы
дисках), приема электронной почты (системы дисковых за- веб-сервера (WARP, AJP), которые служат для интеграции
поминающих устройств и накопителей, особенности прото- Tomcat с Apache, рассказано, каким образом организовать
колов pop и imap) и рассылки электронной почты (создание подключения к базам данных через JDBC. Отдельные главы
списков рассылки, управление очередями). Вы также узнае- посвящены созданию массового виртуального хостинга при
те о методах поиска и устранения «узких» мест в системе, помощи Tomcat, тестированию и распределению нагрузки
формировании потока сообщений и тестировании. Не оста- сервера. Также вы узнаете об автоматической компоновке
лись без внимания вопросы безопасности и архитектуры веб-приложений при помощи Ant, научитесь профессиональ-
программы. Книгу, несомненно, можно посоветовать всем но вести журнал, используя для этого Log4J. Изложение ма-
без исключения людям, занимающимся администрировани- териала сопровождается большим количеством примеров.
ем почтового сервера на базе sendmail. Главной ценностью Книга рассчитана на специалистов, знакомых с Java, имею-
изложенного материала является то, что это не просто ин- щих представление о базах данных, XML, HTML.
формация в стиле HOWTO, а скорее «житейские» заметки и Издательство «КУДИЦ-ОБРАЗ», 2005 г. – 544 стр.
выводы, сделанные из личного опыта автора. ISBN 5-9579-0075-3 (ориг. 1-86100-773-6).
Издательство «КУДИЦ-ОБРАЗ», 2004 г. – 272 стр. Рубрику ведет
ISBN 5-93378-093-6 (ориг. 0-321-11570-8). Александр Байрак

№5, май 2005 93


bugtraq

Выполнение произвольных команд Повышение привилегий


в Open WebMail и отключение аудита в Oracle
Программа: Open WebMail версии до 2.51 20050430 Программа: Oracle Database 9i/10g.
Опасность: Низкая. Опасность: Низкая.
Описание: Уязвимость существует при обработке входных Описание: Уязвимость позволяет удаленному авторизован-
данных в некоторых параметрах, которые передаются фун- ному пользователю повысить свои привилегии в СУБД и
кции Perl open(). Удаленный пользователь может с помо- отключить Fine-Grained-Auditing для всех пользователей.
щью специально сформированного значения выполнить 1. Уязвимость связана с тем, что Fine-Grained-Auditing не
произвольные команды на целевой системе с привилегия- работает, когда пользователь SYS делает запрос
ми пользователя. SELECT.
URL производителей: www.openwebmail.org. 2. После выполнения dbms_scheduler-job Oracle использу-
Решение: Установите обновление от производителя. ет пользователя SYS в качестве SESSION_USER, что
может позволить злоумышленнику повысить свои при-
Повышение привилегий и отказ вилегии в VPD (Virtual Private Database) и OLS (Oracle
в обслуживании в IBM HTTP Server Label Security).
Программа: IBM HTTP Server 1.3.26.x.
Опасность: Низкая. URL производителей: www.oracle.com.
Описание: Переполнение буфера существует в модуле Решение: Установите обновление от производителя.
mod_include при обработке длины тегов в SSI-документах.
Локальный пользователь может создать специальным об- Повышение привилегий в ядре Linux
разом SSI-документ и вызвать отказ в обслуживании или при обработке дескрипторов pktcdvd
выполнить произвольный код с повышенными привилегия- и rawdevice ioctl
ми на системе. Программа: Linux kernel 2.6 – 2.6.12-rc4.
URL производителей: www-1.ibm.com. Опасность: Низкая.
Решение: Установите исправление от производителя. Описание: Уязвимость обнаружена в файле drivers/block/
pktcdvd.c из-за некорректной обработки некоторых входных
SQL-инъекция и межсайтовый скриптинг данных в дескрипторах блочных устройств rawdevice и
в PunBB pktcdvd. Локальный пользователь может с помощью спе-
Программа: PunBB 1.2.4 и более ранние версии. циально сформированного параметра обойти ограничения
Опасность: Средняя. страницы пользовательского пространства (user space limit),
Описание: Уязвимость существует при обработке входных перезаписать данные ядра и вызвать отказ в обслужива-
данных при изменении e-mail пользователя. Удаленный нии или выполнить произвольный код на целевой системе.
пользователь может выполнить произвольные SQL-коман- Пример/Эксплоит: http://www.securitylab.ru/54690.html.
ды на уязвимой системе. URL производителей: www.kernel.org.
Межсайтовый скриптинг возможен из-за недостаточной Решение: Способов устранения уязвимости не существу-
фильтрации входных данных в некоторых сообщениях. Уда- ет в настоящее время.
ленный пользователь может с помощью специально сфор-
мированного сообщения выполнить произвольный HTML- SQL-инъекция и межсайтовый скриптинг
сценарий в браузере жертвы в контексте безопасности уяз- в Invision Power Board
вимого сайта. Программа: Invision Power Board 2.0.3 и более ранние вер-
Пример/Эксплоит: www.securitylab.ru/53935.html. сии.
URL производителя: www.punbb.org. Опасность: Средняя.
Решение: Установите последнюю версию (1.2.5) с сайта Описание: SQL-инъекция существует из-за недостаточной
производителя. обработки данных в сценарии sources/login.php. Удаленный
пользователь может с помощью специально сформирован-
Обход ограничений безопасности ного файла куки выполнить произвольные SQL-команды в
в libsafe базе данных приложения при выключенных Magic_quotes_
Программа: libsafe 2.0.16. gpc в конфигурационном файле php.
Опасность: Средняя. Отсутствует проверка входных данных при отображе-
Описание: Уязвимость существует в функции _libsafe_stack- нии результатов поиска в параметре highlite сценария
VariableP() в многопотоковых приложениях. Злоумышлен- sources/topics.php. Удаленный пользователь может с помо-
ник может обойти ограничения фильтрации libsafe и пере- щью специально сформированного файла куки выполнить
записать данные в стеке. произвольный HTML-сценарий в браузере жертвы в контек-
URL производителя: http://www.research.avayalabs.com/ сте безопасности уязвимого сайта.
project/libsafe. URL производителей: http://invisionpower.com.
Решение: Способов устранения уязвимости не существует Решение: Установите исправление от производителя.
в настоящее время.
Составил Александр Антипов

94
подписка на II полугодие 2005
Российская Федерация ! Казахстан – по каталогу «Российская Пресса» через
! Подписной индекс: 81655 ОАО «Казпочта» и ЗАО «Евразия пресс»
Каталог агентства «Роспечать» ! Беларусь – по каталогу изданий стран СНГ через РГО
! Подписной индекс: 87836 «Белпочта» (220050, г.Минск, пр-т Ф.Скорины, 10)
Объединенный каталог «Пресса России» ! Узбекистан – по каталогу «Davriy nashrlar» российские
Адресный каталог «Подписка за рабочим столом» издания через агентство по распространению печати
Адресный каталог «Библиотечный каталог» «Davriy nashrlar» (7000029, Ташкент, пл.Мустакиллик,
! Альтернативные подписные агентства: 5/3, офис 33)
Агентство «Интер-Почта» (095) 500-00-60, курьерская ! Армения – по списку номенклатуры «АРЗИ» через ГЗАО
доставка по Москве «Армпечать» (375005, г.Ереван, пл.Сасунци Давида, д.2)
Агентство «Вся Пресса» (095) 787-34-47 и ЗАО «Контакт-Мамул» (375002, г. Ереван, ул.Сарья-
Агентство «Курьер-Прессервис» на, 22)
Агентство «ООО Урал-Пресс» (343) 375-62-74 ! Грузия – по списку номенклатуры «АРЗИ» через АО
! Подписка On-line «Сакпресса» ( 380019, г.Тбилиси, ул.Хошараульская, 29)
http://www.arzy.ru и АО «Мацне» (380060, г.Тбилиси, пр-т Гамсахурдия, 42)
http://www.gazety.ru ! Молдавия – по каталогу через ГП «Пошта Молдавей»
http://www.presscafe.ru (МД-2012, г.Кишинев, бул.Штефан чел Маре, 134)
по списку через ГУП «Почта Приднестровья» (МD-3300,
СНГ г.Тирасполь, ул.Ленина, 17)
В странах СНГ подписка принимается в почтовых отделе- по прайслисту через ООО Агентство «Editil Periodice»
ниях по национальным каталогам или по списку номенкла- (2012, г.Кишинев, бул. Штефан чел Маре, 134)
туры АРЗИ: ! Подписка для Украины:
! Азербайджан – по объединенному каталогу российских Киевский главпочтамп
изданий через предприятие по распространению печа- Подписное агентство «KSS»
ти «Гасид» (370102, г. Баку, ул. Джавадхана, 21) Телефон/факс (044)464-0220

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

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

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

№5, май 2005 95


СИСТЕМНЫЙ АДМИНИСТРАТОР
№5(30), Май, 2005 год

РЕДАКЦИЯ
ЧИТАЙТЕ
Исполнительный директор
Владимир Положевец
В СЛЕДУЮЩЕМ
Ответственный секретарь
Наталья Хвостова
sekretar@samag.ru
НОМЕРЕ:
Технический редактор
Владимир Лукин
Редакторы Asterisk и Linux: свободное время и желание зарабаты-
Андрей Бешков миссия IP-телефония вать больше. Однако смена работы в
Валентин Синицын В прошлый раз мы познакомились с те- ближайшие планы не входит, а рабо-
Алексей Барабанов оретическими основами IP-телефонии. тодатель не в состоянии увеличить
Михаил Платов Теперь самое время заняться вещами зарплату. Лучший вариант в этой си-
более «приземленными», а именно – туации – искать дополнительные ис-
РЕКЛАМНАЯ СЛУЖБА практическим изучением возможнос- точники дохода. Как найти еще одну
тел./факс: (095) 928-8253 тей одного из cамых популярных Open работу по специальности со свобод-
Константин Меделян Source продуктов IP-телефонии – ным графиком? Как результативно
reсlama@samag.ru Asterisk PBX. Мы рассмотрим архитек- провести переговоры с потенциальным
туру системы, основные файлы конфи- заказчиком? Как достичь того, чтобы
Верстка и оформление гурации и несколько полезных приме- работодатели находили вас сами? Сво-
maker_up@samag.ru ров определения номерного плана. В им практическим опытом делится ав-
Дизайн обложки процессе изучения преимущественно тор статьи.
Николай Петрочук будут использоваться Open Source и
Freeware программные продукты. Используем пакет
По вопросам распространения ImageMagick
обращайтесь по телефону: Взлом без проводов в веб-разработке
(095) 928-8253 (доб. 120) Беспроводные сети активно проника- Работа с готовыми изображениями – за-
ют в нашу жизнь, принося с собой не дача достаточно распространенная в
107045, г. Москва, только удобство, но и проблемы безо- веб-программировании. Построение
Ананьевский переулок, дом 4/2 стр. 1 пасности. Интенсивность взломов ра- обычной веб-галереи требует создания
тел./факс: (095) 928-8253 стет с каждым днем, но технические уменьшенных копий картинок, компрес-
Сайт журнала: www.samag.ru подробности остаются за кадром и не сии, конвертации формата, возможно,
разглашаются. Хотите знать, как хаке- и некоторых других действий по их об-
РУКОВОДИТЕЛЬ ПРОЕКТА ры проникают в беспроводные сети и работке. Для подобных задач широко
Петр Положевец как этому противостоять? Главным об- применяется библиотека GD, имеющая
УЧРЕДИТЕЛИ разом мы будем говорить о семействе в арсенале своей второй версии GD2
Владимир Положевец протоколов IEEE 802.11b/g (более из- довольно внушительный список функ-
Александр Михалев вестном как WLAN). Статья ориенти- ций. Она имеет широкие возможности,
ИЗДАТЕЛЬ рована на кодокопателей, имеющих но качество результирующих изображе-
ЗАО «Издательский дом опыт программирования в LINUX и уме- ний часто оставляет желать лучшего.
«Учительская газета» ющих держать паяльник в руках. Кроме того, с такими задачами, как из-
менение пропорций, «обрезка» изобра-
Отпечатано типографией Системный администратор – жения, манипуляции с цветами, встав-
ГП «Московская Типография №13» ищем дополнительные ка другого рисунка, работать хоть и воз-
Тираж 8400 экз. источники дохода можно, но крайне неудобно. Для подоб-
Ваша сеть отлажена и работает как ных действий идеально подходит пакет
Журнал зарегистрирован швейцарские часы. У вас появилось ImageMagick.
в Министерстве РФ по делам печати,
телерадиовещания и средств мас- Уважаемые читатели!
совых коммуникаций (свидетельство
ПИ № 77-12542 от 24 апреля 2002 г.) Спешите оформить подписку
на второе полугодие 2005 года!
За содержание статьи ответствен-
ность несет автор. За содержание рек- Приобрести новые и старые номера журнала
ламного обьявления ответственность вы можете через интернет-магазины LinuxCenter.ru и Allsoft.ru.
несет рекламодатель. Все права на
опубликованные материалы защище- Доставка почтой в любую точку России.
ны.

96

Вам также может понравиться