035 Системный Администратор 10 2005

Page 1

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

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

ЛИ

СЬ

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

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

Всё, что вы хотели узнать о тонкостях настройки Spamassassin

ЗА

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

УЕ ХА Л

ВО ТП

УС К

КА

БЫ С

№10(35) октябрь 2005 подписной индекс 81655 www.samag.ru

Управляем серверами в реальном времени с помощью WSH-сценариев

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

ReactOS – свободная альтернатива Windows Как управлять индексированием сайта В чем преимущества HTTP digest-авторизации

ПОДПИШИТЕСЬ И ЧИТАЙТЕ! Роспечать – 81655 Пресса России – 87836 Интер-почта – тел. (095) 500-00-60

№10(35) октябрь 2005

Как посчитать трафик в Linux Организуем прием спутникового вещания Настраиваем автоответчик на базе Linux



оглавление WEB

3 ТЕНДЕНЦИИ

40 Как управлять индексированием своего сайта

РЕПОРТАЖ 4 Конференция CiscoExpo’2005 Николай Никульшин nik.nikolson@gmail.com

ИНТЕРВЬЮ

44 В чем сильные и слабые стороны HTTP digest-авторизации

6 Agnitum – путь к признанию

Маленькая программа-антишпион положила начало известному персональному брандмауэру – Agnitum Outpost. Роман Марков stepan-razin@newmail.ru

АДМИНИСТРИРОВАНИЕ Все, что вы хотели узнать о тонкостях настройки Spamassassin. Сергей Супрунов amsand@rambler.ru

18 Как посчитать трафик в Linux

Решаем задачу с помощью ipcad. Александр Кузнецов fly4life@nixp.ru

22 Scientific Linux – выбираем решение корпоративного уровня по цене носителя

Обзор русифицированной версии дистрибутива. Андрей Маркелов andrew@markelov.net

24 ReactOS – свободная альтернатива Windows. Слухи и реальность

Делимся впечатлениями от знакомства с операционной системой ReactOS. Андрей Бешков tigrisha@sysadmins.ru

28 Создаем загружаемый Flash-диск с FreeBSD и DOS. Часть II

Созданный диск – инструмент, которым нужно умело воспользоваться. Рашид Ачилов shelton@granch.ru

БЕЗОПАСНОСТЬ Контролируем использование сменных носителей в сети вашей компании. Сергей Яремчук grinder@ua.fm

34 Linux/BSD как бастион на пути вирусов Схема построения защиты сети.

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

Почему я до сих пор этого не сделал?!

№10, октябрь 2005

Летим скорее на почту!

Я забыл подписаться!

ПРОГРАММИРОВАНИЕ Антиотладочные приемы вермен MS-DOS и debug.com возвращаются, чтобы снова работать в Windows 2000/ XP/2003. Крис Касперски kk@sendmail.ru

60 Как программы на Си взаимодействуют с сервером БД PostgreSQL

Добьемся от приложения максимального быстродействия. Владимир Мешков ubob@mail.ru

66 Управляем серверами в реальном времени с помощью WSH-сценариев

Пишем сценарий для автоматизированного управления серверами Windows при работе с ИБП. Андрей Бирюков mex_inet@rambler.ru

HARDWARE 70 Настраиваем автоответчик на базе Linux

Реализация решения на основе программы vgetty. Павел Закляков amdk7@mail.ru

79 Цифровое небо, или Организуем прием спутникового вещания

Как настроиться на спутниковый канал. Антон Борисов anton.borisov@gmail.com

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

32 Блокируем внешние устройства с помощью GFI LANguard P.S.C.

Мужики, где журнал взяли?

Принципы работы digest-авторизации: правда и вымысел. Алексей Мичурин alexey@office-a.mtu-net.ru

52 Антиотладка: старые приемы на новый лад

10 Профессия – убивать спам

Оформили подписку!

Эффективное использование robots.txt. Сергей Яремчук grinder@ua.fm

Принес номер на работу, «увели» почитать

82 История взлёта и падения OS/2 – одной из самых интересных операционных систем Алексей Коршунов akeeper@akeeper.ru

92 КНИЖНАЯ ПОЛКА 51, 59

BUGTRAQ Информация о подписке на 94 стр.

Лучше каждому получать отдельный экземпляр журнала И у меня такая же беда

А можно ещё успеть?

Как же я без любимого журнала?

1


электронное приложение

Спешите читать электронное приложение к нашему журналу – «Open Source» Редакция журнала «Системный администратор» спешит обрадовать всех почитателей программного обеспечения с открытым кодом – в ноябре планируется выпуск первого номера электронного издания «Open Source». «Open Source» – новое, созданное в рамках приложения к журналу «Системный администратор» электронное издание, распространяемое бесплатно в сети Интернет и освещающее все вопросы, связанные со свободным софтом для различных операционных систем. Технологии с открытым кодом давно перестали быть развлечением компьютерных фанатов и какой-то отдаленной от реальности идеологией. Они уже не просто способны выступать в качестве альтернативы привычным решениям, но и зачастую обладают уникальной функциональностью и не находят своего применения лишь в связи с тем, что о предоставляемых ими возможностях многие в недостаточной мере осведомлены. Приложению «Open Source» предстоит заполнить эту информационную брешь, раздвинув рамки традиционных технологий и открыв перед своими читателями инновационное и перспективное будущее, развивающееся уже сегодня – благодаря усилиям тысяч независимых разработчиков со всего мира и присоединяющихся к ним гигантов современной ИТ-индустрии. Ключевая цель «Open Source» – стать профессиональным специализированным компьютерным изданием, производящим все стадии отбора и обработки попадающих в него материалов редакторами и корректорами уже сформировавшегося печатного журнала. Тематика приложения охватит Free and Open Source Software во всем многообразии, что подразумевает собой:

2

! теоретические сведения, лежащие

в основе множества ПО с открытым кодом и образовавшегося вокруг него сообщества; ! практическое применение уже существующих решений как по отдельности, так и в связках, со взаимной интеграцией результатов работ различных проектов для создания комплексных многофункциональных систем; ! обзоры новых и готовящихся к выходу продуктов Open Source; ! анализ минувших и происходящих событий, затрагивающих мир свободного ПО, а также предварительное исследование ожидаемых в ближайшем и отдаленном будущем явлений, способных повлиять на дальнейшее развитие FOSS, а значит, и информационных технологий вообще. С р е д и гл а в н ы х з а д ач « O p e n Source» – организация полноценного журнала, объединяющего в себе разнообразную информацию, посвященную свободному программному обеспечению, в удобном для просмотра виде: электронном, доступном бесплатно широким массам вне зависимости от их географического положения. Кроме того, благодаря возможности быстрого распространения выпусков это позволяет добиться большей актуальности подаваемой информации. Перед «Open Source» также ставится задача продвижения ПО с открытым кодом в общем потоке информационных технологий. Как следствие, ожидается создание обширного сообщества интересующихся вопросами технологий, рассматриваемых в приложении, их применения в настоящем и развития в будущем. В новой среде каждый получает возможность перенимать опыт других и делиться собственными идеями, благодаря чему становится полезным участником глобального движения за Free Software и самосовершенствуется в близкой ему области. Поддержкой «Open Source» и работой над выпусками приложения за-

нимается редакция журнала «Системный администратор». В качестве авторов выступают представители русскоговорящего сообщества Open Source. К публикации своих материалов приглашаем всех желающих, обладающих определенными знаниями и навыками в рассматриваемой области и умением в доступной форме подавать мысли читателям. Уточнить информацию об авторстве вы можете по электронному адресу osa@samag.ru. Наиболее приоритетными темами материалов на данный момент являются обзоры новых (или по другим причинам малоизвестных, но интересных, перспективных и/или уникальных) проектов программного обеспечения с открытым кодом, а также общие сведения о Free Software, идеологии движения за Open Source и примеры историй успеха как внутри самого сообщества, так и в результате внедрения его разработок в давно оформившиеся структуры. Выпуски приложения распространяются бесплатно в электронном виде (в формате файлов PDF). Текущая периодичность издания – один раз в 3 недели. Для получения доступа к файлам с «Open Source» необходимо пройти регистрацию на сайте http://osa.samag.ru. После регистрации каждый пользователь может скачать через браузер или получить на e-mail все вышедшие выпуски приложения, а также подписаться на анонсы новых или на автоматическое получение на e-mail файлов с ними. Электронное приложение «Open Source» всегда открыто для сотрудничества с вами, нашими читателями, новыми авторами и вашими конструктивными предложениями по улучшению издания, конструктивной критикой и любыми отзывами, с компаниями, занимающимися разработкой и продвижением программного обеспечения с открытым кодом.

Главный редактор приложения Дмитрий Шурупов


тенденции OpenOffice.org представил финальную версию 2.0 Успешно отметив 5-летний юбилей 13 октября, проект свободного офиса через неделю выпустил и финальный релиз своего продукта версии 2.0. OpenOffice.org отныне по умолчанию работает с основанным на открытых стандартах форматом OASIS OpenDocument. В релизе представлен фильтр для WordPerfect, улучшенная оболочка для работы с базами данных и функция подсчета слов, усовершенствованный экспорт в PDF. Кроме того, появился новый многопанельный вид, CustomShapes, совместимые с AutoShapes от Microsoft, анонсирована возможность создания форм на базе стандарта W3C XForms и задания таблиц внутри уже существующих (так называемые «вложенные таблицы»), поддержка цифровых подписей. Изменения в DataPilot (аналог MS Excel PivotTable) превратили OpenOffice.org Calc в мощный инструмент анализа данных.

Взломаны сайты OpenSUSE и Spread Firefox В самом начале месяца атаке иранских хакеров из группы IHS подвергся ресурс openSUSE, а уже через несколько дней взлому был в очередной раз подвержен сайт Spread Firefox. В первом случае Open Source-инициатива Novell имеет отдаленное отношение к произошедшему: свой взлом авторы посвятили протесту против «Договора о нераспространении ядерного оружия», принятого иранским правительством. А вот Spread Firefox, занимающийся продвижением свободного браузера от Mozilla, вновь пострадал из-за уязвимости, найденной в используемом на сервере программном обеспечении. На этот раз виновницей оказалась wiki-система с открытым кодом TWiki.

твует POSIX, содержит более 300 UNIX-программ, функционирует на платформах 386, 486, Pentium и т. п., а распространяется по BSD-подобной лицензии.

Linux обретает трехмерный десктоп от Sun Наглядная демонстрация трехмерных возможностей рабочего стола в Linux стала возможной благодаря первому стабильному релизу нового проекта – LG3D LiveCD 2.3. Система базируется на SLAX (Slackware на LiveCD), и в нее интегрирована Java-технология Project Looking Glass компании Sun Microsystems, которая и предоставляет пользователю 3D-вид окон и визуализации десктопа и приложений. В первую стабильную версию LG3D также вошли драйверы для видеокарт NVIDIA и некоторые дополнительные приложения (веб-браузер Firefox, IM-клиент Gaim и др.).

WINE перешел в статус бета 12 долгих лет понадобилось разработчикам для того, чтобы добиться качественно нового уровня стабильности в работе WINE. 25 октября состоялся выход WINE версии 0.9, что ознаменовало новую веху в развитии свободной реализации Windows API для UNIX/Linux-систем – официальный переход в статус «бета». Несмотря на это, авторы не устают предупреждать, что и сейчас в их продукте могут обнаружиться проблемы. Однако по крайней мере «ожидается, что большинство приложений хотя бы успешно пройдут установку и сделают что-нибудь полезное».

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

Nessus 3 уже не будет открытым Исходный код одной из наиболее популярных в мире утилит безопасности -- Nessus -- больше не будет доступен для всех. Автор программы объяснил это известие тем, что распространение продукта в рамках Open Source создавало конкуренцию его компании. Тем не менее изменение схемы лицензирования затронет только еще не выпущенный Nessus 3, а обновления к существующим ныне релизам Nessus 2.x останутся лицензированными под GNU GPL: «Nessus 3 будет бесплатным... Но не будет выпущен под GPL», сообщил автор Nessus в почтовой рассылке программы. Стоит отметить, что уже вышедшие релизы Nessus не могут быть лишены лицензии GPL, поэтому можно ожидать поддержки и дальнейшего развития свободной версии проекта сторонними энтузиастами.

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

№10, октябрь 2005

3


репортаж

Конференция CiscoExpo’2005 В середине октября в Москве прошла ежегодная конференция CiscoExpo. Это крупнейшее в России мероприятие подобной тематики. Число участников конференции приблизилось к 1500 человек.

К

онференция проводилась в два этапа – 14 октября в учебных центрах Cisco System состоялись семинары, посвященные актуальным темам современного мира сетевых технологий; и основная часть прошла 17-19 октября в гостинице Radisson Славянская. Первые два дня основной части конференции начались с пленарных докладов. Первое пленарное заседание было посвящено построению интеллектуальных информационных сетей (IIN). С докладом выступил Алан Фиокко (Alain Fiocco), директор подразделения маркетинга продуктов и решений Cisco Systems. Второе пленарное заседание, проходившее 18 октября, включало в себя выступления руководителя IBM Global Services в России Сергея Яксевича и президента по развивающимся рынкам Cisco Systems Пола Монтфорда (Paul Mountford) («Основные тенденции и перспективы развития информационных технологий» и «The Transformation of Emerging Markets» соответственно). После пленарных докладов работа

4

конференции продолжилась на 4 технических потоках, которые включали в себя сессии с углубленным изучением определенной темы, так называемые «power session». Как раз на «power session» Cisco и её партнеры представили развернутые доклады по продуктам, новым технологиям, актуальным рыночным тенденциям, рассказали о наиболее интересных проектах, реализованных за прошедший год. Для слушателей технических потоков 17-18 октября по вечерам были организованы открытые дискуссии на такие темы, как сети хранения данных, решения по безопасности и передачи голоса, оптические и городские сети, сервисные услуги и программы Cisco. В ходе конференции были представлены новые продукты, отраслевые решения и новейшие технологии для предприятий любого уровня. На текущий момент в России, по данным компании IDC, насчитывается порядка 1 000 000 предприятий, относящихся к сегменту предприятий малого и среднего бизнеса (SMB). Естественно, такой сегмент рынка нельзя оставлять без пристального внимания. Как раз для предприятий SMB, Cisco представило свое сетевое решение – Cisco Busines Communacations Solution, призванное уменьшить расходы и улучшить производственные показатели. В рамках этого решения было анонсировано новое семейство коммутаторов SMB-класса Catalyst Express 500 Series, а также дополнение к портфелю продуктов IP-связи, включающее в себя новые приложения IPC и семейство IP-телефонов с поддержкой XML. Та к , д л я п р е д п р и ятий с количеством со-

трудников от 20 до 250, основой решения является коммутатор Cisco Catalyst Express 500 и IP-решение Communication Express Solution, представляющее собой программное обеспечение Cisco CallManager Express + Cisco Unity Express, установленное на маршрутизатор Cisco Integrated Router (ISR). Новые коммутаторы серии Catalyst Express 500 специально предназначены для предприятий, желающих эксплуатировать объединенные сети. Это семейство комму таторов Layer 2-manager Fast Ethernet и Gigabit Ethernet, работающих на скорости среды передачи, обеспечивают безопасную сетевую платформу, оптимизированную для передачи данных, беспроводного трафика и голоса. Новые коммутаторы легко конфигурируются с помощью приложения Cisco Network Assistant 3.0, позволяющего управлять устройствами через веб-браузер. Устройства уже имеют предварительные настройки и после включения в сеть сразу готовы к работе. Все это позволяет быстро и легко конфигурировать сети и использовать такие технологии, как беспроводные локальные сети и IP-связь. Для компаний со штатом от 250 до 1500 человек был представлен модельный ряд маршрутизаторов семейства Cisco Catalyst 2960 Series в пяти аппаратных конфигурациях, пришедших на смену коммутаторам Catalyst 2950 G/T и 2970. Данные коммутаторы поддерживают IPv6, Enhanced QoS, Power over Ethernet (передача электропитания через медные сетевые провода), аутентификацию 802.1х и контроль доступа NAC. Благодаря мастеру быстрой установки и встроенной системе управления значительно упростилась задача конфигурирования устройства и его ввод в эксплуатацию. Также много внимания на выставке было уделено защите от вирусов и спама. Было представлено решение Cisco Clean Access, сканирующее хосты


репортаж на наличие актуальных версий антивирусного ПО, различных обновлений ПО или другим параметрам и отправляющее в сетевой карантин те хосты, которые не прошли проверку. В карантине такие хосты находятся до того момента, как состояние ПО не будет приведено к «общему знаменателю»: обновление антивирусного ПО, установка необходимых обновлений или параметров безопасности. В рамках конференции компания Cisco совместно с компанией «S-Terra» представили первое сертифицированное в России VPN-решение. Для этого потребовалось включить в продукты Cisco российские алгоритмы шифрования и получить сертификаты. Также на конференции присутствовали такие компании, как APC, IBM, Equant, Step Logic, EMC, CTI, I-Teco, Inline, Red Center, Technoserv IS, Diamond Communications Inc и многие другие. Компания IBM привезла на выставку свое серверное решение E-server BladeCenter, включающий в себя серверы различных аппаратных платформ, совместно использующие единую интегрированную инфраструктуру IT. Данная платформа представляет собой шасси, в которое

№10, октябрь 2005

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

организации мероприятия можно ожидать от лидера рынка сетевой безопасности? Cisco сейчас занимает четверть рынка информационной безопасности в России и сдавать свои позиции не намерена. Продукты пользуются стабильным спросом. Решения активно продаются по лизингу (до 20% всех продаж – лизинг). В целом, можно сказать, что данная конференция была нацелена на популяризацию решений Cisco Systems в сегменте предприятий малого и среднего бизнеса. Пока рано говорить о каких-либо конкретных результатах конференции CiscoExpo 2005. Но уже сейчас можно с уверенностью сказать, что популярность данного мероприятия растет из года в год. На CiscoExpo 2005 из-за огромного количества зарегистрировавшихся посетителей пришлось раньше запланированного завершить регистрацию, а саму конференцию «растянуть» на несколько дней. 90% всех посетителей – представители IT-индустрии (50% из этого количества – системные администраторы, 25% – IT-менеджеры, 20% – руководители IT-подразделений).

Николай Никульшин, фото автора

5


интервью

Agnitum – путь к признанию

Создавая 7 лет назад свою первую программу-антишпион для собственных нужд, Михаил Захряпин и Алексей Елагин не подозревали, что положили начало самому известному сегодня персональному брандмауэру – Agnitum Outpost. Когда и кем была основана компа- зоваться большим успехом, в связи большого скандала, который подняла с чем в начале 1999 года было приня- на эту тему пресса, утилиту скачали ния, с чего начинали? Михаил Пеньковский, коммерчес- то решение о выпуске коммерческой тысячи пользователей, благодаря чекий директор: начало развития ком- версии программы Jammer с дополни- му начался необычайный рост ее попании Agnitum было положено на сты- тельными возможностями и улучшен- пулярности. Как логическое продолжение для поддержания интереса пользоке 1998-99 годов двумя студентами ным функционалом. вателей был выпущен новый продукт – Балтийского Государственного Технического Университета. Проводя поис- Почему о ваших продуктах узнали Tauscan – утилита для поиска и уничтожения троянских программ, по суки необходимой для обучения инфор- пользователи во всем мире? мации в сети Интернет, они пали жер- М.П.: Глобальный толчок роста попу- ти своей – антивирус, который специтвами так называемых «троянских ко- лярности Jammer придала статья в ази- ализировался на обнаружении именней». В результате у них были украде- атской версии «Wall Street Journal», но этого класса вредоносного кода. ны пароли доступа в Интернет, компью- о том, что некая правительственная Для того времени это была довольно теры начали проявлять непонятную ак- компания пыталась при помощи троя- серьезная разработка, ради создативность при подключении к сети, что, нов следить за компьютерной деятель- ния которой штат сотрудников комразумеется, не поднимало настроения ностью своих сотрудников. Это выяс- пании был увеличен с 2 до 4 человек. владельцам. Изучив принципы работы нилось после того, как один из них Увеличение штата произошло в связи и распространения таких программ, скачал и установил на своем компью- с необходимостью привлечения отдеони предприняли первую попытку про- тере упомянутую утилиту Jammer, ко- льного специалиста по троянским витивостояния этим вирусам. В результа- торая и позволила увидеть направле- русам, а также программиста, так как те появилась первая утилита, получив- ние активности этого трояна. После пришла ясность, что собственных навыков в программировании не хвашая название Jammer, которая вытит для реализации более серьезполняла задачу предотвращения Короткая справка распространения вредоносного ко- Компания Agnitum была основана в конце 90-х го- ных решений. Tauscan также был оценен ITда на компьютерах пользователей. дов – время, когда в России начался стремительОна блокировала попытки вирусов ный рост использования интернет-технологий. общественностью, журнал PCтипа «троянский конь» активизиро- Быстрому росту популярности компании способс- Magazine присвоил ему лучший вать какую-либо деятельность, оп- твовал резонанс, который вызвал в зарубежной рейтинг среди продуктов подобноределяла сетевую активность по оп- прессе первый продукт ее основателей – утили- го класса, что снова помогло заределенным портам и блокировала та для обнаружения хакерских атак Jammer. При- явить о себе и получить приток ноее. Сначала Jammer был бесплатен, знание мировой IT-общественностью основного вых клиентов. Первое время утиего выложили на собственноруч- продукта – персонального брандмауэра Outpost литы распространялись только чено сделанный сайт для свободно- Firewall Pro позволило компании Agnitum занять рез Интернет, так как стартового скачивания. К большому удивле- лидирующие позиции на рынке персональных го капитала для развертки производства коробочных версий не бынию авторов программа стала поль- брандмауэров.

6


интервью ло. Тогда же пришло понимание того, что рынок брандмауэров (Firewall) еще не развит и конкуренции на нем практически нет, хотя с повсеместным развитием инфраструктуры подключения к Интернету продукты такого типа должны становиться все более востребованными. На тот момент наиболее известными представителями данного рынка являлись AtGuard – локальный Firewall, разработанный фирмой WRQ Inc и ConSeal PC Firewall от компании Signal 9 Solutions. Такое малое количество популярных в тот момент персональных брандмауэров, а также их ориентация на IT-профессионалов подтолкнуло компанию Agnitum к принятию серьезного решения о разработке нового продукта, не уступающего по надежности основным конкурентам и при этом обладающего дружественным пользовательским интерфейсом, – первой версии Agnitum Outpost Firewall. Создание нового продукта потребовало серьезных финансовых вложений. В общем то, это означало, что на карту была поставлена судьба всей компании. В итоге в 2001 году вышел первый релиз Agnitum Outpost Firewall. Удачным маркетинговым ходом оказался выпуск двух версий – бесплатной и платной, так как бесплатная версия не сильно отличалась от платной. Это позволило использовать хороший маркетинг «из уст в уста» (когда отзывы о достоинствах продукта передавались специалистами при обмене опытом и дружеских беседах), а также положительные отклики в прессе. Так начиналась деятельность компании Agnitum, которую сегодня можно назвать одной из самых популярных среди производителей доступных персональных брандмауэров. Сегодня основатели компании Agnitum – Михаил Захряпин и Алексей Елагин являются Управляющим и Генеральным директором соответственно и вместе принимают решения о дальнейшем развитии и продвижении собственных программных продуктов. Коллектив компании Agnitum на сегодняшний день состоит из 31 человека, в связи с расширением и выходом нового продукта Outpost Antispyware сегодня имеется около 5 вакансий. Организация работы – офисная. Отказ от аутсорсинга был обусловлен

№10, октябрь 2005

необходимостью постоянного личного контакта разработчиков для достижения более высоких показателей производительности труда. Сегодня российский офис компании расположен в здании первого завода компании Ericsson, построенном еще до революции в 1849 году и отреставрированном совсем недавно. (Кстати, внутри здания явно продолжаются традиции Agnitum по обеспечению безопасности – каждая дверь для перехода между корпусами открывается электронным ключом – Прим. автора). Что означают названия – самой компании – Agnitum и главного программного продукта – Outpost? М.П.: Если мне не изменяет память, Агнитум на латыни значит «запоминающийся». Мы хотели придумать именно запоминающееся название и в итоге решили не ходить вокруг да около, а взять «прямой» перевод. Хотя, я могу и ошибаться – очень давно это было. Outpost – это укрепление государственных границ на дальних подступах для предотвращения и сдерживания внезапных нападений врага. Очень это слово нам понравилось, когда выбирали имя бренда для фаерволла. Расскажите подробнее о корпоративной версии продукта – Agnitum Office Firewall – как развивается, что нового в проекте? Алексей Белкин, постановщик задач: В декабре 2005 года планируется выпустить новую версию продукта, в которой будут учтены все полученные нами замечания и пожелания от пользователей первой версии. По многочисленным просьбам системных администраторов, использующих Agnitum Office Firewall 1, в новой версии будут реализованы новые функции, значительно упрощающие администрирование продукта: ! Интеграция Antispyware. ! Политики для создания различных клиентских настроек, в зависимости от принадлежности к определенным группам. ! Автоматическая установка при помощи дистрибутивного файла, ссылку на который (либо сам файл) пользователю или подчиненному администратору можно послать по почте.

Михаил Пеньковский: «Outpost это укрепление государственных границ на дальних подступах для предотвращения и сдерживания внезапных нападений врага»

Примечание автора: К сожалению, в новой версии продукта не появится столь ценных и удобных для системного администратора функций, как: ! Централизованное хранение и просмотр журналов ! Удаленное развертывание при помощи RPC. Удаленная установка через Group Policy не всегда является удобным и наглядным решением. Также по просьбам потенциальных клиентов внесены изменения в лицензирование офисной версии Agnitum Outpost: минимальное количество клиентских лицензий снижено до 5. Мы считаем, что это позволит более экономично использовать данный продукт даже в самых малых сетях. При необходимости увеличить количество лицензий не придется устанавливать новый дистрибутив – достаточно будет просто ввести другой серийный номер. Стоимость офисной версии продукта составляет 40$ за одну клиентскую лицензию. Я присутствовал в декабре 2004 года на презентации «Agnitum Office Firewall», которая сама по себе оказалась очень оригинальной – она проходила в Петербурге, на борту легендарного крейсера «Аврора». А почему именно в Питере? Ведь подобные презентации, как правило, стараются проводить в Москве. М.П.: Ну, во-первых, мы именно питерская компания. Все основатели

7


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

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

Алексей Белкин: «Угрозой заражения spyware пренебрегать нельзя – такие программы могут существенно затруднить работу с компьютером, а зачастую и нанести материальный ущерб» Есть ли в планах компании создание

Какой политики распространения своих продуктов придерживается компания Agnitum? М.П.: В данный момент продукт распространяется двумя способами – коробочная версия и получение лицензии и дистрибутивов через Интернет. За рубежом количество лицензий, распространяемых через Интернет, значительно превышает объем продаж коробочных версий. В России из-за несовершенства развития on-line-платежных систем и определенных предрассудков пока различие не столь велико – 40% коробочных версий против 60% online. Кстати, цена коробочной и onlineлицензий одинаковы, однако активируется только последняя версия продукта, поэтому если программа установки на дистрибутивном диске устарела, придется скачать новую. Коробочные версии распространяются через региональных реселлеров, а online-версия – напрямую через компанию Agnitum. Помимо этого имеется вариант лицензирования для учебных и некоммерческих организаций. Такие компании получают 30% скидку на наши продукты. Данный тип лицензирования недоступен в коробочном варианте. Вышел в свет ваш новый продукт – Outpost Antispyware. Что это, собственно, такое? А.Б.: Сегодня проблема распространения spyware становится с каждым днем все более актуальной, поэтому каждый пользователь нуждается в надежной защите, причем как можно скорее. Угрозой заражения spyware пренебрегать нельзя, так как такие программы

8

Какие направления развития компании Agnitum являются приоритетными? М.П.: В данный момент мы работаем над созданием Agnitum Antispyware для офисной версии Outpost Firewall, улучшением функционала текущей версии. Как я упомянул ранее – продолжается активная работа над новой версией Outpost Office Firewall.

могут существенно затруднить работу с компьютером, а зачастую и нанести материальный ущерб (например, несанкционированные рассылки и накрутки счетчиков создают паразитный трафик и т. д.). Поэтому мы включили защиту от spyware в последнюю версию Outpost Firewall Pro 3.0, чтобы раз и навсегда оградить вас от таких угроз. Данный продукт – это интегрируемый с Outpost Firewall Pro плагин, который в режиме реального времени мониторит поведение системы и ее приложений и отслуживает несанкционированные изменения. Продукт использует не только сигнатуры известных типов spyware-программ, но и эвристический контроль за поведением системы, что позволяет надежно противостоять даже еще не включенным в базы сигнатур угрозам. В данный момент доступна персональная версия Antispyware. Интеграция в офисную версию ожидается в конце 2005 года. Чем Agnitum Outpost Antispyware отличается от известных продуктов этого же направления? А.Б.: Во-первых, это встроенное решение, которое штатным образом присоединяется в виде дополнительного модуля к Outpost Firewall, тем самым исключая возможные системные конфликты (например, когда активность фаерволла будет воспринята Antispyware другого производителя как опасная, и наоборот. В случае использования интегрированного решения такие ситуации исключены. Во-вторых, продукт бесплатен для пользователей Agnitum Outpost Firewall, так как не является самостоятельным продуктом, а пред-

принципиально новых программных продуктов? А.Б.: В данный момент мы стараемся наиболее плотно работать над улучшением существующих продуктов, выпускать их новые версии и следовать пожеланиям пользователей. В этом году мы уже представили два новых продукта – офисную версию Outpost Firewall и Antispyware – поэтому все силы сейчас брошены именно на улучшение этих продуктов. Персональный Outpost Firewall также обзавелся новой версией и улученным функционалом. Мы считаем, что не стоит гнаться за созданием большого ассортимента «средненькой» продукции и предпочитаем выпускать качественные и проверенные продукты. Расскажите о международных проектах и клиентах компании. М.П.: В последнее время мы стараемся постоянно развивать свое присутствие на рынке. Для этого было открыто Торговое представительство Agnitum в Северной Америке. В Германии ребрендингом наших продуктов занимается компания Buhl Data Service, в Японии – компания Canon. Novell выбрала технологии ядра Outpost Firewall Pro для использования в Novell Client Firewall, а английский лидер антивирусного ПО – Sophos включил исходный код Outpost Firewall Pro в свое новое интегрированное решение по безопасности. Западные университеты предпочитают Outpost за соотношение цена/качество, так как выделение им средств на ITрешения жестко нормировано и постоянно контролируется.

Роман Марков


итоги конкурса

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

З

а шесть месяцев участники успели не только сдать весеннюю сессию в вузах и хорошенько отдохнуть летом, но и успешно выполнить задание турнира, которое предлагало в жестких временных рамках реализовать все этапы стандартного сетевого проекта. IT-турнир студенческих команд «Кубок сетевых проектов Microsoft» прошел с 4 апреля по 1 октября на базе Учебного центра ВМК МГУ & SoftLine Academy (www.it-university. ru). Мероприятие было организовано компаниями Microsoft, SoftLine, ZyXEL и факультетом вычислительной математики и кибернетики МГУ им. М.В. Ломоносова. К участию приглашались студенты и аспиранты всех московских вузов. В ходе турнира команды разработали проект компьютерной сети небольшого предприятия, реализовали его на реальном оборудовании, составили комплект документации и выступили с докладами перед экспертной комиссией. В турнире приняли участие 290 человек, 28 команд прошли предварительный отбор и получили техническое задание. 10 команд успешно справились с заданием, разработали собственные проекты, построили компьютерную сеть и показали ее работоспособность. Команды защищали свои проекты перед членами комиссии, в состав которой вошли представители компаний Microsoft, ZyXEL, Softline, преподаватели московских вузов (МИЭМ, МГАПИ, МИЭТ, МАИ) и технический специалист из журнала «Системный администратор». Несмотря на то, что все участники получили одинаковое техническое задание, каждая команда наделила свой проект индивидуальными чертами. Некоторые решения выгодно отличались нестандартным подходом и оригинальным исполнением (ознакомиться с краткими описаниями проектов-победителей можно на сайте http://www.it-university.ru/ center/it-project/windescr.asp). Многие участники уже имели

Задача проекта Участникам необходимо было создать функционирующую сеть некой виртуальной компании. Компания расширяет штат сотрудников и обновляет свою IT-инфраструктуру. Недавно был арендован новый офис, планируется подключить оба офиса к Интернету с помощью высокоскоростного ADSL-соединения, а в основном офисе разместить веб-сайт. Компания обновила все клиентские компьютеры до Microsoft Windows XP Professional, установила три сервера с OC Microsoft Windows Server 2003 Standard Edition в основном офисе и два сервера в дополнительном офисе. Приобретено также беспроводное и ADSL-оборудо-

№10, октябрь 2005

практический опыт работы с сетевыми технологиями, а некоторые незадолго до участия в турнире прошли обучение в Учебном центре ВМК МГУ & SoftLine Academy по программе «Администрирование сетей Microsoft» и уже получили статус сертифицированных специалистов MCSA. По итогам акции был организован «круглый стол», на котором состоялось награждение победителей призами – оборудованием от ZyXEL и Microsoft, годовой подпиской на журнал «Системный администратор», а также приглашением пройти бесплатное обучение в центре ВМК МГУ & SoftLine Academy. Перед участниками «круглого стола» выступил руководитель команды H0lid@ys (студент МИЭМ), занявшей первое место в турнире. Он представил проект, схема которого приведена на рис. 1. Планируются публикации, посвященных описаниям проектов команд-победителей IT-турнира. Надеемся, технические описания реальных выполненных проектов с комментариями профессионалов помогут вам применить лучшие практики проектирования в своей ежедневной работе.

Рисунок 1. Схема сети, разработанной командой-призером

вание компании ZyXEL и выполнено подключение офисов к Интернету на скорости 7,5 Мбит/с с выделением по одному статическому IP-адресу на каждый офис. Для мобильных пользователей, приезжающих в офисы, нужно организовать беспроводной доступ к сети. Перед участниками турнира стояла задача планирования и создания работоспособной сети этого предприятия. Необходимо было обеспечить безопасное соединение между двумя офисами, обеспечить безопасный беспроводной доступ в обоих офисах компании, а также предложить решение, позволяющее пользователям получать «прозрачный» доступ к сетевым ресурсам (общим папкам и принтерам) любо-

го офиса. Управление сетью также должно быть упрощено по сравнению с одноранговой сетью. Уровень поставленной задачи соответствовал уровню технической подготовки специалиста MCSA – Microsoft Certified Systems Administrator (http://www.ituniversity.ru/courses/itprog-msn.asp).

Рисунок 2. Существующая IT-инфраструктура

9


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

Профессия – убивать спам Все, что вы хотели узнать о тонкостях настройки Spamassassin

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

П

акет Spamassassin – один из самых популярных инструментов для борьбы со спамом, свободно распространяемый под лицензией Apache. Будучи написанным на языке Perl, он имеет высокий уровень переносимости и наверняка будет работать на любой UNIX-подобной операционной системе. Этим же обусловлена и относительная медлительность этого фильтра. В данной статье будет рассмотрено использование Spamassassin на FreeBSD, однако основные принципы работы сохранятся неизменными и на других платформах.

Тактика и используемые системы вооружения В основе Spamassassin лежит метод детектирования спама по ряду характерных признаков. Некоторые из них представлены в таблице 1. Каждому признаку назначается оп-

10

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


администрирование Spamassassin также может проверять принадлежность адреса отправителя одному или нескольким блок-листам реального времени (RBL). Опять-таки результат такой проверки лишь добавит баллы в общую копилку. Рассматриваемый фильтр умеет взаимодействовать и с системами, основанными на сигнатурном анализе (Razor, Pyzor, DCC). По умолчанию включен только Pyzor, поскольку DCC не является открытой системой, а сервис Razor полностью бесплатен только в случае персонального использования. Благодаря такому интегральному подходу вы получаете возможность очень гибко настраивать методы детектирования спама в зависимости от конкретных задач, которые вы ставите перед фильтром. При этом ни один из методов (если, конечно, ему не присвоить балл, заведомо превышающий порог срабатывания) не выносит окончательного решения о признании сообщения спамом, что при грамотной настройке способствует снижению числа ложных срабатываний.

Таблица 1. Примеры характерных признаков спама

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

Развертывание комплекса на местности Установка выполняется традиционно: на FreeBSD лучше всего воспользоваться коллекцией портов; пользователи Linux могут установить Spamassassin из исходных кодов либо поискать в сети готовый прекомпилированный пакет для своего дистрибутива. Более того, поскольку Spamassassin разработан на Perl, его можно установить непосредственно из коллекции CPAN, как и любой другой Perl-модуль: root# cpan> cpan> cpan>

perl -MCPAN -e shell o conf prerequisites _ policy ask install Mail::SpamAssassin quit

Далее мы будем предполагать, что пакет устанавливается из коллекции портов: # cd /usr/ports/mail/p5-Mail-SpamAssassin # make # make install

Вместе с командами make и make install вы можете указать ряд дополнительных параметров (см. таблицу 2). Замечание: при первой установке из коллекции портов вы получите представленное на рис. 1 диалоговое окно, где сможете отметить нужные параметры визуально, без ввода дополнительных параметров в командной строке. Ваш выбор будет сохранен в /var/db/ports/p5-MailSpamAssassin/options, и при последующих установках (например, при обновлении версии пакета) вы уже не будете получать этот диалог. Поясню смысл приведенных выше опций.

Справка Пакет Spamassassin был разработан Джастином Мэйсоном (Justin Mason) на базе кода программы filter.plx. Весной 2001 года проект был выложен на сайте Sourceforge.net. В настоящее время Spamassassin разрабатывается силами Apache Software Foundation и начиная с версии 3.0 выпускается под лицензией Apache. Spamassassin лежит в основе ряда других антиспамовых решений, например McAfee SpamKiller.

№10, октябрь 2005

Поддержка SSL позволяет клиенту и серверу Spamassassin взаимодействовать друг с другом по защищенному каналу. Если и клиентское, и серверное ПО предполагается использовать только в пределах одной и той же машины, эту опцию можно отключить. Если вы планируете использовать байесовый анализатор, то поддержка MySQL или PostgreSQL позволит вам хранить статистические данные, накапливаемые анализатором, в базе данных. Кроме того, в БД могут храниться настройки пользователей и автоматически формируемый «белый» список. Если ни одна из СУБД не поддерживается, будут использоваться «плоские» файлы. Включение поддержки Razor позволит вам стать активным участником этой системы. То есть Spamassassin сможет не только проверять принадлежность сигнатуры сообщения к базе спама, но и отправлять извещения (рапорты) об обнаруженном спаме или ложных срабатываниях. Запросы SPF (Sender Policy Framework, см. http://spf. pobox.com) позволяют использовать систему DNS для проверки того, является ли IP-адрес источника сообщения легитимным SMTP-сервером. Для SMTP-серверов администратор размещает в соответствующей зоне DNS запись типа TXT, информирующую о том, что с данного IP-адреса предусмотрена отправка сообщений электронной почты. Если для адреса источника такая TXT-запись отсутствует, то получатель вправе отклонить запрос на соединение. Yahoo DomainKeys (см. http://antispam.yahoo.com/ domainkeys) действует аналогично SPF, но вместо простой пометки хранит в соответствующей зоне публичный ключ SMTP-сервера, позволяющий верифицировать цифровые подписи получаемых электронных сообщений (которые подписываются автоматически при отправке). Поддержка базы IP-адресов, сопоставленных со странами, позволит вам использовать фильтрацию по географическому признаку. Однако нельзя забывать, что некоторые компании могут использовать зарубежный хостинг. Поэтому не следует придавать подобным проверкам слишком большой вес.

11


администрирование Таблица 3. Размещение конфигурационных файлов

Рисунок 1. Конфигурационный диалог

Наконец, установка дополнительного инструментария позволит вам получить ряд вспомогательных программ (подробнее о них будет рассказано в следующем разделе). Если вы выполняете установку вручную, будьте готовы к тому, что в процессе инсталляции придется удовлетворить большое число зависимостей (различные модули Perl). Список необходимых модулей можно найти в файле INSTALL дистрибутива. Также не забудьте добавить следующую строчку в /etc/ rc.conf: spamd _ enable="YES"

Это необходимо для того, чтобы демон Spamassassin мог запускаться из стартового сценария /usr/local/etc/rc.d/ sa-spamd.sh.

Дислокация и приведение в полную боевую готовность По умолчанию (установка из портов, prefix не используется) исполнимые файлы пакета размещаются в /usr/local/ bin. Размещение и назначение основных конфигурационных файлов разъясняется в таблице 3. Обратите внимание, что настоятельно не рекомендуется вносить изменения в файлы, размещаемые в каталоге /usr/ local/share/spamassassin, поскольку они будут перезаписаны при обновлении версии пакета, и вы потеряете все свои настройки. Если вам нужно что-то изменить, просто укажите строку с нужными параметрами в рабочем конфигурационном файле в каталоге /usr/local/etc/mail/spamassassin. Следующие подразделы описывают некоторые наиболее полезные параметры конфигурации.

Настройка набора тестов ! required_score N: «Порог срабатывания» фильтра,

то есть количество баллов, при достижении которого сообщение признается спамом. N – число с плавающей запятой. Значение по умолчанию – 5.0. ! score <имя_теста> nL [nN nB nBN]: баллы, назначаемые тесту <имя_теста>. Может быть указано одно значение (общее) или четыре: nL – локальный балл, nN – при работающих сетевых тестах, nB – при включенном байесовом анализаторе, nBN – при работающих сетевых тестах и статистическом анализаторе.

12

Имена тестов и значения по умолчанию можно узнать в файле /usr/local/share/spamassassin/50_scores.cf. Чтобы полностью отключить какой-либо тест, присвойте ему значение 0.0. Сами тесты (как правило – регулярные выражения) находятся в этом же каталоге в других cf-файлах. При желании вы можете создавать и свои проверки по аналогии с имеющимися. Как вы можете увидеть, для этого существует несколько групп правил (header, body, rawbody, meta, uri и др.). Подробно синтаксис правил описывается на странице справки perldoc Mail::SpamAssassin::Conf.

Белые и черные списки Spamassassin можно настроить для особой обработки сообщений от конкретного отправителя или адресованных конкретному получателю. Для этого существует группа параметров, определяющих «белые» и «черные» списки: ! whitelist_from <адрес_или_шаблон>: отправители, почтовый адрес которых соответствует шаблону, рассматриваются как доверенные, и почта от них не подвергается проверке на спам. Под шаблоном в данном случае понимается запись в стиле командной строки, где символ «*» обозначает любое количество символов, «?» – любой один символ. Например, «*@contora.ru» занесет в «белый» список всех пользователей домена contora.ru. ! blacklist_from <адрес_или_шаблон>: аналогично «белому» списку, но теперь отправитель априори рассматривается как спамер, и все письма от него помечаются как спам без дальнейшего анализа. ! whitelist_to <адрес_или_шаблон>: все сообщения на указанный адрес будут передаваться без фильтрации. Можно использовать, если владелец адреса желает получать всю почту, адресованную ему. Также рекомендуется устанавливать этот параметр для адреса abuse, чтобы даже в случае неправильной настройки фильтра с вами можно было связаться. ! blacklist_to <адрес_или_шаблон>: все сообщения на указанный адрес будут рассматриваться как спам. Например, таким образом можно организовать «прививки» для статистического анализатора, создав специальный адрес для спама и максимально «засветив» его на просторах Интернета (при этом должно быть включено автообучение, см. ниже).


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

Опции сетевых проверок Фильтр Spamassassin умеет проводить ряд сетевых тестов, таких как проверка на принадлежность адреса отправителя доверенной сети, поиск IP-адреса в списках RBL, и т. п. Некоторые параметры, которые вы можете использовать в своем конфигурационном файле, приведены ниже: ! trusted_networks <список_сетей>: перечисленные здесь сети (в формате CIDR, например: 12.34.56.78/24) будут рассматриваться как доверенные. ! skip_rbl_checks 1 | 0: этим правилом вы можете отключить (значение 1) проверку на принадлежность адреса отправителя спискам RBL. Это может быть полезно, если такие проверки вы предпочитаете выполнять другими средствами (например, с помощью spamd или непосредственно правилами MTA), а также если риск потери легальных сообщений для вас неприемлемо высок.

Параметры обучения статистического анализа Статистическому анализатору в Spamassassin отводится весьма важная роль, поскольку только благодаря ему удается достичь непревзойденной точности срабатывания. Так как этот инструмент довольно сильно нагружает систему, то его тонкая подстройка может иметь решающее значение. Некоторые параметры: ! use_bayes 1 | 0: включает использование статистического анализатора. ! bayes_auto_learn 1 | 0: разрешает автообучение фильтра, в ходе которого письма, признанные спамом либо набравшие минимальный балл, автоматически обрабатываются для обучения анализатора как спам (spam) или не спам (ham) соответственно. ! bayes-ignore-header <тэг_заголовка>: не анализировать письма, содержащие указанный тэг в заголовке. Может оказаться полезным для отмены повторного анализа уже обработанных (например, вышестоящим провайдером) сообщений. ! bayes_ignore_from <адрес>: не подвергать анализу письма от указанного адресата. ! bayes_ignore_to <адрес>: не анализировать сообщения, предназначенные указанному пользователю.

Прочие параметры Если вы получаете письма преимущественно на одном (или нескольких) конкретном языке (например, русском), то может быть полезным указать такой параметр: ok _ locales ru en

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

№10, октябрь 2005

Параметр report_safe указывает на то, что следует делать с оригинальным сообщением, если оно будет признано спамом: либо оставить как есть (значение 0), либо приложить к отчету как вложение (значение 1), либо добавить к отчету как текст (значение 2).

Настройки администратора Помимо описанных выше параметров, влияющих на процесс обработки входящих сообщений, существует ряд настроек, с помощью которых администратор может управлять способом хранения данных или загрузкой подключаемых модулей: ! bayes_path <путь_к_базе>: указывает путь к каталогу, в котором будут храниться данные, накапливаемые статистическим анализатором. ! bayes_file_mode <права_доступа>: задаются права доступа для вновь создаваемых файлов данных анализатора. ! bayes_sql_*: группа правил для настройки доступа к внешней БД в случае, если она используется для хранения данных анализатора. Подробнее взаимодействие с СУБД будет рассмотрено в одном из следующих разделов. ! loadplugin <имя_модуля> [<путь_к_модулю>]: так можно подключить дополнительный модуль.

Вспомогательные скрипты Если вы устанавливали вспомогательные инструменты, то найти их можно будет в каталоге /usr/local/share/ spamassassin/tools. Все они снабжены подробными комментариями или POD-документацией в самом тексте сценария. Здесь я приведу лишь краткое описание некоторых скриптов: ! sa-stats.pl – формирует статистику работы фильтра на основе почтового лог-файла (по умолчанию /var/log/ maillog). Пример вывода сценария: # ./sa-stats.pl -s 20051013 Report Report Period Period

Title Date Beginning Ending

: : : :

SpamAssassin - Spam Statistics 2005-10-13 четверг, 13 октября 2005 г. 00:00:00 пятница, 14 октября 2005 г. 00:00:00

Reporting Period : 24.00 hrs -------------------------------------------------Note: 'ham' = 'nonspam' Total spam detected Total ham accepted

: 737 ( 54.51%) : 615 ( 45.49%) ------------------Total emails processed : 1352 ( 56/hr) Average spam threshold : Average spam score : Average ham score : Spam kbytes processed : Ham kbytes processed : Total kbytes processed : Spam analysis time Ham analysis time Total analysis time

: : :

12.00 17.85 4.66 5255 10632 15887

( 219 kb/hr) ( 443 kb/hr) ( 662 kb/hr)

2057 s ( 86 s/hr) 1434 s ( 60 s/hr) 3491 s ( 145 s/hr)

13


администрирование Statistics by Hour ---------------------------------------------------Hour Spam Ham -----------------------------------------2005-10-13 00 12 ( 27%) 32 ( 72%) 2005-10-13 01 102 ( 75%) 33 ( 24%) .. .. .. .. 2005-10-13 23 0 ( 0%) 0 ( 0%) Done. Report generated in 25 sec by sa-stats.pl, version 6256.

Этот отчет позволяет оценить долю спама в общем объеме электронной почты, нагрузку на систему и канал связи, а также распределение нагрузки по времени суток. ! check_whitelist – проверяет или очищает автоматически сформированный «белый» список, позволяя удалить из него редко используемые адреса. # ./check _ whitelist -1.4 (-4.3/3) 11.1 (22.2/2) 0.0 (0.0/2) -2.3 (-394.9/171) .. .. .. ..

-----

user@myserver.ru|ip=none rrryyy@mail.ru|ip=8x.2yy security-advisories@freebsd.org|ip=216.136 mailer-daemon@myserver.ru|ip=none

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

Подразделение AWL AWL (Auto White List) – система, используемая в Spamassassin по умолчанию, начиная с версии 3.0. Принцип работы AWL заключается в следующем: для всех отправителей ведется база данных, в которой сохраняется число обработанных сообщений и набранный в сумме балл. При получении письма с адреса, фигурирующего в базе AWL, рассчитывается его «чистый» балл (без учета AWL), а окончательный балл проставляется как производное значение от рассчитанного «чистого» и взятого из базы исторического значения. Например, если ранее с адреса rrryyy@mail.ru было получено два сообщения, набравших в сумме 22.2 балла (см. листинг в предыдущем разделе, поясняющий работу утилиты check_whitelist), и приходит третье письмо с «чистым» баллом 1.8, то итоговый балл будет равняться: St = (Th / Ch - Sc) * f + Sc = (22.2 / 2 - 1.8) * 1 + 1.8 = 11.1

где: ! St – итоговый балл; ! Th – суммарный «исторический» балл; ! Ch – количество «исторических» писем; ! Sc – «чистый» балл текущего письма (без учета AWL); ! f – весовой коэффициент системы AWL.

14

Таким образом, система AWL учитывает «кредитную историю» отправителя, доверяя в большей степени тем, кто в прошлом вел себя хорошо. Отключить использование AWL можно, указав в конфигурационном файле следующую строку: use _ auto _ whitelist 0

Кроме того, вы можете подстраивать работу системы, указывая весовой коэффициент для расчета итогового балла, отличный от 1: auto _ whitelist _ factor 0.5

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

Взаимодействие с MTA SpamAssassin может быть подключен практически ко всем популярным почтовым серверам: Sendmail, Postfix, Qmail, Exim, Courier-MTA, Communigate Pro и некоторым другим. Подробные инструкции можно получить на странице http:// wiki.apache.org/spamassassin/IntegratedInMta. Для работы с Sendmail Spamassassin обычно подключается через milter. В сети можно найти несколько «мильтеров» для работы со Spamassassin. Мы будем использовать имеющийся в коллекции портов spamass-milter: # cd /usr/ports/mail/spamass-milter-0.3.0 # make install

После установки нужно будет добавить в /etc/rc.conf строку для автоматического запуска spamass-milter при загрузке системы: spamass _ milter _ enable="YES"

Наконец, добавляем поддержку этой программы в конфигурационный mc-файл Sendmail (обычно соответствует доменному имени сервера, например /etc/mail/myserver. ru.mc): MAIL _ FILTER(`spamassassin’, ↵ `S=local:/var/run/spamass-milter.sock, F=, ↵ T=C:15m;S:4m;R:4m;E:10m’)dnl deÞne(`confINPUT _ MAIL _ FILTERS’, `spamassassin’)dnl

Если вы используете и другие фильтры (например, clmilter из пакета ClamAV), то перечислите их в одной строке «confINPUT_MAIL_FILTERS», поскольку такая запись должна быть только одна. Как вариант, вместо строк MAIL_FILTER можно использовать INPUT_MAIL_FILTER. В этом случае второе определение не потребуется. Теперь осталось пересобрать cf-файл, запустить Spamassassin и spamass-milter и перезагрузить Sendmail: # cd /etc/mail # make # make install


администрирование # /usr/local/etc/rc.d/sa-spamd.sh start # /usr/local/etc/rc.d/spamass-milter.sh start # make restart

Последние три команды можно заменить полной перезагрузкой сервера, если режим его работы позволяет это сделать. В процессе работы каждое сообщение анализируется, в него добавляются заголовки, отражающие результат проверки, однако независимо от того, признается письмо спамом или нет, оно передается дальше. Вопросы обработки таких сообщений рассматриваются в следующем разделе. Помимо приведенного выше способа, большой эффективности можно достичь, используя procmail. Ниже приведен пример конфигурации: # Отправляем все сообщения (до 256000 байт) на обработку :0fw: spamassassin.lock * < 256000 | spamassassin # Все сообщения с X-Spam-Status = Yes помещаем в карантин :0: * ^X-Spam-Status: Yes carantine

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

Дальнейшая участь спама Пакет Spamassassin предназначен только лишь для пометки анализируемых сообщений (в заголовке или модифицируя тему письма). Дальнейшие действия, такие как удаление спама или перемещение его в карантин, требуют подключения внешних программ, умеющих это делать. Наиболее популярным решением является уже упоминавшийся в предыдущем разделе procmail (там же приведен пример занесения спама в отдельный почтовый ящик). Этот способ можно использовать как глобально (для всех пользователей сервера организовать один карантин), что может быть удобно в пределах одной организации, так и индивидуально, настроив каждому пользователю свой карантин (эту возможность по достоинству оценят провайдеры). Недостатком такого подхода является отсутствие удобного инструмента для работы с карантином, так как если периодически закачивать содержимое карантина с помощью почтового клиента и обрабатывать его таким образом, то это сводит на нет все преимущества использования фильтра. На странице http://wiki.apache.org /spamassassin / SpamQuarantine предлагается два других решения: использование веб-интерфейса Maia Mailguard и программы SpamAssassin Quarantine (SAQ). Чтобы не перегружать статью, оставлю их вам для самостоятельного изучения (возможно, об особенностях этих программ мы поговорим в другой раз).

№10, октябрь 2005

Рисунок 2. Так для пользователя выглядит спам

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

Проверка боеготовности и обучение личного состава После того как Spamassassin будет установлен и настроен, убедиться в его работоспособности можно, просмотрев заголовки приходящих сообщений. Для писем, прошедших обработку, в заголовке должно присутствовать что-то похожее: X-Spam-Status: No, score=-0.7 required=12.0 tests=ALL_TRUSTED,AWL, MAILTO_TO_SPAM_ADDR,NO_REAL_NAME autolearn=ham version=3.1.0 X-Spam-Checker-Version: SpamAssassin 3.1.0 (2005-09-13) on myserver.ru

Из этого заголовка видно следующее: сообщение было обработано фильтром Spamassassin, запущенным на вашем сервере (тэг X-Spam-Checker-Version). Письмо не было признано спамом (No), набрало -0.7 балла при необходимых 12.0, положительный результат был дан перечисленными после tests тестами. Автоматическое обучение статистического фильтра было выполнено для этого письма в режиме ham (не спам). Таким образом, можно считать, что фильтр работает. Для писем, признанных спамом, будет формироваться отчет (пример приведен на рис. 2). Текст сообщения можно изменять в настройках фильтра (используются строки report в конфигурационном файле). Помимо текста, извещающего пользователя, что сообщение было признано спамом, ниже дается подробная расшифровка того, какой тест сколько баллов внес в итоговый результат. Подобная детализация очень полезна для анализа причин ложного срабатывания, если оно произойдет. Оригинальное сообщение по умолчанию прикладывается к отчету как вложение (это поведение можно настроить с помощью параметра конфигурации report_safe). Несколько слов нужно сказать о работе байесового анализатора. Если его работа разрешена и включено автообучение, то он будет анализировать каждое сообщение и инициировать обучение для писем, признанных спамом или набравших минимальный балл. Однако заметьте,

15


администрирование что результаты статистического анализа станут учитываться фильтром только после того, как будет набрана достаточная учебная база (по умолчанию, по 200 экземпляров спама и не спама). Тренировать фильтр вы можете как вручную, так и положившись на автообучение (что потребует некоторого времени). После того как будет накоплена достаточная база, в заголовках обработанных писем будет появляться и информация о выполнении тестов BAYES_xx: X-Spam-Status: Yes, score=14.9 required=12.0 tests=BAYES_99,EXTRA_MPART_TYPE, FORGED_OUTLOOK_TAGS,FORGED_RCVD_HELO,HTML_IMAGE_ONLY_16,HTML_MESSAGE, RCVD_IN_NJABL_DUL,RCVD_IN_SORBS_DUL,RCVD_NUMERIC_HELO, SUBJECT_ENCODED_TWICE autolearn=no version=3.1.0 X-Spam-Level: ************** X-Spam-Checker-Version: SpamAssassin 3.1.0 (2005-09-13) on myserver.ru

Как видите, для этого сообщения байесовый тест дал результат от 99 до 100% вероятности того, что письмо – спам. Совместно с другими тестами письмо набрало 14.9 баллов, что позволило отнести его к спаму, несмотря на достаточно высокий порог срабатывания. Основываясь на личном опыте использования фильтра, могу сказать, что сразу после установки (поскольку дело было на работающем сервере, то необходимый порог срабатывания был на период тестирования установлен на достаточно высоком уровне – 12 баллов) Spamassassin стал отмечать примерно половину приходящего спама. Специального обучения статистического анализатора я не проводил, целиком полагаясь на самообучение. Спустя сутки фильтр накопил достаточную базу и стал учитывать результаты байесовой классификации. При этом точность срабатывания возросла примерно до 91%. Ложных срабатываний пока не наблюдалось. Предварительное обучение фильтра наборами заранее отсортированных на спам и легальную почту сообщений позволит задействовать байесовый анализатор значительно раньше, а также еще больше повысить точность срабатывания. Команды, «скармливающие» фильтру такие сообщения, представлены ниже: # sa-learn --spam ~serg/sa/spams Learned tokens from 20 message(s) (20 message(s) examined)

# sa-learn --ham ~serg/sa/hams Learned tokens from 5 message(s) (5 message(s) examined)

Последним параметром указывается либо файл (в формате mailbox), либо каталог, содержащий примеры писем (например, в формате msg). Нужно заметить, что обучение может выполняться довольно долго (у меня обработка 25 сообщений заняла почти минуту). Вполне естественно, что Spamassassin, как и любой другой антиспамовый фильтр, будет пропускать часть спама (всегда найдутся грамотно составленные сообщения, успешно проходящие через большинство правил). Сбор таких писем в отдельную папку и периодическая передача их Spamassassin в режиме обучения позволят в будущем повысить точность срабатывания за счет более высокого балла, присваиваемого письму статистическим анализатором. После обучения вы можете просмотреть дамп базы:

16

# sa-learn --dump 0.000 0 3 0 non-token data: 0.000 0 2792 0 non-token data: 0.000 0 623 0 non-token data: 0.000 0 131028 0 non-token data: 0.000 0 1010692073 0 non-token data: 0.000 0 1129590682 0 non-token data: 0.000 0 1129530349 0 non-token data: 0.000 0 0 0 non-token data: 0.000 0 0 0 non-token data: 0.000 0 0 0 non-token data: 0.049 0 1 1129026204 91a35b559c 0.958 1 0 1129026743 92485c309a 0.049 0 1 1129028552 f92317eba2 .. .. .. .. ..

bayes db version nspam nham ntokens oldest atime newest atime last journal sync atime last expiry atime last expire atime delta last expire reduction count

К процессу обучения можно приобщить и пользователей. Создайте специальные почтовые ящики для спама и не спама (например, sa-spam@myserver.ru и saham@myserver.ru) и проинструктируйте своих пользователей на первый из них пересылать пропущенный спам (так называемый false negative), на второй – хорошие сообщения, ошибочно признанные спамом (false positive). Далее настройте cron на периодическую загрузку писем из соответствующих почтовых ящиков в режиме обучения. Второй путь – настроить procmail на обработку таких писем, что называется, на лету (пример взят со страницы http:// wiki.apache.org/spamassassin/ProcmailToForwardMail): :0 * ^To:.*spam@example.com { * < 256000 :0c: spamassassin.spamlock | sa-learn --spam :0: spamassassin.Þlelock spam }

Здесь помимо инициализации обучения для поступающих писем их копии также сохраняются в папке spam, которая может пригодиться в будущем для ручного обучения фильтра. Подробнее о режимах обучения смотрите страницу справочного руководства man sa-learn и соответствующие Wiki-страницы.

Усиление за счет внешней СУБД По умолчанию Spamassassin хранит данные (автоматически формируемый «белый» список, историю статистического анализатора) в отдельных файлах в формате DBM. Для повышения производительности можно перенести их во внешнюю базу данных. Spamassassin умеет работать с MySQL и PostgreSQL (поддержка СУБД должна быть включена на этапе установки пакета). Рассмотрим настройку для работы с базой PostgreSQL. Сначала вам нужно будет подготовить базу данных для работы. Саму БД придется создать вручную, а заодно и пользователя, который будет владельцем нашей базы. А поскольку Spamassassin использует хранимые процедуры на языке PL/pgSQL, то также потребуется подключить и язык программирования к вновь созданной базе: # createuser --no-adduser --no-createdb -U pgsql sauser # createdb --owner sauser -U pgsql sabase # createlang -U pgsql plpgsql sabase


администрирование Замечание: pgsql – имя администратора PostgreSQL, который имеет право создавать базы и пользователей, sauser – вновь создаваемый пользователь-владелец БД Spamassassin, sabase – база данных Spamassassin. Далее нужно сформировать правильную структуру БД, для чего воспользуемся готовыми SQL-сценариями, которые можно будет найти в каталоге sql распакованного дистрибутива (при установке из портов это будет каталог /usr/ ports/mail/p5-Mail-SpamAssassin/work/Mail-SpamAssassin3.1.0/sql): # psql -d sabase -U sauser -e < bayes _ pg.sql CREATE TABLE bayes _ expire ( id integer NOT NULL default '0', runtime integer NOT NULL default '0' ) WITHOUT OIDS; CREATE TABLE CREATE INDEX bayes _ expire _ idx1 ON bayes _ expire (id); .. .. много команд .. .. CREATE FUNCTION

Этой командой мы создали нужные таблицы, индексы и функции в базе sabase для хранения данных статистического анализатора. Теперь осталось указать в конфигурационном файле local.cf соответствующие настройки и перезапустить фильтр:

Дополнительные сведения можно получить из файлов README.* в указанном выше каталоге sql.

Индивидуальный защитный комплект Spamassassin может быть установлен и для персонального использования без необходимости иметь права администратора системы. Например, если у вас есть учетная запись на сервере, то сможете установить Spamassassin в своем домашнем каталоге и настроить его на проверку почты с помощью procmail. В этом случае вы сможете настроить фильтр именно так, как хотите, не обращаясь к системному администратору сервера. Прежде чем вы установите Spamassassin в свой домашний каталог, вам потребуется указать в ваших переменных окружения пути к модулям и библиотекам Perl, если это не было сделано ранее. Должны быть определены переменные PATH, MANPATH, PER5LIB и LANG. Прежде чем собрать пакет из исходников, сконфигурируйте его на установку в свой домашний каталог: # perl MakeÞle.PL PREFIX=$HOME && make && make install

Далее внесите в ваш файл .forward такую строчку: "|IFS=' ' && exec /usr/bin/procmail -f- || exit 75 #user"

bayes _ store _ module Mail::SpamAssassin::BayesStore::PgSQL bayes _ sql _ dsn DBI:Pg:dbname=sabase;host=localhost bayes _ sql _ username sauser bayes _ sql _ password ''

Если у вас уже накоплена статистическая база в формате DBM, то перенести их в СУБД можно следующим образом. Перед тем как менять настройки в конфигурационном файле, сделайте резервную копию базы: # sa-learn --backup > sabase.back

После того как настройки будут изменены для работы с СУБД, восстановите данные из сформированной резервной копии: # sa-learn --restore sabase.back

Поскольку формат резервной копии не зависит от используемого модуля базы данных, то sa-learn самостоятельно выполнит конвертирование данных в соответствии с используемой базой данных. Также поддерживается хранение во внешней БД пользовательских настроек и «белых» списков. Для подготовки таблиц нужно выполнить следующие команды: # psql -d sabase -U sauser -e < userpref _ pg.sql # psql -d sabase -U sauser -e < awl _ pg.sq

А в конфигурационном файле указать аналогичные приведенным выше опции подключения к базе данных: user _ scores _ dsn DBI:Pg:dbname=sabase;host=localhost user _ scores _ sql _ username sauser user _ scores _ sql _ password '' user _ awl _ dsn DBI:Pg:dbname=sabase;host=localhost user _ awl _ sql _ username sauser user _ awl _ sql _ password ''

№10, октябрь 2005

Это приведет к перенаправлению всей вашей почты на procmail, который должен быть настроен на обработку спама (пример см. выше, использовать следует пользовательский конфигурационный файл .procmailrc). Пример конфигурационного файла для procmail можно найти в дистрибутиве под именем procmailrc.example. Не забывайте теперь вызывать нужные программы, указывая путь к файлам, установленным в вашем домашнем каталоге (или укажите нужный каталог в вашей переменной окружения PATH). Подробности смотрите на странице http://wiki.apache.org/ spamassassin/SingleUserUnixInstall.

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

17


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

Как посчитать трафик в Linux

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

У

читывать трафик, проходящий через шлюз локальной сети в Интернет, мы будем с помощью ipcad (Cisco IP accounting simulator). Это программа, которая может вести подсчёт несколькими механизмами, например, через интерфейсы BPF, libpcap и iptables ULOG. Материал предназначен для тех администраторов, в чьём ведении имеется малая или средняя локальная сеть. Всё, что понадобится для работы, лишь сам ipcad, текстовый редактор для написания скриптов разбора статистики и огромное желание наконец решить задачу подсчёта расходуемого трафика в локальной сети. Мы рассмотрим процессы установки, настройки и запуска ipcad, а также некоторые примеры написания скриптов разбора статистики.

ческие интерфейсы шлюза (в данной статье – два Ethernetинтерфейса). Для конкретизации описания настроек взята локальная сеть с одной подсетью 192.168.0.0/24. По умолчанию единственный конфигурационный файл ipcad находится в директории /usr/local/etc. Под задачу учёта трафика через два сетевых интерфейса eth0 и eth1 ipcad.conf выглядит следующим образом: # /usr/local/etc/ipcad.conf # # # # # # #

GLOBAL OPTIONS Опция capture-ports включает/отключает дополнительные поля в статистике, такие как: TCP- и UDP-порты, а также типы ICMP-пакетов. Однако включение данной опции увеличивает потребление памяти, снижает скорость подсчёта трафика и в ряде случаев искажает вывод через RSH, поэтому она в данном примере отключена

Установка ipcad

capture-ports disable;

Для начала необходимо скачать последнюю версию ipcad (http://lionet.info/ipcad). На момент написания статьи таковой была 3.6.6. В самом процессе установки нет ничего нетривиального:

# Размер буферов, используемых для передачи статистики # ядром, по умолчанию равен 64 Кб, чего вполне достаточно buffers = 64k

# # # # # #

tar -xvzf ipcad-3.6.6.tar.gz cd ipcad-3.6.6 ./conÞgure make /bin/su make install

В RPM-based-дистрибутивах устанавливать ipcad лучше с помощью checkinstall (дабы следовать правилам пакетной системы).

Настройка ipcad Из многочисленных способов ведения статистики самым простым является учёт трафика, прошедшего через физи-

18

# # # #

INTERFACE OPTIONS Интерфейсы, на которых считается проходящий трафик. Рассматривается случай шлюза с двумя сетевыми интерфейсами: внутренним (локальная сеть) и внешним (Интернет)

interface eth0; # Считать трафик на Ethernet-интерфейсе... interface eth1; # ...и ещё на одном # Разделять статистику по каждому IP-адресу для подсети # 192.168.0.0/24. «aggregate 192.168.0.0/24» указывает # ipcad-диапазон адресов сети. «strip 32» означает, # что в статистику необходимо заносить все 32 бита # адреса, принадлежащего данному адресному диапазону aggregate 192.168.0.0/24 strip 32; # RSH SERVER OPTIONS # Настройки rsh-сервера, с помощью которого будет # просматриваться статистика. rsh enable at 127.0.0.1;


администрирование # Правила, указанные ниже, описывают политики доступа # к статистике ipcad. Root может полностью управлять # (делать backup, просматривать и изменять таблицы подсчёта). # Все остальные могут лишь просматривать статистику rsh root@127.0.0.1 admin; rsh root@127.0.0.1 backup; rsh root@127.0.0.1; rsh 127.0.0.1 view-only; # «Время жизни» и тайм-аут IP-пакета rsh ttl = 3; rsh timeout = 30; # Опцией dumpÞle задаётся путь к файлу, в который # по умолчанию будут складываться данные статистики dumpÞle = /var/log/ipcad/ipcad-curr.dump; # OTHER OPTIONS pidÞle = /var/run/ipcad.pid; # Опция memory _ limit задаёт количество памяти # для хранения содержимого одного потока данных. # Синтаксис следующий: # memory _ limit = <количество>[{k|m|e}] ; # где k - Кб; m - Мб; e – количество строк таблицы данных memory _ limit = 10m;

Все остальные опции, задаваемые ipcad.conf, в нашем случае можно смело удалить (или, как минимум, закомментировать) за ненадобностью. Таким образом, они не будут задействованы вообще. Примечание: директория /var/log/ipcad/ не создаётся при установке ipcad, поэтому её необходимо создать самостоятельно. Права на чтение, запись и просмотр содержимого директории с логами ipcad рекомендую дать лишь пользователю root. Всем остальным – запретить всё, чтобы избежать даже просмотр простыми пользователями статистики расходуемого трафика в сети. На этом процессы установки и настройки завершены, и можно переходить к запуску ipcad.

Запуск ipcad Запускать ipcad имеет смысл таким образом, чтобы при загрузке он восстанавливал данные о статистике из dumpfile, уходил в фон, а при выключении сбрасывал все данные в тот же dumpfile. Команда для запуска выглядит следующим образом: /usr/local/bin/ipcad -rds

где: ! ключ r – импортирует данные из dumpfile; ! ключ d – «демонизирует» ipcad; ! ключ s – сбрасывает статистику в dumpfile при выключении ipcad. Лучше всего разместить указанную команду в один из init-скриптов для запуска ipcad вместе с системой. В какой именно init-скрипт, я не конкретизирую, т.к. это зависит от каждого дистрибутива. Например, в SuSE Linux для подобных целей служит скрипт /etc/init.d/boot.local, а в RedHat – /etc/rc.d/rc.local.

Просмотр статистики Для управления статистикой ipcad используется rsh, настройки которого [rsh] задаются в конфигурационном файле ipcad.conf (о чём говорится в «Настройка ipcad»).

№10, октябрь 2005

Общий синтаксис команд для ipcad выглядит следующим образом: rsh host comand

где host – это хост, на котором ведётся статистика, а comand – это сама команда. В рассматриваемом случае значением host является localhost. По команде: rsh localhost help

доступен полный список команд. А именно: ! show ip accounting – показать статистику. ! clear ip accounting – сбросить статистику до контрольной точки. Если контрольная точка не задана, то статистика сбрасывается в ноль. ! show ip accounting checkpoint – показать статистику, сохранённую в контрольных точках. ! clear ip accounting checkpoint – сбросить все контрольные точки. ! show ip cache flow – показать кэш NetFlow. ! show interface <iface> – показать счётчик интерфейса <iface>. ! dump [<path>] – сохранить текущую статистику в файл <path>. Если <path> не указывать, то статистика сбросится в dumpfile, указанный в конфигурационном файле ipcad.conf. ! restore [<path>] – восстановить статистику. ! import [<path>] – импортировать (добавить) статистику. ! stat – показать текущее состояние работы ipcad. ! show version – показать версию и uptime ipcad. ! shutdown – завершить работу ipcad. Для просмотра статистики достаточно: rsh localhost show ip accounting

Однако таким образом на экран выведется информация обо всём трафике, прошедшем через шлюз. То есть в одной таблице будет статистика по всему входящему и исходящему трафику из локальной сети. Получить нужные данные из вывода команды «show ip accounting» можно, например, с помощью скриптов. Которые вы вполне можете написать сами для каждой конкретной ситуации. Ниже приводится пример для просмотра статистики по одному указанному IP-адресу и подсчёта суммарного трафика для этого IP: traff.acc #!/bin/bash # name of script: traff.acc HOST=localhost rsh $HOST dump rsh $HOST show ip accounting | grep -E ↵ '192\.168\.0\.'$1'([^0-9]|$)' echo echo "Summary trafÞc of 192.168.0.$1 (kbytes):" rsh $HOST show ip accounting | grep -E ↵ '192\.168\.0\.'$1'([^0-9]|$)' | awk '{s+=$4} ↵ END {print(s/1024)}'

19


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

HOST=localhost USERS=/etc/hosts

./traff.acc ip

case $1 in

где ip – это число от 1 до 254 (попросту последний октет из IP-адреса). Результатом работы этого скрипта будет вывод на экран количества (в мегабайтах) входящего трафика для введённого IP-адреса. Приведённый простейший скрипт будет выводить всю суммарную статистику по указанному IP-адресу, собранную с момента первого запуска ipcad и до текущего момента времени. Это не всегда удобно, поскольку нагляднее иметь данные за какой-то конкретный промежуток времени (день/неделя/месяц). Мне достаточно вести статистику расходуемого трафика по месяцам. Схема такого учёта выглядит следующим образом: в 23 ч. 59 мин. «последнего» числа каждого месяца делается dump статистики в файл, к названию которого целесообразно добавить значения года и текущего месяца. Уже через минуту, в 0 ч. 00 мин. 1-го числа следующего месяца, счётчик трафика сбрасывается командой «clear ip accounting», статистика начинает вестись «с нуля». По достижении «последнего» дня месяца схема повторяется. Для реализации этого механизма создан файл /etc/cron. d/ipcad с заданиями для cron: /etc/cron.d/ipcad * * * * * root rsh localhost dump >/dev/null 59 23 * * * root date "+\%Y\%m" > /var/log/ipcad/ipcad.date 0 0 1 * * root (rsh localhost dump ↵ /var/log/ipcad/ipcad-$(cat ↵ /var/log/ipcad/ipcad.date).dump && rsh localhost ↵ clear ip accounting) >/dev/null 2>&1

Первая задача из приведённого файла выполняет dump статистики каждую минуту. Делается это для защиты от непредусмотренных выключений и зависаний шлюза, на котором ведётся учёт проходящего трафика. Вторая строчка – это такой маленький «хак», который автор статьи вынужден был сделать в связи с трудностью указания в расписании «последнего дня месяца» при настройке заданий cron. Суть в том, что каждый день в файл /var/log/ipcad/ipcad.date сохраняется текущий месяц и год (в формате YYYYMM). Эта же процедура ведь произойдёт и в последний день месяца. Уже через минуту третье задание сделает dump статистики в файл, к названию которого прикрепится содержимое файла ipcad.date (т.е. год и уже прошедший месяц в формате YYYYMM), и сбросит счётчик расходуемого трафика. В этот же день файл ipcad.date перезапишется новыми значениями текущих месяца и года. Не совсем красиво, но зато работает. Теперь, когда есть данные о трафике по каждому месяцу, расположенные в разных dump-файлах, можно изменить скрипт, добавив к нему возможность просмотра общей и частной по каждому IP-адресу статистики израсходованного трафика за какой-то определённый месяц: traff.acc.2 #!/bin/bash

20

M|m) echo "Summary LAN trafÞc of month $2 (Mbytes):" rsh $HOST dump awk '{s+=$4} END {print(s/1048576)}' ↵ < /var/log/ipcad/ipcad-$2.dump exit 0;; U|u) grep -E '192\.168\.0\.'$3'([^0-9]|$)' $USERS ↵ | awk '{print($2)}' USER=`grep -E '192\.168\.0\.'$3'([^0-9]|$)' ↵ $USERS | awk '{print($2)}'` rsh $HOST dump cat /var/log/ipcad/ipcad-$2.dump ↵ | grep -E '192\.168\.0\.'$3'([^0-9]|$)' echo echo "Summary trafÞc of $USER in $2 ↵ month (kbytes):" cat /var/log/ipcad/ipcad-$2.dump ↵ | grep -E '192\.168\.0\.'$3'([^0-9]|$)' ↵ | awk '{s+=$4} END {print(s/1024)}' exit 0;; *)

echo echo echo echo echo echo echo echo

"Usage: " "1) if only month stat:" " ./traff.acc.2 m <month>" " <number> - number of month" "2) if user’s stat for month" " ./traff.acc.2 u <month> <IP>" " <month> - stat for that month" " <IP> - last octet of user’s ↵ IP address" echo "note: for current month in ßag <month> ↵ just type 'curr'" exit 0;;

esac

В приведённом скрипте traff.acc.2 в переменной $USERS определяется файл, в котором есть соответствия имён пользователей и их IP-адресов (в данном примере – это /etc/ hosts на шлюзе). Эта переменная необязательна и вводится в скрипт исключительно для наглядности просматриваемой статистики. Использовать приведённый скрипт можно двумя способами: ./traff.acc.2 m <month>

где семафор m обозначает то, что на экран необходимо вывести общую статистику за указанный месяц. ./traff.acc.2 u <month> <IP>

семафор u обозначает, что на экран необходимо вывести статистику указанного пользователя за определённый месяц. Флаг <month> – это шестизначный номер месяца в формате YYYYMM – такой формат хранения ежемесячных dump-файлов выбран в файле задач для cron (для вывода статистики за текущий месяц следует указать вместо номера месяца слово «curr»). Флаг <IP> – это значение последнего октета IP-адреса пользователя, чью статистику надо просмотреть. В заключение статьи хочу отметить, что вместо shellскрипта можно написать скрипт на perl и, добавив элементы навигации, прикрутить страницу с этим скриптом к httpdсерверу. Тогда статистика будет доступна для просмотра через браузер.



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

Scientific Linux – выбираем решение корпоративного уровня по цене носителя

На проходившей в Москве выставке LinuxWorld Russia 2005 хорошо известная на отечественном рынке открытого программного обеспечения компания из Санкт-Петербурга «Линукс Инк» представила общественности русифицированную версию дистрибутива Scientific Linux.

Андрей Маркелов

И

здателем дистрибутива выступил небезызвестный LinuxCenter (http://www.linuxcenter.ru). К четырем дискам оригинального Scientific Linux питерские разработчики добавили еще два – один с обновлениями, а другой с пакетами русификации, шрифтами и мультимедиа. Итак, если читатель слышал о таких дистрибутивах, как White Box Linux или CentOS, то после того, как я скажу, что при создании Scientific Linux была взята за основу идеология, аналогичная использованной в этих двух дистрибутивах, то станет ясно, что это еще один клон Red Hat Enterprise Linux (RHEL). Поэтому сравнивать Scientific Linux мы будем именно с корпоративным дистрибутивом от лидера коммерческого Linux. Как известно, Red Hat не распространяет бесплатно свой корпоративный дистрибутив. Однако, следуя условиям лицензии GPL, выкладывает в открытый доступ исходные тексты в виде SRPM-пакетов. Создатели клонов просто перекомпилируют «исходники». Получившиеся «бинарники» упаковываются в дистрибутив Linux, причем настолько близко к тому, как это сделано в коммерческом дистрибутиве, насколько это удается. Целью, как написано в FAQ на официальном сайте – http://www.scientificlinux.ru, является достижение гарантии того, что если

22

программа работает и сертифицирована в коммерческом дистрибутиве Enterprise Linux, то она будет работать аналогично и в соответствующем релизе Scientific. Для ответа на вопрос зачем понадобилось создавать еще один клон и какова его ниша на рынке открытых операционных систем, мы связались с техническим директором ОАО «Линукс Инк» Олегом Садовым. С его мнением вы можете ознакомиться во врезке. А для того чтобы поближе взглянуть на сам дистрибутив, перейдем к практике. Начнем, как это принято, c установки. Встречает нас знакомая пользователям RHEL и Fedora Core «анаконда». Данная программа достаточно удобна. Поддерживаются текстовый и графические режимы установки, а также инсталляционные скрипты Kickstart. Ставить «научный» Linux можно как с CD-диска или локального раздела, так и по сети: через NFS, HTTP или FTP. В процессе установки вы можете создать разделы с использованием технологии LVM2, определить программный RAID, а также задать режим работы SELinux. Кроме того, можно произвести начальное конфигурирование брандмауэра. Это все стандартные функции RHEL4 и Fedora Core, и здесь мы не встречаем никаких сюрпризов.

А вот уже на этапе выбора компонентов для установки нас ждет нечто новое. Здесь появляются две новые группы, которые отсутствуют в оригинале. Это в дополнение к KDE и Gnome группа ICE Desktop Environment, и группа Scientific Linux Additional Choices. Как вы видите на рис. 1, в группу Scientific Linux Additional Choices входят средства удобного обновления системы – APT и YUM, а также программное обеспечение для организации кластеров и распределенных вычислений. В «Packages added to Scientific Linux» помимо прочего присутствует интересный пакет SL_sendmail_accept, единственное предназначение которого – менять политику Red Hat по умолчанию для Sendmail. Как явствует из описания, пакет включает опцию, позволяющую принимать почту извне. Еще один пример отступления от политики Red Hat – пакет xmms-mp3. Как, наверное, читателю известно, в случае с Fedora или RHEL, все, что не удовлетворяет условиям лицензии GPL, в дистрибутив не включается, к примеру, ту же поддержку формата MP3 пользователю пришлось бы добавлять в свою систему самостоятельно. Достаточно забавен сам процесс установки пакетов. Он показан на рис. 2. В отличие от RHEL, где пользователю демонстрируются рекла-


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

Рисунок 1. Выбор пакетов

Рисунок 2. Процесс установки начался

ма компании и самого дистрибутива, во время установки Scientific Linux можно полюбоваться цветочками, котятами и прочими «веселостями». По окончании установки, которая производится с первых четырех дисков, в точности соответствующих оригинальному Scientific Linux, у пользователя есть возможность установить с двух дополнительных CD обновления и пакеты русификации, мультимедиа, документацию, а также драйверы для видеокарт от NVIDA и ATI. Итак, что же мы имеем по окончании установки? Надежный дистрибутив корпоративного уровня с обновлениями, выходящими максимум через два дня, после того как они появятся на сайте Red Hat. Полный аналог дистрибутива, сертифицированного в качестве платфомы, в частности, корпорацией Oracle. В поставку дистрибути-

ва входят удобные средства управления system-config-*, а также при эксплуатации можно воспользоваться, например, документацией, доступной по адресу http://www.redhat.com/docs/ manuals/enterprise. Все, что написано в «букварях» от Red Hat, практически полностью (за исключением средств RHN) применимо и к Scientific Linux. Итого мы имеем корпоративный дистрибутив по цене на порядок меньшей, чем у Red Hat. И хотя существуют области, где такая экономия окажется неоправданной (например, в случае взаимодействия с технической поддержкой Oracle, которую, при использовании Scientific Linux, вы не получите), для небольших организаций или частных пользователей рассматриваемый дистрибутив будет неплохим выбором. Кроме того, не нужно забывать, что у зарегистрированных поль-

зователей имеется возможность в течение 30 дней получать от компании «Линукс Инк» бесплатную поддержку по установке и начальной настройке системы. А если не нужно сопровождение, вы можете бесплатно скачать дистрибутив по ссылке с сайта http:// www.scientificlinux.ru. С другой стороны, когда вам понадобится гарантированная техническая поддержка не только по вопросам инсталляции, но и по вопросам эксплуатации ОС в течение всего срока использования сервера, вам ничто не помешает перейти на коммерческий корпоративный Linux. И переход этот будет максимально безболезненным, поскольку, как мы уже заметили, одна из задач Scientific Linux – максимальная бинарная совместимость со вполне конкретным коммерческим дистрибутивом Linux.

Олег Садов, технический директор ОАО «Линукс Инк» о дистрибутиве Scientific Linux

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

вычислительной среде проекта LCG с совокупной вычислительной мощностью в сотню тысяч CPU, в то время как у коммерческих производителей эти технологии пока не выходят за рамки маркетинговых акций. И базовой платформой для такой инфраструктуры является именно Scientific Linux. В этот механизм закладывались широкие возможности по настройке – начиная от набора пакетов и состава их групп, кончая логотипом начального загрузчика инсталлятора. Для того круга задач, которым мы занимаемся, создание спец. дистрибутивов, оптимизированных под потребности клиента и базирующейся на кодовой базе мирового технологического лидера Linuxиндустрии, крайне важно, и платформа Scientific Linux для этого подходит как нельзя лучше!»

«На наш взгляд, использование дистрибутива Scientific Linux наиболее перспективно, по следующим причинам: во-первых, достаточно уникальный подход к формированию ядра коллектива разработчиков – это и не коммерческая компания, и не чистое сообщество энтузиастов. В случае Scientific Linux, проект ведется на государственное финансирование – в Америке это Fermi National Accelerator Laboratory, в Европе – CERN. И это дает некоторую гарантию от метаний в области технологической политики и политики распространения дистрибутива, и от опасности стагнации вследствие угасания интереса у членов community. У нас великолепные кон-

№10, октябрь 2005

23


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

ReactOS – свободная альтернатива Windows. Слухи и реальность

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

Н

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

24

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

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


администрирование телям ПО потратить на перенос и тестирование своих продуктов. Остается лишь один выход – написать систему, которая будет вести себя в точности так же, как Windows. Такие мысли с завидной периодичностью приходят в голову многим разработчикам свободного софта на протяжении достаточно долгого периода времени. Без сомнения, самым известным проектом подобного толка является Wine. Стройными рядами за вечно молодым патриархом идет череда его потомков разной степени близости: Cedega (бывший Winex), сошедший с конвейера TransGaming Technologies, CrossOver Office от CodeWeavers, DAVID, разработанный загадочной Филиппинской фирмой SpecOpS Labs, LinSpire (во младенчестве Lindows). Все вышеперечисленные герои нацелены на запуск Windows-приложений в среде UNIX-подобных систем. И только одна маленькая, но гордая система по имени ReactOS пошла совсем другим путем. Команда разработчиков подумала: «Зачем нам нужен фундамент в виде UNIX, если мы, взяв все лучшее от Wine, сами можем стать полноценной операционной системой, в точности повторяющей поведение Windows NT и его последующей инкарнации Windows XP. Полная мимикрия даст возможность использовать весь багаж ПО, разработанный для Windows, причем это будут не только вожделенные приложения, но и драйвера для устройств поддержки, которых столь не хватает другим ОС. Дело за малым, нужно лишь правильно реализовать API. На первый взгляд, ничего сложного в этом нет, но это только кажущаяся простота. API от Microsoft документировано достаточно туманно, да и сам производитель не особенно стремится делиться своими секретами, несмотря на отсутствие принципиальных возражений.

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

№10, октябрь 2005

плодных дискуссий о том, каков должен быть дизайн системы, начинание тихо умерло. Рисунок 1. Первый экран установки В конце 1997 года Джейсон Филби (Jason Filby) становится координатором проекта и объявляет о необходиРисунок 2. Создание разделов мости начать все заново. Решено – система будет называться ReactOS и должна стать похожей уже на следующую ст упень Рисунок 3. Первичные настройки эволюции продуктов Microsoft, т.е. н а W i n d o w s N T. С февра ля 1998 года начинается собственно разработка. Следующие несколько лет сисРисунок 4. Выбор языка тема потихоньк у развивается, привлекая к себе все новых и новых разработчиков. НакоРисунок 5. Выбор папки инсталляции нец пришло время, когда ее уже можно попробовать на вкус. Сегодня мы посмотрим, готова ли она для тоРисунок 6. Копирование файлов го, чтобы заменить ОС от Microsoft на наших рабочих мес- тить, что система пока что способна работать только в 32-битном режиме, тах. впрочем, это не мешает ей также выполняться и на новых 64-битных проУстановка Итак, берем дистрибутив – http://www. цессорах. Итак, приступим к осмотру. Вставreactos.org/xhtml/ru/download.html. На момент написания статьи актуаль- ляем в CD-ROM диск, перезагружаемна версия 0.2.7. Согласитесь, 11 Мб – ся и видим следующую надпись: удивительный размер для любой современной ОС. Распространяется она Для того чтобы загрузка продолв виде нескольких независимых дистрибутивов: загрузочный Live-CD-пакет жилась, нужно успеть нажать любую для установки в qemu или iso-имидж для установки в реальную систему. Я опробовал все три варианта и могу сказать, что они практически не отлиРисунок 7. Ошибка при работе чаются, по крайней мере набор недосо scsi-дисками статков и достоинств везде примерно один и тот же. Для чистоты эксперимента даже была произведена установка ReactOS в VMWare. Стоит отмеРисунок 8. Установка загрузчика

25


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

Рисунок 9. Мастер настройки ОС

Рисунок 10. Экран персонализации

Рисунок 11. Повторная настройка русской локализации

Рисунок 12. Ошибки при установке драйверов VMWare

Рисунок 13. Процесс загрузки ReactOS

Рисунок 14. Результаты русификации

26

клавишу, пока по экрану бегут точки. Если не успеваем, система подвисает намертво, помогает только волшебная кнопка «Reset». Странный подход к началу инсталляции. Если со скоростью реакции у вас все отлично, то на экране появится следующее меню (см. рис. 1). (От ред.: видимо отсюда произошло название системы React – от «реакция».) Все предлагаемые варианты привычны глазу любого Windows-админа. Единственный пункт, который вызывает любопытство, – «repair ReactOS». В процессе экспериментальных установок мне, к сожалению, пришлось к нему однажды прибегнуть, и он в общем-то довольно неплохо сработал. Пытаться инсталлировать систему на scsi-диски не стоит, все равно ничего хорошего из этого не выйдет, в ответ будем получать лишь картинку, после которой инсталляция будет завершаться с кучей жалобных сообщений (см. рис. 7). Пока что кроме IDE нам ничего не светит. Пришлось поставить в тестовый компьютер диск IDE и начать заново. Впрочем, стоит отметить, что полная переустановка системы длится всего 2 минуты, и это, знаете ли, впечатляет. Меню разбивки диска на разделы выглядит довольно стандартно (см. рис. 2). Пока что можно работать только с FAT32. В рамках этой файловой системы декларируется поддержка VFAT, в нашем случае это обозначает наличие Unicode и длинных имен. Так как взаимодействие ОС и файловой системы происходит через модуль IFS (Installable File System), разработчики предполагают, что скоро в качестве основной ФС станет возможным использовать не только NTFS, Ext2, Ext3, JFS, SMB, но и многие другие. Ставить систему лучше всего на пустой диск, т.к мне ни разу не удалось нормально разметить и отформатировать целевой раздел, если на диске присутствовали разделы других систем. Либо они портились, либо форматирование не срабатывало. Так или иначе, раздел создан и отформатирован, осталось проверить и изменить в случае надобности некоторые настройки. Несмотря на возможность выбора русского языка и многих других, диало-

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

Первый запуск и начальная настройка И вот после перезагрузки наконец-то видно, как выглядит первая встреча с новой системой. Пока что на экране ничего особо впечатляющего не видно (см. рис. 17). То ли еще будет? Поэтому жмем <Enter> и попадаем прямиком в лапы мастера настройки системы после первого запуска (см. рис. 9). Вид странных квадратиков вместо обещанных кириллических символов начинает раздражать, но все еще есть надежда, что потом с помощью волшебного шаманского бубна жизнь наладится (см. рис. 10). В дальнейшем нас спросят об имени компьютера и пароле администратора, заодно покажут список свободных проектов на парочку экранов, из которых был позаимствован код для решения тех или иных задач. Стоит отметить, что снимки экрана, приведенные в статье, были специально уменьшены для экономии места, а на самом деле они довольно часто полностью не помещаются на экране во время настройки системы. Поэтому для того, чтобы нажать, к примеру, кнопку «ОК», приходится сдвигать диалоговое окно далеко за край экрана. В процессе настройки нам еще раз предложат определиться с так называемыми региональными настройками или, попросту говоря, локалью,

Рисунок 15. Ошибка при просмотре нереализованных меню

Рисунок 16. Попытка настроить сетевой интерфейс


администрирование часовым поясом и раскладкой клавиатуры (см. рис. 11). Впрочем, радоваться рано, манипуляции с языками все равно бесполезны, квадратики вместо русских букв никуда от этого не денутся. В случае если установка проходит под VMWare, система обнаружит это и попытается поставить VMWare tools автоматически. Но и здесь Рисунок 17. Интерфейс загрузчика нас ж дет разочарование. ReactOS, некоторое время помучив вим систему с английской локалью виртуальный CD-ROM, покажет нам и продолжаем препарирование. Интерфейс системы очень последующее (см. рис. 12). хож на что-то вроде Windows NT, хотя присутствует и некоторое количесЧто имеем в результате После перезагрузки мы, наконец-то, тво собственных элементов оформувидим систему в действии. Переход ления окон и меню. В основе графив рабочее состояние даже на медлен- ческой подсистемы лежит DIB Engine ных машинах выполняется примерно и своя собственная версия Explorer, отвечающая за отрисовку рабочего в течение 30 секунд. Как и следовало ожидать, с руси- стола. Технологически такое решение фикацией беда (см. рис. 14). Шаман- несильно отличается от того, что есть ские танцы с переключением лока- у Microsoft, то есть оно также встроели и раскладки клавиатуры результа- но в ядро. Но в то же время различия та не дают. По крайней мере, англий- в дизайне позволит в качестве оболочский язык взамен русского вернуть ки для пользователя при желании притоже не удается. А дело-то все в том, способить LiteStep, BlackBox, fwm или что в системе и в помине нет никаких еще какой-либо популярный оконный шрифтов, кроме латиницы. По крайней менеджер из мира UNIX. Впрочем, тамере, английский язык взамен русско- кие разработки еще пока только плаго вернуть тоже не удается. Лечение, нируются. Настройка свойств рабочекак всегда, происходит с помощью пе- го стола, разрешения экрана и заставреустановки системы. Итак, заново вы- ки практически не отличается от станполнив это нехитрое упражнение, ста- дартных интерфейсов Windows. Б ол ьш и н с т в о п од м е н ю в е т к и «Start → Settings» либо пусты, либо вызывают показ вот таких окошек (см. рис. 15, 16). Соответственно изменение параметров звука, принтеров, сетевого подключения напрямую не поддерживается. К примеру, для изменения настроек сетевых устройств приходится залезать в реестр. Впрочем, и сами перечисленные подсистемы еще не до конца реализованы. В процессе загрузки ОС видно, что драйвера для сетеРисунок 18. Свойства сетевой подсистемы вых устройств в память загружаются, но мне так и не удалось оживить сетевую карту. Так что единственным признаком наличия сетевого стека можно считать тот факт, что сетевое устройство локальной петли при загрузке получает IP-адрес. Но вот ping все же сделать не удаРисунок 19. Ошибка при попытке ется. Впрочем, есть надежда, что норуправлять громкостью звука

№10, октябрь 2005

мальная поддержка сети появится в следующем релизе, т.к. на выставке LinuxWorld 2005 всем желающим был продемонстрирован вариант ReactOS, который довольно неплохо работал с сетью. По утверждению разработчиков сетевой стек уже сейчас представляет полную аналогию стека Windows XP. В качестве основы для его реализации была выбрана библиотека oskiitcp. Также ведется активная работа над Winsock. Полностью стабильная версия сетевого стека будет представлена публике в версии 0.30. Со звуковой подсистемой дела обстоят гораздо хуже, ее разработка началась намного позже, да и сил на это тратится пока существенно меньше. Поэтому надеяться, что ReactOS скоро запоет в полный голос, наверное, не стоит, а пока что любуемся на то, как она должна управляться. На данный момент декларируется поддержка драйверов звуковых карт от Windows NT 4. Поговорив о недостатках, перейдем к тому, что же на самом деле может система. Мне удалось совершенно без проблем поработать под управлением ReactOS с Far, OpenOffice, несколькими приложениями вроде калькуляторов IP-сетей и кучей прочего мелкого софта. Слегка прихрамывая, заработали Total Commander и несколько других приложений после того, как нужные ключи реестра из Windows были импортированы с помощью regedit в ReactOS. К сожалению, заставить запуститься даже самый древний Internet Explorer или Microsoft Office не удалось, то же самое относится и к столько необходимой многим продукции фирмы Adobe.

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

27


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

Создаем загружаемый Flash-диск с FreeBSD и DOS Часть II

Рашид Ачилов Из первой части статьи вы узнали о том, как создать загружаемый Flash-диск с FreeBSD и DOS. Но создать его – не самоцель, созданный диск – просто инструмент, которым нужно умело воспользоваться.

Использование Flash-диска для установки FreeBSD Установка FreeBSD на новый компьютер при загрузке с Flash имеет свои особенности, которые необходимо учитывать. При загрузке с дискеты программа sysinstall выполняется как процесс init, поэтому она делает поочередно все необходимое. При загрузке с Flash /stand/sysinstall запускается как обычная программа и не производит некоторых действий, которые обычно выполняются, когда sysinstall работает в качестве init, например копирование каталога /stand. Поэтому процедура установки FreeBSD на новый компьютер во многом аналогична процедуре создания самой Flash и может проводиться в том же порядке, что описан в [1], за исключением того, что теперь нужно ставить большее количество базовых пакетов. Порядок действия в этом случае таков: ! Создание разделов («слайсов») для установки FreeBSD (через fdisk или /stand/sysinstall). ! Создание BSD-разделов внутри слайса. Это можно сделать только с помощью disklabel. Почему-то, если /stand/ sysinstall работает не в качестве init, а в качестве рядовой задачи, он не в состоянии создать устройства в DEVFS. Описание того, как с помощью disklabel создать BSDразделы, приведено ниже. ! Создание файловых систем в BSD-разделах. Это можно сделать как с помощью newfs (пример приведен в [1], в разделе «Создание»), так и с помощью /stand/ sysinstall. При этом при форматировании через /stand/ sysinstall все BSD-разделы будут отображены как уже отформатированные и без точек монтирования. Необходимо для каждого раздела вручную указать точку монтирования («М») и указать, что файловая система требует создания («Т»). Не забудьте снять признак опережающего кэширования с раздела, который будет корневым в новой системе – /stand/sysinstall делает это только при задании точки монтирования «/». ! При задании точек монтирования, пожалуйста, будьте внимательны. Если предполагаемый корневой раздел монтируется для установки в /mnt/s1a и предполагается

28

еще создать разделы /usr и /var, то для них точки монтирования нужно задавать соответственно как /mnt/s1a/ usr и /mnt/s1a/var, но ни в коем случае не как /usr и /var. ! Дополнительная настройка файловых систем. Если предполагается использовать ACL, то файловая система должна быть помечена, как допускающая их использование. Данная отметка не ставится по умолчанию. Проверить это вы можете командой tunefs: # tunefs -p /dev/ad0s2a tunefs: tunefs: tunefs: tunefs: tunefs: tunefs: tunefs: tunefs:

ACLs: (-a) disabled MAC multilabel: (-l) disabled soft updates: (-n) enabled maximum blocks per file in a cylinder group: (-e) 2048 average file size: (-f) 16384 average number of files in a directory: (-s) 64 minimum percentage of free space: (-m) 8% optimization preference: (-o) time

Выделенная строка отображает состояние признака допустимости использования ACL – «disable» – запрещено, «enable» – разрешено. Для изменения состояния признака можно использовать ту же команду tunefs такого формата: # tunefs -a enable /dev/ad0s1a

Отмечу, что команда tunefs может использоваться только на размонтированных файловых системах. ! Значение install root задается точно так же, как это делается в [1], в разделе «Создание». В качестве нового значения install root укажите точку монтирования раздела, который будет корневым в новой системе. И, пожалуйста, не забудьте, что install root нужно задавать после форматирования BSD-разделов. ! Установка всех необходимых пакетов. Необходимым является только пакет base, остальные на ваше усмотрение (хотя я всегда устанавливаю compat4x, man, src и ports). ! Шаг создания дополнительных пользователей лучше пропустить – /stand/sysinstall не умеет применять install root для этих целей, и вместо создания пользователя


администрирование в установленной системе он будет создан на Flash. Точно по такой же причине лучше пропустить шаг настройки сетевых сервисов – это все можно (и нужно) сделать после перезагрузки уже с установленной системы. Поскольку шаг задания пароля root пропустить нельзя, задайте любой пароль – этот пароль будет установлен для пользователя root на Flash. ! После первой перезагрузки установленной системы обязательно задайте пароль пользователя root (сейчас он без пароля) и настройте часовой пояс.

Создание BSD-разделов вручную Ранее, устанавливая FreeBSD, я был свято уверен в непогрешимости sysinstall и в то, что она не может допускать ошибок. Это мнение переменилось, когда в одной из версий /stand/sysinstall отказывался видеть жесткие диски, если их было больше одного. Впоследствии нашлись и другие области, где /stand/ sysinstall ведет себя не лучшим образом. Например, при создании BSD-разделов, когда он запущен не как init, а как обычный процесс, он не может создать устройства в DEVFS. Как следствие, создаваемый BSD-раздел не может быть смонтирован, и установка прерывается. При задании install root вспомогательные шаги типа задания пароля пользователя root всегда меняют его в /etc/master.passwd... Мы уже использовали возможность создания BSD-разделов вручную при форматировании самой Flash. Но там создавался только один корневой раздел, поскольку не было никакой необходимости разбиения диска. Для дисков нормального объема этот путь неприемлем хотя бы потому, что в корневой файловой системе по умолчанию выключено опережающее кэширование (softupdates). Поэтому мы будем использовать возможность disklabel восстанавливать метки дисков из текстового файла. Формат файла очень простой: # /dev/ad2s1: 8 partitions: # size a: 409600 b: 4194304 c: *

offset 4194304 0 *

fstype 4.2BSD swap unused

d: 10485760 4603904 4.2BSD e: 20971520 15089664 4.2BSD f: * 36061184 4.2BSD

[fsize bsize bps/cpg] 0

0 # «raw» part, # don’t edit

Откуда берется информация о диске? Первоначально файл можно создать, вызвав disklabel: # disklabel -e -n ad0s1

При этом будет запущен редактор, указанный в переменной окружения EDITOR, в котором можно сохранить файл начальных настроек. В данном файле, если в слайсе еще не было создано ни одного раздела, disklabel предполагает создание одного раздела a: размером во весь слайс и описателя слайса. Описатель слайса (раздел c:) создается всегда и помечается строкой «raw part, don’t edit». В приведенном выше файле настроек мы имеем четыре файловые системы и раздел подкачки (swap), которые расположены так, как показано на рис. 1.

№10, октябрь 2005

Рисунок 1. Разделы на диске, созданные по файлу примера

Если расположение разделов соответствует порядку букв (a, b, c ,d , etc...), где на a: всегда корневой раздел, на b: всегда раздел подкачки, на с: всегда описатель слайса, дальше расположение разделов произвольно – то можно доверить расчет границ раздела самому disklabel, соответствующий пример приведен ниже. Поскольку в файле примера разделы не соответствуют этому порядку (раздел подкачки идет первым), то рассчитаем границы разделов самостоятельно. Задаваемые в файле цифры – это размер и смещение раздела в секторах размером по 512 байт. 1 Гб – это 1024 * 1014 (1048576) Кб или 1024 * 1024 * 2 (2097152) секторов, 1 Mб – 1024 Кб или 2048 секторов. Эти цифры умножаются на размер раздела и складываются с начальным смещением. Отсчет смещения начинается с 0. Считаем: ! Раздел a: (root) размером 200 Мб. Начальное смещение 4194304, размер 409600 (2048 * 200), тип раздела 4.2BSD (согласно man disklabel, тип раздела может иметь только значения swap, 4.2BSD и unused). ! Раздел b: (swap) размером 2 Гб. Начальное смещение 0, размер 4194304 (2097152 * 2), тип раздела swap. ! Раздел с: (описатель слайса) – не редактировать! ! Раздел d: (/usr) размером 5 Гб. Начальное смещение 4603904 (4194304 (размер swap) + 409600 (размер root)), размер 10485760 (2097152 * 5), тип раздела 4.2BSD. ! Раздел e: (/var) размером 10 Гб. Начальное смещение 15089664 (размер d: + размер b: + размер a:), размер 20971520 (2097152 * 10), тип раздела 4.2BSD. ! Раздел f: (/usr/home) Начальное смещение 36061184 (размеры всех предыдущих разделов, кроме c:), размер – «*». Знак «*» обозначает, что disklabel должен сам рассчитать требуемое значение, хотя, конечно, никто не мешает провести этот расчет самому. В данном случае будет занято все оставшееся свободное место. После создания файла настроек протестируем его на предмет ошибок расчетов, возможных перекрытий разделов и т. д., командой: # disklabel -R -n ad0s1 ad0s1.disklabel

где ad0s1.disklabel – имя файла, в котором были сохранены настройки. Если все правильно, то disklabel отобразит предполагаемую картину разбиения диска, которая в точности похожа на содержимое файла настроек, только все звездочки заменены рассчитанными значениями. Если же были допущены ошибки, то увидим сообщения, где будет сказано, что не устроило disklabel в нашем файле. Если ошибок не возникло, то можно создать разделы по файлу настроек командой: # disklabel -R ad0s1 ad0s1.disklabel

(все то же самое, только ключ -n опущен). Если все прошло

29


администрирование успешно, то disklabel не скажет ничего. Иначе же выдаст сообщения об ошибке. Все. Разделы созданы, можно переходить к их форматированию и установке программ. Рекомендую, кроме того, сохранить информацию по слайсам («разделам» с точки зрения DOS) и разделам BSD, распечатать ее и хранить в непосредственной близости от сервера – это поможет восстановить случайно удаленные разделы. Сохранить информацию можно следующими командами: # fdisk /dev/ad0 > ad0.fdisk # disklabel ad0s1 > ad0s1.disklabel

Ниже приводится пример файла настроек, в котором все расчеты размеров и смещений выполняются самим disklabel. Напоминаю, что такое возможно только, если разделы идут в стандартном порядке: root, swap, описатель слайса, прочие разделы. # /dev/ad2s1: 8 partitions: # size a: 200M b: 2G c: * d: 5G e: 10G f: *

offset 0 * *

fstype 4.2BSD swap unused

* * *

4.2BSD 4.2BSD 4.2BSD

[fsize bsize bps/cpg] 0

0 # «raw» part, # don’t edit

При этом можно использовать буквы M и G для задания размера соответственно в мега и гигабайтах, а также символ «%» для задания размера в процентах от общего объема диска.

Использование Flash-диска для переноса данных на диск большего размера Все мы рано или поздно сталкиваемся с проблемой разделов жесткого диска, заполненных нужной и ценной информацией и полным нежеланием переустанавливать систему, несмотря на то что [2] рекомендует именно этот метод для переноса данных на новый жесткий диск большего размера. Тем не менее, там же приводится небольшое описание того, как можно, не переустанавливая систему, перенести ее на новый жесткий диск большего размера. Но данная инструкция приведена в расчете на то, что загружена система со старого диска, а это не всегда желательно. Для этого можно воспользоваться Flash-диском, для чего достаточно: ! Загрузиться с Flash. Допустим, /dev/ad0 – старый диск, а /dev/ad4 – новый диск. ! Прописать в /etc/fstab все разделы старого диска (на всякий случай пометив их «noauto»). ! Создать на новом диске раздел («слайс») типа FreeBSD (через /stand/sysinstall, fdisk, любой менеджер разделов). ! Создать разделы BSD внутри слайса так, как они должны быть расположены (через disklabel, так как описано выше) и отформатировать их (через newfs или /stand/ sysinstall). ! Смонтировать корневой раздел старого диска, например: # mount /dev/ad0s1a /mnt/s1a

30

! Смонтировать корневой раздел нового диска, например:

# mount /dev/ad4s1a /mnt/s1e

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

# cd /mnt/s1e && dump -0af - /mnt/s1a | restore -xf -

на единственный вопрос, который будет задан после восстановления данных, ответить «y». ! Точно так же перенести все остальные разделы. При этом следует иметь в виду, что переносить данные следует в порядке «углубления» точек монтирования. Например, если на диске существуют разделы /, /usr, /var и /usr/home, то ./usr/home должен переноситься после /usr. Примерный расчет затрат времени таков: на компьютере Intel Celeron 2533/512 RAM на перенос данных с полностью забитого жесткого диска Seagate 60 Гб UATA100 на жесткий диск Seagate 80 Гб SATA ушло 3 часа (не считая времени на подготовку). ! Выключить компьютер, убрать Flash, отключить старый диск и подключить новый так, чтобы при загрузке он получил то же самое имя устройства, что было у старого (например, при замене обычного жесткого диска на диск Serial ATA в BIOS существует возможность настроить отображение SATA на IDE).

Использование Flash-диска для контроля целостности файлов на жестком диске В [3] описан скрипт для проверки целостности файлов на зараженных или поврежденных машинах. Несмотря на очевидную параноидальность данного скрипта, в нем есть один недостаток – ядро пораженной системы все же используется, то есть при большом желании можно повлиять на процесс проверки. Если же сначала загрузиться с Flash, а потом установить носитель с базами AIDE или даже попросту объединить их (при наличии достаточного места на Flash), то от этого недостатка можно избавиться. При этом можно вообще не использовать AIDEStart, основная задача которого – функционирование на зараженной машине. Достаточно установить пакет aide на Flash, на ней же разместить базы с контрольными суммами с примонтированных разделов дисков (при этом не забывайте, что монтировать их нужно будет постоянно в одно и то же место), и запускать операции проверки, обновления или сравнения как обычно. По такому же принципу можно построить и антивирусную проверку дисков.

Для чего нам нужен DOS? Кратко перечислю возможные применения Flash-диска с загруженным DOS: ! О MHDD я уже упоминал. Лучшей программы для диагностики и восстановления (программного, разумеется) дисков я еще не встречал. На диске установлена последняя на тот момент версия программы 3.0 (безнадеж-


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

!

!

!

!

!

но устаревшая сейчас, с выходом версии 4.6). Скачать свежую версию можно на [4] и [5]. Находится в каталоге C:\UTILS. Программа для настройки менеджера загрузок xFDisk. Как видно из названия, она предназначена для настройки xFDisk, который используется в качестве менеджера загрузок. С ее помощью можно настраивать как менеджер загрузок xFDisk самой Flash, так и любого другого диска. Находится в каталоге C:\UTILS\XFDISK. Ranish Partition manager. Упомянутый в первой части статьи менеджер разделов. Простенький, но в то же время понятный интерфейс. Имеет собственный менеджер загрузок, который тем не менее не работает. Находится в каталоге C:\UTILS\RANISH. Оригинальный менед жер разделов из поставки FreeBSD – BootEasy. Если не работает ничего – попробуйте BootEasy! Правда, он навевает воспоминания о терминалах СМ ЭВМ и их знаменитых меню... Находится в каталоге C:\UTILS\BTEASY. Norton Utilites 8.0. Здесь не нужно много слов, про это вы и так все знаете. Несмотря на то, что на Flash присутствует полный комплект утилит, вряд ли он вам полностью понадобится. Наиболее ценным является, конечно, Disk Editor, ну и, может быть, Norton Cache. Находится в каталоге C:\NORTON8. На диске еще достаточно места, чтобы поместить туда любую программу для конфигурации любого оборудования, для перешивки BIOS и тому подобных «тонких» операций, не переносящих никаких препятствий между программой и оборудованием.

Возможные ошибки Помните, что: ! sysinstall, работающий в режиме обычной программы, не создает устройства в /dev. Поэтому создавайте BSD-разделы только через disklabel, а не через /stand/sysinstall. ! При генерации пароля root, при создании дополнительных пользователей и при настройке часового пояса sysinstall всегда изменяет конфигурационные файлы в /etc/master.passwd, а не в том месте, которое вы указали на экране опций. ! Указывать Install Root следует после того, как были созданы файловые системы. Во время создания файловых систем они монтируются в те точки, которые задаются на экране FreeBSD Disklabel editor, так что если вы зададите Install Root в самом начале, то созданные файловые системы будут смонтированы, например, в /mnt/ tmp/mnt/tmp вместо /mnt/tmp. ! Если при запуске disklabel, он вдруг сообщает: # disklabel ad0s1 disklabel: No valid label

это всего лишь означает, что данный раздел (в терминологии DOS) создавался не через /stand/sysinstall, который при создании раздела FreeBSD («слайса») сразу создает в нем описатель слайса (раздел с:), а другими средствами. Достаточно просто записать в такой раздел «метку по умолчанию»:

№10, октябрь 2005

# disklabel -w ad0s1

при этом будет создан описатель слайса и один раздел а: размером во весь слайс, после чего можно переразбить слайс по своему усмотрению. Никакого форматирования при этом не выполняется. ! Если при запуске dump появляется сообщение о неизвестном типе файловой системы, то, значит, точка монтирования, указанная в команде dump, не описана в /etc/fstab. ! Если при операции проверки по базе aide, размещенной на Flash, фиксируются значительные отличия в виде массовых удалений файлов в одном месте и добавлений в другом – проверьте правильность точек монтирования – вы могли случайно смонтировать, например, в /mnt вместо /mnt/disk1. ! Если при попытке задания ACL для файла на совершенно правильную команду выдается такой ответ: # setfacl -m u::rwx /tmp setfacl: acl_get_file() failed: Operation not supported

значит, у данной файловой системы отсутствует признак допустимости использования ACL. Следует размонтировать файловую систему и включить отсутствующую возможность: как показано в разделе «Использование Flash-диска для установки FreeBSD».

Заключение Теперь, Flash-диск, созданный нами, занял свое место в столе, сервер, на который с его помощью была установлена FreeBSD, перенесены данные со старых дисков, а также обновлен BIOS, почему-то оказавшийся предпоследней версии – законное место в стойке... Разумеется, круг задач, для решения которых можно было бы использовать Flashдиск, не исчерпывается теми, что были перечислены выше – каждый, кому хоть раз доводилось создавать загрузочные дискеты с DOS, наверняка сможет назвать как минимум еще одну. Но теперь эти дискеты вместе с CD-ROM дисками и приводами для них можно разместить на почетной нижней полке сейфа, куда добираешься только в очень редких случаях. Загружаемый USB Flash диск – это простое решение проблем с «нечитающимися» дискетами, поцарапанными дисками, крайне малой емкости первых и невозможности модификации вторых.

Литература и ссылки: 1. Ачилов Р. Создаем загружаемый Flash-диск с FreeBSD и DOS. Часть I. – Журнал «Системный администратор», №9, сентябрь 2005 г. – 32-40 с. 2. http://www.freebsd.org/doc/ru_RU.KOI8-R/books/faq/disks. html#NEW-HUGE-DISK 3. Ачилов Р. Управляем удаленными базами AIDE. Часть II – AIDEStart. – Журнал «Системный администратор», №9, сентябрь 2005 г. – 28-30 с. 4. http://files.hddguru.com/index.php – архив программного обеспечения для низкоуровневой работы с жестким диском. 5. http://mhdd.com – сайт программы MHDD. К сожалению, пока не оправился после недавней гибели.

31


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

Блокируем внешние устройства с помощью GFI LANguard P.S.C.

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

Н

есмотря на то что пользователь может выносить информацию и с благими намерениями, например, чтобы доделать работу на дому, все равно такие случаи должны полностью контролироваться. Иначе важная информация может случайно оказаться у конкурентов. События последних лет, когда проводки банков можно свободно приобрести в Интернете, подтверждают, что это не призрачная, а вполне реальная угроза. Поэтому наряду с организационными мероприятиями (в первую очередь это запрет использования таких устройств на рабочем месте) необходим полный контроль за работой таких устройств. В большинстве случаев их физическое отключение не всегда приемлемо. Например, оборудование может требоваться при переносе подготовленных презентаций или системный блок находится на гарантии. Некоторые специалисты просто отключают сервисы «Plug and Play», «Bluetooth Support Service», «Windows Installer», «Службу COM-записи компакт-диском IMAPI», «Смарт-карт» и «Съемные ЗУ» или устройства через BIOS. Но такой подход все равно не будет оптимальным выходом из положения и требует в том числе физического присутствия администратора. Поэтому более удобным является блокировка устройств при помощи специализированных утилит. Поиск в Интернете даст большое коли-

32

чество ссылок на такие программы, отличающиеся возможностями и лицензией. Сегодня пойдет речь о GFI LANguard Portable Storage Control, продукте компании GFI Software Ltd, известной своими разнообразными решениями, предназначенными для защиты информации.

Использование GFI LANguard P.S.C. Для управления доступом на компьютере устанавливается автономный агент. Он занимает в ОЗУ 1.2 Мб, и о его наличии пользователь, скорее всего, знать не будет. Для удобства развертывания в больших сетях в дистрибутив включен специальный инструмент, позволяющий удаленно установить агентов несколькими щелчками мыши. Во время установки выбирается вид управления доступом польПолитика безопасности компании должна: ! определить, кто из служащих будет допущен к использованию переносных устройств хранения информации; ! какую информацию им разрешено сохранять на этих устройствах; ! провести инвентаризацию всех используемых переносных устройств; ! установить правила для посетителей, в том числе использующих свои устройства при проведении презентаций;

зователя (user access control) локальный или централизованный, в том числе с использованием Active Directory (рис. 1). Дополнительно можно создать группы контроля, позволяющие более гибко определять доступ к различным классам устройств (GFI_LPSC_ REMOVABLE, GFI_LPSC_CDDVD, GFI_ LPSC_FLOPPY). Интересно, что в зависимости от настроек программы пользователям, входящим в эти группы, может как предоставляться, так и запрещаться доступ. То есть если необходимо ограничить большинство пользователей, то указываются только те, которым он разрешен. Но если, например, в интернет-кафе необходимо закрыть доступ только для учетной записи «Гость», то удобнее поступить наоборот. Теперь, когда пользователь регистрируется в системе, агент производит

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


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

Рисунок 1. Программа может использовать Active Directory

опрос Active Directory или локальных настроек на предмет наличия у него разрешений, позволяющих работать с устройствами. Если пользователь не является членом соответствующей группы, доступ будет блокирован. На сайте проекта [1] доступна полнофункциональная версия GFI LANguard P.S.C., которая становится freeware по истечении 30-дневного срока или если не введен 60-дневный тестовый ключ. Последний будет автоматически прислан на ваш почтовый ящик. Свободная версия позволяет полноценно контролировать работу устройств только на 5 компьютерах. Учитывая, что большинство имеющихся свободных утилит работают только с одним компьютером, удаленное управление является несомненным плюсом GFI LANguard P.S.C. Для свободной версии не доступна официальная поддержка компании, только user-to-user на форуме http://forums.gfi.com. Системные требования Windows 2000/2003 или XP. Естественно, пользователь не должен иметь на локальном компьютере привилегий администратора, иначе ему ничего не стоит убить процесс в списке задач. Программа имеет простой и понятный интерфейс (рис. 2). Слева находится «Tools Explorer», при помощи которого выбираются устройства, справа выводятся доступные опции. Для того чтобы настроить доступ к устройству, находим его в списке и внизу появившегося окна нажимаем кнопку Add. Теперь выбираем тип объекта, его местонахождение и имена объектов. В качестве последнего можно использовать:

№10, октябрь 2005

! ! ! !

Рисунок 2. GFI LANguard P.S.C. имеет простой и понятный интерфейс

Выводимое имя – Иван Иванович. Имя объекта – accounting_computer. Имя пользователя – chief. Имя объекта и имя домена – chief@supercompany.com или supercompany.com\chief.

Если необходимо указать сразу несколько объектов, прописываем их через точку с запятой. Для удобства во вкладке «Дополнительно» реализована возможность поиска пользователей в указанном месте. Для проверки правильности ввода имен объектов воспользуйтесь кнопкой «Проверить имена». В последнем случае будут выведены неправильно введенные имена, и утилита предложит исправить информацию либо удалить неправильный объект из списка. После выбора всех объектов указываем, какое действие должен предпринять агент при попытке получения доступа к устройству. Установка флажка в пункте «Allow only the users and members of the groups below to access the device» позволит выбранным пользователям и группам получить доступ к устройству. Если же, наоборот, требуется, чтобы перечисленные объекты не могли получить доступ к устройству, выбираем «Allow all users except the users and members of the groups below to access the device». Настройки сохраняются в зашифрованном файле, который теперь необходимо передать на остальные компьютеры. Для этого переходим к пункту «Tools – Deploy GFI LANguard P.S.C. agents tool», указываем компьютеры, на которых будет устанавливаться агент. Здесь вводим либо IP-ад-

рес отдельного компьютера, либо целой сети, можно использовать и предварительно записанные в файл адреса. Во время первой установки выбираем «Deploy the GFI LANguard P.S.C. control access agent(s)». При работе с агентами по умолчанию используются текущие регистрационные данные пользователя, при необходимости здесь же можно указать индивидуальные логин и пароль. Для того чтобы изменения вступили в силу удаленный компьютер следует перезагрузить. В отдельном окне можно написать сообщение, которое будет выведено на экран перед перезагрузкой. После нажатия кнопки Start запустится процесс установки агентов, по окончании которого будет выведен их список. В дальнейшем при обновлении параметров агентов следует использовать пункт «Update configuration settings of the GFI LANguard P.S.C. control access agent(s)». Как видите, GFI LANguard P.S.C. является простой в настройке программой с хорошей функциональностью. А возможность бесплатного применения в маленьких (до 5 компьютеров) сетях делает ее ценным инструментом для небольших организаций или удаленных офисов.

Литература, ссылки: 1. Сайт проекта GFI LANguard Portable Storage Control – http://www.gfi.com/ lanpsc. 2. Бешков А. DeviceLock. – Журнал «Системный администратор», №3, 2004 г. – 38-41 с. 3. FreeWare утилита Lock and Go – http:// www.lockngo.com/products/lockngo.

33


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

Linux/BSD как бастион на пути вирусов

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

Крис Касперски 34


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

П

очему Windows NT небезопасна? Почему в ней обнаруживаются все новые и новые дыры? Вопрос абстрактный, но мы всетаки постараемся дать на него ответ. Начнем с того, что умных людей в Microsoft осталась не так уж и много, налицо явная текучка кадров. Опытные специалисты покидают «империю зла» и уходят в другие компании. Достаточно вспомнить памятный скандал с менеджером, в которого Стив Балмер зашвырнул креслом (от такого руководителя я бы и сам ушел) – http://www. cnews.ru/news/line/index.shtml?2005/09/ 06/186136 и http://russian.joelonsoftware. com/Articles/HowMicrosoftLosttheWaron A.html – последний источник рассказывает о переменах, происходящих внутри Microsoft, и деградации операционной системы. Падение культуры программирования легко проследить с помощью дизассемблера. Если MS-DOS 6.x еще содержала огромное количество ассемблерного кода, а Windows 95 представляет собой настоящий шедевр оптимизации (без всякой иронии!), запрограммированный на смеси ассемблера с чистым Си, то в Windows 98 уже доминирует Си++, «мастера» и прочие автоматические кодогенераторы, заменившие живой ум. Windows NT 4.x (которая, как известно, создавалась приблизительно в то же самое время, что и Windows 95, только другим коллективом программистов) – это блестяще оптимизированная, хотя и слишком навороченная система, запрограммированная руками и головой, но в Windows 2000 и тем более XP уже доминирует Си++ и «мастера». Программисты старого поколения так не поступают! Вывод – все это писали новички, со всеми вытекающими отсюда последствиями. В дизассемблере код выглядит просто ужасно. Поражает даже не тяжеловесность, а… «рассосредоточенность» кода, тонким слоем размазанного по куче функций. В частности, никакой единой функции переключения контекста в Windows NT нет! SwitchContext – это только малая часть, весь остальной код размазан по всему ядру, регистры многократно сохраняются/восстанавливаются в разных местах, делается куча проверок на допустимость их значений и т. д. Сетевые компоненты выглядят еще хуже.

№10, октябрь 2005

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

равно придется менять, попутно обновляя «железо», что выливается в солидные расходы и вызывает множество проблем от необходимости обучения персонала до «старые программы не запускаются». Про то, что заплатки занимают огромный объем и для их перекачки необходимо иметь по меньшей мере DSL-модем, мы промолчим. К тому же реально воспользоваться Windows Update все равно не удастся. Задумайтесь, что произойдет, если операционная система упадет? Ведь после установки с дистрибутивного диска выходить в Интернет и качать заплатки ни в коем случае нельзя, ведь в эти минуты наш узел совершенно беззащитен перед хакерами, а вероятность атаки не так уж и мала, особенно если вспомнить про червей, которые стучатся во все компьютеры подряд. Теоретически можно скачать заплатки в виде отдельных файлов, сохранив их на любом носителе, но… тогда придется разбираться в них самостоятельно, а это не так-то просто, поскольку заплатки содержат зависимости и абы как не встают или встают, но не работают. Исчезает самое главное преимущество Windows – простота управления. Воздвигнуть NT-сервер и оставить его без присмотра сегодня уже не получится. Если только не нанять администратора, разбирающегося в безопасности, с высокой степенью вероятности сервер будет взломан. Тоже самое относится и к домашним машинам. Вирусы так и прут! Они создают излишний трафик, воруют пароли и другую секретную информацию или просто нарушают нормальную работу операционной системы, вызывая сбои и зависания, убытки от которых зачастую весьма значительны. Давайте посмотрим, что в этой ситуации можно предпринять…

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

35


безопасность кладных службах (например, DCOM), без которых в принципе можно и обойтись, но не всегда легко отключить через пользовательский интерфейс. Причем, если дыры в прикладных службах элементарно закрываются брандмауэром (конечно, при условии, что без этой службы действительно можно обойтись), то атакам на драйвера брандмауэры противостоять практически не в силах (ну разве что это будет специальным образом спроектированный брандмауэр, которых нет и навряд ли когда будут). Антивирусы и прочие защитные системы подобного типа здесь также бессильны. Да, они ловят вирусы, но только если знают о них. Нашумевших вирусов не так уж и много, и все чаще и чаще приходится сталкиваться с локальной заразой, обитающей в ограниченном ареале и исчезающей, прежде чем разработчики антивирусов узнают о ней. Единственным способом обороны остаются заплатки, но они недостаточно эффективны в силу уже упомянутых причин. Другая популярная мишень – браузер. Слово «Интернет» уже давно стало синонимом «IE», и атакуют преимущественно его. Несмотря на то что IE поддерживает целый комплекс мер безопасности, он ломается без особых проблем. В лучшем случае атакующий берет под контроль только сам IE, в худшем же – захватывает всю операционную систему. Достаточно зайти на страницу, содержащую зловредный код и… Самое неприятное, что такой код может содержаться даже на «престижных» сайтах, например, в гостевой книге, в которую могут писать все желающие и которые далеко не всегда выполняют качественную фильтрацию HTML-содержимого. Жесткая настойка политик безопасности до некоторой степени уменьшает вероятность успешной атаки, но не исключает ее полностью. Большинство дыр (таких, например, как переполнение буфера при обработке bmp-файлов) остаются открытыми и устраняются только заплатками, про проблемы которых мы уже говорили. Установив альтернативный браузер (например, FireFox), мы будем практически полностью застрахованы от подобных атак, однако вместе с браузером еще потребуется другой почтовый клиент (например, Thunderbird), поскольку стандар-

36

тный Outlook Express негласно использует IE для отображения HTML-писем, которые являются идеальным средством атаки, и множество червей распространяются именно так. Третья и последняя мишень – сам человек, клюнувший на предложение, «от которого нельзя отказаться», и запустивший исполняемый файл (зачастую замаскированный под графическую картинку или что-то другое). Ну что тут можно сказать? Теоретически достаточно строго-настрого запретить всем пользователям запускать что бы то ни было, скачанное из сети или полученное по электронной почте, только ведь все равно они будут качать и запускать. За всеми не уследишь и не остановишь! Организационные меры уже доказали свою неэффективность, и проблему можно решить только техническим путем. Самое простое – запускать FireFox и Thunderbird из-под специального пользователя, с минимальными правами, не имеющего доступа ни к каким файлам, кроме файлов самой программы. И хотя в Windows уровень привилегий легко может быть повышен в обход всех защит, подавляющее большинство атакующих программ до этого еще не доросли, и такая мера достаточно эффективна. А вот пример неверного, но весьма популярного решения – ставим виртуальную машину с Windows, устанавливаем на ней Лиса с Птицей и связываем виртуальной сетью с основной машиной. На первый взгляд – все прекрасно. Атакующий может воздействовать на браузер, но из застенков виртуальной машины он никуда не выберется, а там все равно нет ничего интересного, кроме кэша браузера, и еще, быть может, почтовой базы, которую в принципе можно расположить и на отдельной виртуальной машине, благо в VMWare между ними легко переключаться. Проблема в том, что если основная машина доступна по виртуальной сети (а если она не будет доступна, то как прикажете выходить в Интернет?), атакующая программа сможет воздействовать на основную операционную систему, через имеющиеся в ней дыры, так что такая схема все равно не очень надежна, хотя большинство распространенных вирусов она отсекает сразу, только необходимо следить, чтобы на виртуальной машине не образовался «зоопарк»,

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

ведь вирусы имеют тенденцию заражать все, к чему прикасаются… Хорошо, цели атаки определены. Будем строить оборонительные сооружения!

Среди пингвинов Некоторые организации предпринимают попытки полного перехода на Linux/ BSD, однако при этом возникает большое количество труднопреодолимых проблем. Далеко не для всего оборудования можно найти драйвера. Даже если данная видеокарта или другое устройство входит в список поддерживаемого железа, далеко не факт, что составитель дистрибутива действительно протестировал ее и она согласится работать как надо. На многие сканеры и другую периферию драйверов вообще нет. В Linux / BSD все не так, как в Windows, и пользователей приходится переучивать, но кто их будет переучивать? И кто будет нести расходы? А если приходит новый сотрудник? К тому же Star Office – это все же совсем не Microsoft Office, и хотя он может открывать некоторые Office-документы, реально с ним работать невозможно (разве что из горячей любви к Linux или отсутствию альтернативы). Наконец практически на любом предприятии так или иначе используются специализированные программы, как правило написанные на DELPHI и не имеющие прямых аналогов в мире Linux. Теоретически их можно перенести и на другие платформы, но фирмы-разработчики пока не видят в этом никакого смысла, поскольку Linux-рынок еще не сложился. Хотим ли мы того или нет, но отказаться от использования Windows на рабочих станциях пока невозможно. Примем это как факт и подума-


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

Схемы построения защитного бастиона Рассмотрим для начала сеть небольшой организации с десятком клиентских машин и одним выделенным компьютером – сервером. На клиентские машины лучше всего поставить Windows 2000/XP с FireFox и Thunderbird, запущенными из-под наименее привилегированного пользователя без прав доступа ко всем файлам, кроме файлов программы (хотя лично я из браузеров предпочитаю консольный links, который очень надежен в плане безопасности, но устанавливать его на компьютер секретарши может только администратор-садист). На сервере устанавливается любая UNIXподобная операционная система (Linux или BSD), поднимается HTTP-proxy и либо собственный почтовый сервер, либо транслятор портов, либо брандмауэр уровня приложений, играющий роль POP3/SMTP-proxy. Впрочем, простейший proxy для почты можно написать и самостоятельно – он не займет и сотни строк на C/Perl. Полноценный выход в Интернет клиентским машинам лучше всего не давать, поскольку в этом случае они могут быть легко атакованы извне. А вот работа через Linux/BSDбастион на основе proxy-сервера позволяет отказаться от установки заплаток на Windows-машины, поскольку теперь их можно атаковать только изнутри сети, а против внутрисегментных атак даже залатанные системы все равно незащищены. Как вариант можно установить SOCKS-proxy сервер (подобнее об этом можно прочитать в статье «Универсальный прокси-сервер» Валентина Синицына, опубликованной в февральском номере «Системного Администратора» за 2005 год) и предоставить клиентам практически полноценный доступ в Интернет. Взаимодействие через SOCKS-proxy снимает многие проблемы. Так, например, не требуется специальная настройка клиентского программного обеспечения

№10, октябрь 2005

(достаточно просто установить proxyклиента), и программы, не умеющие работать через HTTP-proxy, скорее всего заработают через SOCKS, однако не все. Ведь proxy – это все-таки proxy, со всеми вытекающими достоинствами и ограничениями. Внешние подключения запрещены (точнее – невозможны), и если только не устроить трансляцию портов специально, атакующий не сможет увидеть ни одного клиентского узла! (Однако необходимо помнить, что от атак на приложения, например, на браузер, proxy не защищает.) Предложенная схема (см. рис. 1) отличается высокой надежностью и простотой управления. Современные дистрибутивы Linux/BSD ставятся из «коробки» не хуже, чем Windows, и с настройками по умолчанию работают вполне достойно. Времена колдовства и плясок с бубном уже прошли. Конечно, гуру тут же скажут, что все это ерунда и настройки по умолчанию неправильны/небезопасны/непроизводительны. На то они и гуру. Их хлеб – темные магические ритуалы, после которых система буквально преображается, только вот… жизненно важной необходимости в этом нет. Дыры в Linux/BSD практически отсутствуют (во всяком случае в новых сборках, скачанных с официального сервера, а не купленных в ближайшем ларьке) и настройки по умолчанию в последнее время стали вполне продуманными. Во всяком случае BSD-сервер даже в штатной конфигурации защищен намного лучше, чем Windows. Многие организации именно так и поступают. На внешний сервер ставят BSD (или Linux), а на внутренние машины – Windows 98, Windows XP и т. д., так что в этом решении нет ничего нового или экзотического. Кстати говоря, львиная доля дыр Linux/BSD-серверов приходится отнюдь не на саму операционную систему, а на установленное поверх нее программное обеспечение – Sendmail, Apache и т. д. Это сложные программные комплексы, содержащие огромное количество строк исходного кода, в которых запутались даже сами разработчики. Их очень сложно настраивать и еще сложнее отлаживать. Чем «легче» будет proxy-сервер, тем меньше вероятность, что в нем будут дыры.

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

В принципе можно установить и несколько серверов, соединив их последовательно друг с другом. Внешний сервер «видит» только своего внутреннего собрата, и локальная сеть ему недоступна (см. рис. 2). Если на одном из серверов будет стоять Linux, а на другом BSD, то хакеру, чтобы проникнуть в локальную сеть, придется взломать сразу обе системы, что довольно затруднительно, если не сказать маловероятно. Proxy-сервер можно ставить как на внешнем сервере (а на внутреннем поднимать NAT), либо, наоборот, прятать proxy за внешним сервером, на котором стоят NAT плюс брандмауэр. Каждое решение имеет свои сильные и слабые стороны, но все-таки лучше размещать proxy на внешнем сервере и вот почему: если в нем вдруг окажется дыра (а она там окажется) и хакер захватит контроль над узлом, его остановит внутренний сервер. Напротив, NAT сам по себе никак не защищает внутренний proxy от атак (ну, практически не защищает), и если хакер сумеет его взломать, он тут же получит доступ во внутреннюю сеть, в которой находятся слабо защищенные машины с Windows! А вот веб-сервер (если он только есть) лучше всего разместить на внешнем сервере, ни в коем случае не совмещая его с тем узлом, который имеет доступ во внутреннюю сеть. Вебсервер – это очень-очень сложный агрегат, в нем неизбежно присутствуют ошибки, и потому веб-сервера ломают чаще всего!

Домашние сети – проблемы и решения Для дома или мелкого офиса выделять одну из машин в отдельное «де-

37


безопасность сем немного памяти, Windows лопроизводство» чаще всего работает на «живом» оборунеприемлемо, хотя собрать довании с полной скоростью, сервер на основе устаревшесамоотверженностью и отдаго оборудования, оставшегочей, а защищенность ничуть ся от апгрейда, может пракне хуже, чем в случае выдетически каждый. Linux/BSDленного компьютера. Захвасерверам не нужен монитор, тывающие перспективы, не а при желании можно обойправда ли? Но обо всем по тись и без жесткого диска, порядку! в результате чего расходы Для начала нам потрена безопасность окажутся не буется выбрать эмулятор. так уж и велики, тем более что Это должен быть очень быстдомашняя сеть из 2-3 машин рый эмулятор, к тому же подуже не редкость, а норма, так держивающий виртуальную почему бы не поставить еще сеть, достаточно надежный в одну машину, не установить Рисунок 3. Настройка PPP-соединения с помощью программы KPPP работе и по возможности дена нее LINIX/BSD и не попроэмулятор (Linux/BSD) → Windows (се- шевый, впрочем, учитывая специфику бовать себя в роли администратора? российского рынка, цена продукта не Но давайте все-таки исходить тевые компоненты). Первый способ наиболее очевиден, является решающим фактором, осоиз того, что компьютер у нас один, причем это далеко не самый мощный но он не обходится без проблем. Во- бенно для домашних сетей. Классический выбор – это, кокомпьютер (например, P-III), и поку- первых, для достижения приемлемой пать еще один мы не можем/не хотим, производительности мы должны иметь нечно же, VMWare, достойных конкупредпочитая использовать виртуаль- довольно мощный компьютер и много рентов которому пока не наблюдаетоперативной памяти, что противоречит ся. Единственный недостаток – вирные машины. Возможных вариантов построе- условиям задачи, во-вторых, Windows, туальная сеть достаточно сложно нания сети всего два – установить на ос- запущенная из-под эмулятора, не име- страивается, и неспециалистам приновную машину Linux/BSD, запуская ет прямого доступа к оборудованию ходится попотеть, прежде чем она заWindows под эмулятором или, наобо- и это оборудование не может реали- работает. Остальное никаких проблем рот, запихать Linux/BSD в эмулятор зовать свой функционал, а зачастую не вызывает. Устанавливаем эмулятор, создаем новую виртуальную маи предоставить ей прямой доступ в Ин- отказывается работать вообще! Второй способ всех этих недостат- шину с настойками по умолчанию, водтернет в обход Windows. Тогда выход в сеть будет осуществляться по сле- ков лишен. Ему не нужен высокопроиз- ружаем на нее Linux или BSD, а затем дующей схеме: компьютер (железо) → водительный (а, значит, весьма доро- даем ей доступ к физическому оборуWindows (несетевые компоненты) → гостоящий) процессор и требуется сов- дованию. Если выход в Интернет осущестQEMU как альтернатива sourceforge.net), но работающий в десятки вляется через Dial-Up по COM-модему, VMWare раз быстрее его и ничуть не уступающий заходим в настройки виртуальной маVMWare – это замечательный эмулятор, VMWare по производительности (а на не- шины («VM → Setting») и открываем доглавные и, пожалуй, единственные недо- которых задачах даже обгоняющий ее), ступ к физическому порту, на котором статки которого – высокая стоимость ($200 совершенно бесплатный, портированный «висит» модем («Hardware → Add → по текущему прайсу) и отсутствие исход- под множество платформ (и Linux/BSD/ Serial Port → Use physical serial port on ных текстов. За эти деньги можно свобод- Windows в том числе), имеющий кучу раз- the host → COMx»). Причем VMWare вино купить подержанный компьютер без мо- ных расширений на все случаи жизни от не- дит не только настоящие физические порты, но и порты, созданные драйнитора, создать выделенный Linux-сервер зависимых разработчиков и т. д. и не мучиться. Исходные тексты нужны Виртуальная сеть, в отличие от VMWare, верами различных устройств, наприне только для удовлетворения любопытс- встает сама, не требуя никакой настройки, мер, GPRS-драйвером сотового телетва. Вот, например, если VMWare не видит что и плохо, и хорошо одновременно. С од- фона или софт-модемом, что снимает виртуальную карту DSL-модема, то нам ос- ной стороны, мы можем организовать вы- проблему поиска драйверов под Linux/ тается только развести руками, а при их на- ход в Интернет через модем без плясок BSD. Ну а найти драйвер стандартличии можно было бы разобраться почему с бубном, с другой стороны, обеспечить ного модема – не проблема, тем ботак и устранить проблему. Даже если это «физический» доступ к сетевой карте уже лее что для распространенных модене можем сделать мы, наверняка сможет не получится и придется либо ковырять ис- лей существуют и «родные» драйвекто-нибудь другой. ходные тексты, либо искать дополнитель- ра. Остается только настроить выход Поэтому имеет смысл рассмотреть ные расширения, которые не всегда рабо- из Linux в Интернет. Проще всего воси бесплатные эмуляторы, из которых нам тают стабильно и к тому же требуют обя- пользоваться популярной програмбольше всего подходит QEMU (http://fabrice. зательной перекомпиляции QEMU, поэто- мой KPPP, которая по легкости управbellard.free.fr/qemu). Это динамический эму- му выбор конкретного эмулятора остает- ления ничуть не отличается от своего Windows-аналога, если даже не прелятор, основанный на BOCHS (http://bochs. ся за вами.

38


безопасность восходит его (см. рис. 3). Теперь ин- ма Windows при этом будет «засвечесталлируем HTTP/POP3/SMTP-proxy на» в Интернете лишь частично, что заи все! Выбор конкретных программ щитит ее от подавляющего большинсможет быть любым. Тут все зависит тва атак. Тем не менее поскольку сеот конкретных вкусов и предпочтений. тевые пакеты проходят через многие В офисной сети, наверное, лучше бу- Windows-компоненты, потенциальдет использовать знаменитый squid, но не свободные от дыр, в принципе но для дома это слишком уж тяжело- атака все-таки возможна, но это уже весное решение. Лично у меня при- из области паранойи и теоретических жились small http-proxy (http://home. абстракций. lanck.net/mf/srv/), pop3proxy (http:// Основная проблема состоит в том, www.quietsche-entchen.de/download/ что VMWare не позволяет выбирать pop3proxy-1.2.0.tar.gz) и smtpproxy к какой именно «физической» кар(ht tp://w w w.quietsche - entchen.de / те она подключается и по умолчанию download/smtpproxy-1.1.3.tar.gz), хотя выбирает первую обнаруженную карэто далеко не самое лучшее реше- ту. Если компьютер не имеет никаких ние, и гурманы программного обеспе- других сетевых карт, кроме той, что усчения наверняка подберут что-то свое. тановлена DSL-модемом, все хорошо Из SOCKS-proxy я предпочитаю Dante и мы можем не переживать, но сто(http://www.inet.no/dante). Не столько ит воткнуть одну или несколько «наиз-за его качеств, сколько из-за того, стоящих» Ethernet-карт (или задейсчто он написан и распространяется на твовать Ethernet-карту, интегрированбесплатной основе горячими парнями ную в материнскую плату), как вириз Норвегии – родины моей любимое туальная карта сойдет с пьедестагруппы Sirenia (такое мрачное оркест- ла, и все пойдет наперекосяк. Если ровое хоральное готическое пение). так, говорим: «Edit → Virtual Network С DSL-модемами в этом плане чуть- Setting → Automatic Bridging → Excluded чуть труднее. В принципе VMWare поз- Adapters → Add» и перечисляем сетеволяет эмулируемому приложению ви- вые адаптеры, которые мы не хотим исдеть физические USB-порты («VM → пользовать в виртуальной сети. Setting → USB Controller → Automatically Другая проблема состоит в том, connect new USB devices to this virtual что VMWare может не «увидеть» вирmachine when it has focus») (см. рис. 4), туальную сетевую карту, и тогда свяно поиск под ходящего драйвера зать ее с Linux не получится. Надеждля USB DLS-модема под Linux мо- нее всего использовать DSL-модежет стать непреодолимой проблемой, мы с Ethernet-портом, подключаемые поскольку не для всех моделей та- к физической сетевой карте, котокие драйверы есть. Правда, тут мож- рую VMWare увидеть просто обязано схитрить. Установить «родной» на. Ну а настроить DSL-модем из-под Windows драйвер – как правило, он создает виртуальную сетевую карту и встраивает ее в TCP/IP-стек, благодаря чему мы можем выходить в Интернет. Если удалить TCP/ IP протоколы, оставив виртуальную карту одну-одинешеньку, никакого Интернета у нас, разумеется, не будет, но тем не менее на физическом уровне пакеты могут беспрепятственно приходить/уходить с нашего узла. Идея состоит в том, чтобы дать Linuxмашине «физический» доступ к виртуальной сетевой карте, связав их в сеть, и тогда Linux сможет выходить в ИнРисунок 4. Настройка доступа к USB-устройствам тернет через Windows, но саиз-под виртуальной машины в среде VMWare

№10, октябрь 2005

Linux сейчас уже не проблема. Во всех или практически всех дистрибутивах на этот случай имеются удобные мастера. В частности в KNOPPIX достаточно нажать «К → Интернет → ADSL\ PPPOE Configuration» и ответить на несколько несложных вопросов.

Заключение Отразить большинство атак вполне реально, хотя за это приходится расплачиваться множеством труднопреодолимых неудобств (покупка дополнительного оборудования или снижение производительности при работе через эмулятор, неполноценный выход через proxy и т. д.). А может… ничего и не надо отражать? Стоит же XP, автоматически забирает свежие обновления из Интернета, на электронном кошельке спокойно лежат деньги, все жужжит и не падает… Так ведь на жителей Помпеи долгое время тоже ничего не падало, а потом в один миг небо почернело, и на город обрушились камни и пепел. Беда никогда не предупреждает о своем приходе, и восклицание «еще вчера все работало» служит очень слабым утешением. Можно тысячу раз «смело» выходить в Интернет, не боясь ни вирусов, ни хакеров, но только хакерам все равно, боитесь вы их или нет. И если атака окажется успешной… впрочем, о последствиях успешной атаки лучше не говорить. Зачастую они весьма плачевны. Мы ни к чему не призываем, ни за что не агитируем и ни от чего не отговариваем. Некоторые считают, что Windows XP – это достаточно защищенная система, и им ничего не грозит. Другие же не чувствуют себя в безопасности даже за каменной стенной proxy-сервера, окруженного по периметру брандмауэром. Воздвигнуть защищенную систему легко, сложнее подобрать оптимальную политику безопасности, сочетающую комфорт и надежность. Описанная схема на эту роль совсем не претендует. Это крепость параноика, который защищается от всего мира, потому что боится, что именно в этот момент кто-то смотрит в него через прицел.

39


web

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

– Это я знаю, а кроме меня это знает каждый. Я не желаю слышать от вас то, что знает каждый. Ваша работа – сообщать мне то, что никто не знает, то, что даже мне неизвестно. – У меня такие сведения есть. «Выбор» Виктор Суворов

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

С

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

40

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

кие страницы сайта не попадут под индексацию. Если о первом начинающим веб-мастерам еще говорят на курсах и пишут в книгах, то наличие второго сохраняется в тайне. Поэтому увидев в журнале веб-сервера запись о том, что запрашивался отсутствующий файл robots.txt (“GET /robots.txt HTTP/1.0” 404), администратор в панике бросается за советом на форумы. Сегодня этот файл используют приблизительно 5-6% сайтов. В остальных он либо совсем отсутствует, либо имеется, но с пустыми параметрами. Хотя вполне вероятно, большинству сайтов действительно нет нужды в ограничениии доступа, но на серьезных проектах такой возможностью пренебрегать просто опасно. После


web того как робот пройдется по каталогу cgi-bin, точно можно ждать гостей. Но обо всем по порядку.

Назначение Robots Exclusion Protocol Впервые вопрос о разработке механизмов, позволяющих ограничить доступ роботам к различным страницам сайта, возник приблизительно в 19931994-м, когда появились первые сообщения об утечке информации. Robots Exclusion Protocol разработан в 1994-м Мартином Костером (Martijn Koster) и представляет собой стандартный протокол, который сегодня соблюдает большинство сканеров. Он содержит правила (Robot Rules) исключений для различных роботов индексации, поиска или зеркалирования веб-серверов. И как результат позволяет удалить из индекса весь сервер, каталог, отдельный документ, либо файлы с определенным расширением. Располагается такой файл в корне веб-сервера, т.е. набрав, например, адрес http:// www.foo.com/robots.txt, вы должны его получить. Размещать же его в других каталогах бессмысленно, поскольку учитываться роботом он не будет, как, например, http://www.foo.com/admin/ robots.txt. Но для каждого порта http/ https должен быть создан отдельный файл. Робот, а также многие утилиты, позволяющие скачать весь сайт целиком, первым делом пытаются считать этот файл. Получив положительный ответ (2хх), производится грамматический разбор файла и в дальнейшем при работе применяются ограничения применительно к этому роботу. Если ответ сервера указывает, что ресурс не существует (код статуса 404), то робот продолжает работать без каких-либо ограничений. Поведение роботов при получении ответов, отличных от описанных выше, рекомендовано в [2]. Если ответом сервера является код 401/403 (нет прав/доступ запрещен), указывающий на ограничение доступа, то робот должен считать, что пытается получить доступ к полностью закрытому сайту, и прекратить работу. Когда приходит ответ, говорящий о недоступности ресурса, робот откладывает визит до восстановления работоспособности сайта. При получении ответа, указывающего на переадресацию (3хх), робот должен следовать

№10, октябрь 2005

за ссылками до обнаружения ресурса. Но этих рекомендаций роботы могут не придерживаться. Так Google-бот не интерпретирует ответ 401/403 на обращение к файлу robots.txt, как запрет на сканирование страниц сайта. К сожалению, на сегодня еще много до конца так и не решено. Во-первых, робот его может просто проигнорировать. Не до конца ясен вопрос с кешированием файла. Если веб-мастер часто изменяет его содержание, робот может использовать раннюю версию. Пока стараются придерживаться 24-часового интервала кеширования, хотя некоторые роботы проверяют дату или размер и в случае несоответствия считывают файл заново. Кроме того, некоторые веб-мастера увлекаются составлением параметров, пренебрегая общими каталогами и регулярными выражениями, что приводит к увеличению размера файла. Как поведет себя робот в этом случае, сказать трудно, в общем случае файл кешируется частично или не кешируется вообще. Также стоит помнить, что файл robots.txt не гарантирует абсолютной безопасности веб-сайта. Злоумышленник с его помощью может получить информацию об областях сайта, которые веб-мастер пытается скрыть, а спамерский робот может просто его проигнорировать. Но в случае «персонального» интереса к определенному сайту будут перебираться все варианты, а применение robots.txt по крайней мере не приведет на ваш сайт случайных гостей.

Формат файла robots.txt Стандарт, в котором описано содержимое файла, можно найти в [1]. В данном документе отмечено, что, используя этот файл, можно также указывать для индексации конкретному роботу специально оптимизированные под него веб-страницы, а это может привести к некоторому увеличению посещаемости ресурса. Это обычный текстовый файл в LDIF-формате, состоит из параметров и значений, разделенных между собой двоеточием. Записи не чувствительны к регистру. По одному параметру в строке. Знак «#» означает комментарий и строка далее игнорируется. Параметр User-agent указывает на специфическое имя, которое имеет любая программа-клиент, предназначенная для доступа к веб-данным.

Возможна запись нескольких robotid в одном поле, в качестве разделителя в этом случае используется пробел или табуляция. Данный параметр будет учитываться только программами роботами, для веб-браузеров установить таким образом ограничения не получится. Список всех robot-id можно получить в [5]. Например, правило для Google будет начинаться так: User-agent: googlebot

(или Googlebot для лучшей читаемости). Робот, найдя правило, совпадающее с его именем, будет действовать согласно установленным специально для него ограничениям, если таковые имеются. Не найдя индивидуального правила, робот решит, что для него ограничения не установлены. Если необходимо указать правила, действующие для всех роботов, используется знак звездочка – «*». Но если поисковый робот обнаружит в файле /robots.txt несколько записей, совпадающих с его значением robot-id, то робот может выбрать любую из них. После прописываются ограничения с применением конструкций Disallow/Allow, пустой параметр означает отсутствие ограничений. Возможно задание двух значений в поле Disallow/ Allow, но это не рекомендуется, так как в будущих спецификациях это может быть изменено. Например: User-agent: fast Allow: /info/ User-agent: googlebot aspider Disallow: /images/ Disallow: /cgi-bin/ /1251/ Disallow: /changelog.html User-agent: * Disallow:

При задании имени необходимо учитывать, что можно использовать как частичную, так и полную ссылку. Например, /changelog позволит исключить из индексации не только файл changelog.html и подкаталог changelog со всем содержимым, но все файлы и каталоги, имена которых начинаются с changelog. А параметр /changelog/ затронет только подкаталог changelog. Отсюда если будет задана маска /t, то из поиска будет исключено все, что начинает-

41


web ся с буквы t. Для удобства можно использовать регулярные выражения. Например, чтобы исключить из индексации все рисунки, используем: Disallow: *.gif$

Динамически генерируемые страницы убираются так: Disallow: /*?

Использование мета-тегов Другим более удобным при работе с отдельными страницами стандартом является использование тега <META>. С его помощью можно также указать роботам на то, что индексировать страницу не надо. Для этого в раздел <HEAD> добавьте следующую строку: Disallo<META NAME="ROBOTS" ↵ CONTENT="NOINDEX, ↵ NOFOLLOW">w: *.gif$

Если необходимо указать то же только роботу Google, можно написать так: <META NAME="GOOGLEBOT" ↵ CONTENT="NONE">

Работающие по стандарту поисковые сервера, должны исключить данную страницу из своих баз, кроме того, робот не будет следовать за внешними ссылками. Можно также указать роботу, что документ генерируется динамически. В этом случае он не будет его индексировать. <META NAME="DOCUMENT-STATE" ↵ CONTENT="DYNAMIC">

В этом случае бывает полезно указать, что индексировать необходимо другой документ. <META NAME="URL" ↵ CONTENT="/help.html">

му были разработаны утилиты, позволяющие быстро и без усилий проделать эту работу. Так, RoboGen [8] представляет соб о й в и зуа л ьн ы й редактор доступный под все версии Windows, позволяющий управлять доступом к файлам и каталогам на неРисунок 1. Утилита RoboGen «знает» о 180 пользовательских скольких серверах. агентах Поддерживает загрузку по ftp, знает о 180 пользова- может создавать каталоги-ловушки. тельских агентах (user-agents) (рис. 1) Если робот попытается прочитать таи 10 основных типов поисковых движ- кой каталог, то его запросы также будут ков. При необходимости пользователь перехватываться. Модуль также может может самостоятельно добавлять но- среагировать и соответственно блокивую информацию в базу данных поль- ровать роботов, охотящихся за почтовыми адресами. Имеет настраиваемый зовательских агентов и движков. На сайте проекта доступны две вер- список известных спамерских роботов. сии Standard и Limited Edition (последняя К сожалению, последняя версия 0.6, freeware), сравнение основных возмож- датированная 3 ноября 2002 года, подностей которых приведено в RoboGen держивает только Apache 1.3. Порт для Comparison Chart http://www.rietta.com/ второй версии Apache и для IIS, к сожаrobogen/comparison.shtml. Кроме того, лению, так и не состоялся. Это, наверотдельно доступна утилита RoboTag 1.5 ное, беда многих хороших OpenSource(http://www.rietta.com/downloads/robogen/ проектов. Остальную информацию вы можете RoboTag.zip), входящая в поставку RoboGen SE и LE. При ее помощи мож- найти в документации. Успехов. но создавать мета-теги для вставки Ссылки: в html-файлы (рис. 2).

Усиленная блокировка с Robotcop Не менее интересными возможностями обладает Robotcop [9], представляющий собой модуль к веб-серверу Apache, написанный на С и распространяемый в исходных кодах. Он отслеживает правильность работы поисковых роботов, если робот не подчиняется указанным для него правилам, то Robotcop принудительно его ограничивает, блокируя на некоторое время клиентский IP. Кроме того, веб-мастер

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

42

Рисунок 2. Утилита RoboTag позволяет сгенерировать мета-теги для вставки в html-файл

1. Описание протокола robots.txt – http:// www.robotstxt.org/wc/robots.html, http:// info.webcrawler.com/mak/projects/robots/ norobots.html. 2. A Method for Robots Control – http://www. robotstxt.org/wc/norobots-rfc.html. 3. Robot Exclusion Standard Revisited – http://www.kollar.com/robots.html. 4. ЧАВО по веб-роботам – http://info. webcrawler.com/mak/projects/robots/faq. html. 5. Расширенный список всех роботов – http://info.webcrawler.com/mak/projects/ robots/active/all.txt. 6. Информация Google для веб-мастеров по удалению своего сайта из поисковой машины – http://www.google.com/ webmasters/remove.html. 7. Who’s Knocking on the Door? – http:// country-art.com/class/robotstxt.htm. 8. Сайт проекта RoboGen – http://www. rietta.com/robogen/index.shtml. 9. Сайт проекта Robotcop – http://www. robotcop.org.



web

В чем сильные и слабые стороны HTTP digest-авторизации

АЛЕКСЕЙ МИЧУРИН Среди всех средств, предоставляемых протоколом HTTP, digest-авторизация стоит особняком. Почему? Чем она отличается от вездесущей basic-авторизации? Каковы её сильные и слабые стороны? Насколько хорошо она поддержана различным ПО и когда уместно её использовать?

В

протоколе HTTP предусмотрено два типа авторизации. Basic-модификация получила весьма широкое распространение. «Системный администратор» уже писал о нём (№5, 2005 г., 88-92 с.). Тогда были детально рассмотрены связанные с авторизацией переменные окружения (AUTH_TYPE, REMOTE_USER, REDIRECT_ REQUEST_METHOD, REDIRECT_STATUS, REDIRECT_URL), особенности взаимодействия механизмов авторизации и переадресации (в том числе при обработке ошибок, возникающих в защищённых зонах). Эти детали одинаковы для basic- и digest-процедур идентификации пользователей, и в настоящей статье мы уже не будем останавливаться на этих вопросах, а полностью сосредоточимся на специфике digest-авторизации. Напомним только, что основным недостатком basic-процедуры является передача пароля в открытом виде. Причём пароль передаётся вновь и вновь при любом обращении к любому документу, находящемуся в защищённой области. Это обстоятельство облегчает перехват пароля и делает протокол ещё более уязвимым.

44

Кроме того, basic-авторизация не даёт возможности «разлогиниться» – прервать сессию. Это естественное следствие того, что никакой сессии и нет – прерывать просто нечего. Basic-процедура не позволяет контролировать количество неудачных попыток регистрации. То есть позволяет «взламывать» защиту методом грубого подбора пароля. Но существует и второй тип защиты – digest-авторизация. Давайте разберёмся, как она работает и какие преимущества даёт.

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


web Вот заголовки обычного HTTP-запроса: GET /a-docs/ HTTP/1.1 Host: 127.0.0.1:9090 User-Agent: Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.7.7) Gecko/20050420 Firefox/1.0.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: ru,en-us;q=0.7,en;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

Сервер рассматривает этот запрос и обнаруживает, что требуемый документ защищён, но запрос не содержит данных для авторизации. Тогда клиенту выдаётся сообщение об ошибке 401. На самом деле в протоколе HTTP не предусмотрено две разные ситуации: «требуется авторизация» и «пароль неверен». Поэтому ответ с кодом 401 не означает «вы ввели неверный пароль» или «введите пароль»; один код используется в обоих случаях. Вот, как выглядят заголовки ответа сервера: HTTP/1.1 401 Authorization Required Date: Tue, 18 Oct 2005 13:04:36 GMT Server: Apache/1.3.33 (Unix) WWW-Authenticate: Digest realm="Realm-A", nonce="3f19e93c8baf99b0fdb9f60d6a228bc61129640676" Keep-Alive: timeout=15, max=98 Connection: Keep-Alive Transfer-Encoding: chunked Content-Type: text/html; charset=iso-8859-1

Как и в случае basic-авторизации, сервер добавил заголовок WWW-Authenticate, в котором сообщил клиенту тип авторизации (Digest), но на этот раз здесь присутствуют два дополнительных параметра: realm и nonce. Realm передаётся и при basic-авторизации, но в digest-процедуре он играет более важную роль, к рассмотрению которой мы ещё вернёмся. Получив такой ответ, клиент (браузер) запрашивает у пользователя имя и пароль для авторизации (рис. 1). Так же, как и в случае basic-авторизации, в диалоговом окне отображается значение параметра realm. Если пользователь откажется от ввода (нажмёт кнопку «Cancel»), то браузер покажет ему страницу, которая пришла с кодом 401 (как и при Basic-авторизации, эта страница загружается не в момент нажатия кнопки «Cancel»). Если же пользователь ввёл имя и пароль и нажал «OK», то на сервер отправляется запрос, снабжённый идентификационной информацией: GET /a-docs/ HTTP/1.1 Host: 127.0.0.1:9090 User-Agent: Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.7.7) Gecko/20050420 Firefox/1.0.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: ru,en-us;q=0.7,en;q=0.3 Accept-Encoding: gzip,deflate Accept-Charset: KOI8-R,utf-8;q=0.7,*;q=0.7 Keep-Alive: 300 Connection: keep-alive Authorization: Digest username="a", realm="Realm-A", nonce="3f19e93c8baf99b0fdb9f60d6a228bc61129640676", uri="/a-docs/", response="60046f788896b2f05dee72e0e9240c4d"

Как видите, теперь в заголовке Authorization передаётся гораздо больше информации, чем при Basic-авторизации.

№10, октябрь 2005

Рисунок 1. Типичный диалог авторизации

Кроме типа авторизации, мы видим здесь пять параметров. Следует заметить, что это один из самых простых случаев. Вообще digest-взаимодействие допускает добрый десяток уточняющих параметров, призванных усилить защиту. Некоторые из них мы ещё обсудим, а пока давайте рассмотрим имеющиеся (все они являются обязательными). ! Параметр username сообщает серверу имя, которое ввёл пользователь. ! Realm – имя засекреченной области. Digest-механизм использует эту информацию для идентификации защищённой зоны. Поэтому этот параметр должен обязательно присутствовать в заголовке Authorization и совпадать со значением realm, переданным сервером в заголовке WWW-Authenticate. Концепцию зон мы рассмотрим чуть ниже. ! Параметр nonce содержит ту же строку, которую передал сервер в одноимённом параметре в ответе с кодом 401. Эта информация используется при вычислении параметра response (см. ниже). ! Uri – абсолютный путь к документу. ! Response – контрольная сумма. Это результат вычисления хэш-функции от комбинации вышеперечисленных параметров и пароля. Обычно вычисляется функция MD5 от строки, состоящей из перечисленных параметров, разделённых двоеточием. Но детали процедуры хэширования зависят от множества обстоятельств, некоторые из которых мы затронем ниже. Получив идентификационную информацию в заголовке Authorization, сервер вычисляет хэш-функцию по тому же алгоритму, что и клиент, и сравнивает с response. Если совпадения не произошло, значит пароль или имя не верны, сервер снова выдаёт ошибку 401, и попытка авторизации повторяется. Если пользователь успешно идентифицирован, то клиенту выдаются обычный заголовок и требуемый документ: HTTP/1.1 200 OK Date: Tue, 18 Oct 2005 13:04:42 GMT Server: Apache/1.3.33 (Unix) Keep-Alive: timeout=15, max=98 Connection: Keep-Alive Transfer-Encoding: chunked Content-Type: text/html; charset=koi8-r

Здесь может присутствовать дополнительный заголовок Authentication-Info, но мы не будем его рассматривать. Пока Apache не имеет никаких возможностей настройки, позволяющих усилить защиту, используя возможности этого заголовка. Модуль digest_module не использует этот заголовок, а модуль mod_auth_digest эксплуатирует его «фиксированным» образом, не допуская никакой ручной настройки.

45


web К рассмотрению модулей Apache мы перейдём в следующей части этой статьи. А здесь осталось сказать, что далее клиент (браузер) передаёт заголовок Authorization автоматически при каждом обращении к защищённой области. Это очень похоже на basic-авторизацию, но теперь пароль не передаётся в открытом виде, и восстановить его, перехватив заголовок Authorization, практически невозможно. Внимательный читатель наверное уже заметил уязвимость протокола, связанную с тем, что злоумышленник может перехватить заголовок, а потом просто использовать легальные значения username, realm, nonce, uri и response. Это откроет ему доступ к ресурсу и без знания пароля. На самом деле мы рассмотрели самый простой сценарий digest-авторизации и только основные параметры. Ниже мы увидим, средства, значительно снижающие возможности того, кто перехватил ваш HTTP-заголовок.

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

Максимум, что может потребоваться от вас – это «раскомментировать» в файле httpd.conf инструкции, подключающие соответствующий модуль. Выглядеть это будет приблизительно так: LoadModule digest _ module libexec/apache/mod _ digest.so AddModule mod _ digest.c

После того как Apache научился digest-языку, можно приступить к настройке.

Настройка защищённых зон Для конфигурирования можно использовать файл глобальных настроек сервера, группируя директивы в блоки <Directory>, <DirectoryMatch>, <Files>, <FilesMatch>, <Location> или <LocationMatch> и защищая указанные файлы и директории. Можно использовать и локальные конфигурационные файлы .htaccess. В настоящей статье будем для определённости придерживаться второго пути. Но все приводимые конфигурационные директивы можно использовать и в любых других контекстах. Следует также заметить, что все обсуждаемые в статье директивы принадлежат к группе AuthConfig. То есть, чтобы использовать их в .htaccess, у вас должны быть соответствующие права.

Самый простой пример Сборка сервера В Apache 1.1 впервые появился модуль digest_module. Он был предельно прост и реализовывал минимум digestвозможностей. (Именно этим модулем были сгенерированы заголовки, которые мы видели выше как пример самого простого digest-диалога.) В версии 1.3.8 был добавлен модуль mod_auth_digest со статусом «экспериментальный». В нём были продублированы функции digest_module и добавлено несколько новых возможностей. Естественно, использовать эти модули совместно нельзя, так как наборы их функций частично перекрываются. В Apache 2.0 модуля digest_ module уже нет. В документации на странице, посвящённой переходу на новую версию, сказано, что теперь mod_auth_ digest не является экспериментальным. Однако на странице, описывающей сам модуль, чёрным по белому написано «Status: Experimental». Во всяком случае ни в одной из известных мне версий Apache digest-авторизация не включается при сборке с «умолчательными» параметрами. Поэтому, если вы собираете сервер самостоятельно, дайте утилите ./configure соответствующий ключ. Они различны для разных версий Apache. Например, чтобы статически вкомпиллировать модуль mod_auth_digest в Apache 2.0, необходимо дать ключ --enable-auth-digest. Подробную справку по системе сборки имеющейся у вас версии сервера можно получить, запустив ./configure с ключом --help. Как всегда, не помешает почитать INSTALL, хотя в Apache 2.0 (после перехода на autoconf) он стал весьма лаконичным. Если вы пользуетесь уже собранным сервером, то, скорее всего, вам не придётся предпринимать никаких специальных действий. Все известные мне сборки сервера 1.3 включают модуль mod_digest, которого вам хватит (на первое время). Сборки Apache 2.0 включают mod_auth_digest.

46

Давайте рассмотрим самый простой случай. Пусть нам необходимо защитить документы, находящиеся в некоторой директории (и всех вложенных в неё поддиректориях). Сначала создадим файл с паролями. Для этого есть специальная утилита htdigest. В целом она похожа на htpasswd, но требует больше параметров: htdigest [ -c ] passwdÞle realm username

Ключ -c говорит о том, что файл с паролями надо создать. Если этот ключ отсутствует, то файл будет дополнен. ! passwdfile – имя файла с паролями. ! realm – имя защищённой зоны. ! username – имя пользователя. Пароль по понятным причинам не указывается в командной строке, htdigest «попросит» ввести и подтвердить его. То есть, чтобы создать файл passwd и пользователя a для зоны Realm-A, нам следует ввести следующую команду: htdigest -c passwd Realm-A a

При добавлении новых пользователей ключ -c указывать не надо. Чтобы снизить риск хищения секретной информации, файл с паролями лучше разместить где-нибудь вне дерева каталогов, доступных по HTTP. Вернёмся теперь к директории, которую мы хотим защитить. Если в ней ещё нет файла .htaccess, то его следует создать. Добавим в него следующие директивы:


web AuthType Digest AuthName Realm-A AuthDigestFile /home/www/test/passwd Require valid-user

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

Подробнее о зонах В отличие от basic-авторизации аппарат digest-авторизации различает закрытые зоны. Каждый пользователь имеет право авторизоваться только в одной зоне. Этим зоны отличаются от групп. Если одному пользователю необходимо иметь доступ к нескольким зонам, то для него надо завести соответствующее число учётных записей. Причём в разных зонах один и тот же пользователь может иметь разные пароли.C точки зрения системы безопасности это разные пользователи с одинаковыми именами. Но даже если в разных зонах имеются учётные записи с одинаковым именем пользователя и одинаковым паролем, то этому пользователю придётся вновь авторизоваться при входе в новую зону, даже если ранее он уже прошёл процедуру авторизации (с теми же именем и паролем) в другой зоне. Несмотря на то, что концепция зон вносит некоторое усложнение, она часто оказывается очень полезной. Дело в том, что файлы, подлежащие защите, не всегда можно расположить в одной директории и её поддиректориях. В случае такого дробления закрытых областей можно объявить соответствующие директории одной зоной, и повторной авторизации при переходе из директории в директорию уже не понадобится. Чтобы лучше понять, как пользоваться зонами, давайте рассмотрим дерево директорий, показанное на рис. 2. Как видите, мы создали восемь директорий. Шесть из них защищены, на схеме они снабжены шапками, в которых указано, к каким зонам они принадлежат. Чёрные шапки говорят о том, что в данной директории есть .htaccess, белые – о том, что зона унаследована от родительской директории. Незащищённые элементы показаны зелёным цветом, зона Realm-A – жёлтым, Realm-B – красным. При такой организации защиты пользователю достаточно один раз авторизоваться в зоне Realm-B, «войдя» в директорию /b-docs, и он может обращаться к скриптам из директории /cgi-bin/b-bin, не проходя процедуру идентификации повторно. После авторизации в /b-docs при первом обращении к /cgi-bin/b-bin браузер, который пока не «знает», что обращается к закрытой зоне, отправит обычный запрос. Дальше всё будет происходить по уже известному сценарию.

№10, октябрь 2005

Рисунок 2. Дерево директорий с двумя защищёнными зонами. Незащищённые директории отмечены зелёным, принадлежащие зоне Realm-A – жёлтым, Realm-B – красным

Сервер выдаст ответ об ошибке 401 с сообщением о том, что данная директория принадлежит к зоне Realm-B. Тогда браузер автоматически сформирует новый запрос с заголовком Authorization. Для пользователя весь этот диалог останется не заметен, вводить имя и пароль повторно не потребуется – браузер уже располагает всей идентификационной информацией для работы в зоне Realm-B. Самая экзотическая ситуация создана в директории adocs. В ней находится файл .htaccess, приписывающий её к закрытой зоне Realm-A. Если бы этим дело ограничивалось, то и её поддиректории – sub-a и sub-b – принадлежали бы к этой зоне. Так и происходит с директорией /a-docs/ sub-a: она не содержит собственного .htaccess и просто наследует все свойства директории a-docs. Однако в директории /a-docs/sub-b имеется собственный .htaccess, согласно которому она принадлежит к зоне Realm-B. По каким правилам взаимодействуют зоны в подобном случае, когда они перекрываются? Безусловно, доминировать будет зона Realm-B. То есть, чтобы получить доступ к директории /a-docs/sub-b, не надо быть авторизованным в зоне Realm-A, требуется только право доступа к зоне Realm-B. В заключение заметим, что и basic-авторизация тоже допускает использование зон, но в этом случае клиент не сообщает серверу имя зоны и привязка пользователя к зоне не производится. Фактически информацию о зоне может использовать только клиент.

Группы пользователей Как и basic-авторизация, аппарат digest-авторизации позволяет организовывать пользователей в группы. Для этого существует директива: htdigest -c passwd Realm-A a

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

47


web имя _ группы: пользователь ещё _ пользователь ...

После того как файл с группами создан и путь к нему указан, можно использовать директиву Require следующим образом: Require group имя _ группы ещё _ имя _ группы ...

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

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

Взаимодействие авторизации и других механизмов ограничения доступа Вы видите, что digest-аппарат предлагает очень гибкую систему настройки с зонами и группами пользователей. Но механизм авторизации – не единственное средство ограничения доступа. Давайте, не уходя далеко от темы статьи, рассмотрим, как механизм авторизации взаимодействует с другими средствами. Для примера в качестве конкурента авторизации рассмотрим ограничение, позволяющее обращаться к ресурсу только с определённого хоста. Это ограничение реализуется следующими конфигурационными директивами: Order Deny,Allow Deny from all Allow from 192.168.1.104

Что будет, если в одном .htaccess разместить и эти три строки, и четыре директивы, требующие авторизации? Чтобы разрешить этот вопрос, существует инструкция Satisfy, допускающая два значения единственного аргумента – Any или All. Если в этот же файл .htaccess добавить: Satisfy All

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

48

Любой из этих вариантов может оказаться полезен, в зависимости от конкретной задачи.

Иллюзии и реальность: digest vs basic Теперь, когда мы познакомились с устройством и возможностями digest-аппарата, можно обсудить его преимущества и недостатки. Подытожим сначала, какие проблемы basic-авторизации так и остались не решены. Во-первых, при digest-авторизации не создаётся сессии. На первый взгляд идентификатором сессии может показаться параметр nonce, передаваемый при каждом обращении к серверу в заголовке Authorization, но это впечатление обманчиво. Nonce позволяет не передавать пароль в открытом виде, и только. Сервер не запоминает все выданные nonce и не следит за ними. Прямым следствием этого становится невозможность разорвать сессию – «разлогиниться». Этот недостаток роднит digest- и basic- механизмы. Он, очевидно, связан с самой природой протокола HTTP, для которого не существует понятия «сессия». Теперь понятно, что digest-авторизация, как и basicавторизация, не в состоянии создать ощутимые препятствия для грубого перебора паролей. Справедливости ради следует отметить, что в полном описании digest-процедуры предусмотрены средства (дополнительные переменные и алгоритмы работы с ними), позволяющие детектировать подобную атаку и создать ощутимые препятствия для её осуществления. Но мне не известно ни одной программы, в которой эти средства были бы реализованы в полной мере. (Обсуждению реализаций посвящена следующая часть статьи.) Вторым важным недостатком digest-защиты является то, что при усиленной охране пароля информация остаётся не зашифрованной и передаётся в открытом виде. Злоумышленник не может перехватить пароль, но он может перехватить информацию. Вы сохраните ключи от сейфа, но потеряете его содержимое. Корни этой проблемы тоже кроются в протоколе HTTP, и, конечно, проблема пропадёт автоматически, если воспользоваться протоколом SHTTP, защищающим все передаваемые данные. Но это уже, согласитесь, несколько другой протокол. Но (и это в-третьих) самый интересный вопрос: а защищён ли на самом деле пароль? Ответ на него не так прост. Казалось бы, что может быть надёжнее MD5-хэширования? Но давайте приглядимся. Злоумышленник может перехватить заголовок – это факт. Нужен ли тогда ему пароль? Очевидно – нет! Достаточно включить в запросы перехваченный заголовок Authorization и – о чудо! – вы получаете доступ к секретной информации и не зная пароля. Конечно, Internet Explorer не поможет произвести подобный взлом, но тот, кто смог перехватить ваш трафик, сумеет найти подходящий инструмент. Безусловно, большой ложкой дёгтя для злоумышленника будет то, что при хешировании пароля используется и URI документа. То есть для разных документов переменная response должна иметь разные значения, и вычислить их можно, только зная пароль. Так что один заго-


web ловок может открыть доступ только к одному документу. (Напомню, что при basic-авторизации один перехваченный заголовок открывает полный доступ ко всей закрытой области.) Но один документ – тоже очень немало, если это лента новостей или нечто в этом роде. Кроме того, можно собрать коллекцию заголовков – по одному на каждый документ. Так что же получается, что защита пароля на самом деле – фикция? Не совсем. Модуль mod_auth_digest предоставляет множество новых конфигурационных директив (мы ещё вернёмся к некоторым из них), среди которых есть одна, способная помочь в решении обозначенной проблемы. Речь идёт о дирек тиве AuthDigestNonceLifetime. Её единственный аргумент задаёт время, в течение которого параметр nonce остаётся актуальным. По истечении этого времени информация, передаваемая в заголовке Authorization, «устаревает», и клиенту приходится авторизоваться снова. Это происходит автоматически по обычному сценарию. Просто на очередной запрос браузер получает ответ 401, в котором указан новый параметр nonce, но уже известная браузеру зона. Поэтому браузер вычисляет новый параметр response (по новому nonce и уже известному паролю) и формирует новый запрос с «правильным» заголовком Authorization, не причиняя пользователю никаких неудобств. Дополнительное усиление защиты создаётся тем, что сервер и клиент ведут счёт соединениям и используют этот счётчик при вычислении хэш-суммы response. То есть значение параметра response при каждом новом соединении оказывается новым. За более подробной информацией вы можете обратиться к третьей главе RFC-2617, параметры nc, state и другие; здесь же мы не будем чрезмерно вдаваться в детали. Главный вывод таков: использование счётчиков делает перехват заголовков практически бесполезным; но используются счётчики только более современным модулем mod_auth_digest, модуль digest_module не способен работать с nc и сопутствующими параметрами. Этот комплекс мер значительно снижает целесообразность перехвата Authorization-заголовков. Хотя указывать слишком малые времена актуальности не стоит. Так вы можете создать практически непреодолимые трудности для пользователей, работающих по медленным каналам.

Готовый рецепт взлома пароля В рамках одной статьи трудно осветить все степени защиты, которые обеспечивает digest-авторизация (к сожалению, далеко не все из них реализованы на практике). Так мы даже не коснулись ещё одного HTTP-заголовка Authentical-Info, который не является обязательным (и используется редко), но позволяет защититься от многих типов атак. Мы не рассмотрели конфигурационную директиву AuthDigestRealmSeed, позволяющую немного усилить защиту при использовании mod_digest, но практически бесполезную для mod_auth_digest, который предоставляет гораздо более мощные средства. Эти и многие другие детали и тонкости, устаревшие или не имеющие принципиального значения, мы оставим специалистам. А здесь отметим, что если вы базируетесь только на материале

№10, октябрь 2005

этой статьи, то не факт, что атака, придуманная вами, будет успешной. Однако чтобы охладить преждевременное ликование оптимистов, полагающих, что digest-схема надёжно защищает пароль, я приведу ещё один пример организации атаки. Она базируется на перехвате и подмене трафика. Опытному программисту, имеющему под рукой исходный код Apache, потребуется несколько часов, чтобы написать специальный прокси-сервер, который будет делать следующее: получив от сервера ответ 401 с требованием авторизоваться по digest-схеме, прокси отправляет клиенту изменённый ответ 401, требующий basic-авторизации; клиент авторизуется по basic-схеме и отправляет хозяину прокси-сервера имя и пароль в открытом виде (как того требует basic-процедура); всё – злоумышленник получил, что хотел. В принципе, зная имя и пароль, прокси-сервер может создать легальный digest-запрос для сервера и далее поддерживать общение клиента и сервера, оставаясь полностью прозрачным. Возможность такой атаки, казалось бы, сводит на нет все преимущества digest-схемы, но на самом деле подобным атакам в той или иной мере подвержены все системы защиты. Злоумышленник может подменить программу login, может прослушивать клавиатуру и прочее. Этот сценарий атаки (MITM – man in the middle) – один из самых древних и универсальных. Он с успехом применялся задолго до появления вычислительной техники: от радиоперехвата до подделки берестяных грамот («и в суму его пустую суют грамоту другую» А.С. Пушкин). Совсем неудивительно, что этот тип атаки применим и в нашем случае. Тем, кто хочет узнать ещё десяток способов «сломать» digest-защиту, я бы посоветовал ознакомиться с четвёртой главой RFC-2617.

Стандарты и реализации Детали digest-авторизации исчерпывающе описаны в RFC2069. Этот документ датирован 1997 годом. Уточнения были сделаны в RFC-2617 в 1999 году. Но, невзирая на то, что с тех пор сменилось тысячелетие, ни браузеры, ни сервера не выполняют всех требований и рекомендаций, изложенных в RFC. В RFC описано множество возможностей digest-авторизации, управляемых добрым десятком параметров. Но Apache до сих пор не позволяет никаким образом влиять на большинство из них. В модуле mod_auth_digest появилось множество настроечных директив, но реальных возможностей настройки прибавилось гораздо меньше. Так, например, AuthDigestAlgorithm позволяет выбрать хэш-функцию. Допустимы два значения параметра: MD5 и MD5-sess, но использовать можно только MD5. Появилась директива AuthDigestNcCheck, которая в будущем позволит работать с параметром nc (этот параметр содержит счётчик соединений, о котором упоминалось выше), но сейчас она ничего не делает. Одними словом, большинство новых директив просто зарезервированы. Таким образом, относительно сервера Apache можно констатировать два факта: первый – реализованы далеко

49


web не все возможности, заявленные в RFC, и второй – работы ведутся весьма активно, причём план работ (RFC) имеется, что особенно обнадёживает. Большинство современных браузеров поддерживают digest-авторизацию. В их числе Internet Explorer (о нём требуется отдельный разговор), Fire Fox, Opera, Mozilla, Netscape, Amaya. Лично я сталкивался с отсутствием digest-авторизации, только работая браузером lynx (версия 2.8.5) и... Internet Explorer.

Microsoft went one way; everyone else went the other way В подзаголовок вынесена цитата из статьи в eWeek (http:// www.eweek.com/article2/0,1759,1500432,00.asp), в которой с должной долей драматизма описан очередной конфликт софтверного гиганта со всем миром; на этот раз – на почве разного понимания RFC-2617. Вследствие этого IE – единственный браузер, не способный работать с Apache, когда дело касается digest-авторизации. Более того, IE – единственный браузер, способный работать с IIS по «digest»-схеме, как её понимает Microsoft. Причём MS не считает это ошибкой и не собирается ничего менять. Информации по этой проблеме очень мало, и она очень противоречива. Чтобы понять, почему так происходит, давайте рассмотрим поведение IE 6.0 (с другими версиями дела обстоят или так же или хуже). Исторически, во времена версий 1.1 и 1.2, разработчики Apache заняли очень твёрдую позицию и не стали поддерживать Microsoft-интерпретацию RFC. Поэтому, если сервер оснащён старым модулем digest_module, пользователи IE 6.0 вообще не смогут на нём авторизоваться. Но Microsoft проявил не меньшую принципиальность и не стал ничего менять в своей реализации HTTP/1.1. Поэтому в новом модуле mod_auth_digest протокол был «усовершенствован». Теперь IE мог авторизоваться и даже работать по Digest-сценарию за одним исключением: сервер не мог корректно обработать запрос GET, если строка запроса была не пустой. Это связано с тем, что IE нарушает и другие стандарты, не связанные с digest-авторизацией. Microsoft имеет собственную точку зрения на то, что такое URI и другие фундаментальные понятия. Некоторое время (от версии 1.3.8 до 2.0.51) разработчики Apache ожидали изменений в IE, но шаг навстречу пришлось делать снова им. В Apache 2.0.51 модуль mod_auth_ digest стал обрабатывать переменную окружения AuthDige stEnableQueryStringHack. Если она установлена, то модуль «на лету» корректирует HTTP-заголовки, придавая им стандартный вид. То есть, чтобы общение с IE шло без сбоев, следует использовать директиву: BrowserMatch "MSIE" AuthDigestEnableQueryStringHack=On

Тогда сервер будет распознавать самый великий браузер и на лету подставлять ему костыли. Мои личные тесты, проведённые на apache-2.0.55, показали, что если браузер «притворяется» Explorer (как это делает Opera), но соблюдает все нормы, то никакого конфликта не возникает. Видимо, это сделано в расчёте на то, что IE когда-нибудь начнёт работать по общепринятым пра-

50

вилам. То есть, согласно результатам этих тестов, можно установить переменную AuthDigestEnableQueryStringHack безусловно: SetEnv AuthDigestEnableQueryStringHack On

Но документация на Apache рекомендует первый способ, не исключено, что на это есть какие-то причины. Неразбериха же возникает от того, что большинство обзоров пытаются ответить на вопрос: «имеет ли IE версии X возможность Y?» Но теперь вы видите, что в данном случае результат тестирования определяется не версией клиента, а мельчайшими деталями настройки сервера. Поэтому и возникает тот разброс мнений, который легко наблюдать в Internet. Дело усугубляется ещё и тем, что, с точки зрения любого другого браузера, все три перечисленные конфигурации сервера одинаково работоспособны. На мой взгляд, всё это ещё один пример того, как Microsoft открыто вытирает ноги о весь мир. К сожалению, у меня не было возможности протестировать сервер IIS на предмет его совместимости с какимилибо браузерами, отличными от IE. Но лично у меня нет оснований не доверять eWeek.

Преимущества digest-авторизации Итак, мы рассмотрели тонкости digest-схемы авторизации и обнаружили массу недостатков. Но надо ли после этого ставить на ней крест? Очевидно, нет. Наивно было бы ожидать, что какая-либо надстройка над HTTP сможет изменить его природу и сделает его надёжнее специализированных средств, таких как SHTTP и TLS. Но несмотря на то, что digest-процедура не исключает возможности многих видов атак, она всё же оказывается более защищённой, чем basic. Digest-схема имеет некоторые преимущества и перед SSL: она проще в настройке, работа по алгоритмам digest-авторизации не создаёт практически никакой вычислительной нагрузки на систему, кроме того, не будем забывать, что SSL-сертификаты не бесплатны. Наконец, digest-схема превосходит по стойкости многие протоколы, распространённые не менее, чем протокол HTTP. Не секрет, что пароль передаётся в открытом виде в POP3, IMAP, FTP и многих других протоколах. Конечно, пока трудно найти клиента или сервер, где были бы реализованы все возможности digest-авторизации, предусмотренные в RFC. (По крайней мере, лично мне не известна ни одна такая программа.) Но работа ведётся. Нововведения Apache 2.0 (директива AuthDigestNonceLifetime) уже делают digest-авторизацию весьма ценным – простым и эффективным – инструментом, при обеспечении безопасности быстро меняющейся информации. Дополнительным преимуществом digest-аппарата является гибкая работа с секретными зонами – ещё одним средством (наряду с группами) для регламентирования полномочий пользователей. Таким образом, невзирая на все имеющиеся недостатки, уже сегодня digest-авторизация поднимает HTTP-протокол над многими не менее распространёнными в Сети протоколами. Она не делает HTTP самым защищённым, но и не лишает его простоты, лёгкости и открытости.


bugtraq Переполнение буфера при обработке HTTP-запросов в Symantec AntiVirus Scan Engine Программа: Symantec AntiVirus Scan Engine (version 4.0 and 4.3), Symantec AntiVirus Scan Engine for ISA (version 4.0 and 4.3), Symantec AntiVirus Scan Engine for Netapp Filer (version 4.0), Symantec AntiVirus Scan Engine for Messaging (version 4.3), Symantec AntiVirus Scan Engine for Netapp NetCache (version 4.0), Symantec AntiVirus Scan Engine for Network Attached Storage (version 4.3), Symantec AntiVirus Scan Engine for Bluecoat (version 4.0), Symantec AntiVirus Scan Engine for Caching (version 4.3), Symantec AntiVirus Scan Engine for Microsoft SharePoint (version 4.3), Symantec AntiVirus Scan Engine for Clearswift (version 4.0 and 4.3). Опасность: Критическая. Описание: Уязвимость обнаружена в обработке HTTP-запросов в административном веб-интерфейсе. Удаленный пользователь может сконструировать специально обработанный HTTP-запрос, который содержит отрицательные значения в некоторых HTTP-заголовках, чтобы вызвать переполнение динамической памяти и выполнить произвольный код с SYSTEM-привилегиями. URL производителя: www.symantec.com. Решение: Установите соответствующее обновление – http:// securityresponse.symantec.com/avcenter/security/Content/ 2005.10.04.html#savse4-3-12.

Выполнение произвольного кода в Client Service for NetWare Программа: Microsoft Windows 2000 SP4, Microsoft Windows XP SP1, SP2, Microsoft Windows 2003 SP1. Опасность: Критическая. Описание: Уязвимость обнаружена в Client Service for NetWare (CSNW). Удаленный пользователь может выполнить произвольный код на целевой системе. В Microsoft Windows 2003 SP1 уязвимость может быть эксплуатирована только локальным авторизованным пользователем. URL производителя: www.microsoft.com. Решение: Установите исправление с сайта производителя.

Выполнение произвольного кода в Mozilla Firefox при обработке параметров тега IFRAME Программа: Mozilla Firefox 1.0.7 и более ранние версии Опасность: Высокая. Описание: Уязвимость существует при обработке параметра ширины HTML тега IFRAME. Удаленный пользователь может создать специально сформированную HTMLстраницу, указав в параметре width тега IFRAME значение «33333333», вызвать переполнение стека и выполнить произвольный код на целевой системе с привилегиями текущего пользователя или аварийно завершить работу браузера. Пример: IFRAME WIDTH=33333333 URL производителя: www.mozilla.org/products/firefox. Решение: Установите последнюю версию с сайта производителя.

№10, октябрь 2005

Переполнение буфера в препроцессоре Back Orifice в Snort Программа: Snort 2.4.0-2.4.2. Опасность: Критическая. Описание: Переполнение буфера существует при обработке Back Orifice-пакетов. Удаленный пользователь может послать приложению специально сформированные UDP-пакеты, вызвать переполнение буфера и выполнить произвольный код на целевой системе. URL производителя: www.snort.com. Решение: Установите последнюю версию (2.4.3) с сайта производителя.

Множественные переполнения буфера в Skype Программа: Skype for Windows Release 1.4.*.83 и более ранние версии, Skype for Mac OS X Release 1.3.*.16 и более ранние версии, Skype for Linux Release 1.2.*.17 и более ранние версии, Skype for Pocket PC Release 1.1.*.6 и более ранние версии. Опасность: Критическая. Описание: Уязвимость существует при обработке URL (callto:// и skype://). Удаленный пользователь может с помощью специально сформированного URL вызвать переполнение буфера и выполнить произвольный код на целевой системе. Переполнение буфера обнаружено при обработке VCARD-импортов. Удаленный пользователь может создать специально сформированную VCARD, вызвать переполнение буфера и выполнить произвольный код на целевой системе. Уязвимость обнаружена при обработке некоторых пакетов. Удаленный пользователь может послать приложению специально сформированный пакет, вызвать переполнение кучи и выполнить произвольный код на целевой системе. URL производителя: www.skype.com. Решение: Установите последнюю версию с сайта производителя.

Уязвимость форматной строки и переполнение буфера в WinRAR Программа: WinRAR 3.50. Опасность: Высокая. Описание: Уязвимость форматной строки при отображении диагностического сообщения об ошибке, информирующего пользователя о некорректном имени файла в UUE/ XXE-кодировке. Удаленный пользователь может создать специально сформированный архив и выполнить произвольный код на целевой системе. Переполнение стека обнаружено в библиотеке UNACEV2.DLL при обработке ACEархивов. Удаленный пользователь может создать ACE-архив, содержащий специально сформированный файл и выполнить произвольный код на целевой системе. URL производителя: www.rarlabs.com. Решение: Установите последнюю версию (3.51) с сайта производителя.

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

51


программирование

Антиотладка: старые приемы на новый лад

Крис Касперски Новое, как говорится, – это хорошо забытое старое. Антиотладочные приемы времен MS-DOS и debug.com возвращаются, чтобы снова работать в Windows 2000/XP/2003. Статья не только вызовет у вас ритуально-ностальгический интерес, но и послужит практическим пособием по борьбе с хакерами и отладчиками.

О

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

52

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

вается по спирали, и методы защиты, разработанные для MS-DOS и утратившие актуальность к концу ее существования, оказывают убийственное воздействие на Windows-отладчики, которые просто не предусматривали такого


программирование поворота событий и капитулируют сразу, даже не пытаясь бороться. Разумеется, непосредственный перенос антиотладочных методик из MS-DOS в Windows невозможен хотя бы уже потому, что в Windows нет «прерываний» в том смысле, который в них вкладывает MS-DOS. В ней нет портов ввода/вывода, физической памяти и множества других привычных для MS-DOS-программистов концепций и вещей. То есть они, разумеется, есть (куда же без прерываний?!), но техника работы с ними радикально отличается. Так что определенная адаптация все-таки необходима. Основной упор мы сделаем на прикладной уровень и программистов средней квалификации, которые, возможно, имеют представление о драйверах, но разрабатывать их самостоятельно не собираются. Некоторые из описанных методик практически полностью системно независимы и работают под любой 32-разрядной операционной системой семейства Windows, частично поддерживая Windows 3.x и Windows XP 64-bit edition. Некоторые требуют только NT или производную от нее систему, причем никаких гарантий сохранения работоспособности в последующих версиях Windows у нас нет. Даже если использовать только документированные функции, Microsoft в любой момент может их изменить, как это она уже делала неоднократно, причем, в последнее время все чаще и чаще. Лучше вообще не использовать никаких системно зависимых функций и писать все на ANSI Си/С++ или DELPHI (фактически DELPHI представляет собой самостоятельную «операционную систему», натянутую поверх Windows и абстрагирующую программиста от прихотей Microsoft – вы просто перекомпилируете код и все! Разумеется, речь идет только о прикладных задачах и на антиотладочные приемы указанное преимущество DELHPI не распространяется). Тем не менее, бояться антиотладочных приемов не нужно. Их использование вполне допустимо, если не сказать – желательно. Хороший сборник антиотладочных приемов глубокой древности можно найти в статье «Anti Debugging Tricks» (http://textfiles.group.lt/programming/ antidbg.txt), написанной известным ви-

№10, октябрь 2005

русописателем Inbar Raz (что? Никаких ассоциаций? Эх... молодежь!) датируемой 1993 годом, но сами описанные в ней приемы имеют намного более почетный возраст, и многие из них пришли в MS-DOS с еще более древних машин. Попытаемся перенести их на Windows?

Программа, которая трассирует себя сама Один из древнейших приемов основан на «поглощении» трассировочного прерывания отладчиком. Рассмотрим его поподробнее. Как известно, x86-процессоры имеют специальный trap-флаг (сокращенно TF). Когда он взведен, после выполнения каждой инструкции генерируется специальное отладочное прерывание, обрабатываемое отладчиком (если, конечно, он установлен и действительно отлаживает программу). В противном случае управление получает обработчик по умолчанию. В MS-DOS он представляет собой «холостую» заглушку, состоящую из одного лишь IRET, и выполнение программы не прерывается, а вот Windows возбуждает исключение, приводящее к появлению хорошо всем известного диалогового окна «программа совершила недопустимую операцию и будет закрыта». Формально флаг трассировки является частью регистра флагов и потому может быть сохранен в стеке командой pushf/pushfd, однако распознать факт трассировки таким способом скорее всего не удастся, поскольку многие отладчики маскируют свое присутствие. При пошаговом выполнении программы они осуществляют дополнительную проверку – а не является ли только что выполненная команда инструкций pushf, и если это так – лезут в стек и корректируют сохраненное значение регистра флагов, сбрасывая TF в ноль. Правда, тут можно схитрить. Например, добавить несколько лишних префиксов перед командой pushf – есть шанс, что отладчик не сможет их распознать. Еще можно использовать самомодифицирующийся код, расположив команду pushf в стеке с таким расчетом, чтобы сохраненное значение регистра флагов затирало ее напрочь, правда тут есть одна маленькая проблема. Производители аппаратнопрограммного обеспечения наконец-то

Рисунок 1. Древнейший отладчик debug.com

Рисунок 2. Диалоговое окно, появляющееся при попытке выполнения кода в стеке

признали тот факт, что научить программистов программированию им так и не удалось, а теперь уже и не удастся. Операционные системы и приложения буквально нашпигованы ошибками переполнения буфера, через которых распространяются черви, троянские программы и другая зараза. Чтобы прикрыть лазейку, пришлось пойти на довольно жесткую, спорную и радикальную меру – неисполняемый стек. И хотя распространения червей он все равно не остановит, ведь существуют и другие типы переполняющихся буферов (множество статей на эту тему лежит на ftp://nezumi.org.ru), для нас (пользователей и программистов) в практическом плане это означает, что огромное количество программ перестанет работать, поскольку они защищены упаковщиками и протекторами, использующими самомодифицирующийся код, исполняющийся в стеке. Поэтому Microsoft предусмотрела возможность отключения защиты. При первой попытке исполнения кода на стеке Windows XP выбросит гроз-

53


программирование ное диалоговое окно (см. рис. 2) и при утвердительном ответе пользователя выполнение защищенной программы будет продолжено, так все не так уж и плохо. Впрочем, отладчики типа Microsoft Visual C++ дурить необязательно и следующий бесхитростный код легко обнаруживает их присутствие. Попробуйте его выполнить в пошаговом режиме и посмотрите, что произойдет! Листинг 1. Простейший антиотладочный прием, распознающий трассировку под некоторыми отладчиками pushf

; ; pop eax ; ; and eax, 100h ; jnz under _ debugger ;

сохраняем флаги в стеке, включая и TF выталкиваем сохраненные флаги в eax выделяем флаг трассировки если TF взведен, нас трассируют

Главный минус этого приема в том, что его очень легко обойти. Достаточно, например, просто подогнать курсор к команде pushf, сказать отладчику «HERE» (т.е. выполняй программу до этого места без трассировки), затем подогнать курсор к jnz и сказать «HERE» еще раз. Таким образом, защищенный фрагмент будет исполняться в обычном режиме и присутствие отладчика окажется незамеченным, поэтому многие программисты предпочитают сохранять регистр флагов в одном месте программы, а проверять его в другом. Начинающих хакеров это сбивает с толку, но опытных так не проведешь. На конструкцию pushf/ pop reg/xxx reg,100h у них уже давно выработался безусловный рефлекс, к тому же взломщику ничего не стоит заменить or eax,100h на and eax,0h, и тогда программа навсегда утратит способность распознавать отладчик. Можно (и нужно), конечно, добавить проверку собственной целостности, но только навряд ли она надолго остановит хакера. А вот слегка модифицированный вариант той же самой защиты, который распознает присутствие отладчика независимо от того, исполняется ли программа в пошаговом режиме или нет. Алгоритм работы в общих чертах выглядит так: мы самостоятельно взводим флаг трассировки и выполняем следующую команду. Процессор послушно генерирует исключение, которое мы перехватываем предварительно установленным SEH-обработчиком, передающим управление нашему коду. Но при наличии отладчика, исключение «поглощается», и SEH-обработчик уже не получает управления! Листинг 2. Универсальный антиотладочный прием, распознающий трассировку под большинством отладчиков ; устанавливаем новый обработчик структурных ; исключений ; обнуляем регистр eax xor eax,eax ; кладем в стек указатель на новый обработчик push offset SEH _ handler ; кладем в стек указатель на старый обработчик push dword ptr fs:[eax] ; регистрируем новый SEH-обработчик mov fs:[eax],esp ; взводим флаг трассировки pushf ; заталкиваем в стек регистр флагов pop eax ; выталкиваем его содержимое в регистр eax or ah, 1 ; взводим флаг TF push eax ; кладем eax в стек popf ; выталкиваем его содержимое в регистр ; флагов ; теперь флаг трассировки взведен!

54

; после выполнения этой команды генерируется ; исключение, и если отладчик не установлен, ; его перехватывает SEH-обработчик, который ; корректирует EIP, и эта команда не выполняется ; под отладчиком происходит переход на ветку ; under _ debugger jmp under _ debugger // ... //

; основной код программы

; SEH-обработчик может быть расположен в любом месте ; (лучше расположить его подальше от защитного кода, ; чтобы он не так бросался в глаза) SEH _ handler: ; указатель на контекст регистров mov esi, [esp+0ch] assume esi: PTR CONTEXT mov [esi].regEip, offset continue ; откуда продолжать выполнение ; в отсутствии отладчика xor eax, eax ret ; выход из SEH-обработчика continue: ; // отсюда будет продолжено управление, ; если отладчик не установлен

Данный прием позволяет обнаруживать soft-ice и многие другие отладчики, причем на пассивную отладку он не реагирует (и это хорошо!). Пользователь нашей программы может запускать soft-ice и отлаживать остальные программы, но... как только он попытается загрузить в отладчик нашу, она тут же подаст сигнал. То же самое произойдет, если хакер присоединит отладчик к уже запущенному процессу или ворвется в середину программы путем установки точек останова на API-функции. Естественно, антиотладочный код должен выполняться не до, а после загрузки отладчика. То есть размещать его в самом начале защищаемой программы не стоит. Лучше – многократно дублировать в различных местах. Прелесть данного приема в том, что его достаточно трудно распознать при взломе. Явные проверки отсутствуют и команда jmp under_debugger выглядит невинной овечкой. При ее выполнении без отладчика возбуждается исключение, перехватываемое обработчиком и выполнение программы идет уже совсем по другому пути (обработчик подменяет указатель команд, хотя, впрочем, он мог бы этого и не делать – в отличие от прерываний, из которых в MS-DOS нужно было выходить как можно скорее, чтобы не развалить систему, обработчик структурного исключения в принципе может вмещать в себя весь код программы целиком, и химичить с контекстом совершенно необязательно – зачем лишний раз привлекать внимание хакера?). Под отладчиком же команда jmp under_debugger выполняется «как есть» и хакер может очень долго ковыряться в подложной ветке under_debugger, не понимая, что здесь вообще происходит и откуда это взялось?! Чтобы оттянуть взлом, лучше не говорить сразу, что отладчик обнаружен, а подсунуть какойнибудь зашифрованный код или что-то еще. Главное, чтобы команды popf и jmp under_debugger не были разделены никакими другими инструкциями! Иначе защита не сработает! Трассировочное исключение генерируется сразу же после выполнения первой команды, расположенной после popf, и если ею окажется, например, nop, то jmp никаких исключений уже не достанется. Так что замаскировать защитный код, рассредоточив его по все-


программирование му оперативному периметру, уже не удастся. К тому же хакер может легко нейтрализовать защиту, просто заменив jmp under_debugger на jmp continue. Чтобы этому противостоять, необходимо взводить в SEH-обработчике специальный флаг и проверять его по ходу выполнения программы – был ли он вызван или нет. А в самом SEH-обработчике еще контролировать и тип исключения, иначе хакер просто добавит xor eax,eax/mov [eax],eax (обращение по нулевому указателю, генерирующее исключение) и тогда SEH-обработчик будет получать управление как под отладчиком, так и без него. Кстати говоря, защита данного типа была использована в программе ulink Юрия Харона, взлом которой подробно описан в моих «Фундаментальных основах хакерства – записках мыщъх’а», которую можно бесплатно скачать с моего ftp-сервера nezumi.org.ru. Зададимся таким вопросом: может ли отладчик трассировать программу, которая уже находится под трассировкой (например, отлаживается другим отладчиком или трассирует сама себя). Непосредственно – нет, поскольку флаг трассировки в x86 процессорах один и его вложенность не поддерживается. С другой стороны, если вышестоящий отладчик отслеживает обращение к флагу трассировки и эмулирует возбуждение трассировочного прерывания, передавая управление не на следующую команду, а на SEH-обработчик, такая схема может работать, правда, код отладчика существенно усложнится, а поскольку, коммерческие отладчики ориентированы исключительно на легальных программистов, которые взломом защит не занимаются (или, во всяком случае, предпочитают это не афишировать), то создавать идеальный отладчик производителю просто не резон. Что же до некоммерческих отладчиков… При всем моем уважении к ним (я часто использую OllyDbg и люблю его), они еще не встали с горшка и для достижения совершенства им еще расти и расти. Впрочем, эмулирующие отладчики с такой защитой справляются на раз, но где вы видели эмулирующий отладчик под Windows? Можно, конечно, взять полноценный эмулятор PC с интегрированным отладчиком типа BOCHS (под который, кстати говоря, существуют и дополнительные отладчики, входящие в исходные тексты, но отсутствующие в готовой бинарной сборке), однако отлаживать на нем Windows-приложения практически нереально, поскольку нет никакой возможности отличить код одного процесса от другого. Программа, которая трассирует себя, под отладчиками выполняется неправильно – она трассируется отладчиком, но не сама собой. Хорошая идея – повесить на трассер распаковщик, расшифровывающий программу по мере ее выполнения. Это существенно затрудняет взлом, зачастую делая его практически невозможным. Вместо явной или косвенной проверки на отладчик, программа задействует общие с отладчиком ресурсы и под отладчиком становится просто нефункциональна. Простейший пример такой защиты приведен ниже. Он «позаимствован» из моей книги «Техника и философия хакерских атак» (полную электронную версию которой можно бесплатно скачать с ftp://nezumi.org.ru) и работает только под MS-DOS, тем не менее легко переносится в Windows, просто обработчик прерывания заменяется на обработчик структурного исключения (как именно это делается,

№10, октябрь 2005

показано в листинге 2) и перед расшифровкой вызывается API-функция VirtualProtect для установки атрибута записи (по умолчанию секции .text/.code и .rodata имеют атрибут read-only, и непосредственная расшифровка кода в них невозможна). Windows-вариант не сложен в реализации, но слишком громоздок и потому ненагляден. Листинг 3. Пример простейшей самотрассирующейся программы под ms-dos ; // устанавливаем новый обработчик трассировочного ; прерывания int 01h ; функция 25h (установить прерывание), ; прерывание — 01h mov ax,2501h ; указатель на обработчик прерывания lea dx,newint01h ; сервисная функция ms-dos int 21h ; // взводим флаг трассировки pushf ; сохраняем регистр флагов в стеке pop ax ; выталкиваем его в регистр ax or ah,1 ; взводим бит TF ; сохраняем измененный регистр ax в стеке push ax ; выталкиваем модифицированное значение ; в регистр флагов popf // теперь после выполнения каждой команды // процессор будет генерировать int 01, // передавая управление его обработчику // подготавливаем параметры для расшифровки lea si, crypted _ begin mov cx, (offset crypted _ end - crypted _ begin) / 2 repeat: ; // основной цикл расшифровки ; читаем очередное слово по si в ax, увеличивая si на 2 lodsw ; записываем в ячейку [esi-2] содержимое bx mov [si-2],bx ; крутим цикл, пока cx не равен нулю loop repeat ; ; ; ; ; ;

кажется, что это дурной цикл, работящий как memset т.е. заполняющий область памяти содержимым bx которое даже не было инициализировано! однако все не так, и на каждом ходу генерируется трассировочное прерывание, передающее управление обработчику int 01h, который неявно модифицирует bx ; // сбрасываем флаг трассировки pushf ; сохраняем регистр флагов в стеке pop dx ; выталкиваем его в регистр dx ; (ax используется обработчиком int 01h) and dh,0FEh ; сбрасываем бит TF ; сохраняем измененный регистр dx в стеке push dx ; выталкиваем модифицированное значение ; в регистр флагов popf

; // еще одна ловушка для хакера jmp _ to _ dbg: jmps under _ debugger // ... //

; «полезная нагрузка» (основной код программы)

new _ int _ 01h: ; зашифровываем содержимое регистра ax xor ax, 9fadh mov bx, ax ; помещаем его в регистр bx mov word ptr cs:[jmp _ to _ dbg],9090h ; «убиваем» условный переход, ведущий к подложной ветке ; (под отладчиком обработчик int 01h не получит ; управления и переход не будет убит) iret ; выходим из обработчика прерывания crypted _ begin:

55


программирование // ... //

; зашифрованный код/данные

crypted _ end:

Можно ли это взломать? Если честно, то данный пример ломается без особого напряжения и с минимумом телодвижений. Просто устанавливаем аппаратную точку останова на crypted_begin и дожидаемся завершения распаковки, после чего снимаем дамп, превращаем его в exeфайл, который уже можно отлаживать обычным путем. Чтобы не дать себя обмануть, защита должна использовать множество вложенных расшифровщиков или бороться с отладчиком иным путем (например, убивать его через доступ к физической памяти, о чем мы поговорим чуть ниже). Главное достоинство описанного приема в том, что он хорошо чувствует себя под всей линейкой Windows (как 9x, так и NT) и маловероятно, чтобы в последующих версиях что-нибудь изменилось.

Доступ к физической памяти В MS-DOS код отладчика и системные данные (например, таблица векторов прерываний) находились в одном адресном пространстве с отлаживаемой программой, что открывало большой простор для методов борьбы. Можно было проскандировать память и убить отладчик или просто задействовать отладочные вектора (int 01h и int 03h) под нужды защитного механизма, положив туда что-то полезное (скажем, ключ расшифровки), а через некоторое время считать его обратно. Если никакого отладчика нет или он неактивен, искажение отладочных векторов не нарушает работоспособности операционной системы, и мы читаем то, что положили. А вот под отладчиком все будет иначе. Скорее всего произойдет тотальный крах, поскольку при генерации трассировочного прерывания или достижении точки останова управление будет передано в «космос» (вектор ведь искажен!). Если же отладчик принудительно восстановит вектора, тогда вместо сохраненных данных защищенная программа прочитает уже не ключ расшифровки, а нечто совершенно иное! Теоретически на 386+ процессорах отладчик может контролировать доступ к отладочным векторам и эмулировать операции чтения/записи, не производя их на самом деле. Но это потребует двух аппаратных точек останова, которых в x86 процессорах всего четыре, да и тех постоянно не хватает, так что разбрасываться ими не резон. Операционная система Windows использует раздельные адресные пространства и виртуальную память, а это значит, что отлаживаемое приложение не может «дотянуться» ни до отладчика, ни до векторов прерываний. Можно, конечно, написать драйвер (как известно, драйвер может все или практически все), но о сопутствующих проблемах мы уже говорили. Написание драйверов требует высокой квалификации, к тому же в силу их крошечного размера драйвера очень просто ломать, а написать сложный драйвер практически нереально – его «пусконаладка» займет всю оставшуюся жизнь. В операционных системах семейства NT имеется специальное псевдоустройство «PhysicalMemory», предостав-

56

ляющее доступ к физической памяти на чтение/запись. Это действительно физическая память, причем еще до виртуальной трансляции, и в ней есть все то, что находится в памяти компьютера в данный момент. Страниц, выгруженных на диск в файл подкачки, там нет, но нам они и не требуются. Нам нужен код и данные операционной системы. При наличии прав администратора мы можем не только читать «PhysicalMemory», но и писать. Да-да! Вы не ослышались и это не опечатка! С прикладного уровня можно проникнуть в святая святых операционной системы, свободно модифицируя код, исполняющийся на привилегированном уровне нулевого кольца (RING0), а это значит, что мы фактически имеем RING0 на прикладном кольце (RING3)! Любой отладчик может быть уничтожен без проблем, даже если это отладчик-эмулятор. Исключение составляют лишь виртуальные машины типа BOCHS, но, как мы уже говорили, пытаться отладить Windows-приложение на них несерьезно. Хакер утонет в посторонних потоках и системных вызовах! Замечание: Эмуляторы типа VMWare или Virtual PC убить через PhysicalMemory так же нельзя, но что толку? Они не содержат интегрированного отладчика и не могут содержать его в принципе, поскольку используют динамическую эмуляцию, при которой большая часть кода виртуальных машин исполняется на живом процессоре, а это значит, что проэмулировать TF-флаг без серьезной доработки эмулятора (и потери колоссальной производительности) никому не удастся. Некоторые считают PhysicalMemory ужасной дырой в безопасности. Дескать, как это так – с прикладного уровня и сразу в дамки! На самом деле здесь нет ничего ненормального. Если у хакера есть права администратора, он может беспрепятственно загружать драйвера, из которых можно делать все, что угодно, причем в NT загрузка драйвера не требует перезагрузки, а это значит, что наличие псевдоустройства «PhysicalMemory» никак, я повторяю, никак не отражается на безопасности, а всего лишь делает доступ к физической памяти более комфортным и удобным. В UNIX (модель безопасности которой вырабатывалась годами) издавна существуют псевдоустройства /dev/mem и /dev/kmem, предоставляющие доступ к физической памяти до и после трансляции, но никто не собирается их критиковать. Эта функция нужна достаточно многим системным программам и самой операционной системе, если ее изъять, программисты начнут писать свои драйвера, предоставляющие доступ к физической памяти, и тогда начнется полный разброд и распад, поскольку в них не исключены всякого рода ошибки. Разработчик драйвера может забыть о проверке уровня привилегий и давать доступ не только администраторам, а всем пользователям системы, что будет нехорошо. Тем не менее Microsoft все-таки пошла на довольно-таки спорный шаг, и в Windows 2003 Server с установленным Service Pack 1 доступа к PhysicalMemory уже не имеет ни администратор, ни даже System. (см. статью «Changes to Functionality in Microsoft Windows Server 2003 Service Pack 1 Device\PhysicalMemory Object» на сайте Microsoft: www.microsoft.com/technet/prodtechnol/ windowsserver2003/library/BookofSP1/e0f862a3-cf16-4a48bea5-f2004d12ce35.mspx).


программирование Тем не менее на всех остальных системах данный прием работает вполне нормально, поэтому не стоит списывать его со счетов, а с Windows 2003 Sever SP1 мы еще разберемся! (Не сейчас, в смысле еще не в этой статье, но какнибудь потом.) Давайте возьмем утилиту objdir из пакета NT DDK и запустим ее с параметром «\Device» (просмотр устройств и псевдоустройств, установленных в системе). Вот что она скажет: Листинг 4. Просмотр списка установленных (псевдо)устройств утилитой objdir $objdir \Devic … ParTechInc0 Device ParTechInc1 Device ParTechInc2 Device PfModNT Device PhysicalMemory Section PointerClass0 Device Processor Device RasAcd Device RawCdRom Device

Как видно, PhysicalMemory – это не совсем устройство, точнее, совсем не устройство (Device), а секция (Section), поэтому для работы с ней следует использовать функцию NtOpenSection. Пример простейшей реализации такого вызова приведен ниже: Листинг 5. Открытие псевдоустройства PhysicalMemory // разные переменные NTSTATUS ntS; HANDLE Section; ↵ OBJECT _ ATTRIBUTES ObAttributes; INIT _ UNICODE(ObString,L"\\Device\\PhysicalMemory"); // инициализация атрибутов InitializeObjectAttributes(&ObAttributes, &ObString, ↵ OBJ _ CASE _ INSENSITIVE | OBJ _ KERNEL _ HANDLE, ↵ NULL, NULL); // открываем секцию PhysicalMemory ntS = NtOpenSection(&Section, ↵ SECTION _ MAP _ READ|SECTION _ MAP _ WRITE, ↵ &ObAttributes);

Возможно, мы захотим предоставить доступ к псевдоустройству PhysicalMemory не только администратору, но и всем другим пользователям. Для этого необходимо изменить права. Естественно, делать это может только администратор, зато потом физическую память будут трогать все кому не лень. Многие вирусы и root-kit именно так и поступают. Они прописывают себя в автозагрузке (или любым другим путем закрепляются в системе) и ждут, пока пользователь хотя бы разочек не зайдет в систему под администратором. После этого они меняют права на PhysicalMemory и дальше работают уже из-под пользователя. Легальные программы, в частности защитные механизмы, зачастую поступают так же. Требуя администратора лишь на стадии установки, они тем не менее успевают за это время существенно ослабить безопасность системы. Ну что тут можно сказать? Никогда не устанавливайте на компьютер программ, которым не вполне доверяете. То есть не устанавливайте никаких программ вообще. Шутка. Ладно, не будем отвлекаться, а лучше рассмотрим, какие шаги необходимо предпринять для изменения атрибутов доступа.

№10, октябрь 2005

! от к р ы в ае м \ Devic e\ Physic alM emor y, и с п ол ь зуя NtOpenSection, получаем дескриптор;

! извлекаем из него дескриптор безопасности (security descriptor) через GetSecurityInfo;

! добавляем права на чтение/запись в текущий ACL с помощью функции SetEntriesInAcl;

! обновляем дескриптор безопасности посредством вызова SetSecurityInfo;

! закрываем дескриптор, возвращенный NtOpenSection. Теперь физическую память можно читать и писать. Для этого секцию PhysicalMemory нужно спроецировать на виртуальное адресное пространство, вызвав NativeAPIфункцию NtMapViewOfSection. Ниже показано, как это сделать: Листинг 6. Проецирование физической памяти на виртуальное адресное пространство // переменные-аргументы HANDLE Section = xxx; // // PVOID vAddress = xxx; // // DWORD Size = xxx; // //

← входной параметр дескриптор секции ← входной параметр виртуальный адрес, куда проецировать ← количество байт для проецирования от начала секции

// прочие переменные, инициализированные программой PHYSICAL _ ADDRESS pAddress; NTSTATUS ntS; ↵ DWORD MappedSize; PVOID MappedAddress=NULL; // Внимание! Функции _ _ GetPhysicalAddress не сущестует // в природе! Она дана условно. Ниже по тексту будет // объяснено почему pAddress = _ _ GetPhysicalAddress((PVOID) vAddress); // проецируем секцию PhysicalMemory на виртуальное // адресное пространство ntS = NtMapViewOfSection(Section, (HANDLE) -1, ↵ &MappedAddress, 0L, Size, &pAddress, &MappedSize, ↵ 1, 0, PAGE _ READONLY);

Единственная проблема – это трансляция адресов (перевод физических адресов в виртуальные и наоборот). NT предоставляет доступ только к физической памяти до трансляции, а поскольку физическая память используется как кэш, то одни и те же физические страницы в разное время могут отображаться на различные виртуальные адреса многих адресных пространств. «Официально» трансляцией занимается функция MmGetPhysicalAddress, доступная только на уровне ядра, что нас, прикладников, естественно, не устраивает. Тем не менее ситуация вовсе не так безнадежна, как это кажется на первый взгляд. Для большинства задач искать соответствие между физическими и виртуальными адресами вообще не нужно! Ведь существуют же сигнатуры! Достаточно создать банк сигнатур всех популярных отладчиков, после чего их обнаружение не станет проблемой, а большинство служебных структур типа таблицы дескрипторов прерываний (IDT) вообще работают с физическими адресами. Найти их путем сканирования PhysicalMemory – не проблема. После чего останется только поиздеваться над прерываниями int 01h и int 03h (или над их обработчиками). Прием, конечно, грубый и убивающий любые отладчики независимо от того, отлаживают ли они нашу программу или нет. Правильные программисты так не поступают! Защитные механизмы не должны, просто не имеют морального (и от-

57


программирование части даже юридического) права мешать отладке посторонних программ, но... Зачастую они все-таки мешают. Так что сказанное надо воспринимать не как руководство к действию, а как пособие по ремонту чужих защит. О взломе в данном случае никто и не говорит. Почему я, легальный пользователь защищенной программы, заплативший за нее деньги, не могу держать на компьютере soft-ice?! Почему я должен каждый раз перезагружаться для работы с программой?! Впрочем, все это лирика. В некоторых случаях (например, для борьбы с отладчиками прикладного уровня) выполнять трансляцию все-таки необходимо. Это не так-то просто сделать! Статья «Playing with Windows /dev/(k)mem» из PHRACK (http://www.phrack.org/phrack/59/p59-0x10.txt) дает некоторые зацепки, частично решающие проблемы, но до полной победы еще далеко. Проще всего транслируются адреса из диапазона 80000000h:A0000000h. Перевод виртуального адреса в физический осуществляется путем наложения маски 1FFFF000h, однако начиная с адреса 877EF000h это правило срабатывает не всегда. Адреса < 80000000h и > A0000000h уже не могут быть транслированы таким путем, хотя с некоторой вероятностью маска FFFF000h всетаки срабатывает, и простейший вариант реализации функции __GetPhysicalAddress выглядит так: Листинг 7. Простейший (но ненадежный) алгоритм трансляции адресов PHYSICAL _ MEMORY MyGetPhysicalAddress(void *BaseAddress) { if (BaseAddress < 0x80000000 || BaseAddress >= ↵ 0xA0000000) { return(BaseAddress & 0xFFFF000); } }

return(BaseAddress & 0x1FFFF000);

Его можно встретить в некоторых вирусах и root-kit (когда вы столкнетесь с ним при дизассемблировании, вы будете знать, что это такое), однако в легальных программах (особенно коммерческих!) его использование категорически недопустимо, и потому необходимо либо все-таки писать свой драйвер, вызывающий MmGetPhysicalAddress из режима ядра, либо, воспользовавшись тем фактом, что адреса из диапазона 80000000h:877EF000h транслируются однозначно, внедрить в операционную систему специальный «жучок». То есть фактически создать в ней свой собственный call-gate, позволяющий вызывать ядерные функции с прикладного уровня. Один из вариантов его реализации приведен в вышеупомянутой статье, однако он не свободен от ошибок, и на многопроцессорных машинах (которыми, в частности, являются все машины с материнской платой и процессором Pentium-4 с технологией Hyper-Threading, не говоря уже о многоядерных AMD) возможны «синие экраны смерти», которые опять-таки недопустимы... Означает ли это, что данный антиотладочный прием полностью бесполезен? Вовсе нет! Трудности создания устойчивой и надежно работающей программы на его основе носят технический характер и вполне преодолимы.

58

Как работает Win2K/XP SDT Restore Хорошим примером использования доступа к физической памяти «честными» программами является утилита SDT Restore, копию которой можно бесплатно скачать с http://www.security.org.sg/ code/sdtrestore.html. Как и следует из ее названия, она занимается тем, что восстанавливает SDT – Service Description Table, содержащую указатели на системные вызовы, которые могут быть перехвачены злоумышленником для сокрытия своего присутствия в системе, то есть стелсирования. Многие root-kit так и делают. Они подменяют оригинальные вызовы на свои, и система теряет способность обнаруживать создаваемые ими файлы, процессы, сетевые соединения и т. д. В MS-DOS для борьбы со Stealth-вирусами обычно прибегали к системной дискете, но те времена уже давно прошли и, хотя Windows в принципе можно загрузить и с лазерного диска (например, Windows PE) или с дополнительного винчестера, такой подход не слишком-то удобен, хотя бы уже потому, что требует перезагрузки, а сервера лучше не перезагружать. Проще (хотя и не столь надежно) восставить SDT через PhysicalMemory. И хотя root-kit может легко отследить обращение к ней (для этого ему достаточно перехватить NtOpenSection), все известные мне зловредные программы этим еще не занимаются, и потому они могут быть легко обезврежены. Во всяком случае пока. Подробнее о методах маскировки и борьбы можно прочитать в статье «Hide’n’Seek – Anatomy of Stealth Malware» (http://www. blackhat.com/presentations/bh-europe-04/bh-eu-04-erdelyi/bh-eu04-erdelyi-paper.pdf).

Если не трогать трансляцию, то никаких проблем вообще не возникает!

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


bugtraq Множественные уязвимости в различных диссекторах в Ethereal Программа: Ethereal 0.7.7-0.10.12. Опасность: Критическая. Описание: Обнаружены множественные уязвимости в обработке различных диссекторов и PCRE в Ethereal. Удаленный пользователь может с помощью специально сформированных пакетов вызвать отказ в обслуживании или выполнить произвольный код на целевой системе. 1. Потребление всех доступных ресурсов на системе в диссекторах ISAKMP, FC-FCS, RSVP, ONC RPC и ISIS LSP. 2. Аварийное завершение работы в диссекторах IrDA, SMB. 3. Выполнение произвольного кода в диссекторах SLIMP3, AgentX, SRVLOC 4. Бесконечный цикл в диссекторах BER, SigComp UDVM. 5. Разыменование нулевого указателя в диссекторах SCSI, sFlow, Rtnet 6. Деление на ноль в диссекторе X11 7. Освобождение некорректного указателя в диссекторе WSP Установщик Windows использует уязвимую версию PCRE. URL производителя: www.ethereal.com. Решение: Установите последнюю версию (0.10.13) с сайта производителя.

Переполнение буфера в ProZilla Программа: ProZilla 1.3.7.4. Опасность: Высокая. Описание: Уязвимость существует из-за ошибки при обработке результатов поиска в функции get_string_ahref() файла ftpsearch.c. Удаленный пользователь может вызвать переполнение стека и выполнить произвольный код на целевой системе с помощью злонамеренного сервера, который вернет на запрос специально сформированную строку в атрибуте HREF тега <A>. Удачная эксплуатация требует, чтобы ProZilla был запущен с атрибутом -ftpsearch и атакующий мог отравить DNS-кеш. URL производителя: http://prozilla.genesys.ro. Решение: Установите исправление с сайта производителя.

Переполнение буфера в компоненте W3C-логирования в MailEnable Программа: MailEnable Professional 1.6 и более ранние версии; Enterprise 1.1 и более ранние версии. Опасность: Высокая. Описание: Уязвимость существует в службе IMAP в компоненте W3C-логирования. Удаленный пользователь может вызвать переполнение буфера и выполнить произвольный код на целевой системе. URL производителя: www.mailenable.com. Решение: Установите исправление с сайта производителя – http://www.mailenable.com/hotfix/MEIMAPS-UPD0508221400.zip.

№10, октябрь 2005

Уязвимость форматной строки при обработке имени файла в различных антивирусах Bitdefender Программа: BitDefender Internet Security 9, BitDefender Professional Plus 9, BitDefender Standard 9, BitDefender Antivirus Professional Plus 8.x, BitDefender Antivirus Standard 8.x, BitDefender Professional Edition 7.x, BitDefender Standard Edition 7.x. Опасность: Критическая. Описание: Уязвимость форматной строки обнаружена при создании файла с результатами сканирования. Модуль не в состоянии корректно обработать специально сформированный каталог или файл, содержащий спецификации формата в его имени (например, 8X%.8X). В результате удаленный атакующий может создать специально обработанный файл чтобы скомпрометировать систему удаленного пользователя. URL производителя: www.bitdefender.com. Решение: Уязвимость устранена в BitDefender 7.x, BitDefender 8.x и BitDefender 9 Internet Security 26 сентября 2005 года и в BitDefender 9 Professional Plus и BitDefender 9 Standard 4 октября 2005 года.

Выполнение произвольного кода в Sun Directory Server Программа: Sun Directory Server 5.2 Patch 3 и более ранние версии. Опасность: Критическая. Описание: Уязвимость позволяет удаленному пользователю выполнить произвольный код на целевой системе. Подробности уязвимости не сообщаются. URL производителя: www.sun.com. Решение: Установите исправление (5.2 Patch 4) с сайта производителя.

Уязвимость форматной строки в VERITAS NetBackup в службе bpjava-msvc Программа: VERITAS NetBackup Data and Business Center 4.5FP All All NB_45_9S1443_F, VERITAS NetBackup Data and Business Center 4.5MP All All NB_45_9S1729_M, VERITAS NetBackup Enterprise/Server/Client 5.0 All All NB_50_5S1320_ M, VERITAS NetBackup Enterprise/Server/Client 5.1 All All NB_ 51_3AS0949_M, VERITAS NetBackup Enterprise/Server/Client 6.0 All All NB_60_3S0007_M. Опасность: Критическая. Описание: Уязвимость форматной строки обнаружена в службе bpjava-msvc, предназначенной для аутентификации пользователей в пользовательском Java-интерфейсе. Удаленный пользователь может послать специально сформированную команду COMMAND_LOGON_TO_MSERVER на TCP-порт приложения 13722 и выполнить произвольный код на целевой системе с привилегиями SYSTEM. URL производителя: www.symantec.com. Решение: Установите исправление с сайта производителя.

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

59


программирование

Как программы на Си взаимодействуют с сервером БД PostgreSQL

Владимир Мешков PostgreSQL является эффективным средством для хранения и обработки информации. Разработчики этой СУБД предоставили интерфейсы для многих языков программирования. Поддержка таких языков, как Perl, PHP, Python, обеспечивает широкое применение PostgreSQL в области веб-программирования. Язык системного программирования Cи позволит использовать эту СУБД, когда необходимо добиться от приложения максимального быстродействия.

С

егодня мы рассмотрим пример взаимодействия программы на языке Си и сервера баз данных PostgreSQL c использованием библиотеки libpq. В случае отсутствия опыта работы с СУБД PostgreSQL рекомендую начать изучение этой темы со статьи Сергея Супрунова [1].

60

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


программирование зой данных. Библиотека входит в состав дистрибутива СУБД PostgreSQL. Для выполнения информационного обмена клиентская программа вначале должна подключиться к базе данных. Для связи с сервером баз данных используется механизм сокетов, при этом если клиент и сервер расположены на одной локальной машине, используется сокет домена AF_ UNIX, в случае расположения на удаленных машинах – сокет домена AF_INET. Тип домена указывается в параметрах системного вызова socket. Для хранения адресной информации сокет домена AF_ UNIX использует структурный тип sockaddr: struct sockaddr { sa _ family _ t sa _ family; char sa _ data[14]; }

}

Листинг 2. Клиентский процесс int main() { int sock; struct sockaddr saddr; char c, rc; sock = socket(AF _ UNIX, SOCK _ STREAM, 0); memset((void *)&saddr, 0, sizeof(saddr)); saddr.sa _ family = AF _ UNIX; memcpy(saddr.sa _ data, "/tmp/.sock.new", 14);

Поле sa_family определяет тип домена, к которому принадлежит сокет (AF_UNIX в нашем случае), массив sa_data содержит путь к файлу, который описывает сокет. Таким образом, сокет домена AF_UNIX представляет собой специальный файл. Сервер PostgreSQL после запуска по умолчанию создает в каталоге /tmp сокет домена AF_UNIX в виде файла .s.PGSQL.5432, посмотреть на который можно при помощи команды ls -la. Среди прочих файлов будет запись следующего вида:

connect(sock, (struct sockaddr *)&saddr, ↵ sizeof(struct sockaddr));

srwxrwxrwt 1 pgsql users 0 Okt 4 10:37 .s.PGSQL.5432

Литера «s» перед правами доступа означает, что данный файл является сокетом. Команда netstat -a позволяет нам убедиться, что файл /tmp/.s.PGSQL.5432 входит в список активных сокетов домена AF_UNIX. Введем эту команду и увидим запись примерно такого вида: unix 2 [ ACC ] STREAM LISTENING 20636071 /tmp/.s.PGSQL.5432

Для лучшего понимания рассмотрим тестовый пример взаимодействия процессов через сокет домена AF_UNIX. Ниже представлены два листинга – серверного и клиентского процесса. В целях экономии места обработка ошибок пропущена. Листинг 1. Серверный процесс #include <sys/types.h> #include <sys/socket.h> int main() { int sock, newsock; struct sockaddr saddr; char c; static char rc = 1; /* Создаем сокет домена AF _ UNIX */ sock = socket(AF _ UNIX, SOCK _ STREAM, 0); /* Заполняем адресную структуру saddr */ memset((void *)&saddr, 0, sizeof(saddr)); saddr.sa _ family = AF _ UNIX; /* тип домена */ /* путь к файлу */ memcpy(saddr.sa _ data, "/tmp/.sock.new", 14); bind(sock, (struct sockaddr *)&saddr, ↵ sizeof(struct sockaddr)); listen(sock, 1);

№10, октябрь 2005

for(;;) { newsock = accept(sock, NULL, NULL); if(fork() == 0) { while(recv(newsock, &c, 1, 0) > 0) { send(newsock, &i, 1, 0); i++; } close(newsock); exit(0); } close(newsock); } return 0;

}

for(;;) { c = getchar(); send(sock, &c, 1, 0); if(recv(sock, &rc, 1, 0) > 0) ↵ printf("From server: %d\n", rc); else { close(sock); exit(0); } } return 0;

Запустим процессы в разных терминалах. Сервер после запуска создаст в каталоге /tmp файл .sock.new. Через этот файл будет осуществляться взаимодействие между клиентом и сервером: клиент будет отправлять серверу символы, вводимые пользователем, а сервер будет возвращать числовые значения, каждый раз увеличивая их на 1. При этом на каждый введенный символ сервер отвечает двумя. Тут все правильно, т.к. серверу передается еще и символ перевода строки «\n», вот он на него и реагирует. После остановки сервера сигналом SIGINT (комбинация клавиш <Ctrl+C>) файл .sock.new останется в каталоге /tmp. Его необходимо удалить вручную, или переопределить обработчик сигнала SIGINT для закрытия сокета и удаления файла .sock.new, иначе при повторном запуске сервера системный вызов bind не сможет привязать адресную структуру к сокету, сообщая нам, что «Address already in use (адрес уже используется)». Вернемся к рассмотрению темы статьи. Итак, для подключения к серверу баз данных библиотека предоставляет несколько функций, но мы рассмотрим одну – PQsetdbLogin. Прототип этой функции имеет следующий вид: PGconn *PQsetdbLogin(const char *pghost, const char *pgport, const char *pgoptions, const char *pgtty, const char *dbName, const char *login, const char *pwd);

Эта функция устанавливает новое соединение с базой данных, которое описывается при помощи объекта типа PGconn. Параметрами функции являются:

61


программирование ! pghost – если сервер и клиент расположены на локаль-

! ! ! ! !

ном хосте, этот параметр принимает значение NULL, и взаимодействие с сервером осуществляется через сокет домена AF_UNIX, по умолчанию расположенный в каталоге /tmp. При работе через сеть это поле содержит имя или IP-адрес хоста, на котором находится сервер баз данных; pgport – номер порта (NULL для локального хоста); pgoptions – дополнительные опции, посылаемые серверу для трассировки/отладки соединения; pgtty – терминал или файл для вывода отладочной информации; dbName – имя базы данных; login, pwd – имя пользователя и пароль доступа к базе данных.

Функция PQsetdbLogin всегда возвращает указатель на объект типа PGconn, независимо от того, успешно было установлено соединение или нет. Проверку состояния соединения выполняет функция PQstatus. Объект типа PGconn передается этой функции в качестве параметра, возвращаемое функцией значение характеризует состояние соединения: ! CONNECTION_BAD – не удалось установить соединение с базой данных; ! CONNECTION_OK – соединение с базой данных успешно установлено. Эти значения определены в заголовочном файле libpq-fe.h. После установления соединения клиентская программа может приступить к обмену информацией с базой данных. Для этой цели библиотека libpq предоставляет функцию PQexec, прототип которой имеет следующий вид: PGresult *PQexec(PGconn *conn, const char *query);

Параметрами функции PQexec являются указатель на объект типа PGconn (результат работы функции PQsetdbLogin) и строка, содержащая запрос к базе данных. Отправив запрос, функция ожидает ответ от базы и сохраняет в структуре типа Pgresult статус запроса и данные, полученные от базы. Для обработки статуса запроса к базе данных используется функция PGresultStatus. ExecStatusType PQresultStatus(const PGresult *res);

Функция PQresultStatus может возвращать следующие значения, определенные в файле libpq-fe.h: ! PGRES_EMPTY_QUERY – серверу отправлена пустая строка запроса; ! PGRES_COMMAND_OK – запрос, не требующий возврата данных из базы, выполнен успешно; ! PGRES_TUPLES_OK – успешное чтение данных из базы; ! PGRES_FATAL_ERROR – при обращении к базе данных произошла критическая ошибка. Если статус запроса равен PGRES_TUPLES_OK, структура PGresult будет содержать данные, полученные от базы.

62

Данные представляют собой последовательность (кортеж) строк таблицы, и каждая строка состоит из нескольких ячеек. Выполнить выборку содержимого определенной ячейки можно при помощи функции PQgetvalue: char* PQgetvalue(const PGresult *res, int tup _ num, ↵ int Þeld _ num);

Здесь tup_num – это номер строки таблицы, а field_num – номер ячейки в строке, из которой считываются данные. Для определения числа строк, считанных из таблицы, используется функция PQntuples (tuple в переводе с английского означает кортеж, последовательность): int PQntuples(const PGresult *res);

Функция PQnfields вернет число ячеек в одной строке таблицы: int PQnÞelds(const PGresult *res);

По окончании информационного обмена с базой данных клиентская программа должна при помощи функции PQclear освободить структуру PGresult, содержащую результаты запроса, и отключиться от базы, вызвав функцию PQfinish: void PQclear(PQresult *res); void PQÞnish(PGconn *conn)

Пример использования библиотеки libpq Рассмотрим простой пример использования библиотеки. Предположим, что у нас имеется каталог, содержащий файлы различных типов (в том числе и специальные). Мы составим две программы на языке Си: первая программа будет выполнять обход указанного ей каталога, считывать и заносить в базу данных имена и размеры всех регулярных файлов из этого каталога и всех вложенных каталогов. Вторая программа будет считывать информацию об этих файлах из базы данных и выводить ее на экран. Для выполнения этой задачи устанавливаем на локальную машину СУБД PostgreSQL (см. [1]). После инициализации базы данных создаем нового пользователя my_user и новую базу my_database: createuser -a -d my _ user -E -P createdb -O my _ user my _ database

Для доступа к базе данных пользователь my_user должен указать пароль. Сам пароль будет храниться в зашифрованном виде, в конфигурационном файле pg_hba.conf меняем значение поля METHOD c trust на md5. Далее, подключаемся к базе данных my_database и создаем в ней таблицу, состоящую из двух полей: поля fname типа char(100) для хранения имен файлов и поля fsize типа int для хранения размеров файлов.

Заполнение базы данных информацией Первый этап разработки – программа для заполнения базы данных информацией. Назовем ее insert_data. Входные параметры – имя базы данных, имя таблицы в базе и имя ка-


программирование талога, из которого будут считываться данные о файлах – передаются в параметрах командной строки: # ./insert _ data -d [имя базы данных] -t [имя таблицы] ↵ -p [имя каталога]

Определим переменные для хранения имен базы данных, таблицы и каталога для чтения: unsigned char *dbname = NULL; /* имя базы данных */ unsigned char *table = NULL; /* имя таблицы */ /* каталог, из которого считываются данные */ unsigned char *pathname = NULL;

Проверяем число переданных аргументов. Их должно быть 7: if(argc != 7) usage();

Если количество переданных аргументов не соответствует указанному значению, при помощи функции usage() отобразим формат вызова нашей программы: void usage() { fprintf(stderr, "Usage: insert _ data ↵ -d [имя базы данных] -t [имя таблицы] ↵ -p [исходный каталог]\n"); exit(0); }

Считываем параметры командной строки. Разбор командной строки выполним при помощи функции getopt: while((int c = getopt(argc, argv, "d:t:p:")) != EOF) { switch(c) { case 'd': /* имя базы данных */ dbname = (unsigned char *)optarg; break; case 't': /* имя таблицы */ table = (unsigned char *)optarg; break; case 'p': /* имя каталога */ pathname = (unsigned char *)optarg; break; /* ошибка в параметрах */ case '?': default: usage(); } }

Считываем имя пользователя и пароль для доступа к базе данных: unsigned char user[80]; /* имя пользователя */ unsigned char pwd[80]; /* пароль доступа к базе данных */ memset(user, 0, sizeof(user)); printf("Login: "); scanf("%s", user); memset(pwd, 0, 80); printf("Password: ");

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

№10, октябрь 2005

#include <termios.h> int tcgetattr(int ttyfd, struct termios *told); int tcsetattr(int ttyfd, int actions, const struct ↵ termios *tnew);

Функция tcgetattr сохраняет текущее состояние терминала в структуре told типа termios. Параметр ttyfd должен быть дескриптором файла, описывающего терминал. Для получения доступа к своему управляющему терминалу процесс может использовать имя файла /dev/tty, которое всегда интерпретируется как текущий управляющий терминал или стандартный вывод с дескриптором 0. Вызов функции tcsetattr установит новое состояние терминала, заданное структурой tnew, а параметр actions определяет, когда и как будут установлены новые атрибуты терминала: ! TCSNOW – немедленное выполнение изменений; ! TCSADRAIN – перед установкой новых параметров ожидается опустошение очереди вывода; ! TCSAFLUSH – ожидается опустошение очереди вывода, затем также очищается очередь ввода. Для доступа к управляющему терминалу открываем соответствующий файл устройства: int ttyfd = open("/dev/tty", O _ RDWR);

Далее считываем текущее состояние терминала в структуру struct termios t, снимаем флаг отображения символов ECHO в поле c_lflag и устанавливаем новое состояние терминала: tcgetattr(ttyfd, &t); /* сохраняем настройки терминала */ t.c _ lßag &= ~ECHO; /* сбрасываем флаг ECHO */ /* устанавливаем новое состояние терминала */ tcsetattr(ttyfd, TCSANOW, &t);

Наличие флага TCSANOW требует немедленного выполнения изменений. Подробности управления терминалом смотрите в man termios. После этих действий вводим пароль для доступа к базе данных: scanf("%s", pwd);

Вернем настройки терминала в исходное состояние – включим отображение вводимых символов на экране: t.c _ lßag |= ECHO; /* устанавливаем флаг ECHO */ tcsetattr(ttyfd, TCSANOW, &t); close(ttyfd);

Подключаемся к базе данных, вызвав функцию PQsetdbLogin. Эта функция вернет указатель на объект типа PGconn, независимо от того, успешно было установлено соединение или нет: PGconn *conn = PQsetdbLogin(NULL, NULL, NULL, NULL, ↵ dbname, user, pwd);

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

63


программирование не передаем. Если сервер расположен на удаленной машине, то вызов функции PQsetdbLogin примет следующий вид: PQsetdbLogin("192.168.1.1", "5432", NULL, NULL, dbname, ↵ user, pwd),

где 192.168.1.1 – IP адрес хоста, на котором установлен сервер баз данных, 5432 – порт, который слушает база. Анализируем состояние соединения и в случае ошибки завершаем выполнение программы: if(PQstatus(conn) == CONNECTION _ BAD) { fprintf(stderr, "Connection to database failed.\n"); fprintf(stderr, "%s", PQerrorMessage(conn)); exit(1); }

При успешном установлении соединения с базой данных считываем необходимую нам информацию из указанного каталога. Считывание выполняет рекурсивная функция list_dir(), в параметрах которой мы передаем указатель на объект типа PGconn, имя таблицы в базе данных и имя каталога: int list _ dir(PGconn *conn, unsigned char *table, ↵ unsigned char *pathname) { struct dirent *d; struct stat s; DIR *dp; /* результат обращения к базе данных */ PGresult *res; /* абсолютное путевое имя файла */ unsigned char full _ path[256]; /* строка запроса к базе данных */ unsigned char query[QUERY _ LEN]; /* данные, передаваемые базе */ unsigned char escape _ string[80]; /* Открываем каталог */ if((dp = opendir(pathname)) == NULL) { perror("opendir"); return -1; } /* Пропускаем родительский и текущий каталоги */ d = readdir(dp); // "." d = readdir(dp); // ".." /* Цикл чтения записей каталог */ while(d = readdir(dp)) { /* Формируем абсолютное путевое имя файла */ /* и получаем информацию о нем */ memset(full _ path, 0, 256); sprintf(full _ path, "%s/%s", pathname, ↵ d->d _ name); stat(full _ path, &s); /* Если это каталог – выполняем рекурсивный */ /* вызов функции */ if(S _ ISDIR(s.st _ mode)) list _ dir(conn, ↵ table, full _ path); /* Добавляем в базу информацию о файле, при этом */ /* преобразуем путевое имя файла при помощи */ /* функции PQescapeString */ memset(escape _ string, 0, 80); PQescapeString(escape _ string, ↵ full _ path, 80); /* Формируем запрос и отправляем его базе данных */ memset(query, 0, QUERY _ LEN); sprintf(query, "INSERT INTO %s ↵ values('%s','%u')", table, ↵ full _ path, s.st _ size); res = PQexec(conn, query); /* Проверяем статус запроса. Он должен быть равен */

64

}

/* PGRES _ COMMAND _ OK, т.к. данных от базы мы не */ /* получаем */ if(PQresultStatus(res) != ↵ PGRES _ COMMAND _ OK) { fprintf(stderr, "INSERT ↵ query failed.\n"); break; } } closedir(dp); PQclear(res); return 0;

После записи информации в базу данных отключаемся от нее: PQÞnish(conn);

Если функцию PQfinish не вызвать, то в данном случае ничего страшного не произойдет, потому что процесс завершает выполнение. Ядро удаляет процесс из общего списка, уничтожая все служебные структуры, описывающие файлы и сокеты, с которыми процесс работал, а значение дескриптора сокета (так же как и файла) имеет смысл только в контексте процесса, так как по сути это индекс в массиве структур. Если вместо функции отключения от базы перед выходом из программы организовать бесконечный цикл и ввести в соседнем терминале команду netstat, то можно увидеть, что процесс установил соединение с базой данных через сокет домена AF_UNIX. При остановке процесса сигналом SIGINT (комбинация клавиш Ctrl-C) это соединение исчезает, даже если мы не вызываем функцию PQfinish. Другое дело, если процесс не закрыл соединение и продолжает функционировать (например, если это фоновый процесс). Тогда возможна ситуация несанкционированного использования уже установленного соединения (сокет не закрыт) для доступа к базе данных, и при этом необязательно знать пароль. Поэтому закрывать соединение надо явно. Вместо рассмотренной рекурсивной функции list_dir в нашем примере удобнее использовать функцию ftw, которая выполняет обход дерева каталогов, начиная с заданного, и вызывающая процедуру, определенную пользователем для каждой встретившейся записи каталога. Функция ftw имеет следующий вид: #include <ftw.h> int ftw(const char *path, int(* func)(), int depth);

Первый параметр path определяет имя каталога, с которого должен начаться рекурсивный обход дерева. Параметр depth управляет числом используемых функцией ftw различных дескрипторов файлов. Чем больше значение depth, тем меньше будет случаев повторного открытия каталогов, что сократит общее время обработки вызова. Второй параметр func – это определенная пользователем функция, вызываемая для каждого файла или каталога, найденного в поддереве каталога path. При каждом вызове функции func будут передаваться три аргумента: заканчивающаяся нулевым символом строка с именем объекта, указатель на структуру stat с данными об объекте и целочисленный код. Функция func, следовательно, должна быть построена следующим образом:


программирование int func(const char *name, const struct stat *sptr, ↵ int type) { /* Тело функции */

}

} return 0;

Для получения исполняемого модуля введем команду:

} # gcc -o insert _ data insert _ data.c -lpq

Целочисленный аргумент type может принимать одно из нескольких возможных значений, определенных в заголовочном файле и описывающих тип встретившегося объекта: ! FTW_F – объект является файлом; ! FTW_D – объект является каталогом; ! FTW_DNR – объект является каталогом, который нельзя прочесть; ! FTW_SL – объект является символьной ссылкой; ! FTW_NS – объект не является символьной ссылкой, для него нельзя успешно выполнить вызов stat. Работа вызова будет продолжаться до тех пор, пока не будет завершен обход дерева или не возникнет ошибка внутри функции ftw. Обход также закончится, если определенная пользователем функция возвратит ненулевое значение. Тогда функция ftw прекратит работу и вернет значение, возвращенное функцией пользователя. Ошибки внутри функции ftw приведут к возврату значения -1, тогда в переменной errno будет выставлен соответствующий код ошибки. Вызовем в нашей программе вместо рекурсивной функции list_dir функцию ftw: ftw(pathname, list _ dir1, 1);

Функция list_dir1 передает базе данных информацию о каждом регулярном файле: int list _ dir1(const char *name, const struct stat *s, ↵ int type) { PGresult *res; /* строка запроса к базе данных */ unsigned char query[QUERY _ LEN]; unsigned char escape _ string[80]; /* Возвращаемся, если вызов stat завершился неудачно */ if(type == FTW _ NS) return 0; /* Если объект является регулярным файлом, */ /* добавляем информацию о нем в базу */ if((type == FTW _ F) && S _ ISREG(s->st _ mode)) { memset(escape _ string, 0, ↵ sizeof(escape _ string)); PQescapeString(escape _ string, ↵ name, sizeof(escape _ string)); memset(query, 0, QUERY _ LEN); sprintf(query, "INSERT INTO ↵ %s values('%s','%u')", table, ↵ name, s->st _ size); res = PQexec(conn, query); /* Проверяем статус запроса */ if(PQresultStatus(res) != ↵ PGRES _ COMMAND _ OK) { fprintf(stderr, "INSERT ↵ query failed.\n"); return -1; } PQclear(res);

№10, октябрь 2005

Чтение информации из базы данных Второй этап разработки – программа для чтения информации из базы данных. Строится она по такому же принципу, как и предыдущая: в параметрах командной строки передаются имя базы данных и таблицы, выполняется ввод имени и пароля, при этом отображение вводимых символов отключается. После этого подключаемся к базе данных: conn = PQsetdbLogin(NULL, NULL, NULL, NULL, dbname, ↵ user, pwd); if(PQstatus(conn) == CONNECTION _ BAD) { fprintf(stderr, "Connection to database failed.\n"); fprintf(stderr, "%s", PQerrorMessage(conn)); exit(1); }

Формируем и отправляем запрос к базе для выборки всех полей из таблицы: memset(query, 0, QUERY _ LEN); sprintf(query, "SELECT * FROM %s", table); res = PQexec(conn, query);

В случае успешного чтения данных из базы статус запроса должен быть равен PGRES_TUPLES_OK. Проверяем это: if(PQresultStatus(res) != PGRES _ TUPLES _ OK) { fprintf(stderr, "SELECT query failed.\n"); goto out; }

Отображаем результаты чтения: for(i = 0; i < PQntuples(res); i++) { for(n = 0; n < PQnÞelds(res); n++) printf("%-20s", ↵ PQgetvalue(res, i, n)); printf("\n"); }

Функция PQntuples вернет число прочитанных из таблицы строк, а функция PQnfields – число ячеек в одной строке. Работоспособность программ была проверена для ОС Linux Slackware 10.2 и FreeBSD 5.2, использовался сервер баз данных PostgreSQL 8.0.3.

Литература: 1. Супрунов С. PostgreSQL: первые шаги. – Журнал «Системный администратор», №7, 2004 г. – 26-33 с. 2. PostgreSQL 7.3.2 Programmer’s Guide by The PostgreSQL Global Development Group. 3. Кейт Хэвиленд, Дайна Грей, Бен Салама. Системное программирование в UNIX. Руководство программиста по разработке ПО = Unix System Programming. A programmer’s guide to software development: Пер. с англ. – М., ДМК Пресс, 2000 г. – 368 с., ил.

65


программирование

Управляем серверами в реальном времени с помощью WSH WSH--сценари ценариев ев

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

Вместо предисловия На тему использования различных сценариев в задачах системного администрирования уже написана масса всевозможных статей. Особенно это касается Linux/UNIX-операционных систем, обладающих мощными языками сценариев, которые позволяют выполнять большое количество различных административных задач. А что же Windows? В Windows имеется WSH – Windows Script Host, это основной инструмент для всех административных сценариев, поскольку все административные сценарии выполняются внутри WSH. Сценарии WSH можно писать на языках Jscript .NET, VBScript, Perl, Python и REXX. В данной статье все примеры сценариев приводятся на VBScript. Документация по WSH предлагает использовать сценарии преимущественно для сбора информации о системе, работы с файловой системой или изменении различных системных настроек. Однако сегодня мы поговорим об использовании сценариев для автоматизированного мониторинга и управления Windows-серверами.

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

66

для автоматизированного управления Windows-серверами, довольно проста, особенно в свете недавних проблем с подачей электропитания. У заказчика имелось несколько серверов Windows 2003, и требовалось организовать бесперебойное электропитание на основе APC UPS. В комплекте с UPS поставлялось программное обеспечение, в состав которого входил агент для взаимодействия с UPS. Один из серверов подключался к источнику бесперебойного питания через COM-порт и на этом сервере был установлен агент, который в случае отключения питания должен был корректно завершить работу сервера. А вот на остальных серверах такой агент без подключения к источнику через СОМ-порт не работал, и следовательно, эти сервера в случае исчезновения питания проработали бы ровно столько, насколько хватило бы заряда аккумулятора, а потом просто отключатся, что, очевидно, совсем не хорошо. Компания-производитель предлагает в качестве решения проблемы приобрести специальное оборудование, проще говоря, СОМ-свитч, однако в силу ряда причин нас подобный вариант не устроил. Тогда и был написан сценарий на VBScript, который отслеживал в журнале событий появление сообщения

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

Читаем журнал событий (Event Log) Основой разрабатываемого сценария является цикл, который осуществляет поиск в журнале событий вхождений искомого сообщения. Такие сообщения могут быть двух видов: сообщение об отключении питания и о его восстановлении.


программирование При отключении питания в журнале событий появляется сообщение следующего вида (см. рис. 2). Забегая вперед, замечу, что нас будет особо интересовать именно поле Description, то есть тот текст, который сохраняется в журнале в качестве описания. При восстановлении питания агент создаст в журнале событий следующее сообщение (см. рис. 3). Итак, мы определили, как выглядят сообщения, отправляемые агентом источника бесперебойного питания. В журнале событий нам необходимо искать сообщения с полем Description вида: «UPS On Battery» или «Utility Power Restored», которые будут сигнализировать о потере питания и его восстановлении соответственно. Реализация поиска данных сообщений в журнале событий может выглядеть, например, вот так: Листинг 1. Поиск сообщений в журнале событий Option Explicit Dim objWMI, objItem ' Objects // Объявляем переменные Dim strComputer Dim intRecordNum, intRec, colLoggedEvents Dim strAdmin, strAdmin2, i, intrecordNum2, iteration ' WMI Core Section // Сервер, на котором выполняется сценарий strComputer="127.0.0.1" Set objWMI = GetObject("winmgmts:" _ & "{impersonationLevel=impersonate}!\\" _ & strComputer & "\root\cimv2") iteration=2 // счетчик итераций // искомые строки – отключение питания strAdmin = "UPS On Battery" // искомые строки – восстановление питания strAdmin2 = "Utility Power Restored" Do While 1=1 // цикл бесконечный // запрос по журналу событий. Раздел Applications Set colLoggedEvents = objWMI.ExecQuery ↵ ("Select * from Win32 _ NTLogEvent Where ↵ LogÞle = 'Application'" ) // счетчики записей intRecordNum=0 // счетчик найденных записей intRec=0 // счетчик всех записей intRecordNum2=0 For Each objItem in colLoggedEvents // ищем первое вхождение записи // на отключение If intRecordNum=0 Then If InStr(1,objItem.message,strAdmin,1) ↵ Then intRecordNum = intRec+1 End If // // If If

ищем первое вхождение записи на восстановление intRecordNum2=0 Then InStr(1,objItem.message,strAdmin2,1) ↵ Then intRecordNum2 = intRec +1 End If intRec=intrec+1 // если все нашли, выходим из цикла If intRecordNum>0 AND intrecordNum2>0 ↵ Then Exit For

Next / если не нашли записей об отключении, // то и записи о восстановлении не нужны If intrecordNum=0 Then intRecordNum2=0 If iteration=0 Then

shutdown // а здесь будет находиться ссылка на процедуру // отключения питания на других серверах End If If intrecordNum<intrecordNum2 Then iteration=iteration-1 End If If intrecordNum2=0 Then If intRecordNum>0 Then iteration=iteration-1 End If loop WScript.Sleep 10000 // Задержка перед следующей итерацией

№10, октябрь 2005

Рисунок 1. Журнал событий Event Log, содержащий сообщения от агента источника бесперебойного питания

Следует немного пояснить принцип работы данного сценария, а также смысл некоторых переменных. Одной из ключевых переменных, используемых в работе сценария, является переменная iteration. Данная переменная определяет количество итераций, а проще говоря, временной интервал, в течение которого наши сервера будут работать от источника бесперебойного питания, ожидая восстановления питания в электрической сети. Это сделано специально, чтобы в случаях кратковременного пропадания питания, на несколько секунд, сервера не начали автоматически отключаться. Этот интервал времени зависит от емкости аккумуляторов вашего источника бесперебойного питания и должен определяться опытным путем. Итак, в случае, если сценарий находит вхождение сообщения об отключении питания, счетчик iteration уменьшается на единицу, при достижении нулевого значения мы вызываем процедуру shutdown, о которой речь пойдет ниже. Также следует обратить внимание на последнюю команду сценария, которая определяет период бездействия цикла перед выполнением итерации, в миллисекундах. Указанный в листинге интервал в десять секунд на практике скорее всего окажется крайне мал. Опыт показывает, что интервал должен быть не менее минуты, так как уже в течении одной минуты любой источник бесперебойного питания просто обязан держать напряжение. К тому же поиск по всему журналу событий может отнимать довольно значительные ресурсы системы. Для борьбы с этим можно рекомендовать понизить приоритет процесса со «среднего» на «ниже среднего». Вообще читателю, искушенному в программировании, алгоритм, приведенный в Листинге 1, может показаться немного странным и нуждающимся в доработке. Такое мнение будет вполне справедливо, так как, составляя алгоритм, я, основываясь на своем опыте, сделал ряд допущений, тем самым существенно его упростив и сделав более удобочитаемым, не в ущерб качеству. Но, возможно, в вашем конкретном случае потребуется что-либо доработать или исправить. Однако продолжим, следующим этапом у нас будет процедура отключения питания.

Отключаем сервера Итак, перед нами стоит задача программно отключить питание на всех серверах нашей сети. Для этого прежде всего

67


программирование ческой поддержки. В качестве параметра данной процедуре передается имя отключенного сервера. Рассмотрим процесс отправки уведомлений более подробно.

Отправляем уведомления

Рисунок 2. Сообщение об отключении основного питания

Рисунок 3. Сообщение основного питания

необходимо завести на всех серверах (в случае, если в сети нет домена) или в домене учетную запись, наделенную соответствующими правами. Я бы очень не рекомендовал использовать для этих целей учетную запись администратора, так как в исходном тексте необходимо указать пароль учетной записи, которая используется для выполнения отключения. Также из соображений безопасности необходимо ограничить доступ к данному сценарию так, чтобы его могли читать/ запускать только администраторы. Подобная настройка выходит за рамки данной статьи, однако я думаю, что любой системный администратор без труда справится с этой задачей. Листинг 2. Процедура отключения питания Sub Shutdown On Error Resume Next // если ошибка, переходим к следующему Dim arrComputers, objLocator Dim login, password, domain // Перечисляем имена серверов, которые должны быть выключены arrComputers = Array("Computer1","Computer2","Computer3") login="operator" // учетная запись с правом на shutdown password="password" // пароль domain="TEST" // домен For Each strComputer In arrComputers Set objLocator = ↵ CreateObject("WbemScripting.SWbemLocator") Set objWMIService = ↵ objLocator.ConnectServer(strComputer, ↵ "root\cimv2", login, password, domain) Set colOperatingSystems = objWMIService.ExecQuery ↵ ("Select * from Win32 _ OperatingSystem") For Each objOperatingSystem in colOperatingSystems // непосредственно shutdown ObjOperatingSystem.Shutdown(1) Next // после отключения уведомим администратора sendmail(strComputer) Next WScript.Quit // сценарий завершает свою работу End Sub

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

68

На самом деле вполне логично отправить уведомление всем заинтересованным лицам о том, что тот или иной сервер был отключен в связи с потерей питания. В частности, мы сбережем нервную систему системного администратора, который, не зная причины, почему посреди ночи его сервера не пингуются, в ужасе помчится из дома о восстановлении на работу. А так наш сисадмин будет уже заранее знать причину отключения и по крайней мере не будет излишне переживать по поводу возможной потери данных. Также подобное уведомление будет весьма полезно, если сервера находятся на аутсорсинге, либо в компании приходящий администратор. Конечно, кто-то может возразить, что у агента, который взаимодействует с источником бесперебойного питания, уже есть возможность отправки уведомления администратору об отключении питания. Однако этот агент отправит уведомление об отключении питания, а нас интересует информация об отключении каждого сервера, а не только того, на котором установлен агент. Итак, обосновав необходимость отправки уведомления, приступим к описанию практической реализации. Современные технологии связи позволяют различные способы уведомления администратора о различных событиях в сети. Например, мне приходилось слышать о системе, которая в случае возникновения внештатной ситуации звонила админу по заранее заданному телефону и проигрывала mp3-файл, содержавший голосовую информацию. Но в такие крайности мы вдаваться не будем – отправим уведомление при помощи электронной почты. В принципе, с помощью того метода, который будет описан далее, наверняка можно отправлять и ICQ-сообщения и даже SMS (хотя изза различных ограничений, введенных операторами сотовой связи, это сделать будет крайне затруднительно). Раньше для отправки сообщений посредством сценариев Windows использовался почтовый клиент Outlook. При этом применялся сценарий следующего вида: Листинг 3. Отправка письма с помощью Outlook Dim OutlookObject, OutMail Set OutlookObject = CreateObject("Outlook.Application") Set OutMail = OutlookObject.CreateItem(0) OutMail.to = "test@test.ru" OutMail.Subject = "Тема сообщения" OutMail.Body = "Тело сообщения" OutMail.Send

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


программирование нариях VBScript. В связи с этим теперь Outlook каждый раз спрашивает, перед тем как позволить сценарию отправить письмо (см. рис. 4). К тому же практически любой антивирус заблокирует работу сценария. По понятным причинам нас это совершенно не устраивает. Но существует другой способ отправки почтовых сообщений сценарием. Данная процедура была найдена мной в MSDN [1]. Листинг 4. Отправка письма // Получаем в качестве параметра имя сервера Sub sendmail(server) // Инициализируем переменные Dim iMsg Dim iConf Dim Flds Dim str Const cdoSendUsingPickup = 1 Set iMsg = CreateObject("CDO.Message") Set iConf = CreateObject("CDO.ConÞguration") // Подготавливаем поля для отправки по SMTP Set Flds = iConf.Fields With Flds .Item("http://schemas.microsoft.com/cdo/ ↵ conÞguration/sendusing") = ↵ cdoSendUsingPickup .Item("http://schemas.microsoft.com/cdo/ ↵ conÞguration/smtpserverpickupdirectory") = ↵ "c:\inetpub\mailroot\pickup" .Update End With // Непосредственно текст сообщения str= "Уважаемый администратор. Сервер " & server & " ↵ был отключен "& Now &" в связи с потерей ↵ электропитания. " // заполоняем все поля сообщения With iMsg Set .ConÞguration = iConf .To = "admin@server.com" // Поле «Кому» .From = "ups@example.com" // Поле «От кого» // Тема письма .Subject = "Отключение питания на сервере " & server .HTMLBody = str .Send End With // Очищаем переменные Set iMsg = Nothing Set iConf = Nothing Set Flds = Nothing End Sub

Данная процедура отправит письмо по указанному адресу. В результате получателю придет сообщение примерно следующего содержания: Уважаемый администратор. Сервер MyServer был отключен 01.10.2005 23:03:31 в связи с потерей электропитания.

При необходимости процедуру можно легко подправить, для того чтобы отправлялось сразу несколько писем различным адресатам. Таким образом, мы решили третью и последнюю задачу, которая ставилась перед нашим сценарием WSH. Исходный код всего сценария прилагается к статье. Также хотелось бы обратить ваше внимание еще на один щекотливый момент. В случае восстановления питания необходимо снова включить отключенные сервера. Для этого прежде всего надо в BIOS каждого из серверов установить свойство «Wake Up On LAN → ON». Я не думаю, что это может создать какие-то трудности в повседневной работе хотя бы потому, что сервера должны быть всегда включены,

№10, октябрь 2005

их не выключают на ночь. Теперь нам необходимо создать какой-либо трафик с помощью наше го сценария. Сделать это можно с помощью фрагРисунок 4. Запрос на отправку мента одной из процедур, сообщения описанной ранее. Далее приводится фрагмент Листинга 1, в котором при обнаружении сообщения о восстановлении питания вызывается процедура WakeUp, осуществляющая пинг каждого из серверов (Листинг 6 соответственно). Обратите внимание на использованный в Листинге 6 метод Run. С помощью него можно выполнить любую команду, причем (как показано в Листинге 6) это делается в режиме hide. Если в вашем случае необходимо видимое окно, просто в качестве второго параметра для метода Run укажите единицу. Более подробное описание данного метода и его параметров можно найти в [1]. Листинг 5. Добавление вызова процедуры Wakeup в сценарий Листинга 1 …………….. // Ищем первое вхождение записи на восстановление If intRecordNum2=0 Then If InStr(1,objItem.message,strAdmin2,1) Then ↵ intRecordNum2 = intRec +1 WakeUp End If ………….. Листинг 6. Процедура WakeUp Sub WakeUp On Error Resume Next // если ошибка, переходим к следующему Dim arrComputers Dim WshShell, str // Перечисляем имена серверов, которые должны быть выключены arrComputers = Array("Computer1","Computer2","Computer3") Set WshShell = CreateObject("WScript.Shell") For Each strComputer In arrComputers str="ping "& strComputer //запускаем в режиме hide Return = WshShell.Run(str, 0) Next End Sub

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

Ссылка: 1. http://msdn.microsoft.com – содержит много примеров с исходными текстами сценариев.

69


hardware

Настраиваем автоответчик на базе Linux У меня зазвонил телефон. – Кто говорит? – Слон. – Откуда? – От верблюда. – Что вам надо? – Шоколада.

На самом деле позвонил не слон, а пользователь. И общаться ему пришлось не со мной, а с моим автоответчиком... Да и perl-связи ему не помогли... А вот как работает автоответчик и как его настроить на базе Linux?

К. Чуковский «Телефон»

Павел Закляков

Т

елефонный автоответчик вещь по своей сути очень простая. Обычно, когда к вам поступает входящий звонок, а вас нет или вы не хотите поднимать трубку, то автоответчик ожидает заданное число гудков. Далее поднимает трубку, проигрывает заготовленное сообщение и после переходит в режим записи. Через некоторое время появляетесь вы и прослушиваете поступившие сообщения. Насколько проста эта схема, настолько и проста её реализация с помощью vgetty. При желании схему можно усовершенствовать, добавив немного сервиса. Например, подключив автоответчик к сети Интернет или мобильному терминалу, можно научить его посылать вам уведомления по электронной почте или посредством SMS о том, что появились новые сообщения. Можно даже организовать удобный веб-интерфейс для просмотра/прослушивания принятых сообщений. Чем большим числом функций вы захотите пользоваться, тем больше настроек потребуется. Я нигде не видел грамотного howto или статьи с решением всех возникающих проблем по созданию автоответчика, поэтому решил восполнить этот пробел. В качестве программного обеспечения используется vgetty, работающая под Linux (настройки проводились под двумя ОС: RedHat Linux v.7.3 и Fedora Core 4). Также мы рассмотрим пример создания примитивного веб-интерфейса. Если вы хотите расширить возможности вашего голосового модема под Linux и свой кругозор, – эта статья для вас.

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

70

зумности она стала входить в состав пакета программ mgetty + sendfax. При этом основная страница этой программы (на которую есть ссылка в man и readme) давно не существует (http://www-internal.alphanet.ch/~schaefer/vgetty. html). Но последнее обновление программы датируется всё же апрелем этого года. Несмотря на то что в состав вашей операционной системы mgetty+sendfax, скорее всего, уже входит в виде заранее скомпилированного пакета, и его использование на первый взгляд может показаться более простым, мы от этого удобства откажемся. Если, например, у нас что-то не заработает и дело дойдёт до правки исходных текстов, то нам их всё равно придётся установить. Также некоторые программы, работающие с vgetty, например vocp, могут сразу же требовать установку из исходных кодов, а не из готовых пакетов. Поэтому, чтобы не усложнять себе жизнь в будущем, убедимся что mgetty+sendfax как пакет не установлен, запустив команду: # rpm -qa|grep mgetty

Если в результате нам будут выданы имена установленных пакетов, например, для RedHat 7.3 это могут быть: mgetty-1.1.30-0.7 mgetty-sendfax-1.1.30-0.7 mgetty-viewfax-1.1.30-0.7 mgetty-voice-1.1.30-0.7

или для Fedora Core 4: mgetty-1.1.33-1 mgetty-sendfax-1.1.33-1 mgetty-viewfax-1.1.33-1 mgetty-voice-1.1.33-1


hardware то их следует удалить командой: # rpm -e mgetty mgetty-sendfax mgetty-viewfax mgetty-voice

Далее зайдём на страницу [3], в разделе «Download Section» найдём ссылки, из которых узнаем адрес FTP-архива – ftp://alpha.greenie.net/pub/mgetty/source/1.1 и номер последней версии. Её и скачаем: # wget ftp://alpha.greenie.net/pub/mgetty/source/ ↵ 1.1/mgetty1.1.33-Apr10.tar.gz

Далее распакуем архив, например, в директорию /progi командой:

ки, а именно, что и куда будет копироваться, какие директории будут создаваться и пр. Увидев среди всех остальных строчку: # chown fax /usr/local/lib/mgetty+sendfax/faxq-helper

мы можем сделать вывод, что нам надо проверить, и если необходимо – создать учётную запись пользователя, указанного в переменной FAX_OUT_USER в файле Makefile, так как она не создаётся автоматически. Проверить, есть ли такой пользователь в системе, можно, например, командой: # cat /etc/passwd|grep fax

# tar -zxvf mgetty1.1.33-Apr10.tar.gz -C /progi

или # gunzip -cd mgetty1.1.33-Apr10.tar.gz|tar -xv -C /progi

Если в результате ничего не выводится, значит, такого пользователя нет, поэтому добавляем его командой: # adduser fax

Покопавшись в дереве файлов распакованного архива и найдя там текстовый файл /progi/mgetty-1.1.33/voice/doc/ Readme.Beginners, мы можем узнать из него, что для установки vgetty необходимо вначале установить mgetty.

Если пользователя в системе не будет, то в процессе установки вы можете получить следующую ошибку:

Установка mgetty

Если вы планируете не только получать факсы, но и отправлять их от имени какого-то конкретного пользователя, то убедитесь, что у него достаточно прав на общение с факс-модемом, посмотрев на права доступа у соответствующего файла-устройства /dev/ttyS? (устройство, к которому будет подключен модем, например /dev/ttyS0):

Чтобы упростить себе жизнь, меняем текущую директорию: # cd /progi/mgetty-1.1.33

Привычного файла configure у mgetty нет, поэтому читаем файл README.1st или, не прочитав, запускаем make – получаем ошибку. You have to create your local policy.h first. Copy policy.h-dist and edit it.

Понимаем, что нам надо создать файл policy.h. Для этого лучше воспользоваться шаблоном policy.h-dist. Копируем шаблон с новым именем policy.h командой: # cp policy.h-dist policy.h

Далее, просматриваем несложные комментарии перед каждым параметром внутри файла и правим их по необходимости. Возможно, вам покажутся важными другие параметры, но я советую обратить внимание на следующие: DEFAULT_PORTSPEED, MODEM_INIT_STRING, MODEM_ CMD_SUFFIX, FAX_IN_OWNER (если вы планируете работать с факсами). Затем просматриваем Makefile, и если необходимо, вносим правку, например, в переменные путей, куда будет устанавливаться программа. Далее запускаем компиляцию командой make. После, если очень хочется, запустите серию тестов командами make test и make testdisk и посмотрите на их результаты. Полезной функции у этих тестов я не увидел, поэтому советую сразу после компиляции запустить make -n install и по списку напечатанных команд понять, что планируется к выполнению во время установ-

№10, октябрь 2005

chown: `fax': неверный пользователь make: *** [install.bin] Ошибка 1

# ls -l /dev/ttyS0

Если не критично, то проще поставить разрешающие права на чтение и запись для «всех остальных», но обычно так не делают. Когда надо управлять правами доступа к факс-модему нескольких пользователей, то их тогда включают в группу, например, fax (см /etc/group), а на файле меняют группу (см. chgrp) и ставят права для неё (см. chmod). При этом, меняя состав группы fax, можно легко управлять тем, кто может посылать факсы, а кто нет. Также в целях безопасности я бы подправил запись в файле /etc/passwd, заменив командный интерпретатор для пользователя fax с /bin/bash на /bin/false или на /sbin/ nologin. После проделанных действий можно смело запускать установку командой: # make install

Других ошибок быть не должно. Однако, если они будут, можно вернуться назад и внести необходимую правку. Mgetty установлен, переходим к компиляции и установке vgetty.

Установка vgetty Если на этапе выше всё прошло успешно, то после смены директории компиляция vgetty должна запуститься без проблем.

71


hardware # cd /progi/mgetty-1.1.33/voice # make

Однако, если вы попытаетесь сразу начать компилировать vgetty командой make, пропустив все шаги выше, то вас ждёт сообщение об ошибке: You didn't build mgetty first. Please read the documentation.

Она может также возникнуть, если что-то ранее с mgetty прошло неудачно. В этом случае надо возвращаться назад и внимательно читать все выводимые в процессе сообщения. После завершения компиляции запускаем: # make -n install

message _ ßag _ Þle .ßag

Это нам может понадобиться, если мы захотим написать какой-нибудь удобный интерфейс для просмотра файлов. Далее указывается имя поддиректории внутри «voice_dir», куда будут складываться файлы с новыми сообщениями: receive _ dir incoming

Затем указывается имя поддиректории внутри «voice_ dir», где будут храниться сообщения голосового приветствия нашего автоответчика: message _ dir messages

чтобы посмотреть, что куда будет ставиться. Далее, после одобрения выданного, запускаем установку командой: # make install

После этого считаем vgetty установленным.

Настройка vgetty Создаём конфигурационный файл voice.conf в той же директории (/usr/local/etc/mgetty+sendfax), где лежат все настроечные файлы mgetty. Проще всего воспользоваться шаблоном voice.conf-dist, который поставляется вместе с дистрибутивом, подправив его по необходимости. Для этого копируем шаблон с новым именем: # cp /progi/mgetty-1.1.33/voice/voice.conf-dist ↵ /usr/local/etc/mgetty+sendfax/voice.conf

и переходим к редактированию voice.conf. На время отладки, то есть пока у вас всё не заработает, советую повысить уровень логирования до 6, указав: voice _ log _ level 6

Далее обратите внимание на то, где будут храниться голосовые сообщения в поддиректориях: voice _ dir /var/spool/voice

а также кто окажется их владельцем и с какими правами будут создаваться файлы: phone _ owner root phone _ group phone phone _ mode 0660

Как видим, будет использоваться группа phone. Как вариант её можно сменить на fax, так как такого пользователя мы уже добавили, а можно добавить нового пользователя phone, аналогично тому, как это было сделано выше. При этом при создании учётной записи пользователя будет создана и одноимённая группа. Если в файле группа указана, а реально её не существует, то при создании файла с пришедшим сообщением его группой по умолчанию будет root. В следующей строчке указывается имя файла, который будет создаваться в директории «voice_dir», когда будут появляться новые сообщения.

72

Таких сообщений может быть много, и система может выбирать их случайным образом из списка в файлов, который указывается в параметре: message _ list Index

Если случайный поиск по каким-то причинам не срабатывает, например, если мы не будем создавать этого файла и у нас приветственное сообщение будет одно, то следующий параметр определяет конкретное имя файла с приветственным сообщением: backup _ message standard.rmd

Позже мы создадим этот файл. Если требуется, вы можете заготовить несколько сообщений, а далее написать небольшую программку на bash, меняющую эти файлы, например, простым копированием. Если запускать её с помощью crontab (crond)( [2], стр.164-165, [11], стр 34-38), то без собых усилий можно сделать на утро одно сообщение, на время обеда другое, а на вечер третье. В параметре answer_mode оставляем только voice: answer _ mode voice

Небольшое отступление. Если написать: answer _ mode voice:fax

или оставить как есть: answer _ mode voice:fax:data

то во время воспроизведения голосового приветствия, если модем услышит «вызывающие попискивания» на другой стороне, то он тут же прервёт воспроизведение звука и перейдёт в режим приёма факса. После чего если удалённая сторона будет посылать факс, то модем его примет, а vgetty запишет его в формате g3 в директорию /var/spool/fax/ incoming под именем вроде ff359168dS0-7-095-1234567.01, где «7-095-1234567» есть fax-id, то есть то, как нам представился удалённый факс. Естественно, на другой стороне записать в fax-id могут что угодно, поэтому не удивляйтесь если когда-нибудь увидите свой номер. Если же fax-id


hardware не передавался, то имя у файла будет без него, например, что-то вроде одного из следующих: ff353bb0eS2.01, ff353d713S2.01, fn353a4b5S2.01, fn353a4b5S2.02. Два последних факса, как легко догадаться, есть один факс, состоящий из двух страниц. О том, что делать дальше с файлами формата g3, как отправлять факсы, как настроить vgetty на совместную работу автоответчика, факса и dial-in-сервера и другие факсовые возможности, будет изложено в отдельной статье, посвящённой факсовым или расширенным возможностям vgetty/mgetty. Замечание. Если во время воспроизведения голосового приветствия модем услышит вызывающий сигнал факса, а режим работы у него выбран только как voice, то он прервёт воспроизведение, а отвечать и принимать факс не будет. Как сделать, чтобы воспроизведение не прерывалось, пока мне не известно. Далее указывается скорость порта, к которому подключен модем: port _ speed 38400

Оставить 38400 или поставить 57600, или 115200 решать вам. У этого параметра есть особенность, на которую я хотел бы обратить внимание. Если вы будете менять значение, то необходимо аналогичную скорость прописать и в файле mgetty.config, и наоборот. То есть нужно проверить, чтобы значения были идентичны. Далее можно подправить значение параметра rings, хотя я этого делать не стал, потому как задам количество звонков до поднятия трубки ниже (через ключи в /etc/inittab). Все остальные параметры я оставил без изменения. В завершение правки конфигурационного файла voice. conf хотел бы рассказать про «грабли» со скоростью порта и поддержку модема ZyXEL Omni 56k PRO, на которые я наступал в течение нескольких недель пока не разобрался в чём дело. Если у вас такой же модем, прочитайте этот раздел обязательно! Итак...

«Грабли» После установки, изучая и корректируя voice.conf, я добрался до параметра «скорость порта». Предполагая, что конфигурационные файлы обычно пишут не дураки, а установки по умолчанию выбираются из разумных соображений, я оставил предлагаемое значение 38400 без изменений. Помня, что ZyXEL-1496B+ не работает на скорости 115200, и учитывая что Acorp-56EMS (на базе чипсета Rockwell) и ZyXEL U-1496B+ сразу после установки заработали как надо, повышать скорость необходимости не было. Проблема была только в одном: модем ZyXEL Omni56K Pro, поддерживаемый vgetty (исходя из документации), не хотел быть автоответчиком, т.е. работать с голосовыми функциями. Через терминал и в других режимах модем работал. Другой такой же модем тоже отказался работать. Чтобы исключить мысль, что оба модема могут быть сломанными, на отдельном компьютере я установил ZVoice и убедился, что в этой программе голосовые функции работают. Предположение, что проблема в кодеках, и попытка использовать кодеки от U-1496B+ результата не принесли, потому как по документации кодеки этих двух модемов

№10, октябрь 2005

не совместимы между собой. Так что работающий U-1496B+ ничем не смог помочь собрату. Пришлось разбираться в работе vgetty. Первое, что в этом случае делается – уровень логирования ставится на максимум (voice_log_level 6) и изучаются log-файлы. Я изучал /var/log/vgetty.ttyS0 и /var/ log/vm.log, сравнивая выводимые данные от разных модемов. Было замечено, что различие в определении модемов Acorp-56EMS и ZyXEL U-1496B+ и изменение дальнейшего поведения vgetty происходит после команды «ATI». Связано это с тем, что модемы на неё отвечают по-разному, соответственно «56000» и «1496», а неработающий Omni56K Pro – «1507». Предполагая, что в зависимости от ответа модема в программе должно быть ветвление, я запустил поиск этих ответов в исходных кодах. Естественно «56000» и «1496» были найдены, а «1507» – нет. Далее, я перешёл к поиску по ключевым словам «ZyXEL» и «Omni» и можно сказать, что почти сразу нашёл решение проблемы. Например, были найдены две следующие строчки: {ati, "1500", {ati, "1501",

NULL, NULL,

&ZyXEL_Omni56K}, &ZyXEL_Omni56K},

в то время как выдаваемое не работающим модемом значение 1507 отсутствовало. Не долго думая, я нашёл все места где встречалось 1500 и 1501, но не было 1507, и, разобравшись в несложном коде на Cи, внёс правку. В результате у меня получилось два следующих патча которые я получил после с помощью команды: # diff -urN старый _ файл новый _ файл --- /progi/mgetty-1.1.33/voice/libvoice/detect.c.old Mon Apr 11 01:24:30 2005 +++ /progi/mgetty-1.1.33/voice/libvoice/detect.c Mon Sep 19 01:34:56 2005 @@ -74,6 +74,7 @@ {ati, "1496", NULL, &ZyXEL_1496}, {ati, "1500", NULL, &ZyXEL_Omni56K}, {ati, "1501", NULL, &ZyXEL_Omni56K}, + {ati, "1507", NULL, &ZyXEL_Omni56K}, {ati, "247", NULL, &Multitech_2834ZDXv}, {ati, "248", NULL, &Sierra}, {ati, "249", NULL, &Rockwell},

--- /progi/mgetty-1.1.33/faxlib.c.old Sun Nov 14 01:14:31 2004 +++ /progi/mgetty-1.1.33/faxlib.c Mon Sep 19 01:50:29 2005 @@ -627,6 +627,7 @@ break; case 1500: case 1501: + case 1507: lprintf( L_MESG, "ZyXEL Omni 56K (Plus) detected" ); modem_type=Mt_class2_0; mis = mdm_get_idstring( "ATI1", 2, fd );

Файл faxlib.c можно было подправить, дописав ещё несколько строк, чтобы при обнаружении модема выдавалось не «ZyXEL Omni 56K (Plus) detected», а более правильное «ZyXEL Omni 56K (PRO) detected», но так как это на работоспособность влиять не должно, делать этого я не стал. Соответственно после внесения правки мне пришлось перекомпилировать mgetty и vgetty и установить их заново. Казалось бы, всё теперь должно работать, но не тут-то было. Модем начал воспроизводить звуки, но делал это с замедлением, а записывать вообще отказывался, записывая вместо звуков какой-то потрескивающий шум. К решению проблемы даже была подключена техподдержка фирмы ZyXEL через закрытый форум. Помочь в явном виде специалисты не смогли. На всякий случай они переписали несколько программок написанных Yuhang Wu на Cи, объёмом все вместе взятые не более 50 Кб, для работы

73


hardware с голосовыми функциями модема, заверив, что программы рабочие. Я взял оттуда какой-то алгоритм или часть кода, но изучая заголовки файла decomp.c наткнулся на строчку: «Required DTE speed : Above 57600 bps.», которая меня и натолкнула на мысль, что предложенные по умолчанию 38400 (то, с чего я, собственно, начал весь этот рассказ про «грабли») не совсем подходят и надо бы попробовать поставить 57600. Я попробовал и «О, чудо!», оно заработало! Вывод: не всякое предложенное значение по умолчанию подойдёт. На этом мои (и возможно чьи-то ещё) проблемы с установкой решились. Мы подошли вплотную к запуску программы vgetty.

Запуск vgetty Не смотря на то что после компиляции vgetty представляет собой запускаемый ELF-файл, запускать его следует из /etc/ inittab, прописав там примерно следующую строчку: S0:345:respawn:/usr/local/sbin/vgetty -n 4 ttyS0

! S0– это уникальный идентификатор строки. Выбирается произвольно [1], может иметь длину 2-4 символа [2]. Так как модем подключен к /dev/ttyS0(СОМ1), то удобнее выбрать в качестве идентификатора S0.

Как появился формат rmd К моменту массового появления персональных компьютеров, а соответственно и первых модемов, теория цифровой обработки сигналов уже насчитывала порядка полвека, поэтому под действием пользовательского спроса реализация голосовых функций модемов не заставила себя долго ждать. Действительно, чего в этом сложного с современной электронной базой. Берём любую книжку по телефонии того времени и узнаём, что для обеспечения высокой разборчивости речи вполне достаточно передавать сигналы в диапазоне частот 0,3-3,4 КГц (см. рис. 1, красные границы), что чуть уже по спектру того, что может воспроизвести голосом среднестатистический человек. Если взять с запасом справа и слева, то получится полоса аналогового сигнала шириной около 4000 Гц (0-4 КГц). Теперь, если воспользоваться теоремой В.А.Котельникова [9]

Рисунок 1. Область слухового восприятия. Речевые сигналы и музыка занимают лишь часть этой области [15, стр. 63] (бетта индекс 0 – порог слышимости, гамма – порог осязания)

74

! 345 – уровни выполнения, на которых будет работать на-

! ! ! !

ша программа: 3, 4, 5. (Замечание: а вы знаете, что помимо привычных уровней 0-6 ещё существуют a,b,c и s или S уровни? Если нет – см. [2] и man init.). respawn – говорит init о необходимости перезапуска vgetty в случае его завершения. /usr/local/sbin/vgetty – полное имя программы vgetty. Обратите внимание: путь к файлу может отличаться, скорее так и будет, если вы поставили пакет из rpm. Ключ «-n 4» говорит снимать трубку после 4-го звонка. ttyS0 – порт, к которому подключен голосовой модем.

Количество гудков не обязательно указывать в качестве параметра в данной строке – его можно указать и внутри конфигурационного файла, но это не всегда удобно, особенно если модемов, как и строчек в /etc/inittab, в вашей системе несколько, а конфигурационный файл vgetty у них один. Поэтому выше, во время правки voice.conf, я не стал изменять значение параметра rings. После внесения указанной строчки в /etc/inittab, чтобы vgetty стартовал, надо послать команду: «kill -1 1» или «init q». Можно также перезагрузить компьютер, хотя это будет не очень хорошее решение. Если же у вас уже запущена копия vgetty, то есть строчка уже была, а вы просто вне-

(Г. Найквиста) об отсчётах, мы можем заключить, что, если будем брать мгновенные значения уровня голосового сигнала с периодом 1/(2*4000), то есть 8000 раз в секунду (см. рис. 2), то по этим значениям при необходимости мы сможем без проблем восстановить сигнал без потерь. Такое преобразование аналогового сигнала к его дискретным отсчётам называется амплитудно-импульсной модуляцией (АИМ). Так как уровень сигнала, взятый в точке отсчёта является аналоговым и фиксированным, то для сохранения или передачи мы можем его квантовать, например, на 256 уровней с помощью аналого-цифрового преобразователя (АЦП) и использовать далее цифровое значение уровня. Опытным путём было установлено, что 256 – есть наилучшее число уровней, так как при меньшем числе теряется качество, увеличиваются шумы квантования, а при большем качество радикально не улучшается. Для передачи одного из 256 значений потребуется ровно 8 бит, так как 28 =256. Таким образом, для успешного восстановления сигнала длительностью в 1 секунду нам нужно иметь 8 бит для 8000 отсчётов, то есть всего 64000 бит (64 КБит/c). Если взять обычный моно wav-файл и отбросить у него заголовок, то сигнал, записанный внутри файла, получается примерно таким же способом. Данный способ представления данных называется импульсно кодовой модуляцией (ИКМ, PCM). То есть

если бы мы записывали данные из линии «как есть» путём вышеописанной «тупой» оцифровки или в формате wav, то на одну секунду записи потребовалось бы 8 Кб (64 Кбит/8). Нетрудно оценить, что на дискету 5,25” Double Sided/Double Density, характерную для того времени и отформатированную на 360 Кб, влезло бы всего лишь 45 секунд. А на винчестер объёмом 10 Мб влезла бы примерно 21 минута, если предположить, что ничего другого на нём не было записано. При тех безумных ценах хранения единицы информации автоответчик оказался бы золотым, если бы мы захотели сделать ёмкость, адекватную одной стороне 60 или 90 минутной аудиокассеты. Также скорость передачи данных от модема к компьютеру в 64000 бит/c могла показаться очень большой. Каждый модем подключался к компьютеру через последовательный порт, cердцем которого была, и по сей день является, микросхема UART (Universal Asynchronous Receiver/ Transmitter) – универсальный асинхронный приёмопередатчик. В IBM PC и PC/XT для этой цели использовалась микросхема типа 8250, которая сама или её аналоги рассчитаны на максимальную скорость 38400 бит/c ([14], стр 250-252). И только для IBM PC/AT было решено применить микросхему 16450, которая превосходила 8250 по скорости. Возьмите для примера вышеупомянутый ZyXEL U-1496B+, который не использует 8250, но и не работает на ско-


hardware сли правку, то эффективнее будет запустить «killall vgetty», так как предыдущие две команды не сработают. Теперь модем слушает линию, а vgetty слушает порт, на котором висит модем. В случае поступления звонка модем должен сообщать vgetty о том, что звонят. После того как будет пропущено количество звонков, указанное с параметром -n (или записано в конфигурационном файле), vgetty даст команду на снятие трубки. Попутно с этим vgetty оценит, что за модем подключен, выберет нужную библиотеку, поищет файл голосового приветствия или выберет один из нескольких и начнёт его воспроизведение в линию. Далее в зависимости от настройки пискнет в линию и перейдёт в режим записи всего того, что говорит позвонивший абонент (динамик модема при этом молчит), записывая всё им сказанное, например, в файл /var/spool/voice/ incoming/v-3631-1129050743.rmd. После того как время, отведённое для записи абоненту, истечёт или модем услышит сигнал отбоя, означающий, что на том конце положили трубку, запись будет прекращена и будет выставлен флаг с датой и временем последнего звонка. Другими словами, будет создан файл /var/spool/voice/.flag нулевой длины. Далее vgetty перейдёт опять в режим ожидания звонков. Если всё проходит успешно, то уровень логирования в файле voice.conf можно уменьшить, а вот если у вас что-то не работает или работает не так, как хотелось бы, то смотрости 115200 [5]. А если взять модемы, которые были раньше, то скорости, на которых они соединялись, поначалу составляли 2400, 1200 и даже меньше бод, для передачи которых совсем не требовалась повышенная скорость порта. Получается, что либо скорость 64000 была высока для записи звуков из линии, либо скорость последовательных портов мала. Велись работы как в сторону повышения скорости работы микросхем UART и введения в них дополнительных буферов ввода-вывода, так и в сторону сжатия потока данных, то есть уменьшения объёма. Сжатие даже опережало возможности компьютеров. Потому как ещё в 1947 г. учёные из телефонных лабораторий фирмы «Белл» опубликовали первое сообщение о полностью работоспособной системе ИКМ и примерно в то же время Делорен во Франции изобрёл дельта-модуляцию [8]. После появления ИКМ было замечено, что при преобразовании речи соседние отсчёты обычно сильно не отличаются друг от друга и потому вместо одного из 256 значений для отсчёта можно передавать его изменение относительно предыдущего. При этом для передачи изменения при той же сетке квантования требуется меньшее число значений, например, если это будет всего 16 уровней, а не 256, как ранее, то надо передавать 4 бита (24 =16). После перемножения получим, что для пред-

№10, октябрь 2005

рите лог-файлы /var/log/vgetty.ttyS?.log и /var/log/vm.log. Последний файл ведётся программой vm, входящей в комплект пакета vgetty, о ней сейчас пойдёт речь. Формат raw modem data (или сокращённо rmd) не такой популярный, как, например, тот же mp3, поэтому большинство из вас должно было уже давно озаботиться следующими вопросами: а что это за формат rmd, в котором записываются все сообщения? Что мне с ним делать? Как записывать свои файлы, как прослушивать уже готовые файлы? Ответы на эти вопросы смотрите во врезке «Как появился формат rmd».

Дополнительные утилиты Для того чтобы создавать файлы в том или ином rmd-формате, понимаемом только модемом, или, наоборот, переводить данные в привычные звуковые форматы, в комплекте с vgetty поставляется пакет программ pvftools. В него входят конверторы различных форматов, осуществляющих преобразования между форматами. Из всего представленного списка мне понадобились только четыре программы: wavtopvf и pvftormd для конвертирования «туда» и rmdtopvf и pvftowav – «обратно». Помимо конверторов вам ещё может понадобиться программа pvfspeed для изменения скорости, но мне она не понадобилась, потому как я свои wav-файлы записывал сразу с требуемой частотой дискретизации. Поскольку фор-

ставления одной секунды звука необходимо уже 32 килобита, то есть в 2 раза меньше, чем было при ИКМ. Это самый простой способ уменьшения потока (объёма), так как при переходе от отсчёта к отсчёту передаётся их разница, которую обычно обозначают греческой буквой дельта, то данный способ кодирования и назвали дельта-модуляцией. Далее появилась адаптивная дельта-модуляция(ADPCM) и другие более хитрые способы кодирования, позволяющие сжимать данные больше и больше без значительного ухудшения качества. Для дальнейшего улучшения качества сжатия речи стали учитываться особенности речеобразования (формантная структура, звонкие и шипящие звуки и пр.), после чего стали появляться различные алгоритмы и основанные на них голосовые кодеки. Некоторые из них до сих пор используются в системах сотовой связи. Как обычно, о едином и универсальном стандарте договориться не смогли, поэтому каждая фирма стремилась реализовать своё «ноу-хау» в собственных устройствах, а мы на сегодняшний день получили модемы не совместимые между собой и работа-

Рисунок 2. Отсчёты голосового сигнала

ющие с разными кодеками. Информация, записанная в формате кодека каждого конкретного модема как раз и есть формат raw modem data. Как легко догадаться, формат rmd для каждого модема свой и зависит от используемого в модеме кодека. Например, «Модемы серии Omni56K используют 4-битовый ADPCM-алгоритм преобразования звука в цифровой вид с частотой дискретизации 9600 отсчётов в секунду» ([6], стр. 89), хотя команда «AT+VSM=?» выдаёт и другие значения возможной частоты дискретизации (4 ;ZyXEL ADPCM ;4Bit ;(7200, 8000,9600,11025)). Благо модемы с голосовыми функциями выпускали не все производители, поэтому число используемых кодеков не превышает сорока, и почти все на сегодня используемые поддерживаются vgetty. Запустив команду: # pvftormd -L

можно увидеть все поддерживаемые алгоритмы, а также названия модемов, в которых они обычно используются. Чтобы меж ду файлами в формате rmd не было путаницы, в самом начале перед данными указывается тип модема, чьим кодеком закодировано остальное содержимое. То есть если вы в какомнибудь редакторе посмотрите rmd-файлы, то в самом начале вы увидите строчку «RMD1Rockwell», «RMD1ZyXEL Omni 56K» или аналогичную.

75


hardware мат wav (Microsoft Waveform Audio, Windows PCM) не является стандартом в среде Linux, то и прямого конвертора из wav в rmd и обратно нет (в составе pvftools). В качестве промежуточного формата используется portable voice format (pvf). Если вам всё же не очень нравится набирать команду конвертирования дважды, то напишите маленький скрипт, который можно назвать wav2rmd или rmd2wav, а он уже будет внутри содержать последовательные вызовы двух конверторов. Почитав документацию (/progi/mgetty-1.1.33/voice/doc/ Readme.pvftools) и help к конверторам, вы можете без труда самостоятельно освоить конвертирование. При этом можете перенаправлять вывод одного конвертора на вход другого, что очень удобно. Например, если вы захотите создать файл гостевого приветствия standard.rmd из имеющегося у вас файла message.wav для модема ZyXEL Omni 56k PRO, то это можно сделать следующей командой: # cat message.wav | wavtopvf | pvfspeed -s 9600 | ↵ pvftormd ZyXEL _ Omni56K 4 > standard.rmd

В обратную сторону получится даже проще: # cat v-1329-1127227035.rmd | rmdtopvf | pvftowav > Þle.wav

При этом если у вас на компьютере окажется настроенная и работающая звуковая карта, то можно проиграть файлы, перенаправив вывод конвертора не в файл, а напрямую на устройство /dev/dsp или /dev/audio, или /dev/mixer. Ещё в комплект vgetty входит программа vm. Man к ней нет, поэтому информацию о том, как ею пользоваться, можно узнать путём запуска «vm -help» или из документации. Для воспроизведения файлов на модеме используется команда «play», а далее указывается, куда модему следует выводить звук. В зависимости от модема и от значения, указанного в параметре -d, звук может выводиться как в линию, так и на встроенный на модеме динамик. Модем U-1496B+ и Acorp56EMS смогли воспроизвести звук и в линию, и на динамик, а вот Omni 56K PRO на динамик играть отказался. Причём, как я понял, читая документацию [6, стр. 100] параметр +VLS не подразумевает выбор встроенного динамика на Omni 56K, в то время как у U-1496B+ такая возможность в параметре +VLS была [5, стр 15-16]. Чтобы не гадать и не перепроверять руками все параметры ключа -d, что я и делал поначалу, можно запустить команду: # vm devicetest -l ttyS0

которая выведет результат тестирования модема, а именно куда может быть осуществлён вывод звука при воспроизведении файлов на модеме. Для ZyXEL Omni 56k PRO вывод программы оказался следующим: Test Test Test Test Test Test Test Test Test Test Test Test

76

Dialup Line, Int. Mic. and Int. Speaker: not supported by vm/vgetty-modemdriver Dialup Line, Ext. Mic. and Ext. Speaker: not supported by vm/vgetty-modemdriver Dialup Line and Local Handset: not supported by vm/vgetty-modemdriver Dialup Line and Int. Speaker: not supported by vm/vgetty-modemdriver Dialup Line and Ext. Speaker: not supported by vm/vgetty-modemdriver Local Handset: OK Int. Speaker: not supported by vm/vgetty-modemdriver Ext. Speaker: not supported by vm/vgetty-modemdriver Int. Microphone: not supported by vm/vgetty-modemdriver Ext. Microphone: not supported by vm/vgetty-modemdriver Dialup Line: OK No Device: OK

Это как раз совпадает с тем, что я выяснил опытным путём, а именно – звук выводится только двумя командами: vm play -d 2 -v -l ttyS0 Þle.rmd vm play -d 7 -v -l ttyS0 Þle.rmd

Телефонный аппарат у меня был подключен через модем. В первом случае (-d 2) подключение происходит к текущей линии, а телефонный аппарат от неё не отключается. То есть, если у вас был гудок, то воспроизведение звука будет поверх гудка. При этом оно почему-то завершается раньше. Но вот, если в телефонной линии тишина, скажем если набрать «1», то тогда всё проигрывается от начала и до конца. Во втором случае (-d 7) перед началом воспроизведения происходит отключение телефонного аппарата, подключенного через модем от телефонной линии. То есть если вы подняли трубку, у вас был гудок и вы запустили команду, то модем отключит вас от линии, проиграет сообщение и подключит обратно, при этом удержания телефонной линии не происходит. Остальные параметры в командах: ! -l ttyS0 – говорит vm к какому порту подключен интересующий нас модем; ! -v – говорит включить режим избыточного вывода различной информации; ! file.rmd – воспроизводимый файл. Помимо воспроизведения у vm есть ещё функция записи и другие.

Грабли с отбоем В процессе настройки автоответчика я столкнулся с довольно забавной ситуацией: исходники vgetty подправил, модем настроил, проверил, что он проигрывает файлы, всё как положено, но входящие звонки модем или vgetty записывать отказывались. Что я наблюдал: поступает звонок, модем поднимает трубку, воспроизводит голосовое приветствие, а после вешает трубку не дав ничего сказать. Что же оказалось? Так как никакого звукового файла, который я мог бы использовать, под рукой не оказалось, то я решил просто позвонил сам себе с другого телефона. Так как ничего воспроизводить не надо было (файла standard.rmd просто не было) модем сразу бикнул в линию перейдя в режим записи, а я записал своё приветствие. Далее я просто взял и переписал появившийся после этого файл на место standard. rmd в директорию messages. Так получилось, что по окончании сообщения я положил трубку и модем записал вдобавок к моему сообщению ещё два гудка. Теперь, когда этот файл проигрывался в линию, модем воспроизводил и гудки отбоя. Как вы теперь догадываетесь, вторая часть модема в этот момент не дремала, а чётко отслеживала ситуацию в линии: «a не положил ли звонящий трубку?», естественно, услышав в линии гудки в хвосте моего приветствия, она решала, что коли абонент уже отключился (раз пошли гудки), то и модему надо тоже повесить трубку, что он, собственно, и делал. Естественно, проблему решил удалением последних нескольких секунд с гудками из записи голосового приветствия, после чего всё заработало как надо.


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

Веб-интерфейс автоответчика Просматривать, появилось ли у вас новое сообщение на автоответчике каждый раз с консоли сервера или заходя удалённо на него посредством ssh – не самое лучшее решение. Если компьютер имеет подключение к сети, использующей IP-адреса, то лучше всего организовать взаимодействие с сообщениями автоответчика посредством вебинтерфейса. Для этого лучше всего подойдёт небольшой CGI-скрипт [10], написанный на bash [11]. Предполагается, что у вас уже установлен и запущен веб-сервер apache [12] с поддержкой cgi-скриптов, и вы знаете в какую директорию их следует помещать (обычно /var/www/cgi-bin). Предупреждение! Все скрипты ниже написаны исключительно в демонстративных целях, чтобы показать вам, насколько просто сделать всё самому и побудить вас написать свою оболочку для работы с голосовыми сообщениями. Защита «от дурака» намеренно не делалась, чтобы не терялась наглядность. С точки зрения безопасности недопустимо использование этих скриптов в открытой сети без дополнительной доработки и защиты! Например, скрипт, удаляющий файлы, может удалять любые файлы в системе, если это позволяют права файлов, то есть можно удалять не только голосовые сообщения. Есть и другие потенциально опасные возможности. Поскольку наш cgi-скрипт будет запускаться и работать от имени веб-сервера, то есть под пользователем apache, нам следует проследить, чтобы скрипт имел права на чтение и удаление голосовых сообщений. Для этого можно поступить двояко: либо добавить пользователя apache в группу phone в файле /etc/group, либо в /usr/local/ etc/mgetty+sendfax/voice.conf указываем: phone _ group apache phone _ mode 0660

также следует убедиться, что права, установленные на директорию /var/spool/voice/incoming также позволяют удалять файлы. Например, можно в качестве группы файла указать apache и для группы установить атрибут «+w». # chgrp apache incoming # chmod g+w incoming

Если скрипты, будучи запущенными через веб-интерфейс, не работают, а вам кажется, что вы всё настроили правильно, то лучше всего изменить временно свой идентификатор на apache с помощью команды: # su --login apache

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

№10, октябрь 2005

операции в файле /etc/passwd придётся временно прописать пользователю apache командный интерпретатор /bin/bash вместо привычных для него /bin/false или /sbin/nologin. Те, кто хорошо знакомы с html, cgi и bash, могут сразу перескочить в конец статьи, а со всеми остальными начнём с простого – в директории для скриптов создадим файл spisok.sh: #!/bin/bash message _ dir="/var/spool/voice/incoming" echo "Content-type:text/html; charset=koi8-r" echo echo "<html><body>" for f in `ls $message _ dir` do echo "$f<br>" done echo "</body></html>"

присвоим ему атрибут выполняемости командой: chmod +x spisok.sh

и убедимся, что он выводит список сообщений при обращении к нему. То есть запустим браузер и обратимся по адресу: http://192.168.0.1/cgi-bin/spisok.sh (вместо 192.168.0.1 следует указать адрес вашего сервера). После того как мы убедились, что скрипт работает, усложним его, добавив к сообщениям дату и вывод даты последнего сообщения. #!/bin/bash message _ dir="/var/spool/voice/incoming" echo "Content-type:text/html; charset=koi8-r" echo echo "<html><body>" echo "Последнее сообщение: `date -R -r ↵ $message _ dir/../.ßag`<br>" echo "У вас сообщения:<br>" for f in `ls $message _ dir` do d=`date -R -r $message _ dir/$f` echo "$f     " echo "$d<br>" done echo "</body></html>"

Теперь, создадим ещё один вспомогательный скрипт play.wav, который при запуске будет получать имя rmd-файла методом GET [10, стр. 100], далее будет его конвертировать в wav (с помощью уже известных нам утилит rmdtopvf и pvftowav) и будет сам представляться браузеру этим wavфайлом, чтобы браузер мог вызывать какой-нибудь установленный в системе проигрыватель звуковых файлов. Несмотря на то что скрипт будет выполнять много действий, сам он состоит всего лишь из четырёх строчек. #!/bin/bash echo "Content-type:audio/wav" echo cat /var/spool/voice/incoming/$QUERY _ STRING|/usr/ ↵ local/bin/rmdtopvf|/usr/local/bin/pvftowav

77


hardware Присвоим скрипту атрибут выполняемости, а также создадим внутри нашего списка ссылки, которые будут запускать этот скрипт, заменив всего лишь одну строчку: echo "$f     "

на: echo "<a href=\"play.wav?$f\">$f</a> ↵     "

Как удалять сообщения? Для этого нам понадобится создать ещё один скрипт delete.sh: #!/bin/bash rm /var/spool/voice/incoming/$QUERY _ STRING echo "Сообщение $QUERY _ STRING удалено.<br>"

Также надо будет сделать ссылку, при щелчке на которую этот файл запускался бы. Для этого в скрипте, выводящем список файлов, после последней изменённой нами строки, добавим ещё одну: echo "<a href=\"delete.sh?$f\">delete</a> ↵     "

Собственно, и всё. по сути больше ничего и не нужно. При желании можно можно объединить файл для удаления и выводящий список в один, чтобы после удаления у пользователя в окне браузера висело не только сообщение о том, что файл был удалён, но и список оставшихся сообщений. А также для привычности восприятия можно вместо расширения rmd выводить расширение wav. В результате получится, что весь наш веб-интерфейс состоит из двух скриптов: play.wav и модифицированного файла списка – нижеследующего файла 1.sh: #!/bin/bash message _ dir="/var/spool/voice/incoming" echo "Content-type:text/html; charset=koi8-r" echo echo "<html><body>"

Рисунок 3. Внешний вид браузера после запуска скрипта 1.sh

78

if [ "$QUERY _ STRING» != "" ] then rm $message _ dir/$QUERY _ STRING echo "Сообщение $QUERY _ STRING удалено.<br>" Þ echo "Последнее сообщение: `date -R -r ↵ $message _ dir/../.ßag`<br>" echo "У вас сообщения:<br>" for f in `ls $message _ dir` do d=`date -R -r $message _ dir/$f` fn=`echo $f|cut -d"." -f1` echo "<a href=\"play.wav?$f\">$fn.wav</a> ↵     " echo "<a href=\"`basename $0`?$f\">delete</a> ↵     " echo " $d<br>" done echo "</body></html>"

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

Литература, ссылки: 1. Стахнов А. Сетевое администрирование Linux. – СПб.: БХВ-Петербург, 2004 г. – 59 с. 2. Мохаммед Дж. Кабир Red Hat Linux 6 Server: Пер. с англ. – Издательство «Лори», 2001 г. – 44-45 с. 3. Mgetty+Sendfax Archive/Documentation Centre – http://alpha. greenie.net/mgetty/index.html. 4. ZyXEL Omni 56K modem, mgetty/vgetty and GPL – http://www. advogato.org/article/134.html. 5. Руководство для пользователей. Универсальный модем серии U-1496. Документ № 83011501, Версия 2.21 ZyXEL Communications Corporation и АО МКЦ «Вариант». 6. Omni 56K. Техническое руководство. Версия 2.01, файл o56ktr.pdf. 7. Беллами Дж. Цифровая телефония: Пер. с англ. – М.: Радио и связь, 1986 г. 8. Былянски П., Ингрем Д. Цифровые системы передачи. Пер. с англ./Под ред. А.А.Визеля. – М.: Связь, 1980 г. 9. Гитлиц М.В., Лев А.Ю. Теоретические основы многоканальной связи. – М.: Радио и связь, 1985 г. 10. Павлов А. CGI-программирование: учебный курс – СПб: Питер, 2000 г. 11. Тейнсли Д. Linux и UNIX: программирование в shell. Руководство разработчика. Издательская группа BHV, 2001 г. 12. Уэйнрайт П. Apache для профессионалов. Пер. с англ. – М.: Издательство «Лори», 2001 г. 13. Браун М., Ханикатт Д. HTML 3.2 в подлиннике: Пер. с. англ. – СПб: BHV-Санкт-Петербург, 2000 г. 14. Борзенко А. IBM PC: устройство, ремонт, модернизация. – 2-е изд. М.: ТОО фирма «КомпьютерПресс», 1996 г. 15. Калинцев Ю. Разборчивость речи в цифровых вокодерах. – М.:Радио и связь, 1991 г.


hardware

Цифровое небо, или Организуем прием спутникового вещания Антон Борисов Великолепие звездного неба завораживает хотя бы одними названиями небесных тел – Сириус, Тор, Астра, Жар-Птица. Как вы догадались, это названия спутников на геостационарных орбитах. А ведь можно настроиться на спутниковый канал и принимать теле- или радиопередачи. л я п е р е д ач и и н ф о р м а ц и и в цифровом формате были придуманы стандарты DVB (Digital Video Broadcasting): DVB-S, DVB-T, DVB-C. Первый применяется в спутниковых каналах, литера S – от Satellite. Второй используется в наземных средствах приема/передачи (T – terrestrial). Последний используется в компаниях, предлагающих услуги кабельного телевидения (C – cable). Стандарты DVB-S и DVB-C были ратифицированы в 1994 году, а DVB-T тремя годами позднее. Первая коммерческая трансляция в новом формате DVB-T была произведена в Великобритании, в 1998 году. В Берлине решили также отойти от трансляции видеосигнала в аналоговой форме и вещание полностью переведено на новый формат DVB-T начиная с 2003 года. Телестанция MiTV в Малайзии с сентября 2005 г. также начала предоставлять свои услуги в формате DVB-T [1]. Самым распространенным стандартом на территории нашей страны, по всей видимости, является DVB-S, который используется для ретрансляции каналов телевидения и радио. Что же касается DVB-T и DVB-C, то перспективы их использования у нас достаточно туманны. Как бы там ни было, но пока существует возможность запускать телеметрическое оборудование в космос, наиболее популярным направлением будет вещание с геостационарных спутников (рис. 1).

Что необходимо знать для монтажа тарелки Чтобы принимать вещание со спутника потребуется следующее оборудова-

№10, октябрь 2005

ние: параболическая антенна (блюдце в простонародье), конвертер, коаксиальный кабель, ресивер (DVB-карта). Чем слабее сигнал со спутника в вашей местности, тем большего диаметра блюдце нужно применять. Я не привожу здесь детальную методику монтажа тарелки, т.к. написать, лучше Н. Орлова [2] я вряд ли смогу. Также отличные материалы хранятся по адресам [3-5]. В любом случае, нелишним будет проконсультироваться у специалистов, которые смогут рассказать вам о тонкостях установки параболической антенны, ее параметрах, наличии устойчивого приема со спутника в вашем регионе и некоторым другим нюансам, которые смогут пригодиться в дальнейшем. Если же вы чувствуете в себе силы установить тарелку самостоятельно, то указанные выше источники будут как нельзя кстати. Будем считать, что антенна уже откалибрована на какой-либо спутник, в нашем случае на Eutelsat W4 – 36.0 градусов восточной долготы. На этом спутнике, в частности, транслируются видеоканалы «НТВ+», российские радиостанции «Динамит FM», «Монте Карло», «Эхо Москвы» и некоторые другие. Полный список представлен на сайте организации LyngSat [6].

Выбираем DVB-карту Если с выбором тарелки всё болееменее ясно – чем больше диаметр, тем лучше (главное, чтобы крепление было достаточно надежным и блюдце не унесло ветерком), то выбор DVBкарты может принести головную боль. Прежде всего следует определиться, что именно вам требуется: смотреть или слушать видео-, аудиоканалы,

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

79


hardware В первой строчке мы загрумер, Pent@Net, Pent@Value жаем драйвер dvb-core. Пара(производитель Pentamedia). метр dvb_shutdown_timeout=0 Поэтому если вы не хотите огозначает, что карта SkyStar не раничивать себя только спутдолжна снижать свою мощниковым Интернетом, то возьность спустя 5 секунд после мите SkyStar2 [7] (производиинициализации. Что кроется тель – компания TechniSat [8]). за этой фразой? Дело в том, Помимо низкой цены, карта что, как правило, ставятся носит заслуженную репутажесткоориентированные анцию самого лучшего бюджеттенны на определенный спутного решения. Сравнивайте Рисунок 1. Распространенность стандарта DVB-S по всему миру ник, но существует и опредесами (см. таблицу 1). С программным обеспечением для ты. По MAC-адресу также можно поп- ленное количество инсталляций, когда этой карты проблем не должно воз- робовать определить, что же в дейс- требуется периодически менять ориникнуть – драйвера есть для Linux, твительности в ваших руках [9]. В лю- ентацию с одного спутника на другой. Windows, FreeBSD, OpenBSD, MacOS- бом случае, если вы в дальнейшем В последнем случае можно установить платформ [10]. Карта является функци- не ориентируетесь на прием спутни- несколько антенн, по антенне на кажональным продолжением своей пред- кового Интернета, то про MAC-адрес дый спутник, а можно установить только одно блюдце на моторизованном шественницы – карты SkyStar1. Прав- можно забыть. подвесе. Мотоподвес в свою очередь да, в новом варианте отсутствует апуправляется по тому же кабелю, по копаратный MPEG2-декодер и нет воз- Сборка и настройка торому идет цифровой поток. можности подключить CI-модуль, с по- DVB-приложений Осуществляется это достаточно мощью которого можно смотреть «за- Чтобы принимать видео- или радиокрытые» каналы. В целом данная кар- станции, нам потребуется следую- просто – плата SkyStar генерирует сигта предназначена для тех, кому требу- щее ПО: MPlayer[11], DVB-драйверы нал в формате DiSeqC (управляющие ется бюджетное решение с гарантиро- [12], DVB-Utils[13]. Работа проводится команды для мотора), а также измена Linux-дистрибутиве с ядром 2.4. няет напряжение в 13 до 18 вольт, чтованным качеством работы (рис. 2). Сначала требуется собрать драй- бы мотоподвес смог повернуть блюдце Обращаю ваше внимание на то, что SkyStar2-карты бывают как под- вер для управления DVB-картой (в час- влево или вправо. По умолчанию через дельные, так и настоящие. Последние тности, если у вас антенна с мото- 5 секунд плата выключает генериропроизводятся немецким концерном подвесом, то именно от драйвера бу- вание напряжения в 18 вольт, поэтому TechniSat. Стоимость настоящей кар- дет зависеть правильная передача пользователи с фиксированным блюдцем ничего не заметят, а пользоватеты колеблется в пределах 75-83 у.е., DiSeqC-команд). ли с мотоподвесом уже не смогут пов то время как стоимость «аналога» # wget linuxtv-dvb-1.1.1.tar.bz2 ворачивать антенну. Обладателям моможет быть и ниже. Гарантий, что на # tar xjvf linuxtv-dvb-1.1.1.tar.bz2 топодвесов рекомендуется акцентироэлементной базе «аналога» не сэконо# cd linuxtv-dvb-1.1.1 # make && make install вать внимание на этом факте. мили, никто дать не сможет. DVB-карты # ./MAKEDEV-DVB.sh Во второй строчке загружаем драйобладают внутренним MAC-адресом, # /sbin/depmod -a вер тюнера, который используется в частности, на SkyStar2 он напечатан Драйверы подготовлены. Следую- в плате SkyStar2 моделей 2.3 и 2.6. на лейбле, приклеенном к планке карщий шаг – сборка таких DVB-приложе- В прежних модификациях платы исТаблица 1. Цены на DVB-оборудование ний, как scan, szap, dvbdate, и некото- пользовался драйвер тюнера mt312. И в последней строчке загружаетрых других. Например, нам очень пригодится szap, т.к. с помощью именно ся непосредственно драйвер самой этого приложения можно в дальней- платы. После этого в syslog появляшем рассуждать о качестве принима- ются сообщения о регистрации нового устройства. емого сигнала, количестве ошибок. # wget linuxtv-dvb-apps-1.1.0.tar.bz2 # tar xjvf ↵ linuxtv-dvb-apps-1.1.0.tar.bz2 # cd linuxtv-dvb-apps-1.1.0 # make

# dmesg

Нужные утилиты и драйверы готовы – можно приступать к следующему шагу. # /sbin/insmod dvb-core ↵ dvb _ shutdown _ timeout=0 # /sbin/insmod stv0299 # /sbin/insmod skystar2

80

Рисунок 2. DVB-карта SkyStar2


hardware skystar2.c: FlexCopIIB(rev.195) chip found skystar2.c: the chip has 38 hardware filters DVB: registering new adapter (Technisat SkyStar2 driver). probe_tuner: try to attach to Technisat SkyStar2 driver stv0299.c: setup for tuner Samsung TBMU24112IMB DVB: registering frontend 0:0 (STV0299/TSA5059/SL1935 based)...

Можно оформить загрузку либо в файле /etc/rc.d/rc.local (или аналогичном для вашей системы), либо как строчки в /etc/modules.conf. После этого необходимо создать файл channels.conf, в котором содержатся сведения о характеристиках каналов, передаваемых со спутника (частота, символьный поток данных, поляризация и т. д.). Обратимся к информации, размещенной на сайте LyngSat [6]. Для радиостанции «Dinamit FM»(луч охватывает территорию России) видим следующее: Частота (freq.): Поляризация (там же): Символьный поток (SR): Аудиоканал (Audio): Идентификатор (SID):

12073 L (левая, она же горизонтальная) 27500 4100 2

Составим из этих данных файл channels.conf, который в дальнейшем будет использоваться и MPlayer и DVB-утилитами. Выглядит он следующим образом: Dinamit FM:12073:h:0:27500:0:4100:1:2 TV1:12173:h:0:2532:401:301:1:1 TNV:12214:h:0:4340:401:320:1:1

Первое поле – название канала, второе – используемая частота. Затем следует поляризация (горизонтальная или вертикальная), четвертое поле зарезервировано. Пятая позиция отвечает за символьный поток (Мбит/с). Затем пара – идентификаторы видео- и аудиопотоков. Восьмое поле опять резервируется. И последняя позиция – идентификатор SID. Составив таким образом файл каналов, можно приступать к тестированию каждого конкретного транспондера. Предположим, что пакет MPlayer в базовом варианте у вас уже установлен. Запишем только что созданный файл в домашнюю директорию MPlayer. # cp channels.conf ~/.mplayer/

Вспомним, что помимо драйверов мы также собрали пакет dvb-utils. Воспользуемся утилитой szap из этого пакета: # cd linuxtv-dvb-apps-1.1.0/util/szap # ./szap "Dinamit FM" -c ~/.mplayer/channels.conf reading channels from file '/home/anthony/.mplayer/channels.conf' zapping to 2 'Dinamit FM': sat 0, frequency = 12073 MHz H, symbolrate 27500000, vpid = 0x0000, apid = 0x1004 using '/dev/dvb/adapter0/frontend0' and '/dev/dvb/adapter0/demux0' status 07 | signal c281 | snr a977 | ber 0000fff0 | unc 00000000 | status 1f | signal c306 | snr d686 | ber 00000019 | unc 00000000 | FE_HAS_LOCK status 1f | signal c10e | snr d680 | ber 00000000 | unc 00000000 | FE_HAS_LOCK status 1f | signal c240 | snr d680 | ber 00000000 | unc 00000000 | FE_HAS_LOCK status 1f | signal c0e4 | snr d68f | ber 00000000 | unc 00000000 | FE_HAS_LOCK status 1f | signal c29e | snr d680 | ber 00000000 | unc 00000000 | FE_HAS_LOCK

Для анализа необходимо обратить внимание на следующие характеристики: уровень сигнала (signal), отношение сигнал/шум (snr) и ошибки (ber). Сигнал должен быть максимальным (в данном случае он колеблется на уровне 75%), отношение сигнал/шум также должно стремиться к макси-

№10, октябрь 2005

муму. При этом битовые ошибки (ber), наоборот, должны быть «в идеале» 0 (как в данном случае). Флаг FE_HAS_ LOCK означает, что сигнал от транспондера опознан на этой частоте с данными параметрами и можно приступать к просмотру или прослушиванию теле/аудиоканала. Однако если у вас MPlayer (или xine, или аналог) собран без поддержки DVB, то до наслаждения остается буквально один шаг. # cd MPlayer-1.0pre7try2 # ./conÞgure --preÞx=/usr/local/mplayer ↵ --with-dvbincdir=../dvb/linuxtv-dvb-apps-1.1.0/include/ # make # make install

Обращаю ваше внимание на то, что в моем примере пакет linuxtv-dvb-apps находится в каталоге dvb. У вас может быть немного по-другому, поэтому следите за корректностью пути к данным утилитам. Запуская MPlayer следующим образом, вы сможете слушать радиостанции: # mplayer dvb://0@"Monte Carlo" -tsprobe 12000

Ключ tsprobe необходим для быстрого определения MPEG-TS-потока. В случае, когда проигрывается видеоканал, то значение следует увеличить до 120000. А насколько интересно содержание спутниковых каналов решать, конечно же, вам. На вкус и цвет, как известно, товарищей мало. Надеюсь, что найдя что-то нужное, вы уже будете знать, как применить спутниковую ретрансляцию. Производить ли вещание в рамках LAN/WAN или задуматься об эфирном вещании станций в вашем населенном пункте. Или превратить вашу домашнюю ПЭВМ в аналог видеомагнитофона с помощью программ VDR (Video Digital Recorder) [20] или MythTV [21]. На этом всё, приятного времяпровождения.

Ссылки: 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.

http://www.wikipedia.com/DVB. http://www.telesputnik.ru/equipment/antena1.html. http://tv.tut.by/tech/tune.shtml. http://satnn.ru/sat_tv/128/dish_setup. http://www.allsat.ru/tvsat.html. http://www.lyngsat.com/36east.html. http://www.gs.ru/info/si/skystar2.html. http://www.technisat.com/en/produkte/produkteview.php?kid=1,29. http://www.gs.ru/info/si/eq.html. http://www.defyne.org/dvb. http://www4.mplayerhq.hu/MPlayer/releases/MPlayer-1.0pre7try2. tar.bz2. http://www.linuxtv.org/download/dvb/linuxtv-dvb-1.1.1.tar.bz2. http://www.linuxtv.org/download/dvb/linuxtv-dvb-apps-1.1.0.tar.bz2. http://www.linuxdvb.tv/download/dvb-20050706.tar.bz2. http://www.technisat.com/datasheets/en/SkyStar2pci.pdf. http://www.skystar2.info. http://www.gs.ru/si/SS2graph.html. http://www.gs.ru/si/SS2soft.html. http://www.satworld.ru/int4-st5.html. http://www.cadsoft.de/vdr – Video Disk Recorder. http://www.mythtv.org.

81


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

История взлёта и падения OS/2 – одной из самых интересных операционных систем

Алексей Коршунов Сейчас это может показаться кому-то странным, но Windows-системы существовали не всегда. Ещё не так давно доминирование продукта Microsoft было не настолько очевидным, а на рынке операционных систем имелся один весьма и весьма перспективный продукт компании IBM под названием OS/2.

Краткая информация OS/2 – операционная система фирмы IBM. Особой популярностью в качестве домашней ОС никогда не пользовалась, оставаясь в тени Windows. OS/2 представляет собой самостоятельную линию развития операционных систем, отличаясь от Windows NT существенно меньшей требовательностью к ресурсам компьютера, а от Linux/UNIX – принципиальной разницей в подходе к разработке и большей схожестью графического интерфейса пользователя с Windows.

OS/2 1.0 – начало Эволюция OS/2 началась очень давно. Наиболее важным моментом предыстории OS/2 следует считать появление IBM Personal Computer или просто IBM PC (название отлично демонстрирует полное отсутствие изобретательности IBM в деле присвоения наименований выпускаемым продуктам). MS(PC)-DOS, как и сам PC, была весьма открытой системой. Интерфейсы DOS и BIOS были хорошо документированы, и сторонние производители могли легко использовать и расширять их – вот почему DOS и по сей день используется в некоторых задачах.

82

Вместе с тем DOS и BIOS имели один очень большой недостаток. Они отнюдь не были «звездной командой» и, что еще хуже, – не использовали аппаратную часть PC на полную мощность. Это означало, что многие программы для полного использования аппаратных возможностей обращались к устройствам напрямую, минуя DOS.

Рассвет IBM PC Но невзирая на все свои недостатки в 1980 году IBM PC стал популярным инструментом. Аппаратный и программный рынки росли с невиданной скоростью. Казалось бы все было прекрасно – но пользователи PC были недовольны. Основные причины тому были следущие: Различные программы либо никак не взаимодействовали друг с другом, либо взаимодействие происходило на примитивном уровне. Пользователь не мог делать несколько задач одновременно. Как некое подобие многозадачности были придуманы резидентные программы. Логическим итогом всего хаоса проблем было то, что окружение DOS было нестабильным. Не было никакой

защиты ни памяти, ни других ресурсов, и любой процесс мог делать что угодно с любым куском памяти или манипулировать с оборудованием – элементарный рецепт катастрофы. Архитектура DOS имела серьезные ограничения при работе с памятью. «640 Кб будет достаточно для каждого» – выражение Билла Гейтса в 1981 году. Возможно, это и было правдой в 1981, но никак не в 1984. Естественно, как только нехватка памяти стала очевидной, были придуманы различные способы обойти «проблему 640», но все они никак не могли считаться решением. Некоторые из существовавших проблем могли быть решены программно с помощью лучше спроектированной операционной системы. Но другие требовали аппаратной поддержки для того чтобы решение было эффективным или в принципе реализуемым. И эта поддержка была реализована в 1984 году под названием IBM AT (Advanced Technology). Помимо огромной массы различных усовершенствований самым заметным (и важным) было применение нового центрального процессора – Intel 80286. Хотя 80286 был 16-разрядным, как и его прароди-


ретроспектива История 1981. Microsoft покупает 86-DOS у компании Seattle Computer Products. Удовлетворение запросов IBM к операционной системе для PC привело к некоторым изменениям, после чего она и выпущена под торговой маркой MS-DOS. 1984. Появляется процессор Intel 80286. В IBM принимается решение, что операционная система DOS морально устарела, и совместно с Microsoft начинает разработку OS/2. Декабрь 1987. Появилась OS/2 1.0 (кодовое название CP/DOS). Эта версия не имела графической оболочки (работала только в текстовом режиме) и имела достаточные улучшения относительно DOS, например, там была расширена поддержка оперативной памяти. Выводить информацию на экран могла только одна программа, хотя другие программы могли выполняться в фоновом режиме. Ноябрь 1988. OS/2 1.0 Extended Edition и OS/2 1.1 Standard Edition. Версия OS/2 1.1 SE (кодовое название Trimaran) обладает графической оболочкой Presentation Manager. Требования к оперативной памяти – минимум 3, а лучше 6 Мб. Версия под названием OS/2 1.10 Extended Edition (OS/2 1.10 EE), появившаяся позднее и стоящая

тели, однако он имел одну очень важную особенность: защищенный режим работы (protected mode). В защищенном режиме 286-й мог адресовать 16 Мб памяти. Это было очень много, учитывая, что PC с 16 Мб памяти стали стандартом де-факто лишь более чем 10 лет спустя. Но еще большим плюсом было то, что защищенный режим был действительно защищенным. Это означало, что доступ к памяти не был «свободным для всех» – вместо этого существовало 4 уровня (или кольца) защиты и менее привилегированный процесс не мог нанести повреждения блокам памяти, принадлежащим более привилегированным компонентам. Как IBM, так и Microsoft полностью осознавали проблемы, вызываемые работой DOS в реальном режиме, и работали над их решением. Двумя наиболее заметными продуктами, которые в итоге появились, стали IBM TopView и Microsoft Windows. TopView была текстовой многозадачной оболочкой для DOS и в сущности идейным прародителем позднейшей намного более ус-

№10, октябрь 2005

795 долларов, включала также Database Manager и Communications Manager. Октябрь 1989. OS/2 1.20 SE и EE (кодовое название Sloop). Впервые предложена улучшенная файловая система HPFS. Появилось средство двойной загрузки Dual Boot, а в расширенной версии 1.2 – мощный язык REXX. Этот год является переломным моментом в истории OS/2 – альянс начинает разваливаться (в основном из-за «подковерных игр» менеджеров Microsoft). Microsoft, обеспокоенная завоеванием рынка операционных систем, берет на себя разработку следующей, полностью 32-разрядной OS/2 3.0. IBM концентрируется на разработке OS/2 2.0. Это, по сути, «развод» – разрабатываемая фирмой Microsoft OS/2 3.0 даже не сохраняет своего названия и демонстрируется на выставке ComDex’91 под именем Windows NT – первая Windows с вытесняющей многозадачностью. Декабрь 1990. OS/2 1.3 (кодовое название Cutter) – версия, работающая на процессоре 80286 и последняя, выходящая в двух вариантах стандартной и расширенной редакции (Язык REXX присутствует уже в обеих редакциях). Из новшеств – поддержка масштабируемых шрифтов Adobe Type Manager. Эта версия также в ряду последних, продаваемых фирмой Microsoft.

Все новые изменения внесены в подавляющем большинстве программистами IBM, система претерпела существенную переработку и ощутимо улучшилась ее производительность. Апрель 1992. OS/2 2.0 (кодовое название Cruiser). Первая 32-разрядная версия OS/2. Минимальные требования – процессор 80386SX, 4 Мб оперативной памяти. Поддержка SAA (System Application Architecture) – унифицированной архитектуры прикладных программ. OS/2 2.0 – первая версия, официально поддерживаемая не только на компьютерах IBM, но и на компьютерах других фирм. Она претерпела большие реконструкции после разрыва партнерских отношений с Microsoft по разработке. Появился удобный объектноориентированный интерфейс WorkPlaceShell («рабочий стол», рабочее место) базирующийся на архитектуре SOM (System Object Model), появилось гибкое средство загрузки Boot Manager, серьезно усовершенствована поддержка DOS и Windows приложений (Windows приложения запускаются с использованием Win-OS/2), а также 32-разрядный программный интерфейс. Появилась и возможность использования более 16 Мб оперативной памяти. Отдельно выходят обновления для средств мультимедиа.

пешной оболочки DesqView производства компании Quarterdeck. Microsoft Windows являлась графическим многозадачным окружением, работавшим поверх DOS. Впервые анонсированная в 1983 версия 1.0 появилась в 1985. Она была более чем плохой и вполне заслуженно не приобрела сколько-нибудь широкой популярности.

задолго до выпуска продукт переименовывается в OS/2 – видимо, для соответствия новой линейке персональных компьютеров IBM под названием PS/2 (Personal System/2). Интересно то, что OS/2 1.0 не были реализованы очень многие планируемые особенности и самым заметным было отсутствие графического интерфейса пользователя Presentation Manager (кодовое имя Winthorn). И все же OS/2 1.0 являлась радикальным рывком в сторону от DOS и имела множество особенностей и возможностей, которые DOS никогда не смогла бы иметь и которые были реализованы в других операционных системах намного позже. ! Вытесняющая многозадачность (preemptive multitasking). ! Многопоточность (multithreading). ! Средства взаимодействия между процес с ами (Inter Process Communication – IPC) такие как р а з д е л я е м а я п а м я т ь ( s h a re d memory), каналы (pipes), семафоры (semaphores) и очереди (queues).

Взросление В это же время Microsoft работала над полностью новой операционной системой, рассчитанной заменить DOS. В январе 1983 года началась разработка новой многозадачной MS-DOS системы. Название проекта изменялось несчетное количество раз. В августе 1985 IBM присоединяется к проекту, и фирмы подписывают соглашение о совместной разработке, которое дает обеим компаниям право на продажу конечного продукта. Немного погодя проект переименовывается в CP/ DOS – от Control Program/DOS. Но даже это был не финал процесса выбора имени еще нерожденного ребенка. Не-

83


ретроспектива Май 1993. OS/2 2.1 (кодовое название Borg). Добавлена поддержка приложений Windows 3.1 (до этого поддерживалась Windows 3.0). В поставку включены средства мультимедиа и значительно обновлен список поддерживаемых аппаратных устройств. Требования к оперативной памяти – минимум 8 Мб. Ноябрь 1993. OS/2 for Windows (кодовое название Ferengi). Отсутствует Win-OS/2 – вместо нее используется уже ранее установленная пользователем Windows 3.1, обновлены драйвера. Февраль 1994. OS/2 2.11. В основным исправлены различные ошибки. Также существует отдельным набором исправлений FixPack XR 06200 для OS/2 2.1. Июль 1994. OS/2 2.11 SMP. В этой версии была добавлена поддержка многопроцессорных (до 16 процессоров) систем. Октябрь 1994. OS/2 Warp 3.0 (кодовое название Warp). Изменения коснулись лишь улучшения производительности системы, понижения требования к оперативной памяти до 4 Мб. Расширен спектр поддерживаемых аппаратных устройств. В GUI появился новый элемент – LaunchPad (Панель инструментов, «стартовая площадка») – эффективное и гибкое средство, отлично вписавшееся в объектноориен-

! Поддержка виртуальной памяти

(virtual memory, swapping) – теоретически до 1 Гб виртуальной памяти. ! Полностью защищенный режим работы. ! Динамическое подключение библиотек (dynamic linking, DLLs). ! Поддержка до 16 Мб оперативной памяти. Одной из самых неприятных помех для разработчиков было то, что они столкнулись с необходимостью поддержки DOS. Ни одна из проблем не являлась непреодолимой, но их комбинация была убийственной. IBM и Microsoft расплачивались за непродуманные решения, принятые при разработке DOS в 1981 году. К тому же огромная популярность DOS произвела эффект бумеранга – разработчики вынуждены были поддерживать DOS приложения в OS/2, чтобы иметь хоть какие-то шансы на завоевание рынка. В конце концов разработчики OS/2 нашли решение, как исполнять DOS

84

тированную модель интерфейса. С OS/2 Warp 3.0 поставляется бесплатный пакет «BonusPak», включающий: ! средства ревизии аппаратного обеспечения; ! расширенные средства просмотра мультимедиа, обработки движущегося видео, полнофункциональную работу с факсом (при наличии факс-модема); ! достаточно мощный пакет офисных приложений (включая текстовый процессор, электронные таблицы, базу данных, построения графиков) и персонального органайзера; ! средство проведения конференций в сетях; ! доступ к сетям CompuServe и Интернет. Май 1995. OS/2 Warp Connect. В базовую систему включена полная поддержка сетевой функциональности, поддержка одноранговых сетей. Сентябрь 1996. OS/2 Warp 4.0 (кодовое название Merlin). В этой версии включено полное управление голосом, средства голосового ввода текста, встроенные механизмы Java, OpenDoc, средства работы в глобальной сети Интернет и другие передовые технологии, разработан-

в защищенном режиме, хотя в процессе поиска решения и столкнулись с огромным количеством проблем. Окончательный выход выглядел следующим образом: имелась одна-единственная полноэкранная сессия DOS, которая не могла выполняться в фоновом режиме. Реализация подобного подхода требовала частого переключения между защищенным и реальным режимами (при активной DOS задаче). Код DOS, применяемый в OS/2, базировался на коде MS-DOS/PC-DOS, но с многочисленными модификациями. Так, к примеру, код, обеспечивавший работу с файловой системой, работал только в защищенном режиме. Иными словами, при обращении к файлу вся операционная система переключалась в защищенный режим. Впрочем, впоследствии такой подход оказался большим плюсом – когда были реализованы инсталлируемые файловые системы, оказалось, что DOS сессия OS/2 не имеет никаких проблем с доступом к (например) файловой системе HPFS.

ные корпорацией IBM. Сильно изменен дизайн системы и более удачно (относительно предыдущих версий) проработана сетевая подсистема. 1999. OS/2 WarpServer for e-Business (кодовое название Aurora) – сокращенно OS/2 WSeB. Внешне OS/2 осталась практически без изменений, однако внутренние переработки носили весомый характер. Появилась поддержка журналируемой файловой системы JFS, взятой из AIX (IBM версия UNIX), сняты ограничения на объем виртуальной памяти, появилась мощная программа для управления томами под названием LVM (Logic Volume Manager). Весной 2000-го американская компания Serenity Systems объявляет о том, что ею достигнуто партнерское соглашение с IBM о выпуске новой клиентской версии OS/2. Правда, эта клиентская версия полностью меняет свое название – новый клиент называется eComStation (сокращенно eCS). Официально продажи eCS 1.0 начались в июле 2001 года. По сути, это новая модификация OS/2, в которой изменен интерфейс за счет включения в базовую систему приложения Styler/2 а также процесс инсталляции. Добавлено новое средство распределенной инсталляции ПО под названием WiseMachine.

Весь же защищенный код был написан «с нуля» со всеми теми приятными особенностями, которые были описаны ранее. Ядро и системные библиотеки в основном были написаны на ассемблере по следующим двум причинам: ! Производительность – OS/2 должна была работать на IBM AT с 6 Мгц процессором. ! Ограничения по памяти – OS/2 должна была работать при наличии только 1 Мб ОЗУ. В новой операционной системе было особенно не на что посмотреть – интерфейс был исключительно текстовым (обещанный Presentation Manager был все еще в стадии разработки) и внешний вид весьма походил на DOS. Но после нажатия <Ctrl+ESC> появлялся Program Selector – утилита, позволявшая запускать новые задачи и переключаться между существующими. Теоретически существовало 16 сессий, но поскольку сама OS/2 занимала часть из них, пользователь имел доступ к 12 сессиям.


ретроспектива С точки зрения пользователя OS/2 1.0 имела несколько существенных недостатков. Некоторые были исправлены в более поздних версиях серии 1.x, на исправление других понадобилось куда больше времени: ! Максимальный размер раздела 32Мб. Хотя возможно в 1987 году это было и не критично. OS/2 1.1 превысила это ограничение (хотя и базировалась на FAT), а OS/2 1.2 поставлялась уже с HPFS. ! Отсутствовала поддержка двойной загрузки (dual boot) или менеджера загрузки (Boot Manager). Dual Boot появился в версии 1.1, Boot Manager был реализован в версии 2.0. ! Не было возможности обойти обработку файла CONFIG.SYS. Это было напастью всех версий серии 1.x. В сочетании с отсутствием Boot Manager это означало, что если система не могла загрузиться (например, некорректный драйвер), то единственным шансом спасти ситуацию (и данные) была загрузочная дискета. Окончательно проблема была решена только в OS/2 Warp. ! Полное отсутствие механизма замены находящихся в использовании динамических библиотек (DLL). Это сделало установку исправлений системных DLL (таких как драйвера Presentation Manager) более чем затруднительным занятием. В OS/2 2.x ситуация разрешилась с помощью недокументированных вызовов API. На рынке операционных систем OS/2 пребывала в состоянии безнадежной битвы за широкое распространение. Ее признанию мешало несколько факторов: ! OS/2 считалась требовательной к ресурсам (рекомендовалась AT с 2 Мб ОЗУ, хотя для работы было достаточно одного мегабайта). ! Совместимость с DOS на самом деле была далеко не на высоком уровне. С другой стороны, само наличие поддержки DOS было маленьким чудом, поскольку препятствий этому было неисчислимое множество. ! Непомерно высокие цены. Возможно, маркетологи IBM и Microsoft имели какие-то свои особые со-

№10, октябрь 2005

ображения, но продажа набора разработчика (SDK – software development kit) за тысячи долларов отнюдь не помогала росту популярности операционной системы (первая версия Microsoft SDK for OS/2, вышедшая в апреле 1987, стоила три тысячи долларов). ! Ложные представления о новом продукте. Возможно, самый большой ложный миф зак лючался в том, что OS/2 могла работать только на оборудовании IBM. Дела обстояли абсолютно иначе – даже версии OS/2, продаваемые самой IBM, поддерживали оборудование сторонних производителей. Резюмируя, можно сказать, что OS/2 1.0 не достигла абсолютного успеха (иначе сегодня большинство компьютеров работало бы под управлением OS/2), но и не стала оглушительным провалом. OS/2 внесла большое количество новых (и по большей части хороших) концепций в мир PC. Также OS/2 1.x выстроила солидный фундамент для OS/2 2.x, которая в свою очередь была большим шагом в истории PC. Большинство концепций, впервые появившихся в OS/2 1.x доказали свою обоснованность и не претерпели существенных изменений в последующих релизах. Программисты IBM и Microsoft, без сомнения, не заслуживают ничего, кроме уважения за проделанную работу.

OS/2 1.1 – ранние годы Следующим релизом OS/2 стала версия 1.1. Единственной причиной, по которой версию пронумеровали не 2.0, вероятно, было то, что графический интерфейс пользователя (GUI – Graphical User Interface) был обещан в версии 1.0, но не был закончен вовремя. Как забавный факт следует отметить, что Windows 1.0 разрабатывалась как Interface Manager и приобрела новое имя благодаря менеджерам, игравшим с именами, невзирая на протесты программистов. Presentation Manager имел кодовое имя Winthorn и практически полностью был написан в отделении IBM Hursley Labs. Программирование для PM было весьма схоже с программированием под Windows, однако имелись и отличия:

! Прежде всего самое заметное бы-

ло в различии координатных систем. В то время как координаты 0,0 в Windows были привязаны к верхнему левому углу экрана (что логично для знающего, как работает аппаратная реализация графики на архитектуре PC), в PM координаты 0,0 были привязаны к нижнему левому углу экрана (что логично для того, кто знает, как работает координатная система в математике или физике). ! В Windows все графические операции передавались так называемому Device Context. PM также использовал DC, но дополнительно имел еще один уровень абстракции, называвшийся Presentation Space, что предоставляло большую гибкость. ! OS/2 имела гораздо более мощные функции рисования в своем графическом программном интерфейсе (Graphics Programming Interface, GPI) – наследие мейнфреймов. Некоторые из концепций GPI позднее были перенесены в Windows NT (но не в Windows 95). ! Общая программная модель в OS/2 была намного проще и не выглядела как набор «быстрых и грязных исправлений» (quick and dirty hack), что справедливо по отношению к программной модели Windows. Помимо появления GUI другие изменения включали полную реализацию именованных каналов, которой не было в OS/2 1.0. Также была добавлена поддержка «больших» томов FAT (BigFAT). Теоретически поддерживались тома размерами до 2 Гб, хотя практический лимит был несколько ниже. После запуска OS/2 1.1 встречала пользователя следующим экраном (см. рис. 2). Достаточно странным фактом было то, что OS/2 1.1 не имела нормального текстового редактора с GUI интерфейсом – даже такого, как notepad в Windows. Вместо него было текстовое приложение E.exe, запускаемое из командной строки. В любом случае OS/2 1.1 была технически очень интересной и занимательной программой. Она обладала намного большими возможностя-

85


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

Рисунок 1. Рабочее пространство пользователя OS/2 1.0

ми, чем любая операционная система для персональных компьютеров в то время. Windows и MacOS даже в перспективе не имели того, что было в OS/2 – ни вытесняющей многозадачности, ни многопотоковости, ни виртуальной памяти. Естественно, что системе были присущи и недостатки. Хотя и поддерживалось большинство тогдашних стандартов для вывода графики (CGA, EGA, VGA), но поддержка других была весьма слабая, если вообще существовала. Поддержка принтеров была чисто номинальная – несколько принтеров и плоттеров производства IBM и все. Под OS/2 существовали различные приложения – в том числе такие, как Microsoft Word, Lotus 1-2-3 и QuattroPro. Однако все они были текстовыми, за исключением Microsoft Excel 2.2.

!

!

!

OS/2 1.2 – развитие В конце 1999 Microsoft и IBM выпускают версию OS/2 1.2 – очень важное событие во всей истории OS/2, поскольку именно в версии 1.2 были реализованы практически все возможности, обещанные в OS/2 еще до ее появления. В OS/2 1.2 разработчики наконец отказались от файловой системы FAT и реализовали инсталлируемые файловые системы (Installable File System, IFS) и высокопроизводительную файловую систему HPFS (High Perfomance File System). HPFS была разработана «с нуля» Гордоном Литвином (Gordon Letwin) – ведущим разработчиком OS/2 в Microsoft. Новая файловая система весьма превосходила FAT, а также снимала множество ограничений: ! Отсутствовал печально известный лимит «8.3» на имена файлов – 8 символов на имя и 3 на расшире-

86

!

!

Рисунок 2. Долгожданный GUI

ние. Имена файлов могли быть длиной до 255 символов и допускали значительно больший диапазон допустимых к использованию символов – в частности пробел. Поддержка расширенных атрибутов (Extended Attributes, EA). Каждый файл или директория могли иметь до 64 Кб EA, связанных с ним там могла храниться любая информация – иконки, описания, информация для программы-каталогизатора и так далее. Поддержка больших дисков. FAT поддерживала разделы размером до 2 Гб. HPFS поддерживала тома до 64 Гб и была ограничена на то время лишь драйверами жестких дисков. Устойчивость к фрагментации. В то время как разделы FAT требовали регулярной дефрагментации для предотвращения иногда ощутимых потерь в производительности, HPFS пыталась использовать для файлов непрерывные фрагменты, сохраняя фрагментацию на минимальном уровне. Уменьшение потерь дискового пространства. Наибольший FAT-диск, размером в 2 Гб, использовал для хранения данных элементы размером 64 Кб, чем вызывались большие потери дискового места (иногда до 50%). HPFS использовала сектора размером 512 байт, таким образом резко уменьшая потери. Высокая отказоустойчивость. Если таблица FAT на дисковом разделе разрушалась в результате инцидента, вся остальная информация на диске превращалась в гору бесполезного мусора, поскольку вся информация о размещении файлов была сконцентрирована

в FAT. HPFS дублировала часть информации и хранила структуру диска связно в обоих направлениях (от каталога к подкаталогу или файлу и наоборот). В результате, повреждения одной области не оказывали никакого влияния на весь остальной раздел. К примеру, несмотря на повреждение сектора с директорией – все файлы в ней оставались доступны. Существовало две версии HPFS – «чистая» HPFS и HPFS386. Последняя, используемая в Microsoft LAN Manager (и IBM LAN Server), была более производительной, допускала значительно увеличенные размеры кэша и имела несколько расширений необходимых для серверов – к примеру встроенную систему разграничения доступа (Access Control List, ACL) и систему ограничения директорий. В общем, судьба HPFS оказалась весьма успешной – она практически в неизменном виде перешла в OS/2 2.0 и с некоторыми вариациями была использована в Windows NT под именем NTFS. Подобная история произошла с файловой системой UFS операционной среды SunOS 4.x. После революционного перехода на полностью новую ветку UNIX фирма Sun, имея богатый положительный опыт, без больших изменений оставила UFS в своей новой ОС. Это наглядный пример того, что удачные решения предшественников остаются в силе. OS/2 GUI также получил новый внешний вид, весьма схожий с вышедшей через несколько месяцев Windows 3.0 (см. рис. 3). Наиболее значимым различием между OS/2 1.2 и Windows 3.0 было то, что Windows не была операционной системой как таковой и исполнялась


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

Рисунок 3. Единообразие интерфейса OS/2 & Win3.0

поверх MS-DOS (и даже могла быть запущена в DOS сессии OS/2). Также Windows содержала больше различных приложений (по большей части бесполезных, ну может быть за исключением Solitaire). OS/2 была более бизнес-ориентированной и при сравнении имела несколько спартанский вид. Отчасти это послужило тому, что Windows получила большее распространение среди конечных пользователей.

OS/2 1.3 – последняя из 16-битных ОС После исторического разрыва совместной разработки OS/2, вызванного нежеланием Microsoft делить прибыль от продаж операционной системы с IBM, основной процесс по модернизации OS/2 происходил в IBM (хотя Microsoft и полностью сконцентрировалась на Windows, некоторые вынужденные изменения в систему все же вносились). Версия 1.3 была практически идентична 1.2 по предоставляемым возможностям, но включала многочисленные улучшения производительности и удобства использования. Наконец во всех редакциях OS/2 присутствовал язык программирования REXX, разработанный Майком Коулишоу (Mike Cowlishow) из IBM UK. Язык изначально создавался для достижения четырех главных целей: ! легкой понимаемости (читаемости) написанных на нем программ, что облегчает работу программистам, пользователям и сопровождающему персоналу; ! поддержки быстрого, эффективного и аккуратного программиро-

№10, октябрь 2005

Рисунок 4. Workplace Shell OS/2 2.0

вания за счет обеспечения максимально естественной формы представления данных и управляющих структур языка; ! обеспечения надежной и эффективной реализации языка на разнообразных платформах; ! высокой применимости языка в системном и прикладном ПО. И все эти задачи были успешно решены. Таким образом операционная система получила мощный и гибкий инструмент, сравнимый с различными языками написания скриптов в UNIXподобных системах. Это несомненно являлось очень большим преимуществом, особенно в сравнении с более чем скромным набором возможностей, которые предлагались при написании пакетных файлов в DOS и ранних версиях OS/2.

OS/2 2.0 – 32-битная революция Пока в 1988 году IBM и Microsoft усердно трудились над OS/2 1.2, в IBM началась разработка кардинально переработанной операционной системы. Итак, хотя версию 1.3 IBM совершенствовала исключительно своими силами, в то же время под руководством ведущего разработчика Майкла Когана (Michael S. Kogan) уже полным ходом шли работы над версией 2.0. В марте 1992 операционная система была полностью готова и выпущена на рынок под названием OS/2 2.0 GA (General Availability – публично доступная). Приставка GA появилась не случайно. В это время шли яростные «словесные войны» между IBM

и Microsoft и в одной из перепалок вице-президент Microsoft Стив Балмер пообещал публично съесть флоппидиск, если IBM умудрится выпустить OS/2 2.0 до конца 1991 года. Поскольку зрелище обещало быть достаточно интересным, в ноябре 1991 была выпущена ограниченным тиражом OS/2 2.0 LA (Limited Availability – ограниченно доступная). К сожалению, господин Балмер не сдержал своего слова, и OS/2 2.0 LA пришлось использовать как простую бета-версию, каковой она в сущности и являлась. Самым большим плюсом в OS/2 2.0 была сама система. Переход на 32-разрядную архитектуру снял множество ограничений, существовавших в DOS и OS/2 1.x – в первую очередь по работе с памятью. Вместе с тем система не была «полностью» 32-разрядной – многие части оставались 16-разрядными – в первую очередь по соображениям совместимости и экономии времени. Для ускорения разработки, к примеру, драйвера графической подсистемы (драйвера видеокарт и принтеров для Presentation Manager) в OS/2 2.0 были 16-разрядными и были заменены 32-битными версиями только в OS/2 2.1. Требованиями совместимости диктовалось использование 16-разрядных драйверов физических устройств (Physical Device Driver, PDD) совместимых с OS/2 1.3. Аналогичным образом многие фрагменты ядра были 16битными для обеспечения поддержки приложений, написанных для OS/2 1.x. Основные же элементы системы были полностью новыми и 32-разрядными – к примеру поддержка множества виртуальных DOS-машин (Multuply

87


ретроспектива Virtual DOS Machine, MVDM) и менеджер памяти с поддержкой пейджинга. Более того, основная часть кода была написана на C, а не на ассемблере, как в OS/2 1.x. Вторым существенным моментом стал новый интерфейс пользователя под названием Workplace Shell (или WPS для краткости), являвшийся радикальным уходом от концепций, заложенных в GUI OS/1.x и Windows (см. рис. 4). Новый интерфейс был объектно-ориентированным и в нем все стало объектом – диск, принтер, программа и так далее. Манипуляции с объектами проводились с помощью drag-n-drop – перемещение, копирование, печать и уничтожение. В WPS широко использовалась правая кнопка мыши – для открытия контекстных меню и выполнения операций по перетаскиванию объектов. Для операционной системы OS/2 2.0 была зарегистрирована торговая марка «Интегрирующая платформа» (The Integrating Platform). Это название напрямую намекало на уникальную возможность OS/2 2.0 исполнять существующие DOS, Windows и OS/2 1.x приложения одновременно с новыми 32-разрядными родными приложениями. В отличие от OS/2 1.x в версии 2.0 поддержка DOS была превосходной. Система полностью использовала появившийся в 386 и последующих процессорах виртуальный 8086режим (Virtual 8086 mode). Злые языки компьютерного мира одно время утверждали, что этот режим был реализован в 386-м процессоре шокированными инженерами Intel – слухи о мучениях при программировании поддержки в OS/2 1.x действительно распространились весьма широко, и облегчение страданий программистов на аппаратном уровне было поистине обычным состраданием. Кроме того, что пользователь теперь мог запускать не только несколько полноэкранных и оконных сессий DOS, появилась возможность создавать «специальные» DOS-сессии, в которых использовалась не встроенная поддержка DOS, а предоставлялась возможность запустить DOS 4.0, DOS 5.0, DR-DOS и так далее. Поддержка Windows-приложений логическим образом вытекала из поддержки DOS. Полноэкранная Win-OS/2

88

сессия просто исполняла Windows 3.0 в рамках виртуальной DOS-машины. Оконные сессии Win-OS/2 требовали более нетривиального подхода в связи с тем, что им было необходимо взаимодействовать с PM/WPS-приложениями. Выход из ситуации был реализован написанием специальной версии экранного драйвера для Win-OS/2. Такой подход, хотя и обеспечил хорошую производительность, но имел существенный недостаток – это сделало процесс написания драйверов видеокарт для OS/2 намного более сложным и дорогим занятием и было одной из причин малого количества драйверов для OS/2. Производителю приходилось помимо создания видеодрайвера для OS/2 дополнительно предоставлять специфическую OS/2 версию драйвера для Windows. Более логичным было бы написание «транслирующего» драйвера, преобразовывавшего вызовы функций Win-OS/2 в вызовы PM – тогда от производителя требовалось бы написание только OS/2 версии видеодрайвера. На первых порах OS/2 2.0 столкнулась с той же проблемой, что и OS/2 1.x до нее – недостатком родных приложений. Система прекрасно справлялась с запуском DOS, Windows и OS/2 1.xприложений, но на первых порах ощущалась нехватка родных 32-разрядных программ.

OS/2 2.1, 2.11, 2.11 SMP – надежная платформа, эпоха зрелости Выпуск версии OS/2 2.1 в мае 1993 года явился следствием эволюционного развития версии 2.0. Внешний вид не претерпел существенных изменений, разработчики продолжали трудиться над «внутренностями» системы. Из видимых конечному пользователю изменений стоит отметить смену версии Win-OS/2 с 3.0 на 3.1 и появление нового компонента под названием Multimedia Presentation Manager/2 (MMPM/2), добавившего в графический интерфейс пользователя различные мультимедийные возможности – звуковые схемы, воспроизведение мультимедийных файлов и тому подобное. В ноябре 1993 выходит специальная версия OS/2 for Windows, не содержащая кода Win-OS/2, а использу-

ющая уже установленную на компьютере копию Windows 3.x. Таким образом снижалась цена конечного продукта (IBM платила лицензионные отчисления Microsoft за использование кода Windows в Win-OS/2). Вместе с тем эта версия продемонстрировала ситуацию на рынке. Используя свое монопольное положение, Microsoft с помощью манипуляций в сфере ценовой политики держала производителей клонов PC под жестким контролем, запрещая им предустанавливать на продаваемые компьютеры операционные системы, отличные от DOS/Windows собственного производства. Позже такая политика была признана незаконной, но OS/2 это уже не помогло. Выпустив OS/2 for Windows, фирма IBM пыталась разрешить проблему без нарушения OEM-соглашений производителей компьютеров с Microsoft. Несмотря на жесткий прессинг со стороны Microsoft времена OS/2 2.1 и 2.11 были отмечены ростом количества приложений, написанных специально для OS/2. IBM достигла соглашения с несколькими крупными производителями программного обеспечения о разработке OS/2 версий их приложений. В число таких компаний входили Borland, Lotus, Novell и тогда еще самостоятельная WordPerfect. IBM в некоторых случаях даже субсидировала отдельные разработки. В то же время Microsoft проявляла не меньшую активность, однако не заключая договора или оплачивая разработку, а, напротив, шантажируя разработчиков ПО угрозами закрыть доступ к бета-версиям и информации о Windows, если они будут разрабатывать свои продукты под отличные от Windows платформы.

OS/2 Warp – золотая эра В октябре 1994 выходит OS/2 Warp – самая популярная и самая распространенная версия OS/2. Внутренне система незначительно отличалась от OS/2 2.11 за исключением расширенной поддержки оборудования и исправления ошибок – хороший пример того, что грамотно спроектированный и продуманный продукт не нуждается в лихорадочном переписывании многих элементов кода. Наиболее серьезные изменения касались исключительно улучшения простоты использования конечным пользователем (рис. 5).


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

Рисунок 5. Развитие GUI-интерфейса без отрыва от удобства использования

Новые изменения и улучшения включали в себя: ! OS/2 Warp поддерживала новый улучшенный формат исполняемых файлов, значительно уменьшавший их размер (к сожалению, этой возможностью воспользовалась очень малая часть разработчиков ПО). ! Улучшенную модель драйверов, делавшую их разработку более простым делом. ! Улучшенные мультимедиа-средства, поддержку плат с TV-выходом, плат видеозахвата и прочих подобных устройств. ! Значительное расширение списка драйверов оборудования. ! Возможность манипулирования процессом загрузки с помощью комбинации клавиш <Alt+F1>. Наконец можно было отказаться от «спасательного» флоппи-диска. ! Кардинально улучшенный десктоп, новые иконки, более приятные глазу цветовые схемы. ! Основательно дополненную учебную программу для новичков. ! Специальное средство быстрого запуска приложений LaunchPad. ! Весьма качественную поддержку протоколов и приложений для работы в Интернете (см. рис. 6). Задолго до того, как в Microsoft уяснили важность «информационной супермагистрали», IBM предоставила в распоряжение пользователей полный и мощный набор инструментов для работы во всемирной сети. Сперва отдельно, а с версии OS/2 Warp Connect в комплекте с операционной системой.

№10, октябрь 2005

Рисунок 6. Первые шаги к рабочей станции с доступом в Интернет

OS/2 Warp и OS/2 Warp Connect была самой серьезной и удачной попыткой IBM победить в битве за доминацию на десктопе или по крайней мере в завоевании существенной части. По некоторым оценкам, OS/2 смогла захватить 10% десктоп рынка – это был фантастический результат в условиях тотальной “осады” со стороны Microsoft. Успех обусловился несколькими факторами: ! OS/2 была устойчивой и эффективной 32-разрядной операционной системой, а не помесью устаревшего фундамента с собранными на каркасе заплаток красивыми плитами, каковой в то время была комбинация Windows 3.x + DOS и каковой позже фактически была Windows 95. ! Стандартом де-факто стали достаточно мощные PC, и OS/2 не требовала специальных дорогостоящих конфигураций оборудования. ! С технической стороны не было реальных конкурентов, предлагавших такой широкий набор возможностей, как OS/2. Windows 3.x не использовала многих ресурсов предоставляемых аппаратной частью PC, появившаяся в 1993 г. Windows NT хотя и была многозадачной, но, во-первых, нацеливалась на рынок серверов, а во-вторых, была сырым монстром, требовавшим занчительно больших ресурсов, чем OS/2. К тому же поддержка старых приложений находилась на уровне между отсутствием и несовершенством. Вышедшая в 1994 Windows NT 3.5 (исследование схемы нумерации продук-

тов Microsoft когда-нибудь принесет ее автору звание доктора маркетинговых исследований) незначительно улучшила ситуацию. Рынок UNIX-подобных операционных систем для PC в то время был развит весьма незначительно. OS/2 предлагала отличную совместимость со старыми Windows и DOSприложениями – слоган IBM «better DOS than DOS» (DOS лучше чем DOS) был далеко не голословным, а отображал реальное состояние дел с DOS-подсистемой в OS/2. ! OS/2 была отличным коммуникационным инструментом, что вызвало ее буквально взрывное распространение среди участников любительской сети FIDOnet, – Windows физически не могла реализовать устойчивую, надежную и продолжительную работу без перезагрузок, так необходимую, к примеру, для функционирования BBS-сервера в фоновом режиме с одновременным комфортным использованием компьютера как десктопа для других целей. ! OS/2 была достаточно проста в использовании, одновременно сочетая простоту, удобство и мощность пользовательского интерфейса в Workplace Shell. Конечно, любая вещь имеет свои достоинства и недостатки, и OS/2 была не лишена минусов: ! Отличная совместимость с DOS и Windows 3.x, сыгравшая с IBM злую шутку. Многие производители ПО аргументировали отсутствие версий своих продуктов для OS/2

89


ретроспектива ! Графический интерфейс пользо-

запросив за лицензию намного более высокую цену по сравнению с ценами для других производителей. Помимо неприятностей для IBM PC Company ! в сторону подразделения, работавшего над OS/2, бросались достаточно двусмысленные взгляды. Трудно сказать, когда начался проект OS/2 for PowerPC, однако известно, что в самом начале девяностых IBM решила, что было бы очень неплохо иметь собственную десктоп-ориентированную операционную систе! му. Ее планировали как базирующуюся на микроядре объектно-ориентированную супер ОС, работающую на RISC-платформе (неплохая коллекция непонятных слов). ПлатфорДальнейшие версии OS/2 факти- ма должна была позволять запускать чески отличались от Merlin лишь вклю- сразу несколько операционных сис! чением в поставку различных дополни- тем одновременно. Сейчас уже никтельных продуктов, добавлением осо- то не скажет, какие это должны были бенностей наподобие новых файловых быть операционные системы, но в их число должны были входить OS/2, систем и исправлением ошибок. Windows NT, Solaris и MacOS. Зачем кому-либо могло понадобиться запускать OS/2 for PowerPC – весь этот зоопарк на одной машине фатальная цепь ошибок В рамках истории OS/2 отдельного упо- в одно и то же время – один из вопроминания, несомненно, заслуживает ис- сов, на который IBM так никогда вняттория OS/2 for PowerPC. Помимо пря- но и не дала ответа, и судя, по всему, мого отношения к OS/2 она сама по се- никто в IBM даже не задумавался, за! чем это нужно. Очевидно, ответ «потобе достаточно поучительна. У OS/2 была тяжелая жизнь, как му что мы можем!» не был самым корвне, так даже и внутри IBM. Широ- ректным вариантом. В любом случае цели, задачи ко известны события времен выхода Windows 95, когда Microsoft оказыва- и названия проекта постоянно меняла невероятное давление на IBM PC лись, в итоге завершившись проектом Company (производившей компью- OS/2 for PowerPC, назвавшимся в фитеры IBM PC), до последнего момен- нальной стадии OS/2 Warp Connect, OS/2 Warp 4.0 – пик та отказываясь подписывать договор PowerPC Edition. IBM активно рекларазвития, начало заката Сентябрь 1996 года ознаменовался по лицензированию на предустанов- мировала продукт все время на провыходом OS/2 Warp 4.0 (чаще других ку Windows 95 и в последний момент тяжении между 1993 и 1995 годами. Было написано немыслимое версий OS/2, именуемый своколичество статей и даже выим кодовым именем Merlin). пущены бета-версии набора Новые изменения и улучшеразработчика под названием ния превратили Merlin в самоPowerPC SDK. Среди произго выдающегося представитеводителей ПО распространяля операционных систем селись средства для переноса мейства OS/2 (см. рис. 7). приложений из обычной OS/2 ! Встроенные возможносна новую платформу (скорее ти по управлению головсего, сам перенос не был сом и средства голосовотрудоемким, поскольку OS/2 го набора позволили ис2.0 изначально разрабатывапользовать голосовые колась с оглядкой на переносиманды при работе с системость). С приближением вымой (открыть веб-странихода OS/2 for PowerPC рекцу, удалить объект и т. д.) ламный шум постепенно наи осуществлять голосовой Рисунок 7. Лучший и, увы, последний интерфейс OS/2 чал утихать. И в тот момент, ввод текста. тем, что написанные для DOS и Windows программы прекрасно чувствуют себя под OS/2. Яростное противодействие Microsoft, которое нанесло наибольший урон OS/2. Не стесняясь никого и ничего, Microsoft применяла любые способы торпедирования OS/2, самыми эффективными из которых был шантаж OEM-производителей и независимых разработчиков ПО. Слабая и невнятная поддержка со стороны самой IBM. Компания даже поставляла собственные компьютеры без предустановленной OS/2, что, конечно, никак не способствовало росту доверия пользователей к системе. Бездарная маркетинговая политика IBM. Компания фактически не знала, как продавать OS/2. Исторически IBM прославилась (и весьма заслуженно) своей политикой при работе с корпоративными заказчиками (знаменитая «мертвая хватка» IBM за клиента), но массовая продажа программного обеспечения требовала совершенно иного подхода. OS/2 была однопользовательской системой с отсутствием сколько-нибудь удовлетворительных средств разграничения прав пользователей. Отсутствие такого механизма сослужило далеко не самую хорошую службу.

90

вателя был кардинально переработан и улучшен. В дополнение к LaunchPad появился новый элемент WarpCenter, еще более упрощавший работу. ! Встроенные средства для работы в Интернете также значительно изменены и улучшены. ! В Merlin появилась встроенная виртуальная Java-машина. С учетом того, что реализация виртуальной Java-машины от IBM была самой лучшей на рынке, OS/2 приобрела важную способность запускать Java-приложения, обеспечивая отличную производительность.


ретроспектива когда новая инкарнация OS/2 должна была вот-вот появиться на прилавках, IBM внезапно умолкла. На самом деле продукт был выпущен, и отдельные счастливчики даже смогли не только подержать его в руках, но и установить. Однако только клиенты, имевшие специальные контракты с IBM, могли купить OS/2 for PowerPC. Причин краха OS/2 for PowerPC было множество – одни лежали вне IBM, но другие были полностью внутренними: ! Не было никакой ясности, кому на самом деле была нужна OS/2 for PowerPC. ! Организация проекта была просто отвратительной – чего стоит только то, что менеджеры среднего звена зачастую не сообщали своим начальникам о действительном состоянии дел в проекте и т. д. ! Успех проекта напрямую зависел от успеха архитектуры PowerPC, который не состоялся. Итогом стала потеря миллионов долларов, вложенных в разработку (хотя некоторые технологии OS/2 for PowerPC впоследствии были внедрены в OS/2 Warp 4). Можно только предполагать, что бы произошло, если бы все усилия и деньги были направлены на поддержку Intel версии OS/2.

Заключение Жизненный путь OS/2 является одной из самых ярких демонстраций того, как любая хорошо задуманная и реализованная с технической стороны идея может быть загублена страстью к большим деньгам и плохим менеджментом. Проект, который очень часто находился на шаг, а то и два впереди своих конкурентов и аналогов по нововведениям и архитектурным решениям, поглотивший огромное количество денег и человеческого труда, был фактически задушен в ходе конкуретной борьбы за большую, чем просто огромная прибыль. В наше время история OS/2, видимо, подходит к концу на самом деле (хотя и раньше OS/2 «хоронили» несчетное число раз). IBM прекратила поддержку последних версий OS/2 в конце 2004 года, Serenity Systems, купившая права на OS/2, не обладает достаточной «пробивной» мощью для хотя бы

№10, октябрь 2005

сколько-нибудь заметных продвижений продукта. Но прекращение жизни OS/2 нисколько не умаляет всех тех последствий, которые возникли благодаря ей: ! Самое главное, наверное, то, что в процессе создания OS/2 был накоплен огромный опыт разработки современных многозадачных операционных систем, были опробованы различные методы решения самых разных задач. ! Именно OS/2 первой позволила широким массам программистов из мира PC испытать все преимущества программирования 32-разрядных приложений. OS/2 и среда для разработки приложений для нее послужили хорошим фундаментом здания школы по обучению такому программированию. ! Сражение IBM с Microsoft, завязавшееся вокруг OS/2, впоследствии явилось одним из камней в огород судебного разбирательства, приведшего к признанию софтверного гиганта монополистом. Самый же неожиданный и непредсказуемый эффект возник после появления на рынке абсолютно необычного игрока, значительно отличавшегося от всех ранее выходивших на сцену High-Tech театра актеров. Этим игроком оказалась UNIX-подобная операционная система Linux, разработку которой в 1991 году в одиночку начал финский студент Линус Торвальдс. Пока монополии тратили время и деньги в схватке за доминирование на рынке, один человек, на полную мощность используя философию открытых исходных кодов сумел сплотить вокруг разработки Linux множество профессионалов со всего мира. Итогом стало невероятное по своей скорости развитие любительского проекта и превращение его в мощнейший инструмент. Сперва IBM, что называется, «замочила ноги», внедрив под влиянием многих факторов поддержку на своих системах другого проекта с открытым исходным кодом – Apache (самого распространенного в Интернете веб-сервера). Решение помимо ощутимой прибыли показало преимущества открытого обмена идеями и опытом между программистами всего мира.

И пока IBM находилась в состоянии неопределенности относительно судьбы OS/2 и исключительно по инерции продолжала ее разработку, Linux сперва медленно, а потом со все возрастающими оборотами начал штурмовать рынок, причем делая это без какой-либо координации сразу в нескольких направлениях (сервера, встроенные системы, десктоп системы, среды распределенных вычислений, портативные устройства и т. д.), уверенно добиваясь успеха на каждом из них. В этой ситуации IBM, учитывая преподнесенные OS/2 уроки и положительный опыт работы с Apache, столкнулась с фактом, что совсем рядом есть нечто, для чего создавалась OS/2 (и даже больше). Linux не тащила за собой груза лицензионных и политических проблем – ее можно было просто взять и использовать. При этом совершенно спокойно адаптировать для любых требуемых целей. (Применение OS/2 в банкоматах выглядело просто бледным подобием той широты и размаха, которые предоставлялись гибкой ОС с эмблемой в виде довольного пингвина). И в IBM приняли решение сделать Linux одной из «стратегических ракетносителей» бизнеса IBM. Конечно, не последнюю роль сыграло то, что подобный шаг лишал Microsoft значительных средств в виде отчислений IBM в пользу Microsoft. Насолить бывшему другу, который оказался не совсем честным человеком, – вполне человеческая реакция, и было бы удивительно, если бы в IBM не испытывали искушения отыграться за былые проигрыши. Как бы то ни было, сослужив не последнюю службу в деле выбора Linux базой для решений IBM, применяемых в бизнесе, OS/2 тем самым невольно забила последний гвоздь в крышку собственного гроба – стало окончательно ясно, что конец жизни OS/2 близок. Новое решение предоставляло огромную гибкость, и в этой ситуации OS/2 оказалась «не удел» сохраняя за собой существующие узкие сферы применения и готовясь к окончательной сдаче позиций. P.S. Эта статья, хотя и выходит от моего имени, на самом деле является давно подаренным мне материалом от персонажа, известного на русскоязычных форумах как Soul Eraser.

91


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

Учебный курс Microsoft. Проектирование инфраструктуры Active Directory и сети на основе Windows Server 2003 (экзамен 70-297) Уолтер Гленн, Майкл Симпсон

Книга является переводом официального пособия для самостоятельной подготовки к экзамену 70-297. Каждая глава разбита на занятия, что позволит вам заранее спланировать процесс ознакомления. В начале повествования вы узнаете общие сведения об AD, DNS, TCP/IP и получите базовую информацию об удаленном доступе. Далее последовательно приво-

дится анализ существующей инфраструктуры (топология сети, существующие каталоги), планирование структуры AD (проектирование модели лесов и доменов, выработка стратегии именования). Проектирование административной структуры защиты (OU, стратегия управления учетными записями, групповые политики). Отдельного внимания заслуживают темы планирования структуры DNS и построение структуры WINS. Автор не обошел вниманием и вопросы проектирования инфраструктуры сети и маршрутизации, подключения к Интернету и выбор стратегии предоставления удаленного доступа. В конце каждой главы вы сможете проверить уровень своих знаний, ответив на конт-

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

!

Издательства:

«Питер» и «Русская редакция» ! Год издания: 2006 ! Количество страниц: 364 ! ISBN: 5-7502-0031-0 ! Цена: ≈ 420 руб. Книга предоставлена издательством «Питер».

Microsoft Windows Server 2003. Решения экспертов Рэнд Маримото, Эндрю Аббат, Эрик Ковач, Эд Робертс

Из общей массы книг, посвященных Windows 2003, это издание выделяется тем, что оно написано экспертами для экспертов. Тут вы не найдете объяснений для новичков, авторы с ходу предлагают сложные темы. Книга состоит из восьми частей, каждая из которых посвящена отдельной теме, читать их можно в произвольном порядке. Итак, основные темы книги: методы безопасности (состоит из 3 глав, в которых рассказано об организации

92

защиты ОС, об обычных и беспроводных сетях, о применении смарт-карт). Методы управления и администрирования (управление правами пользователей, групповые политики, консоль управления, централизованное администрирование ОС, задачи обслуживания). Из части, посвященной методам проектирования и развертывания системы, вы узнаете о втором поколении AD, использовании новых инструментов планирования, советы и рекомендации по развертыванию структуры ОС и AD. Также рассмотрены вопросы внедрения DNS, DHCP, WINS и контроллера домена. Методы миграции и интеграции представлены 4 главами, в которых рассказано о миграции на Windows Server 2003 с Windows NT 4.0/2000 и интеграцию с системами на основе UNIX/ LDAP и решениями от Novell. Достаточно подробно раскрыта такая актуаль-

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

! ! ! ! !

Издательство: Год издания: Количество страниц: ISBN:

«КУДИЦ-ОБРАЗ» 2005 784 5-9579-0083-4 ≈ 423 руб.

Цена: Книга предоставлена издательством «КУДИЦ-ОБРАЗ».


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

Lotus Notes и Domino 6. Сертификация для разработчиков приложений Тим Бэнкес, Дэвид Хэттер

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

ходимые для сдачи 610/611/612 экзаменов. Книга поделена на 3 части, каждая из которых соответствует одному из экзаменов. Все вопросы освящены достаточно подробно и с большим количеством иллюстраций. Экзамен 610 (Notes Domino 6 application development foundation) – управление базами данных, архитектура приложений, элементы дизайна, безопасность и программирование формул. Экзамен 611 (Notes Domino 6 application development intermediate) – рассказывается об уже упомянутых темах, но, делается акцент на тонкости, которые вам пригодятся при сдаче экзамена 611, а также о документообороте и программировании. В материале для подготовки к 612 экзамену (Notes Domino 6 application development web application) описываются вопросы архитектуры приложений, элементов дизайна, управления и обслуживания, програм-

мирования и безопасности. В завершение каждой главы предлагается ответить на ряд вопросов по прочитанному материалу. В конце книги вы найдете примеры всех вышеописанных экзаменов с правильными ответами. Информацию о том, как использовать системы тестирования PrepLogic Practice Tests и Preview Edition, вы найдете в приложении. Книга написана известными специалистами по Lotus Notes и Domino 6. Практические советы и житейский опыт, описанный авторами, поможет подготовиться наилучшим образом.

! ! ! ! !

Издательство: «КУДИЦ-ОБРАЗ» Год издания: 2006 Количество страниц: 692 ISBN: 5-9579-0106-7 Цена: ≈ 576 руб. Книга предоставлена издательством «КУДИЦ-ОБРАЗ».

Практическое руководство по Red Hat Linux: Fedora Core и Red Hat Enterprise Linux (2-ое издание) Марк Собелл

Рассматриваемая книга – пожалуй, самое подробное на сегодняшний день русскоязычное руководство для пользователей и администраторов, посвященное корпоративному дистрибутиву Linux. Книга достаточно полно освещает особенности как RHEL3 на ядре 2.4, так и Fedora Core, где уже используется ядро 2.6. На более чем тысяче страниц подробно рассмотрена настройка опе-

№10, октябрь 2005

рационной системы в качестве клиентского рабочего места и в качестве сервера. По отдельной главе уделено таким сетевым службам, как OpenSSH, vsftpd, sendmail, NIS, NFS, Samba, BIND, Apache. Рассмотрены средства безопасности, в частности, брандмауэр iptables и SELinux, появившийся в ядре ветки 2.6. Данную книгу можно порекомендовать в качестве основы для подготовки к экзаменам RHCE/RHCT, отмечу, что практически всю информацию, почерпнутую из книги, с успехом можно использовать для успешного администрирования как RHEL, так и для других дистрибутивов, построенных на его основе, например, Scientific Linux, обзор которого вы можете прочесть в

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

! ! ! ! !

Издательство: Год издания: Количество страниц: ISBN: Цена:

«Вильямс» 2005 1072 5-8459-0841-8 ≈ 784 руб.

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

93


подписка на 2006 год Российская Федерация

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

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

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

! Подписной индекс: годовой – 20780, полугодовой – 81655

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

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

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

!

! !

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

!

издания через агентство по распространению печати «Davriy nashrlar» (7000029, г. Ташкент, пл. Мустакиллик, 5/3, офис 33) Армения – по списку номенклатуры «АРЗИ» через ГЗАО «Армпечать» (375005, г. Ереван, пл. Сасунци Давида, д. 2) и ЗАО «Контакт-Мамул» (375002, г. Ереван, ул. Сарьяна, 22) Грузия – по списку номенклатуры «АРЗИ» через АО «Сакпресса» ( 380019, г. Тбилиси, ул. Хошараульская, 29) и АО «Мацне» (380060, г. Тбилиси, пр-т Гамсахурдия, 42) Молдавия – по каталогу через ГП «Пошта Молдавей» (МД-2012, г. Кишинев, бул. Штефан чел Маре, 134) по списку через ГУП «Почта Приднестровья» (МD-3300, г. Тирасполь, ул. Ленина, 17) по прайслисту через ООО Агентство «Editil Periodice» (2012, г. Кишинев, бул. Штефан чел Маре, 134) Подписка для Украины: Киевский главпочтамп Подписное агентство «KSS» Телефон/факс (044)464-0220

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

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

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

94

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


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

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

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

! Укажите наименование и банковские реквизиты своей

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

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

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

№4 (2

№3(28) март 2005

подп 9) ww исно апре w.s й л am инде ь

2

00 ag.r кс По u 8165 5 5 Alt чтов хорошо, -N ая один монитор MD си Linux Xinerama: Ба aem сте а много лучше ма зова on ма рш я н кая редакция р русс а – у pix Win Knop т ст ов dow изато ройк удаленных файл ра а Ap Восстановление ach s Ser Cis ver co под Linux eк Ви ows Up ак рту не Microsoft Wind dat про ал FreeBSD в доме Ар eS ь кси н ая erv с п хиви on: -се ice ма Практикум Pythов по электронной почте ом руе рве ши s ощ м За р отправка файл на ью да щ – SV Win ита Ba нны ых в Linux IST cula е dow ко ключи Шифрование данн A на аппаратные №5 Си s M мму новый взгляд с и (30 н и т по o д ц bile ика )м оку ема д ww писн я процесса цеп ц заци w.s ой ай 2 м н с мати и о е Авто й к Оп нта озд По amag индек 005 5 баз 1С ие ции ани подключения 200 под тими Ищ чем .ru с 8165 бщ аль 5 5 PO я –о ем у M Lin зац щи QEMU евр 8165 помо я при ф D и и яция кс u ) пр S S ц Эмул Ст x яц (27 инде ич QL ро гра вка и е №2 исной .ru о W shell к т на ин м р и н ание лов PA м ag ин ия подп .sam рве Программиров х условиях ста -En защ ы едл w ная -се я у емы чен На ww ен ter ищ в экстремальны тем стр но кси ска систбеспе pris ен о е р ч Сис о ра й п аи Ка e, ную й ати но о бо C ва 80 ом ион ног тае уд к во ем TIN ьны 2. бес ал сс Авт ерац рамм т? UP ьс сал ен та S п 1x EA пров оп прог сет Чт вер ны но ов од P-T од ую уни е ф вит и н D – ь а Lin LS ную л жн Ус BS ай ь KS ux туа тан лы оз ree се р в F и SOC в с ть: на ко ав по иза fiixx рп ли ть им кур д t л tf о ы е s й р ор ва Эф BS р об o ы №7(32 Ст тод ати ем D ие еP IPпо фек одн ме подп ) ИЮЛЬ вн Sy тел баз ис дан ля ти : вв ые ww w. ной ин 2005 ой ma ми вн на де 2005н Соз sama еф инг Ко се nte g.ru кс 8165 ер (31) ИЮиНЬ ель 81655 x по о у он 5 индекс ти c оум ной u ль пр с п нтро ерв №6 н тg.ru и пис -р с in л подо и A Н L зо ав IP й астр ntiv ом ли п ama ва ля вы аива Доwww.s и под ностируем сти ощ ру iru Ин тел ем что ем K м. ью ем s9 Openциfix: диаг D: правно По ей erbe соз терв спа .0 OS без Xchan изаst анreяеeBмSнеис ros пода ью вA мPo ем SIM оп F ge – D ветрх пти и устр Есть ас елLDс Л Реж на ySQLLinux: своб но ао ем A P ар ик + ris без ли жиз Mk и оду ния сть фAs ник фо р я а te ан х ле гр нь и rl з р е тиви уппа т e ык Уо Т IP-те се руса м! ти ем t + Pмиссия а P лл а З а им ап т ? c зв уя ? erl ом на Frускаем Счи_ipac ько не ая сеть – eeBS spam Насколбеспроводн ng роли d D вые па Про ваша норазоа на сервер HTTPверяем № од зуем од -тра по 8(3 Испольаленного вх фик ww дпи 3) а rinting? rp сн вгу ge Н w на ас для уд лету траи ся от fin С .samaой ин ст 2 ваем па? щитить к мож g.ru декс 0805 Уста дескто WSU Как за 16 с L онку ет S честве 55 Postf навлив 10 в ка inu ри ли ix + аем св Solaris м! О р Ex x яз о chan -д ва PCУдал С цен rver ис т BS Пробуе ge ку SQL Se и п чита ите т ь D BIOS енно уп ем MS Setup равл ро ем Wr рибу Ускоря OS яем Н к т S BI ти Автом ва ва астр си-с раф py! цируем ми баз атизир ш аи ер ик ые Модифи 1С но ли в уе ? ве п ительн П 9.2 вой м под ро оч дополн с п рово чны аем верс клю в то nal Ищем ики дохода я ом ди ии 8. чени й с DS вы ни sio е Уп источн 0 ощ м па PAM fes х тле o а р а е r 5 A м- – ч ью уд и ste ощ 00 EP пе ен фи и S в ь 2 655 ч а S р u т r е е е а 81 is м O NA си ль нв аS вы есп тр R с ) я декс в е penM k-се уп ер об тив (26 ин ди o рв рав E тем :п ое №1 писной ag.ru ибу ы C ер ле ps ны six д мн стр по w.sam oo ом ни ко D, н йс –п ам ди ww ер п е е el огр уп ре рв зор пр Ад иров под ер вр Exc Об -се т в и в к а м ю l а л 16 и с ом ти а er ок bit нск нию аст м ищ Пр зP ны пью се ащ ed ие еи те ть й itio ск кз ви р! Ка ест n аз то! ки ос теш rl ие пр Пу Pe ен о в л т э ав ти пр ой T– Ни у O P ое ем t TS мн ист crip й HO ам й с BS S па ени 6 огр во ю V NTF сту рж ll Пр айло ощь до вто ewa ие ен ф пом его от Fir овл с бщ иты oute н о а т ия защ WinR сс ац Во из ет и rio ган рн Ke Ор Инт е нове в ос на 81655 подписной индекс www.samag.ru

Стоимость подписки через редакцию: 900* руб. за 6 номеров 1800* руб. за 12 номеров При оформлении подписки до 1 января 2006 года – скидка 10% * Включая НДС и почтовую доставку

№10, октябрь 2005

95


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

96

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

Расширяем права с помощью ACL в Linux Одноуровневой модели прав доступа пользователей, которая применяется в Linux и во всех UNIX-подобных операционных системах, на сегодняшний день явно недостаточно. Администратор должен очень постараться, чтобы правильно распределить права доступа к объекту. Списки контроля доступа позволяют более гибко решить эту задачу.

Редактор для создания скриптов: Primal Script 4.0 Сегодня существует множество редакторов, позволяющих создавать

скрипты. Как правило, они поддерживают один-два языка программирования. Редактор PrimalScript 4.0 имеет встроенную поддержку более чем 30 языков программирования, начиная от HTML, XML и VBScript, и заканчивая узкоспециализированными, такими как KIXTart. О том, как пользоваться этим редактором, читайте в официальной документации. Мы же поговорим о недокументированных возможностях.

FreeBSD tips: возможности ftpd Протокол FTP предназначен для передачи по сети файлов. Существует множество очень функциональных серверов ftp, однако для использования в «личных» целях, как правило, вполне достаточно возможностей входящей в состав FreeBSD программы ftpd.

Автоматическая установка драйверов в MS Windows В статье рассмотрены вопросы загрузки драйверов периферийных устройств и иного оборудования в процессе автоматической установки и настройки MS Windows XP. Статья будет полезна системным администраторам, обслуживающим информационные системы в режиме аутсорсинга. Среда разработки: сервер GNU Linux , рабочие станции MS Windows XP.

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

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


Turn static files into dynamic content formats.

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