037 Системный Администратор 12 2005

Page 1

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

КА

БЫ С

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

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

ЛИ

СЬ

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

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

№12(37) декабрь 2005 подписной индекс 20780 www.samag.ru

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

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

Как эффективно провести инвентаризацию установленного софта Мультизагрузка: стелим соломку

ЗА

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

УЕ ХА Л

ВО

ТП

УС К

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

Архитектура современных почтовых систем

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

Почему MS SQL медленно работает? Ищем причины

Спам или антиспам: кто кого?

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

Защищаем электронную почту средствами MailScanner

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

Настраиваем Cisco PIX Firewall 520

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

№12(37) декабрь 2005

Размещаем несколько сайтов на одном веб-сервере PHP: делаем отладку на стороне клиента TCP поверх TCP – не такая уж плохая идея!



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

52 Настраиваем Cisco PIX Firewall 520 для трансляции соединений между сетями

2 Взгляд на будущее от Microsoft

Обзор самых интересных моментов прошедшей в Москве седьмой ежегодной конференции Microsoft – «Платформа 2006. Определяя будущее». Максим Востренков Кирилл Сухов geol@altertech.ru

АДМИНИСТРИРОВАНИЕ 6 Как эффективно провести инвентаризацию установленного софта

Используем WSH-сценарии и групповые политики Active Directory для сбора информации о приложениях, установленных на клиентских машинах. Андрей Бирюков mex_inet@rambler.ru

Пример типовой схемы, часто используемой в небольших сетях. Малик Абдугалыев malik@elcat.kg

WEB 58 Печатаем документы с веб-сервера

Реализация решения с помощью Open Office. Дмитрий Острецов dimon@ost.pp.ru

63 Многоликий Apache. Размещаем несколько сайтов на одном веб-сервере

Установив Apache и предоставив через него на всеобщее обозрение свой сайт, многие и не подозревают, каким мощным инструментом они владеют. Павел Малахов 24pm@mail.ru

12 Контролируем события с помощью EventSentry

66 AJAX: заработавший Javascript

14 Мультизагрузка: стелим соломку

70 PHP: делаем отладку на стороне клиента, или Операции под наркозом

Возможности утилиты EventSentry, позволяющей проводить мониторинг событий и вовремя реагировать на возникающие проблемы. Сергей Яремчук grinder@ua.fm

Как избежать проблем с загрузкой и загрузочными секторами? Сергей Супрунов amsand@rambler.ru

22 Круговорот почты в сети, Или Архитектура современных почтовых систем

Общая картина работы сервисов электронной почты. Евгений Прокопьев eugene_prokopiev@mail.ru

30 Спам или антиспам: кто кого?

Развитие спамерских технологий, общее состояние спама на 2005 год и прогнозы на будущее. Алексей Коршунов akeeper@akeeper.ru

36 IСQ: разрешить нельзя запретить

Если вы сомневаетесь, где правильнее в заголовке поставить запятую, то эта статья для вас. Павел Закляков amdk7@mail.ru

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

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

№12, декабрь 2005

СЕТИ 76 TCP поверх TCP

Не такая уж плохая идея! Алексей Барабанов alekseybb@mail.ru

83 BUGTRAQ РЕТРОСПЕКТИВА 84 Сломленная, но не сдавшаяся: история операционной системы BeOS

Взрыв сверхновой звезды – так можно было охарактеризовать появление на рынке в 1996 году компьютера BeBox и операционной системы BeOs. Дмитрий Мороз akuji@list.ru

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

Какие возможности предлагает мощная и надежная система MailScanner. Сергей Яремчук grinder@ua.fm

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

Исправляем ошибки на работающей системе. Серафим Пикалов pikalov_s_s@mail.ru

89 СОДЕРЖАНИЕ ЖУРНАЛА ЗА 2005 ГОД

45 Защищаем электронную почту средствами MailScanner

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

Большие амбиции технологии Ajax. Вячеслав Родионов bepcyc@gmail.com

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

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

92 Обзор книжных новинок Александр Байрак x01mer@pisem.net

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

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

И у меня такая же беда

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

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

1


тенденции

Взгляд на будущее от Microsoft

Кирилл Сухов, Максим Востренков 7 и 8 декабря в Москве, в здании президиума Академии наук, прошла седьмая ежегодная конференция Microsoft – «Платформа 2006. Определяя будущее». Двухдневная программа мероприятия состояла из технических докладов, практических занятий, «круглых столов» и лабораторных классов, посвящённых продуктам Microsoft.

В

рамках конференции были пред- представленным на конференции, был tempdb и переходят непосредственно в нужную таблицу в тот момент, когда ставлены новые продукты фир- MSSQL Server. К сожалению, два дня в одно заканчивается обработка всех запромы – Microsoft SQL Server 2005, Microsoft Visual Studio 2005 и Microsoft и то же время проходило сразу 5 сов к этой таблице, которые начали лекций в разных залах, поэтому по- выполняться до операции изменения. BizTalk Server 2006. Очень сложно сразу по оконча- пасть на все было просто невозмож- Причем учитываются в данном случае нии события внятно и полно изложить но. Одного из нас, Максима Вострен- только те строки, которые подверглись свои впечатления. Огромное количес- кова, больше всего интересовал имен- изменению. Например, начал выполняться затво информации, полученной на кон- но этот продукт, и то, что изложено ниференции, предстоит ещё перерабо- же, – его отчет о прослушанных докла- прос 1 (SELECT), затем запрос 2 изтать и осмыслить. Невозможно было дах и участии в практических заняти- менил какие-то строки в таблице всюду успеть – интереснейшие докла- ях по данной теме. (UPDATE), затем запрос 3 начал форОсновное впечатление заключает- мировать отчет – в этом случае зады проходили одновременно в разных залах РАН, и приходилось буквально ся в том, что все нововведения в SQL прос 1 будет работать со своим наборазрываться. Server 2005 призваны обеспечить ком- ром данных (до UPDATE), а запрос 3 Открытие конференции поразило фортную совместную работу с дан- со своим (после UPDATE) и соответсне столько лазерным шоу, на которое, ным продуктом при большом коли- твенно после завершения запроса 1 впрочем, стоило посмотреть (на сце- честве подключений и значительных данные из временной базы перейдут не гремела гроза и лился настоящий объемах базы. Перечислим основные в основную таблицу. дождь), сколько эффектной демонс- моменты. трацией совместной работы вышепеПоддержка многопроцессорности речисленных продуктов, показанной Версионность сотрудниками Microsoft. Ранее любая операция чтения по умол- Не секрет, что MSSQL Server подПоставленная для демонстрации чанию блокировала всю таблицу, а при держивает несколько процессоров. задача (расчёт эффективности но- исполнении инструкции JOIN – все таб- Но теперь появилась новая деталь – вой бизнес-стратегии продаж аль- лицы, упоминающиеся в запросе. В ре- процессоры можно разбивать на групбомов рок-группы Windows и её ре- зультате даже на современном мощ- пы в произвольном порядке с условиализация) была за несколько десят- ном сервере некоторые отчеты мог- ем, что 1 процессор может входить ков минут решена. Это стало возмож- ли приостановить работу всех поль- только в 1 группу. Группу, используеным благодаря новым продуктам кор- зователей на 10-15 минут. Выход, ко- мую при выполнении запроса, можно порации, применяемым в них эффек- нечно, был – разрешить «грязное чте- указывать в самом запросе. Чрезвытивных средств анализа и разработки ние», но это, разумеется, не самый чайно удобно для построения «тяжеи, самое главное, глубокой интегра- правильный вариант. Теперь же табли- лых» отчетов. ции MSSQL Server, MSVS и MS BizTalk ца остается свободной, и если во вреServer между собой и другими компо- мя обработки такого запроса в табли- Service Broker нентами платформы. це производятся изменения, они со- Service Broker – новая технология Безусловно, ключевым продуктом, храняются во временной базе данных для разработки распределенных при-

2


тенденции ложений. По сути это служба очереди сообщений. Что она дает? Приведу пример, показанный на лекции, немного его расширив. Предположим, наша фирма – туроператор и занимается продажей туров. При продаже тура нам надо зарезервировать билет и забронировать место в гостинице. Теперь на наш сервер поступает сообщение от клиентского приложения о необходимости оформить тур в Иваново. Сервер отсылает сообщение в авиакомпанию о резервировании билета и в ивановскую гостиницу о бронировании номера. От авиакомпании приходит подтверждение брони, а от гостиницы – ответ о том, что мест нет. В этом случае у нас есть 2 варианта – отменить бронь на билет или попытаться забронировать номер в другой гостинице. Вся прелесть данной технологии заключается в том, что мы можем все это реализовать на стороне сервера, то есть абсолютно не вдаваясь в подробности работы клиентского приложения и не вмешиваясь в нее. Второй плюс данной технологии – распределение нагрузки. Допустим, у нас есть группа серверов, выполняющих одни и те же задачи. В этом случае сообщение, попавшее в очередь, отправляется на случайно выбранный сервер из группы, что дает примерно равномерное распределение нагрузки между серверами. Третье – гарантии. Служба Service Broker гарантирует 100% доставку сообщений. Даже если по каким-то причинам сообщение доставить не удалось, будут предприниматься попытки отправить его снова до тех пор, пока результат не будет достигнут. Вдобавок к этому большие сообщения служба сама разбивает на более мелкие и передает порциями, что в условиях российских каналов связи играет немалую роль. Четвертое – стоимость. Допустим, у вас есть основной офис, в котором стоят серверы, а также несколько филиалов, территориально удаленных друг от друга. У вас есть некоторое приложение, которое работает с вашим сервером, к примеру, просто регистрирует покупки и списывает товар со склада. Также имеются некие «часы пик», когда из-за большого количества покупок операторы вынуждены простаивать, ожидая выполнения со-

№12, декабрь 2005

седских запросов. Что нам даст переход на использование Service Broker? Microsoft SQL Server 2005 выпускается в нескольких лицензиях, одна из которых, Express, – бесплатная. В случае ее использования нам достаточно поставить в филиалах этот самый MS SQL Server 2005 Express и развернуть на нем Service Broker, который будет заниматься приемом сообщений от клиентского приложения и переправкой их на основной сервер. Никаких простоев, поскольку все работают с локальным сервером. И главное – никаких затрат.

Data Mirroring

ботать со старыми версиями клиента. Плюс – цена компьютера для сервераагента гораздо ниже цены внешнего дискового накопителя для организации кластера.

Business Intelligence Business Intelligence – это целая платформа для работы с разнородными данными. Она базируется на трех китах от Microsoft – Integration Services, Analysis Services и Reporting Services.  Integration Services – службы и н те г р а ц и и. Ес л и р а з о б р ат ь ся, это новая версия DTS (Data Transformation Services). Но, по уверениям Microsoft, весь код был переписан с чистого листа. Что действительно нового? Да по сути – все. Теперь при написании сценария импорта или экспорта данных можно воспользоваться всей мощностью платформы .NET, что дает поистине безграничные возможности.  Analysis Services – службы аналитики. Данная компонента является продолжением развития служб OLAP (On-Line Analytical Processing) SQL Server 2000. Рассказать про ее отличия от OLAP в SQL 2000 на сегодняшний момент нам не представляется возможным по банальной причине отсутствия опыта работы с ней. Надеемся, что скоро этот опыт появится. Стоит упомянуть, что выступавшие разработчики были ей очень горды. Особенно приятно то, что руководителями разработки данного направления в Редмонде являются бывшие наши соотечественники – выходцы из СНГ.  Reporting Services – службы отчетности. Никакой информации об этих службах на конференции нам не дали, поэтому рискнем предположить, что это прямое развитие SQL 2000 Reporting Services, которое являлось отдельным продуктом, а теперь он просто интегрирован его в сервер.

Data Mirroring – новая технология отказоустойчивости, которая сродни старому доброму режиму репликации Log Shipping. Однако есть некоторые различия. Использовать ее можно в двух вариантах – поддержка копии базы в реальном времени или некоторая замена кластера. Рассмотрим оба. В первом случае нам достаточно иметь 2 сервера. При изменении данных на одном из серверов клиентским приложением такая же команда отправляется на выполнение второму серверу. Чем это хорошо? Да хотя бы тем, что в качестве второго сервера можно использовать гораздо более слабую машину, потихоньку команды обработаются и никуда не денутся. Зато у нас всегда будет актуальная копия данных. Теперь второй вариант. В отличие от первого здесь нам понадобится еще и сервер-агент. Выполнение команд происходит следующим образом: команда поступает на серверагент, он пересылает ее на первый сервер, первый сервер дублирует ее на второй сервер, параллельно выполняя ее сам, второй сервер выполняет команду и отправляет первому серверу подтверждение, первый сервер заканчивает выполнение команды и рапортует серверу-агенту об удачном выполнении. Что мы от этого выигрываем? Сервером-агентом может слу- Доклады жить любой самый дешевый совре- Представление Visual Studio 2005 наменный компьютер, но тем не менее чалось докладом Дмитрия Никонова это тоже расходы. Зато в случае выхо- и Анатолия Смолянинова о новом инсда из строя одного из серверов агент трументе разработки – Visual Studio автоматически перенаправит запро- Team System. Были рассмотрены и просы на второй. Минус – он не будет ра- демонстрированы на примерах раз-

3


тенденции личные этапы процесса разработки и проектирования, от спецификаций и управления исходным кодом до отчётности по рабочим заданиям, с акцентом на специализацию и распределенность процесса разработки. Продолжением стал доклад «Проектирование и разработка корпоративных приложений», где речь шла уже о Visual Studio Team Edition for Software Architects. Это первый из узлов, составляющих будущее решение под названием Dynamic System Initiative. Это проект Microsoft в области создания и поддержки корпоративных информационных систем. Были рассмотрены возможности оптимизации процесса разработки и внедрения веб-сервисов и распределённых сервисных архитектур (SOA) путём верификации процессов проектирования, проверки установкой в среде разработки на ранних стадиях жизненного цикла продукта, с использованием языка описания систем (SDM). Второй день конференции начался с доклада «Разработка веб-приложений на базе ASP.NET 2.0 и Atlas», в котором Александр Ложечкин и Дмитрий Мартынов представили новую версию платформы для веб-разработки – ASP.NET 2.0 и новый инструментарий Microsoft для создания динамических веб-приложений с развитым пользовательским интерфейсом – Atlas. Вообще, ASP.NET 2.0 и её поддержка в MSVS 2005 – это отдельная большая тема, и осветить её в рамках данного обзора возможным не представляется. Нововведения, которые сразу обратили на себя внимание:  Отпала необходимость использовать Internet Information Server, для отладки приложений во время разработки. Теперь в состав Visual Studio входит локальный вебсервер Visual Web Developer Web Server.  Значительно расширен и систематизирован набор компонентов готовых блоков и прикладных интерфейсов.  Реализован механизм использования шаблонов.  Значительно облегчена работа с ролями пользователей за счёт введения нового программного интерфейса – диспетчера ролей.

4

 Осуществлено автоматическое об- для платформы Microsoft Office System, новление кэша сервера баз данных, используемых в веб-приложении. С новыми технологиями .Framework 2.0, WinForms 2.0, Windows Presentation Foundation и Application Blocks на примере реальных приложений можно было ознакомиться, слушая доклад Ивана Бодягина и Андрея Корявченко «Технология создания клиентских приложений». Опоздавшие на доклад с банальным названием «Эффективная разработка приложений на базе Microsoft Visual Studio 2005» не могли не только найти свободное кресло, но даже просто протиснуться в зал. Это и не удивительно – Александром Ложечкиным и Артуром Смоляниновым была продемонстрирована работа с кодом (на примере языка C#). Внимание было сосредоточено в основном на статическом анализе и рефакторинге кода, а также на полезных приёмах разработки приложений. Большой интерес вызвал доклад «Проект Linq (C# 3.0, VB 10.0)», в котором Дмитрий Никонов рассказал о будущем расширении Visual Studio – LINQ (Language Integrated Query). Сегодня разработчики используют один язык программирования для написания исходного кода программы и совершенно другой язык, например SQL, для доступа к данным из СУБД. LINQ позволяет писать запросы к данным любого формата и обращаться к объектам .NET, данным из XML и базам данных одинаковым способом. Во время доклада были продемонстрированы эффектные приёмы работы, связанные с уже реализованными возможностями расширения. Cергею Одинцу и Александру Калугину выпала честь представить компетентной публике продукт, находящийся в стадии раннего бета-тестирования, а именно Microsoft Office 12. Со своей задачей они справились блестяще, причём наибольшее впечатление произвёл доклад «Первый взгляд на Microsoft Office 12», на котором докладчики работали с будущим продуктом, демонстрируя уже реализованные пользовательские возможности. Несколько ранее они же представляли Microsoft Office 12 Server – серверное решение

включающее SharePoint v3, Excel Server и Forms Server. Пожалуй, одним из самых полезных и интересных для системных администраторов материалов был доклад «Мониторинг программно-аппаратных ресурсов гетерогенных систем». В нём рассматривалось использование технологии Microsoft Operation Manager (MOM) для осуществления проективного мониторинга серверных систем (не только на базе Microsoft). Технология MOM, уже реализованная в таких продуктах, как MOM 2005 и MOM 2005 Workgroup Edition, также является частью ранее упоминавшегося проекта Dynamic System Initiative (DSI). В процессе доклада было продемонстрировано решение от компании Quest Software по управлению и мониторингу сети, включающей в себя Linux, UNIX и Macintosh, рабочие станции посредством Active Directory, с демонстрацией выявления и диагностики проблем в гетерогеной среде. На следующий день этот доклад был закреплён лабораторной работой «Microsoft Operations Manager 2005: мониторинг и анализ производительности серверов», которая, впрочем, была очень ограничена по времени и позволила лишь чуть-чуть «пощупать» новую технологию.

Итоги За рамками данного обзора осталось немало интересного – представление BizTalk Server 2006, технологии Windows Workflow Foundation, Microsoft CRM 3.0, доклады партнёров Microsoft и многое другое. На всё просто не хватило времени, за два дня ознакомиться со всей предложенной информацией было просто невозможно. Стоит отметить – каждому участнику полагался подарок в виде некоммерческих, но полнофункциональных версий Microsoft SQL Server 2005 и Microsoft Visual Studio 2005. Для читателей «Системного администратора» это значит, что в ближайших номерах журнала появятся предварительные обзоры возможностей этих продуктов, а также (благодаря непринуждённым разговорам в фойе конференц-зала) некоторые другие небезынтересные материалы.


тенденции Sun добавила поддержку PostgreSQL в Solaris 10 Компания Sun Microsystems начинает официальную поддержку PostgreSQL и распространение этой открытой СУБД в комплекте ПО, поставляемого с ОС Solaris 10. Также представители Sun рассказали о намерении интегрировать в проект OpenSolaris возможность запуска исполняемых файлов для Linux в контейнерах Solaris 10 (без потребности изменять эти файлы). Помимо этого в Sun сообщили об успехах в кооперации с Open Source-проектом Xen, благодаря чему теперь доступно управление ОС Solaris в виртуальной серверной среде. Чуть раньше стало известно о появлении уже давно обещанной 128-битной файловой системы ZFS в составе OpenSolaris.

Популярность Debian растет быстрее других По данным Netcraft по состоянию на декабрь, популярность дистрибутива Debian GNU/Linux в среде веб-серверов росла быстрее всех остальных Linux-систем. Общее число вебсайтов, работающих под управлением Debian (из опрошенных исследователями), превысило 1,2 миллиона, что в процентном соотношении чуть больше 25%. Среди крупных европейских пользователей Debian в качестве основной платформы для хостинга Netcraft выделяет Komplex, Lycos Europe, Proxad и Deutsche Telecom. Первое место сохраняет за собой Red Hat – около 34%, а тройку замыкает бесплатная версия Linux той же компании, но поддерживаемая сообществом – Fedora Core с 16%.

«Web Application Stack» – самая простая редакция, включающая в себя базовые компоненты веб-сервера (Apache, MySQL, PHP и по просьбе покупателя PostgreSQL). В «Java Web Application Stack» (помимо LAMP) добавлена поддержка Apache Tomcat, а также дополнительных Java-библиотек и утилит (Struts, Axis, Hibernate, Ant, Jython и т. п.), XML-библиотек. В самый «продвинутый» набор («Enterprise Java Stack») также входит поддержка полноценного сервера Java-приложений, основанного на разработках проекта ObjectWeb JOnAS, сертифицированного по J2EE.

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

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

Open Source приходит в Олимпийские игры? Технологический партнер Международного олимпийского комитета Atos Origin при поддержке IBM и HP рекомендует использовать программное обеспечение с открытым кодом на пекинских Олимпийских играх 2008 года. Ожидается, что решение о том, будет ли проведено внедрение технологий Open Source в ИТ-инфраструктуру, сопутствующую ОИ-2008, МОК примет после получения официального предложения от поставщиков. Но еще не исключено, что данная инициатива будет отвергнута хотя бы потому, что лагерь Open Source в Китае на данный момент не представлен таким множеством значимых компаний, какое можно наблюдать в США или Европе. ИТ-инфраструктуру ОИ представляет персонал из 1200 человек с 450 серверами на базе железа от Intel и UNIX-машинами, 4700 персональными компьютерами и 700 принтерами.

Red Hat представила Open Source Stacks Американская Linux-компания Red Hat анонсировала готовые наборы из стандартных программных продуктов с открытым кодом, получившие название Open Source Stacks. Три новых пакета-предложения основаны на платформе Red Hat Enterprise Linux и призваны покрыть нужды предприятий различного уровня.

№12, декабрь 2005

5


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

Как эффективно провести инвентаризацию установленного софта

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

К

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

6

ния проектами и так далее. Или же еще более сложная ситуация: ваша компания объединилась с другой, а у той организации корпоративным стандартом антивируса является, к примеру, Symantec, а в вашей – Trend Micro, и вам необходимо узнать, сколько лицензий того и другого программного продукта необходимо продлить в следующем году. Конечно, идеальным решением во всех описанных выше ситуациях было бы четкое документирование сисадмином каждого запро-

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


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

Теоретическая часть Как известно, информация об установленных в ОС Windows приложениях хранится в реестре. Точнее, в разделе HKEY_LOCAL_MACHINE\Software. Если зайти в эту ветвь реестра, то можно увидеть подразделы, которые содержат информацию об установленных приложениях, в частности, название каждого подраздела соответствует установленному приложению. Конечно, можно собирать информацию о приложениях отсюда, однако это не самый лучший вариант, так как в этой ветке реестра также содержится много служебной информации, которая может существенно осложнить сбор данных и в конечном итоге замедлить работу системы. Гораздо удобнее воспользоваться веткой HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall. Как парадоксально это ни выглядит, но каждое приложение после установки прописывает свои данные в эту ветку реестра. Причем все данные содержат несколько обязательных полей, например поле DisplayName, с помощью которого мы и будем идентифицировать приложения, установленные в системе. На рабочей машине это может выглядеть, например, вот так (см. рис. 1). Таким образом, для того чтобы собрать информацию об установленных в системе пользовательских приложениях, необходимо обойти значения ветки реестра Uninstall и получить содержимое параметра DisplayName. Этот параметр является обязательным для записей об установленных приложениях данной ветки и содержит значение строкового типа, которое удобно сохранять в текстовом файле. Если параметр ветки Uninstall не содержит поля DisplayName, то значит это не установленное приложение, а какая-то служебная информация, и заносить эти данные в отчет не требуется. Таким вот довольно простым способом можно собрать необходимую нам информацию. Итак, рассмотрев теоретические аспекты написания данного сценария, перейдем к практической части. Исходный текст сценария, который был взят за основу, можно найти по адресу http://www.computerperformance.co.uk/ezine/ezine63.htm.

Рисунок 1. Содержимое ветки реестра Uninstall

Set objNetwork = CreateObject("WScript.Network") Set CheckDrive = objNetwork.EnumNetworkDrives() objNetwork.MapNetworkDrive "X:", "\\10.0.1.5\share"

А отключить сетевой диск можно с помощью команды: Листинг 2. Отключение сетевого диска WScript.Sleep 3000 objNetwork.RemoveNetworkDrive CheckDrive.Item(0), true

Обратите внимание на то, что операционная система не всегда может подключить сетевой диск и практически сразу его отключить, иногда на это требуется определенное время. Для решения данной проблемы используется команда WScript.Sleep, которая останавливает работу сценария на N/1000 секунд. В данном случае указаны три секунды. Конечно, если в вашей сети уже используются сетевые диски или после подключения сетевого ресурса вам не нужно отключать его (так как он может использоваться еще для каких либо целей), то вы можете не использовать данные команды и сразу перейти к написанию сценария, описанного ниже. Ключевым моментом нашего сценария является цикл, обходящий ветку реестра Uninstall:

Практическая часть

Листинг 3. Обходим ветку реестра и сохраняем данные в файл

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

unKeyPath = "Software\Microsoft\Windows\CurrentVersion\Uninstall" unValueName = ("DisplayName") objReg.EnumKey HKLM, unKeyPath, arrSubKeys i=0 For Each Subkey in arrSubKeys objDictionary2.Add i, unKeyPath & "\"& subkey & (Enter) i=i+1 Next ……………………… For Each objItem in objDictionary2 strKeyPath = objDictionary2.Item(objItem) objReg.GetStringValue HKLM ,strKeyPath, unValueName, strValue 'сохраняем нужное значение в файл objTextFile2.WriteLine (strValue) If Err Then objDictionary2.Remove(objItem) End If Next

Листинг 1. Подключение сетевого диска On Error Resume Next

№12, декабрь 2005

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

7


администрирование Для получения информации об имени пользователя и названии машины воспользуемся следующими двумя значениями параметров реестра: Листинг 4. Ветки, содержащие информацию об имени пользователя и имени компьютера pcName = "SYSTEM\CurrentControlSet\Control\ ↵ ComputerName\ActiveComputerName\" pcNameValueName = "ComputerName" userPath = "Software\Microsoft\Windows NT\ ↵ CurrentVersion\Winlogon\" userValueName = "DefaultUserName"

В результате работы описанных выше процедур мы получаем текстовый файл, в заголовке которого будут имя пользователя, название, дата и время создания. Приведем полный текст сценария для сбора информации об установленных на компьютере приложениях: Листинг 5. Полный текст сценария ' Объявляем константу HKEY_LOCAL_MACHINE Const HKLM = &H80000002 Const REG_SZ = 1 ' Const ForReading = 1 Const ForWriting = 2 On Error Resume Next Set objFSO = CreateObject("Scripting.FileSystemObject") Set objDictionary2 = CreateObject("Scripting.Dictionary") Dim objNetwork, objShell, CheckDrive Dim strDriveLetter, strRemotePath, intDrive, bforce ' Данные для сетевого диска strDriveLetter = UCase("x:" ) ' Имя диска strRemotePath = "\\10.0.1.5\tmp" ' Сетевой путь bforce = true Set objShell = CreateObject("WScript.Shell") Set objNetwork = CreateObject("WScript.Network") Set CheckDrive = objNetwork.EnumNetworkDrives() ' А это уже путь, где будет создан файл с информацией ' о приложениях strPath = "x:\" strComputer = "localhost" ' Проверяем локальный компьютер ' Подключаем сетевой диск objNetwork.MapNetworkDrive strDriveLetter, strRemotePath ' Запускаем процедуру сбора информации GetInstalledSoftware() ' Отключаем сетевой диск If CheckDrive.Item(intDrive) <> strDriveLetter Then ↵ objNetwork.RemoveNetworkDrive CheckDrive.Item(0), ↵ bforce Sub GetInstalledSoftware() On Error Resume next Set objReg=GetObject("winmgmts: ↵ {impersonationLevel=impersonate}!\\" & _ strComputer & "\root\default:StdRegProv") If Err <> "0" Then Exit Sub End If ' Путь к разделу реестра Uninstall, содержащему информацию ' об установленных компонентах unKeyPath = "Software\Microsoft\Windows\ ↵ CurrentVersion\Uninstall" unValueName = ("DisplayName") objReg.EnumKey HKLM, unKeyPath, arrSubKeys i=0 For Each Subkey in arrSubKeys objDictionary2.Add i, unKeyPath & "\"& subkey & (Enter) i=i+1 Next pcName = "SYSTEM\CurrentControlSet\Control\ ↵ ComputerName\ActiveComputerName\" pcNameValueName = "ComputerName" userPath = "Software\Microsoft\Windows NT\ ↵ CurrentVersion\Winlogon\"

8

userValueName = "DefaultUserName" objReg.GetStringValue HKLM,pcName,pcNameValueName,pcValue objReg.GetStringValue HKLM,userPath,userValueName, ↵ userValue strFileName = UserValue & "_" & "On" & "_" & PCValue ↵ & "_"& "Software" _ & year(date()) & right("0" & month(date()),2) _ & right("0" & day(date()),2) & ".txt" Set objTextFile2 = objFSO.OpenTextFile(strPath ↵ & strFileName, ForWriting, True) objTextFile2.WriteLine(vbCRLF & _ "Current Installed Software " & vbCRLF & Time & vbCRLF ↵ & Date _ & vbCRLF & "Software For:" & "" & userValue & vbCRLF ↵ & "On System:" _ & "" & pcValue & vbCRLF) For Each objItem in objDictionary2 strKeyPath = objDictionary2.Item(objItem) objReg.GetStringValue HKLM ,strKeyPath, ↵ unValueName, strValue objTextFile2.WriteLine (strValue) If Err Then objDictionary2.Remove(objItem) End If Next End Sub wscript.Quit

Сбор урожая Если в вашей локальной сети менее десяти компьютеров, то запуск описанного выше сценария не составит особого труда. Можно воспользоваться столь любимой всеми системными администраторами программой Remote Admin и удаленно запустить сценарий на каждой клиентской машине. Однако все эти решения требуют от администраторов много ручной работы, а это не слишком хорошо. В оригинальной версии сценария [2] предлагалось использовать следующую процедуру, которая сначала собирает данные о машинах в домене, потом пытается запустить сценарий на каждом из этих компьютеров. Листинг 6. Запуск сценария на удаленных машинах домена Set objPCTXTFile = objFSO.OpenTextFile("c:\test.txt", ↵ ForWriting, True) ' Получаем информацию о домене Set objDomain = GetObject("WinNT://" & strDomain) ' Интересует объект компьютеры objDomain.Filter = Array("Computer") For Each pcObject In objDomain objPCTXTFile.WriteLine pcObject.Name Next objPCTXTFile.close ' Читаем компьютеры из созданного файла Set readPCFile = objFSO.OpenTextFile(strPath ↵ & strPCsFile, ForReading) i = 0 Do Until readPCFile.AtEndOfStream strNextLine = readPCFile.Readline objDictionary.Add i, strNextLine i = i + 1 Loop readPCFile.Close ' Запускаем процедуру сбора информации на каждом компьютере For each DomainPC in objDictionary strComputer = objDictionary.Item(DomainPC) GetInstalledSoftware() Next

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


администрирование со всех компьютеров сети, необходимо, чтобы в момент запуска сценария все машины были включены. Даже в небольшой компании добиться этого не просто. Всегда есть есть отсутствующие сотрудники, ноутбуки и удаленные филиалы, с которыми нет постоянного соединения. Таким образом мы приходим к выводу, что вариант с одновременным опросом всех машин в сети нас не устраивает. К тому же с помощью такой реализации практически невозможно собрать информацию в сети, которая географически разнесена по разным регионам, когда в одном офисе рабочий день только начинается, а в другом – уже заканчивается. Возможен еще другой вариант для запуска нашего сценария на пользовательских машинах – это Logon Script. Для доступа к нему необходимо в свойствах пользователя (или нескольких выбранных пользователей) в закладке Profile указать путь к файлу сценария (см. рис. 2). Тогда наш сценарий будет выполняться при входе пользователя в домен. Такое решение уже более универсально, чем предыдущее, но все равно от администратора требуетРисунок 2. Указываем Logon Script ся вручную выделить всех пользователей, у которых долЗдесь возможны два варианта «Startup» и «Shutdown». жен быть запущен сценарий. А если таких пользователей сотни? К тому же если у нас несколько пользователей за- Логичнее будет использовать наш сценарий при запуске ходят на один и тот же компьютер, то мы получим несколь- пользовательской машины. Нажимаем «Add» и добавляем файл сценария без пако одинаковых файлов отчета, различающихся только именем пользователя. Думаю, разбирать потом все это будет раметров. Все, теперь наш сценарий будет выполнен при не слишком удобно. Так что такой вариант для больших се- следующем запуске компьютера. В случае если необходимо использовать раздел «User Configuration», соответствутей тоже не подходит. Очевидно, что для подобных случаев лучше всего вы- ющие разделы будут «Windows Settings» и «Scripts (Logon/ полнять сценарии на клиенте с помощью групповых поли- Logoff)». Теперь остается только перетащить машины, к котик Active Directory. Групповую политику можно рассмат- торым будет применена данная групповая политика в соривать как набор правил для управления пользователями зданную нами Organization Unit. Следует сказать несколько слов о нагрузке на сеть, кои компьютерами. Групповую политику разрешается применять в нескольких доменах и в подгруппах внутри домена торую создаст наш сценарий в тот момент, когда пользоили индивидуальных системах. Параметры групповой по- ватели, придя утром на работу, начнут массово входить литики хранятся в объекте групповой политики (Group policy в сеть. Что касается времени выполнения сценария и его Object, GPO). К одному и тому же домену или подразделе- нагрузки на компьютер пользователя, то на средней машинию можно применять несколько объектов GPO. Подроб- не с 20-30 установленными приложениями (хотя в тех орнее о взаимодействии политик, свойствах Block Inheritance ганизациях, где люди прежде всего работают, таких приложений, как правило, меньше) время работы сценария буи No Override можно прочитать в [1]. Итак, создадим свою групповую политику и исполь- дет, не более трех секунд. По поводу трафика стоит отмезуем ее для автоматизации развертывания нашего сце- тить, что на той же машине с 30 установленными приложенария. Для этого зайдем локально или удаленно на кон- ниями файл отчета займет около 3 килобайт, так что даже троллер домена «Administrative Tools → Active Directory в моменты пиковой нагрузки речь может идти лишь о неUsers and Computers → Домен». В меню «Action → New → скольких сотнях килобайт трафика. Organization Unit» (введем название), затем в свойствах созданной организационной единицы закладка «Group Подведение итогов Policy», нажимаем «New», указываем имя новой политики Итак, мы собрали все необходимые нам сведения об уси затем, нажав «Edit», попадаем в редактор объектов GPO. тановленных на пользовательских машинах приложениях Для решения поставленной задачи развертывания сце- и сохранили их в виде отдельных файлов на сервере. Но танария на машинах пользователей нам удобнее будет ис- кой способ хранения полученной информации не слишком пользовать раздел «Computer Management», конечно, ес- удобен, к тому же мы не решили одну из задач, поставленли мы используем «Computer Management», ничего страш- ных в начале статьи, – сбор информации о количестве усного не произойдет, но, как и в случае с Logon Script, если тановленных приложений, необходимой для осуществления за компьютером работают несколько пользователей, то мы лицензирования. Таким образом, нам требуется, во-первых, рискуем получить несколько одинаковых файлов отчетов, собрать все данные в единый файл и, во-вторых, просумкоторые будут отличаться только именем пользователя мировать все одинаковые приложения. Обе эти задачи мы в заголовке. В разделе «Computer Management» заходим решим с помощью Microsoft Excel. Напишем WSH-сценарий, который необходимо будет разместить в том же каталоге, в «Windows Settings», далее «Scripts» (см. рис. 3).

№12, декабрь 2005

9


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

Рисунок 3. Объекты групповой политики

что и файлы, которые мы получили. После запуска данный сценарий поочередно открывает каждый из файлов каталога и экспортирует данные о приложениях в таблицу Excel, затем производится сбор сведений о количестве установок, которые также экспортируются в Excel. В результате работы сценария мы получаем книгу Excel, содержащую два листа: На первом таблица, состоящая из двух столбцов, – имя компьютера и наименование приложений. На втором листе список приложений и количество установок каждого из них. Далее приводится фрагмент сценария, реализующего все эти действия. Листинг 7. Создание документа Excel c результатами ……………. Set s = oE.Sheets(1) ' Лист 1 s.Name = "Список" Set s1 = oE.Sheets(2) ' Лист 2 s1.Name = "Сумма" s.Rows(1).RowHeight = 2 * s.StandardHeight s.Cells(1,1) = "Список установленных приложений" s.Cells(2,1) = "Имя компьютера" s.Cells(2,2) = "Приложения" s.Columns("A:B").Columns.AutoFit With s.Range("A1:B1") .MergeCells = True .VerticalAlignment = xlCenter .HorizontalAlignment = xlCenter .Font.Size=14 End With s1.Rows(1).RowHeight = 2 * s1.StandardHeight s1.Cells(1,1) = "Количество установленных приложений" s1.Cells(2,1) = "Приложение" s1.Cells(2,2) = "Всего установок" s1.Columns("A:B").Columns.AutoFit With s1.Range("A1:B1") .MergeCells = True .VerticalAlignment = xlCenter .HorizontalAlignment = xlCenter .Font.Size=14 End With Set objFSO = CreateObject("Scripting.FileSystemObject") Set fso = CreateObject("Scripting.FileSystemObject") ' Получаем сведения о файлах, находящихся в данной папке Set fld = fso.GetFolder(".") Set objTextFile2 = objFSO.OpenTextFile("c:\temp\tmp", ↵ ForWriting, True) For Each fi In fld.Files If fi.name<>"excel.vbs" AND fi.name<>"result.xls" Then ' Файл сценария и файл отчета не открывать Set readPCFile = objFSO.OpenTextFile(fi, ForReading) i = 0 s.Cells(n, 1) = fi.name ' Имя файла – это имя компьютера Do Until readPCFile.AtEndOfStream strNextLine = readPCFile.Readline i = i + 1 ' Первые 6 строк в файлах отчетах – это шапка, ' экспортировать не нужно

10

Рисунок 4. Таблица Excel с результатами

If i>6 Then s.Cells(n, 2) = strNextLine objTextFile2.WriteLine (strNextLine) n = n + 1 End If Loop readPCFile.Close End If Next objTextFile2.close f=3 Set objTextFile2 = objFSO.OpenTextFile("c:\temp\tmp", ↵ ForReading) Do Until ObjTextFile2.AtEndOfStream strNextLine = objTextFile2.Readline ' ищем вхождения имени приложения Set fc = s1.Columns("A").Find(strNextLine) If fc Is Nothing Then ' не нашли, тогда добавляем s1.Cells(f,1)=strNextLine Set fc = s.Columns("B").Find(strNextLine) If Not fc Is Nothing Then count=0 With s.Columns("B") Set c = .Find(strNextLine) If Not c Is Nothing Then firstAddress = c.Address Do ' считаем количество установок count=count+1 Set c = .FindNext(c) Loop While Not c Is Nothing And c.Address <> ↵ firstAddress End If End With s1.Cells(f,2)=Count ' сохраняем количество установок End If f=f+1 End If Loop

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

Литература: 1. Windows Server 2003. Справочник администратора. 2. http://www.computerperformance.co.uk – англоязычный сайт, содержащий множество примеров WSH сценариев, с комментариями.



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

Контролируем события с помощью EventSentry

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

К

аждый из указанных способов имеет свои достоинства и недостатки. Жалобы пользователей возникают, как правило, неожиданно, а от авральных работ не всегда получаешь удовольствие. На написание скриптов требуется время и опыт. Значит, будем использовать утилиту, созданную другими людьми. Преемник EventwatchNT утилита EventSentry от netikus ltd. позволяет полностью автоматизировать сбор информации о состоянии компьютеров, работающих под управлением систем на базе Windows NT/2000/XP и Windows Server 2003, а также контролировать работу сервисов в сети. Утилита проста в установке, понятна в настройке и ко всему прочему обладает удобным интерфейсом.

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

12

предназначен для оповещения, здесь мер, об активности процесса со времеможно выбрать несколько вариантов. ни его запуска до момента остановки. Например, отсылка почтового сообще- Все собранные данные (id процесса, id ния на указанный адрес. При этом со- родительского процесса, путь, имя исобщение может быть в обычном текс- полняемого файла, имя пользователя, товом формате, (X)HTML и так назы- домен, время) сохраняются, и при неваемом MINI, подходящем для пейд- обходимости всегда можно просмотжеров и мобильных телефонов. Так- реть историю, узнать, кто, когда и с каже информация о событии может быть кой частотой запускал программу. Чтозанесена в текстовый файл, здесь до- бы не нарушать корпоративные правиступны также три формата: текстовый, ла, при трассировке процесса не собиcsv и (X)HTML. Событие может быть рается информация о том, какой докузанесено через ODBC в базу данных, мент был открыт, также не отслежиотослано на удаленный syslog-сервер, ваются аргументы командной строки. SNMP, параллельный порт или выдано Можно контролировать работу всех в сеть как net send-сообщение. Кроме процессов («Track all processes except того, можно проиграть звук, вывести those listed below»), исключить трассисообщение на локальном компьютере ровку отдельных процессов или, наили выполнить произвольную коман- оборот, указать только на те процессы, ду пользователя. Все эти настройки которые нуждаются в отслеживании. производятся во вкладке Notifications Практически аналогичные по настрой(Targets) после указания всех парамет- ке фильтры позволяют контролировать ров, вывод целевого сигнала обычно регистрацию и выход пользователей можно сразу же протестировать нажа- из системы. Но это еще не все. Начитием кнопки Test. ная с версии 2.30, EventSentry получил Параметры систем контролиру- возможность контролировать некотоют два агента: Event Log Agent Control рые системные параметры. Например, и Heartbeat Agent Control, каждый при помощи «Service Monitoring» адмииз них отвечает за свой участок рабо- нистратор может узнать, когда и кем ты. При помощи Event Log Agent Control были добавлены, удалены или измениEventSentry отслеживает параметры ли свои параметры сервисы и драйвелокального компьютера, а Heartbeat ра. Сигнал поступит также и в том слуAgent Control предназначен для ра- чае, когда в реестр или в каталог «Авботы с удаленными системами. Аген- тозагрузка» будет добавлена новая ты позволяют собрать информацию программа, а также если сервис, усо многих основных параметрах. Напри- тановленный в автозапуск, по каким


администрирование либо причинам не запустилкомпьютеры рабочей групся. Вкладка «Disk Space» позпы или Active Directory. Дальволяет выставить параметры нейшую настройку параметнаблюдения за свободным ров сетевого контроля отдеместом на разделах жесткольных компьютеров, а также установленных на них агентов го диска. Здесь указываются можно производить по щелчлогические разделы жесткого диска, подлежащие наблюдеку на имени компьютера линию, процент или объем, при бо из контекстного меню. Отзаполнении которого будет сюда же можно управлять обвыдано предупреждающее новлениями агентов. Щелсообщение, а также интервал чок левой кнопкой по пункмежду проверками. ту «Computers» выдаст реИдеальным дополнением зультат последней проверки. к проверке журналов и сисВыбор «View History» позвоРисунок 1. Внешний вид консоли управления EventSentry темных параметров является лит просмотреть историю заку предупреждения в «Full Event Log контроль за состоянием компросов. На момент написания статьи быпьютеров и сетевых сервисов. Для это- Detection». Типичная схема контроля при по- ли доступны две версии продукта го используются ICMP-запросы и проверка работы TCP-портов, а также от- мощи EventSentry показана на рис. 2. EventSentry и EventSentry Light. Вторая клик EventSentry-агентов, работающих Агенты собирают информацию и от- распространяется как freeware, но имена удаленных компьютерах. Кроме сылают по назначению для дальней- ет ограничения на количество контпрочего EventSentry эмулирует syslog шего анализа и принятия решений. ролируемых сервисов и параметров: сервер, что вместе с наблюдением за При помощи одной консоли управ- не более одного параметра в каждом сетевыми сервисами может использо- ления можно настроить и контроли- пункте контроля, и всего два вида оповаться не только для контроля рабо- ровать работу не только локальных, вещения – e-mail и сообщение на работы Windows-систем, но и доступности но и удаленных систем. Для этого нуж- чий стол также недоступны веб-отчесервисов, UNIX и Cisco-систем. И, на- ны права администратора, и на уда- ты. Но в принципе контролировать обконец, использовав внешний датчик, ленном компьютере должна быть за- щую работоспособность систем в сети подключаемый к USB- или COM-пор- пущена служба «Удаленный реестр» даже с такими ограничениями вполне ту, можно контролировать темпера- (REMOTE REGISTRY). Причем установ- возможно. Полная версия без регистуру и влажность в помещении. Если ку системы контроля можно произво- трации будет работоспособна в течеуказанные параметры выйдут за пре- дить как локально, так и удаленно. Ес- ние 45 дней. После установки, в ходе которой делы нормы, администратор получит ли нет необходимости в наличии консоли управления на клиентских компью- можно ввести адрес SMTP-сервера предупреждение. Всю собранную информацию мож- терах, то при установке ее можно уб- (основного и резервного), порт, почтоно просмотреть при помощи системы рать из списка устанавливаемых ком- вый адрес, куда будут отсылаться соотчетов, доступных через GUI-интер- понентов. Хорошо продумана возмож- общения, данные для SMTP-аутентифейс, либо ASP- или PHP-страницы, ность добавления новых компьютеров фикации (если нужно), можно пристучерез IIS или Apache. Отчеты разбиты в список контроля. Для этого щелка- пать к настройке агентов и фильтров. по группам (Security, System, Aplication ем правой кнопкой мыши на заголов- Все настройки сохраняются в клюи другие), можно выбрать просмотр ке Computers и в контекстном меню вы- че реестра HKEY_LOCAL_MACHINE\ всех событий либо отсортировать бираем пункт «Add Computer/IP-адрес» netikus.net\EventSentry, который при по типу (Error, Warning, Information, Audit для добавления одного компьютера необходимости можно экспортировать или «Import Computers» для импорти- и импортировать как через менеджер Failure/Success). Учитывая, что файлы журналов рования списка компьютеров. Во вто- управления, так и regedit. имеют привычку разрастаться, при по- ром случае указать на файл, в котором мощи консоли управления можно вы- указан список компьютеров, выбрать Заключение ставить параметры их архивирования. Таким образом, применение EventSentry Для их установки заходим во вкладку существенно может сэкономить время «System Health → Backup Event Logs», и силы администратору, позволяя коннажимаем «+» в «Shelude» и заполнятролировать состояние систем и серем параметры: вид журнала (системвисов, проводить аудит безопасности и вовремя реагировать на возникаюный, приложения и пр.), день и время операции, имя файла. Для удаления щие проблемы. старого файла ставим галочку в пункте «Clear Event Log». Для подстраховСсылка: ки, в том случае если журнал запол1. Сайт программы EventSentry – http:// Рисунок 2. Типичная схема контроля параметров компьютера нится раньше, выставляем отправwww.netikus.net.

№12, декабрь 2005

13


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

Мультизагрузка: стелим соломку

Сергей Супрунов Любая система, прежде чем начнет работать, должна загрузиться. Если на вашей машине установлено несколько ОС, еще нужно как-то выбрать, что именно загружать. И если при этом возникнет проблема…

П

ожалуй, проблемы с загрузкой и загрузочными секторами можно отнести к одним из самых не-

14

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

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


администрирование Таблица 1. Формат MBR Байты

Назначение

0-445

MBR-код

446-461

Описание 1-го раздела

462-477

Описание 2-го раздела

478-493

Описание 3-го раздела

494-509

Описание 4-го раздела

510-511

Сигнатура 0xAA55

Таблица 2. Формат описателя раздела Байты

Назначение

0

Признак активности

1

Номер головки начала раздела

2

Номер сектора (биты 0-5) и старшие биты (биты 6-7) номера цилиндра начала раздела

3

Младшие биты номера цилиндра начала раздела

4

Тип файловой системы

5

Номер головки конца раздела

6

Номер сектора (биты 0-5) и старшие биты (биты 6-7) номера цилиндра конца раздела

7

Младшие биты номера цилиндра конца раздела

8-11

Номер первого сектора раздела от начала диска

12-15

Количество секторов, занятых разделом

Нужно заметить, что существует несколько схем разметки жестких дисков, помимо привычного большинству пользователей деления на разделы. Например, FreeBSD может быть установлена на целый диск без использования таблицы разделов (так называемый режим «dangerously dedicated»). Windows на платформах Itanium использует схему GUID Partition Table (GPT) и так далее. Но в данной статье речь будет идти о традиционной разметке ATA-дисков, используемой большинством систем на платформе i386.

Что скрывают три буквы – MBR? Наиболее важный «субъект» процедуры загрузки – первый сектор жесткого диска. Как правило, его обозначают аббревиатурой MBR (Master Boot Record). Упрощенно формат MBR представлен в таблице 1. То есть он содержит код MBR-загрузчика, таблицу разделов (disk partition table, DPT) и сигнатуру, позволяющую распознать данный сектор как загрузочный. Таблица разделов (64 байта) отводит по 16 байт для описания каждого раздела жесткого диска. Очевидно, что

№12, декабрь 2005

диск может содержать только 4 раздела, описанные в MBR (такие разделы называют первичными). Для обхода этого ограничения используются дополнительные (extended) разделы (довольно часто можно встретить термин «расширенный раздел», хотя это не совсем верно). Первый сектор такого раздела аналогичен MBR и может содержать описание логического раздела (диска) и ссылку на следующий дополнительный раздел. В результате несколько дополнительных разделов создают своего рода цепочку ссылок. На рис. 1 показан пример разбиения диска, поясняющий сказанное. К слову, у логического диска, размещенного на каком-нибудь «далеком» дополнительном разделе, гораздо больше шансов оказаться недоступным, т.к. в этом случае мы имеем больше секторов, повреждение одного из которых разорвет всю цепочку. Поэтому систему старайтесь, по возможности, инсталлировать на один из основных разделов. В DPT для каждого раздела содержатся его координаты, а также тип файловой системы и признак активности раздела. Активным должен помечаться только один раздел; о том, зачем это нужно, поговорим чуть позже. Координаты раздела записываются двумя способами – в виде номеров «цилиндр-головка-сектор» (CHS) начала и конца раздела, а также указанием «линейного» номера первого сектора и количества секторов (см. таблицу 2). Прочтите также врезку «Сказание о 1024 цилиндре», где вопросы геометрии рассмотрены несколько подробнее. Наконец, программный код (в дальнейшем для него будет использоваться термин «первичный загрузчик» или «MBR-код»), располагающийся в начале первого сектора диска, в своем «каноническом» виде предназначен для анализа таблицы разделов, поиска в ней раздела, помеченного как активный, загрузки в память кода из первого сектора активного раздела (boot-сектора) Рисунок 1. Пример

и передачи ему управления. Именно по такому алгоритму происходит загрузка операционных систем семейства DOS / Windows 9x.

Загрузочный сектор В первом секторе раздела, с которого предусмотрена загрузка операционной системы, обычно располагается код вторичного загрузчика, а сам сектор именуется загрузочным. Он (код) уже должен уметь работать с соответствующей файловой системой, поскольку в его задачу входит загрузка программы-«лоудера» (загрузчика 3-й ступени) или непосредственно ядра операционной системы, которые, как правило, являются обычными файлами. Загрузка непосредственно ядра может использоваться для безусловной загрузки операционных систем семейства DOS/Windows 9x, то есть тех, где пользователю не предлагается выбор системы или параметров загрузки ядра, а требуется просто передать управление ядру системы, размещенному в строго определенном месте (чтобы его не приходилось искать). В более сложных случаях 512 байт этого сектора уже недостаточно для размещения полнофункционального кода, и поэтому запускается вспомогательная программа – загрузчик ядра, практически лишенная каких-либо ограничений дискового пространства (естественно, в разумных пределах) и способная решать весьма широкий круг задач. Рассмотрим в общих чертах работу наиболее популярных загрузчиков (их подробное описание оставим за рамками данной статьи).

Загрузка в стиле DOS Поговорим немного подробнее о том, как происходит загрузка систем DOS

разбиения диска на разделы

15


администрирование Соглашение о терминах

 Вторичный загрузчик (boot-код) – за-

Если говорить о процессе загрузки, то английский язык оказывается здесь несколько богаче русского. В нем есть два термина – booting и loading, описывающих разные этапы загрузки ОС. Мы же вынуждены «плясать» вокруг одного слова – «загрузка», поэтому приведу небольшой словарик, которого будем придерживаться в этой статье (в скобках указаны синонимы):  Первичный загрузчик (MBR-код) – загрузочный код, размещаемый в MBR.

грузочный код, размещаемый в bootсекторе раздела.  Загрузчик ядра (loader) – программа, загружающая ядро ОС. Термин «загрузчик» в зависимости от контекста может обозначать либо один из указанных кодов, либо весь набор программ, отвечающих за загрузку системы (например, BSD-загрузчик).

и Windows. Эти системы во время ин- с файловыми системами (как с FAT, сталляции записывают в MBR класси- так и NTFS), благодаря чему существуческий загрузчик, который ищет актив- ет возможность (скорее теоретическая, ный раздел и передает управление ко- учитывая возможные проблемы из-за ду, размещенному в его первом секто- «обобществления» ряда системных ре. Этот код в свою очередь запускает каталогов, таких как «Program Files») установить несколько систем семейсядро системы. Таким образом, в таблице раздела тва Windows на один раздел. Наприодин из секторов обязательно должен мер, если boot.ini будет выглядеть табыть помечен как активный, иначе за- ким образом: грузчик не сможет его найти и вернет [boot loader] сообщение, что диск не является заtimeout=30 грузочным. default=multi(0)disk(0)rdisk(0) ↵ partition(1)\WINNT В случае если загрузчик в MBR бу[operating systems] дет поврежден, восстановить его позmulti(0)disk(0)rdisk(0) ↵ partition(1)\WINNT= ↵ воляет команда fdisk /mbr (в современ"Windows 2000Pro" /fastdetect ных системах Windows вы ее, к сожаC:\="Windows 98SE" лению, уже не найдете). Она перезаписывает только код первичного загруз- то это позволит загрузить Windows 2000 чика (первые 446 байт), не затрагивая из каталога WinNT диска C, в то время как Windows 98 будет занимать тратаблицу разделов.

А вот в NT все немножко сложнее В операционных системах этого семейства используется еще один «посредник» – NTLoader. Эта программа позволяет более гибко управлять загрузкой, указывая расположение ядра системы или передавая управление на другие разделы диска. Ее загрузчик (вторичный применительно к процедуре загрузки) устанавливается в boot-сектор активного диска, а программа ntldr помещается в корне этого диска, в терминологии Windows это диск C: (при этом сама NT-система может быть инсталлирована на другой раздел, включая и логические диски). NTLoader руководствуется в своей работе конфигурационным файлом boot. ini (который размещается в корне файловой системы активного раздела, там же, где и ntldr). NTLoader у же умеет работать

16

Сказание о 1024 цилиндре С давних времен умудренные опытом системные администраторы передают своим молодым коллегам наказ – не ставить операционную систему за пределами 1024 цилиндра. Что же это за магический цилиндр и насколько проблема актуальна в наши дни? Если посмотреть на структуру таблицы разделов (таблица 2), то будет видно, что при CHS-адресации там отводится 6 бит для номера сектора, 8 – для головки и 10 – для цилиндра. В результате мы получаем естественное (для BIOS) ограничение на адресуемое пространство: 63 сектора * 256 головок * 1024 цилиндра (те самые) * 512 байт в секторе = 8 455 716 864 байт (диск около 8,4 Гб (как правило, производители винчестеров используют «математику» 1 Кб = 1000 байт (а не 1024), что, безусловно, более выгодно по маркетинговым соображениям)). Код первичного загрузчика, если он для ра-

диционную папку C:\Windows и загружаться посредством io.sys. NTLoader обладает еще одним полезным «навыком» – он умеет загружать образы загрузочных секторов из файлов. Примеры практического использования этой функции можно найти далее в этой статье.

LILO и GRUB – близнецы-братья Нет, конечно же, эти два популярных в среде Linux менеджера загрузки имеют ряд коренных отличий, однако применительно к теме данной статьи принцип их работы схож. Они записывают в MBR код, который, безусловно (независимо от установленных признаков активности разделов), передает управление вторичному загрузчику (на этот раз он располагается непосредственно в файловой системе, а не в boot-секторе, причем в некоторых случаях это может быть не Linuxраздел; в случае GRUB возможно размещение части вторичного загрузчика – stage1_5 – и вне файловой системы). Эта программа отвечает за отображение меню выбора и (в случае, если выбрана загрузка Linux) передает управление загрузчику ядра. Благодаря такому подходу, разработчики этих менеджеров загрузки смогли обойти очень жесткое ограничение на размер загрузочного сектоботы с диском использует функцию BIOS INT13 (которая как раз и руководствуется CHS-адресацией), просто не сможет «дотянуться» до раздела, размещенного за указанным пределом. В современных BIOS используется, как правило, расширенное прерывание INT13, позволяющее обойти это ограничение. В этом случае для доступа к разделу используется преобразование геометрии «на лету» (например, для цилиндра 1800 и головки 16 возвращается «законный» номер цилиндра 900 и головка 32). Кроме того, некоторые менеджеры загрузки способны самостоятельно рассчитывать местоположение разделов, основываясь на «линейных» координатах, именуемых также LBA – Linear Block Addressing (для указания первого сектора раздела в DPT отводится 4 байта, что позволяет адресовать порядка 2 Тб данных: 232 сектора * 512 байт). Например, так ведет себя LILO в случае использования опции linear в файле lilo.conf.


администрирование Особенности именования разделов Это было бы смешно, если бы не было так грустно… Каждая система использует свои наименования разделов, в которых можно и запутаться. Таблица 3 должна помочь вам (приведены лишь некоторые примеры, об остальном несложно догадаться). Как видите, FreeBSD и GRUB нумеруют «винчестеры» начиная с нуля, Linux использует для их обозначения буквы «a», «b» и т. д. Разделы Linux и FreeBSD считают с единицы, в то время как GRUB – с нуля. Кроме того, FreeBSD использует собственную разметку внутри раздела. В ее

ра, но зато привязали себя (и пользователей) к Linux-разделу. То есть, если вы на свой компьютер с Windows решите поставить для пробы Linux (с LILO), а затем по тем или иным причинам захотите его удалить, то после удаления раздела с Linux ваша система потеряет способность загружаться. Впрочем, это довольно легко обойти с помощью «организационных» методов, например, размещая каталог /boot на отдельном небольшом разделе (и проследив, чтобы все нужные загрузчику файлы располагались в нем). Если же вы не были столь предусмотрительны и при очередной загрузке видите на экране одинокое «L», то решить эту проблему несложно: загрузитесь с системной дискеты DOS или Windows 98 и выполните команду «fdisk /mbr» для записи стандартного загрузчика в MBR вместо LILO. Или перед тем, как удалять раздел, деинсталлируйте LILO следующей командой: # lilo -u

терминологии разделы именуются слайсами (slice), а созданные в них подразделы – собственно разделами (partition). Эти разделы обозначаются буквами (первый раздел первого слайса будет обозначаться как «ad0s1a». Обратите внимание еще на одну особенность – FreeBSD и Linux привязывают нумерацию раздела к контроллеру и режиму работы диска (таблица 4), в то время как GRUB считает реально присутствующие диски. Например, если вы подключите только один диск как Primary Slave, то Linux будет рассматривать его как hdb, в то время как GRUB – как (hd0).

ете новое ядро) эти файлы не перезаписываются, сохраняя оригинальное содержимое. А вот если вы пробовали ставить GRUB, затем снова вернулись на LILO, то при выполнении вышеозначенной команды вы получите в MBR ваш старый GRUB-код. Но в любом случае потеря возможности загружаться не означает потерю операционной системы. Просто вы должны понимать, что произошло, чтобы не впадать в панику…

«Самый умный загрузчик» Разработчики BSD-систем пошли другим путем, и им удалось каким-то чудом «втолкать» в 446 байт, оставшихся в MBR после размещения там таблицы разделов и сигнатуры, полноценный (полноценный в том плане, что способен предоставить пользователю меню выбора системы только силами MBR-кода) загрузчик (BootEasy). Он способен проанализировать таблицу разделов и на ее основе предложить вам меню для выбора загружаемой системы. Конечно, доступное пространство не позволяет заниматься украшательством, поэтому выглядит меню предельно лаконично:

Таблица 3. Обозначения разделов диска Раздел

GRUB

Linux

FreeBSD

Первый раздел на первом диске

(hd0,0)

hda1

ad0s1

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

(hd0,1)

hda2

ad0s2

Первый раздел на втором диске

(hd1,0)

hdb1

ad1s1

Таблица 4. Соответствие между обозначением и контроллерами Диск

Linux

FreeBSD

Primary Master

hda

ad0

Primary Slave

hdb

ad1

Secondary Master

hdc

ad2

Secondary Slave

hdd

ad3

ма FreeBSD. Четвертый раздел не размечен, поэтому в меню не представлен. В качестве загрузки по умолчанию (Default) предлагается та система, которая расположена на активном разделе. Причем BSD-загрузчик, ко всему прочему, умеет перезаписывать таблицу разделов, отмечая как активный тот раздел, который был выбран пользователем. То есть если вы сейчас нажмете F1, то загрузится, к примеру, Windows 98, и в следующий раз именно она будет предлагаться как система по умолчанию. Обратите внимание, что эта способность перезаписывать таблицу разделов может стать источником проблем. Об этом подробно рассказано далее, при описании использования BSD-загрузчика при работе с несколькими жесткими дисками. При необходимости вы можете отключить перезапись DPT, жестко назначив раздел по умолчанию, переустановив BootEasy с помощью команды boot0cfg (а заодно и изменив время ожидания выбора с 10 секунд, скажем, до 30 (на самом деле, значение 10 секунд выбрано не с потолка, и является хорошо сбалансированным, предоставляя пользователю достаточно времени на реагирование, и в то же время не затягивает чрезмерно «умолчальную» загрузку)):

Правда, нужно учитывать, что восстановление произойдет успешF1 DOS но только в том случае, если в систеF2 ?? F3 FreeBSD ме есть файлы с копией MBR до установки LILO (обычно они располагаются Default: F3 _ в каталоге /boot с именами boot.XXYY, # boot0cfg -o noupdate -s 3 -t 550 например, boot.0300 для MBR первого Из этого примера видно, что загруздиска). Когда вы выполняете коман- чик нашел три раздела: на первом – ду /sbin/lilo для инсталляции загрузчи- DOS (под это же обозначение попаЗдесь опция -s задает номер раздека, нужные файлы должны создавать- дают и системы Windows 9x), на вто- ла (начиная с 1), который будет исполься автоматически; при повторных ин- ром – неизвестная загрузчику система зоваться по умолчанию, -t – задержку в сталляциях (когда вы меняете конфи- (например, так может выглядеть раз- «тиках» (1 секунда примерно соответсгурацию загрузчика или устанавлива- дел Linux swap), а на третьем – систе- твует 18 тикам). Будьте предельно ос-

№12, декабрь 2005

17


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

Грузим три системы с помощью загрузчика BSD

держки вновь проинсталлированных операционных систем. Естественно, для этого придется загружаться в Linux (если вы только что установили Windows, для этого вам понадобится загрузочный диск или дискета). Например, загрузка системы Windows, установленной в первом разделе, может быть обеспечена такими строками в lilo.conf:

Посмотрим, как можно загрузить Windows, Linux и FreeBSD с помощью стандартного загрузчика FreeBSD. Собственно other = /dev/hda1 # Указываем загрузочный раздел Windows говоря, это наиболее простой путь – просто инсталлируйtable = /dev/hda # Таблицу разделов следует искать в MBR те FreeBSD последней, разрешите установку загрузчика в label = windows # Наименование загружаемой системы MBR, и больше ни о чем беспокоиться не нужно – загрузчик сам будет определять доступные разделы и предлагать их Если Windows для загрузки использует NTLoader, то при вам на выбор. Однако одним из серьезных недостатков яв- выборе пункта «windows» в меню LILO вы получите еще одляется то, что BootEasy не умеет анализировать загрузоч- но меню – на этот раз соответствующее файлу C:\boot.ini. Поскольку на самом деле строка «other» просто указыные сектора логических дисков (размещенных на дополнительных разделах), поэтому выбор будет ограничен систе- вает на некоторый boot-сектор, коду которого должно быть мами, установленными в основные разделы. (Впрочем, есть передано управление, то таким же образом можно загрусведения, что это ограничение преодолевается. Например, жать и другие системы, например, FreeBSD (указав соотDragonFly BSD (основанную на FreeBSD систему), по неко- ветствующий раздел). торым слухам, можно устанавливать и на логические диски – но сам не проверял, поэтому врать не буду...). А наибольшую гибкость Если FreeBSD у вас уже установлена, и вы хотите устано- обеспечивает GRUB вить еще и Linux, сохранив загрузчик, установите LILO или Загрузчик GRUB может не только передать управление на GRUB в загрузочный сектор Linux-раздела (большинство ин- указанный раздел, но и непосредственно загрузить файлы сталляторов позволяют сделать соответствующий выбор). «чужих» систем (например, FreeBSD). В частности, следуВ этом случае BSD-загрузчик передаст управление на этот ющий фрагмент конфигурационного файла обеспечит заboot-сектор, а остальное сделает уже Linux-загрузчик. грузку FreeBSD, минуя ее вторичный загрузчик: Если же последней системой устанавливается Windows, title FreeBSD # Указываем имя ОС то тут без «реанимации» не обойтись – после инсталляции root (hd0,2,a) # Выбираем корневой раздел для загрузки вы сможете загрузиться только в Windows, поскольку сисkernel /boot/loader # Указываем файл для передачи управления темы от Microsoft безо всяких вопросов перезаписывают MBR тем кодом, какой им нужен. В этом случае вам приВ этом случае GRUB передаст управление сразу на задется воспользоваться системной дискетой, дистрибутив- грузчик ядра FreeBSD, который и выполнит дальнейшую заным диском или LiveCD, чтобы загрузить FreeBSD и восста- грузку. Обратите внимание, что в силу особенностей разновить загрузчик, используя команду boot0cfg. биения раздела, присущих FreeBSD (см. врезку «ОсобенВ данной статье, говоря о загрузчике FreeBSD, упомина- ности именования разделов»), нужно помимо диска и номеется лишь устанавливаемый по умолчанию BootEasy, одна- ра раздела указать еще букву подраздела FreeBSD (в нако нужно заметить, что он не единственный boot-менеджер шем случае – a). для этой системы. В коллекции портов вы сможете найти Для загрузки Windows из GRUB больше подойдет иснесколько альтернатив, например, extipl (Extended IPL), gag пользование передачи управления «по цепочке»: и даже grub. Если вы используете один из них, уточните в доtitle Windows кументации, как следует выполнять те или иные действия. rootnoverify (hd0,0) makeactive chainloader +1

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

Использование консоли восстановления Как ни странно, но системы семейства Windows NT не предоставляют пользователю возможность использовать утилиту fdisk или как-то иначе работать с MBR и загрузочными секторами. Для этого используется Recovery Console (консоль восстановления), которую можно проинсталлировать на диск либо использовать непосредственно с дистрибутивного CD.

18

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

Ус т а н о в к а н а д и с к в ы п о л н я е тся из папки дистрибу тива командой: «winnt32.exe /cmdcons». При следующей перезагрузке вы увидите новый пункт в меню NTLoader, вызывающий загрузочный образ из места расположения файлов консоли восстановления (обычно это C:\cmdcons\BOOTSECT.DAT). Загрузившись в консоль, вы сможете выполнить ряд команд, среди которых интересные нам fixmbr и fixboot. Первая,

как следует из названия, перезаписывает MBR стандартным кодом (не затрагивая таблицу разделов), вторая – заносит код вторичного загрузчика в boot-сектор активного раздела. Конечно, консоль, установленная на диске, в случае проблем с загрузкой, скорее всего, окажется недоступной. В этом случае воспользуйтесь диском с дистрибутивом или заранее приготовленной дискетой.


администрирование Большая тайна маленькой дискетки Вы никогда не задумывались, почему дискета, забытая в дисководе, прерывает загрузку компьютера с выдачей сообщения «Non-System disk or disk error»? Казалось бы, если дискета не загрузочная, то BIOS должен просто приступить к опросу следующего по списку устройства… Загрузитесь во FreeBSD или Linux и запишите в файл первый сектор чистой дискеты, только что из коробочки: # dd if=/dev/fd0 of=floppy.bs bs=512 count=1

Откройте его в каком-нибудь hex-просмотрщике (это можно сделать и в Midnight Commander), и – о чудо! – мы видим и код, и сигнатуру загрузочного раздела! То есть получается, что дискета может быть системной или нет, но она всегда загрузочная. И поэтому BIOS, обнаружив сигнатуру 0xAA55, отдает управление коду и «умывает руки». Все остальные сообщения – это уже забота загрузчика, размещенного в boot-секторе нашей дискеты. А он, как можно увидеть, только и умеет, что ругаться на экране страшными для секретарш фразами. Пошла такая «традиция», видимо, со старых добрых времен зарождения персональных компьютеров, когда жесткие диски были непозволительной роскошью, и работа велась преимущественно с дискет. Очевидно, что как-то нужно было предупредить пользователя о том, что он пытается загрузиться с «неправильной» дискеты.

ка, как и в случае с LILO, будет определяться настройками NTLoader (если он имеется). По цепочке может быть загружена практически любая система, в том числе и FreeBSD, если такой способ кажется вам более удобным, чем приведенный выше: title FreeBSD chainloader (hd0,2)+1

Кстати говоря, по цепочке можно передать управление не только на тот или иной сектор, но и на образ сектора, сохраненный в файле. Например, если у вас установлены системы Windows 98, Windows 2000 и Linux, то Windows 98 можно загрузить и сразу из GRUB, минуя меню NTLoader. Для этого можно использовать такую конфигурацию: title Windows 98 chainloader (hd0,0)/bootsect.dos

Файл bootsect.dos уже должен быть на вашем диске C: (именно его использует NTLoader, когда вы выбираете загрузку Windows 9x из меню NT-загрузчика). Если в boot.ini установить нулевую задержку и в качестве варианта по умолчанию выбрать загрузку Windows 2000, то вы вообще не будете видеть второе меню, делая выбор загружаемой системы только в меню GRUB.

А если я люблю NT? Приложив некоторые усилия, можно заставить и NTLoader загружать «альтернативные» системы. Как мы уже упоминали выше, программа ntldr способна передавать управление образу загрузочного сектора, записанному в файл. Например, если у вас в hda1 (в терминологии Linux) установлена Windows XP, а в hda2 – Linux, то вы можете проделать следующее:

№12, декабрь 2005

Кстати, эта особенность активно используется при создании загрузочных (не системных!) дискет в Windows NT/2000/XP – при форматировании дискеты в этих системах в boot-сектор помещается свой код (см. рис. 2). Даже без дизассемблирования видно, что он ищет файл ntldr и выдает сообщения об ошибке только в случае неудачи. Если же ntldr на дискете будет обнаружен, то он загрузится в память, получит управление, считает boot.ini (его тоже следует разместить на дискете), и выполнит загрузку системы «как положено», даже в случае повреждения кода в MBR.

Рисунок 2. Первый сектор дискеты, отформатированной в Windows XP

Загрузившись в Linux (например, с помощью дискеты; можно воспользоваться и LiveCD-дистрибутивом), сохраните первый сектор раздела hda2 в файл и скопируйте его на Windows-раздел: # # # #

dd if=/dev/hda2 of=bootsect.lnx mount /dev/hda1 /mnt cp bootsect.lnx /mnt umount /mnt

Команды монтирования в этом примере предполагают, что Windows-раздел у вас описан в fstab. Иначе потребуется также указать тип монтируемой системы и, возможно, некоторые дополнительные параметры. Данный фрагмент сработает только в том случае, если на диске C: вы используете файловую систему FAT. В случае NTFS запись возможна, если файл назначения уже создан и имеет нужный размер, хотя проще и безопаснее воспользоваться «посредником», например, дискетой или «флэшкой», для переноса образа на диск C:. Далее, перегрузившись в Windows, добавьте в файл boot.ini такую строчку (описание в кавычках может быть любым): C:\bootsect.lnx="SUSE Linux 10.0"

Теперь, при следующей загрузке компьютера, вы обнаружите в предложенном вам меню новый пункт, выбрав который, попадете в Linux. В случае FreeBSD все еще проще – вам просто нужно скопировать файл /boot/boot1 на диск C: под именем, скажем, bootsect.bsd, и добавить соответствующий пункт в меню boot.ini.

19


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

Рисунок 3. Работа с диском в YaST (SUSE 10.0)

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

Некоторые особенности работы с несколькими дисками

Рисунок 4. Управление загрузкой в YaST (консольный вариант)

первый, то и поиск будет выполняться в его MBR-секторе. В результате вы вместо загрузки системы получите сообщение об ошибке. Чтобы этого избежать, можно использовать образ MBR второго диска, в который должен быть установлен один из загрузчиков, и передавать управление на него. В случае с Linux особых проблем возникнуть не должно – во время инсталляции укажите, что хотите поставить LILO или GRUB в MBR второго диска (hdb), а после установки системы сохраните в файл образ MBR:

Если у вас установлено несколько жестких дисков и, например, FreeBSD установлена на второй из них (в то время как загрузка выполняется с первого), то нужно иметь # dd if=/dev/hdb of=bootsect.hdb bs=512 count=1 в виду следующую особенность. Вы не всегда можете передать управление на какой-либо раздел второго диска, не сделав этот диск текущим (текущим будем называть Теперь перепишите этот файл в Windows-раздел и надиск, номер которого хранится в данный момент в регис- стройте NTLoader, как было описано выше, и при выборе сотре DL процессора, впрочем, для нашей статьи это уже ответствующего пункта меню вы попадете в LILO или GRUB, страшные дебри). который сделает всю оставшуюся работу. Такие менеджеры загрузки как LILO или GRUB умеют Однако будьте предельно осторожны с загрузчиком это делать прозрачно для пользователя – в зависимос- BSD – он обязательно должен быть установлен, в нашем ти от того, какое устройство указано в соответствующей случае – в MBR второго диска, и использовать лучше обстроке конфигурационного файла, выполняются все необ- раз этого сектора, «снятый» утилитой dd. Если это не было сделано, то файл boot0 не будет содержать таблицы раздеходимые действия. BootEasy для передачи управления на другой диск пред- лов. А, как вы, должно быть, помните, BSD-загрузчик пеложит вам еще один вариант выбора – F5. Если в MBR вто- резаписывает MBR, чтобы проставить признак активносрого диска также установлен BSD-загрузчик, то будет вы- ти раздела, загружавшегося последним. В итоге если вы полнен анализ его таблицы разделов и сформировано ме- просто будете использовать boot0 в качестве образа MBR, ню для этого диска. Вернуться на первый можно той же то получите следующую схему: клавишей <F5>.  Стандартный загрузчик из MBR первого диска находит А вот если вы используете NTLoader, то тут есть свои активный раздел и загружает его boot-сектор. особенности…  Находящийся там NTLoader при выборе пунк та В случае с LILO вы по-прежнему можете использо«FreeBSD» загружает bootsect.bsd (который является копией boot0). вать описанную выше схему – сохраняя в файл образ соответствующего boot-сектора и подключая его в boot.ini.  Загрузчик BSD, получив управление, загружает выбранНо вот если на первом диске у вас установлена система ную систему, проставляет признак активности в пустой Windows, а на втором – FreeBSD, и вы хотели бы испольтаблице разделов и записывает ее в MBR. зовать для загрузки NTLoader (в частности, чтобы иметь  Включив в следующий раз компьютер, вы обнаружите возможность безболезненно отключить второй диск), свой винчестер девственно чистым. то, просто передав управление на образ загрузочного разОднако не следует впадать в панику и начинать фордела (файл boot1), вы поставленную задачу не решите. Дело в том, что boot1 обращается к таблице разделов теку- матировать диск. Ваши данные никуда не делись – все щего диска, чтобы определить координаты сектора с сис- на месте и ждут загрузки. Сломалась только таблица разтемой FreeBSD. А поскольку текущим диском останется делов, которую несложно восстановить. Если, конечно,

20


администрирование у вас будет под рукой нужный инструментарий (см. следующий раздел).

Страховка на все случаи жизни Итак, что же нужно иметь под рукой, чтобы справиться с большинством проблем, которые могут возникнуть при загрузке системы? Если вы часто используете Windows и эта система вам очень дорога, то непременно обзаведитесь двумя-тремя (учитывая их непревзойденную «надежность») системными дискетами, на которых хорошо бы держать и утилиты fdisk, format и т. п. Даже если вы работаете только в Windows XP, все равно подготовьте загрузочную дискету, например, с Windows 98. Поверьте, это не самая лучшая ситуация, когда вы не можете найти, откуда можно выполнить спасительную команду «fdisk /mbr». При использовании Windows 2000 или XP не поленитесь установить Recovery Console (см. врезку «Использование консоли восстановления»). Конечно, если у вас всегда под рукой инсталляционный диск, то это не является необходимым. Впрочем, места на диске консоль восстановления занимает немного, а выручить когда-нибудь сможет. Для Linux и FreeBSD крайне полезны будут LiveCD, с которых можно будет загрузиться и устранить возникшую проблему. Также интересное решение было описано Алесандром Мичуриным в прошлом номере «Системного администратора» в статье «GRUB на CD, или Ещё один способ восстановить MBR». Посмотрите, какие возможности по работе с диском предлагает ваша система. Например, большинство современных дистрибутивов Linux имеют очень развитые и удобные инструменты для работы с диском и загрузчиками (см. рис. 3, 4). Неплохо также иметь под рукой и специализированный LiveCD, предназначенный для аварийно-восстановительных работ. В принципе вы можете создать и собственный дистрибутив, разместив на нем именно те инструменты, которые вы предпочитаете использовать. Но существуют и готовые решения, одно из которых – Knoppix. Много про этот дистрибутив писать не буду. Отмечу лишь, что он несет на борту большое число утилит для разбиения и восстановления разделов диска – от традиционных fdisk и cfdisk до QTParted, позволяющей производить «визуальное» редактирование диска, в том числе и изменение размеров разделов без потери информации (однако это не отменяет необходимость обязательного создания резервных копий перед любыми манипуляциями с разделами). В частности, попытаться восстановить таблицу разделов, если она будет повреждена (например, в результате неправильных манипуляций с BootEasy), можно с помощью утилиты testdisk – она сканирует весь диск в поисках сигнатур и по ним пытается восстановить DPT. Меня она пару раз выручала даже в условиях довольно сложной разметки. Пример ее работы, а также некоторые другие инструменты Knoppix показаны на рис. 5. С помощью Knoppix вы сможете восстановить и менеджеры загрузки. Например, чтобы восстановить LILO, cмонтируйте ваш Linux-раздел, скажем, в /mnt (при наличии нескольких разделов их тоже следует подключить, со-

№12, декабрь 2005

Рисунок 5. Knoppix имеет инструменты почти на все случаи жизни

храняя иерархию; например, раздел /boot смонтируйте как /mnt/boot), с помощью команды «chroot /mnt» сделайте его корневым и выполните команду /sbin/lilo для восстановления загрузчика. Не поленитесь сохранить образы MBR и загрузочных секторов. Места они практически не занимают, записываются быстро, а вот восстановить с их помощью проблемный сектор (той же командой dd) может оказаться на порядок проще и быстрее, а главное – надежнее, чем с использованием различных утилит, которые в принципе могут и ошибиться. Единственное – не забывайте поддерживать этот архив в актуальном состоянии, чтобы не «откатиться» на тот момент, когда у вас не было установлено и половины систем. Ну и неплохо также иметь записанную на бумаге таблицу разделов (ее можно сформировать с помощью fdisk) – иногда бывают секунды, когда все решают минуты… В общем, порой оказывается намного проще (а то и единственно возможно) восстановить таблицу разделов вручную с помощью fdisk. А феноменальной памятью, чтобы запомнить все сектора и цилиндры, обладают немногие.

Заключение Как видите, проблемы с загрузчиками не представляют той опасности, как может показаться на первый взгляд. Никакие данные не теряются безвозвратно, даже в случае повреждения таблицы разделов, и если у вас под рукой такой замечательный инструмент, как Knoppix, то все можно исправить. Главное – не впадайте в панику и не совершайте скоропалительных действий. От того, броситесь вы восстанавливать разделы сразу же после возникновения проблемы или спустя неделю, ничего не изменится. А вот последствия ошибок могут быть весьма плачевными. Поэтому сначала попытайтесь «вычислить», что же произошло, и на основании этого составьте план восстановительных мероприятий. Постарайтесь предугадать возможные проблемы, а также подготовьте «точки отката» для каждого шага (например, сохраняя образ текущего MBR, хоть он и может выглядеть совершенно бесполезным). Только после этого приступайте к спасению своих данных. Удачи вам и крепких нервов!

21


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

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

М

атериал этой статьи, наверное, ти, а иногда даже использовать без изДругими часто используемыми забольше подходит для учебни- менения (см. рис. 1). головками являются: ка по основам системного ад Сс (carbon copy) – кому отправить министрирования. Однако до сих пор Как создаются почтовые копию письма (адресатов может такого учебника я не видел, а практи- сообщения быть несколько), при этом и основка показывает, что даже многие адми- С точки зрения пользователя почтоному адресату, и дополнительным будет об этом известно. нистраторы с практическим опытом ра- вой системы существует только один боты с трудом представляют себе об- компонент – это MUA (Mail User Agent),  Received – путь прохождения письщую картину того, как в целом рабо- или, другими словами, его почтовый ма. тают сервисы электронной почты. По- клиент (Mozilla, Outlook, The Bat!, KMail,  Content-Type – информация о том, этому мы попытаемся заложить фун- mutt, pine, mailx, а также веб-приложекаким образом письмо должно быть отображено. дамент, необходимый для понимания ния аналогичного назначения), предмеханизмов работы. назначенный для создания, отправМногие MUA позволяют указать Для того чтобы упростить задачу, ки, получения и чтения почтовых созаголовок Bcc (Blind carbon copy) – мы откажемся от рассмотрения та- общений. Формат почтовых сообщений опи- его получатели письма не увидят никих монстров, как Microsoft Exchange или Lotus Notes/Domino, и сосредото- сан в RFC 2822 (Internet Message когда. Получатели, упомянутые в To чим внимание на открытом програм- Format) и в серии RFC с 2045 по 2049, и Cc, ничего не узнают о получателях, мном обеспечении и стандартных поч- которые посвящены формату MIME – упомянутых в Bcc, а последние ничего товых протоколах – их в большинстве Multipurpose Internet Mail Extensions не узнают друг о друге, но тем не меслучаев более чем достаточно. Не бу- (Format of Internet Message Bodies, Media нее они получат письмо и будут недодем мы рассматривать и протокол Types, Message Header Extensions for умевать: как в их почтовом ящике окаUUCP – многие из тех, кто знал, что это Non-ASCII Text, Registration Procedures, залось сообщение, в числе адресатов Conformance Criteria and Examples). такое, уже успели про него забыть. которого они не упомянуты? Этот заЕсли коротко, то любое почтовое головок используется преимущественВзгляд с высоты птичьего сообщение состоит из заголовков и те- но спамерами. Имена заголовков могут содержать полета ла, разделенных пустой строкой. КажГлавной отличительной чертой почто- дый заголовок, в свою очередь, состо- только 7-битные ASCII-символы. Знавой системы, построенной на откры- ит из имени и значения, разделенных чения заголовков не ограничены симтом программном обеспечении, явля- двоеточием. волами ASCII, но при наличии не ASCIIСледующие заголовки считаются символов они должны использо ется ее модульность. Отдельные компоненты являются взаимозаменяемы- обязательными: вать MIME-кодирование в форме ми, для каждого компонента существу-  From – адрес и, возможно, полное «=?charset?encoding?encoded text?=». Существуют следующие типы коет несколько реализаций. Замена комимя отправителя. понентов, предназначенных для одной  To – адрес и, возможно, полное имя дирования: цели, в большинстве случаев катасттого, кому адресовано письмо (ад-  7bit – до 998 октетов на строку рофой не является: базовая функциресатов может быть несколько). из диапазона [1..127]\{CR, LF}. Исональность заменяемых компонентов пользуется по умолчанию.  Subject – тема письма. в целом одинакова, настройки и дан-  Date – локальные дата и время от-  quoted-printable – используется ные тоже, как правило, можно перенесправления письма. в первую очередь для US-ASCII-

22


администрирование --------------070102080309020306010600 Content-Type: text/plain; name="file.txt" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="file.txt" Text file content --------------070102080309020306010600--

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

символов, но также содержит символы из других диапазонов.  base64 – используется для двоичных данных.  8bit – до 998 октетов на строку из диапазона [1..255]\{CR, LF}. Этот тип кодирования в заголовках почтовых сообщений использовать нежелательно, о причинах мы поговорим позже.  binary – произвольная последовательность октетов (фактически отсутствие какого бы то ни было кодирования). Этот тип кодирования использовать нельзя. Таким же точно образом кодируется тело письма, при этом кодировка и тип кодирования указывается в заголовках Content-Type и Content-Transfer-Encoding. Вот пример типичного почтового сообщения: Message-ID: <436F19FC.7050901@mail.domain1.com> Date: Mon, 07 Nov 2005 12:10:20 +0300 From: User 1 <user1@domain1.com> User-Agent: Mozilla Thunderbird 0.6 (X11/20040511) X-Accept-Language: en-us, en MIME-Version: 1.0 To: user2@domain2.com Subject: =?KOI8-R?Q?=F4=C5=D3=D4?= Content-Type: text/plain; charset=KOI8-R; format=flowed Content-Transfer-Encoding: 8bit Привет!

Тело почтового сообщения может состоять из нескольких частей (которые используются для передачи вложений, не обязательно текстовых). Вот пример такого сообщения: Message-ID: <436F2097.5060703@mail.domain1.com> Date: Mon, 07 Nov 2005 12:38:31 +0300 From: User 1 <user1@domain1.com> User-Agent: Mozilla Thunderbird 0.6 (X11/20040511) X-Accept-Language: en-us, en MIME-Version: 1.0 To: user2@domain2.com Subject: =?KOI8-R?Q?=F4=C5=D3=D4?= Content-Type: multipart/mixed; boundary="------------070102080309020306010600" This is a multi-part message in MIME format. --------------070102080309020306010600 Content-Type: text/plain; charset=KOI8-R; format=flowed Content-Transfer-Encoding: 8bit Привет!

№12, декабрь 2005

После создания сообщения MUA должен передать его MSA (Mail Submission Agent). В RFC 2476 (Message Submission) MSA описан как сервис, принимающий клиентские подключения на порту 678 по TCP/IP, и выполняющий первичную проверку почтовых сообщений на соответствие стандартам, авторизацию пользователей и блокирование UCE (Unsolicited Commercial Email – мы привыкли обозначать эту корреспонденцию словом «спам») еще на этапе отправки. Затем MSA должен передать письмо MTA (Mail Transfer Agent) – сервису, принимающему клиентские подключения на порту 25 по TCP/IP, который, в свою очередь, уже должен заняться доставкой письма непосредственно адресату. И в первом, и во втором случае должен использоваться протокол SMTP, описанный в RFC 2821 (Simple Mail Transfer Protocol) и RFC 1869 (SMTP Service Extensions), но MUA и MTA не должны общаться напрямую друг с другом. На практике отдельных реализаций MSA не существует, а большинство реализаций MTA способны также выполнять функции MSA. Более того, для MSA практически никогда не конфигурируется порт 678, а все почтовые сообщения от MUA принимаются непосредственно на порт 25. Поведение MTA после того, как он получил почтовое сообщение от MUA или MSA, зависит от настроек самого MTA, а также от домена, которому принадлежит почтовый адрес получателя. В простейшем случае (в отсутствие постоянного подключения к Интернету, постоянного реального IP-адреса и DNS-имени – в сегодняшних реалиях такое происходит довольно редко) MTA вообще не берет на себя ответственность за пересылку письма, а просто отдает ее вышестоящему MTA, который для него является релеем (relay – MTA, через который производится пересылка). Релей может определить список сетей/хостов и/или список логинов/паролей, которым разрешено пересылать через него свои почтовые сообщения. Домены, обслуживаемые релеем, как правило, являются исключением: для них сообщения принимаются от кого угодно. Релей, не устанавливающий никаких ограничений на пересылку почтовых сообщений, называется открытым релеем (open relay). Все открытые релеи ждет одна и та же участь:  Сначала их услугами начинают активно пользоваться спаммеры.  Затем релей попадает в какой-либо черный список, и все MTA, выполняющие фильтрацию по черным спискам (а их сейчас большинство), перестают принимать от него почтовые сообщения. МТА, принимающий на себя ответственность за пересылку, сначала проверяет, обслуживает ли он домен адре-

23


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

Анатомия протокола SMTP Давайте отправим тестовое письмо, используя протокол SMTP. Он является текстовым протоколом, поэтому для отправки сообщения вместо полнофункционального MUA мы можем использовать telnet (это необходимо для лучшего понимания общих принципов работы протокола SMTP, а также может быть очень полезно при отладке MTA): # telnet localhost 25 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. 220 mail.domain1.com ESMTP Postfix EHLO host1.domain1.com 250-mail.domain1.com 250-PIPELINING 250-SIZE 10240000 250-ETRN 250-STARTTLS 250-AUTH PLAIN 250 8BITMIME MAIL FROM: user1@domain1.com 250 Ok RCPT TO: user2@domain2.com 250 Ok DATA 354 End data with <CR><LF>.<CR><LF> Hello! . 250 Ok: queued as 24D501771C QUIT 221 Bye Connection closed by foreign host.

MUA отправителя ↔ MTA отправителя: Response: 220 mail.domain1.com ESMTP Postfix Command: EHLO host1.domain1.com Response: 250-mail.domain1.com Response: 250-PIPELINING Response: 250-SIZE 10240000 Response: 250-ETRN Response: 250-STARTTLS Response: 250-AUTH PLAIN Response: 250 8BITMIME Command: MAIL FROM: user1@domain1.com Response: 250 Ok Command: RCPT TO: user2@domain2.com Response: 250 Ok Command: DATA Response: 354 End data with <CR><LF>.<CR><LF> Message: Hello! Response: 250 Ok: queued as 24D501771C Command: QUIT Response: 221 Bye

MTA отправителя ↔ MTA получателя: Response: 220 mail.domain2.com ESMTP Sendmail 8.13.5/8.13.1; Mon, 7 Nov 2005 16:29:00 +0300 (MSK) Command: EHLO mail.domain1.com Response: 250-mail.domain2.com Hello mail.domain1.com [xxx.xxx.xxx.xxx], pleased to meet you Response: 250-ENHANCEDSTATUSCODES Response: 250-PIPELINING Response: 250-8BITMIME Response: 250-SIZE Response: 250-DSN Response: 250-ETRN Response: 250-AUTH DIGEST-MD5 CRAM-MD5 LOGIN PLAIN Response: 250-STARTTLS Response: 250-DELIVERBY Response: 250 HELP Command: MAIL FROM:<user1@domain1.com> SIZE=361 Response: 250 2.1.0 <user2@domain2.com>... Sender ok Message: Received: from host1 (host1.domain1.com [xxx.xxx.xxx.xxx]) Message: by mail.domain1.com (Postfix) with ESMTP id 24D501771C Message: for <user2@domain2.com>; Mon, 7 Nov 2005 16:30:58 +0300 (MSK) Message: Message-Id: <20051107133058.24D501771C@mail.domain.com> Message: Date: Mon, 7 Nov 2005 16:30:58 +0300 (MSK) Message: From: user1@domain1.com Message: To: undisclosed-recipients:; Message: Message: Hello! Message: . Message: QUIT Response: 250 2.0.0 jA7DT0o5090086 Message accepted for delivery Response: 221 2.0.0 mail.domain2.com closing connection

Наше однострочное сообщение обзавелось всеми необходимыми заголовками, и теперь вполне соответствует стандартам – MTA также выполнил часть функций MSA. Тем не менее полагаться на это поведение нельзя – другие Немного о том, что происходит в telnet-сессии. Полу- MTA или тот же самый, но с более строгими настройками, чив приглашение, мы представляемся с помощью команды вправе отказать нам в приеме такого сообщения. EHLO, и в ответ получаем список расширений, поддерживаемых тем MTA, к которому мы подключились. Сейчас нас не Что еще нужно знать об отправке интересуют расширения, нам просто нужно отправить со- Протокол SMTP не позволяет однозначно идентифицирообщение. Мы указываем отправителя с помощью команды вать отправителя сообщения, однако существует возможMAIL FROM: и получателя c помощью команды RCPT TO:. ность потребовать от отправителя авторизоваться – для этоПосле команды DATA мы вводим содержимое самого пись- го служит расширение AUTH, описанное в RFC 2554 (SMTP ма и завершаем его точкой на новой строке. С помощью ко- Service Extension for Authentication). Для реализации этого расширения MTA используют механизм SASL, описанный манды QUIT мы отключаемся от MTA. Обратите внимание: содержимое письма, мягко говоря, в RFC 2222 (Simple Authentication and Security Layer), котоне соответствует никаким стандартам и совсем не похоже рый позволяет использовать различные способы передана те примеры «правильных» писем, которые мы приводи- чи и хранения логина и пароля, в том числе и те, которые ли. Тем не менее, MTA принял письмо. Если до отправки используют не сам пароль, а его хэш. Существует также возможность шифровать SMTP-траписьма включить прослушивание SMTP-трафика с помощью ethereal, а затем обработать экспортированные текс- фик с помощью технологий TLS/SSL (Transport Security товые логи средствами grep и sed, мы получим следующие Layer / Secure Socket Layer), для чего могут использоватьпротоколы обмена. ся 2 механизма:

24


администрирование  Устаревший протокол SMTPS – это фактически тот же самый SMTP, но шифруется весь трафик, начиная от начального приветствия MTA, при этом используется порт 465.  Расширение STARTTLS, описанное в RFC 2487 (SMTP Service Extension for Secure SMTP over TLS) – если клиент MTA (MUA, MSA или другой MTA) поддерживает его, то отправка сообщения может выглядеть, например, так (при этом используется порт 25 – тот же самый, что и для обмена незашифрованными сообщениями): Response: 220 mail.domain1.com ESMTP Postfix Command: EHLO host1.domain1.com Response: 250-mail.domain1.com Response: 250-PIPELINING Response: 250-SIZE 10240000 Response: 250-ETRN Response: 250-STARTTLS Response: 250-AUTH PLAIN Response: 250 8BITMIME Message: STARTTLS Response: 220 Ready to start TLS Message: \026\003\001\000S\001\000\000O\003\001\000\033\2144\341\024A\ 361\322EP\370yF\257\370x\273?\031<+\326\355\327\337X\347\207\305P\234\ 000\000(\0009\0008\0005\0003\0002\000\004\000\005\000/\000\026\000\02 3\376\377\000 Message: \000\025\000\022\376\376\000\t\000d\000b\000\003\000\006\001\000

Расширение 8BITMIME, описанное в RFC 1652 (SMTP Service Extension for 8bit-MIME transport), позволяет использовать тип MIME-кодирования 8bit. Оно не является обязательным, поэтому использовать заголовки, закодированные таким образом, нежелательно. Мы не будем рассматривать все расширения SMTP, скажем только, что каждому из них посвящен отдельный RFC, а искать их проще по названиям расширений в общем списке RFC. Кроме использования протокола SMTP существует более простой способ отправить почтовое сообщение – это так называемая локальная отправка, поддерживаемая почти всеми MTA. Общепринятым способом локальной отправки является использование pipe-интерфейса программы sendmail, существуют MUA, которые поддерживают этот способ отправки (KMail, mutt, pine), а mailx вообще никаких других способов, кроме этого, не поддерживает. Простейший shell-скрипт, выполняющий локальную отправку, выглядит так: #!/bin/sh /usr/sbin/sendmail -t << EOF From: user1@domain1.com To: user2@domain2.com Subject: Test Message Hello! EOF

Кто занимается транспортировкой сообщений До сих пор мы говорили только об интерфейсах, предоставляемых MTA, но даже не произносили их названий. Только в протоколах ethereal видно, что на узле mail.domain1.com в качестве MTA используется Postfix, а на узле mail.domain2.com – Sendmail. Это именно та модульность, о которой говорилось выше: существует множество различных MTA, все они реализуют приблизительно одну и ту же функциональность, используют одни и те же про-

№12, декабрь 2005

токолы, а как уж они устроены внутри – это их личное дело. Соответственно, дело администратора – выбрать тот MTA, который проще и гибче настраивается, надежнее и быстрее работает, да и вообще, более симпатичен. Кратко перечислим несколько наиболее распространенных MTA:  Sendmail – старожил, самый первый MTA, до сих пор сохраняющий свои позиции, отчасти по инерции (в BSDсистемах и во многих дистрибутивах Linux именно он устанавливается по умолчанию), отчасти благодаря возможности очень гибкой настройки. Однако процедура конфигурирования, монолитная архитектура, работа с полномочиями суперпользователя и регулярно обнаруживаемые уязвимости вызывают множество нареканий, поэтому его использование уже становится дурным тоном.  Qmail – первая более защищенная и модульная альтернатива Sendmail, за взлом которой учреждена до сих пор никем не полученная премия. Однако этот MTA так и не получил широкого распространения из-за лицензионных ограничений, благодаря которым многие дистрибутивы Linux не включают его в свой состав. Фактически, уже несколько лет Qmail не развивается автором, и чтобы получить нормально работающую систему на его основе, придется собирать его с множеством патчей.  Postfix – еще одна альтернатива Sendmail, получившая значительно большее распространение благодаря вменяемой лицензионной политике, модульной архитектуре, высокой производительности, простой процедуре конфигурирования и использованию в некоторых дистрибутивах Linux и в Mac OS X по умолчанию. В журнале уже публиковался цикл статей Андрея Бешкова, посвященных Postfix, поэтому детально рассматривать этот MTA мы не станем.  Exim – монолитный MTA подобно Sendmail, однако с безопасностью у него дело обстоит гораздо лучше. Кроме того, Exim претендует на звание MTA с максимальной функциональностью и самой логичной системой конфигурирования, которое, впрочем, требует больших усилий по сравнению с аналогичной процедурой для Postfix. Exim используется по умолчанию в Debian Linux. В журнале уже публиковались статьи, посвященные этому MTA, поэтому останавливаться на нем мы не будем, а пойдем дальше.

Доставка почтовых сообщений Количество MTA, через которые пройдет письмо, пока не найдет своего адресата, в принципе не ограничено, хотя в большинстве случаев достаточно двух MTA, если домены отправителя и получателя обслуживаются разными MTA (и между ними есть прямой TCP/IP маршрут), или одного в противном случае. Задачей MTA после получения письма для своего домена является сохранение письма в постоянное хранилище, откуда его сможет прочесть адресат с помощью своего MUA. Доставкой письма в это хранилище занимается очень широкий класс ПО, который носит общее название MDA (Mail Delivery Agent). Когда-то в процедуре доставки ничего сложного не было.

25


администрирование Использовалась исключительно push-технология: MTA посредством собственного локального MDA доставлял почтовые сообщения куда-нибудь в /var/mail или /var/spool/mail, а MUA, появившиеся в те времена (mailx, mutt, pine), читали сообщения непосредственно оттуда – при этом они обязаны были находиться на одной машине с MTA или монтировать свои почтовые ящики, например, по NFS. Затем более популярными стали pop-технологии: /var/mail и /var/spool/mail выродились в специализированные серверные хранилища почты с собственными специализированными средствами доставки почты, появились сервисы, предоставляющие доступ к этим хранилищам по протоколам POP3 и IMAP по запросу самого MUA – причем новые MUA (Mozilla, Outlook, The Bat!) по другому себе жизнь уже не мыслят и о /var/mail и /var/spool/mail ничего не знают.

Форматы серверных почтовых хранилищ

Subject: Test Message Message-Id: <20051023123325.CEA8840F0@mail.domain1.com> Date: Sun, 23 Oct 2005 16:33:25 +0400 (MSD) Hello!

Хранение всех сообщений в одном файле приводит к тому, что писать приложения, осуществляющие одновременное добавление новых сообщений и редактирование уже существующих, не так просто, как хотелось бы, не слишком надежно (возможностей повредить mbox предостаточно), а иногда и просто невозможно (блокировка mbox на запись при доставке сообщений делает невозможной параллельную доставку). Именно это и было причиной появления другого формата – Maildir. Maildir – это каталог с тремя подкаталогами внутри: tmp, new, cur. При доставке сообщения оно помещается в файл в подкаталоге tmp, имя файла формируется из текущего времени, имени хоста, идентификатора процесса, создавшего этот файл, и некоторого случайного числа – таким образом гарантируется уникальность имен файлов. После записи в файл всего сообщения создается жесткая ссылка на этот файл в каталоге new, а текущая ссылка из tmp удаляется – это делается для того, чтобы никакой другой процесс не смог прочитать содержимое сообщения до тех пор, пока оно не будет записано полностью. По такому же алгоритму при чтении сообщения (это может делать как MUA, так и другой MDA, предоставляющий доступ к Maildir по протоколу POP3 или IMAP) оно перемещается в каталог cur, при этом название файла изменяется: к нему добавляются пометки о прочтении, ответе, удалении и т. д. Maildir++ – это дальнейшее усовершенствование Maildir с поддержкой вложенных каталогов IMAP (они должны начитаться с «.») и квот.

На сегодняшний день существует два стандартных формата серверных хранилищ почты (mbox и Maildir – их стандартность проявляется в том, что доставлять в них почту и извлекать ее оттуда могут различные MDA) и несколько нестандартных (например, файловое хранилище Cyrus, похожее по идеологии на Maildir, но несовместимое с ним, и хранилище DBMail, использующее БД MySQL или PosgreSQL, – если использовать эти хранилища, то вместе с их преимуществами мы одновременно резко ограничим себя в выборе MDA для доставки и извлечения почты). Впрочем, в любом случае мы говорим об открытых хранилищах, формат которых документирован (в худшем случае в исходных кодах MDA), поэтому нет никаких препятствий к тому, чтобы написать конвертор из одного хранилища в другое (и такие конверторы есть). Нестандартные хранилища (Cyrus и DBMail) и MDA, ра- Кто занимается доставкой сообщений ботающие с этими хранилищами, лучше будет рассмотреть в серверные хранилища в отдельных статьях (статья о DBMail планируется опубли- Все MTA содержат в своем составе локальные MDA для доковать в следующем номере журнала, статья о Cyrus IMAP ставки в mbox, а иногда и в Maildir, но часто для доставки уже публиковалась), а сейчас мы сосредоточим свое вни- выгоднее бывает использовать внешние MDA общего намание на стандатных хранилищах: mbox и Maildir. значения, позволяющие выполнить дополнительные операMbox – это целое семейство не совсем совместимых ции с почтовыми сообщениями: переложить в другой почдруг с другом форматов, различные модификации кото- товый ящик, переслать на другой почтовый адрес, перерых используются как в хранилищах почты на серверах, дать другой программе по pipe-интерфейсу для дальнейтак и локально в MUA. Все эти форматы объединяет то, шей обработки и т.д. что все сообщения хранятся в одном файле, начинаются Самыми распространенными внешними MDA общего с поля From и отделены друг от друга пустой строкой. В про- назначения являются: цессе доставки новые сообщения дописываются в конец  Procmail – в основном используется для доставки соmbox-файла. Если вернуться к нашему примеру письма общений в mbox (хотя существует патч для поддержки от user1@domain1.com к user2@domain2.com, то после его Maildir). сохранения в конце mbox-файла (скорее всего, это файл  Maildrop – является частью проекта Courier, может добудет называться /var/mail/user2 или /var/spool/mail/user2) ставлять почту в mbox, но чаще используется для додобавится следующее: ставки почты в Maildir. Более эффективно расходует системные ресурсы, чем Procmail, поддерживает виртуальFrom user1@domain1.com Sun Oct 23 16:26:52 2005 ных пользователей, информация о которых может храReturn-Path: <user1@domain1.com> Received: from mail.domain1.com (mail.domain1.com [xxx.xxx.xxx.xxx]) ниться в Berkley DB, LDAP, MySQL и PostgreSQL. by mail.domain2.com (8.13.5/8.13.1) with ESMTP id j9NCQqTZ012628 for <user2@domain2.com>; Sun, 23 Oct 2005 16:26:52 +0400 (MSD) (envelope-from user1@domain1.com) Received: from host1.domain1.com (host1.domain.com [xxx.xxx.xxx.xxx]) by mail.domain1.com (Postfix) with ESMTP id CEA8840F0 for <user2@domain2.com>; Sun, 23 Oct 2005 16:33:25 +0400 (MSD) From: user1@domain1.com To: user2@domain2.com

26

И Procmail, и Maildrop используют pipe-интерфейс для приема почты от MTA: для каждого почтового сообщения создается отдельный процесс MDA, получающий сообщение на stdin. Это не слишком экономный способ об-


администрирование работки почты, особенно при больших объемах, поэтому MTA предлагают еще один способ получения сообщений – протокол LMTP, описанный в RFC 2033 (Local Mail Transfer Protocol). MDA, использующий LMTP, принимает сообщения по TCP/IP или UNIX-сокету подобно MTA, поэтому создавать отдельный процесс на каждое сообщение не нужно. Cyrus и DBMail предлагают MDA, использующие LMTP, для доставки в собственные хранилища, а вот для mbox и Maildrop таких MDA нет. Кроме фильтрующих MDA общего назначения в процессе доставки сообщения в серверное хранилище также могут использоваться специализированные контент-фильтры. Такие фильтры могут выполнять функцию отсеивания спама и вирусов, в этом качестве часто используются SpamAssassin и SpamOracle в связке с популярными антивирусами. Они могут использовать как pipe-интерфейс, так и интерфейс LMTP. Последний вариант, как правило, является более производительным, но затрудняет использование контент-фильтра в MDA общего назначения – остается использовать MDA из комплекта MTA.

Организация доступа к серверным хранилищам Наиболее популярными MDA, предоставляющими доступ к mbox и Maildir по протоколам POP3 и IMAP, являются:  UW IMAP – самый простой из всех перечисленных. Работает под inetd/xinetd, не имеет вообще никаких настроек, в качестве механизма аутентификации использует только PAM, по умолчанию работает только с mbox (хотя существует патч для поддержки Maildir). Предоставляет доступ ко всем файлам в домашнем каталоге пользователя как к каталогам IMAP, даже если они не являются mbox – обязанность отображения только нужных файлов (действительно являющихся mbox) возлагается на MUA. Да и история безопасности у него очень нехорошая.  Courier IMAP – часть проекта Courier, в который также входят собственный (но не слишком распространенный) MTA, уже упоминавшийся Maildrop, менеджер списков рассылки, средства совместной работы (groupware) и средства доступа к почте через Web. В качестве формата хранилища поддерживается только Maildir. Для аутентификации и Courier IMAP, и Maildrop используют общую библиотеку Courier Authentication Library, которая поддерживает хранение логинов, паролей, пути к Maildir пользователя и квот Maildir в Berkley DB, LDAP, MySQL и PostgreSQL – таким образом, почтовые пользователи не обязаны иметь системные учетные записи. Кроме того, для аутентификации возможно использование PAM.  Dovecot – позиционируется как сервер POP3/IMAP, при написании которого в первую очередь учитывалась безопасность: другими словами, он относится к UW IMAP и Courier IMAP, как Qmail и Postfix к Sendmail. В качестве формата хранилища поддерживается как mbox, так и Maildir, для увеличения производительности (которая всегда была слабым местом при работе с mbox) используются специальные индексы. Для аутентификации используется уже упоминавшийся механизм SASL –

№12, декабрь 2005

его же для аутентификации используют многие MTA и Сyrus IMAP. Но в целом по функциональности Dovecot пока не дотягивает до Courier IMAP.  Cyrus IMAP – наиболее продвинутая почтовая система, которая помимо уже перечисленных возможностей, доступных в других MDA, включает возможности кластеризации и проксирования, быстрый и гибкий механизм фильтрации почтовых сообщений Sieve (описанный в RFC 3028). Однако все компоненты Cyrus используют собственный формат хранилища почтовых сообщений и не умеют работать со стандартными mbox и Maildir. В тех случаях, когда поддержка протокола IMAP не требуется, возможно использование более простых MDA, предоставляющих доступ к mbox и Maildir только по протоколу POP3: к их числу относятся Cubic Circle (cucipop), QPopper и Popa3d.

Как происходит получение сообщений И MDA, используемые для доставки почты в mbox и Maildir, и MDA, предоставляющие доступ к ним по протоколам POP3 и IMAP, взаимозаменяемы точно так же, как и различные MTA. MUA ничего не знает о типе хранилища и о том, с каким POP3/IMAP-сервером он работает, он всего лишь использует протоколы POP3 и IMAP для доступа к хранилищу. Протокол POP3, описанный в RFC 1939 (Post Office Protocol – Version 3), подразумевает, что пользователи забирают сообщения из серверного хранилища и работают с ними в локальном хранилище своего MUA. Продемонстрируем использование этого протокола с помощью telnet: # telnet localhost 110 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. +OK Hello there. USER user1 +OK Password required. PASS pwd1 +OK logged in. STAT +OK 1 422 LIST +OK POP3 clients that break here, they violate STD53. 1 422 . RETR 1 +OK 422 octets follow. Return-Path: <user1@domain1.com> Received: from mail.domain1.com (mail.domain1.com [xxx.xxx.xxx.xxx]) by mail.domain2.com (8.13.5/8.13.1) with ESMTP id j9NCQqTZ012628 for <user2@domain2.com>; Sun, 23 Oct 2005 16:26:52 +0400 (MSD) (envelope-from user1@domain1.com) Received: from host1.domain1.com (host1.domain.com [xxx.xxx.xxx.xxx]) by mail.domain1.com (Postfix) with ESMTP id CEA8840F0 for <user2@domain2.com>; Sun, 23 Oct 2005 16:33:25 +0400 (MSD) From: user1@domain1.com To: user2@domain2.com Subject: Test Message Message-Id: <20051023123325.CEA8840F0@mail.domain1.com> Date: Sun, 23 Oct 2005 16:33:25 +0400 (MSD) Hello! . DELE 1 +OK Deleted. QUIT +OK Bye-bye.

После аутентификации с помощью команд USER и PASS мы получаем количество сообщений в почтовом ящике

27


администрирование и их общий размер – для этого мы используем STAT. С помощью LIST мы получаем список сообщений и их размеры. Затем мы запрашиваем текст первого (и единственного) сообщения с помощью RETR, удаляем его из серверного хранилища с помощью DELE и отключаемся от сервера – для этого служит команда QUIT. Теперь посмотрим, как происходит то же самое, но протоколу IMAP, описанному в RFC 3501 (INTERNET MESSAGE ACCESS PROTOCOL – VERSION 4rev1). Он подразумевает, что все сообщения даже после прочтения хранятся на сервере с пометкой о том, что они прочитаны, соответственно пользователи могут работать с одним и тем же почтовым ящиком с разных рабочих станций с помощью различных MUA одновременно. # telnet localhost 143 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. * OK [CAPABILITY IMAP4rev1 UIDPLUS CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA IDLE ACL ACL2=UNION STARTTLS] Courier-IMAP ready. Copyright 1998-2004 Double Precision, Inc. See COPYING for distribution information. 1 LOGIN "user1" "pwd1" 1 OK LOGIN Ok. 2 SELECT "INBOX" * FLAGS (\Draft \Answered \Flagged \Deleted \Seen \Recent) * OK [PERMANENTFLAGS (\* \Draft \Answered \Flagged \Deleted \Seen)] Limited * 1 EXISTS * 1 RECENT * OK [UIDVALIDITY 1131530433] Ok * OK [MYRIGHTS "acdilrsw"] ACL 2 OK [READ-WRITE] Ok 3 FETCH 1:* (FLAGS) * 1 FETCH (FLAGS (\Recent)) 3 OK FETCH completed. 4 FETCH 1 (UID RFC822.SIZE FLAGS BODY.PEEK[]) * 1 FETCH (UID 1 RFC822.SIZE 443 FLAGS (\Recent) BODY[] {443} Return-Path: <user1@domain1.com> Received: from mail.domain1.com (mail.domain1.com [xxx.xxx.xxx.xxx]) by mail.domain2.com (8.13.5/8.13.1) with ESMTP id j9NCQqTZ012628 for <user2@domain2.com>; Sun, 23 Oct 2005 16:26:52 +0400 (MSD) (envelope-from user1@domain1.com) Received: from host1.domain1.com (host1.domain.com [xxx.xxx.xxx.xxx]) by mail.domain1.com (Postfix) with ESMTP id CEA8840F0 for <user2@domain2.com>; Sun, 23 Oct 2005 16:33:25 +0400 (MSD) From: user1@domain1.com To: user2@domain2.com Subject: Test Message Message-Id: <20051023123325.CEA8840F0@mail.domain1.com> Date: Sun, 23 Oct 2005 16:33:25 +0400 (MSD) Hello! ) 4 OK FETCH completed. 5 STORE 1 +FLAGS (Seen) * FLAGS (Seen \Draft \Answered \Flagged \Deleted \Seen \Recent) * OK [PERMANENTFLAGS (Seen \* \Draft \Answered \Flagged \Deleted \Seen)] Limited * 1 FETCH (FLAGS (\Recent Seen)) 5 OK STORE completed. 6 CLOSE 6 OK mailbox closed. 7 LOGOUT * BYE Courier-IMAP server shutting down 7 OK LOGOUT completed Connection closed by foreign host.

командой STORE 1 +FLAGS (Seen), закрываем почтовый ящик и отключаемся от сервера – для этого мы используем CLOSE и LOGOUT.

Что еще нужно знать о получении сообщений Разумеется, функциональность POP3, а особенно IMAP приведенными командами не ограничивается. Например, IMAP включает в себя также механизм подписки на каталоги IMAP, возможность совместной работы с общими каталогами под различными учетными записями (shared folders), поиск в каталогах средствами сервера, частичную загрузку сообщений (в примере мы запросили все сообщение целиком, а могли бы запросить только некоторые интересующие нас заголовки) и т. д. POP3 и IMAP поддерживают шифрование, причем эта поддержка, как и в случае SMTP, возможна в 2 вариантах:  Использование отдельных портов, на которых шифруется весь трафик (995 для POP3 и 993 для IMAP).  Механизм TLS: используются стандартные порты, но после подключения MUA может инициировать шифрование с помощью команды STARTTLS. Существуют специализированные MUA, предназначенные для получения почтовых сообщений по протоколам POP3/IMAP и отправки их дальше в автономном режиме. Такой механизм может быть полезен для сбора почтовой корреспонденции в один почтовый ящик из разных ящиков в разных доменах. Как и использование для MTA внешнего релея, этот механизм незаменим для почтового сервера, не имеющего постоянного подключенния к интернет, постоянного реального IP-адреса и DNS-имени, и подключающегося к провайдеру периодически для приема и отправки почты. К числу автономных MUA относятся:  Getmail – после получения почты по POP3/IMAP он сохраняет ее в серверное хранилище (mbox или Maildir) либо передает ее какому-нибудь фильтрующему MDA общего назначения (Procmail или Maildrop).  Fetchmail – после получения почты по POP3/IMAP он пересылает ее указанному в конфигурационном файле MTA.

MUA замыкают круговорот почтовых сообщений. Пересылка существующих писем или создание новых – это то, с чего мы начинали. Можно вернуться к схеме, с которой начиналась статья, и к описанию MTA – теперь ему решать, что делать с письмом дальше. Рассмотренные нами компоненты позволяют строить почтовые системы какой угодно сложности. Именно это и называется UNIX Way: вместо одной огромной и монсПосле аутентификации средствами команды LOGIN трообразной программы, пытающейся уметь все, для ремы переходим в каталог IMAP INBOX с помощью SELECT шения задачи используется набор строительных блоков, “INBOX”, при этом мы получаем количество существую- из которых и собирается почтовый сервер – быстро, кащих и еще не прочитанных сообщений. С помощью ко- чественно и надежно. манды FETCH 1:* (FLAGS) мы читаем список всех сообщений с флагами, а с помощью FETCH 1 (UID RFC822.SIZE Источники: FLAGS BODY.PEEK[]) – первое (и единственное) сообще- 1. http://en.wikipedia.org. ние. Затем мы помечаем это сообщение как прочитанное 2. http://www.faqs.org/rfcs.

28



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

Спам или антиспам: кто кого?

Алексей Коршунов В современном мире сложно найти человека, знающего, что такое e-mail и ни разу не столкнувшегося со спамом. Электронная почта и спам стали неотделимыми друг от друга понятиями.

Е

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

30

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

История развития спамерских технологий

мере, известный) из наших соотечественников – это Михаил Армалинский. В наше время, по информации спам-аналитиков лаборатории Касперского на 2005 год, спам составляет 70-80% от общего объёма почтового трафика, то есть на каждые 2-3 обычных письма приходится 7-8 спамерских. Точной цифры по ежедневному количеству рассылаемого спама, по понятным причинам, быть не может. Но цифры, озвучиваемые различными источниками, внушают опасение за будущее электронной корреспонденции, так как любая крупная компания, работающая с почтой, находится под угрозой быть просто погребённой под невообразимым количеством почтового мусора.

Родоначальницей спама можно считать рассылку от 2 мая 1978 года, когда было разослано 600 спам-сообщений для приглашения на презентацию Среда передачи DEC. С этого дня можно начинать от- Технологии рассылки спам-сообщесчёт века спам-сообщений. 12 апре- ний развивались достаточно бурно. ля 1994 года Лоренс Кантер и Марта Началось всё с обычной прямой отСигель впервые использовали спе- правки респондентам, указанным циальное программное обеспечение в поле CC и BCC. Однако этот метод для рассылки спама в конференциях быстро ушёл в историю ввиду своей USENET. Первый спамер (по крайней неэффективности.


администрирование Тёмная история RBL – средство фильтрации или помеха? В недалёком прошлом при использовании общеизвестных и доступных rbl-списков (некоторые из наиболее популярных указаны на сайте http://rbls.org) возникали проблемы с хождением почты. Сейчас крупнейшие почтовые системы (такие как mail.ru) используют собственные rbl-списки, что даёт им возможность больше не оглядываться на держателей какого-нибудь сервиса. Разумеется, есть и те, кто по сей день предпочитают общедоступные ресурсы, ведь можно выбрать тот, который наиболее вам подходит (например, только список, содержащий пространства модемных пулов провайдеров). Проблемы прохождения почты были обусловлены тем, что разные почтовые системы могли использовать неидентичные списки «чёрных адресов», хотя для возможного отказа в доставке, разумеется, хватало применения этого метода только на системе-получателе. Другими словами, две почтовые системы могли оказаться в роли своеобразных пейджеров, когда почта от пользователей системы А доходит до системы Б, а вот в обратную сторону уже нет. Так как система Б находится в какомнибудь чёрном списке, по которому проверяет отправителей система А. Причем причин, по которым система Б могла оказаться в сколь угодно большом количестве чёрных списков, было не мало. Начиная от жа-

лобы одного из пользователей сервиса rbl, заканчивая проверкой самим сервисом на Open Relay серверов, попадающих в сканируемый диапазон IP-адресов. То есть примерно по тому же принципу, как сканируют сеть поисковые системы. В некоторых случаях на исключение легальной системы из чёрного списка могло уйти от нескольких дней до месяцев. Известны так же случаи, когда администрацией какого-либо сервиса rbl заносились в базу «чёрных» вполне легальные сервера, а за исключение просили некоторую плату. После всех мытарств и приключений с rbl-сервисами, очень многие администраторы почтовых системы были вынуждены отключить использование rbl в своих системах. Пользователи были сильно недовольны «гаданием», дошла ли их корреспонденция до получателей или нет, так как далеко не все способны понять ответ сервера-получателя об отказе доставки. Да и что таить, мало кто вообще на отчёты серверов обращал внимания. Зачастую такие письма удалялись без предварительного прочтения, а уже спустя продолжительное время, когда становилось известно, что получатель письма не получил – начинались «разборы полётов». В результате чего и выяснялось, что пользователь получил некий отчёт, но не обратил на него внимания. После этого системные администраторы уже начинали выяснять причину и связываться с администраторами нуж-

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

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

№12, декабрь 2005

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

31


администрирование коров. Поэтому основным средством борьбы, в итоге, стало использование rbl-списков (Realtime Blackhole List ), содержащих перечень выявленных уязвимых серверов. Некоторым спискам, которые призваны вести учёт таких серверов, известно более 225 тысяч уязвимых систем (из них более 2500 находятся в России). Но в наше время такая цифра уже не считается огромной и составляет всего лишь 0,65% хостов-отправителей спама (по информации mail.ru). Когда вышеназванные средства стали не столь эффективны, как того хотелось бы спамерам, они нашли новое средство. Использование собственных серверов. Они покупали сервера, размещали их на площадке провайдера и занимались рассылками, используя немалую мощь оборудования телекоммуникационных компаний. Количество времени, которое отводилось спамерам для их деятельности, исчислялось лишь тем, сколько согласны были закрывать глаза на деятельность своих хостеров службы провайдера. Всё упиралось в те же жалобы от пользователей, пострадавших от действий спамеров. Но и количество спама, который был отправлен – весьма и весьма велико. Да и перенос сервера на другую площадку не составлял большой трудности. После чего можно было снова заниматься рассылкой. Однако ужесточение политики предоставления хостинга провайдерами, а также использование всё тех же rbl-листов привело к плавному уходу от такого способа рассылки спама. Использование ворованных арендованных серверов оказалось гораздо более выгодным средством для спамеров. Добытые различными средствами (нелегальными, как правило, например, методами социального инжиниринга) учётные записи владельцев легальных ресурсов давали возможность весьма продолжительного по времени использования их сервера для чёрных замыслов спамеров. Количество времени, которое требовалось для «прикрывания лавочки», могло исчисляться днями или годами. Это зависело исключительно от методов использования данного сервера – однократные рассылки с большими перерывами между ними, или многократные отправки из рассчёта максимум сейчас,

32

а потом – смена хоста. В первом слу- ные «письма счастья» и прочая корчае хозяин ресурса мог очень долго на- респонденция, автор которой сможет ходиться в неведении, да и провайдер убедить получателя переслать данне всегда реагирует на первую же поя- ное письмо другим. Их отличительная особенность – небольшой размер первившуюся претензию. Логичным продолжением исполь- воначальной рассылки. Массовость зования «ворованных» серверов ста- достигается посредством усилий сали сети «зомби-компьютеров». Бур- мих получателей, которые «покупаютное развитие вирусных технологий ся» на предложение отправить письмо и их сращивание с технологиями спа- по всей адресной книге (или, как вамеров породило обширнейшие воз- риант, по всему контакт-листу IM-пейможности. Компьютер пользователя джера). Ярким примером может слуинфицируется, после чего устанавли- жить поиск родителей нашедшеговает соединение с irc-сервом и входит ся в Таиланде мальчика в январе этов специальную «комнату» (невидимую го года. Бороться с этим видом спав общих списках и защищённую паро- ма техническими средствами практилем), созданную программным обес- чески невозможно. Кто из нас не полупечением автора вируса. Таким об- чал письма с различными вложениями разом «владелец» компьютеров-зом- от знакомых? Да и жалуются на спам би мог видеть количество инфициро- от знакомых пользователи гораздо меванных машин и, соответственно, уп- нее охотно. равлять ими, отдавая команды. В том числе на обновление вирусного кода. Содержимое спама В среде спамеров даже есть место кон- Помимо развития среды передачи, мекуренции – когда один вирус находит нялось и само содержимое сообщений. своего «коллегу», он пытается его бло- Эту мутацию естественным образом кировать и перевести управление ком- породили технологии борьбы со спапьютером на себя. Компьютеры поль- мом. В то время, как фильтры обучазователей превратились в театры во- лись распознавать всё больше видов енных действий за ресурсы незащи- спам-сообщений, спамеры придумыщённых систем. Интересно, что для вали всё больше новых ухищрений, организации канала общения виру- для того, чтобы эти фильтры обойти. Менялось содержимое письма: сов используются общедоступные ресурсы. Владельцы irc-серверов по ме-  Включения адреса получателя ре возможности (читай, обнаружения) в текст сообщения. пытаются удалить эти «комнаты», од-  Случайные последовательноснако миграция на другой сервер в ноти. (Помните сообщения в виде «Hhiiii dduuuddee. Do y.ou ne.e.d вую комнату не занимает большого коsommmmeeeething?».) личества времени. Более того, в некоторых случаях irc-сервер может быть  Фрагменты литературных произвесоздан даже на отдельно взятой индений, анекдоты. Включение части стихотворения после прайса или фицированной машине. Решением тарекламы сбивает фильтры с толку. кой проблемы может стать обычный персональный firewall, установленный  Вариативность частей письма (сона машине пользователя, блокирудержимое «полезной» части письющий любые несанкционированные ма и мусора, для одурачивания соединения с внешним миром. Однафильтров, могло меняться многоко всем нам известно, что до картикратно). ны всех компьютеров, полностью при-  Изменения текста письма по ходу крытых firewall, находящихся во всерассылки, обратная связь. Перед началом рассылки спама он провемирной сети, ещё очень далеко. Ситуация усугубляется активным внедренирялся на популярных системах. Есем высокоскоростного доступа и посли системы принимали письмо как нормальное, начиналась рассылка. тоянного соединения с всемирной сеЕсли нет – производилась модифитью, что, в свою очередь, играет на руку злоумышленникам. кация тела сообщения, пока сервеПоследнее, на что хотелось бы обры не принимали его. ратить внимание, – социальный инНекоторые изменения в текстах жиниринг. Сюда входят всевозмож-


администрирование сообщений привели даже к тому, что появилась некая новая форма языка (как в пункте два), которую многие даже понимают. Почему я делаю такой вывод? Ну обращаются же люди в компании, которые рекламируют таким образом. Не стоит забывать и спам, возникающий из-за неидеальных почтовых серверов. Имеются в виду различные отчёты. Как пример можно привести настоящий бум отчётов от антивирусов о найденном в теле письма вирусе. Разумеется, речь идёт о тех случаях, когда поле отправителя является поддельным и пользователь получает отчёты о письмах, которые в действительности не отправлял. Сюда же относятся многочисленные автоматически генерируемые отчёты о невозможности доставки сообщения получателю. Ситуация та же – поле отправителя подделано. К этому можно относиться, как к необходимой отладочной информации, если вы работаете системным администратором или являетесь продвинутым пользователем. Или же как к неизбежному, но от того не менее надоедливому «техническому» спаму, если вы руководитель или менеджер, почта которого «пестрит» отчётами о письмах, которых он не отправлял. Менялось и оформление спамписьма:  Близкие по начертанию, но разные символы. Например, буква «А» в русской и английской раскладке.  Невидимый текст в HTML.  Картинки, зашумление картинок. Если сначала фильтры научились по подсчитанной сумме выявлять одинаковые сообщения, то внесение невидимых глазу незначительных изменений избавляет от этой «проблемы».  Подделка технической части письма. Думаю, каждый хоть раз в жизни видел отчёт от SpamAssassin в виде «forged outlook header». Противостояние спамеров и антиспамерских технологий порождает всё больше новых ухищрений со стороны первых. Однако, судя по информации от спам-аналитиков лаборатории Касперского и других источников, 2005 год не дал новаторских технологий спамерам. По-видимому, их впол-

№12, декабрь 2005

не устраивает имеющийся на данный момент результат.

Фишинг Говоря о спаме, невозможно пройти мимо такого явления, как фишинг. Фишинг – это мошеннические рассылки («нигерийские письма», поддельные извещения о выигрыше и т. д.). Дословно фишинг можно перевести как “ловля на удочку”. Как правило, такие письма призывают совершить какое-то действие (например, пройти по ссылке или просто заплатить деньги), но не за нечто реальное, как в случае рекламного спама, а за нечто несуществующее. Целью фишинг-рассылок являются персональные данные пользователя (логины, пароли, пин-коды, номера кредитных карт и тому подобное). В дальнейшем, как не сложно догадаться, эти данные используются злоумышленниками для получения возможной наживы. Как правило, фишинговые письма весьма талантливо имитируют настоящие сообщения реально существующих организаций. Наиболее часто они пародируют различные платёжные системы (ebay, paypal). В таких письмах содержится ссылка, пройдя по которой, потенциальная жертва попадает на поддельную страницу, специально изготовленную мошенником. Страница выглядит как реально существующая на сайте компании, от имени которой было отправлено письмо. На фальшивом сайте под тем или иным предлогом жертве предлагается ввести свои личные данные для авторизации. Как итог – личная информация посетителя попадает в базы мошенников. Если верить статистике из разных источников, фишинг пока что не является чрезмерно опасным явлением. На данный момент даже «писем счастья» пользователям приходит значительно больше, чем фишинговых сообщений. Однако, наиболее вероятно, что такое положение дел временное. Индустрия фишинга в России ещё не доросла до таких «поставленных на рельсы» механизмов, как реальный спам. Сейчас энтузиасты только обкатывают новые технологии на рунетовских пользователях. Но, по прогнозам mail.ru, уже к 2006-2007 году доля такого спама окажется на уровне, соиз-

меримом с уровнем рекламного спама. Не стоит забывать и о том, что каждое фишинговое письмо потенциально способно причинить в сотни раз больший ущерб (в случае успешного «облапошивания» получателя), чем тысячи сообщений обычного рекламного спама. Если потери от чтения рекламы можно свести к трафику и затратам времени на его отсеивание, то потери от фишинга могут быть поистине фатальными для финансового положения «попавшегося» пользователя. К сожалению, есть достаточно много факторов, затрудняющих борьбу с фишингом, то есть при одинаковом допустимом проценте ложных срабатываний любая современная антиспам-система пропустит меньше рекламных сообщений, чем фишинговых. Историю фишинга, скорее всего, следует начинать с середины 90-х годов. Тогда в компании AOL были сильно распространены сообщения, подписанные якобы администрацией. В этих сообщениях предлагали (объясняя это разными причинами) прислать пароль от своего аккаунта, который в противном случае угрожали закрыть. Разумеется, со временем до пользователей довели информацию, что пароли в письмах не запрашиваются и не отсылаются, поэтому эффективность этого метода стала стремиться к нулю. Однако новая уловка мошенников не заставила себя долго ждать. Немного изменив содержимое писем, они стали сообщать о каком-либо событии на сервере (например, PayPal), требующем от пользователя некой реакции. В теле сообщения была ссылка, которая, как уже было сказано выше, вела на поддельную страницу легального сайта. Где ничего не подозревающие пользователи и оставляли свои персональные данные, так как мало кто привык смотреть в адресную строку браузера. (Я лично несколько раз наблюдал, что у некоторых пользователей адресная строка вообще скрыта. На мой вопрос, как они работают, был дан гениальный ответ – я сам(а) ничего не набираю, только ссылки открываю.) На этом возможные злоключения пользователей могли не закончиться, потому что на поддельной странице мог оказаться троян, который впоследствии «высасывал» из компьютера все пароли и учётные запи-

33


администрирование си. Последствия представить не со- Как вы можете догадаться, если «лоставляет труда. пух» выдавал учётную запись «богачу», Однако время шло, пользова- то свои средства с этого счёта он уже тели стали больше внимания уде- больше никогда не видел. В России в роли «нигирейских чилять тому, на чьём сайте они находятся и вводят персональные дан- новников» выступают члены правленые. Тогда злоумышленники проде- ния ЮКОСа, Ходорковский и прочие лали путь от бесплатного хостинга не менее популярные (и богатые) лич(вида paypal.narod.ru) до ухищрений ности. К сожалению, как показывает с адресной строкой. Например, url вида практика, доверчивые и жадные до хаhttp://www.paypal.com@somesite.com. лявы находятся. На руку злодеям играли и уязвимосПоследним писком моды у спамети наиболее популярного браузера ров являются мошеннические «пись(Internet Explorer). Так, например, од- ма счастья». Самым ярким примером на из его версий позволяла скрыть такого спама была недавняя эпидемия весь адрес после «собаки». Догадать- Golden Stream. Наверное, все видели ся о подмене в таком случае станови- письмо, которое начиналось со слов лось значительно сложнее и зачас- «Это НЕ спам, а действительно выгодтую слишком поздно. В наше время ное предложение...». В последующем такая адресация запрещена в IE и вы- тексте объяснялась простейшая пиразывает специальное предупреждение мидальная схема – вам предлагалось в Mozilla Firefox. заплатить 100 рублей автору письма, К сожалению, даже в наше время а потом переслать это письмо дальше, в России работают старые уловки 90-х получив от каждого получателя по 100 годов. Например, зарегестрировав поч- рублей. Как итог обещалось полное товый адрес mail.ru.admin@mail.ru и ра- счастье и всеобщее обогащение. Осозослав пару сотен сообщений с пред- бенностью рассылки является прямое ложением «активации почтового ящи- вымогание денег и эффективность прока», всё ещё можно получить несколь- бивания фильтров «письмами счастья». ко ответов с персональными данны- К слову сказать, рассылка «писем счасми пользователей. А ведь контроль тья» не избежала и систем мгновеннонад почтой даёт весьма обширные го обмена сообщениями типа icq. Часвозможности по извлечению с его то можно встретить сообщения вида: помощью и других учётных записей «Привет. UIN такой-то рассылает ви(например, через различные службы русы! Не добавляй его в контакт-лист напоминания забытых паролей). Ра- и сообщи всем своим знакомым!!!» зумеется, это сработает только если Как показывает практика, остаётся доукрадена учётная информация основ- бавить в тело сообщения ссылку с текного ящика пользователя. стом вроде: «На всякий случай, лекарсВозможные варианты фишинга ог- тво от вируса находится здесь URL.» раничиваются только фантазией зло- и, пожалуйста, – готова почва для весьумышленника и невнимательностью ма обширного инфицирования. Разумепользователей. Простор огромный, ется, не все откликнутся на такие сооба уровень компьютерной грамотности щения, но учитывая широкие контактвсё ещё оставляет желать лучшего. листы современного пользователя ИнОдной из популярных схем мощен- тернета – и 10% отреагировавших хваничества были так называемые «ниге- тит для начала эпидемии. рийские письма». Своё название они получили по первому зарегестриро- Развитие антиспамерских ванному случаю в Нигерии. Суть их технологий сводится к тому, что якобы некий высо- Разумеется, в то время, когда спамекопоставленный чиновник (видный де- ры придумывали всё новые и новые ятель, актёр, криминальный деятель) возможности обмануть пользоватесумел сделать себе немалое состо- лей и программные фильтры почтовых яние, но теперь стоит перед пробле- систем, антиспамеры также не сидели мой вывоза капитала из страны. Для без дела. Был пройден значительный отмывания денег (разумеется, за боль- путь от банального ограничения бесшие комиссионные) ему нужен бан- контрольной пересылки почты через ковский счёт какого-нибудь «лопуха». любой сервер до установки хитрых

34

систем анализа и фильтрации контента сообщений. Современные системы борьбы со спамом используют комплексные инструменты для отсева спама без ущерба для нормальной почты. Это и занесение в чёрные списки сетей, в которых, как заведомо известно, не могут находиться легальные почтовые сервера (например, dial-up и dsl-диапазоны IP-адресов провайдеров), и bayes-технологии, и белые списки, работающие по принципу повтора почтовых адресов. Считается, что если письмо приходит с адреса, находящегося в адресной книге получателя или адреса, на который получатель сам отправил несколько писем, – оно не может быть спамом. И прочие новые технологии, появляющиеся, если и не каждый месяц, то каждые полгода-год точно. Во всяком случае их преподносят, как новые. Но не на все ухищрения можно найти технологическую управу. Если те же «нигерийские письма» можно фильтровать известными средствами с весьма большим успехом (применяя весь арсенал – от чёрных списков, лингвистического анализа до сравнения с известными образцами), получая на выходе хороший процент отсева. То с «письмами счастья» всё далеко не так просто. Те же самые белые списки, о которых говорится выше, начинают играть «против» антиспамовых систем. Причины, думаю, понятны. Проблемы возникают от сугубо технических до морально-этических. Например, нельзя поместить в чёрный список адрес отправителя, переславшего письмо счастья только на этом основании, ведь он и нормальную корреспонденцию пишет. В таких случаях помогает только активное проведение ликбеза, но кто же будет этим заниматься? В пределах одной организации это может быть и реально, а в пределах mail.ru, yandex.ru, gmail.com? У разных антиспам-систем разный подход и свои технические решения, но их описание заняло бы ещё несколько полос и выходит за рамки статьи.

Состояние спама на 2005 год По информации спам-аналитиков лаборатории Касперского 2005 год при-


администрирование нёс стабилизацию спама по части го подражания западным «коллегам» редко называют рупором мирового объёмов рассылок и доходов, полу- и приспособился к рунету. Спамеры терроризма. чаемых от спам-рекламы. Однако на- начали активно предлагать услуги ращивание темпа всё же составляет по недвижимости, полиграфическую Прогнозы на будущее продукцию и услуги, крупную быто- В 2006 году ожидается в первую оче5-6% в год. Стабилизация объёмов спама обус- вую технику, различные другие услуги редь последующее увеличение колиловлена близостью к границе, за ко- (например, услуги грузчиков). В запад- чества спама. Спамеры, скорее всеторой целесообразность использова- ном спаме таких предложений практи- го, станут умнее. Так как сейчас прония электронной почты как средства чески нет, так как они не находят от- исходит повсеместный отказ почтовых коммуникации находится под сомне- клика у аудитории. серверов от принятия почты с DSL-пуНастораживает явная криминали- лов провайдеров, то и использование нием. Всё чаще отправителю сообщения приходится уведомлять получате- зация спама. Всё больше и больше мо- зомби-машин для отсылки сообщений ля о факте отправки или же контроли- шеннических предложений попадает напрямую на сервера станет неэффекровать процесс доставки сообщения, в ящики пользователей. Наиболее из- тивным. Вместо этого, наиболее веротак как выкинуть нужное письмо, за- вестные и обсуждаемые сейчас виды – ятно, начнут использоваться smtp-протерявшееся в полусотне спам-сооб- фишинг и фарминг. (Суть фарминга вадейров, настроенных пользователясводится к автоматическому перена- ми инфицированных машин. щений, не составляет труда. Экономическая эффективность правлению пользователей на фальОжидается и увеличение доли «ручэлектронной почты снижается, пос- шивые сайты. В отличие от фишин- ного» спама за счёт растущей популяркольку спам наносит существенный га новый метод хищения данных поч- ности фишинга и за счёт использоваущерб пользователям почты. Легко ти не требует участия потенциальной ния тех же технологий «писем счастья» представить работника, получающе- жертвы.) Очевидно, что спам как биз- в рекламном спаме. «Ручной» спам пого почту без предварительной её филь- нес криминализируется. Об этом го- лучил своё название от способа его оттрации и тратящего на её просмотр ворит и слияние спамерских и хакер- правки «вручную» без использования половину рабочего дня. А это означа- ских технологий. Современное про- специализированного спамерского ет снижение производительности со- граммное обеспечение спамера вклю- программного обеспечения. Технология отказа от сообщений трудника и убытки для работодателя. чает в себя специальные модули, позНе говоря уже о том, что, учитывая сто- воляющие производить рассылки че- с DSL-блоков станет повсеместной. имость трафика в регионах, некоторые рез инфицированные троянами маши- По прогнозам, эпоха такого спама закомпании вынуждены терпеть боль- ны пользователей, то есть изначально кончится в 2006-2007 году. Использование вирусами smtp-прошие финансовые потери из-за беспо- рассчитано на взаимодействие с тролезного по сути трафика, генерируе- янской частью. вайдеров, настроенных пользователяЗа последние два года мы име- ми, скорее всего, приведёт в свою очемого спам-сообщениями. На конференции «Проблема спама ли возможноть убедиться, что спам редь к ужесточению политики провайи её решения» основными тенденция- превращается в мощное оружие по- деров на отправку сообщений пользоми спама за 2005 год были названы: литических игр и инструмент влияния вателями. Возможно, провайдеры при Стабилизация количества и тема- на общественное сознание. По «зо- мут решение на установку контентной тик спама. не покрытия» и эффективности спам фильтрации, так как в случае бездейс Тематическое и техническое раз- вполне сопоставим с телевизионной твия они рискуют оказаться в чёрных деление спама на разные геозоны рекламой, однако значительно дешев- списках большинства систем, что вряд Интернета (рунет и «западный» Ин- ле обходится. Разумеется, при усло- ли обрадует пользователей. Дальнейшее развитие спам-бизнеса тернет). вии, что подобный спам обошёл антиспам фильтры. Агитационные листов- может закончиться как угодно. Вплоть  Криминализация спама.  Использование спама как инстру- ки больше не ограничены своими бу- до того, что в какой-то момент будет примента информационных и полити- мажными носителями и мигрировали нято решение об оплате каждого элекв мир цифровой. ческих войн. тронного сообщения (на манер марок В 2005 году лабораторией Каспер- бумажной почты) или введения ценза В 2005 году наметилось явное раз- ского был зафиксирован новый тип на почтовую переписку с тотальным её граничение спама для западных полу- «политического» спама. Речь идёт контролем. Вполне возможно, что это чателей и русскоязычных. Спам для о спамерских кампаниях, направлен- окажется закатом электронной почты, русских эволюционировал от прямо- ных на формирование необходимо- как основного средства коммуникации го общественного мнения по вопро- в Интернете. Есть ещё и другие фактоЛидеры спамерских рассылок в этом сам внутренней политики государс- ры, такие как криминализация и политигоду тва. Эти спам-атаки отличает хоро- зация спам-индустрии и перевешивание Приглашения на семинары и курсы 14% шая спланированность. Примером та- криминальной части спама по сравнеПредложения «для взрослых» 12% кой информационной кампании мо- нию с его рекламной составляющей. Компьютерное мошенничество 11% При подготовке статьи использожет служить спам со ссылками на неПредложение лекарственных препаратов 9% безызвестный сайт «Кавказ-центр», ваны материалы с конференции «ПроДешёвый софт 7% который российские спец-службы не- блемы спама и её решения».

№12, декабрь 2005

35


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

IСQ: разрешить нельзя запретить

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

У

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

36

ты среди персонала есть возможность потерять кадры, также не стоит забывать закон Нейсдра, что «можно сделать защиту от дурака, но только от неизобретательного». Средств по обходу «закрытой ICQ» на сегодня масса и постоянно придумываются новые. Так, если вы закрыли стандартный для ICQ порт 5190, то программа, путём небольших усилий, без проблем умеет работать по другим портам. Если вы закрыли доступ к основным серверам, то всегда можно найти альтернативные, либо воспользоваться прокси. Если же вы закрыли доступ к прокси на обычных портах, то пользователь может использовать какой-нибудь CGI-proxy [1-3], установленный добрым дядей на далёком сервере. Если есть удалённый хостинг


администрирование с Perl, то можно сделать ICQ самому (http://www.gonzo.kiev.ua/projects/vicq), но это не так просто как воспользоваться готовым веб-сайтом, поддерживающим общение по ICQ. Именно по ICQ, а не только между пользователями сайта. До последнего времени работал веб-проект www.aska.ru, для того чтобы воспользоваться своей ICQ, надо было просто зайти на этот сайт и ввести свой логин и пароль. Сегодня работающим проектом является http://911.ru. Воспользоваться им под силу даже персоналу, далёкому от техники. Аналогичный сервис под названием icq2go есть и на официальном сайте ICQ. Если официальный сайт можно постараться закрыть, то не стоит думать, что если закрыли ICQ на всех портах, то и закроют все известные веб-ICQ, а также будут постоянно отслеживать появление новых. Практика жизни показывает, что это не так даже в банках. В дело вступает человеческий фактор. Дотошных админов, закрывающих аськи, нет по той причине, что все они получают либо небольшую, либо конечную зарплату, в то время как у них обычно полно других дел. Однако следует хорошо понимать, что уж если кто-то необоснованно чем-то насолил админу, то он скорее из принципа, с особой тщательностью и забесплатно, выполнит указание руководства и всё закроет по максимуму. Другие подобные сайты появляются постоянно и регулярно и так будет и дальше, поскольку это хорошая возможность привлечь посетителей на свой сайт, чтобы показывать баннеры и зарабатывать на этом деньги. Например, на момент написания статьи веб-ICQ можно было найти на http://www.domeni.info, http://www. riska.ru/modules.php?name=web_icq и др. При этом, если эти сайты окажутся закрыты, то к ним также можно обращаться через всякие анонимайзеры и cgi-proxy, которые аналогично «множатся и дохнут как мухи». В общем, это скорее философский вопрос борьбы оружия и брони. Для наглядности подытожим всё вышенаписанное в виде таблицы. Как видно, принять однозначное решение, где поставить запятую в заголовке, сложно. Я не хочу склонять

№12, декабрь 2005

Таблица. Основные доводы «за» и «против» использования ICQ Разрешить ICQ

Запретить ICQ

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

«+»: Сотрудники не будут отвлекаться от работы. «-»: Угроза безопасности: есть вероятность появления «левых» шлюзов в Интернет, в обход основного канала. «-»: Повышение уровня занятости телефонных линий и рост расходов на связь. «-»: Не популярная мера. «-»: Больше времени тратится на общение с труднодоступными и удалёнными партнёрами. «-»: Психологический момент запрета для тех, кто привык пользоваться. «-»: Затраты времени сотрудников на обдумывание вопроса «Как обмануть систему?». «-»: Есть небольшая вероятность увольнения сотрудников.

вас к выбору того или иного решения, часть на том же сервере, которая, масведь у вас могут быть и другие влия- кируясь под того или иного пользоватетельные факторы, однако я хотел бы ля, подключалась бы к настоящим серпредложить два возможных варианта верам от его имени. При этом клиентрешения проблемы. ская часть могла бы получать сообщеПервый вариант более интересный, ния и помещать их во внутреннюю БД, но в то же время более сложный, поэ- делая их доступными для внутреннетому я про него расскажу лишь толь- го пользования. Также она бы могла ко в качестве идеи с задатком на воз- отправлять сообщения во внешний мир. Клиентов, в том числе и распроможную будущую реализацию. Второй вариант решения пробле- страняемых под лицензией GNU Public мы попроще, его практическое реше- License, множество. Значит, реалиние мы сегодня рассмотрим. зация этой идеи лишь дело времени и желания. Теперь, если предположить что Интерактивный идея реализовалась и мы имеем рабофильтрующий ICQ-прокси-сервер чий ICQ-прокси-сервер, то почему мы Не помню, как давно я попал на стра- не можем сделать на нём фильтрацию ничку Александра Шутко с его проек- сообщений (см. рис. 1)? Руководитель, отвечающий за то, том IServerd [4] по созданию ICQ-сервера на базе Linux/*BSD с хранени- кому можно пользоваться ICQ, а кому ем всех сообщений в БД PostgreSQL, нет, через специальную форму админо именно в тот момент я понял, на- нистрирования в определённую табсколько этот проект интересен и куда личку БД прописывает разрешённые его можно развить. Как мне кажется, ICQ-контакты. Например, для польна базе данного проекта сделать пред- зователей отдела бухгалтерии, колагаемую реализацию будет гораздо му с кем можно общаться. Также пропроще. Также на сайте [4] имеется до- писываются разрешённые контакты статочно информации по протоколам для каждого ICQ-пользователя из отICQ и всем с ними связанным. дела продаж, с кем они могут общатьЕсли можно сделать свой собствен- ся, аналогично и для всех остальных ный сервер ICQ и обязать пользовате- отделов. Если пользователю по доллей оправлять сообщения через него, гу службы нужна ICQ, то с разрешёнто почему нельзя сделать клиентскую ными контактами работа идёт в про-

Рисунок 1. Схема фильтрации сообщений

37


администрирование зрачном режиме без каких-либо проблем. В то же время, общение с другими (не разрешёнными) пользователями фильтруется. А чтобы сообщения не терялись, сервер может высылать ответные сообщения о недоставке внешним пользователям. Например: «Ваше сообщение «.....», отправленное пользователю Ivanov нашей сети, не было доставлено, так как общение по ICQ в рабочее время на фирме XXXXX запрещено решением руководства №148 от 29.09.2005». Внутренним пользователям может выдаваться сообщение другого содержания, например «Общение с пользователем ICQ 32323232 вам запрещено, если общение вам необходимо по работе – обратитесь к начальнику IT-отдела для получения разрешения». Как вариант, можно сделать временные рамки, когда будет работать фильтрация, скажем с 9 до 18. Можно даже учесть обеденный перерыв. А фильтруемые сообщения разумнее не выбрасывать, а сохранять в буфер, чтобы их можно было получить в разрешённый для работы интервал времени. Как появится возможность, планирую создать проект и заняться реализацией задуманного. Даже если меня кто-то опередит и создаст свой проект раньше, то пишите, я с удовольствием стану его участником. Форум журнала (http://samag.ru/cgi-bin/yabb/YaBB.pl) – отличное место для старта описанной идеи.

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

38

Рисунок 2. Нормальное распределение. «Всплески» превышающие утроенное средне квадратическое отклонение можно считать практически невозможными [18]

бывает), а скорее из разумности и носят статистический характер. Как бы мы ни хотели, но от теории вероятностей и нормального распределения нам никуда не уйти потому как это наша жизнь. Мы, люди – «аналоговые существа», а не цифровые компьютеры с нулями и единицами. Хотя, насколько компьютеры цифровые можно поспорить, для этого достаточно посмотреть на нечёткую логику, нейронные сети и на те же «прямоугольные» тактовые импульсы в увеличении и убедиться, что они никакие не прямоугольные, как это принято считать при первом приближении. Нельзя нам сказать «0», то есть «нет», достаточно вспомнить известную русскую поговорку «если нельзя, но очень хочется, то можно», чем вам не иллюстрация выбросов за пределы интервала в три сигма при нормальном распределении (см. рис. 2)? Причём избежать или защититься от этих выбросов вы вряд ли сможете, потому как в теории существует не нулевая вероятность очень больших отклонений. И тут уже сложно предугадать, кто окажется сильнее, вы или выброс. Если вы начальник, то не надо безумствовать, закручивая гайки при принятии своих решений, рано или поздно вы можете столкнуться с тем, что вы пытаетесь сжать жидкость, которая, как известно из курса общей физики, плохо поддаётся сжатию. Скорее всего, протечёт в другом месте. Например, нет гарантии, что какой-нибудь продвинутый пользователь не подключит к своему компьютеру телефон Sky-Link или GPRS с целью обойти ваш запрет по ICQ и тогда ваши чрезмерные усилия приведут к появлению лишнего шлюза из глобальной сети в локальную, что вряд ли одобрит служба безопасности фирмы. Никто в жизни не будет закрывать выпускной клапан у скороварки, так как

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

Чем лучше хватать ICQ-сообщения? Я не хочу обсуждать вопросы этичности, морали, тайны переписки и законности, каждый на эту тему пусть подумает самостоятельно, но программ, реализующих перехват и показ ICQ сообщений на сегодня существует множество. Вот лишь ссылки [5-9] на некоторые наиболее популярные из них. Из массы просмотренных программ не подошла ни одна по тем или иным причинам. Почти все программы работают под Windows и не имеют исходных текстов, то есть что-то подправить и настроить под собственные запросы будет сложно. Помимо этого, многие программы коммерческие, а их «триальные» и урезанные версии не самое лучшее решение. Перехватчиков много по той причине, что все хотят заработать на этом денег, а написать такую программу специалисту не очень сложно. ICQ-сообщения передаются по сети в открытом виде, поэтому даже вы у себя можете поставить эксперимент. Взять сетевой сниффер под любую операционную систему и запустить его, чтобы он перехватывал пакеты целиком, а не только заголовки. Далее, просто просматривая всё перехваченное гла-


администрирование зами, вы быстро найдёте читаемый текст сообщений среди прочего нечитаемого мусора. Фактически все программы, делающие перехват ICQ-сообщений, просматривают данные за вас, находят сообщения и выводят вам их в красивых окошках и табличках. Иногда эти функции дополняются некоторым удобным сервисом вроде поиска, фильтрации и пр. Даже если «менюшечный» сервис очень удобен, выделять отдельный компьютер для просмотра ICQ-сообщений – это дорого, поэтому проще всего перехватывать их на шлюзе. А шлюзы обычно делают на FreeBSD или Linux, поэтому для нашей задачи надо найти что-то более подходящее, с открытым кодом, желательно под лицензией GPL и умеющее работать с базами данных. Не желая писать программу, я занялся поиском, и единственное наиболее удачное, что я нашёл в сети, – это проект AIM Sniff [10] (автор Shawn Grimes). Поскольку ICQ была выкуплена фирмой America Online (AOL), то используемый в последних версиях ICQ протокол OSCAR (Open System for Communication in Realtime) и протокол AIM, как братья-близнецы, очень похожи, если не сказать, что это почти одно и то же, поэтому слово AIM не должно вас пугать. На сегодня AIM Sniff – это живой проект, с автором которого можно связаться по почте. На сайте имеется действующий форум, где не очень бурно обсуждаются различные проблемы проекта.

Реализация с помощью AIM Sniff AIM Sniff, если говорить о версии 0.9d, – это небольшая (~43 Кб) программа на Perl – aimSniff.pl +6 дополнительных файлов:  ChangeLog – изменения в версиях.  README – документация и информация об установке;  aimsniff.config – шаблон конфигурационного файла.  install.pl – программа, помогающая автоматизировать процесс установки AIM Sniff и необходимых для него модулей (можно обойтись и без неё).  rc.aimsniff – скрипт автоматизации запуска для помещения в /etc/rc.d/init.d.  table.struct – SQL-файл, создающий необходимую структуру таблиц в БД MySQL. Несмотря на кажущуюся первоначальную простоту, для успешного запуска потребуются, естественно, язык Perl, библиотека pcap (libpcap.tar.Z) и установленные модули:  Net::Pcap  DBD::mysql  NetPacket::Ethernet  Unicode::String  NetPacket::IP  Proc::Daemon  NetPacket::TCP  Proc::Simple  NetPacket::UDP  Unix::Syslog  DBI Все эти модули в процессе инсталляции могут быть установлены автоматически, если использовать install. pl. Однако я с неохотой доверяю подобным непроверенным средствам, так как не редки случаи сбоев, и предпочитаю ставить всё «руками», поэтапно решая задачу и более глубоко вникая в то, что происходит. Предполагая, что perl у вас скорее всего стоит, не будем рассматривать его установку, а рассмотрим ссылки, где можно

№12, декабрь 2005

взять всё остальное. Библиотеку pcap можно скачать тут: ftp://ftp.ee.lbl.gov/libpcap.tar.Z. Все остальные perl-модули стоит искать на http://search.cpan.org, вводя их имена в окошке для поиска. В результате поисков получаем конечные ссылки для скачивания:  http://search.cpan.org/CPAN/authors/id/T/TI/TIMPOTTER/ Net-Pcap-0.04.tar.gz  http://search.cpan.org/CPAN/authors/id/A/AT/ATRAK/ NetPacket-0.04.tar.gz  http://search.cpan.org/CPAN/authors/id/G/GA/GAAS/ Unicode-String-2.07.tar.gz  http://search.cpan.org/CPAN/authors/id/E/EH/EHOOD/ProcDaemon-0.03.tar.gz  http://search.cpan.org/CPAN/authors/id/M/MS/MSCHILLI/ Proc-Simple-1.21.tar.gz  h t t p : / / s e a r c h . c p a n . o r g / C PA N / a u t h o r s / i d / M / M H / MHARNISCH/Syslog-0.97.tar.gz  http://search.cpan.org/CPAN/authors/id/C/CA/CAPTTOFU/ DBD-mysql-3.0002.tar.gz Если вы решите сделать «по-своему» и не делать вывод в БД, то можете модуль DBD::mysql не скачивать и не ставить. Ставим libpcap.tar.Z., для этого распаковываем архив, например, в директорию /progi: # cat libpcap.tar.Z|tar -xvz -C /progi

Заходим внутрь: # cd /progi/libpcap-0.4

Запускаем конфигурирование и создание Makefile под вашу систему: # ./configure

Запускаем компиляцию: # make

Устанавливаем скомпилированное: # make install

Далее ставим модули. Каждый модуль аналогичным образом распаковываем: # cat файл_архива_модуля.tar.gz|tar -xvz -C /progi

Заходим внутрь: # cd /progi/директория_модуля

Запускаем конфигурирование и создание Makefile под вашу систему: # perl Makefile.PL

39


администрирование нацию. После чего адаптация их программ под наши задачи кажется делом пустяковым. # make С учётом того, что Shawn Grimes согласился разместить у себя на страничке http://www.aimsniff.com/downloads.html модифицированный aimSniff.pl, не имеет смысл рассказыКак вариант можно запустить тесты: вать о том, что и как было исправлено, поэтому просто ска# make test чиваем «Cyrillic Patched AIM Sniff». Распаковываем архив и используем вместо aimSniff.pl файл aimSniff.Cyr.pl. Если же однако смысла особого в этом нет, потому как у меня неко- кому-то интересно, какие были внесены изменения, и есть торые тесты не прошли, а программа работала правильно. желание присоединиться к проекту, то добро пожаловать Чтобы не тратить время, сразу после компиляции устанав- на форум сайта. Замечание. На момент написания статьи случайно выливаем скомпилированные модули: яснилось, что небольшой процент русских сообщений не# make install правильно декодируется. Скорее всего, к выходу журнала из печати эта проблема будет уже решена. После того как все модули установлены, можно попытаться запустить файл aimSniff.pl, если все модули стоят, Тестовый запуск то он успешно запустится и начнёт перехватывать пакеты, Как сказано в README, пробуем запустить программу если же чего-то не стоит, то вы увидите сообщение об ошиб- в тестовом режиме: ке, что-то вроде: Запускаем компиляцию:

# ./aimSniff.pl Can’t locate NetPacket/Ethernet.pm in @INC (@INC contains: /usr/lib/perl5/5.6.1/i386-linux /usr/lib/perl5/5.6.1 /usr/lib/perl5/site_perl/5.6.1/i386-linux /usr/lib/perl5/site_perl/5.6.1 /usr/lib/perl5/site_perl /usr/lib/perl5/vendor_perl/5.6.1/i386-linux /usr/lib/perl5/vendor_perl/5.6.1 /usr/lib/perl5/vendor_perl .) at ./aimSniff.pl line 37. BEGIN failed--compilation aborted at ./aimSniff.pl line 37.

или # ./aimSniff.pl Can’t locate Unicode/String.pm in @INC (@INC contains: /usr/lib/perl5/5.6.1/i386-linux /usr/lib/perl5/5.6.1 /usr/lib/perl5/site_perl/5.6.1/i386-linux /usr/lib/perl5/site_perl/5.6.1 /usr/lib/perl5/site_perl /usr/lib/perl5/vendor_perl/5.6.1/i386-linux /usr/lib/perl5/vendor_perl/5.6.1 /usr/lib/perl5/vendor_perl .) at ./aimSniff.pl line 42. BEGIN failed--compilation aborted at ./aimSniff.pl line 42.

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

# ./aimSniff.Cyr.pl -nodb

Возможно, будет проще отдельно на шлюзе временно запустить сниффер, который скинет в файл часть трафика: # tcpdump -s 10000 -i eth0 src or dst port 5190 ↵ -w /path/traffic_dump.bin

(Учитывая, что MTU обычно 1500, snap length(ключ -s) в 10000 может показаться большим, но тут от этого явно хуже не будет.) после файл дампа переписать на компьютер с AIM Sniff и запустить команду: # ./aimSniff.Cyr.pl --nodb -r=traffic_dump.bin

вы должны увидеть не экране перехваченные сообщения в читаемом виде. При желании сообщения можно перенаправить в текстовый файл, например: # ./aimSniff.Cyr.pl --nodb>>/var/www/html/icq_messages_log.txt

А этот файл уже можно скачивать и просматривать с помощью веб-сервера и браузера. Однако несмотря на то, что в текстовом файле можно делать поиск, на мой взгляд, лучше сообщения сохранять в базу данных, где при грамотной организации возможности по работе с сообщениBeginning Sniff... ями намного шире. FILTER: port 5190 Если тестовый запуск прошёл успешно, то, возможно, то это лишь только половина успеха, потому как пользова- имеет смысл скопировать файл aimSniff.Cyr.pl в директорию тели зарубежной части Интернета часто и не знают о су- /usr/local/bin и запускать его в дальнейшем оттуда. ществовании великого и могучего русского языка, не говоря уже о наших изобретательных админах, талантливых Запись сообщений в базу данных программистах и прочих специалистах. Если в своё время AIM Sniff умеет работать с СУБД MySQL [15-17]. Предполамы подковали их блоху, а наши космонавты умудрились гаю, эта СУБД у вас уже установлена. починить американский космический корабль за два часа, Для организации сохранения в базу данных необходикоторый, по словам американцев, они не смогли починить мо сделать три вещи: за два месяца, с помощью «молотка, зубила и какой-то ма- 1. Создать базу данных aimsniff с необходимой структурой таблиц. тери», то от этого начинаешь чувствовать гордость за нашу ############################# AIM Sniff v. 0.9d Developed by: Shawn Grimes #############################

40


администрирование 2. Создать учётную запись пользователя для работы с БД aimsniff, установить ей пароль и дать соответствующие права. 3. Прописать настройки в конфигурационный файл, чтобы не вводить их каждый раз в командной строчке. Первая делается довольно просто, с консоли компьютера, где установлена СУБД MySQL, запускаем две команды: # mysqladmin create aimsniff # mysql aimsniff < table.struct

Третье, конфигурационный файл не обязателен, но его использование упрощает жизнь, хотя он и является потенциально уязвимым местом в том случае, если там будут храниться пароли к БД. Проще всего воспользоваться шаблоном aimsniff.config. Если у вас есть возможность – напишите этот файл с нуля, потому как шаблон «кривой». Если же набирать лень – найдите утилиту dos2unix и с её помощью исправьте символы перевода строк с «0D 0A» на «0A»: # dos2unix -n aimsniff.config aimsniff.conf

В результате, вначале будет создана БД aimsniff, а затем в ней четыре таблицы:  buddies  logs  handles  versions

Если у вас нет под рукой dos2unix, возможно, вас выручит команда tr. В остальном шаблон очень простой и маленький (менее одного экрана), поэтому заполнить все параметры, в том числе и относящиеся к БД: host, user, password, database, Если у вас БД находится под паролем, то вторая ко- nodb, должно быть не сложно даже при отсутствии комманда будет: ментариев. После проделанных шагов AIM Sniff можно запускать # mysql -D aimsniff -u root -p ↵ командой: [пароль_root_в_СУБД_MySQL]< table.struct

Пароль можно ввести как с консоли, так и в командной строчке. Подключившись к БД, мы можем увидеть, что структура таблиц не очень сложная: # mysql -D aimsniff -u root -p mysql> describe имя_таблицы;

# /usr/local/bin/aimSniff.Cyr.pl ↵ -C=/путь/конфигурационный_файл.conf

Для постоянной работы программы это не очень удобно, потому как занимается консоль. Можно, конечно, запустить команду со знаком «&» в конце (повесив процесс выполняться в фоновом режиме) и «nohup» перед ней (на случай если вы соберётесь вдруг закрыть консоль) или даже запустить программу в режиме демона, указав ключ -D, но это не спасёт вас от сбоев и перезагрузок. Сбои надо отслеживать отдельно, например, написав небольшой скрипт и организовав его запуск через crontab. Этого мы делать не будем, а вот как организовать автоматический останов и запуск программы, рассмотрим ниже.

Автоматический запуск Изобретать велосипед не придётся, воспользуемся стандартной системой многоуровневой загрузки, взятой из UNIX System V и используемой в RedHat Linux, Fedora Core и других дистрибутивах Linux. Для этого поместим файл rc.aimsniff в /etc/rc.d/init.d, переименовав в aimsniff: # cp /progi/aimsniff-0.9d/rc.aimsniff /etc/rc.d/init.d/aimsniff

Установим атрибут выполнимости # chmod +x /etc/rc.d/init.d/aimsniff

Второй момент решается средствами СУБД при помощи следующей команды: mysql> GRANT ALL ON aimsniff.* TO aimsniff@hotsname ↵ IDENTIFIED BY 'пароль_к_БД_aimsniff';

где hostname – имя хоста, с которого будет осуществляться обращение к БД, скорее всего, у вас это будет localhost. Также не забудьте дать команду: mysql> FLUSH PRIVILEGES;

чтобы изменения сразу вступили в силу.

№12, декабрь 2005

Далее, в зависимости от того, где у вас находится программа и её конфигурационный файл, правим в нём строку запуска: /usr/local/bin/aimSniff.Cyr.pl -C=/usr/local/etc/aimsniff.conf

После чего запуск можно осуществлять командами: # /etc/rc.d/init.d/aimsniff start

или

41


администрирование # service aimsniff start

а для остановки можно использовать те же команды с параметром stop. Далее необходимо сделать ссылки для требуемых уровней загрузки. Если вы использовали install.pl для установки, последующие процедуры вам всё равно придётся проделать руками. # ln -s ../init.d/aimsniff /etc/rc.d/rc3.d/S89aimsniff # ln -s ../init.d/aimsniff /etc/rc.d/rc0.d/K10aimsniff # ln -s ../init.d/aimsniff /etc/rc.d/rc6.d/K10aimsniff

Цифры 89 и 10 у вас могут быть другими. В моём случае они выбраны из тех соображений, что у меня СУБД MySQL и AIM Sniff расположены на одной машине, поэтому есть файлы S78mysqld и K12mysqld, отвечающие за запуск и останов MySQL. Получается: 10<12, а 89>78, то есть запуск AIM Sniff будет выполняться после того как стартовала база данных, а останов, наоборот, раньше. В результате создания ссылок, система записи сообщений в БД должна автоматически стартовать на третьем уровне и завершать свою работу при переходе на нулевой (останов) или шестой (перезагрузка).

Просмотр перехваченных ICQ-сообщений из БД После того как сообщения попали в БД, мы встречаемся с ещё одной проблемой – как их просматривать. Обычно эта проблема не стоит остро, потому как есть универсальный phpMyAdmin[19]. В нашем случае данные довольно просты, поэтому напишем небольшой скрипт на php. Он будет подключаться к БД, делать запрос на получение данных и далее будет печатать на экран их в виде таблицы. Файл назовём script1.php <html> <head> <title>ICQ message database</title> <meta name="content" http-equiv="Content-Type" ↵ CONTENT="text/html; charset=koi8-r"> </head> <body> <?php $server="localhost:3306"; $login="aimsniff"; $password="aimpassword"; $conn=mysql_connect($server,$login,$password); $color=1; $request="SELECT * FROM logs LIMIT 100"; $result=mysql("aimsniff",$request,$conn); echo "<table border=\"1\">"; echo "<tr align=\"center\" bgcolor=\"lightgrey\"><td>id</td> <td>timestamp</td> <td>local IP</td> <td>from UID</td> <td>to UIN</td> <td>direction</td> <td>message</td></tr>»; while($row=mysql_fetch_array($result)) { if ($color) { echo "<tr bgcolor=\"#FBE0E0\">"; $color=0; } else { echo "<tr>»; $color=1; } echo "<td>".$row[0]."</td>"; echo "<td>".$row[1]."</td>"; echo "<td>".$row[2]."</td>"; echo "<td>".$row[3]."</td>"; echo "<td>".$row[4]."</td>"; if ($row[5]=="00040007") { echo "<td><--</td>"; } elseif ($row[5]=="00040006") { echo "<td>--></td>"; } else { echo "<td>".$row[5]."</td>"; }

42

Рисунок 3. Результаты работы программы script1.php echo "<td>".$row[6]."</td>"; echo "</tr>";

} echo "</table>"; ?> </body> </html>

Результат работы скрипта см. на рис. 3. Меняя запросы в переменной $request, например на «SELECT * FROM logs WHERE id>100 LIMIT 100», можно вывести следующие 100 сообщений или вывести все сообщения за последние три дня: «SELECT * FROM logs WHERE unix_timestamp(now())-unix_timestamp(ts)<3*24*60* 60». В целом, если вы умеете писать запросы к БД, то всё довольно просто и все дальнейшие возможности находятся в ваших руках.

Лучшее – враг хорошего Для удобства использования можно создать две таблицы в БД. В одной, например, можно хранить IP-адреса (если они статические) локальных пользователей с их именами и внутренними телефонами. CREATE TABLE 'localusers' ( 'ip' VARCHAR(20) NOT NULL , 'name' VARCHAR(30) NOT NULL , 'phone' VARCHAR(10) NOT NULL , PRIMARY KEY ('ip') );

А в другой – IСQ-номера с никами или комментариями. CREATE TABLE 'nicnames' ( 'icq' VARCHAR(255) NOT NULL , 'nickname' VARCHAR(50) NOT NULL , PRIMARY KEY ('icq') );

(Типы полей не оптимальны, они выбраны из соображения совместимости с имеющейся БД aimsniff.) Теперь вместо непонятных IP-адресов можно выводить вполне понятные имена и номера телефонов. Скажем, чтобы можно было позвонить нерадивому пользователю и напомнить о том, что на работе работают, а не болтают по личным вопросам. Варианты реализации могут быть разными. Мне кажется, что проще сделать несколько усложнённый запрос


администрирование к БД, содержащий в себе, например, левое внешнее объединение: $request="SELECT logs.id,logs.ts,logs.ip,logs.fromHandle, logs.handle,logs.direction,logs.message, localusers.name FROM logs LEFT JOIN localusers ON ↵ logs.ip=localusers.ip LIMIT 100";

Вывод будет на один столбец больше (чем в скрипте). В «лишнем» столбце будет указываться имя локального пользователя. Для того чтобы его увидеть на веб-странице, надо просто дописать ещё одну строчку: echo "<td>".$row[6]."</td>";

Думаю, и так понятно где. Как вариант, количество столбцов можно не увеличивать. Например, в графе «local IP» можно выводить имена, если они известны, либо IP-адреса в противном случае. Наглядно данный вопрос реализуется следующим кодом: if ($row[7]) { echo "<td>".$row[7]."</td>"; else { echo "<td>".$row[2]."</td>";

Кому-то может показаться более удобным использование имён столбцов в том виде, как они выводятся из базы данных, вместо подсчёта номеров начиная с нуля, тогда вывод будет выглядеть так: }

Аналогичным образом можно заменить номера ICQ никами из другой таблицы. Те же, кто хорошо знаком с языком SQL, могут попробовать решить эту задачу средствами СУБД.

Web AIM Sniff (WAS) На сайте проекта www.aimsniff.com вы также можете найти Web AIM Sniff (WAS) – это небольшая программка, точнее несколько скриптов на PHP, специально написанных для просмотра сообщений из БД, создаваемой программой AIM Sniff. Поставляются они отдельно, и для их работы необходимо, чтобы у вас уже были установлены язык PHP с поддержкой MySQL и веб-сервер Apache. По сути это то, во что может развиться написание вами собственного скрипта. Скачать WAS можно на том же сайте в разделе Download. Однако на сегодня программа (во всех её версиях) является «сырой» и рекомендовать её читателям мне не хотелось бы, поскольку она адаптирована для AIM, пока ещё не понимает русских букв и не может даже отобразить сообщения, хотя может строить красивые графики. Shawn Grimes не очень оперативно, но реагирует на замечания и присылаемые ему патчи, так что есть надежда, что в будущем (может, и благодаря вашим усилиям) ситуация изменится, так что следите за сайтом и форумом. Если же кто-то захочет рискнуть и разобраться с проектом WAS самостоятельно, вам пригодятся несколько советов:  Скачивайте CVS-версию, там исправлена ошибка деления на 0 при отсутствии сообщений в БД.

№12, декабрь 2005

лее правильных «<?php ?>»), поэтому необходимо их включить. Для этого надо в /etc/php.ini прописать «short_ open_tag = On».  Конфигурационный файл .config.php. Если вы не можете сменить конфигурацию во вкладке «admin», а туда вы, наверно, обратитесь в первую очередь, чтобы прописать вашу БД, то, скорее всего, у вас проблемы с правами доступа к файлу конфигурации. Решить эту проблему можно, задав для файла группу apache (так как от этого имени скорее всего работает ваш веб-сервер, а значит и все выполняемые им скрипты, т.е. в том числе и WAS) и открыть для на неё разрешение на запись: # chgrp apache .config.php # chgrp g+w .config.php

 Вывод сообщений, содержащих кириллицу, может не работать так, как вы этого ожидаете, по той причине, что все php-файлы в своём заголовке содержат другую кодировку. <meta http-equiv="Content-Type" ↵ content="text/html; charset=iso-8859-1">

}

if ($row['name']) { echo "<td>".$row['name']."</td>"; else { echo "<td>".$row['ip']."</td>"; }

 WAS использует упрощенные теги «<? ?>» (вместо бо-

Вопрос решается заменой кодировки на koi8-r (или windows-1251 в зависимости от вашего случая) во всех неправильно отображающих php-файлах. Так же в aimSniff.Cyr.pl есть пара строчек, отвечающих за перекодирование русских букв, которые без проблем находятся при просмотре «вручную», либо через поиск по ключевым словам «translation» или «cp1251». Наверное, было бы разумнее везде использовать utf-8, но процесс перехода на эту кодировку, особенно на старых серверах, идёт со скрипом и без энтузиазма. Замечание 1. Так как изначально планировалось размещать все сообщения на всеобщее обозрение, может возникнуть ситуация, когда тот же начальник, решивший организовать у себя эту систему, может оказаться под её просмотром, чего ему или ей, естественно, не хотелось бы. В этом случае можно поступить двумя способами. Первый, демократический – смириться с тем, что правила для всех должны быть едины. Второй, как всегда, – сделать исключение. В этом случае можно сделать небольшую фильтрацию по «закрытым» номерам ICQ, сообщения которых не должны показываться. Дописав, например, к запросу: WHERE fromHandle <>'1111112' AND handle<>'1111112'

При желании можно вообще сделать два скрипта, а в идеале, можно усложнить БД, организовав некоторое подобие мандатной политики безопасности, присвоив каждому номеру ICQ свой уровень в отдельной таблице. Аналогичные уровни можно присвоить и просматривающим. Можно копнуть ещё глубже и внести изменения в AIM Sniff, тогда сообщения даже в базу данных попадать не будут. Тут тоже всё зависит от вашей фантазии и возможностей, например, для удобства можно даже какое-нибудь ключевое слово или последовательность, встречая которые в теле сообщения разборщик не будет вносить сообщения в базу.

43


администрирование Замечание 2. Если просматривающий скрипт вместе с веб-сервером будут запущены на шлюзе, имеющем доступ из сети Интернет, то может возникнуть необходимость создания защиты от просмотра сообщений «чужим глазом». Если доступ к веб-серверу снаружи не нужен, то вопрос можно решить парой правил для iptables: # iptables -I INPUT -d $perver_ip # iptables -I INPUT -d $perver_ip

-i $exterbal_interface -p tcp --dport 80 -j DROP -i $exterbal_interface -p tcp --dport 443 -j DROP

но чаще доступ нужен и снаружи тоже. В этом случае ограничивать доступ придётся правами самого вебсервера. Для этого правим конфигурационный файл /etc/httpd/conf/httpd.conf, дописав туда строчки: <Directory /var/www/html/was> Order deny,allow Deny from all Allow from 192.168.0.0/255.255.255.0 </Directory>

где 192.168.0.0/255.255.255.0 – есть адреса локальной сети, откуда доступ разрешён. Если диапазон внутренних адресов жёстко не определён или также нужен доступ снаружи, скажем из других филиалов, то можно организовать парольную защиту. Для этого необходимо создать файл с учётными записями пользователей, куда занести информацию, например, о пользователе user1: # htpasswd -c /путь/файл_с_учётными_записями user1

После запуска команды необходимо ввести пароль. (Если файл с учётными записями уже имеется, ключ -c следует опустить.) После, в конфигурационном файле вебсервера пишем: <Directory /var/www/html/was> AuthType Basic AuthName "Web AIM Shiff" AuthUserFile /путь/файл_с_учётными_записями Require user user1 AllowOverride None </Directory>

Рисунок 4. Cкриншот сайта www.aimsniff.org

Спасибо за помощь в исправлении ошибок и координацию моих мыслей: Рыжакову Глебу, tuziha и Realtex-sux.

Литература, ссылки: 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.

При желании можно совместить проверку IP-адреса, откуда идёт обращение с авторизацией. После перезапуска 11. веб-сервера изменения должны вступить в силу. Сделать 12. 13. это можно командой: # /etc/rc.d/init.d/httpd restart

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

Заключение

14. 15.

16. 17.

Хотелось бы верить, что всё изложенное выше будет использоваться только с благими намерениями, а моральные 18. качества и авторитет системного администратора останутся на высоте. Руководители сделают правильные выводы о том, разрешать пользоваться ICQ или нет, а жизнь поль- 19. зователей в новом году станет только лучше.

44

PHProxy – http://sourceforge.net/projects/poxy. Simple Browser Proxy – http://sourceforge.net/projects/sbp. CGIProxy – http://www.jmarshall.com/tools/cgiproxy. IServerd project (Александр В. Шутко) – http://iserverd.khstu.ru. IRC, EMail, SMB, MSN, AIM, ICQ sniffer – http://www.ufasoft.com/ icqsnif. EtherBoss Monitor (for ICQ Monitoring) – http://www.etherboss. com/icq. Shadow IM Sniffer – ICQ Sniffer,MSN Sniffer, AOL Sniffer, Yahoo Sniffer – http://www.safety-lab.com/en/products/imsniffer.htm. Spy ICQ: SpyArsenal ICQ Logger – http://www.spyarsenal.com/ spy-icq-sniffer. Network Sniffer: Give-Me-Too – invisible net sniffer – http://www. spyarsenal.com/network-sniffer. Проект Aim Sniff – http://www.aimsniff.com, http://sourceforge.net/ projects/aimsniff. ICQ2000 сделай сам – http://icq2000cc.hobi.ru/index.html. ICQ library icqlib – http://kicq.sourceforge.net/icqlib.shtml. Miranda Instant Messenger – http://www.miranda-im.org. Всё для &RQ – http://andrq.org. Леон Аткинсон. MySQL. Библиотека профессионала.: Пер. с англ. – М.: Издательский дом «Вильямс», 2002 г. (ISBN-58459-0291-6). Поль Дюбуа. MySQL, 2-е изд.: Пер. с англ. – М.: Издательский дом «Вильямс», 2004 г. (ISBN-5-8459-0515-X)б Компания MySQL AB. MySQL. Справочник по языку. : Пер. с англ. – М.: Издательский дом «Вильямс», 2005 г. (ISBN 58459-0804-3). Гмурман В.Е. Теория вероятностей и математическая статистика. Учеб. пособие для вузов. Изд 7-е, стер. – М.:Высш. шк., 2000 г. (ISBN 5-06-003464-X). phpMyAdmin MySQL Database Administration Tool – http://www. phpmyadmin.net.


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

Защита электронной почты средствами

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

С

егодня в качестве платформы роятно, благодаря надежности и своим для почтового сервера доволь- возможностям MailScanner заслужил но часто используются различ- похвалу и стал стандартным решениные варианты UNIX-систем. Обладая ем, предназначенным для организабольшей устойчивостью и защищен- ции защиты почты на многих серверах ностью, они привлекают внимание ад- в Европе и Великобритании. Его соминистраторов. Но не секрет, что вза- здатель Julian Field за свою разработмен требуются знания, опыт и время, ку стал в 2004 году обладателем Open необходимое для установки и настрой- Source Award от UKUUG (UK UNIX and Open Systems User Group). Эта награки нужного сервиса. Проект, начатый в 2000 году после да ежегодно вручается наиболее вы5 лет работы из простого антивирус- дающимся деятелям мира бесплатноного сканера, превратился в мощную го и открытого программного обеспесистему, защищающую тысячи ком- чения. А различные версии продукта пьютеров от вирусов и спама. Напи- с сайта проекта были скачаны более сан MailScanner на Perl, распростра- полумиллиона раз. няется по лицензии GNU GPL. Модель разработки все же немного отличает- Возможности MailScanner ся от других подобных проектов. Ав- В отличие от многих коммерческих тор сохраняет полный контроль над ис- решений, поддерживающих обычходным кодом, другие пользователи но 2-3 антивируса, MailScanner споне имеют доступа к архиву CVS. Объ- собен работать более чем с 20 антиясняется это большим значением, ко- вирусами (Sophos, McAfee, Command, торое придается электронной почте, Kaspersky, Inoculate, Inoculan, Nod32, а использование непротестированно- F-Secure, F-Prot, Panda, RAV, AntiVir, го кода может навредить как пользо- Clam, BitDefender, Vscan и др.). В комвателям, так и репутации проекта. Ве- плекте имеются готовые конфигура-

№12, декабрь 2005

ционные файлы и сценарии обновления антивирусных баз для большинства из них. Он совместим с наиболее популярными МТА – Mail Transfer Agent (Postfix, Sendmail, Exim, Qmail, ZMailer). Хотя в принципе этот сканер может быть легко встроен в любую почтовую систему независимо от используемого в ней программного обеспечения. Кроме того, он очень прост в установке и для своей работы практически не требует переконфигурации почтовых серверов, а при использовании Sendmail его появление в системе полностью прозрачно. Своего антивируса MailScanner не имеет, как не является обязательным к употреблению любая программа для защиты от спама. Хотя для эффективной идентификации спама может использоваться SpamAssassin (http://www.spamassassin.org), имеющий развитую систему контекстного лингвистического анализа, систему обучения и самообучения. При желании его можно заменить или дополнить любым другим внешним скане-

45


безопасность ром спама и антивирусом, или использовать параллельно при их появлении в тексте. При использовании патча кросразу несколько программ. ме самого сообщения могут проверяться присоединенные Кроме проверки на наличие вирусов, сканер анализи- документы Microsoft Word. Кроме вышеописанных методов, используются правирует наличие во вложении файлов с потенциально опасным именем или нежелательные типы файлов (самораспа- ла, занесенные в файл с расширением .rules. Каждый файл ковывающиеся архивы, исполняемые файлы, видео и про- сопоставлен с некой категорией, например BlackList, и при чее). Определяются в том числе и файлы с двойным рас- совпадении параметра внутри к письму применяется укаширением вроде «.txt.vbs», «.doc.exe» (файлы с повторяю- занное действие. Правило внутри такого файла может сощимся расширением (*.zip.zip) по умолчанию разрешены), стоять из 3 или 6 полей вида: которые часто используются для рассылки вирусов. ПроНаправление: образец результат веряются распространенные типы архивов (zip, rar, gzip и др.) и MIME, в том числе и «application/ms-tnef». Если архив защищен паролем, то для их содержимого выполняет- или ся проверка имен файлов. Настройки позволяют защититьНаправление: образец and направление2: ↵ ся от DOS-атак, направленных на почтовые сервисы. Еще образец2 результат одной особенностью MailScanner является анализ содержимого письма. Анализируя почту, MailScanner способен обВ качестве направления движения сообщения выбинаруживать атаки, направленные против некоторых кли- раются значения из: From, To, FromOrTo, FromAndTo, Virus. ентов электронной почты (Outlook, Outlook Express, Internet Образец описывает адрес отправителя сообщения, здесь Explorer, Eudora), а также Cyrus IMAP, но можно добавить можно указать конкретный почтовый адрес, имя отправии другие приложения, отредактировав конфигурационный теля/получателя, домен, IP-адрес. Поддерживаются регуфайл. Теги HTML <IFrame>, <Form>, <Script> и другие, ко- лярные выражения. Результат показывает действие, приторые могут быть использованы для загрузки файлов без меняемое к сообщению. Самым простым результатом явведома пользователей или изображений, часто использу- ляется yes (правило совпадает) и no (не совпадает). А вот емые спамерами, могут быть удалены. В MailScanner реа- что будет с письмом, уже зависит от файла, в котором зализован контроль за подменой адреса, прием, часто при- писаны эти правила. Так если файл описывает черный спименяемый фишерами. Так, если пользователь получит со- сок, то yes покажет на спам и к нему будут применены соотобщение, содержащее строку: ветствующие действия, а если в файле описан белый список, то при yes письмо беспрепятственно пройдет проверку. <a href="http://www.nasty.com /"> www.bank.com</a> Кроме этого результат можно установить таким:  deliver – доставить сообщение.  delete – удалить сообщение. в письмо будет вставлено предупреждение:  store – сохранить в карантине. MailScanner has detected a possible fraud attempt  bounce – отослать отказ отправителю. by "www.nasty.com" claiming to be www.bank.com  forward user@domain.com – переслать копию по указанному почтовому адресу. В некоторых случаях такая проверка вызывает ложную  striphtml – конвертировать HTML в текст. тревогу, например, ссылки, используемые Microsoft. В этом случае сайты, которые не должны проверяться на фишинг,  attachment – преобразовать сообщение в файл, присоединенный к письму. заносятся в специальный файл phishing.safe.sites.conf. Для ускорения работы системы можно указать список ад-  notify – отсылка получателю уведомления о блокировресов или доменов, чьи письма не будут или, наоборот, буке спама. дут проверяться. Также в MailScanner заложена возможность  header “name: value” – добавление в заголовок name зназадания групп пользователей, чьи письма будут архивирочения value. ваться в отдельный каталог и пересылаться на другой адВозможна и комбинация некоторых параметров. Прирес. Причем, кроме создания новых правил для черных списков, эта особенность может быть использована, например, мер правил: при проверке лояльности служащих. Для этих же целей исTo: bad.customer.com no пользуется возможность блокировки зашифрованных сообFrom: /^192\.168\.1[4567]\./ store forward ↵ щений глобально или в только определенные домены. Хотя user@domain.com FromAndTo: *@*.domain.com yes существует и обратная возможность, блокирующая отправFromOrTo: default (или *@* т.е. любой) yes ку незашифрованных сообщений, что позволяет предохранить конфиденциальную информацию от перехвата. Но проще всего определить, совпадает ли значение Предотвратить утечку конфиденциальной информа- (т.е. yes/no), а действие указать глобально в конфигурации позволяет еще одна технология, называемая Message ционном файле. Content Protection (MCP). Представляющая собой запуск еще одной копии SpamAssassin, но без выполнения слож- Как работает MailScanner ных антиспам проверок. Администратор сам заносит в от- В общем случае принцип работы сканера прост. Поступивдельный файл ключевые слова и фразы, дает им оцен- шее по SMTP письмо МТА помещает в специальную папку, ку и указывает на действия, которые должны произойти на которую указывает переменная Incoming Queue Dir. Пос-

46


безопасность ле проведения всех проверок оно помещается уже в другую папку (Outgoing Queue Dir), откуда забирается МТА и отсылается по назначению. Отличие здесь в работе используемых МТА. Например, структура sendmail позволяет MailScanner без перекомпиляции и изменений в конфигурационных файлах принять сообщение от одного процесса, а затем после проверки запустить второй процесс. Все необходимые подготовки могут быть сделаны посредством редактирования команд запуска sendmail. Несколько другая ситуация с Exim, в котором прием и отправка сообщений являются полностью независимыми процессами. Все вроде бы хорошо, но вот указать Exim на то, чтобы он использовал для приема/передачи отдельные очереди, проходящие через MailScanner, нет возможности. Поэтому приходится использовать два отдельных процесса Exim, каждый со своим собственным конфигурационным файлом. При этом процесс-получатель почты не должен иметь возможности отправлять сообщение. При компилировании Exim-получателя местонахождение конфигурационного файла указывается на этапе конфигурирования. А запуском Exim-отправителя занимается MailScanner, который и передаст ему необходимые параметры. С Postfix легче всего, так как использование независимых резидентных модулей позволяет одной копией сервера управлять поступающей и уходящей SMTP почтой. Итак, письмо положено в папку, предназначенную для входящих сообщений, после чего проходит несколько тестов, некоторые из них являются необязательными и могут отключаться. Тест RBL (Real time Blackhole List) – производится сравнение адреса отправителя с известными спамерскими адресами, если письмо отправлено с такого адреса, то оно отбрасывается. Стоит отметить, что тест RBL в зависимости от настроек может производиться на трех уровнях со своими характеристиками: MTA (письмо отбрасывается), MailScanner (возможен выбор – удалить, пропустить, заархивировать и т. д.) и SpamAssassin (наиболее тонкий, но в то же время ресурсоемкий). Далее оценкой письма занимается SpamAssassin, после чего MCP, тест на вирусы и наконец анализ типа, имени присоединенного файла и поиск атак, направленных на почтовых клиентов. После прохождения тестов в тело письма могут добавляться специфические метки, вроде X-Spam-Status: yes. Далее сообщение попадает в модуль принятия решений. Если все тесты пройдены, оно ложится в папку для исходящих писем и отправляется получателю. Письмо, содержащее вирус или спам, в зависимости от настроек удаляется либо направляется в карантин. Далее вирус удаляется, в сообщение добавляется оповещение о вирусе, оповещаются также локальный администратор и отправитель письма.

Установка MailScanner Про установку различных МТА журнал писал неоднократно, поэтому останавливаться на этом подробно не буду. На странице закачки можно найти готовые пакеты для RedHat, Fedora, Mandriva, SuSE, Debian, Solaris, FreeBSD. Если вашего дистрибутива в списке нет, то воспользуйтесь tar-архивом, содержащим исходные тексты MailScanner-install-4.45.4-1.tar.gz. Базовый комплект не со-

№12, декабрь 2005

держит ClamAV и SpamAssassin, если планируется их использование, то лучше воспользоваться готовым комплектом install-Clam-SA.tar.gz, который можно взять со страницы Downloads раздел Other stuff. Установка из rpm- и tar-архивов, в том числе и пакета install-Clam-SA, довольно проста. Разработчики избавили администраторов от поиска пакетов для удовлетворения зависимостей, а всего требуется около 30 Perl-модулей и программ, включив все необходимое в единый архив. После распаковки требуется ввести лишь ./install.sh. Скрипт произведет анализ системы и установит все компоненты в каталог /opt/MailScanner. Конечно же, этот путь можно изменить, покопавшись в скриптах, или просто перенести каталог в другое место, изменив затем путь в стартовых скриптах. В случае с архивом, содержащим MailScanner, при установке не должно быть сообщений об ошибке, а скрипт внутри install-Clam сам предупреждает, когда ошибки можно игнорировать. Do not worry about warnings or errors from the next 3 commands ./install.sh: line 192: groupadd: command not found ./install.sh: line 193: useradd: command not found You can start worrying about errors again now

Конфигурационный файл MailScanner.conf MailScanner является гибким инструментом, обладающим большим количеством возможностей. Все доступные параметры настраиваются в одном конфигурационном файле /opt/MailScanner/etc/MailScanner.conf. Строение файла стандартно для UNIX-программ. Настройки указываются в виде строк option = value, знак решетки (#) указывает на комментарий, пустые строки и пробелы игнорируются. В значениях можно использовать любые переменные оболочки вроде $HOSTNAME. Для удобства восприятия файл разбит на несколько секций, все параметры можно не трогать. В принципе и в конфигурации по умолчанию MailScanner способен защитить систему. Кроме того, можно добавить и свои параметры, подправив файл CustomConfig.pm, лежащий в подкаталоге lib. # Main configuration file for the MailScanner E-Mail # Virus Scanner # Здесь указывается каталог, в котором содержатся все # сообщения, на нужном языке. К сожалению, русского нет, # этим придется заниматься самому %report-dir% = /opt/MailScanner/etc/reports/en # Ниже идут стандартные каталоги, в которых содержатся # настройки и правила, если вы выбрали другой каталог, # для запуска MailScanner все их необходимо переопределить %etc-dir% = /opt/MailScanner/etc # Здесь лежат правила %rules-dir% = /opt/MailScanner/etc/rules # Настройки Message Content Protection %mcp-dir% = /opt/MailScanner/etc/mcp # Название организации короткое, длинное (без пробелов) # и веб-сайт %org-name% = yoursite %org-long-name% = Your Organisation Name Here %web-site% = www.your-organisation.com # System settings # Количество одновременных процессов MailScanner. # При мощном процессоре и большой нагрузке можно # увеличить эту цифру. Один процесс занимает около 20 Мб Max Children = 5

47


безопасность # По умолчанию MailScanner работает от имени пользователя # и группы sendmail. # В некоторых системах его нужно изменить Run As User = postfix Run As Group = postfix

# Количество сообщений в очереди, превышение этого числа # приведет к переключению в «ускоренный» режим # сканирования, когда сообщения проверяются не по дате, # а в порядке поступления Max Normal Queue Size = 800

# Время (в секундах), через которое будет производиться # проверка папок на наличие новых сообщений Queue Scan Interval = 6

# Опция ниже включает проверку на вирусы и спам для всех # сообщений, установка в «no» приведет к тому, что почта # проверяться не будет. Можно использовать файл с правилами, # где указать, какие сообщения сканировать, а какие нет # checked *at all*, and so any viruses or other problems # will be ignored. # Если используется файл правил # /etc/MailScanner/rules/scan.messages.rules, # то используем строку: # Scan Messages = %rules-dir%/scan.messages.rules. # Иначе включаем проверку для всей почты Scan Messages = yes

# Папка, в которую будут помещаться входящие сообщения. # Можно задать имя каталога – /var/spool/mqueue.in # Шаблон – /var/spool/mqueue.in/* # Имя файла, в котором описаны каталоги # /opt/MailScanner/etc/mqueue.in.list.conf Incoming Queue Dir = /var/spool/postfix/hold # Каталог, куда будут складываться письма, прошедшие # проверку (исходящий) Outgoing Queue Dir = /var/spool/postfix/incoming # Каталог, в котором почта перед проверкой будет # распаковываться. При достаточном количестве ОЗУ можно # использовать tmpfs или ramdisk Incoming Work Dir = /var/spool/MailScanner/incoming # Каталог для хранения зараженных сообщений (карантин) Quarantine Dir = /var/spool/MailScanner/quarantine # Местонахождение pid-файла PID file = /opt/MailScanner/var/MailScanner.pid # Во избежание утечки ресурсов MailScanner периодически # перезапускается. Здесь указывается время в секундах Restart Every = 14400 # Установка МТА – postfix, sendmail, exim или zmailer MTA = postfix # # # # # #

Ниже описываются местонахождение и параметры запуска второй копии MTA. Postfix и Qmail здесь не настраиваются (см.выше). Sendmail = /usr/lib/sendmail Sendmail2 используется для запуска Exim For Exim users: Sendmail2 = /usr/sbin/exim ↵ -C /etc/exim/exim_send.conf # For sendmail users: Sendmail2 = /usr/lib/sendmail # Sendmail2 = /usr/sbin/sendmail -C /etc/exim/exim_send.conf # Sendmail2 = /usr/lib/sendmail # # Incoming Work Dir Settings # # Ниже указываются настройки для каталога входящих # сообщений, в большинстве случаев трогать их не надо # Здесь можно указать пользователя отличного # от «Run As User» и «Run As Group». # Эта опция может понадобиться при работе с некоторыми # антивирусами Incoming Work User = Incoming Work Group = # Права доступа к файлам, если не используется внешний # антивирус, то ставим 0600, иначе заносим пользователя, # от имени которого работает антивирус, в группу, # в нашем случае postfix и ставим 0640. # Хотя возможен вариант и с 0644 Incoming Work Permissions = 0640 # # Quarantine and Archive Settings # # То же что и выше, только для файлов, которые попадут # в карантин. Если захотите дать к ним доступ при помощи # внешней программы, например, веб-интерфейс, # то переопределяем их Quarantine User = Quarantine Group = Quarantine Permissions = 0600 # Ниже идут параметры проверки входящих сообщений. # Ограничения по размеру (в байтах) и количеству Max Unscanned Bytes Per Scan = 100000000 Max Unsafe Bytes Per Scan = 50000000 Max Unscanned Messages Per Scan = 30 Max Unsafe Messages Per Scan = 30

48

# Максимально разрешенное количество вложений в одном # письме. Некоторые почтовые системы сохраняют информацию # при переписке в виде присоединения к письму, их распаковка # занимает много времени Maximum Attachments Per Message = 20 # Проверка TNEF (Microsoft’s Transport Neutral Encapsulaton # Format) при помощи внешней программы. # Некоторые антивирусы (Sophos, McAfee) самостоятельно # проверяют такие вложения, в этом случае ставим «no». Expand TNEF = yes # Некоторые версии Microsoft Outlook генерируют неправильный # TNEF, который используемый модуль проверить не может. # Здесь можно запретить пропуск сообщений с таким # присоединением. Как вариант можно использовать файл правил Deliver Unparsable TNEF = no # Команда запуска декодера TNEF, как вариант указывается # ключевое слово «internal», подключающее Perl-модуль, # выполняющий ту же работу. Можно использовать файл правил #TNEF Expander = internal TNEF Expander = /opt/MailScanner/bin/tnef -maxsize=100000000 # Максимальное время для работы с одним сообщением TNEF # (в секундах) TNEF Timeout = 120 # Месторасположение команды «file», позволяющей определить # тип файла. Если не планируется проверка типа файлов, # можно отключить File Command = /usr/bin/file File Timeout = 20 Unrar Command = /usr/bin/unrar Unrar Timeout = 50 # Максимальный размер сообщений, включая заголовки. # Установка в 0 снимает ограничения. Можно использовать # файл правил и использовать возможность принудительного # ограничения размера сообщения более тонко Maximum Message Size = 0 # Максимальный размер в байтах для вложений. # Установка в 0 запретит вложения, -1 снимает ограничения. # Более тонко настройки можно указать в файле правил Maximum Attachment Size = -1 # Минимальный размер вложений, опция бывает полезна # при удалении очищенных антивирусом файлов, можно # использовать файл правил Minimum Attachment Size = -1 # Максимальная глубина распаковки архивов zip, # для проверки имен и типов файлов Maximum Archive Depth = 2 # Обнаружение архивов не только по имени, # но и по содержимому, можно использовать файл правил Find Archives By Content = yes # Проверка писем на вирусы. # Можно использовать файл правил. Virus Scanning = yes # Установка используемого вирусного сканера. # В конфигурационном файле приведены примеры для всех # поддерживаемых антивирусов. Можно добавить любой другой,


безопасность # для этого его необходимо описать в файле # %etc-dir%/virus.scanners.conf, в который необходимо # занести 3 позиции: имя сканера, сценарий для запуска # и месторасположение (в некоторых системах путь придется # подправить). Например, для СlamAV строка в этом файле # выглядит так: # clamav /opt/MailScanner/lib/clamav-wrapper /usr/local # Установка в none отключает проверку. # Если планируется использование сразу нескольких # антивирусов, они перечисляются через пробел # Virus Scanners = drweb kaspersky mcafee # Virus Scanners = clamav Virus Scanner Timeout = 300 # Удаление вируса с зараженного файла, очищенное сообщение # присоединяется как файл «VirusWarning.txt». # Можно использовать файл правил. Deliver Disinfected Files = yes # Строка, которую ищет MailScanner на выходе антивируса. # При обнаружении этих строк отправитель не предупреждается, # вирус очищается, а дойдет ли письмо до получателя – зависит # от «Still Deliver Silent Viruses». # Для обозначения используются 5 ключевых слов: # HTML-IFrame, HTML-Codebase, HTML-Script, HTML-Form # и Zip-Password. # Опция All-Viruses соответствует поиску всех вариантов. # Можно использовать файл правил Silent Viruses = All-Viruses # Доставлять ли сообщение получателю после очистки? # Можно использовать файл правил Still Deliver Silent Viruses = no # Опция противоположная предыдущей, при обнаружении # указанных строк все участники получат предупреждения Non-Forging Viruses = Joke/ OF97/ WM97/ W97M/ eicar # Запрет отправки зашифрованных сообщений. # Можно использовать файл правил Block Encrypted Messages = no # Запрет отправки незашифрованных сообщений. # Можно использовать файл правил Block Unencrypted Messages = no # Разрешение использования зашифрованных архивов. # Можно использовать файл правил Allow Password-Protected Archives = no # # Options specific to ClamAV Anti-Virus # # В файле имеются предустановки для некоторых антивирусов. # В большинстве случаев достаточно проверить все пути Monitors for ClamAV Updates = /usr/local/share/clamav/*.cvd ClamAVmodule ClamAVmodule ClamAVmodule ClamAVmodule

Maximum Maximum Maximum Maximum

Recursion Level = 5 Files = 1000 File Size = 10000000 # (10 Mб) Compression Ratio = 250

# Далее указываются параметры работы MailScanner с # потенциально опасным контентом. Практически везде можно # использовать файл с правилами. Включение всех проверок Dangerous Content Scanning = yes # Работа с неполным вложением Allow Partial Messages = no # Разрешение сообщений, загружающих контент из Интернета. # Запрещаем однозначно Allow External Message Bodies = no # Поиск подмены адресов Find Phishing Fraud = yes # Обычно в легальных письмах редко используется IP-адрес, # фишеры же прибегают к этому способу для обмана. Запрещаем Also Find Numeric Phishing = yes # Вставка предупреждения о подмене Highlight Phishing Fraud = yes # Список сайтов, которые игнорируются при поиске фишеров Phishing Safe Sites File = %etc-dir%/phishing.safe.sites.conf

№12, декабрь 2005

# Разрешение соответствующих тегов в сообщении # yes => Разрешает # no => запрещает # disarm => Разрешает, но нейтрализует тег Allow IFrame Tags = disarm Allow Form Tags = disarm Allow Script Tags = disarm Allow Object Codebase Tags = disarm # То же для <Img>, но только два действия yes и disarm Allow WebBugs = disarm # Эта опция перекликается с «Allow ... Tags», т.е. при # разрешении тега сообщение может быть преобразовано # из HTML в текст Convert HTML To Text = no # Проверка вложений. # Указываем файл с правилами, содержащий описание типов # и имен файлов и производимым действием при обнаружении # определенного типа и имени # allow/deny/deny+delete Filename Rules = %etc-dir%/filename.rules.conf Filetype Rules = %etc-dir%/filetype.rules.conf # # Reports and Responses # Действия с потенциально опасными объектами, во многих # случаях возможно использование файла правил. # Использование карантина для зараженных сообщений Quarantine Infections = yes Quarantine Silent Viruses = no # Копии сообщений с модифицированным HTML # (вариант файл правил) Quarantine Modified Body = no # Сохранение всего сообщения или только зараженной части Quarantine Whole Message = no # Сохранение в оригинальном или удобочитаемом виде Quarantine Whole Messages As Queue Files = no # Сохранение зараженного спама или MCP Keep Spam And MCP Archive Clean = no # Файлы, содержащие сообщения, выдаваемые пользователю Language Strings = %report-dir%/languages.conf Deleted Bad Content Message Report = ↵ %report-dir%/deleted.content.message.txt Deleted Bad Filename Message Report = ↵ %report-dir%/deleted.filename.message.txt Deleted Virus Message Report = ↵ %report-dir%/deleted.virus.message.txt Stored Bad Content Message Report = ↵ %report-dir%/stored.content.message.txt Stored Bad Filename Message Report = ↵ %report-dir%/stored.filename.message.txt Stored Virus Message Report = ↵ %report-dir%/stored.virus.message.txt Disinfected Report = %report-dir%/disinfected.report.txt Inline HTML Signature = %report-dir%/inline.sig.html Inline Text Signature = %report-dir%/inline.sig.txt Inline HTML Warning = %report-dir%/inline.warning.html Inline Text Warning = %report-dir%/inline.warning.txt Sender Content Report = ↵ %report-dir%/sender.content.report.txt Sender Error Report = ↵ %report-dir%/sender.error.report.txt Sender Bad Filename Report = ↵ %report-dir%/sender.filename.report.txt Sender Virus Report = ↵ %report-dir%/sender.virus.report.txt # Скрываем полный путь к каталогу, в который помещен # вирус. Эта опция может понадобиться для сокрытия # настроек системы Hide Incoming Work Dir = yes # Включение имени сканера в отчеты Include Scanner Name In Reports = yes # Добавление дополнительных заголовков и конвертов к # обработанной почте (возможно использование файла правил) Mail Header = X-%org-name%-MailScanner: Spam Header = X-%org-name%-MailScanner-SpamCheck: Spam Score Header = X-%org-name%-MailScanner-SpamScore: Information Header = X-%org-name%-MailScanner-Information:

49


безопасность Add Envelope From Header = yes Add Envelope To Header = no Envelope From Header = X-%org-name%-MailScanner-From: Envelope To Header = X-%org-name%-MailScanner-To: # Символ, который будет использоваться для вывода оценки # спамовости сообщения. Установка x при значении 3 может # быть воспринята неправильно, т.е. xxx, некоторые # другие знаки #, @, *, ?, точка могут вызвать проблемы # с procmail и др. Spam Score Character = s # Вставка оценки спама в сообщение SpamScore Number Instead Of Stars = no # Минимальное число оценки спама, вставляемое в сообщение Minimum Stars If On Spam List = 0 # Заголовок clean/infected/disinfected сообщений Clean Header Value = Found to be clean Infected Header Value = Found to be infected Disinfected Header Value = Disinfected Information Header Value = Please contact the ISP for ↵ more information # Полный отчет о спаме Detailed Spam Report = yes # Оценка SpamAssassin или просто название Include Scores In SpamAssassin Report = yes

# Опции изменения поля Subject могут использоваться # для удобства фильтрации в почтовом клиенте. # Варианты no, start (добавить в начало) и end. # Все варианты поддерживают правила Scanned Modify Subject = no # end # Здесь текст, добавляемый к Subject Scanned Subject Text = {Scanned} # Сообщение о вирусе, добавляемое в тему Virus Modify Subject = yes Virus Subject Text = {Virus?} # Сообщение о проверке имени файла Filename Modify Subject = yes Filename Subject Text = {Filename?} # Проверке содержимого Content Modify Subject = yes Content Subject Text = {Dangerous Content?} # О нейтрализации HTML Disarmed Modify Subject = yes Disarmed Subject Text = {Disarmed} # О подделке адреса Phishing Modify Subject = no Phishing Subject Text = {Fraud?}

# Включение отчета о спаме в любом случае, даже если спам # обнаружен не был Always Include SpamAssassin Report = no

# О спаме Spam Modify Subject = yes # Значение «_SCORE_» будет заменен числовой оценкой # SpamAssassin. # Строка «_STARS_» будет заменена звездочками Spam Subject Text = {Spam?}

# Тесты MailScanner могут добавлять свои заголовки в # сообщение. Здесь указывается, как поступать с такими # заголовками. Варианты: «append», «add или «replace» Multiple Headers = append

# То же, что и предыдущее, но только при превышении # значения «High SpamAssassin Score» High Scoring Spam Modify Subject = yes High Scoring Spam Subject Text = {Spam?}

# Имя узла, если требуется скрыть реальное Hostname = the %org-name% ($HOSTNAME) MailScanner # Подпись сообщения уже обработанного другой копией # MailScanner Sign Messages Already Processed = no # Добавление «Inline HTML Signature» или «Inline Text # Signature» в очищенное сообщение Sign Clean Messages = yes Mark Infected Messages = yes # Маркировать ли не просканированные антивирусом сообщения? Mark Unscanned Messages = yes # И текст такой маркировки Unscanned Header Value = Not scanned: please contact your ↵ Internet E-Mail Service Provider for details # Все заголовки в сообщении, содержащие эти строки, будут # удалены. Опция может быть полезна при удалении # сообщения о доставке или прочтении сгенерированных # почтовым клиентом Remove These Headers = X-Mozilla-Status: ↵ Disposition-Notification-To: Return-Receipt-To # Доставлять ли очищенные от вирусов сообщения Deliver Cleaned Messages = yes # Отправка уведомления отправителю о том, что в сообщении # содержится вирус или файл с подозрительным именем. # Лучше использовать файл с правилами, где указать # своих корреспондентов Notify Senders = yes # Опция, переопределяющая предыдущую, при установке в no # сообщения отправителям об обнаруженном вирусе отсылаться # не будет. Учитывая, что обратный адрес часто # подделывается, лучше оставить, как есть. Вариант – # использование файла правил Notify Senders Of Viruses = no # Сообщение о блокировании файла по имени или типу Notify Senders Of Blocked Filenames Or Filetypes = yes # И всего прочего Notify Senders Of Other Blocked Content = yes Never Notify Senders Of Precedence = list bulk

50

# Изменения в теле сообщения. Многие опции допускают # использование файла правил. Предупреждение об удалении # записывается в само сообщение или присоединяется к файлу Warning Is Attachment = no # Имя файла такого вложения. Attachment Warning Filename = %org-name%-Attachment-Warning.txt Attachment Encoding Charset = СР-1251 # Архивирование и мониторинг почты. # Указывается почтовый адрес, каталог или имя файла. # Возможно добавление переменных в имени вроде _DATE_, # которая будет заменена текущим временем. # Можно использовать правила # Archive Mail = /var/spool/MailScanner/archive # Предупреждения локальному администратору. # Можно использовать правила Send Notices = yes Notices Include Full Headers = yes Hide Incoming Work Dir in Notices = no Notice Signature = -- \nMailScanner\nEmail ↵ Virus Scanner\nwww.mailscanner.info # Поле «From:» Notices From = MailScanner Notices To = postmaster Local Postmaster = postmaster # Имена файлов, транслирующих имена spam-списков и областей # в реальные области DNS. Другие варианты можно поискать # http://www.declude.com/JunkMail/Support/ip4r.htm Spam List Definitions = %etc-dir%/spam.lists.conf Virus Scanner Definitions = %etc-dir%/virus.scanners.conf # Проверка на спам по адресу отправителя. Везде можно # использовать правила. Отключение следующей опции приведет # к остановке проверки на спам как самим MailScanner, # так и SpamAssassin Spam Checks = yes # Выбор используемого spam blacklists (RBLs) # Смотри файл указанный в «Spam List Definitions» Spam List = ORDB-RBL SBL+XBL SORBS-DNSBL CBL RSL ↵ DSBL spamcop Spam Domain List = RFC-IGNORANT-DSN


безопасность # Число одинаковых сообщений, начиная с которого # они будут рассматриваться как спам, Spam Lists To Be Spam = 1 Spam Lists To Reach High Score = 3 Spam List Timeout = 10 Max Spam List Timeouts = 7 Spam List Timeouts History = 10 # «Белый список». Сообщения, принятые с попавших в этот # список узлов, не будут рассматриваться как спам #Is Definitely Not Spam = no Is Definitely Not Spam = %rules-dir%/spam.whitelist.rules # «Черный список» узлов спамеров. Эта величина # переопределяется значением «Is Definitely Not Spam». # При no все, не вошедшие в 1 список, являются # потенциальными спамерами # Is Definitely Spam = %rules-dir%/spam.blacklist.rules Is Definitely Spam = no Definite Spam Is High Scoring = no # Если количество получателей превышает число, то «белый # список» игнорируется, и письмо обрабатывается обычным # образом Ignore Spam Whitelist If Recipients Exceed = 20 # Использование SpamAssassin. # Можно применить правила и обработать письма более тонко Use SpamAssassin = yes # Если письмо превышает указанный размер (в байтах), # SpamAssassin просматривать его не будет. # Письма спамеров редко бывают большими, а рисунки и др. # определяются другими опциями Max SpamAssassin Size = 30000 # Переопределение значения «required_hits», если оценка # достигает его – это спам Required SpamAssassin Score = 6 High SpamAssassin Score = 10 # Включение автоматического «белого списка», функции доступной # в SpamAssassin, начиная с версии 3.0. Подробности в [3] SpamAssassin Auto Whitelist = no SpamAssassin Prefs File = %etc-dir%/spam.assassin.prefs.conf SpamAssassin Timeout = 75 Max SpamAssassin Timeouts = 10 SpamAssassin Timeouts History = 30 # Проверять ли сообщение, если оно находится в спам-списке Check SpamAssassin If On Spam List = no # Включение оценки спама в сообщение Spam Score = yes # Перестройка Bayesian-статистики. # 0 отключает такую возможность. Например, перестройка # раз в сутки Rebuild Bayes Every = 86400 # Отключение проверки на время перестройки Wait During Bayes Rebuild = no # # # #

В этом разделе описываются параметры работы Custom Spam Scanner, написанного самим пользователем. Подробности в lib/MailScanner/CustomFunctions/GenericSpamScanner.pm Use Custom Spam Scanner = no

# Что делаем со спамом? Spam Actions = deliver High Scoring Spam Actions = deliver Non Spam Actions = deliver # Файлы с сообщениями, выдаваемыми пользователю Sender Spam Report = ↵ %report-dir%/sender.spam.report.txt Sender Spam List Report = ↵ %report-dir%/sender.spam.rbl.report.txt Sender SpamAssassin Report = ↵ %report-dir%/sender.spam.sa.report.txt Inline Spam Warning = ↵ %report-dir%/inline.spam.warning.txt Recipient Spam Report = ↵ %report-dir%/recipient.spam.report.txt Enable Spam Bounce = %rules-dir%/bounce.rules Bounce Spam As Attachment = no

№12, декабрь 2005

# Настройка параметров журналирования. Включать большую # часть лучше только при отладке. Следующая опция # определяет взаимодействие с syslog Syslog Facility = mail Log Speed = no Log Spam = no Log Non Spam = no Log Permitted Filenames = no Log Permitted Filetypes = no Log Silent Viruses = no Log Dangerous HTML Tags = no # # # #

Настройка некоторых параметров SpamAssassin. Может понадобиться, если SpamAssassin установлен в другой каталог или процесс не может получить доступ к файлам. Параметры понятны, приводиться не будут

# Настройки MCP MCP Checks = no # Что проверяется первым: spam или mcp First Check = mcp # Ниже идут опции, значение которых аналогично таковым # при проверке на спам, приводиться они не будут

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

Настройка Рostfix Установка Postfix хорошо описана в [2] , если он уже настроен и нормально работает, осталось сделать немного. Как говорилось выше, Рostfix удобен тем, что одна копия процесса позволяет управлять как входящей, так и исходящей почтой. Но в принципе можно использовать и две разных копии со своими конфигурационными файлами, применяя схему работы Exim. Мы используем первый вариант. В конфигурационном файле /etc/postfix/main.cf раскомментируем следующую строку: header_checks = regexp:/etc/postfix/header_checks

Создаем /etc/postfix/header_checks и добавляем следующую строку: /^Received:/ HOLD

После этого Рostfix будет складывать поступающие сообщения в /var/spool/postfix/hold. Запускаем: # /etc/init.d/postfix start # /opt/MailScanner/bin/check_mailscanner

Если права доступа к каталогам установлены правильно, то система будет работать. Если что-то не получается, журналы вам в помощь.

Литература, ссылки: 1. Сайт проекта MailScanner – http://www.mailscanner.info. 2. Бешков А. Почтовая система для среднего и малого офиса. – Журнал «Системный Администратор», №5, май 2003 г. – 46-54 с. 3. Супрунов С. Профессия – убивать спам. Все, что вы хотели узнать о тонкостях настройки Spamassassin. – Журнал «Системный Администратор», №10, октябрь 2005 г. – 10-17 с.

51


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

Настраиваем Cisco PIX Firewall 520 для трансляции соединений между сетями

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

Краткие сведения о Cisco PIX Firewall 520 520-я серия firewall компании Cisco устарела довольно давно – производитель более не поставляет их с ию-

52

ля 2001-го, не выпускает обновлений программного обеспечения с июня 2004-го, а поддержка аппаратной части закончится в июне 2006 года. Но несмотря на это firewall всё ещё остаёт-

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


безопасность ПК – корпус, материнская плата, блок питания, 3.5” привод для гибких дисков, которые с виду такие же, как у обычного ПК. Жёсткого диска у этого устройства, к счастью, нет, а в качестве долговременной памяти используется флешпамять, которая размещёна на отдельной PCI-плате расширения вместе с другими схемами, реализующими специфичные функции, такие как консольный порт и интерфейс перекрытия сбоев (Failover), который позволяет дублировать основной firewall резервным в случае выхода его из строя. Для интереса приведу основные технические характеРисунок 1. Схема сети ристики устройства, используемого в описанном случае – На третий интерфейс (www) с адресом 192.168.255.5: 768 Мб RAM, CPU Pentium III 848 МГц, Flash 16 Мб, 4 сете255.255.255.252, подключен веб-сервер, имеющий адрес вых адаптера 10/100. Операционная система, по словам представителей 192.168.255.6:255.255.255.252. компании Cisco, специально разработана для данных задач, что позволяет устройству обрабатывать намного боль- Настройка firewall ший поток данных, нежели обычные операционные систе- После того как схема сети рассмотрена, переходим немы для ПК. Версия операционной системы в конкретном посредственно к настройке firewall. Подробно будут описаны только моменты, непосредственно касающиеся наслучае – 6.3(4). Интерфейс командной строки весьма схож с интерфей- шей схемы. сом маршрутизаторов Cisco, но имеет некоторые недостатки, впрочем, не настолько существенные, чтобы их отде- Общие настройки Первоначальная настройка должна производиться через льно описывать. консольный порт. Затем можно будет управлять firewall удалённо по протоколу ssh. Схема сети Я полагаю, что нет необходимости подробно объясПростая типовая схема, которая довольно часто использунять использование базовых команд, таких как переется в небольших сетях (см. рис. 1). Firewall одним интерфейсом подключен к интернет-про- ход в привилегированный режим (enable), просмотр конфигурации (show run), переход в режим конфигурировайдеру. Ко второму интерфейсу подключен сервер, за которым вания (configure terminal), смена имени хоста (hostname) и домена (domain-name), установка паролей (passwd находится локальная сеть. На третий интерфейc отдельно вынесен веб-сервер. и enable password) и т. п. Приведу лишь простой пример: Это сделано из соображений безопасности, т.к. веб-сервер потенциально более уязвим, нежели другие наши службы, pix> enable и поэтому должен быть отделён от остальной сети, чтобы в случае его взлома уменьшить опасность для других комPassword: ******* пьютеров нашей сети. Кроме взлома сервера, нарушить pix# configure terminal работу сети может и большое количество запросов к нему, pix(config)# hostname pix-gtw pix-gtw(config)# domain-name my.domain.tld в этом случае отделение веб-сервера позволит локализоpix-gtw(config)# clock timezone KGT +6 вать подобную проблему. pix-gtw(config)# clock set 11:59:00 09 dec 2005 pix-gtw(config)# [Ctrl - Z] Зачастую для обозначения отдельного сегмента сети, pix-gtw# write mem предназначенного для размещения общедоступных серpix-gtw# quit висов, применяется термин DMZ (ДМЗ – демилитаризоПри смене имени или домена, например командой: ванная зона). Это название используется и в документации к firewall. В нашем же случае использовано название # domain-name my.domain.tld «www», которое является более простым и наглядным для описываемой схемы. На внешнем интерфейсе (outside) firewall имеется один появится следующее предупреждение: реальный IP-адрес, например 1.2.3.246:255.255.255.252, %Key pair with hostname my.domain.tld will be invalid полученный от провайдера. Адрес со стороны провайдера Дело в том, что имя и домен используются при генена нашем соединении – 1.2.3.245, для нас он будет маршрировании RSA-ключей, которые необходимы для цифрорутом по умолчанию. На внутреннем интерфейсе (inside) с адресом из при- вых сертификатов и подписей, в том числе для подключеватной подсети 192.168.255.1:255.255.255.252. К нему под- ние по ssh. В этом случае следует перегенерировать и соключен сервер с адресом 192.168.255.2:255.255.255.252. хранить новые ключи, возможно, потребуется сначала удаНа второй интерфейс сервера подключена локальная сеть лить старые: с адресами из сети 10.0.1.0:255.255.255.0. pix-gtw(config)# ca zeroize rsa Доменное имя, используемое в нашей сети, определим pix-gtw(config)# ca generate rsa key 512 как «my.domain.tld». pix-gtw(config)# ca save all

№12, декабрь 2005

53


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

access-group 101 in interface outside

Сохранить текущую конфигурацию в долговременную память можно командой: write mem

Записать конфигурацию на сервере по tftp-протоколу можно командой: write net 192.168.255.2:pix-gtw

где 192.168.255.2 – адрес tftp-сервера, а pix-gtw – имя файла.

Сетевые интерфейсы Эти интерфейсы имеют аппаратные идентификаторы (hardware_id), например ethernet0. Для каждого интерфейса задаётся его скорость и административное состояние: interface interface interface interface

ethernet0 ethernet1 ethernet2 ethernet3

К интерфейсу можно привязать списки доступа (access-list) для входящего и исходящего направлений, например список доступа 101 для входящего потока на интерфейсе outside:

auto auto auto auto shutdown

Сам список создаётся примерно как и на маршрутизаторах Cisco, например: access-list 101 permit tcp host 4.5.6.100 any eq 22 access-list 101 deny tcp any any eq 22 access-list 101 permit ip any any

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

Статическая маршрутизация Командой route можно добавить статический маршрут. Формат команды прост: route имя_интерфейса сеть маска шлюз [метрика]

Нам нужно добавить по меньшей мере маршрут по умолчанию, в нашем случае указывающий на адрес 1.2.3.245, В данном случае все интерфейсы в режиме автоопре- и доступный через интерфейс outside: деления скорости, при этом последний отключен за ненаroute outside 0.0.0.0 0.0.0.0 1.2.3.245 добностью. Кроме аппаратного идентификатора, интерфейсы имеют и имя, которое мы вольны задать сами. Вот пример задания имён интерфейсов: Протокол ICMP Протокол ICMP необходим для нормальной работы сеnameif ethernet0 outside security0 ти на базе стека протоколов TCP/IP, но некоторые тиnameif ethernet1 inside security100 пы сообщений данного протокола могут быть испольnameif ethernet2 www security20 nameif ethernet3 not_used security25 зованы злоумышленниками для сбора сведений о сети или для нарушения её нормальной работы. Поэтому для Последний параметр – уровень безопасности (security внешнего интерфейса firewall следует разрешить тольlevel) нуждается в пояснении. Число от 0 до 100 задаёт уро- ко самые необходимые типы сообщений ICMP, в данном вень безопасности данного интерфейса относительно дру- случае, это сообщения о недоступности хоста или сети гих интерфейсов – чем выше число, тем безопаснее счи- (unreachable) и сообщения об окончании времени жизни тается сеть. Это число абстрактно, т.е. само по себе не яв- пакета (time-exceeded). В следующем примере разрешаем весь ICMP на интерляется показателем безопасности сети. Этот параметр используется системой для определения возможности и спо- фейсе outside для одной сети и одного хоста, затем два тисоба обмена данными между интерфейсами – для доступа па сообщений на внешнем интерфейсе и весь ICMP на иниз более безопасной сети в менее безопасную должны ис- терфейсах inside и www: пользоваться команды nat и global, а для доступа из менее icmp permit 3.4.5.0 255.255.255.0 outside безопасной сети в более безопасную – static и access-list. icmp permit host 4.5.6.100 outside Интерфейсы же с одинаковыми уровнями безопасносicmp permit any unreachable outside icmp permit any time-exceeded outside ти вообще не могут работать друг с другом. icmp permit any inside Указываем IP-адреса на интерфейсах: icmp permit any www ip address outside 1.2.3.246 255.255.255.252 ip address inside 192.168.255.1 255.255.255.252 ip address www 192.168.255.5 255.255.255.252

К сожалению на один интерфейс можно назначить только один адрес.

54

Доступ к firewall по ssh Если firewall уже соответствующим образом настроен, то к нему можно подключиться по ssh с именем пользователя pix, например:


безопасность ssh pix@192.168.255.1

Доступ к firewall нужно ограничить минимально необходимым количеством хостов. Сделать это можно командой ssh: ssh 4.5.6.100 255.255.255.255 outside ssh 192.168.255.2 255.255.255.255 inside

Маска и интерфейс являются необязательными параметрами. Кроме этого доступ к ssh-порту должен быть открыт и в соответствующих списках доступа.

Сохранение логов на сервере Для удобства использования и хранения системных сообщений firewall лучше передать их на syslog-сервер. К примеру, передаём логи на хост 192.168.255.2 с идентификатором LOCAL7 (по нумерации firewall – 23), с уровнем warnings и выше (critical, alerts, emergencies), а также с идентификатором устройства «pix-gtw»: logging logging logging logging logging

on trap warnings facility 23 device-id string pix-gtw host inside 192.168.255.2

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

/var/log/pix.log

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

NAT и PAT Трансляции предназначены для того, чтобы дать возможность локальным хостам обращаться к хостам во внешнем мире. Кроме этого, трансляции скрывают адреса локальных хостов, что положительно сказывается на безопасности. В Cisco PIX используются два вида трансляций Network Address Translation (NAT) и Port Address Translation (PAT), которые, в свою очередь могут быть статическими или динамическими. NAT позволяет транслировать каждый локальный адрес в соответствующий ему глобальный один к одному. При статическом NAT это соответствие задаётся жёстко. При динамическом NAT используются свободные адреса из заданТаблица соответствий Откуда

Куда

Команда

inside

outside

nat

inside

www

nat

www

outside

nat

www

inside

static

outside

inside

static

outside

www

static

№12, декабрь 2005

ного диапазона глобальных адресов (пула). Количество локальных адресов, которые должны транслироваться, должно равняться количеству глобальных адресов. Данные о соответствии локальных и глобальных адресов хранятся в таблице трансляций. Идентификация трафика производится по соответствию локального и глобального адресов. PAT позволяет транслировать локальные адреса в один глобальный, случайным образом назначая для каждого соединения новый порт на глобальном интерфейсе. Идентификация трафика производится по соответствию адресов и портов. Статический PAT позволяет задать постоянное соответствие локальных и глобальных адресов и портов. Механизм работы трансляций достаточно прост – в пакете, полученном от локального хоста, адрес отправителя меняется на глобальный, а в случае использования динамического PAT, также меняется (на случайный) номер порта отправителя. В таком виде пакет и отправляется получателю во внешней сети, который отсылает ответный пакет на указанные адрес и номер порта отправителя. Получив пакет из внешней сети, firewall ищет в таблице трансляций соответствующую запись и, если таковая имеется, модифицирует полученный пакет, заменяя глобальный адрес получателя локальным и в случае динамического PAT также и номер порта получателя, после этого пакет отсылается локальному хосту. Практически все прикладные программы могут работать через NAT без каких-либо затруднений, т.к. производится только замена локального адреса, в случае же применения PAT не будут работать некоторые приложения, которые, например, используют разные порты для входящего и исходящего трафика. Один из особых вариантов NAT – исключение из NAT (NAT Exemption). Исключение из NAT настраивается командой: nat 0 access-list

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

Зависимость трансляций от уровней безопасности интерфейсов Как уже говорилось выше, способ настройки трансляции зависит от уровня безопасности интерфейсов – для настройки доступа из более безопасной сети в менее безопасную нужно использовать команду nat, а для доступа из менее безопасной сети в более безопасную – static. Для просмотра уровней безопасности можно воспользоваться командой: show nameif

которая также покажет и имена интерфейсов: nameif nameif nameif nameif

ethernet0 ethernet1 ethernet2 ethernet3

outside security0 inside security100 www security20 not_used security25

55


безопасность Применительно к нашей конфигурации сети можно составить простую таблицу (см. таблицу).

При изменении правил трансляции не забывайте выполнять команду «clear xlate».

Таблица трансляций (xlate)

Обращения из внешнего мира к серверу

Для трансляции соединений firewall создаёт таблицу соответствий, которая в терминологии Cisco PIX 520 называется xlate или translation slots. Мы можем посмотреть уже существующие записи в таблице командой «show xlate», а очистить всю таблицу – командой «clear xlate». Кстати, последнюю операцию рекомендуется делать после изменений правил трансляции, но учтите, что это приведёт к разрыву уже установленных соединений, если они созданы с использованием какой-либо трансляции. Для удаления только определённых записей можно указать глобальный или локальный адрес и, если это PAT, то и соответствующий порт:

На нашем сервере есть несколько служб, которые должны быть доступны извне, в нашем случае это DNS, SSH, SMTP, FTP. Для настройки трансляции с интерфейса outside на интерфейс inside используется команда «static». Команда static позволяет задать статическую трансляцию, указав точное соответствие локального адреса и глобального адреса и порта. В качестве порта можно указать его номер или имя. Соответствие номеров и имён портов описано в документации. В конфигурации firewall все номера портов заменяются их именами, если таковые известны. Кроме самой команды «static», необходимые разрешительные правила должны быть указаны в соответствующих списках доступа (access-list). Синтаксис команды «static», используемый в данном случае, достаточно прост:

clear xlate global 1.2.3.246 clear xlate local 192.168.255.6 lport 80

При отсутствии обмена записи в таблице трансляций удаляются по истечении тайм-аута, который задаётся командой «timeout xlate» и по умолчанию равен трём часам. Записи для протокола UDP удаляются через 30 секунд после закрытия соединения, независимо от заданного значения тайм-аута.

Обращения с сервера во внешний мир

static (локальный_интерфейс, глобальный_интерфейс) ↵ протокол глобальный_адрес локальный_адрес

Так же как в описанном ранее случае использования команды «global» мы можем в качестве глобального адреса указать ключевое слово interface. Следующей командой мы задаём статическую трансляцию с глобального интерфейса outside на локальный интерфейс inside для протокола tcp с 25-го порта глобального интерфейса на 25-й порт хоста 192.168.255.2:

Для настройки обращений сервера во внешний мир используются команды «global» и «nat». Команда «global» создаёт пул глобальных адресов, т.е. реальных адресов на внешнем интерфейсе, которые используются определённой трансляцией. В нашем случае static (inside,outside) tcp interface 25 192.168.255.2 25 пул состоит только лишь из одного адреса, который непосредственно указан на внешнем интерфейсе firewall, поэтому мы можем использовать ключевое слово interface вмесПрименительно к SMTP-протоколу нужно упомянуть, то собственно IP-адреса. что firewall из соображений безопасности изменяет строСледующей командой мы создаём глобальный пул ку приветствия нашего SMTP-сервера, заменяя почти всё с номером 1 на внешнем интерфейсе, использующий ад- звёздочками. Например, из строки: рес этого интерфейса, т.е. все обращения из этого пула бу220 mail.domain.tld ESMTP Sendmail 8.13.0/8.13.0; Mon, 5 Dec 2005 дут уходить во внешний мир с нашего глобального адре18:01:32 +0600 (KGT) са 1.2.3.246: получается что-то вроде этого: global (outside) 1 interface

Команда «nat» позволяет нам указать локальные адреса, которые должны транслироваться, и задаёт соответствие с пулом глобальных адресов, описанным командой «global». Следующей командой мы задаём, что обращения с хоста 192.168.255.2, подключенного на интерфейсе inside, будут транслироваться через глобальный пул номер 1: nat (inside) 1 192.168.255.2 255.255.255.255

Соответствие глобальных и локальных пулов определяется по номеру (NAT ID), который указывается в этих командах. Всё, можно проверять доступность внешнего мира с сервера.

56

220 ********************************0******0********** ***200**** *0***0 *0*00 *****

По аналогии с предыдущей командой выполняем следующие: static (inside,outside) tcp interface 20 192.168.255.2 20 static (inside,outside) tcp interface 21 192.168.255.2 21 static (inside,outside) udp interface 53 192.168.255.2 53

Для настройки подключения к серверу по протоколу ssh придётся использовать отличный от стандартного порт, т.к. 22-й занят самим firewall. Следующей командой мы задаём соответствие свободного порта на внешнем интерфейсе firewall (например 222) и стандартного ssh-порта сервера: static (inside,outside) tcp interface 222 192.168.255.2 22


безопасность Теперь при подключении к серверу извне нужно будет указать номер порта. Например, для клиента из пакета openssh команда будет выглядеть вот так: ssh -p 222 malik@1.2.3.246

Конечно же, firewall должен иметь маршрут для адресов локальной сети:

В то время как подключение к самому firewall будет производиться как обычно: ssh pix@1.2.3.246

Ну и конечно, в списке доступа на внешнем интерфейсе должны быть соответствующие разрешающие правила для обращений на порты, для которых мы настроили статическую трансляцию: access-list 101 permit tcp any host 1.2.3.246 access-list 101 permit tcp any host 1.2.3.246 access-list 101 permit tcp any host 1.2.3.246 access-list 101 permit udp any host 1.2.3.246 access-list 101 permit tcp host 4.5.6.100 ↵ host 1.2.3.246 eq 222

eq eq eq eq

20 21 25 53

Доступ к веб-сайту из внешнего мира Вот этой командой мы задаём статическую трансляцию с интерфейса outside на интерфейс www для протокола tcp с 80-го порта внешнего интерфейса на 80-й порт хоста 192.168.255.6: static (www,outside) tcp interface 80 192.168.255.6 80

В список доступа на внешнем интерфейсе добавляем разрешительное правило для 80-го порта: access-list 101 permit tcp any host 1.2.3.246 eq 80

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

Доступ из локальной сети к веб-серверу Если из локальной сети доступ к веб-сайту будет осуществляться также, как и из внешнего мира, т.е. только по протоколу http и на тот же глобальный адрес (1.2.3.246), то и достаточно будет статической транляции http-порта, но теперь нам нужно будет указать не ключевое слово interface, а именно IP-адрес, под которым мы бы хотели видеть вебсервер: static (www,inside) tcp 1.2.3.246 80 192.168.255.6 80

Если же мы хотим, чтобы веб-сервер был напрямую доступен с хостов локальной сети и от нашего сервера и обращения к нему вообще не транслировались, то надо использовать конструкцию «nat 0 access-list» и соответствующий список доступа: nat (inside) 0 access-list 110

№12, декабрь 2005

access-list 110 permit ip 10.0.1.0 255.255.255.0 ↵ host 192.168.255.6 access-list 110 permit ip host 192.168.255.2 ↵ host 192.168.255.6

route inside 10.0.1.0 255.255.255.0 192.168.255.2

Этот маршрут на firewall необходим и для взаимодействия веб-сервера с локальной сетью, т.к. firewall является для веб-сервера маршрутизатором по умолчанию.

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

Первый пример У нас есть несколько глобальных адресов, и мы хотим, чтобы обращения из внешнего мира на какой-либо их порт транслировались на определённые локальные адреса: static (inside,outside) tcp 1.2.4.1 80 192.168.0.1 80 static (inside,outside) tcp 1.2.4.2 80 192.168.0.2 80

Второй пример У нас есть несколько глобальных адресов, и мы хотим, чтобы все обращения от некоторых локальных хостов уходили во внешний мир со строго определённых глобальных адресов – настраиваем два разных глобальных пула и соответствующие им NAT: global (outside) 1 1.2.4.1 global (outside) 2 1.2.4.2 nat (inside) 1 192.168.0.1 255.255.255.255 nat (inside) 2 192.168.0.2 255.255.255.255

т.е. обращения с хоста 192.168.0.1 уйдут во внешний мир с адреса 1.2.4.1, а обращения с хоста 192.168.0.2 уйдут с адреса 1.2.4.2. А если при этом мы хотим, чтобы ещё и обращения извне на определённые глобальные адреса транслировались на соответствующие локальные, то нам надо сделать и обратную трансляцию: static (inside,outside) 1.2.4.1 192.168.0.1 static (inside,outside) 1.2.4.2 192.168.0.2

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

Документация Вся документация, использованная для настройки firewall и написания данной статьи, была взята с сайта компании Cisco (http://www.cisco.com): 1. Cisco PIX Firewall and VPN Configuration Guide. 2. Cisco PIX Firewall Command Reference. 3. Using NAT and PAT Statements on the Cisco Secure PIX Firewall.

57


web

Печатаем документы с веб-сервера

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

В

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

58

ния печатных отчетов. Однако создание информационной системы на базе веб-технологий позволяет обойтись без этих средств – работа с формами и БД средствами CGI-скриптов на PHP или Perl реализуется без проблем. При этом мы получаем программу, не требующую для своей работы у клиента ничего, кроме браузера, и позволяющую организовать удаленный доступ. И только одна проблема, элементарная для MS Access, не имеет адекватного решения для веб-программиста. Это печать документов.

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


web при печати, нет. (Вернее, в стандарте есть способ это указать [2], но вот когда это будет реализовано в браузерах, не известно.) Этих проблем лишен формат PDF. Но тут встает во весь рост вопрос формирования документа. Библиотеки для работы с PDF существуют, но сформировать красивый документ с их помощью будет непросто. А как быть с необходимостью изменять документы время от времени (взять хотя бы счет-фактуру)? Программист на Access просто подправит документ (report), возможно, одним движением мыши… Я предлагаю организовать печать с веб-сайта при помощи пакета OpenOffice. Цепочка действий будет такой: мы делаем в OpenOffice макет документа и помещаем его на сервер. Веб-скрипт заполнит поля в макете и добавит необходимые строки, в результате чего получится готовый документ, который останется только отправить на принтер.

Что такое OpenOffice? OpenOffice – это бесплатный пакет офисных программ [3]. Данный проект возник по инициативе и существует при поддержке фирмы Sun. Недавно вышла версия 2.0, но описываемая здесь технология реализована мной для версий 1.1.*, хотя есть основания полагать, что все будет работать и с последней версией, несмотря на переименование суффиксов у файлов документов. OpenOffice способен открывать и редактировать основные форматы MS Office и работает практически под любой ОС. Проект прилично документирован. В рамках данной статьи нас будет интересовать собственный формат документов OpenOffice. Разные приложения OpenOffice (Writer, Calc…) используют собственный суффикс для файлов, но файлы эти имеют почти схожую структуру – это ZIP, который содержит главный файл content.xml и вспомогательные, содержащие стили, пользовательские настройки, ресурсы и т. д. Content.xml – это обычный XML-файл, который можно обрабатывать при помощи всех известных XML-средств. Итак, мы будем самостоятельно формировать файл формата OpenOffice и распечатывать его при помощи самого OpenOffice. Для этого OpenOffice должен быть установлен или на машине клиента, или на самом сервере. Как мне кажется, для внутрикорпоративной системы более предпочтителен серверный вариант. При помощи OpenOffice легко получить и PDF, но об этом в конце статьи.

Как сгенерировать файл С точки зрения оформления документа, возможностей редактора OpenOffice (OOWriter) вполне достаточно, поэтому я ограничусь примерами использования файлов формата SXW, хотя предлагаемая технология будет работать практически с любым файлом, созданным приложениями из пакета OpenOffice. В версии 2.0 основной формат документов OOWriter имеет суффикс ODT, но структура файлов очень похожа. Для начала мы создаем макет в OOWriter. Макет – это почти готовый документ, в котором программно заполняемые поля обозначаются специальными сигнальными фразами. Выделяется специальными маркерами и табличная часть, если таковая имеется. Щедро используем шрифты,

№12, декабрь 2005

Рисунок 1. Макет

рамки, графические элементы, колонтитулы, устанавливаем необходимую ориентацию документа. Макет используется многократно, и при необходимости внести в форму документа изменения его нужно просто загрузить в редактор. Пример макета представлен на рис. 1. В рамках описываемой технологии мы выделяем три части документа: начальную часть, табличную часть (группу повторяющихся строк) и конечную часть, содержащую суммы, линии для подписей и т. д. Если документ не содержит табличной части, то он состоит только из одной начальной. Любая часть может содержать поля. Поле – это просто текст с именем поля, который будет заменен значением поля при генерации документа. Имя поля может быть набрано любым шрифтом и отформатировано любым способом, и должно соответствовать такому шаблону: fl.<part>.<field>

fl – это метка начала имени поля, <part> – указатель части документа (hd – начальная часть, ft – конечная, или имя вида строки табличной части), <field> – имя поля данной части документа. Например: fl.ft.Total

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

59


web Это место требует пояснения. Под элементом я имею в виду XML-элемент файла OpenOffice. Именно с этими элементами имеет дело скрипт при обработке файла. Однако при редактировании макета в OO.Writer никаких тегов не видно (этот редактор такой же WYSWYG, как и WinWord). Как же в нем указывать XML-элемент для строки табличной части? Тем не менее никакой особой сложности нет. Опыт показал, что наиболее удобно в качестве строки табличной части использовать или параграф, или строку размеченной таблицы. Просто аккуратно оформляем каждую строку табличной части в виде параграфа или размечаем таблицу средствами редактора. В примере на рис. 1 строкой табличной части является параграф, а для фиксирования ширины полей служат соответственно расставленные табуляции. При настройке скрипта останется только указать, что строка табличной части будет элементом типа <text:p>. Если мы будем использовать размеченную таблицу, то укажем тег <table:table-row>. После примера это станет болееменее понятно, а пока последнее трудное место. Конец табличной части должен быть явно обозначен. Это принципиально для работы скрипта. Для обозначения используется элемент того же типа, что и строка табличной части, но содержащий только текст «fl.EOT».В примере на рис. 1 хорошо виден такой параграф. А вот как выглядят эти параграфы табличной части непосредственно в XML (см. рис. 2).

Рисунок 2. Фрагмент XML-кода табличной части макета

Пример скрипта Что, собственно, нужно сделать? Распаковать ZIP, «пройтись» по XML-файлу и заменить одни текстовые значения на другие. Отыскать элемент строки табличной части, размножить его по числу строк, опять же, заменяя поля значениями. Наконец нужно поместить новый XML в копию старго ZIP и сохранить ZIP под новым именем. Возможность работы с ZIP и XML сейчас имеется, наверное, во всех языках. Здесь представлен пример реализации на PHP. Собственно операции по обработке SXW-файла убраны в библиотечный файл OODocFiller.php. Библиотека очень незатейлива, но все же для публикации ее текста в журнале великовата. Скачать ее можно по ссылке [1], никаких условий по ее применению автор не накладывает. Платформа может быть любой, для работы самого скрипта OpenOffice не нужен (он понадобится для печати). PHP должен быть скомпилирован со следующими модулями: ZIP, XPATH (для разбора XML), ENCODE (для перекодирования текстовых значений в UTF 8). К сожалению, в 4 версии PHP нет штатного модуля для создания ZIP-файлов, поэтому я использую библиотеку zip.lib.php из состава дистрибутива phpMyAdmin. Скачать ее можно с [1] или [4]. Представленный ниже скрипт будет создавать документ OpenOffice, используя макет из рис. 1. Макет лежит в файле template.sxw в той же директории, что и скрипт. 01: 02: 03: 04: 05: 06: 07: 08: 09:

60

include('OODocFiller.php'); // Подключаем макет $doc = new OODocFiller('template.sxw'); // Задаем параметры $doc->SetParameter("RowElement", 'text:p'); $doc->SetParameter("Encoding", "WINDOWS-1251"); // Определяем поля в начальной части

Рисунок 3. Сформированный документ 10: 11: 12: 13:

$hdr = &$doc->GetHeaderPart("Number", "Date", "Byer"); // Определяем поля в 2 типах строк табличной части // (С белым и серым фоном) $row1 = &$doc->GetNewRow("tb1", "Description", ↵ "Numb", "Price", "Amount"); 14: $row2 = &$doc->GetNewRow("tb2", "Description", ↵ "Numb", "Price", "Amount"); 15: // Определяем поле в конечной части 16: $ftr = &$doc->GetFooterPart("Total"); 17: 18: // Формирование документа 19: // Заполняем начальную часть 20: $hdr->Fill("12", "1.10.2005", "И.И. Иванов"); 21: // Заполняем табличную часть 22: // Виды строк чередуются для «полосатости» 23: $row1->Fill("Сапоги»,"2","12,50", "25,00"); 24: $row2->Fill("Пироги»,"1","10,00", "10,00"); 25: $row1->Fill("Плюшки»,"10","1,00", "10,00"); 26: $row2->Fill("DVD+R","1","5,00", "5,00"); 27: // Заполняем конечную часть 28: $ftr->Fill(«50,00»); 29: // Остается только сохранить сформированный документ ↵ в файл 30: if($doc->Error == ""){ 31: $fd = fopen ("report.sxw", "wb"); 32: $out = fwrite ($fd, $doc->GetBinaryResult()); 33: fclose($fd); 34: } 35: else{ 36: print "Error: ".$doc->Error; 37: }

После запуска скрипт должен создать файл report.sxw в этой же директории (см. рис. 3). Если, конечно, вы не забыли обеспечить соответствующие права. Небольшие пояснения. Строки 6 и 7 задают параметры. Параметров у этой библиотеки хватает, ознакомиться с ни-


web ми можно в файле OODocFiller.php. Все они имеют значения по умолчанию, поэтому если вас устроят стандартные настройки, то явно задавать ничего не нужно. Даже здесь строки 6 и 7 избыточны (даны для примера), они задают значения, которые используются по умолчанию. Внутреннее представление OpenOffice – UTF-8, поэтому важно правильно задать кодировку, в которой ваш скрипт будет давать значения полей при вызове библиотечных функций. Строка 10, создавая ссылку на обьект начальной части, определяет и имена полей в ней. Строка 16 полностью идентична 10, 13 и 14 задают два типа строк табличной части. Внутри макета они идентифицируются по именам, которые задаются в качестве первого параметра. Остальные параметры тоже имена полей. Строка 20 заполняет поля начальной части. Парметр Fill может быть единым массивом значений, что удобно при работе с БД. Вместо строк 23-26 обычно находится цикл выборки значений из таблицы БД.

Печать Итак, мы получили файл. Как отправить его на принтер? Первый способ – это печать с клиента. Для этого на клиенте должен быть установлен OpenOffice. При инсталляции он добавляет свои типы файлов в системный MIME, поэтому серверу достаточно передать сгенерированный файл с нужным HTTP-заголовком, и OpenOffice будет автоматически запущен браузером. Вот пример скрипта, который отправляет файл подобным образом: $content = file_get_contents("report.sxw"); header("Pragma: public"); header("Expires: 0"); header("Cache-Control: must-revalidate, post-check=0, ↵ pre-check=0"); header("Cache-Control: private",false); header("Content-type: application/vnd.sun.xml.writer"); header("Content-Disposition: attachment; filename= ↵ report.sxw;"); header("Content-Transfer-Encoding: binary"); header("Content-Length: ".filesize("report.sxw")); print $content;

на своем сервере организовали вторую X-консоль. Вот что мы добавили в наш /etc/inittab файл: x1:5:respawn:/usr/X11R6/bin/xinit /usr/X11R6/bin/xclock ↵ -- /usr/X11R6/bin/Xorg :1

Смысл полей этой строки примерно следующий:

 x1 – это просто уникальный идентификатор строки;  5 – это уровень инициализации, при котором строка будет использоваться (5 – графический режим);

 respawn – перезапускать при завершении;  xinit xclock – Xorg-запуск графической консоли с программой часы (наличие часов не дает xinit завершиться);  1 – номер создаваемого графического экрана. Этот номер экрана мы будем сообщать OpenOffice при запуске в пакетном режиме. Теперь нужно определиться, под каким пользователем веб-сервер будет запускать скрипты для печати. Этот пользователь должен обязательно иметь домашнюю директорию. Необходимо один раз зайти этим пользователем и запустить любую программу OpenOffice. При этом в домашней директории создадутся персональные файлы OpenOffice. Без этих файлов пакетный режим, к сожалению, не сработает, поэтому важно, чтобы при работе скрипта переменная окружения HOME была определена и указывала именно на домашнюю директорию этого пользователя. Если все требования соблюдены, то теперь скрипт, работающий под упомянутым пользователем, при помощи команды: <путь к исп.файлам OO>/soffice -display :1 –p <документ>

распечатает документ на принтер, установленный по умолчанию. Обратите внимание, что число у display – это номер графического экрана из inittab. Если же на вашем Linux-сервере определено несколько принтеров и вы хотите при печати иметь возможность выбора принтера, то познавательный процесс настроек буВторой способ – это отправка на печать непосредствен- дет продолжен. Дело в том, что в версиях 1.1.* не убрали какую-то отлано с сервера (мы ведь ведем речь о внутрикорпоративной информационной системе). дочную заглушку. Поэтому в пакетном режиме OpenOffice Для отправки документа на печать из-под Windows до- всегда печатает на принтере, являющимся по умолчанию на момент старта программы. статочно запустить следующее: Как же быть? Мы еще не тестировали на этот счет <путь к исп.файлам OO>\SOFFICE.EXE –pt"<принтер>" <документ> OpenOffice 2.0, а для версии 1.1.* вышли из положения при помощи печати через PDF. Файлы PDF печатаются системными средствами Linux куда угодно, и кроме того, возможили при печати на принтер по умолчанию: ность генерации PDF имеет самостоятельную ценность. <путь к исп.файлам OO>\SOFFICE.EXE –p <документ>

На Linux-сервере все будет немного сложнее, плюс для настройки потребуются привилегии root. Но преодоление трудностей всегда раздвигало горизонты. Прежде всего, для OpenOffice, даже для работы в пакетном режиме, необходимо наличие запущенного X-терминала. На сайте oooforum.org [5] можно найти рецепты, как организовать для этих целей виртуальный терминал, например Xvfb [6], который вовсе не имеет доступа к экрану. Мы же

№12, декабрь 2005

Как конвертировать SXW в PDF OpenOffice хорошо сохраняет свои файлы в PDF. Можно это делать и в пакетном режиме. Вот как выглядит подготовка Linux-сервера для реализации такой возможности. Прежде всего необходимо добавить макрос в среду OpenOffice. Заходим в систему пользователем, под которым будут работать скрипты, и запускаем OpenOffice. Проходим по меню «Tools → Macros → Macro» и нажимаем кнопку «Organizer», выбираем закладку (tab) «Libraries» и в выпа-

61


web #!/bin/bash # Первый параметр – имя принтера, # второй – имя (лучше полное) SXW-файла. Printer=$1 # Получаем имя для PDF-файла PDFname=${2/.sxw/.pdf} # Внимание, замените :1 на номер графического дисплея, # который вы указали в inittab # Если вы назвали свою библиотеку не Example, # то не забудьте подправить и это /usr/lib/ooo-1.1/program/soffice -display :1 ↵ "macro:///Example.Print.ConvertWordToPDF($2)" # В предыдущей строке мы создали PDF-файл с тем же # именем (кроме суффикса) и в том же месте, что и SXW # А теперь печатаем PDF lp -s -d $Printer $PDFname Рисунок 4. Окно редактора basic скрипта OpenOffice

# Удаляем PDF rm $PDFname

дающем списке «Application/Document» выбираем «soffice». Нажимаем кнопку «New» и вводим имя своей библиотеки, например Example. Переходим на закладку «Modules» и выбираем свою библиотеку (Example) из списка. Нажимаем кнопку «New Module» и даем ему имя (Print). Теперь выделяем появившийся модуль и нажимаем «Edit». Добрались (см. рис. 4)! Мы в более-менее привычном редакторе языка Basic. Текст необходимых процедур:

Теперь, чтобы напечатать SXW-документ, нам достаточно запустить:

Sub ConvertWordToPDF( cFile ) On Error GoTo ErrHandler ' Открываем файл cURL = ConvertToURL( cFile ) oDoc = StarDesktop.loadComponentFromURL(cURL, ↵ "_blank", 0, Array(MakePropertyValue( "Hidden", ↵ True ),)) ' Получаем имя для PDF-файла cFile = Left( cFile, Len( cFile ) - 4 ) + ".pdf" ' Сохраняем через PDF-фильтр cURL = ConvertToURL( cFile ) oDoc.storeToURL( cURL, Array(MakePropertyValue( ↵ "FilterName", "writer_pdf_Export" ),) oDoc.close( True )

Смысл данной статьи заключается не в описании представленной библиотеки, а в демонстрации идеи. Для того чтобы добавить в веб-систему функцию печати, вовсе не обязательно покупать что-то вроде CrystalReport. Обработка XML не сложна и может быть осуществлена на любом языке. Кроме того, в качестве принт-процессора можно использовать, например, TeX. Главное, берем макет, отыскиваем в нем поля… Но OpenOffice все-таки заслуживает внимания. В целом это зрелый и устойчивый продукт. Описанная реализация вполне работоспособна, но требует дальнейшего развития. Например, печать каждого экземпляра документа требует запуска тяжелого приложения (soffice). Это может оказаться не быстро. Тут есть разные пути модернизации. Во-первых, у OpenOffice есть резидентный модуль quickstart, который должен ускорять запуск. Можно попытаться запускать quickstart из inittab. Во-вторых, у OpenOffice есть серверный режим, при котором он будет обслуживать удаленные запросы. Есть API. Но с этим разбираться и разбираться. Успехов!

ExitSub: Exit Sub ErrHandler: Shell("logger", 6, "-t ooffice ConvertWordToPDF: ↵ " + Error$) End Sub Function MakePropertyValue( Optional cName As String, ↵ Optional uValue ) As com.sun.star.beans.PropertyValue Dim oPropertyValue As New com.sun.star.beans ↵ .PropertyValue If Not IsMissing( cName ) Then oPropertyValue.Name = cName EndIf If Not IsMissing( uValue ) Then oPropertyValue.Value = uValue EndIf MakePropertyValue() = oPropertyValue End Function

Это все есть в файле print.bas на [1] – открываем его каким-нибудь редактором и копируем содержимое в модуль. Сохраняемся и выходим из OpenOffice. Для упрощения использования механизма печати через PDF создадим небольшой shell-скрипт, который разместим в директории, упоминаемой в PATH, например, пусть полное имя будет /usr/local/lib/ooprint:

62

ooprint myprinter report.sxw

Если же вместо печати нужна просто конвертация в PDF, то нужно создать модифицированную версию ooprint. Надеюсь, что это ни для кого не составит трудности.

Заключение

Ссылки: 1. Файлы к статье – http://samag.ru/cgi-bin/go.pl?q=source. 2. Cпецификация w3c для CSS 2 – http://www.w3.org/TR/RECCSS2/page.html. 3. OpenOffice – http://www.openoffice.org. 4. PhpMyAdmin – http://www.phpmyadmin.net. 5. Форум по OpenOffice – http://www.oooforum.org. 6. Virtual framebuffer X server for X Version 11 – http://www.xfree86. org/current/Xvfb.1.html.


web

Многоликий Apache Размещаем несколько сайтов на одном веб-сервере

Павел Малахов Установив веб-сервер Apache и предоставив через него на всеобщее обозрение свой сайт, некоторые и не подозревают, каким мощным инструментом они владеют. С его помощью можно управлять сотнями сайтов с разными именами и уровнями доступа. Денежная стоимость и временные затраты на добавление каждого сайта при этом минимальны.

В

еб-сервер Apache, популярный благодаря своей про-  Сделать перенаправление нескольких имён на один зрачности для программистов и администраторов сайт. и не в последнюю очередь благодаря бесплатности, реализован под все более-менее популярные опера- Делаем ционные системы. Его настройки для всех ОС одинаковы, Пойдём от простого к сложному. Для начала рассмотрим различаются только пути, где хранятся конфигурационные случай, когда у нас два сайта и два имени teo.mynetwork.ru файлы. На одном сервере может быть запущено несколь- и logos.mynetwork.ru. Эти имена должны быть доступны, ко экземпляров Apache, прослушивающих разные адреса т.е. держатель зоны mynetwork.ru должен прописать в ней и/или порты. Один экземпляр может обслуживать несколь- узлы teo и logos. Для каждого сайта создаём каталог в корневом како сайтов (подробнее об этом ниже). Проект настолько популярен, что постоянно обрастает новой функциональностью. талоге документов Apache (teo и logos соответственно). О степени популярности можно судить либо по статистике, Для Linux это по умолчанию /var/www/html, но чтобы убечто, на мой взгляд, довольно опрометчиво, либо по конкрет- диться, где он расположен на нашем сервере, смотрим знаным фактам. Фактов популярности Apache мы приведём два. чение директивы DocumentRoot в /etc/httpd/conf/httpd.conf. Во-первых, его наличие в качестве веб-сервера по умолча- Итак, создаём: нию в большинстве UNIX-подобных операционных систем. # mkdir /var/www/html/teo /var/www/html/logos Во-вторых, такой гигант в области ИТ, как компания Oracle, принял его в состав своего продукта Oracle Application Server 10g, где он играет одну из ключевых ролей. Мы будем разделять журналы для каждого сайта, поэтому создадим соответствующие каталоги:

У нас есть

 Компьютер с установленным пакетом Apache 1.3

# mkdir /var/log/httpd/teo /var/log/httpd/logos

или 2.0.

 А д р е с с е р ве ра в Ин те р н ете: 10.0.10.15 и и м я : teo.mynetwork.ru.  Адрес сервера в локальной сети: 192.168.100.18.  Несколько сайтов.  Несколько имён для одного сайта.

Хотим

 Разместить все сайты на одном сервере.  Сделать доступ к каждому сайту по отдельному URL.  Ограничить доступ к некоторым сайтам.

№12, декабрь 2005

Если у нас уже был создан сайт, то всё его содержимое переносим в созданный для него каталог, т.е. из /var/www/html в /var/www/html/teo. Новый сайт logos.mynetwork.ru размещаем в /var/www/html/logos. Теперь настраиваем Apache. Добавляем в конец файла /etc/httpd/conf/httpd.conf: NameVirtualHost 10.0.10.15 <VirtualHost teo.mynetwork.ru> DocumentRoot /var/www/html/teo ServerName teo.mynetwork.ru

63


web ErrorLog /var/log/httpd/teo/error_log CustomLog /var/log/httpd/teo/access_log combined </VirtualHost> <VirtualHost logos.mynetwork.ru> DocumentRoot /var/www/html/logos ServerName logos.mynetwork.ru ErrorLog /var/log/httpd/logos/error_log CustomLog /var/log/httpd/logos/access_log combined </VirtualHost>

Redirect /samag http://samag.ru Redirect /ftp/ ftp://citkit.ru/pub/ Redirect /find/ya.htm http://yandex.ru

При этом Apache воспринимает первый параметр директивы Redirect не как URL, а как набор символов, при совпадении с которым происходит перенаправление. Отсюда следует, что он не проверяет наличие указанных каВсе настройки, не заданные для сайта явным образом талогов и файлов, а ссылки /samag и /samag/ не считает в директиве VirtualHost, наследуются от глобальных настро- одинаковыми. ек Apache, указанных выше в этом же файле. Перезапускаем Apache: Ограничиваем доступ к сайтам Теперь если пользователь обратится к нам по IP-адресу либо # /etc/init.d/httpd restart по имени, на которые наш сервер откликается (см. врезку), то Apache сначала определяет, не удовлетворяет ли запрос Теперь, обращаясь по DNS-именам, мы будем получать описанным директивами VirtualHost сайтам, и если не нахоразные сайты. Если обратиться по IP-адресу, то получим дит ни один из них, то выдаёт сайт по умолчанию, который находится в каталоге, заданном глобальной директивой сайт teo.mynetwork.ru, т.к. он подключен первым. DocumentRoot, т.е. уровнем выше остальных. Таким образом, получается, что пользователь может попасть на любой Создаём ссылки с нескольких из виртуальных сайтов не тем путём, какой мы для него приDNS-адресов на один сайт Это можно осуществить двумя способами: созданием си- готовили, т.е. http://logos.mynetwork.ru/. Например, набрав нонимов или перенаправлением всех обращений с друго- в адресной строке браузера «http://192.168.100.18/logos/», он получит сайт logos.mynetwork.ru. Правда, в этом случае го сайта. Синонимы задаются директивой ServerAlias, могут со- документы, использующие ссылки на ресурсы этого же сайдержать маску и разделяются пробелом. Вот несколько при- та, будут некорректно отображаться, потому что ссылки демеров создания синонимов: лаются относительно корня сайта, и если это была ссылка /img/picture.jpg, то во втором случае этот же файл уже ServerAlias www.teo.mynetwork.ru нужно искать по ссылке /logos/img/picture.jpg, этого же брауServerAlias *.teo.mynetwork.ru зер не знает. Таким образом, здесь все зависит от того, доServerAlias www.teo.mynetwork.ru god.mynetwork.ru pantheon.ru гадывается ли пользователь, в каких каталогах мы храним Синоним – это DNS-имя. Имена могут быть абсолют- наши сайты. В принципе в этом нет ничего плохого, ведь но любыми, в том числе и из разных доменов, но все они мы в любом случае выложили сайты, чтобы их посещали должны разрешаться в IP-адреса, то есть их предваритель- (правила по ограничению доступа к ресурсу всё равно буно нужно зарегистрировать в DNS. дут действовать, о них мы поговорим чуть позже), но какПеренаправление задаётся директивой Redirect. Создаём то это выглядит некрасиво (для того и двери, чтобы в окна новый пустой сайт pantheon.ru. Как и для предыдущих сайтов, не лазить). Чтобы устранить эту некрасивость, можно поэто делается в три шага: создание каталога для документов, местить сайт по умолчанию на тот же уровень, что и остальдля журналов и добавление конфигурации в httpd.conf: ные сайты, т.е. создать каталог /var/www/html/default и указать его в двух директивах глобальных настроек (т.е. до опи<VirtualHost pantheon.ru> сания виртуальных сайтов). DocumentRoot /var/www/html/pantheon ServerName pantheon.ru ErrorLog /var/log/httpd/pantheon/error_log CustomLog /var/log/httpd/pantheon/access_log combined Redirect / http://teo.mynetwork.ru </VirtualHost>

Можно перенаправлять не со всего сайта, а только с определённого каталога или даже документа:

Особенности директив Listen и NameVirtualHost Директива Listen имеет больший приоритет чем, NameVirtualHost. Она говорит, откуда принимать запросы. В то время как последняя определяет, как обрабатывать полученный запрос. Это значит, что если указано значение «Listen 80», то Apache будет прослушивать порт 80 на всех IP-адресах, и директива «NameVirtualHost 10.0.10.15» не ограничивает запросы, пришедшие на другие адреса, и они будут обрабатываться наравне с указанным адресом, а если указано значение «Listen 10.0.10.15:80», то «NameVirtualHost 192.168.100.18» не возымеет действия, и сайт будет не доступен из локальной сети.

64

DocumentRoot "/var/www/html/default" ... # This should be changed to whatever you set DocumentRoot to <Directory "/var/www/html/default">

Теперь перейдём непосредственно к раздаче прав доступа. Существует два способа указать права доступа к каталогу веб-сайта средствами Apache: поместить в каталог файл .htaccess либо использовать директиву <Directory> в файле конфигурации. В обоих случаях правила распространяются и на вложенные каталоги. Перечислим преимущества использования файла .htaccess:  при его изменении не нужно перезапускать Apache;  при одинаковом уровне доступа к разным ресурсам можно пользоваться ссылками на один файл .htaccess;  можно предоставить пользователю право редактирования этого файла, что удобно, если у нас сервер с множеством клиентских сайтов.


web Есть и недостатки:

 для того чтобы ответить на вопрос: «какие ограничения

Options +Indexes Order deny,allow Deny from all Allow from 192.168.100.11 Allow from 192.168.100.17

доступа существуют на сайте?» – администратору необходимо помнить, в каких каталогах лежат эти файлы и файл /var/www/html/logos/info2/.htaccess: и ссылки;  если сайт будет переноситься на другой сервер, AuthType Basic и, что очень вероятно, будет размещён в другом каAuthName "Boss" талоге, то для корректировки ссылок уйдёт много AuthUserFile "/var/www/main_users" Require valid-user времени;  повышается нагрузка сервера, т.к. при каждом запроОба варианта настройки равноправны и создают слесе на ресурс он обращается к .htaccess в этом каталоге и всех верхних по иерархии, наследуя их настройки т.е. за- дующие ограничения. Доступ к ресурсу http://logos.mynetwork.ru/info1/ смопрос на ресурс http://teo.mynetwork.ru/olimp/staff/zeus.htm инициирует проверку .htaccess-файлов в каталогах гут получить только два пользователя из локальной се«./», «./olimp/», «./olimp/staff/». ти с указанными IP-адресами (хотя такие ресурсы лучше хранить на внутренних веб-серверах), ещё мы дали Определяя настройки доступа к каталогам сайта с по- разрешение Apache, в случае отсутствия в каталоге намощью директивы <Directory> в одном конфигурацион- чальной страницы генерировать html-документ с содерном файле всего сайта, мы получим следующие преиму- жимым каталога. Для доступа к ресурсу http://logos.mynetwork.ru/info2/ щества:  можно быть уверенным, что ничего не пропустим, если будут запрошены имя пользователя и пароль, которые бувдруг нужно изменить уровень доступа к какому-нибудь дут сверены с данными в файле /var/www/main_users. Соресурсу; здадим этот файл:  повышаем скорость реакции сервера на запросы, # touch /var/www/main_users т.к. все настройки загружаются при старте Apache. # chown root.webmaster /var/www/main_users

Ну а мириться придётся с тем, что для каждого каталога необходимо описывать права отдельно (помним, что для подкаталогов права наследуются), даже если они одинаковые. Правда, есть поддержка масок, например: <Directory ~ "^/www/.*/[0-9]{3}">

будет соответствовать именам каталогов в /www/ состоящим из трёх цифр, но это не всегда может облегчить ситуацию. Мы рассмотрим оба способа и изменим права доступа к двум каталогам сайта logos. Первый. Описываем права доступа к каталогам в главном конфигурационном файле httpd.conf: <VirtualHost logos.mynetwork.ru> DocumentRoot /var/www/html/logos ServerName logos.mynetwork.ru ErrorLog /var/log/httpd/logos/error_log CustomLog /var/log/httpd/logos/access_log combined <Directory /var/www/html/logos/info1> Options +Indexes Order deny,allow Deny from all Allow from 192.168.100.11 Allow from 192.168.100.17 </Directory> <Directory /var/www/html/logos/info2> AuthType Basic AuthName "Boss" AuthUserFile "/var/www/main_users" Require valid-user </Directory> </VirtualHost>

Второй. Чтобы предоставить такие же права с помощью файлов .htaccess, нужно создать соответственно файл /var/www/html/logos/info1/.htaccess:

№12, декабрь 2005

Добавим в него пользователя chef: # /usr/bin/htpasswd /var/www/main_users chef

Остальных пользователей добавляем аналогичным способом. Такие файлы создаём для каждой группы пользователей с одинаковыми правами доступа к ресурсу. Одни и те же группы можно использовать во всех сайтах.

Последние штрихи В заключение можно для изящности выделить настройку каждого сайта в отдельный файл, и подключить их в httpd.conf: Include /etc/httpd/conf/vhosts/teo.conf Include /etc/httpd/conf/vhosts/logos.conf Include /etc/httpd/conf/vhosts/pantheon.conf

Кроме изящности мы получаем удобство в быстром подключении и отключении сайта путём добавления/снятия символа комментария «#» в начале строки. Это особенно актуально, когда настройка каждого сайта раздувается на несколько десятков строк. Также нелишне будет настроить ротацию журналов с помощью logrotate.

Ссылки: 1. http://httpd.apache.org/docs/1.3/vhosts – официальная документация по созданию виртуальных сайтов. 2. http://httpd.apache.org/docs/2.0/vhosts – другая версия этой же документации для версии Apache 2.0. Отличия, на мой взгляд, коснулись только формы самой документации. 3. http://httpd.apache.org/docs/2.0/ru/howto/htaccess.html – пособие по настройке .htaccess-файлов.

65


web

AJAX: заработавший JavaScript

Вячеслав Родионов Уже более 10 лет в Интернете не наблюдалось таких cущественных перемен. Ajax – технология, основанная на JavaScript, которая изменит представление о Всемирной сети. Благодаря ей через несколько лет мы не увидим скучных сайтов, ограниченных в функциональности – интернет-страницы будут иметь такой же внешний вид и возможности, как и современные десктоп-приложения. Похоже, JavaScript дожил наконец до своего звёздного часа.

Т

ехнология Ajax, о которой пойдёт и понимания идеи его революционносречь, медленно, но верно захва- ти для Всемирной паутины. тывает просторы Интернета. Всем известные примеры, такие как GMail Эволюция Интернета и GoogleMaps – это только цветочки. Для людей, хоть немного имеющих У новой платформы очень большие отношение к веб-программированию, амбиции. Сайты, написанные на Ajax, уже давно не секрет, что со времён появляются со скоростью, сравнимой 1995 года, когда появились первые со скоростью появления приложений полноценные динамические веб-припосле изобретения микропроцессоров. ложения, Интернет остаётcя по своей Именно с технологией Ajax связыва- сути почти неизменным. Внешне, коют громкую и многообещающую кон- нечно же, что-то менялось за эти гоцепцию под названием Web 2.0 (http:// ды: по крайней мере, само наполнеwww.paulgraham.com/web20.html). Поэ- ние сайтов постоянно трансформиротому Ajax стоит как минимум того, что- валось и выходило на всё более качесбы потратить полчаса на изучение ос- твенный уровень. Вспомните типичные новных принципов функционирования веб-странички (если кто-то ещё их пом-

66

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


web ресную строку своего браузера, либо ввести тот же URL косвенно, заполнив данные формы и отправив их серверу на обработку. В любом случае пользователю приходилось проводить некоторое время в бездействии, сидя перед пустым или постепенно заполняющимся экраном. Минусов у такого подхода очень много, ведь пользователь, особенно в нашей стране, не всегда имеет достаточно быстрый канал, чтобы постоянно гонять поток килобайтов по сети туда и обратно, кроме того, новая страничка зачастую более чем на 90% состоит из информации, которую вы уже загружали раньше. Выходит, что, кроме времени, вы ещё и впустую тратите свои деньги за трафик. Всех этих минусов лишён подход написания страниц, использующий технологию Ajax.

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

№12, декабрь 2005

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

Ajax в действии Давайте наконец посмотрим, из чего состоит Ajax. Технология Ajax является совместным использованием таких технологий, как:  HTML (а точнее, XHTML) и CSS – языки, которые необходимы, как и прежде, для визуального представления данных приложения пользователю.  JavaScript – язык, который является основной движущей силой Ajax и который отвечает за взаимодействие между клиентом и сервером.  DHTML – динамический HTML, технология, которая помогает обновлять компоненты страницы динамически, не перегружая саму страничку.  XML – собственно язык, на котором в Ajax общаются сервер и клиент и который является «материалом» для построения сайта.  DOM – объектная модель документа, технология, которая нужна как для обработки и управления структурой сайта (HTML), так и для обработки возвращаемых сервером данных (XML). Кстати, само название Ajax имеет определённый смысл, это сокращение от «Asynchronous JavaScript and XML» (асинхронный JavaScript и XML). Данная аббревиатура была введена Джессом Джеймсом Гарреттом (Jesse James Garrett) из Adaptive Path в статье, впервые описавшей собственно саму технологию Ajax. Как видите, все технологии существуют не первый день и достаточно хорошо известны любому современному программисту. Основной трюк при написании Ajax-приложения – это использование объекта XMLHttpRequest. Как бы странно это ни звучало, но этот объект – то единственное новшество, которое есть в Ajax. Никаких других новых технологий в этой платформе нет. Но, как оказалось, и этого вполне достаточно для того, чтобы в корне изменить поведение веб-приложений. Так что давайте перейдём к непосредственному написанию кода, чтобы понять, как работает этот самый объект, который вызвал такой ажиотаж. Чтобы написать Ajax-приложение, нам понадобится создать экземпляр объекта XMLHttpRequest. В случае, соответствующем стандартам программирования, это будет выглядеть так: <script language="javascript" type="text/javascipt"> var xmlhttp = new XMLHttpRequest(); </script>

Как всегда, этот пример будет работать везде, кроме браузера компании Microsoft – Internet Explorer. Эти традиции неизменны с 1995 года и, как всегда, мы должны об-

67


web //здесь идёт обработка полученных данных рабатывать отдельно случай IE и случай не-IE. Но об этом } ещё пойдёт речь. } Рассмотрим стандартный механизм. Обычно пользователь, чтобы совершить какое-либо действие на странице, Думаю, будет проще это понять, если вы немного знадолжен фактически заполнить некоторую форму, отправить комы с объектно-ориентированным программированием её серверу, тот должен обработать и вернуть новую странич- и технологией обратного вызова. Но даже в случае, если ку браузеру, который отобразит её вместо текущей. Имен- об ООП вы только слышали, то нетрудно понять, что всё, но этот механизм мы и собираемся изменить. Вместо ожи- что мы делаем, – это назначаем функцию, которая будет дания новой страницы от сервера мы собираемся передать вызываться при поступлении данных от сервера. Следанные из формы на обработку JavaScript-функции. После дует знать и понимать, что this во время вызова функэтого из объекта xmlhttp будет сформирован и отправлен ции onreadystatechange (функции обратного вызова) бузапрос к серверу. Важное отличие такого подхода заключа- дет объектом xmlHttp, а responseText будет соотвественется в том, что процесс отсылки данных пройдёт незаметно но переменной этого объекта, в которую будет помещён для пользователя. Он сможет продолжать перемещаться по ответ сервера. Тонкость в том, что мы не знаем, когда страничке и даже использовать Javascript-функции. А когда именно ждать ответа сервера, поэтому мы не будем его от сервера придут данные, то опять же с помощью Javascript- ждать вообще, вместо этого, когда придет ответ, то профункционала будет решено, что с этими данными делать, изойдёт 3 события: будет изменено состояние объекта и изменения можно будет внести в страничку без перезаг- xmlHttp (xmlHttp.readyState), ответ будет помещён в перузки, просто добавив, убрав или изменив определённые ременную xmlHttp.responseText и будет вызвана функция элементы в объектной модели документа. xmlHttp.onreadystatechange(). Рассмотрим этот механизм подробнее на примере проНадеюсь, механизм прояснился более или менее. Остастейшего Ajax-приложения. лось лишь одно тёмное место – состояния объекта. Что же это такое? Листинг 2. В общем-то, ничего сложного. Просто для того, чтобы <script language="javascript" type="text/javascipt"> мы могли узнать, что и когда делать, объект xmlHttp имеfunction connectServer(){ var xmlHttp = new XMLHttpRequest(); ет 5 состояний: xmlHttp.open("GET", ↵  0 – «uninitialized» – объект не инициализирован; "http://ourserver.org/ajax_service.php",true);  1 – «loading» – объект подгружает свои данные; xmlHttp.onreadystatechange = function(){  2 – «loaded» – объект загружен; if (xmlHttp.readyState == 4) { var xmlData = this.responseText;  3 – «interactive» – можно работать, хотя ещё не весь от//здесь идёт обработка полученных данных вет сервера прочитан; } }  4 – «complete» – можно работать, всё загружено. xmlHttp.overrideMimeType('text/xml'); xmlHttp.send(null);

} </script>

Возможно, код немного напугал вас своей экстравагантностью, но не спешите закрывать статью. Сейчас мы поймём, что всё написано абсолютно логично и чётко, а главное, просто. Первая непонятная строчка выглядит так: xmlHttp.open("GET", ↵ "http://ourserver.org/ajax_service.php",true);

Здесь мы вызываем метод open, необходимый для установления соединения между нашим объектом XMLHttpRequest и сервером. Первый параметр указывает на метод передачи данных («POST» и «HEAD» тоже можно использовать, но мы пока этого случая касаться не будем), второй – на URL, которому отправляется запрос, и от которого приходит ответ. Третий параметр устанавливает режим асинхронной передачи данных. Это значит, что работа веб-приложения не будет остановлена в ожидании ответа сервера. Наоборот, в поведении странички ровным счётом ничего не изменится, и только тогда, когда придет ответ от сервера, мы увидим изменения. У людей, не владеющих тонкостями JavaScript, наверняка вызвали беспокойство строчки: xmlHttp.onreadystatechange = function(){ if (xmlHttp.readyState == 4) { var xmlData = this.responseText;

68

Пока что нас интересует только состояние 4. Его мы и обрабатываем. Рассмотрим код дальше. Осталось самое простое: xmlHttp.overrideMimeType('text/xml'); xmlHttp.send(null);

В первой строчке мы говорим серверу о том, что хотим получить ответ, соответствующий mime-типу text/xml. Это своего рода формальность, так как не все браузеры умеют обрабатывать ответ сервера только в строго определённом формате. Вторая строчка – это собственно отправка данных на сервер. Аргументом являются параметры, отправляемые серверу, если мы используем метод «POST» для передачи данных. Так как мы отсылаем GET-запрос, то и передавать ничего не будем. В нашем примере мы вообще не передаём никаких параметров, но если бы мы этого хотели, то в вызов xmlHttp. open следовало бы вставить стандартный GET-запрос вида http://ourserver.org/ajax_service.php?name=foo&value=bar. В примере, в конце статьи мы так и поступим. Итак, теперь вы знакомы с базовым механизмом работы Ajax-приложения. Осталось написать программу, которая будет иметь какой-либо практический смысл, пусть даже совершенно условный. Напишем приложение для проверки почты в системе Gmail:


web <html> <head> <meta HTTP-EQUIV="content-type" ↵ CONTENT="text/html; charset=UTF-8"> <title>Проверка почты с помощью новейших ↵ технологий</title> </head> <body> <script language="javascript" type="text/javascript"> var xmlHttp = false; function callServer(name, password) { try {

}

netscape.security.PrivilegeManager. ↵ enablePrivilege("UniversalBrowserRead"); } catch (e) { alert("Недостаточно прав, чтобы использовать ↵ Ajax!");

//обычный браузер if (window.XMLHttpRequest) { try { xmlHttp = new XMLHttpRequest(); } catch(e) { xmlHttp = false; } } else / случай IE if (window.ActiveXObject) { try { xmlHttp = new ActiveXObject ↵ ("Msxml2.XMLHTTP"); } catch(e) { try { xmlHttp = new ActiveXObject ↵ ("Microsoft.XMLHTTP"); } catch(e) { xmlHttp = false; } } }

}

xmlHttp.onreadystatechange = function() { if (xmlHttp.readyState == 4) { var xmlData = xmlHttp.responseText; var xmlobject = (new DOMParser()).parseFromString ↵ (xmlData, "text/xml"); var root = xmlobject.getElementsByTagName ↵ ('feed')[0]; var number = root.getElementsByTagName ↵ ("fullcount"); alert(name+ ", количество писем в вашем ящике: ↵ " + number[0].firstChild.nodeValue); } } xmlHttp.open('GET', 'https://'+name+':'+password+ ↵ '@gmail.google.com/gmail/feed/atom', true); xmlHttp.overrideMimeType('text/xml'); xmlHttp.send(null);

</script> <form name='gmail'> Имя: <input name="name" type="text"> Пароль: <input name="password" type="password"> <br /> <a href="#" onclick="javascript:callServer ↵ (gmail.name.value, gmail.name.password);"> ↵ Проверить почту</a> </form> </body> </html>

Посмотрим, что нового здесь появилось. Во-первых, следует вас предупредить, что по умолчанию ваш браузер не позволит загрузить данные с нелокального ресурса. Поэтому мы попробуем изменить свои привилегии для доступа к данным Gmail: netscape.security.PrivilegeManager.enablePrivilege ↵ ("UniversalBrowserRead");

№12, декабрь 2005

Во-вторых, не обращайте внимание на усложнившуюся схему получения объекта XMLHttpRequest, она нужна лишь для того, чтобы скрипт работал и в Internet Explorer. Кстати, скрипт следует запускать именно с локальной машины (не сервера), потому как иначе браузер не разрешит вам обратиться с одного сервера к другому. Следующее, что может быть непонятно, – это строки: var xmlobject = (new DOMParser()).parseFromString ↵ (xmlData, "text/xml"); var root = xmlobject.getElementsByTagName('feed')[0]; var number = root.getElementsByTagName("fullcount"); alert(name+ ", количество писем в вашем ящике: " ↵ + number[0].firstChild.nodeValue);

Здесь мы используем DOM-модель док умента для прохода по xml-дереву полученных от сервера данных. Ищем корневой элемент <feed>...</feed> (getElementsByTagName(‘feed’)), затем в нём находим тэг <fullcount></fullcount> (getElementsByTagName(“fullcount”)) и выводим значение, которое находится в этом тэге (number[0].firstChild.nodeValue). Изначальный xml-код выглядит примерно так: <feed version="0.3"> <title>Gmail - Inbox for Vasya_Pupkin@gmail.com</title> <tagline>New messages in your Gmail Inbox</tagline> <fullcount>1</fullcount> <link rel="alternate" ↵ href="http://mail.google.com/mail"type="text/html"/> ... </feed>

Чтобы скрипт корректно работал на вашей машине, желательно иметь Mozilla-совместимый браузер и быть авторизованным в системе GMail (http://gmail.com).

Заключение Мы разобрались с основами Ajax, с самым базовым функционалом, который использует любое ajax-приложение. В следующих статьях я постараюсь показать всю мощь этой технологии. Будет рассказано о таких вещах, как соединение с SQL-сервером, создание оконного интерфейса с поддержкой техники Drag&Drop. Вы узнаете о доступных фреймворках и различных средах разработки, позволяющих значительно упростить жизнь ajax-разработчика. Напоследок, чтобы еще больше подогреть ваш интерес к этой замечательной технологии, приведу несколько ссылок наиболее впечатляющих проектов, выполненных с помощью Ajax.

Ссылки: 1. http://www.backbase.com/demos/RSS – Backbase Ajax RSS reader, «читалка» RSS-лент новостей. Пока что в демо-режиме, но посмотреть на это стоит. 2. http://www.squarefree.com/htmledit – Real-time HTML Editor, позволяет редактировать HTML-код и одновременно его просматривать. 3. http://www.unwieldy.net/ajaxim – icq- и jabber-подобный клиент для обмена сообщениями. Пока что тоже только в демо-режиме. 4. http://demo.primalgrasp.com/spell/check_spelling – проверка орфографии, не выходя из браузера. 5. http://code.jalenack.com/periodic – таблица Менделеева.

69


web

PHP: делаем отладку на стороне клиента, или Операции под наркозом

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

70


web

В

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

Условия работы В рассматриваемой ситуации нам придётся работать со скриптами, которые уже установлены у клиента и могут быть востребованы в любой момент. Поэтому необходимо ввести некоторые ограничения:  Нам необходимо локализовать и исправить ошибку, не испортив правильно работающие скрипты.  Процесс нашей отладки должен быть виден только нам, пользователи не должны ничего заметить.  Мы не можем установить или перенастроить ПО на сервере, т.е. использование сторонних отладочных систем невозможно, но мы можем добавлять новые или редактировать старые php-скрипты.  Мы имеем только ssh (и/или telnet) и http-доступ. Теперь полностью прояснив, что нам можно, а чего нельзя, попробуем сделать нашу работу наиболее комфортной и продуктивной.

Идентификация разработчика

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

Специальная GET-переменная Довольно небезопасный способ, но нередко встречаемый. Смысл заключается в помещении отладочного кода в условный блок, проверяющий, установлена ли определённая глобальная переменная. Например, так: //---код скрипта if (isset($_GET[‘debug’])) { } //---код скрипта

echo ‘Debug info!’;

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

Идентификация по IP Очень удобный и довольно надёжный способ. Как и во всех описанных тут методах, отладочный код помещается в условный блок, условие – совпадение IP-пользователя с установленным разработчиком. Пример: If ($_SERVER[‘REMOTE_ADDR’]==='123.234.234.15') { Echo ‘Debug info2!’; }

В процессе поиска и исправления ошибки нам придётся менять порядок работы программы и получать различную Плюс – вывод отладки не зависит от того, что мы переинформацию. даём скрипту. Безусловно, можно пойти старым проверенным спосоМинусы в следующем. Во-первых, не редактируя код, бом и выводить отладку в error_log, но этот метод заста- мы не можем отключить отладку, т.е. для того чтобы посвит нас метаться между браузером и файлом лога, замед- мотреть, как было и как стало, нам придётся редактиролит выполнение скрипта для всех пользователей и засорит вать код. лог, т.к. исполняться он будет для всех одинаково. Но даВо-вторых, при использовании proxy-сервером REMOTE_ же смирившись с такими неудобствами, нельзя забывать, ADDR однозначно не определяет компьютер. Но даже прочто код, который вы вводите в скрипт, также не застрахо- верка на значение HTTP_X_FORWARDED_FOR не даёт 100% гарантии, т.к. эти значения зависят от того, что возван от ошибок.

Определяем основные термины Мы будем оперировать некоторыми понятиями, значения которых зависят от контекста. Во избежание неточностей определим их. Ошибкой в этой статье будем считать как PHP-ошибку (Fatal error, Warning, Notice), так и ошибку в алгоритме программы (т.е. когда интерпретатор без проблем выполнил скрипт, но результат выполнения не соответствует нашим ожиданиям). Под отслеживанием ошибки будет подразумеваться процесс сбора максимального количества информации, такой как значения переменных скрипта в момент возникновения ошибки и путь к ошибке. Тут надо сделать пояснение. Как правило, крупные проекты разбиты на множество отдельных скриптов и часто име-

№12, декабрь 2005

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

71


web вращает веб-сервер и proxy, а доверять им можно только отчасти.

Идентификация по cookie Пожалуй, самый надёжный способ определить в пользователе разработчика – поставить условие на исполнение отладочного блока – наличие определённой в cookie переменной. Пример: if (!empty($_COOKIE[‘debug’])) { }

echo ‘Debug info3!’;

Плюс в том, что отладку будет видеть только тот пользователь, у которого установлена cookie для данного ресурса с определённой переменной. Это позволяет достаточно просто давать доступ к отладочной информации только тем, кому это разрешено. Также очень удобно переключаться между режимами, выставляя и убирая cookie-переменную. Минусы в том, что опять же возможно получение несанкционированного доступа к отладочной информации. Если злоумышленник узнает, какая cookie-переменная управляет выводом, он может сформировать такую же cookie, но этого достаточно просто избежать, меняя имя переменной, или способом, описанным чуть ниже. Для удобства управлением отладки можно написать и установить у клиента скрипт по установке и удалению нужной cookie-переменной.

Комбинированный способ Два вышеописанных способа можно скомбинировать в один и таким образом избежать проблем, связанных как с неуникальным IP, так и с кражей cookies. Пример: if (!empty($_COOKIE['DBG']) &&($_SERVER[‘REMOTE_ADDR’]=== '123.234.234.15')) { echo ‘Debug4’; }

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

ка определённым сроком после последней модификации файла, например, так: if ( ( time() - filemtime(__FILE__) ) < BLOCK_LIFE_TIME) { //… }

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

Подставной файл Зачастую количество отладочных блоков превышает допустимый порог, и скрипт превращается в смесь разрозненных кусков кода. Чтобы этого не было, можно использовать метод подставного скрипта. Суть метода в том, что мы разделяем наш скрипт на стабильный и нестабильный. Доступ к нашему скрипту осуществляется через специальный подставной скрипт, который определяет, что за пользователь перед ним и подгружает стабильный или нестабильный код. Например, мы ведём серьёзные работы со скриптом myscript.php. Переименуем стабильную версию в myscript.php.stable, а нестабильную – в myscript.php.unstable и создадим следующий подставной скрипт myscript.php: <?php $d_file=__FILE__; //is_debug функция, проверяющая, кто использует скрипт – //обычный пользователь или разработчик if (is_debug()) { onyma_include($d_file.'.unstable'); } else { onyma_include($d_file.'.stable'); } ?>

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

Отслеживание ошибки

Теперь, когда мы можем делать почти всё что захотим, не боясь быть замеченными, поговорим непосредственно о поВремя жизни отладки Чтобы, исправив ошибку и случайно забыв об одном за- иске самой ошибки. терявшемся блоке, потом не ломать голову, почему это у нас всё работает не так, удобно ограничить время жизни Ошибка PHP отладки. Рассмотрим самую простую ситуацию, когда интерпретаЕсли использовать метод с cookie, то тут всё просто – тор сообщает нам о возникновении ошибки в конкретной указываем время жизни cookie в функции setcookie, и де- строке конкретного файла. В этом случае удобней всего установить свой обрало в шляпе (null означает время жизни до закрытия браузера). Но если этот способ нам по каким-то причинам не под- ботчик ошибкой (error_handler) и внутри вызвать станходит, то можно ограничить время жизни отладочного бло- дартную PHP-функцию debug_backtrace() (однозначно

72


web определит путь к ошибке), вывести значения элементов суперглобального массива $GLOBALS и параметра error_context. Пример: If (is_debug()) { Function debug_eh($errno, $errstr, $errfile, $errline, ↵ $errcontext) { /*вывод необходимой информации*/ print_r(debug_backtrace()); print_r($GLOBALS); print_r($error_context); } $eh=set_error_handler(‘debug_eh’); } // место перед возникновением ошибки If (is_debug()) { set_error_handler($eh); }

Таким образом, мы получим полную информацию о том, где и как возникла ошибка. Очень часто достаточно просто вывести debug_backtrace в месте её возникновения.

Ошибка в алгоритме Теперь рассмотрим задачку посложней. Допустим, код выполняется без ошибок, но результат не совпадает с нашими ожиданиями. Очевидно, что ошибка где-то в алгоритме, но как же её локализовать? Для начала нужно чётко определить, что мы должны получить, и чем ожидаемый результат отличается от полученного. Свести различия нужно к какому-нибудь конкретному тезису, к примеру: «Тут мы должны были увидеть две строки, а видим только одну». После этого нам придётся провести анализ кода и определить переменные, от которых зависит вывод данных строк. Сделать это можно, к примеру, такими способами: Ограничиваем код выводом двух отладочных сообщений и сдвигаем их друг к другу до тех пор, пока они не будут обрамлять строки, считаемые нами ошибочными. Второй способ заключается в анализе вывода скрипта. Для этого включаем буферизацию вывода и обработчик на каждый тик PHP: <?php define('FIND_PATERN','/some_str/'); function find_str() { if (preg_match(FIND_PATERN,ob_get_contents())) { $db=debug_backtrace(); print_r($db); unregister_tick_function('find_str'); } ob_flush(); // Это необходимо для сбрасывания буфера } ob_start(); register_tick_function('find_str'); // тут можно поставить побольше, хотя от этого зависит // точность места определения declare (ticks=1); //код программы... ob_end_flush(); ?>

Таким образом, на каждом тике мы проверяем буфер вывода, ищем там необходимую подстроку, выводим путь

№12, декабрь 2005

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

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

Сетевой отладчик Для реализации сетевого отладчика нам будет необходимо, чтобы PHP был собран с поддержкой сокетов. В качестве сервера управления отладкой проще всего выбрать приложение терминального типа (например, в Linux удобно использовать netcat), которое будет запускаться в качестве сервера, ожидающего соединения, к примеру, на порт 9998. Клиентом будет наш отлаживаемый скрипт, который будет получать команды и возвращать результаты действия, а функцию отладки реализуем с помощью тик-функции. Схема работы будет следующая: при запуске скрипта создаётся сокетное соединения с сервером отладки. После этого при каждом тике запускается нами определённая функция отладки, которая посылает данные о текущем состоянии к серверу и ждёт ответа – команды:  s (step) – один шаг вперёд.  bp (break point) – точка останова. Определяется как номер строки и имя файла.  st (stop) – немедленная остановка выполнения.  g (go) – выполнить скрипт до конца. После получения одной из описанных команд отладчик её обрабатывает и выполняет необходимые действия. Приведем код: <?php // Отключим буферизацию, чтобы видеть пошаговое // выполнение программы ob_implicit_flush(); // Убираем лимит времени на выполнение скрипта, т.к. это // может воспрепятствовать пошаговому выполнению set_time_limit(0); // Функция посылки сообщения отладчику function D_write($msg) { global $fp; if (is_resource($fp)) { fwrite($fp,"$msg\n"); } } // Функция принятия сообщения от отладчика function D_read() { global $fp; // Приглашение на ввод команды D_write('Enter command = [g, s, bp ↵ [line number]:[file name], st]'); if (is_resource($fp)) { return fread($fp, 8192); } }

73


web // Функция отладки function debug_func() { global $fp; static $GO=false; static $STOP_LINE,$STOP_FILE; $db=debug_backtrace(); // Проверка: не достигли ли мы точки останова, // (break point) и если нет, то уходим из функции // отладки (функцию is_bp реализуйте сами) if (!is_bp($db,$STOP_FILE,$STOP_LINE)) return; // Посылаем текущее состояние. Сюда же можно добавить // другую необходимую информацию D_write(print_r($db,1)); // Ожидаем команду от сервера $ret=D_read(); // Анализируем поступившую команду switch (substr($ret,0,2)) { case 'st': { fclose($fp); exit('Stop by debuger<br>'); } case 'bp': { // Выставляем точку остановки list($STOP_LINE,$STOP_FILE)= ↵ split(':',substr($ret,3, ↵ strlen($ret)-4)); break; } case “g\n”: { // Так как необходимо выполнить // скрипт до конца без остановки, // убираем вызов функции отладки unregister_tick_function ('debug_func'); break; } case “s\n”: default: { break; } } } //подключаемся к серверу управления отладкой $fp = fsockopen('10.0.2.145', 9998); register_tick_function('debug_func'); //включаем отладчик declare (ticks=1); /*Код программы*/ fclose($fp); ?>

Этот довольно простой код с лёгкостью можно расширить, обезопасить, введя авторизацию, и реализовать как отдельный include.

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

74

Или интерфейс управления формируется в начале отлаживаемого скрипта и по средствам AJAX обращается к другому скрипту, создающему файл с необходимой командой. То есть в самом начале выполнения в браузер отсылается небольшой AJAX-движок и несколько управляющих кнопок. При нажатии на определённую кнопку с помощью JavaScript посылается определённая команда к скрипту, единственная функция которого – создать файл и поместить туда эту команду. Второй способ немного удобней, т.к. управление происходит из того же окна, где и выполняется отлаживаемый скрипт. Привидём код, опустив аналогичные чати: // Начало такое же // Функция посылки сообщения о процессе отладки function D_write($msg) { //Для простоты будем считать, что такой вывод // не нарушит структуру документа echo "<script language=JavaScript>"; // Будем выводить отладку в отдельный div // (другой вариант, например, писать информацию // во временный файл, вставлять его с помощью iframe // и тут этот iframe перегружать) echo "dbg_div=document.getElementById('dbg_div');"; echo "dbg_div.innerHTML=dbg_div.innerHTML+'<HR>$msg';"; echo "</script>"; } // Функция принятия сообщения от отладчика function D_read() { global $fp; while (!file_exists($fp)) ; // Думаю, длина команды не более 600 байт return fread($fp, 600); } // // // //

debug_func() практически не изменился, за исключением того, что после обработки полученной команды необходимо зачистить (удалить) файл с командой, чтобы она повторно не обрабатывалась

// Вместо сокета открываем файл $fp = fopen('dbg_cmd.txt', 'r'); // Вставляем управляющие элементы в начало скрипта. // В ajax.js помещаем AJAX-движок с функцией Send2Dbg(cmd) // отправки команды скрипту dbgfile.php, который создаёт // dbg_cmd.txt и пишет туда команду echo "<script language='JavaScript' src=ajax.js></script>" echo '<div id="dbg_cntrls">'; echo '<a href="javascript: Send2Dbg(\'st\');">STOP</a> '; echo '<a href="javascript: Send2Dbg(\'g\');">GO</a> '; // и т.д. echo '</div>'; echo '<div id="dbg_dib"></div>'; // Далее всё так же

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

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



сети

TCP поверх TCP – не такая уж плохая идея!

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

И

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

76

представлений, то у многих просто недостает знаний правильно оценить полученную информацию. Что приводит к появлению технологических мифов. Один из которых, порожденный статьей [1] Олафа Титца (Olaf Titz), здесь и попробуем опровергнуть. К сожалению, в России все, что написано на иностранном языке да еще размещено на зарубежном сайте, воспри-

нимается как святое откровение. Хотя многие далее вынесенного в ее заголовок тезиса «Why TCP Over TCP Is A Bad Idea» и не читают. Чтобы уравнять шансы тех, кто имеет затруднения с английским языком, предложим дословный технический перевод упомянутого опуса [2]. В переводе не использовались никакие литературные экстраполяции, чтобы максимально точно до-


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

Суть проблемы Итак, первое, что по мнению Олафа, мешает эффективной работе TCP в качестве туннеля, это повторные передачи. Если отбросить туманные рассуждения о насыщении канала (meltdown) из-за мифического фиксироРисунок 1. Схема инкапсуляции ванного тайм-аута, которого нет в TCP, то в «сухом остатке» в пер- кими деталями, Олаф связывает увевом разделе статьи лишь утвержде- личение периодов проверки на обрыв ние об экспоненциальном росте тайм- соединения с борьбой с насыщением, аута, если, цитирую, «сегмент задер- то есть с тем самым meltdown, который, живается сверх тайм-аута». Рассмот- как ружье со стены в известной пьесе, рим подробнее. Автор упорно не жела- если упомянуто в первом акте, то дает использовать общепринятую терми- лее обязательно «выстрелит». Таким нологию и предпочитает изъясняться образом, поскольку экспоненциалькак колдун-друид. Но так как в тексте ного роста задержек передачи в TCP упоминается RFC2001, то можно вос- нет, то измышления первой части обпользоваться ссылкой [3] и попытать- суждаемой статьи [1] не имеют относя догадаться, на что намекает Олаф шения к реализации TCP в нашей с ваТитц. Единственный показатель, име- ми Вселенной. Рассуждения Олафа, где он считающий в RFC2001 экспоненциальный рост, – это CWND (congestion window). ет, что трафик TCP в Интернете регуНо окно насыщения, или CWND, свя- лируется тайм-аутами, просто выкизано с пропускной способностью пря- нем, как не соответствующие реальмой зависимостью. Автор же намека- ности и потому не актуальные. Конечет, что задержки растут по экспонен- но, можно было бы везде, где в тексте те и это якобы приводит к снижению встречается «timeout», при переводе темпа передачи. Задержки – это RTT подставить «таймер», что сильно при(round trip time), или время обраще- близит многие рассуждения к дейсния, на основании которых высчиты- твительному положению дел, но тогвается RTO (retransmission time out), да пришлось бы исправить и многое или таймер повтора. Об этом нет ни- другое. Но, как уже было сказано вычего в RFC2001. Но по другим доку- ше, перевод сделан самым безжалосментам можно узнать, как это проис- тным способом. Второе, что смутило Олафа Титца – ходит. Например, в RFC793 [4], упоминаемом также в статье, описан метод это взаимодействие транспортного расчета RTO для каждого текущего па- TCP и транспортируемого. Для ясноскета. Так вот, там используется пока- ти обратимся к схеме инкапсуляции, затель SRTT (smooted round trip time), которая обсуждается в [1]. Скопируем или взвешенное время обращения. ее в переводном варианте и добавим Подчеркиваю – взвешенное! Где тут немного комментариев. Автор утверждает, что эти два поОлаф «раскопал» экспоненту? Конечно, можно догадаться, что автор спу- тока TCP (см. рис. 1) могут иметь разтал расчет RTO при задержке с рас- ные таймеры. Дословно: «может так четом RTO при потере! Вот, если бы случиться, что соединение нижнесегмент вообще пропал и от получа- го уровня имеет медленные таймеры, теля нет никаких ответов, тогда алго- возможно как остаток с периода медритм TCP на самом деле требует про- ленного или ненадежного основного извести повторы с экспоненциальным соединения». То есть автор предпозамедлением. Но, не смущаясь мел- ложил, что вложенное TCP успело ра-

№12, декабрь 2005

зогнаться, а несущее тем не менее оставалось медленным. Это просто невозможно, так как противоречит законам сохранения, действующим в нашей Вселенной. Надо признать, что именно здесь Олафа «понесло». Он увлеченно живописует, как внутренний слой, такой быстрый и такой «несчастный», будет, не получая подтверждений, посылать пакет за пакетом и тем самым – вот оно, старое ружье выстрелило – создаст «внутренний meltdownэффект». Здесь замечу, что термин «внутренний meltdown-эффект» изобретен просто «на ходу». Жаль разочаровывать Олафа, но после неподтверждения пакета и в отсутствие вообще всяких подтверждений TCP начинает процедуру медленного старта, в ходе которой поток TCP снова будет искать предельную передающую возможность среды, постепенно увеличивая скорость передачи, начиная с самых минимальных значений. Иначе говоря, TCP не снижает темп передачи, а вообще прекращает ее и затем возобновляет снова со стартовых значений. И это, кстати, дает гарантию, что внутренний TCP никогда не будет работать быстрее внешнего, того, что образует туннель. Так как, если параметры внутреннего TCP приведут к тому, что он разгонится быстрее туннельного, то после же столкновения он сбросится снова к состоянию медленного старта и снова начнет «догонять» туннельный TCP. Давайте представим, что реально может случиться из-за потерь сегментов (именно так и следует далее их называть, а не пакетами) в таком туннеле. Во-первых, просто обрыв связи будет обработан и тем и другим TCP соответственно и в пределах перечисленных RFC. А вот с повторами, и правда, могут возникнуть некоторые проблемы. Покажем на схеме (рис. 2), что будет происходить, если в пути потеряется сегмент с данными. Предположим, что пропал сегмент D4. Тогда оба стека протоколов получат повторный ACK с последним принятым номером и согласно алгоритму Fast Retransmission, или быстрой повторной передачи, пропущенный пакет

77


сети будет повторен. На рисунке изображена ситуация, когда мом деле, повторы следует запретить в нижнем туннельоба стека имеют одинаковый RTT и, значит, близкие RTO. ном TCP. Тогда транспортный TCP сформирует повтор пропавшеВо-первых, потому что туннель это одно TCP-соединего сегмента T4-4 и точно так же добавит в поток сегмент ние, а вложенных может быть множество. T7-4, содержащий сегмент с данными D4, повторенный в Во-вторых, потому что туннель создается на специальтранспортируемом TCP. Это самый худший вариант разви- ном хосте, а внутренние потоки соединяют разные клиенттия событий. Иначе говоря, если потери канала составля- ские компьютеры со стандартным TCP-стеком. И, наконец, ют 10%, то из полезной емкости канала будет изъято уже в-третьих, кроме TCP есть еще много разных протоколов, 20%. Но, как уже замечено, это предельно плохой вариант. сегменты c которыми все-таки очень не бесполезно восстаПоскольку RTT туннеля и RTT транспортируемого TCP на новить при потере, а отличить их от TCP может только стек практике не совпадают, то, скорее всего, реальные потери туннеля. Но такое расширение TCP-туннелей пока не реалиполосы будут гораздо меньше. зовано. Здесь лишь рассматривается гипотетическая возМожет показаться, что в этих рассуждениях упущена можность. Но ничего не мешает в практической ситуации ситуация, когда будет потерян не сегмент с данными, а его для пробы запретить повторы через параметры sysctl липодтверждение. Но если это произойдет, все случится точ- нуксового ядра на тех хостах, между которыми поднят тунно так же, как и на рис. 2. нель, и проверить действенность такой настройки. Итак, и вторая часть рассуждений о проблемах TCP Для TCP нет разницы между потерянным сегментом и потерянным подтверждением, если и те и другие вы- не выдерживает элементарной проверки. Быть может, сылаются не так, как рассуждает Олаф, а сериями в пре- в разделе «Практический опыт» нам откроется истина? делах размера CWND. Но, с другой стороны, теперь уже Рассмотрим и его повнимательнее. В практической части статьи [1] содержится информадля TCP-трафика происходит теоретическое учетверение потерь, то есть из полезной емкости канала будет изымать- ция, которая может стать разгадкой всех проблем Олафа ся уже 40%. Хотя это лишь «на бумаге», то есть снова здесь Титца. Оказывается, у автора этой статьи, цитирую, «исприведен самый плохой вариант. пользовалась волоконно-оптическая связь, которая страТеперь, глядя на рис. 2, ответьте, в каком TCP надо за- дала частыми потерями пакетов, иногда 10-20%». Странпретить повторы? Олаф Титц делает вывод, что повторы ная связь! Вероятно, на карманных фонариках. Последннадо запретить в верхнем транспортируемом TCP. На са- нее конечно шутка, но тем не менее это позволяет точно определить условия применения тезисов автора упомянутой статьи. Обратимся к RFC 2001 [3]. Там однозначно установлено, что все алгоритмы TCP рассчитаны при допущении, что потери в канале составляют менее 1%. Вероятно, у Олафа были проблемы с кабельщиком. Быть может, суровому монтеру не понравилась его прическа [5] и он решил таким путем выразить свое возмущение. Олаф утверждает, что, создав CIPE [6], смог решить проблемы и обеспечить надежную работу на канале с потерями до 20%. И если не проверить утверждения автора с помощью тестов с туннелем на подобном канале, то получится, что здесь предлагается рассуждения Олафа Титца заменить рассуждениями Алексея Барабанова. Лишь опыт позволит рассудить, на чьей стороне правда (или правдоподобность). Поскольку нет простой возможности создать искусственную линию связи с характеристиками, похожими на те, что создали так много проблем Олафу, то заменим реальные, обычно модуРисунок 2. Последствия потери сегмента лированные, помехи случайными. И дополнительно ограничим их 10-процентными. Думаю, что эта замена, не помешает понять суть происходящих процессов, так как на практике и 10% и 20% значительно больше указанного в RFC 1%, и отличаются лишь временем, затраченным на проведение эксперимента, поскольку чем больше потери, тем меньше скорость передачи.

Тестовая сеть

Рисунок 3. Схема тестовой сети

78

Проверку будем проводить путем передачи тестового массива псевдослучайных данных в одном направлении через TCP- и UDP-туннели. Это, конечно, примитивная модель взаимодействия, но только так можно в чистом виде попытаться определить зависимость характеристик канала и свойств полученного потока данных. Дополнительно


сети в центре маршрута ограничим полосу, например до 10 Мбит, ки OpenVPN в режиме клиента TCP-туннеля будут произвои внесем случайные потери в трафик. Конечно, 10 Мбит зна- диться согласно следующему файлу конфигурации: чительно выше типичной скорости канала, предоставлен# cat /etc/openvpn/test.conf ного ISP для подключения к Интернету. Но иначе придется уменьшить объем пересылаемых данных, чтобы в приproto tcp-client tcp-queue-limit 1000 емлемое время провести эксперимент. Перечислим элеremote 192.168.11.2 менты, которые нужны для организации таких проверок. dev tun port 5000 Во-первых, хост-отправитель и хост-получатель трафика. tcqueuelen 1000 Во-вторых, два хоста, между которыми проложен туннель. secret /etc/openvpn/static.key ifconfig 192.168.12.1 192.168.12.2 Поскольку «удаленный» конец туннеля может совпадать с route 192.168.12.0 255.255.255.0 192.168.12.1 хостом-получателем, то, кроме перечисленных трех хостов, нужен еще один, где будет эмулироваться «узкое месДля станции wskostja все аналогично, меняются лишь то» в сети. Итого, достаточно будет 4 компьютера соединить адреса, протокол на tcp-server и удаляется строка remote, последовательно. Строго говоря, хост-отправитель можно что переводит туннель в состояние прослушивания. В ресовместить с «ближним» концом туннеля. Но надо учесть, жиме UDP на обоих концах протокол просто переключаетчто вход в туннель тоже является своего рода ограничите- ся в udp и удаляется параметр tcp-queue-limit. И теперь путь лем трафика, или шейпером, поэтому пусть будут в тес- между wstovert до wskostja проходит через туннель. товой сети четыре компьютера, которые назовем wstovert, # traceroute 192.168.12.2 wsalekseybb, wskostja и server. Общий вид полученной сети представлен на рис. 3, и дальнейший комментарий будем traceroute to 192.168.12.2 (192.168.12.2), 30 hops max, 40 byte packets 1 192.168.10.2 0.000 ms 0.000 ms 0.000 ms вести согласно изображенной там схемы. 2 192.168.12.2 7.088 ms 5.756 ms 0.787 ms Все компьютеры включены в общую сеть 192.168.0.0/24, объединены общей кабельной системой с помощью комЧтобы доказать, что сам туннель проходит через мутатора 1 Гбит и обмениваются данными по протоколу server, проверим путь до удаленного конца туннеля 1000BaseTX, то есть значительно выше проверяемых ско- от wsalekseybb: ростей передачи, что позволит максимально снизить сис# traceroute 192.168.11.2 тематическую ошибку. На эту сеть наложены две виртуальные сети. Первая из них, с адресом 192.168.10.0/24 вклюtraceroute to 192.168.11.2 (192.168.11.2), 30 hops max, 40 byte packets 1 192.168.10.1 0.195 ms 0.106 ms 0.120 ms чает wstovert, wsalekseybb и server, а вторая – с адресом 2 192.168.11.2 0.233 ms 0.000 ms 0.000 ms 192.168.11.0/24 – только server и wskostja. Практически все Таким образом, можно, отправляя трафик со станции компьютеры могут резолвить адреса друг друга с помощью arp и обмениваться пакетами через общий коммута- wstovert до станции wskostja, осуществлять на промежуточтор. Но нам ведь нам надо обеспечить передачу трафика ном хосте server нужные манипуляции в соответствии с исмежду компьютерами так, будто они включены последова- следуемой моделью канала. Для работы создадим на всех участвующих в эксперительно один за другим. Поэтому с помощью правил маршрутизации и преобразования адресов заставим трафик ментах хостах специального пользователя tovert и разместим от wstovert проходить до wskostja через wsalekseybb и server в его домашних директориях в файле .ssh/authorized_keys2 так, как указывает стрелка на рис. 3. Для этого на каждом специально подготовленные ключи, чтобы можно было выкомпьютере укажем статический маршрут до следующей по полнять необходимые действия в автоматическом режиме ходу движения стрелки на рисунке 3 сети через соседний с одной из станций. И для удобства разрешим через sudo компьютер, а на том включим NAT так, чтобы заменять в та- выполнение пользователем tovert команд с привилегиями ком маршруте адрес отправителя на собственный. Оконча- суперпользователя без ввода пароля. На wstovert подготовим файл с данными, которые будут тельно должно получиться так: посылаться в тестовых сеансах: # traceroute 192.168.11.2

traceroute to 192.168.11.2 (192.168.11.2), 30 1 192.168.10.2 0.000 ms 0.000 ms 0.000 2 192.168.10.1 0.566 ms 0.086 ms 0.088 3 192.168.11.2 0.145 ms 0.170 ms 0.241

hops max, 40 byte packets ms ms ms

Поскольку главный вопрос заключается в изучении поведения инкапсулированного трафика, то в тестовой сети настроим также и туннель. Воспользуемся программным обеспечением, которое позволит поднять туннель, как на основе UDP-транспорта, так и TCP. По этой причине CIPE [6] не подходит. Выберем OpenVPN [7]. Тем более что согласно сравнительной таблице [8] этот проект рекордсмен в разделе Popularity. Туннельная сеть образует виртуальное соединение между wsalekseybb и wskostja, определенное как сеть 192.168.12.0/24. Для станции wsalekseybb настрой-

№12, декабрь 2005

# ssh tovert@wstovert "dd if=/dev/urandom ↵ of=~/100M.bin bs=1024 count=102400"

Симуляцию TCP-трафика будем создавать с помощью команды, отправляющей 100 Мб из файла на целевой хост. В качестве слушателя TCP используем sshd, который перешлет все принятые данные в /dev/null, чтобы не помешала буферизация. Причем для сокращения затрат на загрузку файла с диска каждую тестовую отправку будем предварять локальным копированием в /dev/null: # dd if=/home/tovert/100M.bin bs=1024 count=102400 >>/dev/null # dd if=/home/tovert/100M.bin bs=1024 count=102400 | ↵ ssh tovert@192.168.12.2 "cat - >>/dev/null"

Симуляция UDP-трафика будет производить утилитой

79


сети Таблица 1. Передача TCP-трафика в туннелях Протокол передачи данных

Объем отправленных данных, Мб

Режим туннеля

Передано в tun0, Мб

Скорость передачи, Мбайт/сек

Шейпер, передано Мб

Шейпер, передано пакетов

Шейпер, число задержек

Потери, %

Идеальный трафик шейпера / трафик шейпера

TCP

105

TCP

103.9

1.2

112

81218

100951

0

1

TCP

105

TCP

103.9

0.177 (до 0.188)

128

152585

5504

10

1.14

TCP

105

TCP

117.2

0.0736

130

157852

4318

10+10

1.16

TCP

105

UDP

103.9

1.2

112

144877

144581

0

1

TCP

105

UDP

103.9

0.18 (до 0.19)

124

161677

7995

10

1.11

TCP

105

UDP

117.1

0.0791

126

164227

6281

10+10

1.13

netcat, точно так же предварительно произведя локальное копирование: # dd if=/home/tovert/100M.bin bs=1024 count=102400 >>/dev/null # dd if=/home/tovert/100M.bin bs=1024 count=102400 | ↵ netcat -vu -w 1 192.168.12.2 22222

На приемной стороне UDP-трафик будет приниматься специальным слушателем и подсчитываться: # netcat -vlnu -s 192.168.12.2 -w 15 -p 22222 | wc -c

В точке прохождения трафика через хост server включим ограничитель полосы типа HTB (Hierarchical Token Buckets) на 10 Мбит со следующей конфигурацией: qdisc htb 1: r2q 10 default 0 direct_packets_stat 0 Sent 0 bytes 0 pkts (dropped 0, overlimits 0) class htb 1:1 root rate 10Mbit ceil 10Mbit burst 14704b ↵ cburst 14704b Sent 0 bytes 0 pkts (dropped 0, overlimits 0) lended: 0 borrowed: 0 giants: 0 tokens: 9191 ctokens: 9191 class htb 1:10 parent 1:1 prio 0 rate 10Mbit ceil 10Mbit ↵ burst 14704b cburst 14704b Sent 0 bytes 0 pkts (dropped 0, overlimits 0) lended: 0 borrowed: 0 giants: 0 tokens: 9191 ctokens: 9191 filter parent 1: protocol ip pref 1 fw filter parent 1: protocol ip pref 1 fw handle 0xa ↵ classid 1:10

Так что фильтр будет направлять в шейпер только трафик, помеченный маркером 10 (0xa). Весь непомеченный трафик будет проходить в обход шейпера, так как в HTB не указан поток по умолчанию. Метиться будут лишь пакеты, направляемые на виртуальный адрес wskostja: # traceroute 192.168.11.2 Chain POSTROUTING (policy ACCEPT) target prot opt source MARK all -- anywhere

destination 192.168.11.2

MARK set 0xa

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

80

# iptables -L INPUT Chain INPUT (policy target prot opt DROP all -ACCEPT all --

ACCEPT) source anywhere anywhere

destination 192.168.12.2 192.168.12.2

random 10%

Тут проницательный читатель заметит, что недостает еще эмулятора помех для обратного трафика. Но какой может быть обратный трафик у UDP? И внося еще помехи для пакетов, движущихся в обратную сторону, мы явно ухудшаем характеристики всех TCP-соединений, которые принципиально всегда интерактивны, в отличие от UDP. Скажите несправедливо? Ну и пусть! Нам нечего бояться. Сделаем так: # iptables -n -L OUTPUT Chain OUTPUT (policy ACCEPT) target prot opt source DROP all -- 192.168.12.2 ACCEPT all -- 192.168.12.2

destination 0.0.0.0/0 0.0.0.0/0

random 10%

Чуть выше уже было замечено, что это очень грубая имитация линии с потерями. Дело в том, что потери являются функцией линии передачи, а не числа переданных пакетов, как в нашем случае. Но даже такая модель позволит понять, что же происходит с трафиком в ненадежных сетях. Теперь все окружение построено. Договоримся о точках, где будут сниматься данные. В условиях эксперимента будет тип трафика, тип туннеля, объем отправленных с wstovert данных. Скорость передачи нам сообщит команда dd на wstovert. Объем данных, поступивших в туннель, и число уничтоженных на входе пакетов узнаем через ifconfig tun0 на wsalekseybb. Статистика шейпера на server покажет, сколько данных и пакетов прошло через ограничитель трафика, сколько пакетов было уничтожено. На счетчиках iptables на wskostja узнаем, сколько данных добралось до назначения и сколько было уничтожено как имитация потерь в линии связи. И для UDP после отключения слушателя netcat получим объем реально полученных данных, подсчитанный командой wc. С примерами некоторых скриптов, использованных для настроек, можно ознакомиться в архиве [9].

Передача TCP в туннелях Сначала проверим самую главную версию, что трафик TCP внутри TCP-туннеля якобы плохо передается, а вот внутри


сети Таблица 2. Передача UDP-трафика в туннелях Протокол передачи данных

Объем отправленных данных, Мб

Режим туннеля

Передано в tun0, Мб

Потеряно в tun0 пакетов

Шейпер, передано Мб

Шейпер, передано пакетов

Шейпер, уничтожено пакетов

Потери, %

Реально прибыло, Мб

Отправлено / прибыло

UDP

105

TCP

1.8

75375

1.94

1406

0

0

1.73

1.04

UDP

105

TCP

2.1

75195

2.29

1729

0

10

1.867

1.12

UDP

105

UDP

5.3

72744

3.5

4490

1611

0

3.125

1.69

UDP

105

UDP

8.0

70678

5.02

6441

2611

10

4.08

1.96

туннеля UDP напротив очень хорошо. Для этого поднимем туннель OpenVPN сначала в режиме TCP, затем в режиме UDP, и в каждом состоянии проведем тестовую пересылку без потерь, с потерями 10% и с двухсторонними потерями. Полученные числа соберем в таблицу. К сожалению, так как используется высокоскоростная сеть, тестовый файл невелик, а время не позволяет делать сотни прогонов и затем производить сглаживание результатов, то в таблицу 1 будут занесены наиболее показательные данные из 2-3 прогонов на каждом условии и дополнительно указан возможный разброс. Колонка 5 не выявила никакого преимущества UDP-туннелей в скорости. Средний разброс показателей +/-5%. То есть независимо от несущего протокола внутренний TCP рано или поздно подстраивался под условия передачи и находил примерно одинаковый максимум. А вот показатели колонки 6 имеют более интересную интерпретацию. Итак, в идеальных условиях на шейпере насчитано 112 Мб, как в TCP-туннеле, так и в туннеле UDP. Но, как только включаем уничтожение 10% трафика, туннель UDP ведет себя пропорционально потерям и добавляет уничтоженное повторной пересылкой дополнительных 10% объема 112*11=123,2, что примерно равно полученным 124 Мб на счетчике шейпера (все индексы в колонке 10). Туннель TCP реагирует на уничтожение трафика предсказанным способом – выполняет дублирование повторов, и трафик на шейпере возрастает, но, как это тоже было предсказано, не на полные 20%, а лишь на 14%. Как только включаем уничтожение обратного трафика, то потери еще выше, но опять не 40%, как при полных повторах, и не 20%, а всего лишь 16%! Если сопоставить показатели трафика через туннельный интерфейс (колонка 4) и через шейпер (колонка 6), то использова-

№12, декабрь 2005

ние TCP-транспорта добавляет только 4% к переданному объему по сравнению с применением UDP-туннеля. То есть, 10% трафика «честно» пропадает в линии передачи, а погрешности двойного дублирования не превышают 4%. Замечу, туннель достаточно условен, сетка высокоскоростная, и расхождения RTT минимальны, что показала и утилита traceroute выше по тексту. И все равно не получается полного удвоения или учетверения. В условиях реального туннеля, где RTT будут различаться больше, скорости будут ниже, а потери, скорее всего, будут меньше, разница в условиях прохождения TCPтрафика через TCP- и UDP-туннель станет совсем незаметной. Другими словами, никакого существенного ухудшения TCP внутри TCP в нашем эксперименте замечено не было. Но если нет ухудшения при работе через TCP-туннель, то, быть может, надо искать улучшение при работе через UDP-туннель? И если проверка TCP-трафика не выявила преимущества одного над другим, то может, стоит проверить, как передается UDP-трафик в таких туннелях.

Передача UDP в туннелях Передача UDP-трафика – это весьма условное понятие. Фактически это более похоже на ветер. И поэтому понятие «скорость передачи» теряет всякий смысл. В тестовых проверках скорость случайным образом определялась в диапазоне от 13 до 29 Мбайт/сек. Но если на пути такого «ветра» встречается участок с меньшей полосой пропускания, недостаточной, чтобы передать все имитированные пакеты, то излишки просто уничтожаются. Как показали прогоны трафика через туннель OpenVPN вместе с шейпером, настроенным на большие предельные скорости, чем 10 Мбит/сек, сам туннель является скрытым ограничителем полосы. При настройках, согласно, указанным выше, туннель в режиме

UDP ограничивает полосу скоростью 5,9 Мбайт/сек, а в режиме TCP даже еще ниже 2,9 Мбайт/сек. Вероятно, это связано с тем, что туннель организован как программа, работающая не в пространстве ядра, а в пользовательском пространстве. Но, так или иначе, потери UDP-трафика начнутся сразу же на входном интерфейсе туннеля, даже если в нем не настроен собственный шейпер. Второй барьер для UDP будет создавать ограничитель трафика, имитирующий «узкое место», взведенный в нашем случае после хоста server. Ну и, наконец, в тестах с потерей трафика дополнительную убыль пакетов UDP обеспечит фильтрация на входе wskostja. Обратный трафик «портить» не будем, так как это не скажется существенно на выводах. Результаты тестов сведены в таблице 2. Судя по колонке 4, неявный шейпинг самого туннеля привел к тому, что в режиме TCP «пролетело» в интерфейс в два раза меньше пакетов, чем в режиме UDP. Ну и как следствие, окончательно попало в точку назначения (колонка 10) меньше в режиме TCP, чем в UDP. Поскольку туннель TCP, кроме всего прочего, может подстраиваться под реальную пропускную способность туннеля, то в TCP-режиме на шейпере после server нет потерь, а в UDP они присутствуют. Но самые интересные результаты дает расчет отношения трафика, реально отправленного через туннель, и того, что был получен в точке назначения. И в том и в другом режиме работы туннеля это соотношение подчиняется правилу, что трафик в проверке работы с потерями выше трафика в идеальном случае примерно на величину потерь. Например, для TCP 1,04*1,1=1,14 приблизительно равно 1,12, полученному в эксперименте. Или для UDP – 1,69*1,1=1,86 приблизительно равно 1,86, что показал тестовый прогон. Но вот само базовое соотношение пропорции доставки неутешитель-

81


сети но для UDP. Получается, что в идеальном случае для TCP-туннеля доставляются практически все пакеты – коэффициент 1,04 , а вот в туннеле UDP лишь не более чем два из трех – коэффициент 1,69. Здесь еще раз видно, что полученные результаты могут носить лишь оценочный характер. Ясно же, что коэффициент передачи TCP-туннеля должен в идеальном случае равняться единице. Но реальные значения счетчиков интерфейсов интерпретируют по-разному пакеты, их заголовки и даже константы пересчета байт в килобайты. Однако общий смысл ясен: UDP-туннель совсем не способствует полноте доставки данных до получателя. Главная причина в том, что UDP-поток не может подстраиваться под фактическую ширину канала по маршруту роутинга. И именно этим объясняется присутствие специальной опции ограничения канала на входе туннеля OpenVPN. В настоящих настройках она не применялась, а в реальной жизни ее использование позволит сократить расходы на оплату трафика, который в противном случае будет «порезан» одним из маршрутизаторов уже после того как «провернутся» счетчики ISP. Обращаю внимание, в OpenVPN такая опция есть, а вот в CIPE отсутствует, что вообще не свидетельствует в пользу этого проекта. Итак, трафик UDP тоже не приобретает ничего хорошего от завертывания его в туннель UDP. Быть может, никакого особого улучшения связи из-за применения CIPE и не происходило? Быть может, все это лишь проказы шаловливого кабельщика? Сейчас трудно разобраться, но безымянного кабельщика надо поблагодарить. Ведь именно изза его работы Олаф Титц, как Колумб, «поплыл в Индию, а прибыл в Америку», то есть не важно, о чем он там думал, когда создавал CIPE, но, безусловно, что его инициатива подтолкнула многих других разработчиков сходных программных средств.

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

82

пользовать, переходит в плоскость экспертных оценок. Перечислю их, и пусть читатели сами решат, подходят ли им такие рекомендации. Во-первых, современные сети являются в большей степени TCP-сетями. Они приспособлены для транспортировки именно такого трафика. Системы ограничения полос взаимодействуют с потоками TCP-трафика и путем накопления и торможения сегментов в очередях заставляют отправителей TCP замедлять трафик без потерь. Технология предотвращения перегрузки RED (Random early detection) работает только в отношении TCP-потоков. Разрабатываются дополнительные функциональные расширения, ориентированные на управление именно TCP-трафиком в первую очередь. Например, явное уведомление о перегрузке, или ECN, предложенное в RFC 3168 [10], реализовано как расширение формата TCP. И в том же RFC более половины его содержания посвящено проблеме, как транзитный маршрутизатор сможет управлять с помощью ECN трафиком, завернутым в IPsec. Отдельно там же сказаны и «добрые» слова в отношении других не-TCP-туннелей. Про UDP-туннели слов нет, поскольку UDP как достойный транспорт не рассматривается вообще. Конечно, если очень озаботиться, то в Интернете можно разыскать документ «A proposal for the use of ECN bits with UDP flows». Но предлагаю попробовать найти зарегистрированный RFC на эту же тему. Или попытаться его дождаться. Во-вторых, если в вашей сети ситуация «не на высоте» и вопрос стоит не о соответствии последним технологическим новациям, а просто об удовлетворительном уровне работы, то и здесь следует предпочесть TCPтранспорт. Очень часто проблемы сетевого взаимодействия связаны с потерями UDP-пакетов. Например, замедленный резолвинг сетевых адресов может доставить много неприятностей. На ненадежных подключениях к Интернету браузеры могут или не открывать запрошенные ресурсы или делать это лишь со второго раза. И учитывая, что UDP-трафик самый «беззащитный», то даже на проводных сетях в условиях сильной загруженности будет происходить вытеснение UDP-пакетов в первую очередь. Завернув UDP-

трафик в TCP-туннель, можно сделать его более надежным и предсказуемым. И часы у ваших компьютеров будут корректироваться чаще, и DNS будет работать стабильнее. А если в такой туннель завернуть ICMP, то и мониторинг внешних ресурсов также будет стабильнее. Нет, решительно невозможно обнаружить никаких аргументов против туннелирования в TCP. Быть может, на дату написания статьи [1] все обстояло иначе? Ну, разве что RFC 3168 было в стадии утверждения. А все остальные механизмы регулирования TCP были реализованы задолго до рождения столь оригинальной мысли о неприемлемости туннелирования трафика внутри TCP. Конечно, не стоит забывать о таком эффекте, как вытеснение TCP-потока (TCP-starvation/UDPdominance) именно за счет его управляемости. То есть, если два типа трафика смешиваются в одной полосе регулирования, то TCP-трафик, поддающийся регулирующему воздействию, будет уступать полосу UDP. Быть может, это и послужило причиной того, что TCPтуннель у Олафа Титца не работал как надо. Но тогда, кроме признания известного недружелюбного кабельщика, надо согласиться с существованием нерадивого сотрудника ISP. Мне кажется, это уже слишком.

Ссылки: 1. Olaf Titz. Why TCP Over TCP Is A Bad Idea – http://sites.inka.de/sites/bigred/ devel/tcp-tcp.html. 2. Олаф Титц. Почему TCP поверх TCP плохая идея. Перевод А. Барабанова – http://www.barabanov.ru/arts/tcp_over_ tcp/Tcp_over_tcp_rusint.pdf. 3. RFC 2001 – http://www.protocols.ru/files/ RFC/rfc2001.pdf. 4. RFC 793 – http://www.protocols.ru/files/ RFC/rfc793.pdf. 5. Персональная страница Олафа Титца – http://sites.inka.de/bigred/index.html. 6. Домашняя страница CIPE – http://sites. inka.de/~bigred/devel/cipe.html. 7. Домашняя страница OpenVPN – http:// openvpn.net. 8. Сравнительная таблица VPN – http://mia. ece.uic.edu/~papers/volans/table.html. 9. П р и м е р ы с к р и п т о в – ht t p : / / w w w. barabanov.ru/arts/tcp/tovert.tgz. 10. RFC 3168 – http://sysadmins.ru /rfc / rfc3168.html.


bugtraq Множественные уязвимости в Microsoft Internet Explorer

Обход ограничений безопасности в Sun Java JRE

Программа: Microsoft Internet Explorer 5.01, 5.5, 6.0. Программа: Sun Java SDK 1.4.x, Sun Java SDK 1.3.x, Sun Опасность: Критическая. Java JRE 1.5.x/5.x, Sun Java JRE 1.4.x, Sun Java JRE 1.3.x, Описание: Обнаруженные уязвимости позволяют удален- Sun Java JDK 1.5.x. ному пользователю обойти ограничения безопасности и вы- Опасность: Критическая. Описание: Неизвестная ошибка позволяет недовереннополнить произвольный код на целевой системе. 1. Ошибка дизайна при обработке быстрых клавиш му апплету получить доступ на чтение, запись и выполнедля определенных диалоговых окон может позволить зло- ние приложений на системе. Уязвимость существует в JDK/JRE 5.0 Update 3 и более умышленнику задержать показ диалогового окна загрузки файла и заставить пользователя нажать на клавишу «r» ранних версиях на платформах Windows, Solaris и Linux. Уязвимость обнаружена из-за ошибки в использовании для выполнения злонамеренного .bat-файла. 2. Ошибка дизайна при нажатии на клавишу мыши в но- reflection API. Недоверенный апплет может получить доступ вом окне браузера может позволить злоумышленнику вы- на чтение, запись и выполнение приложений на системе. Уязвимость существует в следующих продуктах на платполнить произвольный файл на целевой системе. 3. Ошибка обнаружена при использовании HTTPS-прок- формах Windows, Solaris и Linux: SDK and JRE 1.3.1_15 и боси сервера, который требует использовать обычный тип ау- лее ранние версии; SDK and JRE 1.4.2_08 и более ранние тентификации. Удаленный пользователь может получить версии; JDK and JRE 5.0 Update 3 и более ранние версии. Ошибка в реализации JMX (Java Management Extensions), веб-адрес посещаемой страницы, даже если используетвходящим в состав JRE, может позволить злоумышленнися HTTPS-соединение. 4. Ошибка существует при инициализации определен- ку просмотреть и записать произвольные файлы, а также ных COM-объектов. Удаленный пользователь может выпол- выполнить произвольные приложения на системе. Уязвинить произвольный код на целевой системе с привилегия- мость обнаружена в JDK/JRE 5.0 Update 3 и более ранних версиях на платформах Windows, Solaris и Linux. ми пользователя, запустившего Internet Explorer. 5. Ошибка существует при инициализации определен- URL производителя: www.sun.com. ных объектов, если используется функция windows() в со- Решение: Установите последнюю версию с сайта произбытии <body onload>. Удаленный пользователь может с по- водителя. мощью специально сформированной веб-страницы выполнить произвольный код на целевой системе. URL производителя: www.microsoft.com. Отказ в обслуживании в Microsoft IIS Решение: Установите исправление с сайта производите- Программа: Microsoft IIS 5.1. ля. Опасность: Низкая. Описание: Уязвимость существует при обработке URL. Удаленный пользователь может послать веб-серверу специПереполнение динамической памяти ально сформированный HTTP GET-запрос и аварийно зав Panda Antivirus при обработке вершить работу приложения inetinfo.exe. Уязвимость может ZOO-архивов быть эксплуатирована, если для директории установлены Программа: Panda SendmailSecure Antivirus, Panda привилегии на выполнение сценариев и приложений. ПриQmailSecure Antivirus, Panda ProxySecure Antivirus, Panda мером такой директории является «/_vti_bin». PostfixSecure Antivirus, Panda PerimeterScan, Panda ISASecure Пример: Antivirus, Panda FileSecure Antivirus, Panda ExchangeSecure http://www.example.xom/_vti_bin/.dll/*\~0 Antivirus, Panda DominoSecure Antivirus, Panda CVPSecure Antivirus, Panda CommandlineSecure Antivirus, Panda AntiVirus Страницу следует обновить 4 раза. Titanium, Panda AntiVirus Small Business Edition, Panda Вместо «*» могут использоваться символы: AntiVirus Platinum 7.x, Panda AntiVirus Enterprise Suite. %01-%1f, %3f, ", *, :, <, > Опасность: Критическая. Описание: Уязвимость существует из-за ошибки в библиоПоследняя цифра, после тильды, может быть от 0 до 9. теке pskcmp.dll во время Lempel-Ziv-декомпрессии ZOO-ар- URL производителя: www.microsoft.com. хивов. Удаленный пользователь может создать специаль- Решение: Способов устранения уязвимости не существуно сформированный ZOO-архив, вызвать переполнение ди- ет в настоящее время. В качестве временного решения ренамической памяти и выполнить произвольный код на це- комендуется блокировать входящие запросы, содержащие: левой системе. «~0», «~1», «~2», «~3», «~4», «~5», «~6», «~7», «~8», или «~9». URL производителя: www.pandasoftware.com. Согласно уведомлению, исправление выйдет вместе с SP3 Решение: Способов устранения уязвимости не сущес- для Windows XP. твует в настоящее время. В качестве временного решения рекомендуется фильтровать ZOO-архивы на email Составил Александр Антипов или proxy-шлюзах.

№12, декабрь 2005

83


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

Сломленная, но не сдавшаяся: история операционной системы BeOS

Дмитрий Мороз «Взрыв сверхновой звезды» – именно так можно было охарактеризовать появление на рынке в 1996 году компьютера BeBox и операционной системы BeOS. Прошло время, и звезда постепенно угасла. Но, похоже, в скором времени настанет черёд повторного взрыва. сился. Руководство Apple также не воз- мандами разработчиков проекта «ЯгуПрелюдия Если покопаться в анналах мировой ис- ражало, правда, поставило лишь одно ар» и оригинального Macintosh вынудитории развития вычислительной тех- условие – новый компьютер не должен ли управляющего Apple Джона Скалники и выудить из них компанию Apple, стоить больше 8000 долларов. ли в июне 1990 г. закрыть сделанный Работа закипела. Благодаря невы- на 50% проект. BeOS берёт своё начало именно с проВпоследствии Жан-Луи Гассе, дисизводителя «яблочных» компьютеров. сокой цене чипа Motorola 88100 инженеЖана-Луи Гассе знает, наверное, прак- ры смогли установить в первые прото- кредитировавший себя выпуском пертически каждый обладатель Macintosh типы сразу четыре штуки. Платформа вого ноутбука компании Macintosh (рис. 1). Человек, в одно время руко- на новом процессоре требовала и но- Portable, а также вступивший в личную водивший представительством Apple вой операционной системы, поэтому борьбу со Скалли, был вынужден пово Франции, благодаря своим успехам группой из 80 программистов за пару дать в отставку. Случилось это в сересо временем занял должность началь- месяцев была разработана новая ОС дине 1990 года. ника всех исследовательских и произ- под кодовым названием Bojole, основодственных подразделений компании. ванная на микроядре Mach. Созданное Гассе отправляется На его счету выпуск моделей Mac Plus, в недрах университета Карнеги-Мелло- в свободное плавание Macintosh II и Macintosh SE, снискавших на, оно было основано на исходных ко- Уйдя из Apple, Гассе тем не менее большую популярность у покупателей. дах операционной системы UNIX, и од- не расстался с мыслью разрабатыНо мало кто знает о секретных проек- но из немногих в то время обладало вы- вать новые компьютеры. Однажды он тах, которыми руководил Гассе. Ими яв- тесняющей многозадачностью и подде- встретился с Ирвином Гаулдом, управлялись Aquarius – процессор на базе рживало защищённый режим памяти. ляющим Commodore Business Machines. RISC-архитектуры, и Jaguar – професЧетыре процессора и быстрая опе- По словам самого Гассе: «Он хотел, чтосиональная рабочая станция. Именно рационная система позволили ново- бы я возглавил отдел исследований второй проект нас и интересует. му компьютеру ещё на стадии разра- и разработок компании Commodore Целью «Ягуара» являлось созда- ботки свободно обрабатывать аудио- Amiga (разрабатывавшей одноимённые ние высокопроизводительной рабо- и видеоданные, а также трёхмерную компьютеры), но я сказал: «Нет, я уже чей станции на основе RISC-процессо- графику, а встроенные стереодина- проходил через это. Я хочу управлять ра Motorola 88110. Стратегия «правого мики и камера для проведения видео- компанией». Гаулд ответил, что у неверхнего угла», согласно которой в не- конференций подняли возможности го уже имеется прекрасная кандидатудрах компании разрабатывались ком- «Ягуара» на уровень графических ра- ра, что означало отказ. Тем не менее пьютеры с высокой производительнос- бочих станций, стоивших десятки ты- Жан-Луи извлёк из встречи некоторые тью и расширяемостью, обладавшие сяч долларов. По словам Хью Марти- идеи относительно компьютеров Amiga: при этом такой же высокой ценой, бы- на: «Мы сделали полноценный муль- «Я немного обиделся на мистера Гаулла навязана Apple именно Жаном-Луи. тимедийный компьютер, на годы опе- да и решил, что, возможно, я мог бы Поэтому, когда один из инженеров ком- редивший своё время». создать что-нибудь наподобие Amiga, К сожалению, несовместимость но- только построенное на современной пании, Хью Мартин, предложил предприимчивому французу создать сверх- вой операционной системы с програм- аппаратной базе. Кроме того, в отличие быстрый компьютер на базе новой тогда мами для MacOS, а также возросшее от высокомерной Commodore я бы лучRISC-архитектуры, тот сразу же согла- до предела противоборство между ко- ше заботился о разработчиках програм-

84


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

Рисунок 1. Жан-Луи Гассе собственной персоной

AT&T, оперативной памяти и последовательного порта. Позже Сакоман добавил второй процессор, флоппи-дисковод, жёсткий диск, дополнительные параллельные и последовательные порты, а также видеоадаптер, разработанный им самим. Через некоторое время Гассе пригласил на работу троих программистов, двое из которых – Боб Герольд и Эрик Рингвальд – раньше работали в Apple (Боб работал над проектом «Newton», а Эрик – над «Ягуаром»). Третий программист, Бенуа Шиллингс, был приглашён Гассе и Сакоманом после впечатляющей демонстрации своих программ, которые он разрабатывал для MacOS. В обязанности Боба Герольда входила отладка создаваемых Сакоманом прототипов, а также написание драйверов. Что же касается Эрика и Бенуа, они создавали для нового компьютера новую ОС. Вообще-то вначале разработчики предложили Гассе купить либо лицензировать какую-нибудь из уже существующих «встраиваемых» операционных систем. К сожалению, ChorusOS, на которую пал взор из-за её заманчивых возможностей, оказалась слишком дорогой. Впоследствии Chorus Microsystems была куплена Sun Microsystems и стала основой JavaOS. Гассе и компания приняли окончательное решение – делать операционную систему своими силами. На рубеже 1991-92 гг. Гассе наконец-то принял решение дать своей крошечной компании имя. Изначально он планировал назвать её United Technoids, но, по словам Стива Сако-

мана: «От этого названия веяло чем-то мрачновато-извращённым, и я предложил Жану-Луи на выходных поискать какое-нибудь более подходящее название». В понедельник, когда Гассе спросил Сакомана, что тот нашёл, Стив ответил, что пока дошёл лишь до буквы «В». «Что же, пусть будет «Be», – решил Гассе. Так компания и обзавелась своим «пчелиным» именем. Кроме того, вместе со становлением Be Inc. в качестве полноценной компании было принято решение об аренде небольшого офиса, который располагался в Менло Парке, штат Калифорния, – недалеко от зданий Apple Computer. Шёл 1992 год. Работа над BeBox продолжалась. Стив Сакоман последовательно добавил в прототипы компьютера звуковую плату, встроенный модем, а также три цифровых сигнальный процессора (DSP) производства AT&T, которые должны были отвечать за обработку звуковых и видеоданных. Не отставала от BeBox и его операционная система. В конце 1991 года Гассе нанял на работу Сирила Меуриллона, начавшего работу над ядром для BeOS. В это же время на сцене Be Inc. появился Доминик Джиамполо, автор знаменитой файловой системы BeOS. Бенуа Шиллингс, работая совместно с ним, написал первую версию графической подсистемы BeOS, которая затем превратилась в главную часть ОС – сервер App Server. 1993 год ознаменовался выходом первой тестовой версии ОС (также известной как DR1) (рис. 2). Уже в 1994 году появилась версия DR2, в которой было исправлено множество ошибок, а также добавлены поддержка SCSI-дисков и GeekPort – специального порта BeBox, предназначенного для энтузиастов-программистов. Кроме того, система обзавелась первыми средствами разработки приложений.

мных продуктов». Таким образом, Гассе принял решение, за которое ему впоследствии будут благодарны миллионы людей, – он решил создать компьютер нового поколения самостоятельно. По замыслу Гассе, его новинка должна была стать тем «мультимедийным монстром», на пост которого претендовал так и не состоявшийся проект «Ягуар». На воплощение новой идеи у француза имелись 1,7 млн. долларов, с которыми он ушёл из Apple. Чуть позже Гассе благодаря своим связям получил дополнительное 7-миллионное финансирование. Помощником ЖанаЛуи в организации собственной компании стал Кори Ван Арсдейл, на которого были возложены обязанности адвоката и главного менеджера. Первым инженером, которого Гассе пригласил в свою, ещё в то время не названную, Be Inc., стал Стив Сакоман, один из бывших сотрудников Apple, «отец» проекта Newton, позже ставшего первым карманным персональным компьютером в мире. Вначале Сакоман работал у себя дома. Буквально через несколько дней после начала воплощения идеи Гассе в жизнь, он разработал первый прототип компьютера, состоявший из текстолитовой платы, 20 МГц процессора Рисунок 2. Одна из ранних версий BeOS для BeBox на базе процессоров Hobbit Hobbit производства компании

№12, декабрь 2005

BeOS под микроскопом Те п е р ь с д е л а е м н е б о л ь шую остановку и рассмотрим подробнее особенности BeOS, а также её достоинства по сравнению с конкурентами:

85


ретроспектива  BeOS построена на микроядер-

ной архитектуре. ОС состоит из микроядра, а также различных серверов, каждый из которых отвечает за выполнение определённых функций. Интерфейс программирования приложений (API) у BeOS основан на объектно-ориентированном дизайне вместо процедурноориентированного. Благодаря такому подходу программисты могут свободно использовать части кода в различных программах, что позволяет значительно ускорить процесс их создания. Вытесняющая многозадачность. В большинстве операционных систем каждый процесс управляется менеджером процессов. Чем больше процессов находится под командой менеджера, тем менее быстрой и стабильной становится система. В многопоточных системах каждый процесс создаёт свои собственные процессы, выполняющие строго определённые функции, тем самым значительно разгружая менеджер. Например, в BeOS каждое открытое окно создаёт два новых процесса: клиентский и серверный. Первый процесс получает и обрабатывает пользовательские события, такие как: нажатия клавиш, движение мыши и т. д., тогда как второй – занимается обработкой задач, связанных непосредственно с самим окном. Симметричная многопроцессорная обработка (SMP). Потоки могут использовать несколько чипов, установленных в компьютере (поддерживается до 8 процессоров), «перепрыгивая» с процессора на процессор в зависимости от их загруженности. Для примера: во время загрузки ОС один процессор отвечает за поиск приводов в компьютере, второй отображает на экране логотип операционной системы. Благодаря такому подходу прирост производительности BeOS, работающей на многопроцессорной системе, по сравнению с однопроцессорной стремится к 80-100%. Ориентация на обработку мультимедийных и коммуникационных задач. Многопоточный ди-

86

зайн BeOS, а также низкая латен- пьютера на базе нового чипа я с радостность системы позволяют ей лег- тью согласился», – вспоминает он. Таким образом, BeBox обзавёлся ко справляться с аудио- и видеоданными, а также трёхмерной гра- новым «сердцем», вернее, двумя. Перфикой. BeOS автоматически за- вые версии BeBox содержали пять продаёт различные приоритеты вы- цессоров – два Hobbit-чипа и три DSP. полняющимся в «реальном режи- Для того чтобы компьютер можно было ме» процессам, таким как запись без проблем перенести на новую архивидео или его воспроизведение. тектуру, инженер Глен Адлер добавил  64-разрядная файловая система в старые прототипы плату с ещё двуBFS поддерживает жёсткие дис- мя процессорами PowerPC, доведя, таки объёмом до нескольких тера- ким образом, общее количество чипов байт и благодаря журналирова- в системе до семи штук. Позднее, когнию транзикаций предотвраща- да программисты Be Inc. перенесли осет потерю данных. новной код BeOS на новую архитектуру, старые процессоры и DSP окончательно канули в Лету (рис. 3). Выход на финишную Позже новый инженер Be Inc., Джопрямую В 1994 году для BeBox пришлось ис- сеф Палмер, в одиночку занялся докать новую платформу, поскольку водкой BeBox до финального состопроцессоры Hobbit прекратили своё яния. Им была разработана матесуществование. Apple использовала ринская плата, основанная на спеHobbit в первых прототипах проекта цификации PReP. В то же самое вреNewton. Когда же инженеры компании мя, из-за недостатка средств, Палмесовместно с Acorn создали новую архи- ру пришлось использовать стандартектуру ARM-процессоров, Hobbit стал тную подсистему ввода/вывода, анане нужен. В результате летом 1994 го- логичную той, что была на обычных да AT&T, не получив дальнейшего фи- персональных компьютерах из мира нансирования от Apple, отказалась Windows. С «лёгкого языка» Джо Палмепродолжать разработку чипов Hobbit и окончательно ушла с рынка процес- ра BeBox обзавелась своим назвасоростроения. нием. Вот что он сказал по этому поВ поиске нового чипа для BeBox воду в одном из интервью: «Первые выбор инженеров Be Inc. пал на про- прототипы компьютера на базе процессор PowerPC: новый, но уже доста- цессоров Hobbit и DSP-чипов называточно разрекламированный компания- лись просто Be-1. Когда пришёл черёд ми Apple, IBM и Motorola продукт. Имея PowerPC, машины именовались Be-2, меньшую стоимость, чем у процессора или BeBox. Со временем второе назваHobbit, PowerPC обладал лучшей архи- ние прочно прилипло к нашим прототитектурой (комбинация серверного чипа IBM POWER и шины Motorola 88110) и производительностью. А предложил Be Inc. использовать PowerPC инженер Apple Джо Палмер, впоследствии ставший «отцом» нового BeBox. Палмер в то время заканчивал разрабатывать Macintosh Quadra 660AV в Apple. Он хотел, чтобы независимые компании начали использовать стандарт PReP (PowerPC Reference Platform – связанная с PowerPC платформа), разработанный IBM, Apple и Motorola, поэтому решил встретиться по этому поводу с Жаном-Луи Гассе. Как раз в то время AT&T приостановила разработку процессоров Hobbit, поэтому Палмер предложил Be Inc. использовать новый PowerPC. «На внезапное предложение Рисунок 3. Внешний вид BeBox Жана-Луи помочь им в разработке ком-


ретроспектива пам, вследствие чего стало основным и единственным».

Триумф BeBox

ке Agenta’95, позже назвал BeBox «суперкомпьютером в компактном корпусе ПК» (вспомните, какая компания в 1999 году придаст своему компьютеру приставку «супер»). Два процессора PowerPC 603e, несмотря на свои 66 Мгц, помогали BeBox демонстрировать производительность на уровне рабочих станций IBM RS/6000, стоивших десятки тысяч долларов. Возможность установки до 256 Мбайт ОЗУ в обычный ПК в 1995 году была также чем-то нереальным. А уж 26 различных портов ввода/вывода, располагавшихся на задней стенке компьютера, делали из компьютера Be Inc. поистине «чудо». Чего уж говорить об операционной системе, о возможностях которой было написано выше. Зрители были в шоке от демонстрации BeBox. А довольно низкая цена в 1995 у.е., как для системы, демонстрирующей подобный уровень производительности и возможности, стала «последним гвоздём». Многотысячная аудитория, присутствовавшая в зале, устроила Жану-Луи Гассе овацию. Это был его день, день всей команды Be Inc., и, конечно же, триумф BeBox и BeOS.

Конец 1994 года мог стать концом компании Be Inc: 9 миллионов долларов компании иссякли, а разработка компьютера только подходила к своему завершению. Ещё минимум год ушёл бы на то, чтобы довести «до ума» операционную систему. Жан-Луи Гассе принял решение найти для компании нового владельца. Его взор обратился к бывшему работодателю – Apple. В недрах «яблочной» компании в то время разрабатывалась операционная система под кодовым названием Copland, призванная заменить стремительно устаревающую MacOS 7.x. «Финансовых средств у нас не осталось, и мне пришлось пригласить на встречу руководителя Apple Майкла Шпиндлера, чтобы поговорить с ним о возможности покупки Be Inc.», – вспоминает Гассе. К сожалению, встреча закончилась, не принеся никакого результата. Но Гассе никогда не забудет слов, произнесённых Шпиндлером на прощание: «Тебе, наверное, спится лучше, чем мне». «Я помню этот момент, поскольку Удержаться на волне Шпиндлер всегда очень хорошо пред- успеха чувствовал опасность», – говорит Гас- Выставка Agenta’95 принесла Be Inc. се. Apple была на краю пропасти: проект дополнительные инвестиции на сумму Copland разросся до невероятных раз- 6 млн. долл. (одним из инвесторов стал меров и превратился в «неповоротли- известный разработчик суперкомпьювый Титаник», готовый в любую мину- теров Сеймур Крей), которые позволиту пойти ко дну от внезапного столкно- ли компании доработать BeBox до совения с айсбергом. стояния полной готовности и 3 октябНеудача попытки продажи Be Inc. за- ря начать отгружать компьютеры перставила Гассе готовиться к единствен- вым заказчикам. В то же время рабоному выходу – публичной демонстрации та над совершенствованием BeOS проBeBox потенциальным инвесторам в на- должалась. До апреля 1996 года компанией дежде привлечь хоть какие-нибудь денежные средства для продолжения про- было выпущено семь тестовых версий екта. Данное событие должно было со- системы (так называемые Development Release), каждая из которых добавляла стояться на выставке Agenta’95. Специально для будущей выстав- в ОС новые возможности, а также улучки Стив Сакоман подготовил презен- шала уже существующие. Та же BeOS тацию, демонстрировавшую обработ- DR7 могла «похвастаться»: поддержкой ку на BeBox восьми AVI-видеофайлов 32-битного цвета, новой файловой сиси трёхмерной графики (Жан-Луи Гассе темой BFS, виртуальными Рабочими хотел лицензировать у Apple технологию столами, а также улучшенными сетеQuickTime, но цена в 5 млн. долларов выми возможностями. оказалась для Be Inc., ещё не выбравПо словам Жана-Луи Гассе, вначашейся из «долговой ямы», просто непо- ле BeOS необходимо было набрать мимерной). Всё это работало одновремен- нимальную «критическую массу» проно и без какого-либо торможения. грамм, для чего компьютеры BeBox поОдин из журналистов, присутство- падали, в основном, в руки програмвавших в тот памятный день на выстав- мистов, поражённых демонстрацией

№12, декабрь 2005

возможностей компьютера и ОС и желающих начать разрабатывать для неё новое ПО. Кроме того, Be Inc. воплотила в жизнь новую концепцию продаж программного обеспечения: вместо того, чтобы раскошеливаться на рекламу, компании, а также программистыодиночки предлагали потенциальным покупателям демо-версии своих программ, размещённых на специально созданном Be Inc. сайте BeDepot.com. Если пользователю понравилась демо-версия, он мог при помощи обычного телефона заказать себе полную версию. Кстати, многие компании-разработчики ПО для BeOS (например, та же BeatWare) «вышли в свет» именно благодаря такой системе продаж. В начале 1996 года производство BeBox, вследствие иссякших в очередной раз денежных средств, было приостановлено. Компания была на грани банкротства. Тем не менее на волне бума, поднятого демонстрацией компьютера на Agenta’95, быстро нашлись новые инвесторы и, после 14-миллионного «вливания» в активы компании, процесс производства был возобновлён. Следующей целью Жана-Луи Гассе стала выставка MacWorld Expo, проходившая летом 1996 года. Официально Be Inc., кстати, запрещалось присутствовать на выставке, поскольку её продукция никаким образом не была связана с Apple. Тем не менее 6 августа 1996 года тысячи людей столпились возле стенда компании: на нём демонстрировалась BeOS, работавшая на компьютере Power Macintosh. Зрители были в шоке: то, чего все уже который год ждали от Copland (главным образом, вытесняющую многозадачность и защищённый режим памяти), уже было воплощено в BeOS и работало на их компьютерах! Кроме того, ОС также работала на клонах Macintosh, производившихся компанией Power Computing. Macверсия операционной системы от Be Inc. произвела очередной фурор. Но мало кто знает, что предназначалась эта версия ОС для другой цели – демонстрации Apple возможности работы BeOS на компьютерах Power Macintosh. Да-да, теперь Apple первой предложила Гассе купить его компанию. Правда, запрошенная им цена в 300 млн. долл. показалась «яблочной» компании слишком большой (она предлагала Be Inc. «лишь» 100 млн. долл.),

87


ретроспектива поэтому переговоры, длившиTracker, улучшенный стек TCP/ еся на протяжении полугода, IP, а также расширенный лисни к чему не привели. тинг поддерживаемого аппаТем не менее, убедивратного обеспечения. На конференции BeDevCon, шись в полном крахе проекпроходившей в начале мая та Copland, в 1997 году, пос1997 года и ознаменовавшейле покупки за 430 млн. долл. Стива Джобса и его компании ся выходом BeOS PR1, Эрик NeXT Inc., Apple объявит о наРингвальд также объявил о планах компании интегричале разработки новой операционной системы под коровать виртуальную машину Java в первую полноценную довым названием Rhapsody версию BeOS (v 3.0), выход на базе ОС NEXTSTEP. которой был намечен на вес5 августа 1996 года из недр Be Inc. вышли сразу два новых ну 1998 года. В то же время продукта. Первым из них был компания Metrowerks пообеРисунок 4. BeOS DR 8 для BeBox на базе процессоров PowerPC новый BeBox, в основу которощала дальнейшее улучшего были положены те же PowerPC 603e, Macintosh имело значительно больший ние Java в своём пакете для разработработавшие, правда, на частоте 133 интерес для компании, вследствие чего ки CodeWarrior. МГц. Также был немного изменён цвет продвижением собственных компьютеДела у Be Inc. шли довольно неплокорпуса. В остальном новый компьютер ров Be Inc. практически не занималась. хо: более 500.000 распространённых В Интернете можно найти фотогра- копий BeOS, налаженные партнёрские полностью копировал своего старшего фии прототипа четырёхпроцессорного отношения с производителями клонов собрата, правда, стоил уже 2995 у.е. Вместе с новым BeBox свет увиде- BeBox, создававшегося в 1996 году, но Macintosh, увеличивающееся с кажла и новая версия BeOS, DR8 (рис. 4). так и не доведённого до конца. По сло- дым днём количество разработчиков Из улучшений стоит отметить появив- вам Джо Палмера, причин, послужив- ПО для операционной системы (на мошуюся библиотеку 3D Kit, позволявшую ших приостановлению разработки, мент выпуска BeOS PR2 – 4400), а такразработчикам наделить свои прило- всего две. Первая: альянс AIM (Apple, же появление первых «серьёзных» прожения интерактивной трёхмерной гра- IBM, Motorola) забросил дальнейшее грамм, таких как: VirtualMac (эмулятор фикой; библиотеку Game Kit, обеспе- развитие PowerPC 604 в пользу ново- MacOS 7.x), BeatBox (музыкальный речивавшую прямой доступ к графичес- го PowerPC 750 (известного также как дактор), LRDraw (графический веккому адаптеру компьютера; встроен- G3), не предназначенного для исполь- торный редактор), Be Basics (текстоную в файловую систему возможность зования в многопроцессорных конфи- вый процессор и редактор электронработы с электронной почтой; новый гурациях. Вторая: у Be Inc. возникли ных страниц)… веб-браузер NetPositive; новые элемен- трудности с получением различной инНе жди беды, она сама к тебе приты графического интерфейса, а также формации относительно архитектуры дёт. Через некоторое время после того, расширенную поддержку аппаратного чипов из недр AIM, за что стоит сказать как Apple приобрела NeXT Inc., Джил обеспечения: более ёмкие винчестеры, отдельное «спасибо» Apple. Амелио, сместивший Майкла ШпинВ результате разработка четырёх- длера с поста управляющего компаустройства для порта GeekPort, а такпроцессорного BeBox затянулась. Пос- нией в начале 1996 года, был отправже джойстики. Дабы довести число анонсов за день кольку в то время наибольшее вни- лен в отставку, а его место занял Стив до заветной цифры «3», Be Inc. 5 августа мание публики было уделено работе Джобс, назначенный «временным» упвыпустила пресс-релиз, в котором объ- BeOS на компьютерах Power Macintosh равляющим. Буквально сразу же после этоявила о лицензировании у Silicon Graphics и его клонах, Be Inc. 30 января 1997 гоInc. графического API OpenGL, а также да объявила о прекращении выпуска го Джобс приостановил производство собственных компьютеров и концен- КПК Newton, а также за пару месяцев планах по его интеграции в BeOS. Параллельно с развитием BeBox Гас- трации исключительно на дальней- «сдал в утиль» практически весь рысе налаживал отношения с производи- шем совершенствовании операцион- нок производителей клонов Macintosh, аннулировав либо принудительно вытелями Mac-клонов, дабы те поставляли ной системы. Специально для Mac-клонов Be Inc. купив их лицензии. Be Inc., оставшись BeOS со своими компьютерами. 26 ноября 1996 года Power Computing стала выпустила BeOS Preview Release 1 и 2, без партнёрской поддержки, а также первой компанией, лицензировавшей ставшие первыми «публичными» вер- их компьютеров, очутилась в облике «наездника без коня». Жану-Луи ГасBeOS. В скором времени за ней после- сиями операционной системы. Так, PR1 принёс в BeOS обновлён- се пришлось искать выход из сложивдовали DayStar, Motorola и UMAX. Наполеоновским планам Жана-Луи ную файловую систему BFS, ставшую шейся ситуации. Результат не застаГассе продать в 1996 году 10 тысяч, 64-разрядной, программный режим ус- вил себя ждать. а в 1997-м – 100 тысяч BeBox не сужде- корения OpenGL, новую интерфейсную Редактор рубрики но было сбыться. К тому же лицензи- оболочку под названием Tracker. На доКирилл Тихонов рование BeOS производителям клонов лю PR2 можно записать: обновлённый

88


содержание журнала за 2005 год АДМИНИСТРИРОВАНИЕ

сценария регистрации пользователей в сети Иван Коробко №3

Alt-N MDaemon – почтовая система для средних и крупных компаний Роман Марков

Автоматизация процесса подключения баз 1С с помощью Автоматизируем подключение баз 1С новой версии 8.0

№4

Alt-N MDaemon – почтовая система для средних

Иван Коробко

№7

Автоматизируем установку драйверов в Windows

и крупных компаний. Часть 2 Роман Марков

№5

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

Apache как прокси-сервер Валентин Синицын

№4

Автоматическая установка ОС и сопутствующего

Asterisk и Linux: миссия IP-телефония Михаил Платов

№6

программного обеспечения Иван Коробко

№2

Архивируем данные с помощью Bacula Алексей Гринько

№4

Asterisk и Linux: миссия IP-телефония. Действие 2 Михаил Платов

№7

Asterisk и Linux: миссия IP-телефония. Действие 3

№11

Базовая настройка маршрутизатора Cisco начального уровня Андрей Маркелов

№4

№8

«Бритва» для спама Сергей Супрунов

№9

FreeBSD tips: NAT по старинке Сергей Супрунов

№2

Восстанавливаем удаленные файлы под BSD

FreeBSD tips: использование ipnat Сергей Супрунов

№3

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

FreeBSD tips: использование syslog Сергей Супрунов

№5

Восстановление удаленных файлов под Linux

№11

Всегда на связи, или IP-роуминг: вводный курс

Михаил Платов

FreeBSD tips: какими возможностями обладает ftpd Сергей Супрунов

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

FreeBSD tips: работаем с TFTP Сергей Супрунов

№7

Сергей Яремчук

FreeBSD в домене Microsoft Windows Рашид Ачилов

№3

Домены Windows 2000/2003 – отказываемся

GRUB на CD, или Ещё один способ восстановить MBR

№5 №3 №2

от рабочей группы Роман Марков

№9

Алексей Мичурин

№11

Знакомимся с HPC-кластером OpenMosix Антон Борисов

№8

HOTSPOT – это просто! Андрей Платонов

№1

Использование альтернативных потоков данных

IСQ: разрешить нельзя запретить Павел Закляков

№12

Максим Костышин

Kaspersky Anti-Spam 2.0 + Sendmail Денис Городецкий

№4

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

№6

№3

Как посчитать трафик в Linux Александр Кузнецов

№10

Linux Xinerama: один монитор хорошо, а много – лучше Павел Закляков Linux из Редмонда: обзор Lycoris Desktop/LX

№3

Как эффективно провести инвентаризацию

Валентин Синицын

№1

установленного софта Андрей Бирюков

№12

LinuxBIOS – фундамент для Linux? Антон Борисов

№7

Конструктивный Dialog Сергей Супрунов

№2

MySQL 5 – что нового предлагают нам разработчики?

Контролируем события с помощью EventSentry

Кирилл Сухов

№6

Сергей Яремчук

№12

Open-Xchange – свободу группам! Павел Лебедев

№7

Крепкий орешек NUT Валентин Синицын

№5

PhpGACL – система управления правами Кирилл Сухов

№3

Круговорот почты в сети, Или Архитектура

Postfix: диагностируем и устраняем неисправности

современных почтовых систем Евгений Прокопьев

№12

Андрей Бешков

№6

Кто купил Corel Linux? Валентин Синицын

№2

PostgreSQL 8.0: новые возможности Сергей Супрунов

№3

Мультизагрузка: стелим соломку Сергей Супрунов

№12

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

Настраиваем DSPAM – ваш личный спам-фильтр

Слухи и реальность Андрей Бешков

№10

Сергей Супрунов

SAP+MySQL=MaxDB Кирилл Сухов

№8

Настраиваем основные компоненты почтового сервера Евгений Литвиненко

№9

№10

Обзор Knoppix 3.7 Russian Edition Александр Байрак

№3

Scientific Linux – выбираем решение корпоративного уровня по цене носителя Андрей Маркелов Slackware на ракетном топливе, или Обзор VectorLinux 5.0.1 SOHO Сергей Яремчук

№8

Организуем доступ в Интернет с использованием биллинговой системы FreeNIBS Евгений Литвиненко

№9

Solaris 10 в качестве десктопа? Пробуем! Андрей Маркелов №6

Поговорим через Интернет? Михаил Платов

№11

SuSE 9.2 снаружи и изнутри Алексей Барабанов

№1

Подключаем сетевые ресурсы в автоматическом режиме

SVISTAть всех наверх! Сергей Яремчук

№4

№4

Symantec Ghost, или Как сделать клон своими руками

Иван Коробко

№9

Почему MS SQL медленно работает? Ищем причины

Михаил Платов

№9

Юлия Шабунио

№5

Windows Server Update Services Сергей Сергеев

№4

Почтовый сервер на базе Postfix Геннадий Дмитриев

№2

WrSpy – считаем и контролируем трафик почтовых и прокси-серверов Роман Марков

Практикум Python: отправка файлов №8

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

№4 №5

№12, декабрь 2005

№1

Профессия – убивать спам Сергей Супрунов

№10

Развертываем сервер Subversion на платформе FreeBSD №6

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

с помощью VBScript Иван Коробко

Прокси-сервер oops: первые впечатления Сергей Супрунов №1

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

№3

Программное управление файловой системой

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

по электронной почте Сергей Супрунов

Андрей Шетухин, Ольга Никулина

№11

Разрабатываем документацию с помощью NPJ: №7

эффективно и удобно! Алексей Коршунов

№11

89


содержание журнала за 2005 год Все ли возможности ClamAV вы используете?

Расширяем права доступа в Linux с помощью ACL Сергей Яремчук

№11

Авраменко Андрей

№9

Режем спам. Дополнительные методы Денис Назаров

№2

Запускаем spamd на FreeBSD Сергей Супрунов

№7

Реинкарнация данных Сергей Супрунов

№4

Защита коммуникаций Windows Mobile Наталья Мельникова №4

Реинкарнация данных II: memo-поля Сергей Супрунов

№5

Защита сетевых сервисов с помощью stunnel. Часть 2

№6

Защита сетевых сервисов с помощью stunnel. Часть 3

№2

Защита файловой системы при помощи нестандартного

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

Андрей Бешков

Сага о биллинге, или Считаем трафик на FreeBSD (ng_ipacct + perl+ MySQL). Часть 1 Владимир Чижиков

Андрей Бешков

№3 №4 №5 №2

Сможет ли PC-BSD конкурировать с Linux-дистрибутивами? Сергей Супрунов

№8

Создаем загружаемый Flash-диск с FreeBSD и DOS. Часть I Рашид Ачилов

№12

Сергей Яремчук

№6

Михаил Кондрин

№6

Как защититься от fingerprinting? Сергей Борисов

№6

Как защищают программное обеспечение Крис Касперски №1 Контролируем безопасность сети с помощью OSSIM

№9

Создаем загружаемый Flash-диск с FreeBSD и DOS. Часть II Рашид Ачилов

Сергей Яремчук

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

Системная интеграция – комплексный подход к самостоятельному решению проблемы Роман Марков

№1

Защищенная почтовая система с Tiger Envelopes

Система вещания на основе Windows Media Services 9. Часть 2 Михаил Платов

Денис Батранков Защищаем электронную почту средствами MailScanner

Система вещания на основе Windows Media Services 9 Михаил Платов

№3

использования снапшотов в программе ShadowUser

Сага о биллинге, или Считаем трафик на FreeBSD (ng_ipacct + perl+ MySQL). Часть 2 Владимир Чижиков

№1

Сергей Яремчук

№5

Мониторинг сетевых событий при помощи sguil №10

Создаем систему учета исходящих телефонных звонков

Сергей Яремчук

№3

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

Денис Соколов

№8

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

Создание релиза FreeBSD Андрей Елсуков

№2

Настраиваем Cisco PIX Firewall 520 для трансляции

Спам или антиспам: кто кого? Алексей Коршунов

№12

соединений между сетями Малик Абдугалыев

№12

Строим виртуальную сеть с TINC Сергей Яремчук

№2

Настраиваем Kerberos поверх LDAP Алексей Барабанов

№7

Тонкий клиент – шаг к мэйнфреймам? Антон Борисов

№11

Определяем уязвимость веб-сервиса с помощью

Удаленно управляем BIOS Setup Крис Касперски

№7

Acunetix Web Vulnerability Scanner Сергей Яремчук

Универсальный прокси-сервер Валентин Синицын

№2

Организация общего доступа в Интернет и защиты

Управляем удаленными базами AIDE Рашид Ачилов

№8

от вторжений на основе Kerio WinRoute Firewall 6

Рашид Ачилов

№9

Проактивные системы защиты, или Есть ли жизнь

Ускоряем MS SQL Server Юлия Шабунио

№6

без антивируса? Сергей Яремчук

№7

Проверяем HTTP-трафик на лету Андрей Маркелов

№7

Управляем удаленными базами AIDE. Часть II – AIDEstart

Роман Марков

Устанавливаем и настраиваем Windows Server Update Services Сергей Сергеев

№7

№6

№9

№1

Проверяем защищенность сети и сервисов сканером

Устанавливаем связку Postfix + Exchange Владимир Агапов №7

DragonSoft Secure Scanner Сергей Яремчук

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

Проводим аудит системы с помощью SNARE

№11

Сергей Яремчук

№6

Сергей Яремчук

Что важно знать об IP-телефонии Михаил Платов

№5

Протокол SILC обеспечит вам безопасную конференц-связь

Чудо-юдо Resource Kit Александр Шибенко

№4

Сергей Яремчук

№9

Эмуляция при помощи QEMU Сергей Яремчук

№3

Развертываем Heimdal Kerberos Михаил Кондрин

№7

Сетевой полицейский Сергей Яремчук

№1

Эффективно управляем полями пользователей в AD №5

Управление безопасностью Internet Explorer

Устанавливаем Symantec Antivirus 9.0 в корпоративной сети

CD, не подвластный копированию Крис Касперски

№8

Устойчива ли ваша сеть? Проверьте с помощью WHoppix!

DansGuardian + ClamAV Андрей Авраменко

№7

Иван Коробко

Наталья Мельникова

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

Роман Марков

FreeBSD tips: повышаем безопасность с помощью №6

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

№10

Windows Script Host: проводим аудит безопасности сети №11

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

90

№5 №9

на аппаратные ключи Александр Похабов

ПРОГРАММИРОВАНИЕ

№3

Zend Studio 4.0 – новая версия, новые возможности №10

Евгений Воякин

№2

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

Все в одном, или Hogwash как пример Gateway-IDS Сергей Яремчук

№4

Шифрование данных в Linux – новый взгляд

одноразовых паролей Сергей Супрунов

Андрей Бирюков

Илья Александров

№8

№1

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


содержание журнала за 2005 год БД PostgreSQL Владимир Мешков

№10

Контролируем и ограничиваем системные вызовы

СЕТИ

с помощью systrace Александр Байрак

№8

TCP поверх TCP – не такая уж плохая идея! Алексей Барабанов №12

Нити в Perl Алексей Мичурин

№1

Протоколы сетей хранения данных. Часть I – ATA over Ethernet Антон Борисов

Программирование на shell в экстремальных условиях Гаспар Чилингаров

№3

Строим защищённую беспроводную сеть:

Путешествие из Perl в Excel Сергей Супрунов

№1

WPA-Enterprise, 802.1x EAP-TLS Андрей Платонов

№9 №5

Разрабатываем информационные системы на PHP методом визуального программирования Евгений Воякин

№7

Редактор для создания скриптов: Primal Script 4.0 Иван Коробко

№11

Unformat для NTFS Крис Касперски

№ №2

Восстановление NTFS – undelete своими руками Крис Касперски №1

Система создания документации POD. Часть 1 Алексей Мичурин

ОБРАЗОВАНИЕ

№3

Обучение при помощи ATutor Сергей Яремчук

№1

Свободная информационная система для школ Centre

Система создания документации POD. Часть 2 Алексей Мичурин

№4

Сергей Яремчук

№5

Техника оптимизации под Linux Крис Касперски

№2

Сервер для школ Сергей Яремчук

№4

Техника оптимизации под Linux. Часть 2 – ветвления Крис Касперски

№3

Техника оптимизации под Linux. Часть 3 Крис Касперски

№4

Alpha, или история одной архитектуры Павел Болотов

Управляем серверами в реальном времени с помощью WSH-сценариев Андрей Бирюков

WEB

№10

№ №12

JpGraph Кирилл Сухов

№1

PHP: делаем отладку на стороне клиента, или Операции под наркозом Серафим Пикалов

№12

Аккуратная настройка SSI Алексей Мичурин

№9

Базовая HTTP-авторизация – защита от честных людей

интересных операционных систем Алексей Коршунов

№10

С чего начинался российский Интернет Алексей Коршунов

№9

системы BeOS Дмитрий Мороз

ИНТЕРВЬЮ Agnitum – путь к признанию Роман Марков

№5

№ №10

ваших машин Андрей Бешков

№6 №11

Историческая неизбежность победы движения

Алексей Мичурин

№10 №1

отрытого кода Андрей Бешков

Используем ImageMagick в веб-разработке Кирилл Сухов

№6

Ларри Уолл: «Сегодня Perl применяется для решения ряда

История развития сайтостроения Алексей Моисеев

№7

проблем, о которых я и не подозревал, создавая этот язык»

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

Андрей Бешков

№5

№5

№10

Кто, куда, зачем пришел, или Анализируем логи №7

Многоликий Apache. Размещаем несколько сайтов

БИЗНЕС-РЕШЕНИЯ В IT

IT в сфере ресторанно-гостиничного бизнеса

на одном веб-сервере Павел Малахов

№12

Печатаем документы с веб-сервера Дмитрий Острецов

№12

Расширения РHP: пять шагов к написанию Александр Календарев

№11

Совершенствуем технологию CMS Алексей Моисеев

№8

Кирилл Тихонов

ПОЛЕЗНЫЕ СОВЕТЫ

Запись дисков CD-R/RW в Linux. Часть 3 Владимир Мешков

№1

Запись дисков CD-R/RW в Linux. Часть 4 Владимир Мешков

№2

№8

Системный администратор – ищем дополнительные источники дохода Роман Марков

HARDWARE

№12

MiniMo – минибраузер из семейства Mozilla Антон Борисов

Веб-сервис для разработчиков сайтов Даниил Алиевский

веб-сервера Денис Городецкий

№11

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

ALT Linux: третье пришествие. Скоро на экранах

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

Сергей Яремчук

Сломленная, но не сдавшаяся: история операционной

AJAX: заработавший Javascript Вячеслав Родионов

Алексей Мичурин

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

IMHO Размышления о UNIX Сергей Супрунов

№6

№ №6

Используем LinuxBIOS на системах VIA EPIA-M Антон Борисов

№8

Как спасти данные, если отказал жесткий диск Крис Касперски

№9

Модифицируем BIOS Крис Касперски

№6

Настраиваем автоответчик на базе Linux Павел Закляков

№10

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

№12, декабрь 2005

№10

ХОББИ Десять красок неба Наталья Алексютина

СКАЗКИ Админские сказки. 16 bit edition Алексей Барабанов

№ №11

№ №8

91


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

Мир InterBase Алексей Ковязин, Сергей Востриков

Книга по праву считается самой популярной в России, посвященной DB InterBase и FireBird. Это уже четвертое издание книги, так что весь материал исправлен и дополнен в соответствии с вводом в строй новых технологий и версий ПО. По большей части материал рассчитан на программистов, но администраторы также найдут для себя мас-

су полезного. Все содержание хорошо структурировано, и материал излагается последовательно. Знакомство с DB начинается непосредственно с установки. Далее читателю рассказывается о том, как создать базу, какие типы данных бывают, рассмотрены таблицы, индексы, представления, хранимые процедуры, тригеры и, что немаловажно, ограничения базы данных. Очень подробно освящена тема транзакций и их параметров. После такой подробной вводной части вы ознакомитесь с методами разработки приложений баз данных InterBase на Borland Delphi/C++ Builder/Kylix. Вы узнаете об использовании основных компонентов InterBase eXpress (IBX) и о методах работы с FIBPlus. Среди прочих языков и методов разработки приложений рассмотрены Java, ODBC, CGI и Microsoft OLD DB. В четвертой части приводятся фактически исчерпывающие сведения об администрировании и архитектуре InterBase. Взгляд

изнутри на установку, технологии резервного копирования данных, миграцию, методы восстановления баз данных, статистику, а также оптимизацию работы. Вопрос, касающийся безопасности, не остался в тени: рассмотрены пользователи, роли и права. В разделе, посвященном современным версиям DB семейства InterBase, расказано про Yaffil – российский клон СУБД InterBase, InterBase 7 версии и о Open Source-разработки – FireBird. В приложении приводится подробное описание параметров конфигурационного файла InterBase. Книга оставила очень благоприятное впечатление – все четко и все по делу.

    

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

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

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

92

в данной книге. Материал разделен а также об общих вопросах управления. на 7 частей, в каждой из которых под- Качество ПО, совместное конструироробно рассматривается та или иная те- вание, тестирование, отладка, рефакма. В первой части вам будут объяснены торинг, стратегии и методики оптимиосновы разработки ПО, материал ско- зации кода – все это вы узнаете из пярее филосовский и теоретический. Вы- той части книги, которая носит название сококачественный код (так называет- «Усовершенствование кода». Не остася вторая часть) – проектирование при лись без внимания и системные вопроконструировании, классы, высококачес- сы, наиболее интересные темы: интегтвенные методы, защитное программи- рация, управление конструированием, рование, процесс программирования с инструменты программирования. Запсевдокодом. Следующая часть всеце- вершает книгу часть «Мастерство проло посвящена переменным. Рассмот- граммирования», которая по большей рены следующие темы: общие принци- части так же, как и первая носит теорипы использования переменных, сила течески-филосовский характер. имен переменных, основные и нестан«Питер» дартные типы данных. Операторы так-  Издательство: 2005 же удостоились отдельной части, из ко-  Год издания: 896 торой вы узнаете об организации пос-  Количество страниц: 5-7502-0064-7 ледовательного кода, условных опера-  ISBN: ≈ 578 руб. торах, циклах, нестандартных управля-  Цена: ющих структурах, табличных методах, Книга предоставлена издательством «Питер».


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

Приемы объектно-ориентированного проектирования Эрих Гамма, Ритчард Хелм, Ральф Джонсон, Джон Влиссидес

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

граммисты ищут методы увеличения проектирование WYSIWYG-редактора степени повторного использования документов. Порождающие паттерны своих наработок, прибегая зачастую (Abstract factory, builder, factory method, к нетривиальным схемам и изобретая prototype, singleon) рассмотрены в треочередной «велосипед». Как избежать тьей главе. Структурным паттернам всего этого и начать использовать тех- также посвящена отдельная часть. Обо нологии паттернов, вы можете узнать, всех этих и некоторых других паттерпрочитав книгу. Прочитав первую гла- нах вы узнаете из главы «Паттерны ву, вы поймете основные концепции поведения». В заключение книги ависпользования паттернов. Основной торы делятся своими мыслями и идекруг рассмотренных вопросов: пат- ями о развитии технологий паттернов. терны проектирования в схеме MVC Так же рассмотрены проектировщики в языке Smalltalk, описание и каталог паттернов. Книга несомненно должна паттернов, организация каталогов. быть на полке у каждого уважающего Также рассмотрены такие важнейшие себя программиста. вопросы, с которыми столкнется каждый разработчик, начавший исполь-  Издательство: «Питер» зовать паттерны, – как решать зада-  Год издания: 2006 чи проектирования, как правильно вы-  Количество страниц: 366 брать и использовать паттерн. Вторая  ISBN: 5-272-00355-1 глава носит исключительно практичес-  Цена: ≈ 230 руб. кий характер, в качестве примера, – Книга предоставлена издательством «Питер».

Oracle enterprise manager 101 Ларс Бо Вонтинг, Дирк Щепанек

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

№12 декабрь 2005

ми, как правильно делать те или иные а также выполнять административвещи». ные задачи с консоли EM. И с этим нельзя не согласиться, Авторам (надо заметить, что это действительно, для человека, толь- специалисты с большим опытом рако начинающего осваивать Oracle боты) удалось описать все основ(а книга для них и писалась), многие ные задачи DBA и способы их ретривиальные задачи администриро- шения в столь небольшом по объвания могут стать самым настоящим ему тексте. кошмаром. Издание является официально авКак ясно из названия, эта книга торизованным корпорацией Oracle, поможет вам освоить один из инстру- а это уже о многом говорит. Отличная ментов для администрирования DB стилистика и большое количество приOracle – Enterprise manager. После «ос- меров делают материал более легким воения» материала, вы сможете ре- в усвоении. В общем, отличный выбор для тех, шать, упрощать и автоматизировать основные задачи DBA, и кроме того, кто только начинает (или собирается научитесь проверять соответствие ап- начать) работать с DB Oracle. паратным и программным требованиям, устанавливать и конфигурировать  Издательство: «Лори» различные компонены EM, контроли-  Год издания: 2005 ровать цели при помощи системы со-  Количество страниц: 381 бытий, функции планирования зада-  ISBN: 5-85582-230-3 ний, создавать собственные отчеты,  Цена: ≈ 456 руб.

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

93


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

 Подписной индекс: годовой – 20780, полугодовой – 81655 Каталог агентства «Роспечать»

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

СНГ В странах СНГ подписка принимается в почтовых отделениях по национальным каталогам или по списку номенклатуры АРЗИ:  Азербайджан – по объединенному каталогу российских изданий через предприятие по распространению печа-

ти «Гасид» (370102, г. Баку, ул. Джавадхана, 21)

 Казахстан – по каталогу «Российская Пресса» через ОАО «Казпочта» и ЗАО «Евразия пресс»

 Беларусь – по каталогу изданий стран СНГ через РГО «Белпочта» (220050, г. Минск, пр-т Ф. Скорины, 10)

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

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

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

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

94

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


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

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

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

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

№5

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

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

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

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

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

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

№12, декабрь 2005

95


СИСТЕМНЫЙ АДМИНИСТРАТОР №12(37), Декабрь, 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 г.). За содержание статьи ответственность несет автор. За содержание рекламного объявления ответственность несет рекламодатель. Все права на опубликованные материалы защищены.

ЧИТАЙТЕ В СЛЕДУЮЩЕМ НОМЕРЕ: DBMail: строим почтовую систему на основе реляционной СУБД

дуру, а пользователю теперь нет необходимости в каждодневном обновлении системы и антивирусных баз. Практически все современные ин- CORE FORCE яркий пример того, как формационные системы, используе- можно защитить систему, не зная нимые для управления бизнес-процес- чего об угрозе. сами предприятия, построены на основе реляционных СУБД. Почтовая Представляем система предприятия – очень важ- EnterpriseDB ная часть его IT-инфраструктуры, од- В наше время появление из «ниотнако до сих пор в качестве хранили- куда» новой СУБД уровня предприща почтовых сообщений, как прави- ятия выглядит довольно фантастичло, используются различные тексто- но. Тем более если эта СУБД распровые форматы. Нам предстоит постро- страняется под открытой лицензиить почтовый сервер на основе СУБД ей и имеет в своём составе развитые и посмотреть, какие преимущества средства администрирования и разэто даст. И хотя DBMail придется прой- работки. Впрочем, совсем новым проти еще долгий путь, чтобы заслужить дукт компании назвать трудно – он оспризнание и получить такую же попу- нован на Open Source-базой данных. лярность, как, например, Courier IMAP PostgreSQL, но существенно расшиили Cyrus IMAP, но уже сейчас видно, ряет её возможности, добавляя ночто его потенциальные возможности вые возможности и наращивая проочень широки. изводительность. В статье будет рассказано об особенностях EDB и начале работы с ней . Защищаем

Windows-системы с помощью CORE FORCE

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

Судьба shell-кода на системах с неисполняемым стеком, или Атака на DEP Отчаявшись справиться со своими же собственными ошибками, компания Microsoft совместно с Intel и AMD реализовала технологию DEP, призванную покончить с удаленными атаками раз и навсегда, но этого не произошло, и защиту удалось обойти...

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

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

96


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.