98
Роспечать – 20780, 81655 Пресса России – 87836 Интер-почта – тел. (095) 500-00-60 Так видит журнал читатель, который забыл оформить подписку: ПОДПИШИТЕСЬ И ЧИТАЙТЕ! Так видит журнал читатель, оформивший подписку: НОВОГОДНИЕ КАНИКУЛЫ ЗАТЯНУЛИСЬ БЫСТРО РАСКУПИЛИ ТИРАЖ НЕОЖИДАННО ЗАКОНЧИЛИСЬ ДЕНЬГИ УЕХАЛ В ОТПУСК ПОСЛЕ ОТПУСКА АВРАЛ НА РАБОТЕ №5(30) май 2005 подписной индекс 81655 www.samag.ru Почему MS SQL медленно работает? Ищем причины Строим защищенную беспроводную сеть: WPA-Enterprise, 802.1x EAP-TLS Настраиваем UPS под Linux Как восстановить удаленные файлы под BSD Что важно знать об IP-телефонии танавливаем Symantec Antivirus 9.0 в корпоративной сети Эффективно управляем полями пользователей в AD Контролируем безопасность сети с помощью OSSIM Интервью с Ларри Уоллом – создателем языка Perl №5(30) май 2005 подписной индекс 81655 www.samag.ru Почему MS SQL медленно работает? Ищем причины Строим защищенную беспроводную сеть: WPA-Enterprise, 802.1x EAP-TLS Настраиваем UPS под Linux Как восстановить удаленные файлы под BSD Что важно знать об IP-телефонии танавливаем Symantec Antivirus 9.0 в корпоративной сети Эффективно управляем полями пользователей в AD Контролируем безопасность сети с помощью OSSIM Интервью с Ларри Уоллом – создателем языка Perl №12(37) декабрь 2005 №12(37) декабрь 2005 подписной индекс 20780 www.samag.ru Как эффективно провести инвентаризацию установленного софта Мультизагрузка: стелим соломку Архитектура современных почтовых систем Спам или антиспам: кто кого? Защищаем электронную почту средствами MailScanner Настраиваем Cisco PIX Firewall 520 Размещаем несколько сайтов на одном веб-сервере PHP: делаем отладку на стороне клиента TCP поверх TCP – не такая уж плохая идея!

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

Embed Size (px)

DESCRIPTION

Так видит журнал читатель, который забыл оформить подписку: №12(37) декабрь 2005 подписной индекс 20780 www.samag.ru Н Е О Ж И Д А Н Н О Б Ы С Т Р О Р А С К У П И Л И Т И Р А Ж Н О В О Г О Д Н И Е П О С Л Е О Т П У С К А А В Р А Л Н А Р А Б О Т Е №12(37) декабрь 2005 Почему MS SQL медленно работает? Ищем причины

Citation preview

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

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

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

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

НОВОГОДНИЕ

КАНИКУЛЫ

ЗАТЯ

НУЛИСЬ

БЫСТР

О РАСКУПИЛИ

ТИРА

Ж

НЕОЖ

ИДАННО

ЗАКОНЧИЛИСЬ Д

ЕНЬГИ

УЕХАЛ В

ОТП

УСК

ПОСЛЕ ОТП

УСКА

АВРАЛ Н

А РАБОТЕ

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

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

Строим защищенную беспроводную сеть:WPA-Enterprise, 802.1x EAP-TLS

Настраиваем UPS под Linux

Как восстановить удаленные файлы под BSD

Что важно знать об IP-телефонии

танавливаем Symantec Antivirus 9.0в корпоративной сети

Эффективно управляем полями пользователей в AD

Контролируем безопасность сетис помощью OSSIM

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

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

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

Строим защищенную беспроводную сеть:WPA-Enterprise, 802.1x EAP-TLS

Настраиваем UPS под Linux

Как восстановить удаленные файлы под BSD

Что важно знать об IP-телефонии

танавливаем Symantec Antivirus 9.0в корпоративной сети

Эффективно управляем полями пользователей в AD

Контролируем безопасность сетис помощью OSSIM

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

№12

(37)

дек

абрь

200

5

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

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

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

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

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

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

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

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

PHP: делаем отладку на стороне клиента

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

1№12, декабрь 2005

оглавление

ТЕНДЕНЦИИ

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

2

WEBМаксим ВостренковКирилл Сухов

[email protected]

Мультизагрузка: стелим соломкуКак избежать проблем с загрузкой и загрузочными секторами?

14

Сергей Супрунов[email protected]

Круговорот почты в сети,Или Архитектура современных почтовых системОбщая картина работы сервисов электронной почты.

22

Спам или антиспам: кто кого?Развитие спамерских технологий, общее состояние спама на 2005 год и прогнозы на будущее.

30

Евгений Прокопьев[email protected]

Печатаем документы с веб-сервераРеализация решения с помощью Open Office.

58

IСQ: разрешить нельзя запретитьЕсли вы сомневаетесь, где правильнее в заголовке пос-тавить запятую, то эта статья для вас.

36

Павел Закляков[email protected]

Настраиваем Cisco PIX Firewall 520 для трансляции соединений между сетямиПример типовой схемы, часто используемой в неболь-ших сетях.

52

Малик Абдугалыев[email protected]

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

76

Алексей Барабанов[email protected]

AJAX: заработавший JavascriptБольшие амбиции технологии Ajax.

66

Вячеслав Родионов[email protected]

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

Защищаем электронную почту средствами MailScannerКакие возможности предлагает мощная и надежная система MailScanner.

45

Сергей Яремчук[email protected]

Многоликий Apache. Размещаем несколько сайтов на одном веб-сервереУстановив Apache и предоставив через него на всеоб-щее обозрение свой сайт, многие и не подозревают, ка-ким мощным инструментом они владеют.

63

Павел Малахов[email protected]

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

12

Дмитрий Острецов[email protected]

PHP: делаем отладку на стороне клиента, или Операции под наркозомИсправляем ошибки на работающей системе.

70

Сломленная, но не сдавшаяся: история операционной системы BeOSВзрыв сверхновой звезды – так можно было охаракте-ризовать появление на рынке в 1996 году компьютера BeBox и операционной системы BeOs.

84

Дмитрий Мороз[email protected]

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

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

83

Как эффективно провести инвентаризацию установленного софтаИспользуем WSH-сценарии и групповые политики Active Directory для сбора информации о приложениях, установленных на клиентских машинах.

6

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

Андрей Бирюков[email protected]

Сергей Яремчук[email protected]

Алексей Коршунов [email protected]

СЕТИ

Обзор книжных новинок92Александр Байрак[email protected]

Серафим Пикалов[email protected]

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

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

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

Мужики,где журнал

взяли?

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

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

Принес номерна работу,

«увели» почитать

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

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

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

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

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

BUGTRAQ

2

тенденции

В рамках конференции были пред-ставлены новые продукты фир-мы – Microsoft SQL Server 2005,

Microsoft Visual Studio 2005 и Microsoft BizTalk Server 2006.

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

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

Поставленная для демонстрации задача (расчёт эффективности но-вой бизнес-стратегии продаж аль-бомов рок-группы Windows и её ре-ализация) была за несколько десят-ков минут решена. Это стало возмож-ным благодаря новым продуктам кор-порации, применяемым в них эффек-тивных средств анализа и разработки и, самое главное, глубокой интегра-ции MSSQL Server, MSVS и MS BizTalk Server между собой и другими компо-нентами платформы.

Безусловно, ключевым продуктом,

представленным на конференции, был MSSQL Server.

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

Основное впечатление заключает-ся в том, что все нововведения в SQL Server 2005 призваны обеспечить ком-фортную совместную работу с дан-ным продуктом при большом коли-честве подключений и значительных объемах базы. Перечислим основные моменты.

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

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

Например, начал выполняться за-прос 1 (SELECT), затем запрос 2 из-менил какие-то строки в таблице (UPDATE), затем запрос 3 начал фор-мировать отчет – в этом случае за-прос 1 будет работать со своим набо-ром данных (до UPDATE), а запрос 3 со своим (после UPDATE) и соответс-твенно после завершения запроса 1 данные из временной базы перейдут в основную таблицу.

Поддержка многопроцессорностиНе секрет, что MSSQL Server под-держивает несколько процессоров. Но теперь появилась новая деталь – процессоры можно разбивать на груп-пы в произвольном порядке с услови-ем, что 1 процессор может входить только в 1 группу. Группу, используе-мую при выполнении запроса, можно указывать в самом запросе. Чрезвы-чайно удобно для построения «тяже-лых» отчетов.

Service BrokerService Broker – новая технология для разработки распределенных при-

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

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

Кирилл Сухов, Максим Востренков

3№12, декабрь 2005

тенденции

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

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

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

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

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

Data MirroringData Mirroring – новая технология отка-зоустойчивости, которая сродни старо-му доброму режиму репликации Log Shipping. Однако есть некоторые раз-личия. Использовать ее можно в двух вариантах – поддержка копии базы в реальном времени или некоторая за-мена кластера.

Рассмотрим оба.В первом случае нам достаточ-

но иметь 2 сервера. При изменении данных на одном из серверов клиент-ским приложением такая же команда отправляется на выполнение второ-му серверу. Чем это хорошо? Да хо-тя бы тем, что в качестве второго сер-вера можно использовать гораздо бо-лее слабую машину, потихоньку коман-ды обработаются и никуда не денутся. Зато у нас всегда будет актуальная ко-пия данных.

Теперь второй вариант. В отли-чие от первого здесь нам понадобит-ся еще и сервер-агент. Выполнение команд происходит следующим об-разом: команда поступает на сервер-агент, он пересылает ее на первый сервер, первый сервер дублирует ее на второй сервер, параллельно выпол-няя ее сам, второй сервер выполняет команду и отправляет первому серве-ру подтверждение, первый сервер за-канчивает выполнение команды и ра-портует серверу-агенту об удачном выполнении. Что мы от этого выигры-ваем? Сервером-агентом может слу-жить любой самый дешевый совре-менный компьютер, но тем не менее это тоже расходы. Зато в случае выхо-да из строя одного из серверов агент автоматически перенаправит запро-сы на второй. Минус – он не будет ра-

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

Business IntelligenceBusiness 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, кото-рое являлось отдельным продук-том, а теперь он просто интегри-рован его в сервер.

ДокладыПредставление Visual Studio 2005 на-чалось докладом Дмитрия Никонова и Анатолия Смолянинова о новом инс-трументе разработки – Visual Studio Team System. Были рассмотрены и про-демонстрированы на примерах раз-

4

тенденции

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

Продолжением стал доклад «Про-ектирование и разработка корпоратив-ных приложений», где речь шла уже о 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.

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

Реализован механизм использова-ния шаблонов.

Значительно облегчена работа с ролями пользователей за счёт введения нового программного ин-терфейса – диспетчера ролей.

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

С новыми технологиями .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 – серверное решение

для платформы Microsoft Office System, включающее 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. Для чи-тателей «Системного администрато-ра» это значит, что в ближайших но-мерах журнала появятся предвари-тельные обзоры возможностей этих продуктов, а также (благодаря непри-нуждённым разговорам в фойе конфе-ренц-зала) некоторые другие небезын-тересные материалы.

5№12, декабрь 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%.

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 и призваны покрыть нужды пред-приятий различного уровня.

«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

6

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

Как правило, в сетях большинс-тва организаций у пользовате-лей нет прав на установку прило-

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

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

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

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

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

Андрей Бирюков

7№12, декабрь 2005

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

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

Теоретическая частьКак известно, информация об установленных в ОС 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.

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

А отключить сетевой диск можно с помощью команды:

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

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

Ключевым моментом нашего сценария является цикл, обходящий ветку реестра Uninstall:

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

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

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

On Error Resume Next

Листинг 2. Отключение сетевого диска

WScript.Sleep 3000objNetwork.RemoveNetworkDrive CheckDrive.Item(0), true

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

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

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

8

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

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

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

Приведем полный текст сценария для сбора информа-ции об установленных на компьютере приложениях:

Сбор урожаяЕсли в вашей локальной сети менее десяти компьютеров, то запуск описанного выше сценария не составит особого труда. Можно воспользоваться столь любимой всеми сис-темными администраторами программой Remote Admin и удаленно запустить сценарий на каждой клиентской ма-шине. Однако все эти решения требуют от администрато-ров много ручной работы, а это не слишком хорошо. В ори-гинальной версии сценария [2] предлагалось использовать следующую процедуру, которая сначала собирает данные о машинах в домене, потом пытается запустить сценарий на каждом из этих компьютеров.

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

userValueName = "DefaultUserName"objReg.GetStringValue HKLM,pcName,pcNameValueName,pcValueobjReg.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 objDictionary2strKeyPath = objDictionary2.Item(objItem)objReg.GetStringValue HKLM ,strKeyPath, ↵ unValueName, strValueobjTextFile2.WriteLine (strValue)If Err Then objDictionary2.Remove(objItem)End IfNext

End Subwscript.Quit

Листинг 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.NameNextobjPCTXTFile.close

' Читаем компьютеры из созданного файлаSet readPCFile = objFSO.OpenTextFile(strPath ↵ & strPCsFile, ForReading)i = 0Do Until readPCFile.AtEndOfStream strNextLine = readPCFile.ReadlineobjDictionary.Add i, strNextLinei = i + 1LoopreadPCFile.Close ' Запускаем процедуру сбора информации на каждом компьютереFor each DomainPC in objDictionarystrComputer = objDictionary.Item(DomainPC)GetInstalledSoftware()Next

Листинг 4. Ветки, содержащие информацию об именипользователя и имени компьютера

pcName = "SYSTEM\CurrentControlSet\Control\ ↵ ComputerName\ActiveComputerName\"pcNameValueName = "ComputerName"userPath = "Software\Microsoft\Windows NT\ ↵ CurrentVersion\Winlogon\"userValueName = "DefaultUserName"

Листинг 5. Полный текст сценария

' Объявляем константу HKEY_LOCAL_MACHINEConst HKLM = &H80000002Const REG_SZ = 1 ' Const ForReading = 1 Const ForWriting = 2

On Error Resume NextSet objFSO = CreateObject("Scripting.FileSystemObject")Set objDictionary2 = CreateObject("Scripting.Dictionary")

Dim objNetwork, objShell, CheckDriveDim 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 nextSet objReg=GetObject("winmgmts: ↵ {impersonationLevel=impersonate}!\\" & _ strComputer & "\root\default:StdRegProv")If Err <> "0" ThenExit SubEnd If

' Путь к разделу реестра Uninstall, содержащему информацию' об установленных компонентахunKeyPath = "Software\Microsoft\Windows\ ↵ CurrentVersion\Uninstall"unValueName = ("DisplayName")

objReg.EnumKey HKLM, unKeyPath, arrSubKeysi=0For Each Subkey in arrSubKeysobjDictionary2.Add i, unKeyPath & "\"& subkey & (Enter)i=i+1Next

pcName = "SYSTEM\CurrentControlSet\Control\ ↵ ComputerName\ActiveComputerName\"pcNameValueName = "ComputerName"userPath = "Software\Microsoft\Windows NT\ ↵ CurrentVersion\Winlogon\"

9№12, декабрь 2005

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

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

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

Возможен еще другой вариант для запуска нашего сце-нария на пользовательских машинах – это Logon Script. Для доступа к нему необходимо в свойствах пользовате-ля (или нескольких выбранных пользователей) в закладке Profile указать путь к файлу сценария (см. рис. 2).

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

Очевидно, что для подобных случаев лучше всего вы-полнять сценарии на клиенте с помощью групповых поли-тик Active Directory. Групповую политику можно рассмат-ривать как набор правил для управления пользователями и компьютерами. Групповую политику разрешается приме-нять в нескольких доменах и в подгруппах внутри домена или индивидуальных системах. Параметры групповой по-литики хранятся в объекте групповой политики (Group policy Object, GPO). К одному и тому же домену или подразделе-нию можно применять несколько объектов GPO. Подроб-нее о взаимодействии политик, свойствах Block Inheritance и No Override можно прочитать в [1].

Итак, создадим свою групповую политику и исполь-зуем ее для автоматизации развертывания нашего сце-нария. Для этого зайдем локально или удаленно на кон-троллер домена «Administrative Tools → Active Directory Users and Computers → Домен». В меню «Action → New → Organization Unit» (введем название), затем в свойствах созданной организационной единицы закладка «Group Policy», нажимаем «New», указываем имя новой политики и затем, нажав «Edit», попадаем в редактор объектов GPO. Для решения поставленной задачи развертывания сце-нария на машинах пользователей нам удобнее будет ис-пользовать раздел «Computer Management», конечно, ес-ли мы используем «Computer Management», ничего страш-ного не произойдет, но, как и в случае с Logon Script, если за компьютером работают несколько пользователей, то мы рискуем получить несколько одинаковых файлов отчетов, которые будут отличаться только именем пользователя в заголовке. В разделе «Computer Management» заходим в «Windows Settings», далее «Scripts» (см. рис. 3).

Здесь возможны два варианта «Startup» и «Shutdown». Логичнее будет использовать наш сценарий при запуске пользовательской машины.

Нажимаем «Add» и добавляем файл сценария без па-раметров. Все, теперь наш сценарий будет выполнен при следующем запуске компьютера. В случае если необходи-мо использовать раздел «User Configuration», соответству-ющие разделы будут «Windows Settings» и «Scripts (Logon/Logoff)». Теперь остается только перетащить машины, к ко-торым будет применена данная групповая политика в со-зданную нами Organization Unit.

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

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

Рисунок 2. Указываем Logon Script

10

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

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

На втором листе список приложений и количество ус-тановок каждого из них.

Далее приводится фрагмент сценария, реализующего все эти действия.

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

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

держащий множество примеров WSH сценариев, с коммента-риями.

Листинг 7. Создание документа Excel c результатами…………….Set s = oE.Sheets(1) ' Лист 1s.Name = "Список" Set s1 = oE.Sheets(2) ' Лист 2s1.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=14End Withs1.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=14End WithSet 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.FilesIf fi.name<>"excel.vbs" AND fi.name<>"result.xls" Then' Файл сценария и файл отчета не открыватьSet readPCFile = objFSO.OpenTextFile(fi, ForReading)i = 0s.Cells(n, 1) = fi.name ' Имя файла – это имя компьютераDo Until readPCFile.AtEndOfStream strNextLine = readPCFile.Readline i = i + 1 ' Первые 6 строк в файлах отчетах – это шапка, ' экспортировать не нужно

If i>6 Then s.Cells(n, 2) = strNextLine objTextFile2.WriteLine (strNextLine) n = n + 1 End If Loop readPCFile.CloseEnd IfNextobjTextFile2.closef=3Set 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 IfEnd Withs1.Cells(f,2)=Count ' сохраняем количество установок End Iff=f+1End IfLoop

Рисунок 3. Объекты групповой политики Рисунок 4. Таблица Excel с результатами

12

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

Каждый из указанных способов имеет свои достоинства и не-достатки. Жалобы пользовате-

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

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

предназначен для оповещения, здесь можно выбрать несколько вариантов. Например, отсылка почтового сообще-ния на указанный адрес. При этом со-общение может быть в обычном текс-товом формате, (X)HTML и так назы-ваемом MINI, подходящем для пейд-жеров и мобильных телефонов. Так-же информация о событии может быть занесена в текстовый файл, здесь до-ступны также три формата: текстовый, csv и (X)HTML. Событие может быть занесено через ODBC в базу данных, отослано на удаленный syslog-сервер, SNMP, параллельный порт или выдано в сеть как net send-сообщение. Кроме того, можно проиграть звук, вывести сообщение на локальном компьютере или выполнить произвольную коман-ду пользователя. Все эти настройки производятся во вкладке Notifications (Targets) после указания всех парамет-ров, вывод целевого сигнала обычно можно сразу же протестировать нажа-тием кнопки Test.

Параметры систем контролиру-ют два агента: Event Log Agent Control и Heartbeat Agent Control, каждый из них отвечает за свой участок рабо-ты. При помощи Event Log Agent Control EventSentry отслеживает параметры локального компьютера, а Heartbeat Agent Control предназначен для ра-боты с удаленными системами. Аген-ты позволяют собрать информацию о многих основных параметрах. Напри-

мер, об активности процесса со време-ни его запуска до момента остановки. Все собранные данные (id процесса, id родительского процесса, путь, имя ис-полняемого файла, имя пользователя, домен, время) сохраняются, и при не-обходимости всегда можно просмот-реть историю, узнать, кто, когда и с ка-кой частотой запускал программу. Что-бы не нарушать корпоративные прави-ла, при трассировке процесса не соби-рается информация о том, какой доку-мент был открыт, также не отслежи-ваются аргументы командной строки. Можно контролировать работу всех процессов («Track all processes except those listed below»), исключить трасси-ровку отдельных процессов или, на-оборот, указать только на те процессы, которые нуждаются в отслеживании. Практически аналогичные по настрой-ке фильтры позволяют контролировать регистрацию и выход пользователей из системы. Но это еще не все. Начи-ная с версии 2.30, EventSentry получил возможность контролировать некото-рые системные параметры. Например, при помощи «Service Monitoring» адми-нистратор может узнать, когда и кем были добавлены, удалены или измени-ли свои параметры сервисы и драйве-ра. Сигнал поступит также и в том слу-чае, когда в реестр или в каталог «Ав-тозагрузка» будет добавлена новая программа, а также если сервис, ус-тановленный в автозапуск, по каким

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

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

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

13№12, декабрь 2005

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

компьютеры рабочей груп-пы или Active Directory. Даль-нейшую настройку парамет-ров сетевого контроля отде-льных компьютеров, а также установленных на них агентов можно производить по щелч-ку на имени компьютера ли-бо из контекстного меню. От-сюда же можно управлять об-новлениями агентов. Щел-чок левой кнопкой по пунк-ту «Computers» выдаст ре-зультат последней проверки. Выбор «View History» позво-лит просмотреть историю за-просов.

На момент написания статьи бы-ли доступны две версии продукта EventSentry и EventSentry Light. Вторая распространяется как freeware, но име-ет ограничения на количество конт-ролируемых сервисов и параметров: не более одного параметра в каждом пункте контроля, и всего два вида опо-вещения – e-mail и сообщение на рабо-чий стол также недоступны веб-отче-ты. Но в принципе контролировать об-щую работоспособность систем в сети даже с такими ограничениями вполне возможно. Полная версия без регис-трации будет работоспособна в тече-ние 45 дней.

После установки, в ходе которой можно ввести адрес SMTP-сервера (основного и резервного), порт, почто-вый адрес, куда будут отсылаться со-общения, данные для SMTP-аутенти-фикации (если нужно), можно присту-пать к настройке агентов и фильтров. Все настройки сохраняются в клю-че реестра HKEY_LOCAL_MACHINE\netikus.net\EventSentry, который при необходимости можно экспортировать и импортировать как через менеджер управления, так и regedit.

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

Ссылка:1. Сайт программы EventSentry – http://

www.netikus.net.

либо причинам не запустил-ся. Вкладка «Disk Space» поз-воляет выставить параметры наблюдения за свободным местом на разделах жестко-го диска. Здесь указываются логические разделы жесткого диска, подлежащие наблюде-нию, процент или объем, при заполнении которого будет выдано предупреждающее сообщение, а также интервал между проверками.

Идеальным дополнением к проверке журналов и сис-темных параметров является контроль за состоянием ком-пьютеров и сетевых сервисов. Для это-го используются ICMP-запросы и про-верка работы TCP-портов, а также от-клик EventSentry-агентов, работающих на удаленных компьютерах. Кроме прочего EventSentry эмулирует syslog сервер, что вместе с наблюдением за сетевыми сервисами может использо-ваться не только для контроля рабо-ты Windows-систем, но и доступности сервисов, UNIX и Cisco-систем. И, на-конец, использовав внешний датчик, подключаемый к USB- или COM-пор-ту, можно контролировать темпера-туру и влажность в помещении. Если указанные параметры выйдут за пре-делы нормы, администратор получит предупреждение.

Всю собранную информацию мож-но просмотреть при помощи системы отчетов, доступных через GUI-интер-фейс, либо ASP- или PHP-страницы, через IIS или Apache. Отчеты разбиты по группам (Security, System, Aplication и другие), можно выбрать просмотр всех событий либо отсортировать по типу (Error, Warning, Information, Audit Failure/Success).

Учитывая, что файлы журналов имеют привычку разрастаться, при по-мощи консоли управления можно вы-ставить параметры их архивирования. Для их установки заходим во вкладку «System Health → Backup Event Logs», нажимаем «+» в «Shelude» и заполня-ем параметры: вид журнала (систем-ный, приложения и пр.), день и время операции, имя файла. Для удаления старого файла ставим галочку в пунк-те «Clear Event Log». Для подстрахов-ки, в том случае если журнал запол-нится раньше, выставляем отправ-

ку предупреждения в «Full Event Log Detection».

Типичная схема контроля при по-мощи EventSentry показана на рис. 2. Агенты собирают информацию и от-сылают по назначению для дальней-шего анализа и принятия решений. При помощи одной консоли управ-ления можно настроить и контроли-ровать работу не только локальных, но и удаленных систем. Для этого нуж-ны права администратора, и на уда-ленном компьютере должна быть за-пущена служба «Удаленный реестр» (REMOTE REGISTRY). Причем установ-ку системы контроля можно произво-дить как локально, так и удаленно. Ес-ли нет необходимости в наличии консо-ли управления на клиентских компью-терах, то при установке ее можно уб-рать из списка устанавливаемых ком-понентов. Хорошо продумана возмож-ность добавления новых компьютеров в список контроля. Для этого щелка-ем правой кнопкой мыши на заголов-ке Computers и в контекстном меню вы-бираем пункт «Add Computer/IP-адрес» для добавления одного компьютера или «Import Computers» для импорти-рования списка компьютеров. Во вто-ром случае указать на файл, в котором указан список компьютеров, выбрать

Рисунок 1. Внешний вид консоли управления EventSentry

Рисунок 2. Типичная схема контроляпараметров компьютера

14

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

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

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

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

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

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

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

15№12, декабрь 2005

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

Нужно заметить, что существует не-сколько схем разметки жестких дисков, помимо привычного большинству поль-зователей деления на разделы. Напри-мер, 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 байт для описания каждого раздела жесткого диска. Очевидно, что

диск может содержать только 4 раз-дела, описанные в MBR (такие разде-лы называют первичными). Для обхо-да этого ограничения используются дополнительные (extended) разделы (довольно часто можно встретить тер-мин «расширенный раздел», хотя это не совсем верно). Первый сектор та-кого раздела аналогичен MBR и может содержать описание логического раз-дела (диска) и ссылку на следующий дополнительный раздел. В результате несколько дополнительных разделов создают своего рода цепочку ссылок. На рис. 1 показан пример разбиения диска, поясняющий сказанное.

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

В DPT для каждого раздела содер-жатся его координаты, а также тип фай-ловой системы и признак активности раздела. Активным должен помечать-ся только один раздел; о том, зачем это нужно, поговорим чуть позже.

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

Наконец, программный код (в даль-нейшем для него будет использовать-ся термин «первичный загрузчик» или «MBR-код»), располагающийся в на-чале первого сек-тора диска, в сво-ем «каноническом» виде предназначен для анализа табли-цы разделов, поис-ка в ней раздела, помеченного как активный, загруз-ки в память кода из первого секто-ра активного раз-дела (boot-сектора)

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

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

Загрузка непосредственно ядра может использоваться для безуслов-ной загрузки операционных систем се-мейства DOS/Windows 9x, то есть тех, где пользователю не предлагается вы-бор системы или параметров загрузки ядра, а требуется просто передать уп-равление ядру системы, размещенно-му в строго определенном месте (что-бы его не приходилось искать).

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

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

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

Байты Назначение

0-445 MBR-код

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

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

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

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

510-511 Сигнатура 0xAA55

Таблица 1. Формат MBR

Байты Назначение

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

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

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

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

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

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

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

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

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

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

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

Рисунок 1. Пример разбиения диска на разделы

16

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

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

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

В случае если загрузчик в MBR бу-дет поврежден, восстановить его поз-воляет команда fdisk /mbr (в современ-ных системах Windows вы ее, к сожа-лению, уже не найдете). Она перезапи-сывает только код первичного загруз-чика (первые 446 байт), не затрагивая таблицу разделов.

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

NTLoader уже умеет работать

с файловыми системами (как с FAT, так и NTFS), благодаря чему существу-ет возможность (скорее теоретическая, учитывая возможные проблемы из-за «обобществления» ряда системных каталогов, таких как «Program Files») установить несколько систем семейс-тва Windows на один раздел. Напри-мер, если boot.ini будет выглядеть та-ким образом:

то это позволит загрузить Windows 2000 из каталога WinNT диска C, в то время как Windows 98 будет занимать тра-

диционную папку C:\Windows и загру-жаться посредством io.sys.

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

LILO и GRUB – близнецы-братьяНет, конечно же, эти два популярных в среде Linux менеджера загрузки имеют ряд коренных отличий, одна-ко применительно к теме данной ста-тьи принцип их работы схож. Они за-писывают в MBR код, который, безу-словно (независимо от установлен-ных признаков активности разделов), передает управление вторичному за-грузчику (на этот раз он располагает-ся непосредственно в файловой систе-ме, а не в boot-секторе, причем в неко-торых случаях это может быть не Linux-раздел; в случае GRUB возможно раз-мещение части вторичного загрузчи-ка – stage1_5 – и вне файловой систе-мы). Эта программа отвечает за отоб-ражение меню выбора и (в случае, ес-ли выбрана загрузка Linux) передает управление загрузчику ядра.

Благодаря такому подходу, раз-работчики этих менеджеров загрузки смогли обойти очень жесткое ограни-чение на размер загрузочного секто-

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

грузочный код, размещаемый в MBR.

Вторичный загрузчик (boot-код) – за-грузочный код, размещаемый в boot-секторе раздела.

Загрузчик ядра (loader) – программа, загружающая ядро ОС.

Термин «загрузчик» в зависимости от контекста может обозначать либо один из указанных кодов, либо весь набор про-грамм, отвечающих за загрузку системы (например, BSD-загрузчик).

Сказание о 1024 цилиндреС давних времен умудренные опытом сис-темные администраторы передают сво-им молодым коллегам наказ – не ставить операционную систему за пределами 1024 цилиндра. Что же это за магический ци-линдр и насколько проблема актуальна в наши дни?

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

боты с диском использует функцию BIOS INT13 (которая как раз и руководствуется CHS-адресацией), просто не сможет «дотя-нуться» до раздела, размещенного за ука-занным пределом.

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

[boot loader]timeout=30default=multi(0)disk(0)rdisk(0) ↵ partition(1)\WINNT[operating systems]multi(0)disk(0)rdisk(0) ↵ partition(1)\WINNT= ↵ "Windows 2000Pro" /fastdetectC:\="Windows 98SE"

17№12, декабрь 2005

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

ма FreeBSD. Четвертый раздел не раз-мечен, поэтому в меню не представ-лен. В качестве загрузки по умолча-нию (Default) предлагается та система, которая расположена на активном раз-деле. Причем BSD-загрузчик, ко все-му прочему, умеет перезаписывать таблицу разделов, отмечая как актив-ный тот раздел, который был выбран пользователем. То есть если вы сейчас нажмете F1, то загрузится, к примеру, Windows 98, и в следующий раз имен-но она будет предлагаться как систе-ма по умолчанию.

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

Здесь опция -s задает номер разде-ла (начиная с 1), который будет исполь-зоваться по умолчанию, -t – задержку в «тиках» (1 секунда примерно соответс-твует 18 тикам). Будьте предельно ос-

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

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

Если же вы не были столь предус-мотрительны и при очередной загруз-ке видите на экране одинокое «L», то решить эту проблему несложно: за-грузитесь с системной дискеты DOS или Windows 98 и выполните команду «fdisk /mbr» для записи стандартного загрузчика в MBR вместо LILO.

Или перед тем, как удалять раз-дел, деинсталлируйте LILO следую-щей командой:

Правда, нужно учитывать, что восстановление произойдет успеш-но только в том случае, если в систе-ме есть файлы с копией MBR до уста-новки LILO (обычно они располагаются в каталоге /boot с именами boot.XXYY, например, boot.0300 для MBR первого диска). Когда вы выполняете коман-ду /sbin/lilo для инсталляции загрузчи-ка, нужные файлы должны создавать-ся автоматически; при повторных ин-сталляциях (когда вы меняете конфи-гурацию загрузчика или устанавлива-

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

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

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

Из этого примера видно, что загруз-чик нашел три раздела: на первом – DOS (под это же обозначение попа-дают и системы Windows 9x), на вто-ром – неизвестная загрузчику система (например, так может выглядеть раз-дел Linux swap), а на третьем – систе-

# lilo -u

F1 DOSF2 ??F3 FreeBSD

Default: F3 _

# boot0cfg -o noupdate -s 3 -t 550

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

Кроме того, FreeBSD использует собс-твенную разметку внутри раздела. В ее

терминологии разделы именуются слайса-ми (slice), а созданные в них подразделы – собственно разделами (partition). Эти раз-делы обозначаются буквами (первый раз-дел первого слайса будет обозначаться как «ad0s1a».

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

Раздел GRUB Linux FreeBSD

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

(hd0,0) hda1 ad0s1

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

(hd0,1) hda2 ad0s2

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

(hd1,0) hdb1 ad1s1

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

Диск Linux FreeBSD

Primary Master hda ad0

Primary Slave hdb ad1

Secondary Master hdc ad2

Secondary Slave hdd ad3

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

18

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

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

Грузим три системы с помощью загрузчика BSDПосмотрим, как можно загрузить Windows, Linux и FreeBSD с помощью стандартного загрузчика FreeBSD. Собственно говоря, это наиболее простой путь – просто инсталлируй-те FreeBSD последней, разрешите установку загрузчика в MBR, и больше ни о чем беспокоиться не нужно – загрузчик сам будет определять доступные разделы и предлагать их вам на выбор. Однако одним из серьезных недостатков яв-ляется то, что BootEasy не умеет анализировать загрузоч-ные сектора логических дисков (размещенных на дополни-тельных разделах), поэтому выбор будет ограничен систе-мами, установленными в основные разделы. (Впрочем, есть сведения, что это ограничение преодолевается. Например, DragonFly BSD (основанную на FreeBSD систему), по неко-торым слухам, можно устанавливать и на логические дис-ки – но сам не проверял, поэтому врать не буду...).

Если FreeBSD у вас уже установлена, и вы хотите устано-вить еще и Linux, сохранив загрузчик, установите LILO или GRUB в загрузочный сектор Linux-раздела (большинство ин-сталляторов позволяют сделать соответствующий выбор). В этом случае BSD-загрузчик передаст управление на этот boot-сектор, а остальное сделает уже Linux-загрузчик.

Если же последней системой устанавливается Windows, то тут без «реанимации» не обойтись – после инсталляции вы сможете загрузиться только в Windows, поскольку сис-темы от Microsoft безо всяких вопросов перезаписывают MBR тем кодом, какой им нужен. В этом случае вам при-дется воспользоваться системной дискетой, дистрибутив-ным диском или LiveCD, чтобы загрузить FreeBSD и восста-новить загрузчик, используя команду boot0cfg.

В данной статье, говоря о загрузчике FreeBSD, упомина-ется лишь устанавливаемый по умолчанию BootEasy, одна-ко нужно заметить, что он не единственный boot-менеджер для этой системы. В коллекции портов вы сможете найти несколько альтернатив, например, extipl (Extended IPL), gag и даже grub. Если вы используете один из них, уточните в до-кументации, как следует выполнять те или иные действия.

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

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

Например, загрузка системы Windows, установленной в первом разделе, может быть обеспечена такими строка-ми в lilo.conf:

Если Windows для загрузки использует NTLoader, то при выборе пункта «windows» в меню LILO вы получите еще од-но меню – на этот раз соответствующее файлу C:\boot.ini.

Поскольку на самом деле строка «other» просто указы-вает на некоторый boot-сектор, коду которого должно быть передано управление, то таким же образом можно загру-жать и другие системы, например, FreeBSD (указав соот-ветствующий раздел).

А наибольшую гибкость обеспечивает GRUBЗагрузчик GRUB может не только передать управление на указанный раздел, но и непосредственно загрузить файлы «чужих» систем (например, FreeBSD). В частности, следу-ющий фрагмент конфигурационного файла обеспечит за-грузку FreeBSD, минуя ее вторичный загрузчик:

В этом случае GRUB передаст управление сразу на за-грузчик ядра FreeBSD, который и выполнит дальнейшую за-грузку. Обратите внимание, что в силу особенностей раз-биения раздела, присущих FreeBSD (см. врезку «Особен-ности именования разделов»), нужно помимо диска и номе-ра раздела указать еще букву подраздела FreeBSD (в на-шем случае – a).

Для загрузки Windows из GRUB больше подойдет ис-пользование передачи управления «по цепочке»:

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

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

Ус т а н о в к а н а д и с к в ы п о л н я е т-ся из папки дистрибутива командой: «winnt32.exe /cmdcons».

При следующей перезагрузке вы уви-дите новый пункт в меню NTLoader, вызы-вающий загрузочный образ из места распо-ложения файлов консоли восстановления (обычно это C:\cmdcons\BOOTSECT.DAT).

Загрузившись в консоль, вы сможе-те выполнить ряд команд, среди которых интересные нам fixmbr и fixboot. Первая,

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

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

title FreeBSD # Указываем имя ОСroot (hd0,2,a) # Выбираем корневой раздел для загрузкиkernel /boot/loader # Указываем файл для передачи управления

title Windowsrootnoverify (hd0,0) makeactivechainloader +1

other = /dev/hda1 # Указываем загрузочный раздел Windows table = /dev/hda # Таблицу разделов следует искать в MBR label = windows # Наименование загружаемой системы

19№12, декабрь 2005

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

ка, как и в случае с LILO, будет определяться настройками NTLoader (если он имеется).

По цепочке может быть загружена практически любая система, в том числе и FreeBSD, если такой способ кажет-ся вам более удобным, чем приведенный выше:

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

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

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

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

Команды монтирования в этом примере предполага-ют, что Windows-раздел у вас описан в fstab. Иначе пот-ребуется также указать тип монтируемой системы и, воз-можно, некоторые дополнительные параметры. Данный фрагмент сработает только в том случае, если на диске C: вы используете файловую систему FAT.

В случае NTFS запись возможна, если файл назна-чения уже создан и имеет нужный размер, хотя проще и безопаснее воспользоваться «посредником», напри-мер, дискетой или «флэшкой», для переноса образа на диск C:.

Далее, перегрузившись в Windows, добавьте в файл boot.ini такую строчку (описание в кавычках может быть любым):

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

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

C:\bootsect.lnx="SUSE Linux 10.0"

title FreeBSDchainloader (hd0,2)+1

title Windows 98chainloader (hd0,0)/bootsect.dos

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

Большая тайна маленькой дискеткиВы никогда не задумывались, почему дискета, забытая в дис-ководе, прерывает загрузку компьютера с выдачей сообщения «Non-System disk or disk error»? Казалось бы, если дискета не за-грузочная, то BIOS должен просто приступить к опросу следую-щего по списку устройства…

Загрузитесь во FreeBSD или Linux и запишите в файл первый сектор чистой дискеты, только что из коробочки:

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

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

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

# dd if=/dev/fd0 of=floppy.bs bs=512 count=1

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

20

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

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

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

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

BootEasy для передачи управления на другой диск пред-ложит вам еще один вариант выбора – F5. Если в MBR вто-рого диска также установлен BSD-загрузчик, то будет вы-полнен анализ его таблицы разделов и сформировано ме-ню для этого диска. Вернуться на первый можно той же клавишей <F5>.

А вот если вы используете NTLoader, то тут есть свои особенности…

В случае с LILO вы по-прежнему можете использо-вать описанную выше схему – сохраняя в файл образ со-ответствующего boot-сектора и подключая его в boot.ini. Но вот если на первом диске у вас установлена система Windows, а на втором – FreeBSD, и вы хотели бы исполь-зовать для загрузки NTLoader (в частности, чтобы иметь возможность безболезненно отключить второй диск), то, просто передав управление на образ загрузочного раз-дела (файл boot1), вы поставленную задачу не решите. Де-ло в том, что boot1 обращается к таблице разделов теку-щего диска, чтобы определить координаты сектора с сис-темой FreeBSD. А поскольку текущим диском останется

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

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

Теперь перепишите этот файл в Windows-раздел и на-стройте NTLoader, как было описано выше, и при выборе со-ответствующего пункта меню вы попадете в LILO или GRUB, который сделает всю оставшуюся работу.

Однако будьте предельно осторожны с загрузчиком BSD – он обязательно должен быть установлен, в нашем случае – в MBR второго диска, и использовать лучше об-раз этого сектора, «снятый» утилитой dd. Если это не было сделано, то файл boot0 не будет содержать таблицы разде-лов. А, как вы, должно быть, помните, BSD-загрузчик пе-резаписывает MBR, чтобы проставить признак активнос-ти раздела, загружавшегося последним. В итоге если вы просто будете использовать boot0 в качестве образа MBR, то получите следующую схему: Стандартный загрузчик из MBR первого диска находит

активный раздел и загружает его boot-сектор. Находящийся там NTLoader при выборе пункта

«FreeBSD» загружает bootsect.bsd (который является копией boot0).

Загрузчик BSD, получив управление, загружает выбран-ную систему, проставляет признак активности в пустой таблице разделов и записывает ее в MBR.

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

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

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

# dd if=/dev/hdb of=bootsect.hdb bs=512 count=1

21№12, декабрь 2005

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

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

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

Если вы часто используете 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 (при нали-чии нескольких разделов их тоже следует подключить, со-

храняя иерархию; например, раздел /boot смонтируйте как /mnt/boot), с помощью команды «chroot /mnt» сделайте его корневым и выполните команду /sbin/lilo для восстановле-ния загрузчика.

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

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

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

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

Удачи вам и крепких нервов!

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

22

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

Материал этой статьи, наверное, больше подходит для учебни-ка по основам системного ад-

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

Для того чтобы упростить задачу, мы откажемся от рассмотрения та-ких монстров, как Microsoft Exchange или Lotus Notes/Domino, и сосредото-чим внимание на открытом програм-мном обеспечении и стандартных поч-товых протоколах – их в большинстве случаев более чем достаточно. Не бу-дем мы рассматривать и протокол UUCP – многие из тех, кто знал, что это такое, уже успели про него забыть.

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

ти, а иногда даже использовать без из-менения (см. рис. 1).

Как создаются почтовые сообщенияС точки зрения пользователя почто-вой системы существует только один компонент – это MUA (Mail User Agent), или, другими словами, его почтовый клиент (Mozilla, Outlook, The Bat!, KMail, mutt, pine, mailx, а также веб-приложе-ния аналогичного назначения), пред-назначенный для создания, отправ-ки, получения и чтения почтовых со-общений.

Формат почтовых сообщений опи-сан в RFC 2822 (Internet Message Format) и в серии RFC с 2045 по 2049, которые посвящены формату MIME – Multipurpose Internet Mail Extensions (Format of Internet Message Bodies, Media Types, Message Header Extensions for Non-ASCII Text, Registration Procedures, Conformance Criteria and Examples).

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

Следующие заголовки считаются обязательными: From – адрес и, возможно, полное

имя отправителя. To – адрес и, возможно, полное имя

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

Subject – тема письма. Date – локальные дата и время от-

правления письма.

Другими часто используемыми за-головками являются: Сс (carbon copy) – кому отправить

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

Received – путь прохождения пись-ма.

Content-Type – информация о том, каким образом письмо должно быть отображено.

Многие MUA позволяют указать заголовок Bcc (Blind carbon copy) – его получатели письма не увидят ни-когда. Получатели, упомянутые в To и Cc, ничего не узнают о получателях, упомянутых в Bcc, а последние ничего не узнают друг о друге, но тем не ме-нее они получат письмо и будут недо-умевать: как в их почтовом ящике ока-залось сообщение, в числе адресатов которого они не упомянуты? Этот за-головок используется преимуществен-но спамерами.

Имена заголовков могут содержать только 7-битные ASCII-символы. Зна-чения заголовков не ограничены сим-волами ASCII, но при наличии не ASCII-символов они должны использо-вать MIME-кодирование в форме «=?charset?encoding?encoded text?=».

Существуют следующие типы ко-дирования: 7bit – до 998 октетов на строку

из диапазона [1..127]\{CR, LF}. Ис-пользуется по умолчанию.

quoted-printable – используется в первую очередь для US-ASCII-

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

Евгений Прокопьев

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

23№12, декабрь 2005

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

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

base64 – используется для двоичных данных. 8bit – до 998 октетов на строку из диапазона [1..255]\{CR,

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

binary – произвольная последовательность октетов (фактически отсутствие какого бы то ни было кодиро-вания). Этот тип кодирования использовать нельзя.

Таким же точно образом кодируется тело письма, при этом кодировка и тип кодирования указывается в заголов-ках Content-Type и Content-Transfer-Encoding. Вот пример ти-пичного почтового сообщения:

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

Как происходит отправка почтовых сообщенийПосле создания сообщения 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, выполняющие фильтрацию по черным спис-кам (а их сейчас большинство), перестают принимать от него почтовые сообщения.

МТА, принимающий на себя ответственность за пере-сылку, сначала проверяет, обслуживает ли он домен адре-

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

Message-ID: <[email protected]>Date: Mon, 07 Nov 2005 12:10:20 +0300From: User 1 <[email protected]>User-Agent: Mozilla Thunderbird 0.6 (X11/20040511)X-Accept-Language: en-us, enMIME-Version: 1.0To: [email protected]: =?KOI8-R?Q?=F4=C5=D3=D4?=Content-Type: text/plain; charset=KOI8-R; format=flowedContent-Transfer-Encoding: 8bit

Привет!

Message-ID: <[email protected]>Date: Mon, 07 Nov 2005 12:38:31 +0300From: User 1 <[email protected]>User-Agent: Mozilla Thunderbird 0.6 (X11/20040511)X-Accept-Language: en-us, enMIME-Version: 1.0To: [email protected]: =?KOI8-R?Q?=F4=C5=D3=D4?=Content-Type: multipart/mixed; boundary="------------070102080309020306010600"

This is a multi-part message in MIME format.--------------070102080309020306010600Content-Type: text/plain; charset=KOI8-R; format=flowedContent-Transfer-Encoding: 8bit

Привет!

--------------070102080309020306010600Content-Type: text/plain; name="file.txt"Content-Transfer-Encoding: 7bitContent-Disposition: inline; filename="file.txt"

Text file content

--------------070102080309020306010600--

24

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

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

Анатомия протокола SMTPДавайте отправим тестовое письмо, используя протокол SMTP. Он является текстовым протоколом, поэтому для от-правки сообщения вместо полнофункционального MUA мы можем использовать telnet (это необходимо для лучшего понимания общих принципов работы протокола SMTP, а так-же может быть очень полезно при отладке MTA):

Немного о том, что происходит в telnet-сессии. Полу-чив приглашение, мы представляемся с помощью команды EHLO, и в ответ получаем список расширений, поддержива-емых тем MTA, к которому мы подключились. Сейчас нас не интересуют расширения, нам просто нужно отправить со-общение. Мы указываем отправителя с помощью команды MAIL FROM: и получателя c помощью команды RCPT TO:. После команды DATA мы вводим содержимое самого пись-ма и завершаем его точкой на новой строке. С помощью ко-манды QUIT мы отключаемся от MTA.

Обратите внимание: содержимое письма, мягко говоря, не соответствует никаким стандартам и совсем не похоже на те примеры «правильных» писем, которые мы приводи-ли. Тем не менее, MTA принял письмо. Если до отправки письма включить прослушивание SMTP-трафика с помо-щью ethereal, а затем обработать экспортированные текс-товые логи средствами grep и sed, мы получим следующие протоколы обмена.

MUA отправителя ↔ MTA отправителя:

MTA отправителя ↔ MTA получателя:

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

Что еще нужно знать об отправкеПротокол SMTP не позволяет однозначно идентифициро-вать отправителя сообщения, однако существует возмож-ность потребовать от отправителя авторизоваться – для это-го служит расширение AUTH, описанное в RFC 2554 (SMTP Service Extension for Authentication). Для реализации этого расширения MTA используют механизм SASL, описанный в RFC 2222 (Simple Authentication and Security Layer), кото-рый позволяет использовать различные способы переда-чи и хранения логина и пароля, в том числе и те, которые используют не сам пароль, а его хэш.

Существует также возможность шифровать SMTP-тра-фик с помощью технологий TLS/SSL (Transport Security Layer / Secure Socket Layer), для чего могут использовать-ся 2 механизма:

# telnet localhost 25

Trying 127.0.0.1...Connected to localhost.Escape character is '^]'.220 mail.domain1.com ESMTP PostfixEHLO host1.domain1.com250-mail.domain1.com250-PIPELINING250-SIZE 10240000250-ETRN250-STARTTLS250-AUTH PLAIN250 8BITMIMEMAIL FROM: [email protected] OkRCPT TO: [email protected] OkDATA354 End data with <CR><LF>.<CR><LF>Hello!.250 Ok: queued as 24D501771CQUIT221 ByeConnection closed by foreign host.

Response: 220 mail.domain1.com ESMTP PostfixCommand: EHLO host1.domain1.comResponse: 250-mail.domain1.comResponse: 250-PIPELININGResponse: 250-SIZE 10240000Response: 250-ETRNResponse: 250-STARTTLSResponse: 250-AUTH PLAINResponse: 250 8BITMIMECommand: MAIL FROM: [email protected]: 250 OkCommand: RCPT TO: [email protected]: 250 OkCommand: DATAResponse: 354 End data with <CR><LF>.<CR><LF>Message: Hello!Response: 250 Ok: queued as 24D501771CCommand: QUITResponse: 221 Bye

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.comResponse: 250-mail.domain2.com Hello mail.domain1.com [xxx.xxx.xxx.xxx],pleased to meet youResponse: 250-ENHANCEDSTATUSCODESResponse: 250-PIPELININGResponse: 250-8BITMIMEResponse: 250-SIZEResponse: 250-DSNResponse: 250-ETRNResponse: 250-AUTH DIGEST-MD5 CRAM-MD5 LOGIN PLAINResponse: 250-STARTTLSResponse: 250-DELIVERBYResponse: 250 HELPCommand: MAIL FROM:<[email protected]> SIZE=361Response: 250 2.1.0 <[email protected]>... Sender okMessage: Received: from host1 (host1.domain1.com [xxx.xxx.xxx.xxx])Message: by mail.domain1.com (Postfix) with ESMTP id 24D501771CMessage: for <[email protected]>; Mon, 7 Nov 2005 16:30:58 +0300 (MSK)Message: Message-Id: <[email protected]>Message: Date: Mon, 7 Nov 2005 16:30:58 +0300 (MSK)Message: From: [email protected]: To: undisclosed-recipients:;Message: Message: Hello!Message: .Message: QUITResponse: 250 2.0.0 jA7DT0o5090086 Message accepted for deliveryResponse: 221 2.0.0 mail.domain2.com closing connection

25№12, декабрь 2005

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

Устаревший протокол SMTPS – это фактически тот же самый SMTP, но шифруется весь трафик, начиная от на-чального приветствия MTA, при этом используется порт 465.

Расширение STARTTLS, описанное в RFC 2487 (SMTP Service Extension for Secure SMTP over TLS) – если кли-ент MTA (MUA, MSA или другой MTA) поддерживает его, то отправка сообщения может выглядеть, напри-мер, так (при этом используется порт 25 – тот же самый, что и для обмена незашифрованными сообщениями):

Расширение 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-скрипт, выполняющий локальную от-правку, выглядит так:

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

токолы, а как уж они устроены внутри – это их личное дело. Соответственно, дело администратора – выбрать тот 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).

Когда-то в процедуре доставки ничего сложного не было.

Response: 220 mail.domain1.com ESMTP PostfixCommand: EHLO host1.domain1.comResponse: 250-mail.domain1.comResponse: 250-PIPELININGResponse: 250-SIZE 10240000Response: 250-ETRNResponse: 250-STARTTLSResponse: 250-AUTH PLAINResponse: 250 8BITMIMEMessage: STARTTLSResponse: 220 Ready to start TLSMessage: \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\023\376\377\000Message: \000\025\000\022\376\376\000\t\000d\000b\000\003\000\006\001\000

#!/bin/sh

/usr/sbin/sendmail -t << EOFFrom: [email protected]: [email protected]: Test MessageHello!EOF

26

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

Использовалась исключительно 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 ничего не знают.

Форматы серверных почтовых хранилищНа сегодняшний день существует два стандартных форма-та серверных хранилищ почты (mbox и Maildir – их стандарт-ность проявляется в том, что доставлять в них почту и извле-кать ее оттуда могут различные MDA) и несколько нестан-дартных (например, файловое хранилище Cyrus, похожее по идеологии на Maildir, но несовместимое с ним, и храни-лище DBMail, использующее БД MySQL или PosgreSQL, – если использовать эти хранилища, то вместе с их преиму-ществами мы одновременно резко ограничим себя в выбо-ре MDA для доставки и извлечения почты). Впрочем, в лю-бом случае мы говорим об открытых хранилищах, формат которых документирован (в худшем случае в исходных ко-дах MDA), поэтому нет никаких препятствий к тому, чтобы написать конвертор из одного хранилища в другое (и та-кие конверторы есть).

Нестандартные хранилища (Cyrus и DBMail) и MDA, ра-ботающие с этими хранилищами, лучше будет рассмотреть в отдельных статьях (статья о DBMail планируется опубли-ковать в следующем номере журнала, статья о Cyrus IMAP уже публиковалась), а сейчас мы сосредоточим свое вни-мание на стандатных хранилищах: mbox и Maildir.

Mbox – это целое семейство не совсем совместимых друг с другом форматов, различные модификации кото-рых используются как в хранилищах почты на серверах, так и локально в MUA. Все эти форматы объединяет то, что все сообщения хранятся в одном файле, начинаются с поля From и отделены друг от друга пустой строкой. В про-цессе доставки новые сообщения дописываются в конец mbox-файла. Если вернуться к нашему примеру письма от [email protected] к [email protected], то после его сохранения в конце mbox-файла (скорее всего, это файл будет называться /var/mail/user2 или /var/spool/mail/user2) добавится следующее:

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

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

Maildir++ – это дальнейшее усовершенствование Maildir с поддержкой вложенных каталогов IMAP (они должны на-читаться с «.») и квот.

Кто занимается доставкой сообщений в серверные хранилищаВсе MTA содержат в своем составе локальные MDA для до-ставки в mbox, а иногда и в Maildir, но часто для доставки выгоднее бывает использовать внешние MDA общего на-значения, позволяющие выполнить дополнительные опера-ции с почтовыми сообщениями: переложить в другой поч-товый ящик, переслать на другой почтовый адрес, пере-дать другой программе по pipe-интерфейсу для дальней-шей обработки и т.д.

Самыми распространенными внешними MDA общего назначения являются: Procmail – в основном используется для доставки со-

общений в mbox (хотя существует патч для поддержки Maildir).

Maildrop – является частью проекта Courier, может до-ставлять почту в mbox, но чаще используется для до-ставки почты в Maildir. Более эффективно расходует сис-темные ресурсы, чем Procmail, поддерживает виртуаль-ных пользователей, информация о которых может хра-ниться в Berkley DB, LDAP, MySQL и PostgreSQL.

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

From [email protected] Sun Oct 23 16:26:52 2005Return-Path: <[email protected]>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 <[email protected]>; Sun, 23 Oct 2005 16:26:52 +0400 (MSD) (envelope-from [email protected])Received: from host1.domain1.com (host1.domain.com [xxx.xxx.xxx.xxx]) by mail.domain1.com (Postfix) with ESMTP id CEA8840F0 for <[email protected]>; Sun, 23 Oct 2005 16:33:25 +0400 (MSD)From: [email protected]: [email protected]

Subject: Test MessageMessage-Id: <[email protected]>Date: Sun, 23 Oct 2005 16:33:25 +0400 (MSD)

Hello!

27№12, декабрь 2005

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

работки почты, особенно при больших объемах, поэтому 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 –

его же для аутентификации используют многие 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:

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

# 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 422LIST+OK POP3 clients that break here, they violate STD53.1 422.RETR 1+OK 422 octets follow.Return-Path: <[email protected]>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 <[email protected]>; Sun, 23 Oct 2005 16:26:52 +0400 (MSD) (envelope-from [email protected])Received: from host1.domain1.com (host1.domain.com [xxx.xxx.xxx.xxx]) by mail.domain1.com (Postfix) with ESMTP id CEA8840F0 for <[email protected]>; Sun, 23 Oct 2005 16:33:25 +0400 (MSD)From: [email protected]: [email protected]: Test MessageMessage-Id: <[email protected]>Date: Sun, 23 Oct 2005 16:33:25 +0400 (MSD)

Hello!.DELE 1+OK Deleted.QUIT+OK Bye-bye.

28

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

и их общий размер – для этого мы используем STAT. С по-мощью LIST мы получаем список сообщений и их разме-ры. Затем мы запрашиваем текст первого (и единственно-го) сообщения с помощью RETR, удаляем его из сервер-ного хранилища с помощью DELE и отключаемся от сер-вера – для этого служит команда QUIT.

Теперь посмотрим, как происходит то же самое, но про-токолу IMAP, описанному в RFC 3501 (INTERNET MESSAGE ACCESS PROTOCOL – VERSION 4rev1). Он подразумевает, что все сообщения даже после прочтения хранятся на сер-вере с пометкой о том, что они прочитаны, соответственно пользователи могут работать с одним и тем же почтовым ящиком с разных рабочих станций с помощью различных MUA одновременно.

После аутентификации средствами команды LOGIN мы переходим в каталог IMAP INBOX с помощью SELECT “INBOX”, при этом мы получаем количество существую-щих и еще не прочитанных сообщений. С помощью ко-манды FETCH 1:* (FLAGS) мы читаем список всех сообще-ний с флагами, а с помощью FETCH 1 (UID RFC822.SIZE FLAGS BODY.PEEK[]) – первое (и единственное) сообще-ние. Затем мы помечаем это сообщение как прочитанное

командой 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: вместо одной огромной и монс-трообразной программы, пытающейся уметь все, для ре-шения задачи используется набор строительных блоков, из которых и собирается почтовый сервер – быстро, ка-чественно и надежно.

Источники:1. http://en.wikipedia.org.2. http://www.faqs.org/rfcs.

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"] ACL2 OK [READ-WRITE] Ok3 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: <[email protected]>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 <[email protected]>; Sun, 23 Oct 2005 16:26:52 +0400 (MSD) (envelope-from [email protected])Received: from host1.domain1.com (host1.domain.com [xxx.xxx.xxx.xxx]) by mail.domain1.com (Postfix) with ESMTP id CEA8840F0 for <[email protected]>; Sun, 23 Oct 2005 16:33:25 +0400 (MSD)From: [email protected]: [email protected]: Test MessageMessage-Id: <[email protected]>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 CLOSE6 OK mailbox closed.7 LOGOUT* BYE Courier-IMAP server shutting down7 OK LOGOUT completedConnection closed by foreign host.

# telnet localhost 143

30

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

Если допустить лёгкий налёт ро-мантики, то можно смело ут-верждать – борьба со спамом

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

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

Это системные администраторы компаний, устанавливающие и обу-

чающие специальные антиспам-фильтры для уменьшения потока нежелательной корреспонденции.

Это компании и корпорации, тратя-щие немалые средства на покупку, внедрение и модификацию анти-спам-технологий.

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

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

мере, известный) из наших соотечест-венников – это Михаил Армалинский.

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

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

Алексей Коршунов

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

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

31№12, декабрь 2005

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

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

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

Большой проблемой в тот период времени являлось наличие огромно-го количества открытых для бесконт-рольной пересылки почтовых серверов (так называемых Open Relay), позво-

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

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

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

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

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

32

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

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

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

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

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

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

Последнее, на что хотелось бы об-ратить внимание, – социальный ин-жиниринг. Сюда входят всевозмож-

ные «письма счастья» и прочая кор-респонденция, автор которой сможет убедить получателя переслать дан-ное письмо другим. Их отличительная особенность – небольшой размер пер-воначальной рассылки. Массовость достигается посредством усилий са-мих получателей, которые «покупают-ся» на предложение отправить письмо по всей адресной книге (или, как ва-риант, по всему контакт-листу IM-пей-джера). Ярким примером может слу-жить поиск родителей нашедшего-ся в Таиланде мальчика в январе это-го года. Бороться с этим видом спа-ма техническими средствами практи-чески невозможно. Кто из нас не полу-чал письма с различными вложениями от знакомых? Да и жалуются на спам от знакомых пользователи гораздо ме-нее охотно.

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

Менялось содержимое письма: Включения адреса получателя

в текст сообщения. Случайные последовательнос-

ти. (Помните сообщения в виде «Hhiiii dduuuddee. Do y.ou ne.e.d sommmmeeeething?».)

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

Вариативность частей письма (со-держимое «полезной» части пись-ма и мусора, для одурачивания фильтров, могло меняться много-кратно).

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

Некоторые изменения в текстах

33№12, декабрь 2005

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

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

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

Менялось и оформление спам-письма: Близкие по начертанию, но раз-

ные символы. Например, буква «А» в русской и английской раскладке.

Невидимый текст в HTML. Картинки, зашумление картинок.

Если сначала фильтры научились по подсчитанной сумме выявлять одинаковые сообщения, то внесе-ние невидимых глазу незначитель-ных изменений избавляет от этой «проблемы».

Подделка технической части пись-ма. Думаю, каждый хоть раз в жиз-ни видел отчёт от SpamAssassin в виде «forged outlook header».

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

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

ФишингГоворя о спаме, невозможно прой-ти мимо такого явления, как фишинг. Фишинг – это мошеннические рас-сылки («нигерийские письма», подде-льные извещения о выигрыше и т. д.). Дословно фишинг можно перевести как “ловля на удочку”. Как правило, та-кие письма призывают совершить ка-кое-то действие (например, пройти по ссылке или просто заплатить деньги), но не за нечто реальное, как в случае рекламного спама, а за нечто несу-ществующее.

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

Если верить статистике из разных источников, фишинг пока что не яв-ляется чрезмерно опасным явлением. На данный момент даже «писем счас-тья» пользователям приходит значи-тельно больше, чем фишинговых со-общений. Однако, наиболее вероят-но, что такое положение дел времен-ное. Индустрия фишинга в России ещё не доросла до таких «поставленных на рельсы» механизмов, как реальный спам. Сейчас энтузиасты только обка-тывают новые технологии на рунетов-ских пользователях. Но, по прогнозам mail.ru, уже к 2006-2007 году доля та-кого спама окажется на уровне, соиз-

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

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

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

34

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

си. Последствия представить не со-ставляет труда.

Однако время шло, пользова-тели стали больше внимания уде-лять тому, на чьём сайте они нахо-дятся и вводят персональные дан-ные. Тогда злоумышленники проде-лали путь от бесплатного хостинга (вида paypal.narod.ru) до ухищрений с адресной строкой. Например, url вида http://[email protected]. На руку злодеям играли и уязвимос-ти наиболее популярного браузера (Internet Explorer). Так, например, од-на из его версий позволяла скрыть весь адрес после «собаки». Догадать-ся о подмене в таком случае станови-лось значительно сложнее и зачас-тую слишком поздно. В наше время такая адресация запрещена в IE и вы-зывает специальное предупреждение в Mozilla Firefox.

К сожалению, даже в наше время в России работают старые уловки 90-х годов. Например, зарегестрировав поч-товый адрес [email protected] и ра-зослав пару сотен сообщений с пред-ложением «активации почтового ящи-ка», всё ещё можно получить несколь-ко ответов с персональными данны-ми пользователей. А ведь контроль над почтой даёт весьма обширные возможности по извлечению с его помощью и других учётных записей (например, через различные службы напоминания забытых паролей). Ра-зумеется, это сработает только если украдена учётная информация основ-ного ящика пользователя.

Возможные варианты фишинга ог-раничиваются только фантазией зло-умышленника и невнимательностью пользователей. Простор огромный, а уровень компьютерной грамотности всё ещё оставляет желать лучшего.

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

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

В России в роли «нигирейских чи-новников» выступают члены правле-ния ЮКОСа, Ходорковский и прочие не менее популярные (и богатые) лич-ности. К сожалению, как показывает практика, доверчивые и жадные до ха-лявы находятся.

Последним писком моды у спаме-ров являются мошеннические «пись-ма счастья». Самым ярким примером такого спама была недавняя эпидемия Golden Stream. Наверное, все видели письмо, которое начиналось со слов «Это НЕ спам, а действительно выгод-ное предложение...». В последующем тексте объяснялась простейшая пира-мидальная схема – вам предлагалось заплатить 100 рублей автору письма, а потом переслать это письмо дальше, получив от каждого получателя по 100 рублей. Как итог обещалось полное счастье и всеобщее обогащение. Осо-бенностью рассылки является прямое вымогание денег и эффективность про-бивания фильтров «письмами счастья». К слову сказать, рассылка «писем счас-тья» не избежала и систем мгновенно-го обмена сообщениями типа icq. Час-то можно встретить сообщения вида: «Привет. UIN такой-то рассылает ви-русы! Не добавляй его в контакт-лист и сообщи всем своим знакомым!!!» Как показывает практика, остаётся до-бавить в тело сообщения ссылку с тек-стом вроде: «На всякий случай, лекарс-тво от вируса находится здесь URL.» и, пожалуйста, – готова почва для весь-ма обширного инфицирования. Разуме-ется, не все откликнутся на такие сооб-щения, но учитывая широкие контакт-листы современного пользователя Ин-тернета – и 10% отреагировавших хва-тит для начала эпидемии.

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

систем анализа и фильтрации контен-та сообщений.

Современные системы борьбы со спамом используют комплекс-ные инструменты для отсева спама без ущерба для нормальной почты. Это и занесение в чёрные списки се-тей, в которых, как заведомо извес-тно, не могут находиться легальные почтовые сервера (например, dial-up и dsl-диапазоны IP-адресов провайде-ров), и bayes-технологии, и белые спис-ки, работающие по принципу повтора почтовых адресов. Считается, что ес-ли письмо приходит с адреса, нахо-дящегося в адресной книге получате-ля или адреса, на который получатель сам отправил несколько писем, – оно не может быть спамом. И прочие но-вые технологии, появляющиеся, если и не каждый месяц, то каждые полго-да-год точно. Во всяком случае их пре-подносят, как новые.

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

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

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

35№12, декабрь 2005

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

нёс стабилизацию спама по части объёмов рассылок и доходов, полу-чаемых от спам-рекламы. Однако на-ращивание темпа всё же составляет 5-6% в год.

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

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

На конференции «Проблема спама и её решения» основными тенденция-ми спама за 2005 год были названы: Стабилизация количества и тема-

тик спама. Тематическое и техническое раз-

деление спама на разные геозоны Интернета (рунет и «западный» Ин-тернет).

Криминализация спама. Использование спама как инстру-

мента информационных и полити-ческих войн.

В 2005 году наметилось явное раз-граничение спама для западных полу-чателей и русскоязычных. Спам для русских эволюционировал от прямо-

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

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

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

В 2005 году лабораторией Каспер-ского был зафиксирован новый тип «политического» спама. Речь идёт о спамерских кампаниях, направлен-ных на формирование необходимо-го общественного мнения по вопро-сам внутренней политики государс-тва. Эти спам-атаки отличает хоро-шая спланированность. Примером та-кой информационной кампании мо-жет служить спам со ссылками на не-безызвестный сайт «Кавказ-центр», который российские спец-службы не-

Приглашения на семинары и курсы 14%

Предложения «для взрослых» 12%

Компьютерное мошенничество 11%

Предложение лекарственных препаратов 9%

Дешёвый софт 7%

редко называют рупором мирового терроризма.

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

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

Технология отказа от сообщений с DSL-блоков станет повсеместной. По прогнозам, эпоха такого спама за-кончится в 2006-2007 году.

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

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

При подготовке статьи использо-ваны материалы с конференции «Про-блемы спама и её решения».

Лидеры спамерских рассылок в этомгоду

36

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

Уж сколько раз твердили миру, что русскому человеку нельзя вот так просто сказать «нет»

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

Принять решение бывает очень не-просто, открывая доступ к ICQ, с од-ной стороны, вы принимаете популяр-

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

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

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

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

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

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

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

37№12, декабрь 2005

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

с 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, которые аналогично «мно-жатся и дохнут как мухи». В общем, это скорее философский вопрос борьбы оружия и брони. Для наглядности по-дытожим всё вышенаписанное в ви-де таблицы.

Как видно, принять однозначное решение, где поставить запятую в за-головке, сложно. Я не хочу склонять

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

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

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

Интерактивный фильтрующий ICQ-прокси-серверНе помню, как давно я попал на стра-ничку Александра Шутко с его проек-том IServerd [4] по созданию ICQ-сер-вера на базе Linux/*BSD с хранени-ем всех сообщений в БД PostgreSQL, но именно в тот момент я понял, на-сколько этот проект интересен и куда его можно развить. Как мне кажется, на базе данного проекта сделать пред-лагаемую реализацию будет гораздо проще. Также на сайте [4] имеется до-статочно информации по протоколам ICQ и всем с ними связанным.

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

часть на том же сервере, которая, мас-кируясь под того или иного пользовате-ля, подключалась бы к настоящим сер-верам от его имени. При этом клиент-ская часть могла бы получать сообще-ния и помещать их во внутреннюю БД, делая их доступными для внутренне-го пользования. Также она бы могла отправлять сообщения во внешний мир. Клиентов, в том числе и распро-страняемых под лицензией GNU Public License, множество. Значит, реали-зация этой идеи лишь дело времени и желания.

Теперь, если предположить что идея реализовалась и мы имеем рабо-чий ICQ-прокси-сервер, то почему мы не можем сделать на нём фильтрацию сообщений (см. рис. 1)?

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

Разрешить ICQ Запретить ICQ

«+»: Простота, быстрота и удобство общения с посто-янными партнёрами, меньше проблем и бюрокра-тии.

«+»: Ниже затраты на телефонные переговоры, теле-фонные линии меньше заняты.

«+»: Популярная мера.«+»: Короткое общение снимает стресс.«-»: Угроза безопасности: возможна утечка нежела-

тельной информации.«-»: Угроза безопасности: если программу ICQ-клиен-

та ставит пользователь – возможны вирусы.«-»: Отвлечение от основной работы и «болтовня»

не по делу.

«+»: Сотрудники не будут отвлекаться от работы.«-»: Угроза безопасности: есть вероятность появления

«левых» шлюзов в Интернет, в обход основного канала.

«-»: Повышение уровня занятости телефонных линий и рост расходов на связь.

«-»: Не популярная мера.«-»: Больше времени тратится на общение с труднодо-

ступными и удалёнными партнёрами.«-»: Психологический момент запрета для тех, кто при-

вык пользоваться.«-»: Затраты времени сотрудников на обдумывание

вопроса «Как обмануть систему?».«-»: Есть небольшая вероятность увольнения сотруд-

ников.

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

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

38

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

зрачном режиме без каких-либо про-блем. В то же время, общение с дру-гими (не разрешёнными) пользовате-лями фильтруется. А чтобы сообще-ния не терялись, сервер может высы-лать ответные сообщения о недостав-ке внешним пользователям. Например: «Ваше сообщение «.....», отправлен-ное пользователю Ivanov нашей се-ти, не было доставлено, так как обще-ние по ICQ в рабочее время на фирме XXXXX запрещено решением руко-водства №148 от 29.09.2005».

Внутренним пользователям может выдаваться сообщение другого содер-жания, например «Общение с поль-зователем ICQ 32323232 вам запре-щено, если общение вам необходи-мо по работе – обратитесь к началь-нику IT-отдела для получения разре-шения». Как вариант, можно сделать временные рамки, когда будет рабо-тать фильтрация, скажем с 9 до 18. Можно даже учесть обеденный пере-рыв. А фильтруемые сообщения ра-зумнее не выбрасывать, а сохранять в буфер, чтобы их можно было полу-чить в разрешённый для работы ин-тервал времени.

Как появится возможность, плани-рую создать проект и заняться реали-зацией задуманного. Даже если меня кто-то опередит и создаст свой проект раньше, то пишите, я с удовольствием стану его участником. Форум журнала (http://samag.ru/cgi-bin/yabb/YaBB.pl) – отличное место для старта описан-ной идеи.

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

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

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

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

Например, нет гарантии, что ка-кой-нибудь продвинутый пользова-тель не подключит к своему компью-теру телефон Sky-Link или GPRS с це-лью обойти ваш запрет по ICQ и тог-да ваши чрезмерные усилия приведут к появлению лишнего шлюза из гло-бальной сети в локальную, что вряд ли одобрит служба безопасности фирмы. Никто в жизни не будет закрывать вы-пускной клапан у скороварки, так как

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

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

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

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

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

39№12, декабрь 2005

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

зами, вы быстро найдёте читаемый текст сообщений среди прочего нечитаемого мусора. Фактически все программы, делающие перехват 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 SniffAIM 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 NetPacket::Ethernet NetPacket::IP NetPacket::TCP NetPacket::UDP DBI

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

взять всё остальное. Библиотеку 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/Proc-

Daemon-0.03.tar.gz http://search.cpan.org/CPAN/authors/id/M/MS/MSCHILLI/

Proc-Simple-1.21.tar.gz ht tp : / / sea rch .cpan.o rg / CPAN /au tho rs / 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:

Заходим внутрь:

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

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

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

Далее ставим модули. Каждый модуль аналогичным об-разом распаковываем:

Заходим внутрь:

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

DBD::mysql Unicode::String Proc::Daemon Proc::Simple Unix::Syslog

# cat libpcap.tar.Z|tar -xvz -C /progi

# cd /progi/libpcap-0.4

# ./configure

# make

# make install

# cat файл_архива_модуля.tar.gz|tar -xvz -C /progi

# cd /progi/директория_модуля

# perl Makefile.PL

40

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

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

Как вариант можно запустить тесты:

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

После того как все модули установлены, можно попы-таться запустить файл aimSniff.pl, если все модули стоят, то он успешно запустится и начнёт перехватывать пакеты, если же чего-то не стоит, то вы увидите сообщение об ошиб-ке, что-то вроде:

или

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

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

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

С учётом того, что Shawn Grimes согласился разместить у себя на страничке http://www.aimsniff.com/downloads.html модифицированный aimSniff.pl, не имеет смысл рассказы-вать о том, что и как было исправлено, поэтому просто ска-чиваем «Cyrillic Patched AIM Sniff». Распаковываем архив и используем вместо aimSniff.pl файл aimSniff.Cyr.pl. Если же кому-то интересно, какие были внесены изменения, и есть желание присоединиться к проекту, то добро пожаловать на форум сайта.

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

Тестовый запускКак сказано в README, пробуем запустить программу в тестовом режиме:

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

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

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

При желании сообщения можно перенаправить в текс-товый файл, например:

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

Если тестовый запуск прошёл успешно, то, возможно, имеет смысл скопировать файл aimSniff.Cyr.pl в директорию /usr/local/bin и запускать его в дальнейшем оттуда.

Запись сообщений в базу данныхAIM Sniff умеет работать с СУБД MySQL [15-17]. Предпола-гаю, эта СУБД у вас уже установлена.

Для организации сохранения в базу данных необходи-мо сделать три вещи:1. Создать базу данных aimsniff с необходимой структурой

таблиц.

# make test

# make install

# ./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.

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.pl

#############################AIM Sniff v. 0.9dDeveloped by: Shawn Grimes#############################

Beginning Sniff...FILTER: port 5190

# ./aimSniff.Cyr.pl -nodb

# tcpdump -s 10000 -i eth0 src or dst port 5190 ↵ -w /path/traffic_dump.bin

# ./aimSniff.Cyr.pl --nodb -r=traffic_dump.bin

# ./aimSniff.Cyr.pl --nodb>>/var/www/html/icq_messages_log.txt

# make

41№12, декабрь 2005

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

2. Создать учётную запись пользователя для работы с БД aimsniff, установить ей пароль и дать соответствующие права.

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

Первая делается довольно просто, с консоли компьютера, где установлена СУБД MySQL, запускаем две команды:

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

Если у вас БД находится под паролем, то вторая ко-манда будет:

Пароль можно ввести как с консоли, так и в команд-ной строчке. Подключившись к БД, мы можем увидеть, что структура таблиц не очень сложная:

Второй момент решается средствами СУБД при помо-щи следующей команды:

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

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

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

Если у вас нет под рукой dos2unix, возможно, вас вы-ручит команда tr.

В остальном шаблон очень простой и маленький (менее одного экрана), поэтому заполнить все параметры, в том числе и относящиеся к БД: host, user, password, database, nodb, должно быть не сложно даже при отсутствии ком-ментариев.

После проделанных шагов AIM Sniff можно запускать командой:

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

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

Установим атрибут выполнимости

Далее, в зависимости от того, где у вас находится про-грамма и её конфигурационный файл, правим в нём стро-ку запуска:

После чего запуск можно осуществлять командами:

или

# mysqladmin create aimsniff# mysql aimsniff < table.struct

logs versions

# mysql -D aimsniff -u root -p ↵ [пароль_root_в_СУБД_MySQL]< table.struct

# mysql -D aimsniff -u root -pmysql> describe имя_таблицы;

mysql> GRANT ALL ON aimsniff.* TO aimsniff@hotsname ↵ IDENTIFIED BY 'пароль_к_БД_aimsniff';

mysql> FLUSH PRIVILEGES;

# dos2unix -n aimsniff.config aimsniff.conf

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

# cp /progi/aimsniff-0.9d/rc.aimsniff /etc/rc.d/init.d/aimsniff

# chmod +x /etc/rc.d/init.d/aimsniff

/usr/local/bin/aimSniff.Cyr.pl -C=/usr/local/etc/aimsniff.conf

# /etc/rc.d/init.d/aimsniff start

42

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

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

Если вы использовали install.pl для установки, последую-щие процедуры вам всё равно придётся проделать руками.

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

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

Просмотр перехваченных ICQ-сообщений из БДПосле того как сообщения попали в БД, мы встречаемся с ещё одной проблемой – как их просматривать. Обычно эта проблема не стоит остро, потому как есть универсальный phpMyAdmin[19]. В нашем случае данные довольно просты, поэтому напишем небольшой скрипт на php. Он будет под-ключаться к БД, делать запрос на получение данных и да-лее будет печатать на экран их в виде таблицы. Файл на-зовём script1.php

Результат работы скрипта см. на рис. 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-адреса (если они статические) локальных пользователей с их именами и внутренними телефонами.

А в другой – IСQ-номера с никами или комментариями.

(Типы полей не оптимальны, они выбраны из соображения совместимости с имеющейся БД aimsniff.)

Теперь вместо непонятных IP-адресов можно выводить вполне понятные имена и номера телефонов. Скажем, что-бы можно было позвонить нерадивому пользователю и на-помнить о том, что на работе работают, а не болтают по лич-ным вопросам.

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

# 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

<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>&lt;--</td>"; } elseif ($row[5]=="00040006") { echo "<td>--&gt;</td>"; } else { echo "<td>".$row[5]."</td>"; }

Рисунок 3. Результаты работы программы script1.php

CREATE TABLE 'localusers' ('ip' VARCHAR(20) NOT NULL ,'name' VARCHAR(30) NOT NULL ,'phone' VARCHAR(10) NOT NULL ,PRIMARY KEY ('ip'));

CREATE TABLE 'nicnames' ('icq' VARCHAR(255) NOT NULL ,'nickname' VARCHAR(50) NOT NULL ,PRIMARY KEY ('icq'));

# service aimsniff start

echo "<td>".$row[6]."</td>"; echo "</tr>"; }echo "</table>";?></body></html>

43№12, декабрь 2005

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

к БД, содержащий в себе, например, левое внешнее объ-единение:

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

Для того чтобы его увидеть на веб-странице, надо прос-то дописать ещё одну строчку:

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

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

Аналогичным образом можно заменить номера 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 при отсутствии сообщений в БД.

WAS использует упрощенные теги «<? ?>» (вместо бо-лее правильных «<?php ?>»), поэтому необходимо их включить. Для этого надо в /etc/php.ini прописать «short_open_tag = On».

Конфигурационный файл .config.php. Если вы не може-те сменить конфигурацию во вкладке «admin», а туда вы, наверно, обратитесь в первую очередь, чтобы про-писать вашу БД, то, скорее всего, у вас проблемы с пра-вами доступа к файлу конфигурации. Решить эту про-блему можно, задав для файла группу apache (так как от этого имени скорее всего работает ваш веб-сервер, а значит и все выполняемые им скрипты, т.е. в том числе и WAS) и открыть для на неё разрешение на запись:

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

Вопрос решается заменой кодировки на koi8-r (или

windows-1251 в зависимости от вашего случая) во всех неправильно отображающих php-файлах. Также в aimSniff.Cyr.pl есть пара строчек, отвечающих за пе-рекодирование русских букв, которые без проблем на-ходятся при просмотре «вручную», либо через поиск по ключевым словам «translation» или «cp1251». Навер-ное, было бы разумнее везде использовать utf-8, но про-цесс перехода на эту кодировку, особенно на старых серверах, идёт со скрипом и без энтузиазма.

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

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

# chgrp apache .config.php# chgrp g+w .config.php

<meta http-equiv="Content-Type" ↵ content="text/html; charset=iso-8859-1">

WHERE fromHandle <>'1111112' AND handle<>'1111112'

$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>";

if ($row[7]) { echo "<td>".$row[7]."</td>"; } else { echo "<td>".$row[2]."</td>";

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

44

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

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

но чаще доступ нужен и снаружи тоже. В этом слу-чае ограничивать доступ придётся правами самого веб-сервера. Для этого правим конфигурационный файл /etc/httpd/conf/httpd.conf, дописав туда строчки:

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

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

При желании можно совместить проверку IP-адреса, от-куда идёт обращение с авторизацией. После перезапуска веб-сервера изменения должны вступить в силу. Сделать это можно командой:

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

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

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

Литература, ссылки:1. PHProxy – http://sourceforge.net/projects/poxy.2. Simple Browser Proxy – http://sourceforge.net/projects/sbp.3. CGIProxy – http://www.jmarshall.com/tools/cgiproxy.4. IServerd project (Александр В. Шутко) – http://iserverd.khstu.ru.5. IRC, EMail, SMB, MSN, AIM, ICQ sniffer – http://www.ufasoft.com/

icqsnif.6. EtherBoss Monitor (for ICQ Monitoring) – http://www.etherboss.

com/icq.7. Shadow IM Sniffer – ICQ Sniffer,MSN Sniffer, AOL Sniffer, Yahoo

Sniffer – http://www.safety-lab.com/en/products/imsniffer.htm.8. Spy ICQ: SpyArsenal ICQ Logger – http://www.spyarsenal.com/

spy-icq-sniffer.9. Network Sniffer: Give-Me-Too – invisible net sniffer – http://www.

spyarsenal.com/network-sniffer.10. Проект Aim Sniff – http://www.aimsniff.com, http://sourceforge.net/

projects/aimsniff.11. ICQ2000 сделай сам – http://icq2000cc.hobi.ru/index.html.12. ICQ library icqlib – http://kicq.sourceforge.net/icqlib.shtml.13. Miranda Instant Messenger – http://www.miranda-im.org.14. Всё для &RQ – http://andrq.org.15. Леон Аткинсон. MySQL. Библиотека профессионала.: Пер.

с англ. – М.: Издательский дом «Вильямс», 2002 г. (ISBN-5-8459-0291-6).

16. Поль Дюбуа. MySQL, 2-е изд.: Пер. с англ. – М.: Издательский дом «Вильямс», 2004 г. (ISBN-5-8459-0515-X)б

17. Компания MySQL AB. MySQL. Справочник по языку. : Пер. с англ. – М.: Издательский дом «Вильямс», 2005 г. (ISBN 5-8459-0804-3).

18. Гмурман В.Е. Теория вероятностей и математическая статис-тика. Учеб. пособие для вузов. Изд 7-е, стер. – М.:Высш. шк., 2000 г. (ISBN 5-06-003464-X).

19. phpMyAdmin MySQL Database Administration Tool – http://www.phpmyadmin.net.

<Directory /var/www/html/was> Order deny,allow Deny from all Allow from 192.168.0.0/255.255.255.0</Directory>

# htpasswd -c /путь/файл_с_учётными_записями user1

<Directory /var/www/html/was> AuthType Basic AuthName "Web AIM Shiff" AuthUserFile /путь/файл_с_учётными_записями Require user user1 AllowOverride None</Directory>

# /etc/rc.d/init.d/httpd restart

# iptables -I INPUT -i $exterbal_interface -p tcp -d $perver_ip --dport 80 -j DROP# iptables -I INPUT -i $exterbal_interface -p tcp -d $perver_ip --dport 443 -j DROP

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

45№12, декабрь 2005

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

Сегодня в качестве платформы для почтового сервера доволь-но часто используются различ-

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

Проект, начатый в 2000 году после 5 лет работы из простого антивирус-ного сканера, превратился в мощную систему, защищающую тысячи ком-пьютеров от вирусов и спама. Напи-сан MailScanner на Perl, распростра-няется по лицензии GNU GPL. Модель разработки все же немного отличает-ся от других подобных проектов. Ав-тор сохраняет полный контроль над ис-ходным кодом, другие пользователи не имеют доступа к архиву CVS. Объ-ясняется это большим значением, ко-торое придается электронной почте, а использование непротестированно-го кода может навредить как пользо-вателям, так и репутации проекта. Ве-

роятно, благодаря надежности и своим возможностям MailScanner заслужил похвалу и стал стандартным решени-ем, предназначенным для организа-ции защиты почты на многих серверах в Европе и Великобритании. Его со-здатель Julian Field за свою разработ-ку стал в 2004 году обладателем Open Source Award от UKUUG (UK UNIX and Open Systems User Group). Эта награ-да ежегодно вручается наиболее вы-дающимся деятелям мира бесплатно-го и открытого программного обеспе-чения. А различные версии продукта с сайта проекта были скачаны более полумиллиона раз.

Возможности MailScannerВ отличие от многих коммерческих решений, поддерживающих обыч-но 2-3 антивируса, MailScanner спо-собен работать более чем с 20 анти-вирусами (Sophos, McAfee, Command, Kaspersky, Inoculate, Inoculan, Nod32, F-Secure, F-Prot, Panda, RAV, AntiVir, Clam, BitDefender, Vscan и др.). В ком-плекте имеются готовые конфигура-

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

Своего антивируса MailScanner не имеет, как не является обязатель-ным к употреблению любая програм-ма для защиты от спама. Хотя для эф-фективной идентификации спама мо-жет использоваться SpamAssassin (http://www.spamassassin.org), имею-щий развитую систему контекстно-го лингвистического анализа, систе-му обучения и самообучения. При же-лании его можно заменить или допол-нить любым другим внешним скане-

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

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

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

46

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

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

Кроме проверки на наличие вирусов, сканер анализи-рует наличие во вложении файлов с потенциально опас-ным именем или нежелательные типы файлов (самораспа-ковывающиеся архивы, исполняемые файлы, видео и про-чее). Определяются в том числе и файлы с двойным рас-ширением вроде «.txt.vbs», «.doc.exe» (файлы с повторяю-щимся расширением (*.zip.zip) по умолчанию разрешены), которые часто используются для рассылки вирусов. Про-веряются распространенные типы архивов (zip, rar, gzip и др.) и MIME, в том числе и «application/ms-tnef». Если ар-хив защищен паролем, то для их содержимого выполняет-ся проверка имен файлов. Настройки позволяют защитить-ся от DOS-атак, направленных на почтовые сервисы. Еще одной особенностью MailScanner является анализ содержи-мого письма. Анализируя почту, MailScanner способен об-наруживать атаки, направленные против некоторых кли-ентов электронной почты (Outlook, Outlook Express, Internet Explorer, Eudora), а также Cyrus IMAP, но можно добавить и другие приложения, отредактировав конфигурационный файл. Теги HTML <IFrame>, <Form>, <Script> и другие, ко-торые могут быть использованы для загрузки файлов без ведома пользователей или изображений, часто использу-емые спамерами, могут быть удалены. В MailScanner реа-лизован контроль за подменой адреса, прием, часто при-меняемый фишерами. Так, если пользователь получит со-общение, содержащее строку:

в письмо будет вставлено предупреждение:

В некоторых случаях такая проверка вызывает ложную тревогу, например, ссылки, используемые Microsoft. В этом случае сайты, которые не должны проверяться на фишинг, заносятся в специальный файл phishing.safe.sites.conf.

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

Предотвратить утечку конфиденциальной информа-ции позволяет еще одна технология, называемая Message Content Protection (MCP). Представляющая собой запуск еще одной копии SpamAssassin, но без выполнения слож-ных антиспам проверок. Администратор сам заносит в от-дельный файл ключевые слова и фразы, дает им оцен-ку и указывает на действия, которые должны произойти

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

Кроме вышеописанных методов, используются прави-ла, занесенные в файл с расширением .rules. Каждый файл сопоставлен с некой категорией, например BlackList, и при совпадении параметра внутри к письму применяется ука-занное действие. Правило внутри такого файла может со-стоять из 3 или 6 полей вида:

или

В качестве направления движения сообщения выби-раются значения из: From, To, FromOrTo, FromAndTo, Virus. Образец описывает адрес отправителя сообщения, здесь можно указать конкретный почтовый адрес, имя отправи-теля/получателя, домен, IP-адрес. Поддерживаются регу-лярные выражения. Результат показывает действие, при-меняемое к сообщению. Самым простым результатом яв-ляется yes (правило совпадает) и no (не совпадает). А вот что будет с письмом, уже зависит от файла, в котором за-писаны эти правила. Так если файл описывает черный спи-сок, то yes покажет на спам и к нему будут применены соот-ветствующие действия, а если в файле описан белый спи-сок, то при yes письмо беспрепятственно пройдет проверку. Кроме этого результат можно установить таким: deliver – доставить сообщение. delete – удалить сообщение. store – сохранить в карантине. bounce – отослать отказ отправителю. forward [email protected] – переслать копию по указан-

ному почтовому адресу. striphtml – конвертировать HTML в текст. attachment – преобразовать сообщение в файл, присо-

единенный к письму. notify – отсылка получателю уведомления о блокиров-

ке спама. header “name: value” – добавление в заголовок name зна-

чения value.

Возможна и комбинация некоторых параметров. При-мер правил:

Но проще всего определить, совпадает ли значение (т.е. yes/no), а действие указать глобально в конфигура-ционном файле.

Как работает MailScannerВ общем случае принцип работы сканера прост. Поступив-шее по SMTP письмо МТА помещает в специальную папку, на которую указывает переменная Incoming Queue Dir. Пос-

<a href="http://www.nasty.com /"> www.bank.com</a>

MailScanner has detected a possible fraud attemptby "www.nasty.com" claiming to be www.bank.com

Направление: образец результат

Направление: образец and направление2: ↵ образец2 результат

To: bad.customer.com noFrom: /^192\.168\.1[4567]\./ store forward ↵ [email protected] FromAndTo: *@*.domain.com yesFromOrTo: default (или *@* т.е. любой) yes

47№12, декабрь 2005

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

ле проведения всех проверок оно помещается уже в дру-гую папку (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. Базовый комплект не со-

держит ClamAV и SpamAssassin, если планируется их ис-пользование, то лучше воспользоваться готовым комплек-том install-Clam-SA.tar.gz, который можно взять со страницы Downloads раздел Other stuff. Установка из rpm- и tar-архи-вов, в том числе и пакета install-Clam-SA, довольно проста. Разработчики избавили администраторов от поиска паке-тов для удовлетворения зависимостей, а всего требуется около 30 Perl-модулей и программ, включив все необходи-мое в единый архив. После распаковки требуется ввести лишь ./install.sh. Скрипт произведет анализ системы и ус-тановит все компоненты в каталог /opt/MailScanner. Конеч-но же, этот путь можно изменить, покопавшись в скриптах, или просто перенести каталог в другое место, изменив за-тем путь в стартовых скриптах. В случае с архивом, содер-жащим MailScanner, при установке не должно быть сооб-щений об ошибке, а скрипт внутри install-Clam сам предуп-реждает, когда ошибки можно игнорировать.

Конфигурационный файл MailScanner.confMailScanner является гибким инструментом, обладающим большим количеством возможностей. Все доступные па-раметры настраиваются в одном конфигурационном фай-ле /opt/MailScanner/etc/MailScanner.conf.

Строение файла стандартно для UNIX-программ. На-стройки указываются в виде строк option = value, знак ре-шетки (#) указывает на комментарий, пустые строки и про-белы игнорируются. В значениях можно использовать лю-бые переменные оболочки вроде $HOSTNAME. Для удобс-тва восприятия файл разбит на несколько секций, все па-раметры можно не трогать. В принципе и в конфигурации по умолчанию MailScanner способен защитить систему. Кро-ме того, можно добавить и свои параметры, подправив файл CustomConfig.pm, лежащий в подкаталоге lib.

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 foundYou can start worrying about errors again now

# 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

48

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

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

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

# Папка, в которую будут помещаться входящие сообщения.# Можно задать имя каталога – /var/spool/mqueue.in# Шаблон – /var/spool/mqueue.in/*# Имя файла, в котором описаны каталоги# /opt/MailScanner/etc/mqueue.in.list.confIncoming Queue Dir = /var/spool/postfix/hold

# Каталог, куда будут складываться письма, прошедшие# проверку (исходящий)Outgoing Queue Dir = /var/spool/postfix/incoming

# Каталог, в котором почта перед проверкой будет# распаковываться. При достаточном количестве ОЗУ можно# использовать tmpfs или ramdiskIncoming 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 или zmailerMTA = 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.# Хотя возможен вариант и с 0644Incoming Work Permissions = 0640

## Quarantine and Archive Settings## То же что и выше, только для файлов, которые попадут# в карантин. Если захотите дать к ним доступ при помощи# внешней программы, например, веб-интерфейс,# то переопределяем ихQuarantine User =Quarantine Group =Quarantine Permissions = 0600

# Ниже идут параметры проверки входящих сообщений.# Ограничения по размеру (в байтах) и количествуMax Unscanned Bytes Per Scan = 100000000Max Unsafe Bytes Per Scan = 50000000Max Unscanned Messages Per Scan = 30Max Unsafe Messages Per Scan = 30

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

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

# Максимально разрешенное количество вложений в одном# письме. Некоторые почтовые системы сохраняют информацию# при переписке в виде присоединения к письму, их распаковка# занимает много времени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 = internalTNEF Expander = /opt/MailScanner/bin/tnef --

maxsize=100000000

# Максимальное время для работы с одним сообщением TNEF# (в секундах)TNEF Timeout = 120

# Месторасположение команды «file», позволяющей определить# тип файла. Если не планируется проверка типа файлов,# можно отключить File Command = /usr/bin/fileFile Timeout = 20

Unrar Command = /usr/bin/unrarUnrar 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

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

49№12, декабрь 2005

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

# для этого его необходимо описать в файле# %etc-dir%/virus.scanners.conf, в который необходимо# занести 3 позиции: имя сканера, сценарий для запуска# и месторасположение (в некоторых системах путь придется# подправить). Например, для СlamAV строка в этом файле# выглядит так:# clamav /opt/MailScanner/lib/clamav-wrapper /usr/local# Установка в none отключает проверку.# Если планируется использование сразу нескольких# антивирусов, они перечисляются через пробел# Virus Scanners = drweb kaspersky mcafee#Virus Scanners = clamavVirus 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 Maximum Recursion Level = 5ClamAVmodule Maximum Files = 1000ClamAVmodule Maximum File Size = 10000000 # (10 Mб)ClamAVmodule Maximum 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

# Разрешение соответствующих тегов в сообщении# yes => Разрешает# no => запрещает# disarm => Разрешает, но нейтрализует тегAllow IFrame Tags = disarmAllow Form Tags = disarmAllow Script Tags = disarmAllow Object Codebase Tags = disarm

# То же для <Img>, но только два действия yes и disarmAllow WebBugs = disarm

# Эта опция перекликается с «Allow ... Tags», т.е. при# разрешении тега сообщение может быть преобразовано# из HTML в текстConvert HTML To Text = no

# Проверка вложений.# Указываем файл с правилами, содержащий описание типов# и имен файлов и производимым действием при обнаружении# определенного типа и имени # allow/deny/deny+deleteFilename Rules = %etc-dir%/filename.rules.confFiletype Rules = %etc-dir%/filetype.rules.conf

## Reports and Responses# Действия с потенциально опасными объектами, во многих# случаях возможно использование файла правил.# Использование карантина для зараженных сообщенийQuarantine Infections = yesQuarantine Silent Viruses = no

# Копии сообщений с модифицированным HTML# (вариант файл правил)Quarantine Modified Body = no

# Сохранение всего сообщения или только зараженной частиQuarantine Whole Message = no

# Сохранение в оригинальном или удобочитаемом видеQuarantine Whole Messages As Queue Files = no

# Сохранение зараженного спама или MCPKeep Spam And MCP Archive Clean = no

# Файлы, содержащие сообщения, выдаваемые пользователюLanguage Strings = %report-dir%/languages.confDeleted Bad Content Message Report = ↵ %report-dir%/deleted.content.message.txtDeleted Bad Filename Message Report = ↵ %report-dir%/deleted.filename.message.txtDeleted Virus Message Report = ↵ %report-dir%/deleted.virus.message.txtStored Bad Content Message Report = ↵ %report-dir%/stored.content.message.txtStored Bad Filename Message Report = ↵ %report-dir%/stored.filename.message.txtStored Virus Message Report = ↵ %report-dir%/stored.virus.message.txtDisinfected Report = %report-dir%/disinfected.report.txtInline HTML Signature = %report-dir%/inline.sig.htmlInline Text Signature = %report-dir%/inline.sig.txtInline HTML Warning = %report-dir%/inline.warning.htmlInline Text Warning = %report-dir%/inline.warning.txtSender Content Report = ↵ %report-dir%/sender.content.report.txtSender Error Report = ↵ %report-dir%/sender.error.report.txtSender Bad Filename Report = ↵ %report-dir%/sender.filename.report.txtSender 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:

50

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

Add Envelope From Header = yesAdd Envelope To Header = noEnvelope 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 cleanInfected Header Value = Found to be infectedDisinfected Header Value = DisinfectedInformation Header Value = Please contact the ISP for ↵ more information

# Полный отчет о спамеDetailed Spam Report = yes

# Оценка SpamAssassin или просто названиеInclude Scores In SpamAssassin Report = yes

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

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

# Имя узла, если требуется скрыть реальноеHostname = the %org-name% ($HOSTNAME) MailScanner

# Подпись сообщения уже обработанного другой копией# MailScanner Sign Messages Already Processed = no

# Добавление «Inline HTML Signature» или «Inline Text# Signature» в очищенное сообщениеSign Clean Messages = yesMark 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 = yesNever Notify Senders Of Precedence = list bulk

# Опции изменения поля Subject могут использоваться# для удобства фильтрации в почтовом клиенте.# Варианты no, start (добавить в начало) и end.# Все варианты поддерживают правилаScanned Modify Subject = no # end# Здесь текст, добавляемый к SubjectScanned Subject Text = {Scanned}

# Сообщение о вирусе, добавляемое в темуVirus Modify Subject = yesVirus Subject Text = {Virus?}

# Сообщение о проверке имени файлаFilename Modify Subject = yesFilename Subject Text = {Filename?}

# Проверке содержимогоContent Modify Subject = yesContent Subject Text = {Dangerous Content?}

# О нейтрализации HTMLDisarmed Modify Subject = yesDisarmed Subject Text = {Disarmed}

# О подделке адресаPhishing Modify Subject = noPhishing Subject Text = {Fraud?}

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

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

# Изменения в теле сообщения. Многие опции допускают# использование файла правил. Предупреждение об удалении# записывается в само сообщение или присоединяется к файлуWarning Is Attachment = no

# Имя файла такого вложения. Attachment Warning Filename = %org-name%-Attachment-Warning.txtAttachment Encoding Charset = СР-1251

# Архивирование и мониторинг почты.# Указывается почтовый адрес, каталог или имя файла.# Возможно добавление переменных в имени вроде _DATE_,# которая будет заменена текущим временем.# Можно использовать правила#Archive Mail = /var/spool/MailScanner/archive

# Предупреждения локальному администратору.# Можно использовать правилаSend Notices = yesNotices Include Full Headers = yesHide Incoming Work Dir in Notices = noNotice Signature = -- \nMailScanner\nEmail ↵ Virus Scanner\nwww.mailscanner.info# Поле «From:»Notices From = MailScannerNotices To = postmasterLocal Postmaster = postmaster

# Имена файлов, транслирующих имена spam-списков и областей# в реальные области DNS. Другие варианты можно поискать# http://www.declude.com/JunkMail/Support/ip4r.htmSpam List Definitions = %etc-dir%/spam.lists.confVirus Scanner Definitions = %etc-dir%/virus.scanners.conf

# Проверка на спам по адресу отправителя. Везде можно# использовать правила. Отключение следующей опции приведет# к остановке проверки на спам как самим MailScanner,# так и SpamAssassinSpam Checks = yes

# Выбор используемого spam blacklists (RBLs)# Смотри файл указанный в «Spam List Definitions»Spam List = ORDB-RBL SBL+XBL SORBS-DNSBL CBL RSL ↵ DSBL spamcopSpam Domain List = RFC-IGNORANT-DSN

51№12, декабрь 2005

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

# Число одинаковых сообщений, начиная с которого# они будут рассматриваться как спам,Spam Lists To Be Spam = 1Spam Lists To Reach High Score = 3Spam List Timeout = 10Max Spam List Timeouts = 7Spam List Timeouts History = 10

# «Белый список». Сообщения, принятые с попавших в этот# список узлов, не будут рассматриваться как спам#Is Definitely Not Spam = noIs Definitely Not Spam = %rules-dir%/spam.whitelist.rules

# «Черный список» узлов спамеров. Эта величина# переопределяется значением «Is Definitely Not Spam».# При no все, не вошедшие в 1 список, являются# потенциальными спамерами# Is Definitely Spam = %rules-dir%/spam.blacklist.rulesIs 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 = 6High SpamAssassin Score = 10

# Включение автоматического «белого списка», функции доступной# в SpamAssassin, начиная с версии 3.0. Подробности в [3]SpamAssassin Auto Whitelist = noSpamAssassin Prefs File = %etc-dir%/spam.assassin.prefs.confSpamAssassin Timeout = 75Max SpamAssassin Timeouts = 10SpamAssassin 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 = deliverHigh Scoring Spam Actions = deliverNon Spam Actions = deliver

# Файлы с сообщениями, выдаваемыми пользователюSender Spam Report = ↵ %report-dir%/sender.spam.report.txtSender Spam List Report = ↵ %report-dir%/sender.spam.rbl.report.txtSender SpamAssassin Report = ↵ %report-dir%/sender.spam.sa.report.txtInline Spam Warning = ↵ %report-dir%/inline.spam.warning.txtRecipient Spam Report = ↵ %report-dir%/recipient.spam.report.txtEnable Spam Bounce = %rules-dir%/bounce.rulesBounce Spam As Attachment = no

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

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

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

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

Настройка РostfixУстановка Postfix хорошо описана в [2] , если он уже настро-ен и нормально работает, осталось сделать немного. Как говорилось выше, Рostfix удобен тем, что одна копия про-цесса позволяет управлять как входящей, так и исходящей почтой. Но в принципе можно использовать и две разных копии со своими конфигурационными файлами, применяя схему работы Exim. Мы используем первый вариант.

В конфигурационном файле /etc/postfix/main.cf раском-ментируем следующую строку:

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

После этого Рostfix будет складывать поступающие со-общения в /var/spool/postfix/hold.

Запускаем:

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

Литература, ссылки:1. Сайт проекта MailScanner – http://www.mailscanner.info.2. Бешков А. Почтовая система для среднего и малого офи-

са. – Журнал «Системный Администратор», №5, май 2003 г. – 46-54 с.

3. Супрунов С. Профессия – убивать спам. Все, что вы хотели узнать о тонкостях настройки Spamassassin. – Журнал «Сис-темный Администратор», №10, октябрь 2005 г. – 10-17 с.

header_checks = regexp:/etc/postfix/header_checks

/^Received:/ HOLD

# /etc/init.d/postfix start# /opt/MailScanner/bin/check_mailscanner

52

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

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

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

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

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

Малик Абдугалыев

ся достаточно интересным устройс-твом, особенно с учётом его нынеш-ней стоимости.

С виду данный firewall представляет собой несколько модернизированный

53№12, декабрь 2005

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

На третий интерфейс (www) с адресом 192.168.255.5: 255.255.255.252, подключен веб-сервер, имеющий адрес 192.168.255.6:255.255.255.252.

Настройка firewallПосле того как схема сети рассмотрена, переходим не-посредственно к настройке firewall. Подробно будут опи-саны только моменты, непосредственно касающиеся на-шей схемы.

Общие настройкиПервоначальная настройка должна производиться через консольный порт. Затем можно будет управлять firewall удалённо по протоколу ssh.

Я полагаю, что нет необходимости подробно объяс-нять использование базовых команд, таких как пере-ход в привилегированный режим (enable), просмотр кон-фигурации (show run), переход в режим конфигуриро-вания (configure terminal), смена имени хоста (hostname) и домена (domain-name), установка паролей (passwd и enable password) и т. п.

Приведу лишь простой пример:

При смене имени или домена, например командой:

появится следующее предупреждение:

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

ПК – корпус, материнская плата, блок питания, 3.5” привод для гибких дисков, которые с виду такие же, как у обычно-го ПК. Жёсткого диска у этого устройства, к счастью, нет, а в качестве долговременной памяти используется флеш-память, которая размещёна на отдельной PCI-плате расши-рения вместе с другими схемами, реализующими специфич-ные функции, такие как консольный порт и интерфейс пере-крытия сбоев (Failover), который позволяет дублировать ос-новной firewall резервным в случае выхода его из строя.

Для интереса приведу основные технические характе-ристики устройства, используемого в описанном случае – 768 Мб RAM, CPU Pentium III 848 МГц, Flash 16 Мб, 4 сете-вых адаптера 10/100.

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

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

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

Firewall одним интерфейсом подключен к интернет-про-вайдеру.

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

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

Зачастую для обозначения отдельного сегмента сети, предназначенного для размещения общедоступных сер-висов, применяется термин DMZ (ДМЗ – демилитаризо-ванная зона). Это название используется и в документа-ции к firewall. В нашем же случае использовано название «www», которое является более простым и наглядным для описываемой схемы.

На внешнем интерфейсе (outside) firewall имеется один реальный IP-адрес, например 1.2.3.246:255.255.255.252, полученный от провайдера. Адрес со стороны провайдера на нашем соединении – 1.2.3.245, для нас он будет марш-рутом по умолчанию.

На внутреннем интерфейсе (inside) с адресом из при-ватной подсети 192.168.255.1:255.255.255.252. К нему под-ключен сервер с адресом 192.168.255.2:255.255.255.252. На второй интерфейс сервера подключена локальная сеть с адресами из сети 10.0.1.0:255.255.255.0.

Доменное имя, используемое в нашей сети, определим как «my.domain.tld».

Рисунок 1. Схема сети

pix> enable

pix# configure terminalpix(config)# hostname pix-gtwpix-gtw(config)# domain-name my.domain.tldpix-gtw(config)# clock timezone KGT +6pix-gtw(config)# clock set 11:59:00 09 dec 2005pix-gtw(config)# [Ctrl - Z]pix-gtw# write mempix-gtw# quit

%Key pair with hostname my.domain.tld will be invalid

Password: *******

pix-gtw(config)# ca zeroize rsapix-gtw(config)# ca generate rsa key 512pix-gtw(config)# ca save all

# domain-name my.domain.tld

54

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

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

Ключи хранятся в специальной области флеш-памяти, посмотреть их можно командой:

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

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

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

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

В данном случае все интерфейсы в режиме автоопре-деления скорости, при этом последний отключен за нена-добностью.

Кроме аппаратного идентификатора, интерфейсы име-ют и имя, которое мы вольны задать сами. Вот пример за-дания имён интерфейсов:

Последний параметр – уровень безопасности (security level) нуждается в пояснении. Число от 0 до 100 задаёт уро-вень безопасности данного интерфейса относительно дру-гих интерфейсов – чем выше число, тем безопаснее счи-тается сеть. Это число абстрактно, т.е. само по себе не яв-ляется показателем безопасности сети. Этот параметр ис-пользуется системой для определения возможности и спо-соба обмена данными между интерфейсами – для доступа из более безопасной сети в менее безопасную должны ис-пользоваться команды nat и global, а для доступа из менее безопасной сети в более безопасную – static и access-list.

Интерфейсы же с одинаковыми уровнями безопаснос-ти вообще не могут работать друг с другом.

Указываем IP-адреса на интерфейсах:

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

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

Сам список создаётся примерно как и на маршрутиза-торах Cisco, например:

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

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

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

Нам нужно добавить по меньшей мере маршрут по умол-чанию, в нашем случае указывающий на адрес 1.2.3.245, и доступный через интерфейс outside:

Протокол ICMPПротокол ICMP необходим для нормальной работы се-ти на базе стека протоколов TCP/IP, но некоторые ти-пы сообщений данного протокола могут быть исполь-зованы злоумышленниками для сбора сведений о сети или для нарушения её нормальной работы. Поэтому для внешнего интерфейса firewall следует разрешить толь-ко самые необходимые типы сообщений ICMP, в данном случае, это сообщения о недоступности хоста или сети (unreachable) и сообщения об окончании времени жизни пакета (time-exceeded).

В следующем примере разрешаем весь ICMP на интер-фейсе outside для одной сети и одного хоста, затем два ти-па сообщений на внешнем интерфейсе и весь ICMP на ин-терфейсах inside и www:

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

route имя_интерфейса сеть маска шлюз [метрика]

route outside 0.0.0.0 0.0.0.0 1.2.3.245

icmp permit 3.4.5.0 255.255.255.0 outsideicmp permit host 4.5.6.100 outsideicmp permit any unreachable outsideicmp permit any time-exceeded outsideicmp permit any insideicmp permit any www

access-list 101 permit tcp host 4.5.6.100 any eq 22access-list 101 deny tcp any any eq 22access-list 101 permit ip any any

nameif ethernet0 outside security0nameif ethernet1 inside security100nameif ethernet2 www security20nameif ethernet3 not_used security25

ip address outside 1.2.3.246 255.255.255.252ip address inside 192.168.255.1 255.255.255.252ip address www 192.168.255.5 255.255.255.252

access-group 101 in interface outsideshow ca mypubkey rsa

write mem

write net 192.168.255.2:pix-gtw

interface ethernet0 autointerface ethernet1 autointerface ethernet2 autointerface ethernet3 auto shutdown

55№12, декабрь 2005

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

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

Маска и интерфейс являются необязательными пара-метрами.

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

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

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

Эти логи будут очень полезны при настройке и отладке конфигурации firewall.

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

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

В Cisco PIX используются два вида трансляций Network Address Translation (NAT) и Port Address Translation (PAT), которые, в свою очередь могут быть статическими или ди-намическими.

NAT позволяет транслировать каждый локальный адрес в соответствующий ему глобальный один к одному. При ста-тическом NAT это соответствие задаётся жёстко. При дина-мическом NAT используются свободные адреса из задан-

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

Данные о соответствии локальных и глобальных адре-сов хранятся в таблице трансляций. Идентификация тра-фика производится по соответствию локального и глобаль-ного адресов.

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

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

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

Один из особых вариантов NAT – исключение из NAT (NAT Exemption). Исключение из NAT настраивается ко-мандой:

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

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

Для просмотра уровней безопасности можно восполь-зоваться командой:

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

ssh [email protected]

ssh 4.5.6.100 255.255.255.255 outsidessh 192.168.255.2 255.255.255.255 inside

logging onlogging trap warningslogging facility 23logging device-id string pix-gtwlogging host inside 192.168.255.2

local7.* /var/log/pix.log

nat 0 access-list

show nameif

nameif ethernet0 outside security0nameif ethernet1 inside security100nameif ethernet2 www security20nameif ethernet3 not_used security25

Откуда Куда Команда

inside outside nat

inside www nat

www outside nat

www inside static

outside inside static

outside www static

Таблица соответствий

56

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

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

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

Для удаления только определённых записей можно указать глобальный или локальный адрес и, если это PAT, то и соответствующий порт:

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

Обращения с сервера во внешний мирДля настройки обращений сервера во внешний мир исполь-зуются команды «global» и «nat».

Команда «global» создаёт пул глобальных адресов, т.е. реальных адресов на внешнем интерфейсе, которые используются определённой трансляцией. В нашем случае пул состоит только лишь из одного адреса, который непос-редственно указан на внешнем интерфейсе firewall, поэто-му мы можем использовать ключевое слово interface вмес-то собственно IP-адреса.

Следующей командой мы создаём глобальный пул с номером 1 на внешнем интерфейсе, использующий ад-рес этого интерфейса, т.е. все обращения из этого пула бу-дут уходить во внешний мир с нашего глобального адре-са 1.2.3.246:

Команда «nat» позволяет нам указать локальные ад-реса, которые должны транслироваться, и задаёт соот-ветствие с пулом глобальных адресов, описанным коман-дой «global».

Следующей командой мы задаём, что обращения с хос-та 192.168.255.2, подключенного на интерфейсе inside, бу-дут транслироваться через глобальный пул номер 1:

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

Всё, можно проверять доступность внешнего мира с сервера.

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

Обращения из внешнего мира к серверуНа нашем сервере есть несколько служб, которые долж-ны быть доступны извне, в нашем случае это DNS, SSH, SMTP, FTP.

Для настройки трансляции с интерфейса outside на ин-терфейс inside используется команда «static».

Команда static позволяет задать статическую транс-ляцию, указав точное соответствие локального адреса и глобального адреса и порта. В качестве порта можно ука-зать его номер или имя. Соответствие номеров и имён пор-тов описано в документации. В конфигурации firewall все номера портов заменяются их именами, если таковые из-вестны.

Кроме самой команды «static», необходимые разреши-тельные правила должны быть указаны в соответствующих списках доступа (access-list).

Синтаксис команды «static», используемый в данном случае, достаточно прост:

Так же как в описанном ранее случае использования ко-манды «global» мы можем в качестве глобального адреса указать ключевое слово interface.

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

Применительно к SMTP-протоколу нужно упомянуть, что firewall из соображений безопасности изменяет стро-ку приветствия нашего SMTP-сервера, заменяя почти всё звёздочками. Например, из строки:

получается что-то вроде этого:

По аналогии с предыдущей командой выполняем сле-дующие:

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

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

static (inside,outside) tcp interface 25 192.168.255.2 25

220 mail.domain.tld ESMTP Sendmail 8.13.0/8.13.0; Mon, 5 Dec 2005 18:01:32 +0600 (KGT)

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

static (inside,outside) tcp interface 20 192.168.255.2 20static (inside,outside) tcp interface 21 192.168.255.2 21static (inside,outside) udp interface 53 192.168.255.2 53

static (inside,outside) tcp interface 222 192.168.255.2 22

global (outside) 1 interface

nat (inside) 1 192.168.255.2 255.255.255.255

clear xlate global 1.2.3.246clear xlate local 192.168.255.6 lport 80

57№12, декабрь 2005

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

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

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

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

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

В список доступа на внешнем интерфейсе добавляем разрешительное правило для 80-го порта:

Инициировать исходящие соединения с веб-сервера мы не позволяем в целях повышения безопасности веб-сервера.

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

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

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

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

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

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

Первый примерУ нас есть несколько глобальных адресов, и мы хотим, что-бы обращения из внешнего мира на какой-либо их порт транслировались на определённые локальные адреса:

Второй примерУ нас есть несколько глобальных адресов, и мы хотим, что-бы все обращения от некоторых локальных хостов уходили во внешний мир со строго определённых глобальных ад-ресов – настраиваем два разных глобальных пула и соот-ветствующие им NAT:

т.е. обращения с хоста 192.168.0.1 уйдут во внешний мир с адреса 1.2.4.1, а обращения с хоста 192.168.0.2 уйдут с ад-реса 1.2.4.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.

ssh -p 222 [email protected]

ssh [email protected]

access-list 101 permit tcp any host 1.2.3.246 eq 20access-list 101 permit tcp any host 1.2.3.246 eq 21access-list 101 permit tcp any host 1.2.3.246 eq 25access-list 101 permit udp any host 1.2.3.246 eq 53access-list 101 permit tcp host 4.5.6.100 ↵ host 1.2.3.246 eq 222

static (www,outside) tcp interface 80 192.168.255.6 80

access-list 101 permit tcp any host 1.2.3.246 eq 80

static (www,inside) tcp 1.2.3.246 80 192.168.255.6 80

nat (inside) 0 access-list 110

route inside 10.0.1.0 255.255.255.0 192.168.255.2

static (inside,outside) tcp 1.2.4.1 80 192.168.0.1 80static (inside,outside) tcp 1.2.4.2 80 192.168.0.2 80

global (outside) 1 1.2.4.1global (outside) 2 1.2.4.2nat (inside) 1 192.168.0.1 255.255.255.255nat (inside) 2 192.168.0.2 255.255.255.255

static (inside,outside) 1.2.4.1 192.168.0.1static (inside,outside) 1.2.4.2 192.168.0.2

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

58

web

В этой статье я хочу поделиться с вами опытом организации пе-чати документов в корпоратив-

ной информационной системе, постро-енной на основе веб-технологий.

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

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

И только одна проблема, элемен-тарная для MS Access, не имеет адек-ватного решения для веб-программис-та. Это печать документов.

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

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

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

Дмитрий Острецов

59№12, декабрь 2005

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. Макет – это почти готовый документ, в котором программно заполняе-мые поля обозначаются специальными сигнальными фра-зами. Выделяется специальными маркерами и табличная часть, если таковая имеется. Щедро используем шрифты,

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

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

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

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

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

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

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

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

fl.<part>.<field>

fl.ft.Total

60

web

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

Конец табличной части должен быть явно обозначен. Это принципиально для работы скрипта. Для обозначения используется элемент того же типа, что и строка таблич-ной части, но содержащий только текст «fl.EOT».В приме-ре на рис. 1 хорошо виден такой параграф. А вот как вы-глядят эти параграфы табличной части непосредственно в XML (см. рис. 2).

Пример скриптаЧто, собственно, нужно сделать? Распаковать 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 в той же директории, что и скрипт.

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

Небольшие пояснения. Строки 6 и 7 задают параметры. Параметров у этой библиотеки хватает, ознакомиться с ни-

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

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

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

10: $hdr = &$doc->GetHeaderPart("Number", "Date", "Byer"); 11: // Определяем поля в 2 типах строк табличной части 12: // (С белым и серым фоном) 13: $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: }

61№12, декабрь 2005

web

ми можно в файле OODocFiller.php. Все они имеют значе-ния по умолчанию, поэтому если вас устроят стандартные настройки, то явно задавать ничего не нужно. Даже здесь строки 6 и 7 избыточны (даны для примера), они задают значения, которые используются по умолчанию. Внутрен-нее представление OpenOffice – UTF-8, поэтому важно пра-вильно задать кодировку, в которой ваш скрипт будет давать значения полей при вызове библиотечных функций.

Строка 10, создавая ссылку на обьект начальной час-ти, определяет и имена полей в ней. Строка 16 полностью идентична 10, 13 и 14 задают два типа строк табличной час-ти. Внутри макета они идентифицируются по именам, ко-торые задаются в качестве первого параметра. Остальные параметры тоже имена полей.

Строка 20 заполняет поля начальной части. Парметр Fill может быть единым массивом значений, что удобно при ра-боте с БД. Вместо строк 23-26 обычно находится цикл вы-борки значений из таблицы БД.

ПечатьИтак, мы получили файл. Как отправить его на принтер?

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

Вот пример скрипта, который отправляет файл подоб-ным образом:

Второй способ – это отправка на печать непосредствен-но с сервера (мы ведь ведем речь о внутрикорпоративной информационной системе).

Для отправки документа на печать из-под Windows до-статочно запустить следующее:

или при печати на принтер по умолчанию:

На Linux-сервере все будет немного сложнее, плюс для настройки потребуются привилегии root. Но преодоле-ние трудностей всегда раздвигало горизонты.

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

на своем сервере организовали вторую X-консоль. Вот что мы добавили в наш /etc/inittab файл:

Смысл полей этой строки примерно следующий: x1 – это просто уникальный идентификатор строки; 5 – это уровень инициализации, при котором строка бу-

дет использоваться (5 – графический режим); respawn – перезапускать при завершении; xinit xclock – Xorg-запуск графической консоли с про-

граммой часы (наличие часов не дает xinit завершить-ся);

1 – номер создаваемого графического экрана. Этот но-мер экрана мы будем сообщать OpenOffice при запуске в пакетном режиме.

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

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

распечатает документ на принтер, установленный по умол-чанию. Обратите внимание, что число у display – это номер графического экрана из inittab.

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

Дело в том, что в версиях 1.1.* не убрали какую-то отла-дочную заглушку. Поэтому в пакетном режиме OpenOffice всегда печатает на принтере, являющимся по умолчанию на момент старта программы.

Как же быть? Мы еще не тестировали на этот счет OpenOffice 2.0, а для версии 1.1.* вышли из положения при помощи печати через PDF. Файлы PDF печатаются систем-ными средствами Linux куда угодно, и кроме того, возмож-ность генерации PDF имеет самостоятельную ценность.

Как конвертировать SXW в PDFOpenOffice хорошо сохраняет свои файлы в PDF. Можно это делать и в пакетном режиме. Вот как выглядит подготовка Linux-сервера для реализации такой возможности.

Прежде всего необходимо добавить макрос в среду OpenOffice. Заходим в систему пользователем, под кото-рым будут работать скрипты, и запускаем OpenOffice. Про-ходим по меню «Tools → Macros → Macro» и нажимаем кноп-ку «Organizer», выбираем закладку (tab) «Libraries» и в выпа-

$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;

<путь к исп.файлам OO>\SOFFICE.EXE –pt"<принтер>" <документ>

<путь к исп.файлам OO>\SOFFICE.EXE –p <документ>

x1:5:respawn:/usr/X11R6/bin/xinit /usr/X11R6/bin/xclock ↵ -- /usr/X11R6/bin/Xorg :1

<путь к исп.файлам OO>/soffice -display :1 –p <документ>

62

web

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

Мы в более-менее привычном редакторе языка Basic. Текст необходимых процедур:

Это все есть в файле print.bas на [1] – открываем его ка-ким-нибудь редактором и копируем содержимое в модуль. Сохраняемся и выходим из OpenOffice.

Для упрощения использования механизма печати через PDF создадим небольшой shell-скрипт, который разместим в директории, упоминаемой в PATH, например, пусть пол-ное имя будет /usr/local/lib/ooprint:

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

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

ЗаключениеСмысл данной статьи заключается не в описании представ-ленной библиотеки, а в демонстрации идеи. Для того что-бы добавить в веб-систему функцию печати, вовсе не обя-зательно покупать что-то вроде CrystalReport. Обработка XML не сложна и может быть осуществлена на любом язы-ке. Кроме того, в качестве принт-процессора можно ис-пользовать, например, TeX. Главное, берем макет, отыски-ваем в нем поля…

Но OpenOffice все-таки заслуживает внимания. В целом это зрелый и устойчивый продукт.

Описанная реализация вполне работоспособна, но тре-бует дальнейшего развития. Например, печать каждого эк-земпляра документа требует запуска тяжелого приложения (soffice). Это может оказаться не быстро. Тут есть разные пути модернизации.

Во-первых, у OpenOffice есть резидентный модуль quickstart, который должен ускорять запуск. Можно попы-таться запускать quickstart из inittab.

Во-вторых, у OpenOffice есть серверный режим, при ко-тором он будет обслуживать удаленные запросы. Есть API. Но с этим разбираться и разбираться.

Успехов!

Ссылки:1. Файлы к статье – http://samag.ru/cgi-bin/go.pl?q=source.2. Cпецификация w3c для CSS 2 – http://www.w3.org/TR/REC-

CSS2/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.

Рисунок 4. Окно редактора basic скрипта OpenOffice

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 )

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() = oPropertyValueEnd Function

#!/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

# А теперь печатаем PDFlp -s -d $Printer $PDFname

# Удаляем PDFrm $PDFname

ooprint myprinter report.sxw

63№12, декабрь 2005

web

Павел Малахов

Веб-сервер Apache, популярный благодаря своей про-зрачности для программистов и администраторов и не в последнюю очередь благодаря бесплатнос-

ти, реализован под все более-менее популярные опера-ционные системы. Его настройки для всех ОС одинаковы, различаются только пути, где хранятся конфигурационные файлы. На одном сервере может быть запущено несколь-ко экземпляров Apache, прослушивающих разные адреса и/или порты. Один экземпляр может обслуживать несколь-ко сайтов (подробнее об этом ниже). Проект настолько попу-лярен, что постоянно обрастает новой функциональностью. О степени популярности можно судить либо по статистике, что, на мой взгляд, довольно опрометчиво, либо по конкрет-ным фактам. Фактов популярности Apache мы приведём два. Во-первых, его наличие в качестве веб-сервера по умолча-нию в большинстве UNIX-подобных операционных систем. Во-вторых, такой гигант в области ИТ, как компания Oracle, принял его в состав своего продукта Oracle Application Server 10g, где он играет одну из ключевых ролей.

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

или 2.0. Адрес сервера в Интернете: 10.0.10.15 и имя:

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

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

Сделать перенаправление нескольких имён на один сайт.

ДелаемПойдём от простого к сложному. Для начала рассмотрим случай, когда у нас два сайта и два имени teo.mynetwork.ru и logos.mynetwork.ru. Эти имена должны быть доступны, т.е. держатель зоны mynetwork.ru должен прописать в ней узлы teo и logos.

Для каждого сайта создаём каталог в корневом ка-талоге документов Apache (teo и logos соответственно). Для Linux это по умолчанию /var/www/html, но чтобы убе-диться, где он расположен на нашем сервере, смотрим зна-чение директивы DocumentRoot в /etc/httpd/conf/httpd.conf. Итак, создаём:

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

Если у нас уже был создан сайт, то всё его содержимое переносим в созданный для него каталог, т.е. из /var/www/html в /var/www/html/teo. Новый сайт logos.mynetwork.ru размеща-ем в /var/www/html/logos.

Теперь настраиваем Apache. Добавляем в конец файла /etc/httpd/conf/httpd.conf:

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

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

# mkdir /var/www/html/teo /var/www/html/logos

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

NameVirtualHost 10.0.10.15<VirtualHost teo.mynetwork.ru> DocumentRoot /var/www/html/teo ServerName teo.mynetwork.ru

64

web

Все настройки, не заданные для сайта явным образом в директиве VirtualHost, наследуются от глобальных настро-ек Apache, указанных выше в этом же файле.

Перезапускаем Apache:

Теперь, обращаясь по DNS-именам, мы будем получать разные сайты. Если обратиться по IP-адресу, то получим сайт teo.mynetwork.ru, т.к. он подключен первым.

Создаём ссылки с нескольких DNS-адресов на один сайтЭто можно осуществить двумя способами: созданием си-нонимов или перенаправлением всех обращений с друго-го сайта.

Синонимы задаются директивой ServerAlias, могут со-держать маску и разделяются пробелом. Вот несколько при-меров создания синонимов:

Синоним – это DNS-имя. Имена могут быть абсолют-но любыми, в том числе и из разных доменов, но все они должны разрешаться в IP-адреса, то есть их предваритель-но нужно зарегистрировать в DNS.

Перенаправление задаётся директивой Redirect. Создаём новый пустой сайт pantheon.ru. Как и для предыдущих сайтов, это делается в три шага: создание каталога для документов, для журналов и добавление конфигурации в httpd.conf:

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

При этом Apache воспринимает первый параметр ди-рективы Redirect не как URL, а как набор символов, при совпадении с которым происходит перенаправление. От-сюда следует, что он не проверяет наличие указанных ка-талогов и файлов, а ссылки /samag и /samag/ не считает одинаковыми.

Ограничиваем доступ к сайтамТеперь если пользователь обратится к нам по IP-адресу либо по имени, на которые наш сервер откликается (см. врезку), то Apache сначала определяет, не удовлетворяет ли запрос описанным директивами VirtualHost сайтам, и если не нахо-дит ни один из них, то выдаёт сайт по умолчанию, который находится в каталоге, заданном глобальной директивой DocumentRoot, т.е. уровнем выше остальных. Таким обра-зом, получается, что пользователь может попасть на любой из виртуальных сайтов не тем путём, какой мы для него при-готовили, т.е. http://logos.mynetwork.ru/. Например, набрав в адресной строке браузера «http://192.168.100.18/logos/», он получит сайт logos.mynetwork.ru. Правда, в этом случае документы, использующие ссылки на ресурсы этого же сай-та, будут некорректно отображаться, потому что ссылки де-лаются относительно корня сайта, и если это была ссыл-ка /img/picture.jpg, то во втором случае этот же файл уже нужно искать по ссылке /logos/img/picture.jpg, этого же брау-зер не знает. Таким образом, здесь все зависит от того, до-гадывается ли пользователь, в каких каталогах мы храним наши сайты. В принципе в этом нет ничего плохого, ведь мы в любом случае выложили сайты, чтобы их посещали (правила по ограничению доступа к ресурсу всё равно бу-дут действовать, о них мы поговорим чуть позже), но как-то это выглядит некрасиво (для того и двери, чтобы в окна не лазить). Чтобы устранить эту некрасивость, можно по-местить сайт по умолчанию на тот же уровень, что и осталь-ные сайты, т.е. создать каталог /var/www/html/default и ука-зать его в двух директивах глобальных настроек (т.е. до опи-сания виртуальных сайтов).

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

Перечислим преимущества использования файла .htaccess: при его изменении не нужно перезапускать Apache; при одинаковом уровне доступа к разным ресурсам мож-

но пользоваться ссылками на один файл .htaccess; можно предоставить пользователю право редактирова-

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

# /etc/init.d/httpd restart

ServerAlias www.teo.mynetwork.ruServerAlias *.teo.mynetwork.ruServerAlias www.teo.mynetwork.ru god.mynetwork.ru pantheon.ru

<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>

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

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

Особенности директив 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» не возымеет действия, и сайт будет не доступен из локальной сети.

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>

65№12, декабрь 2005

web

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

доступа существуют на сайте?» – администратору не-обходимо помнить, в каких каталогах лежат эти файлы и ссылки;

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

повышается нагрузка сервера, т.к. при каждом запро-се на ресурс он обращается к .htaccess в этом каталоге и всех верхних по иерархии, наследуя их настройки т.е. за-прос на ресурс http://teo.mynetwork.ru/olimp/staff/zeus.htm инициирует проверку .htaccess-файлов в каталогах «./», «./olimp/», «./olimp/staff/».

Определяя настройки доступа к каталогам сайта с по-мощью директивы <Directory> в одном конфигурацион-ном файле всего сайта, мы получим следующие преиму-щества: можно быть уверенным, что ничего не пропустим, если

вдруг нужно изменить уровень доступа к какому-нибудь ресурсу;

повышаем скорость реакции сервера на запросы, т.к. все настройки загружаются при старте Apache.

Ну а мириться придётся с тем, что для каждого ката-лога необходимо описывать права отдельно (помним, что для подкаталогов права наследуются), даже если они оди-наковые.

Правда, есть поддержка масок, например:

будет соответствовать именам каталогов в /www/ состоя-щим из трёх цифр, но это не всегда может облегчить си-туацию.

Мы рассмотрим оба способа и изменим права доступа к двум каталогам сайта logos.

Первый. Описываем права доступа к каталогам в глав-ном конфигурационном файле httpd.conf:

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

и файл /var/www/html/logos/info2/.htaccess:

Оба варианта настройки равноправны и создают сле-дующие ограничения.

Доступ к ресурсу http://logos.mynetwork.ru/info1/ смо-гут получить только два пользователя из локальной се-ти с указанными IP-адресами (хотя такие ресурсы луч-ше хранить на внутренних веб-серверах), ещё мы дали разрешение Apache, в случае отсутствия в каталоге на-чальной страницы генерировать html-документ с содер-жимым каталога.

Для доступа к ресурсу http://logos.mynetwork.ru/info2/ будут запрошены имя пользователя и пароль, которые бу-дут сверены с данными в файле /var/www/main_users. Со-здадим этот файл:

Добавим в него пользователя chef:

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

Последние штрихиВ заключение можно для изящности выделить настрой-ку каждого сайта в отдельный файл, и подключить их в httpd.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-файлов.

<Directory ~ "^/www/.*/[0-9]{3}">

<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>

Options +IndexesOrder deny,allowDeny from allAllow from 192.168.100.11Allow from 192.168.100.17

AuthType BasicAuthName "Boss"AuthUserFile "/var/www/main_users"Require valid-user

# touch /var/www/main_users# chown root.webmaster /var/www/main_users

# /usr/bin/htpasswd /var/www/main_users chef

Include /etc/httpd/conf/vhosts/teo.confInclude /etc/httpd/conf/vhosts/logos.confInclude /etc/httpd/conf/vhosts/pantheon.conf

66

web

Технология Ajax, о которой пойдёт речь, медленно, но верно захва-тывает просторы Интернета. Всем

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

и понимания идеи его революционнос-ти для Всемирной паутины.

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

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

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

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

Вячеслав Родионов

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

67№12, декабрь 2005

web

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

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

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

циях и форумах, поиск информации по всему миру, участие в онлайн-аукционах и прочие возможности).

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

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. В случае, соот-ветствующем стандартам программирования, это будет выглядеть так:

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

<script language="javascript" type="text/javascipt">var xmlhttp = new XMLHttpRequest();</script>

68

web

рабатывать отдельно случай IE и случай не-IE. Но об этом ещё пойдёт речь.

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

Рассмотрим этот механизм подробнее на примере про-стейшего Ajax-приложения.

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

Здесь мы вызываем метод open, необходимый для установления соединения между нашим объектом XMLHttpRequest и сервером. Первый параметр указывает на метод передачи данных («POST» и «HEAD» тоже можно использовать, но мы пока этого случая касаться не будем), второй – на URL, которому отправляется запрос, и от кото-рого приходит ответ. Третий параметр устанавливает ре-жим асинхронной передачи данных. Это значит, что рабо-та веб-приложения не будет остановлена в ожидании отве-та сервера. Наоборот, в поведении странички ровным счё-том ничего не изменится, и только тогда, когда придет от-вет от сервера, мы увидим изменения.

У людей, не владеющих тонкостями JavaScript, навер-няка вызвали беспокойство строчки:

Думаю, будет проще это понять, если вы немного зна-комы с объектно-ориентированным программированием и технологией обратного вызова. Но даже в случае, если об ООП вы только слышали, то нетрудно понять, что всё, что мы делаем, – это назначаем функцию, которая будет вызываться при поступлении данных от сервера. Сле-дует знать и понимать, что this во время вызова функ-ции onreadystatechange (функции обратного вызова) бу-дет объектом xmlHttp, а responseText будет соотвествен-но переменной этого объекта, в которую будет помещён ответ сервера. Тонкость в том, что мы не знаем, когда именно ждать ответа сервера, поэтому мы не будем его ждать вообще, вместо этого, когда придет ответ, то про-изойдёт 3 события: будет изменено состояние объекта xmlHttp (xmlHttp.readyState), ответ будет помещён в пе-ременную xmlHttp.responseText и будет вызвана функция xmlHttp.onreadystatechange().

Надеюсь, механизм прояснился более или менее. Оста-лось лишь одно тёмное место – состояния объекта. Что же это такое?

В общем-то, ничего сложного. Просто для того, чтобы мы могли узнать, что и когда делать, объект xmlHttp име-ет 5 состояний: 0 – «uninitialized» – объект не инициализирован; 1 – «loading» – объект подгружает свои данные; 2 – «loaded» – объект загружен; 3 – «interactive» – можно работать, хотя ещё не весь от-

вет сервера прочитан; 4 – «complete» – можно работать, всё загружено.

Пока что нас интересует только состояние 4. Его мы и обрабатываем.

Рассмотрим код дальше. Осталось самое простое:

В первой строчке мы говорим серверу о том, что хо-тим получить ответ, соответствующий mime-типу text/xml. Это своего рода формальность, так как не все браузеры умеют обрабатывать ответ сервера только в строго опре-делённом формате. Вторая строчка – это собственно от-правка данных на сервер. Аргументом являются параметры, отправляемые серверу, если мы используем метод «POST» для передачи данных. Так как мы отсылаем GET-запрос, то и передавать ничего не будем.

В нашем примере мы вообще не передаём никаких па-раметров, но если бы мы этого хотели, то в вызов xmlHttp.open следовало бы вставить стандартный GET-запрос ви-да http://ourserver.org/ajax_service.php?name=foo&value=bar. В примере, в конце статьи мы так и поступим.

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

Напишем приложение для проверки почты в системе Gmail:

xmlHttp.open("GET", ↵ "http://ourserver.org/ajax_service.php",true);

xmlHttp.onreadystatechange = function(){ if (xmlHttp.readyState == 4) { var xmlData = this.responseText;

xmlHttp.overrideMimeType('text/xml'); xmlHttp.send(null);

Листинг 2.<script language="javascript" type="text/javascipt">function connectServer(){ var xmlHttp = new XMLHttpRequest(); xmlHttp.open("GET", ↵ "http://ourserver.org/ajax_service.php",true);

xmlHttp.onreadystatechange = function(){ if (xmlHttp.readyState == 4) { var xmlData = this.responseText; //здесь идёт обработка полученных данных } } xmlHttp.overrideMimeType('text/xml'); xmlHttp.send(null);}</script>

//здесь идёт обработка полученных данных }}

69№12, декабрь 2005

web

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

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

Следующее, что может быть непонятно, – это строки:

Здес ь мы ис пользуем DOM -модель док умен -та для прохода по xml-дереву полученных от серве-ра данных. Ищем корневой элемент <feed>...</feed> (getElementsByTagName(‘feed’)), затем в нём находим тэг <fullcount></fullcount> (getElementsByTagName(“fullcount”)) и выводим значение, которое находится в этом тэге (number[0].firstChild.nodeValue). Изначальный xml-код вы-глядит примерно так:

Чтобы скрипт корректно работал на вашей машине, же-лательно иметь 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 – таблица Менделеева.

<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>

netscape.security.PrivilegeManager.enablePrivilege ↵ ("UniversalBrowserRead");

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);

<feed version="0.3"><title>Gmail - Inbox for [email protected]</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>

70

web

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

Серафим Пикалов

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

71№12, декабрь 2005

web

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

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

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

О некоторых методах того, как это сделать, мы погово-рим в этой статье.

Условия работыВ рассматриваемой ситуации нам придётся работать со скриптами, которые уже установлены у клиента и могут быть востребованы в любой момент.

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

не испортив правильно работающие скрипты. Процесс нашей отладки должен быть виден только нам,

пользователи не должны ничего заметить. Мы не можем установить или перенастроить ПО на сер-

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

Мы имеем только ssh (и/или telnet) и http-доступ.

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

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

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

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

О том, как это установить смотрим ниже.

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

Например, так:

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

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

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

Пример:

Плюс – вывод отладки не зависит от того, что мы пере-даём скрипту.

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

Во-вторых, при использовании proxy-сервером REMOTE_ADDR однозначно не определяет компьютер. Но даже про-верка на значение HTTP_X_FORWARDED_FOR не даёт 100% гарантии, т.к. эти значения зависят от того, что воз-

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

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

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

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

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

//---код скриптаif (isset($_GET[‘debug’])) { echo ‘Debug info!’;} //---код скрипта

If ($_SERVER[‘REMOTE_ADDR’]==='123.234.234.15') { Echo ‘Debug info2!’;}

72

web

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

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

Пример:

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

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

Для удобства управлением отладки можно написать и установить у клиента скрипт по установке и удалению нужной cookie-переменной.

Комбинированный способДва вышеописанных способа можно скомбинировать в один и таким образом избежать проблем, связанных как с неуни-кальным IP, так и с кражей cookies.

Пример:

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

Теперь управлять режимом выполнения удалённого скрипта можно, не изменяя код.

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

Если использовать метод с cookie, то тут всё просто – указываем время жизни cookie в функции setcookie, и де-ло в шляпе (null означает время жизни до закрытия браузе-ра). Но если этот способ нам по каким-то причинам не под-ходит, то можно ограничить время жизни отладочного бло-

ка определённым сроком после последней модификации файла, например, так:

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

Всё вышеописанное очень удобно собрать в одну или несколько вспомогательных функций и подгружать их как include при необходимости.

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

Например, мы ведём серьёзные работы со скриптом myscript.php.

Переименуем стабильную версию в myscript.php.stable, а нестабильную – в myscript.php.unstable и создадим сле-дующий подставной скрипт myscript.php:

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

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

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

Ошибка PHPРассмотрим самую простую ситуацию, когда интерпрета-тор сообщает нам о возникновении ошибки в конкретной строке конкретного файла.

В этом случае удобней всего установить свой обра-ботчик ошибкой (error_handler) и внутри вызвать стан-дартную PHP-функцию debug_backtrace() (однозначно

if ( ( time() - filemtime(__FILE__) ) < BLOCK_LIFE_TIME) {//…}

<?php$d_file=__FILE__;//is_debug функция, проверяющая, кто использует скрипт –//обычный пользователь или разработчикif (is_debug()) {onyma_include($d_file.'.unstable');}else { onyma_include($d_file.'.stable');}?>

if (!empty($_COOKIE[‘debug’])) { echo ‘Debug info3!’;}

if (!empty($_COOKIE['DBG']) &&($_SERVER[‘REMOTE_ADDR’]=== '123.234.234.15')) { echo ‘Debug4’;}

73№12, декабрь 2005

web

определит путь к ошибке), вывести значения элемен-тов суперглобального массива $GLOBALS и параметра error_context.

Пример:

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

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

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

Свести различия нужно к какому-нибудь конкретному тезису, к примеру: «Тут мы должны были увидеть две стро-ки, а видим только одну». После этого нам придётся про-вести анализ кода и определить переменные, от которых зависит вывод данных строк.

Сделать это можно, к примеру, такими способами:Ограничиваем код выводом двух отладочных сообще-

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

Второй способ заключается в анализе вывода скрип-та. Для этого включаем буферизацию вывода и обработ-чик на каждый тик PHP:

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

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

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

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

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

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

Схема работы будет следующая: при запуске скрипта создаётся сокетное соединения с сервером отладки. Пос-ле этого при каждом тике запускается нами определённая функция отладки, которая посылает данные о текущем со-стоянии к серверу и ждёт ответа – команды: s (step) – один шаг вперёд. bp (break point) – точка останова. Определяется как но-

мер строки и имя файла. st (stop) – немедленная остановка выполнения. g (go) – выполнить скрипт до конца.

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

Приведем код:

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);}

<?phpdefine('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();?>

<?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); }}

74

web

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

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

Реализуем такой же по функциональности код, но без использования сокетов.

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

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

Управление отладкой можно реализовать двумя спо-собам.

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

Или интерфейс управления формируется в начале от-лаживаемого скрипта и по средствам 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>&nbsp;';echo '<a href="javascript: Send2Dbg(\'g\');">GO</a>&nbsp;';// и т.д.echo '</div>'; echo '<div id="dbg_dib"></div>';// Далее всё так же

// Функция отладки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);?>

76

сети

Использование TCP стало столь привычным, что большинс-тво просто не задумывается

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

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

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

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

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

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

77№12, декабрь 2005

сети

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

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

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

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

Второе, что смутило Олафа Титца – это взаимодействие транспортного TCP и транспортируемого. Для яснос-ти обратимся к схеме инкапсуляции, которая обсуждается в [1]. Скопируем ее в переводном варианте и добавим немного комментариев.

Автор утверждает, что эти два по-тока TCP (см. рис. 1) могут иметь раз-ные таймеры. Дословно: «может так случиться, что соединение нижне-го уровня имеет медленные таймеры, возможно как остаток с периода мед-ленного или ненадежного основного соединения». То есть автор предпо-ложил, что вложенное TCP успело ра-

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

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

Давайте представим, что реаль-но может случиться из-за потерь сег-ментов (именно так и следует далее их называть, а не пакетами) в таком тун-неле. Во-первых, просто обрыв свя-зи будет обработан и тем и другим TCP соответственно и в пределах пе-речисленных RFC. А вот с повторами, и правда, могут возникнуть некоторые проблемы. Покажем на схеме (рис. 2), что будет происходить, если в пути по-теряется сегмент с данными.

Предположим, что пропал сегмент D4. Тогда оба стека протоколов полу-чат повторный ACK с последним при-нятым номером и согласно алгоритму Fast Retransmission, или быстрой пов-торной передачи, пропущенный пакет

Рисунок 1. Схема инкапсуляции

78

сети

будет повторен. На рисунке изображена ситуация, когда оба стека имеют одинаковый RTT и, значит, близкие RTO. Тогда транспортный TCP сформирует повтор пропавше-го сегмента T4-4 и точно так же добавит в поток сегмент T7-4, содержащий сегмент с данными D4, повторенный в транспортируемом TCP. Это самый худший вариант разви-тия событий. Иначе говоря, если потери канала составля-ют 10%, то из полезной емкости канала будет изъято уже 20%. Но, как уже замечено, это предельно плохой вариант. Поскольку RTT туннеля и RTT транспортируемого TCP на практике не совпадают, то, скорее всего, реальные потери полосы будут гораздо меньше.

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

Для TCP нет разницы между потерянным сегментом и потерянным подтверждением, если и те и другие вы-сылаются не так, как рассуждает Олаф, а сериями в пре-делах размера CWND. Но, с другой стороны, теперь уже для TCP-трафика происходит теоретическое учетверение потерь, то есть из полезной емкости канала будет изымать-ся уже 40%. Хотя это лишь «на бумаге», то есть снова здесь приведен самый плохой вариант.

Теперь, глядя на рис. 2, ответьте, в каком TCP надо за-претить повторы? Олаф Титц делает вывод, что повторы надо запретить в верхнем транспортируемом TCP. На са-

мом деле, повторы следует запретить в нижнем туннель-ном TCP.

Во-первых, потому что туннель это одно TCP-соедине-ние, а вложенных может быть множество.

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

Итак, и вторая часть рассуждений о проблемах TCP не выдерживает элементарной проверки. Быть может, в разделе «Практический опыт» нам откроется истина? Рассмотрим и его повнимательнее.

В практической части статьи [1] содержится информа-ция, которая может стать разгадкой всех проблем Олафа Титца. Оказывается, у автора этой статьи, цитирую, «ис-пользовалась волоконно-оптическая связь, которая стра-дала частыми потерями пакетов, иногда 10-20%». Стран-ная связь! Вероятно, на карманных фонариках. Последн-нее конечно шутка, но тем не менее это позволяет точно определить условия применения тезисов автора упомяну-той статьи. Обратимся к RFC 2001 [3]. Там однозначно ус-тановлено, что все алгоритмы TCP рассчитаны при допуще-нии, что потери в канале составляют менее 1%. Вероятно, у Олафа были проблемы с кабельщиком. Быть может, суро-вому монтеру не понравилась его прическа [5] и он решил таким путем выразить свое возмущение. Олаф утверждает, что, создав CIPE [6], смог решить проблемы и обеспечить надежную работу на канале с потерями до 20%. И если не проверить утверждения автора с помощью тестов с тунне-лем на подобном канале, то получится, что здесь предла-гается рассуждения Олафа Титца заменить рассуждени-ями Алексея Барабанова. Лишь опыт позволит рассудить, на чьей стороне правда (или правдоподобность). Посколь-ку нет простой возможности создать искусственную линию связи с характеристиками, похожими на те, что создали так много проблем Олафу, то заменим реальные, обычно моду-лированные, помехи случайными. И дополнительно ограни-чим их 10-процентными. Думаю, что эта замена, не помеша-ет понять суть происходящих процессов, так как на практи-ке и 10% и 20% значительно больше указанного в RFC 1%, и отличаются лишь временем, затраченным на проведение эксперимента, поскольку чем больше потери, тем меньше скорость передачи.

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

Рисунок 2. Последствия потери сегмента

79№12, декабрь 2005

сети

в центре маршрута ограничим полосу, например до 10 Мбит, и внесем случайные потери в трафик. Конечно, 10 Мбит зна-чительно выше типичной скорости канала, предоставлен-ного ISP для подключения к Интернету. Но иначе придет-ся уменьшить объем пересылаемых данных, чтобы в при-емлемое время провести эксперимент. Перечислим эле-менты, которые нужны для организации таких проверок. Во-первых, хост-отправитель и хост-получатель трафика. Во-вторых, два хоста, между которыми проложен туннель. Поскольку «удаленный» конец туннеля может совпадать с хостом-получателем, то, кроме перечисленных трех хос-тов, нужен еще один, где будет эмулироваться «узкое мес-то» в сети. Итого, достаточно будет 4 компьютера соединить последовательно. Строго говоря, хост-отправитель можно совместить с «ближним» концом туннеля. Но надо учесть, что вход в туннель тоже является своего рода ограничите-лем трафика, или шейпером, поэтому пусть будут в тес-товой сети четыре компьютера, которые назовем wstovert, wsalekseybb, wskostja и server. Общий вид полученной сети представлен на рис. 3, и дальнейший комментарий будем вести согласно изображенной там схемы.

Все компьютеры включены в общую сеть 192.168.0.0/24, объединены общей кабельной системой с помощью ком-мутатора 1 Гбит и обмениваются данными по протоколу 1000BaseTX, то есть значительно выше проверяемых ско-ростей передачи, что позволит максимально снизить сис-тематическую ошибку. На эту сеть наложены две виртуаль-ные сети. Первая из них, с адресом 192.168.10.0/24 вклю-чает wstovert, wsalekseybb и server, а вторая – с адресом 192.168.11.0/24 – только server и wskostja. Практически все компьютеры могут резолвить адреса друг друга с помо-щью arp и обмениваться пакетами через общий коммута-тор. Но нам ведь нам надо обеспечить передачу трафика между компьютерами так, будто они включены последова-тельно один за другим. Поэтому с помощью правил мар-шрутизации и преобразования адресов заставим трафик от wstovert проходить до wskostja через wsalekseybb и server так, как указывает стрелка на рис. 3. Для этого на каждом компьютере укажем статический маршрут до следующей по ходу движения стрелки на рисунке 3 сети через соседний компьютер, а на том включим NAT так, чтобы заменять в та-ком маршруте адрес отправителя на собственный. Оконча-тельно должно получиться так:

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

ки OpenVPN в режиме клиента TCP-туннеля будут произво-диться согласно следующему файлу конфигурации:

Для станции wskostja все аналогично, меняются лишь адреса, протокол на tcp-server и удаляется строка remote, что переводит туннель в состояние прослушивания. В ре-жиме UDP на обоих концах протокол просто переключает-ся в udp и удаляется параметр tcp-queue-limit. И теперь путь между wstovert до wskostja проходит через туннель.

Чтобы доказать, что сам туннель проходит через server, проверим путь до удаленного конца туннеля от wsalekseybb:

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

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

На wstovert подготовим файл с данными, которые будут посылаться в тестовых сеансах:

Симуляцию TCP-трафика будем создавать с помощью команды, отправляющей 100 Мб из файла на целевой хост. В качестве слушателя TCP используем sshd, который пере-шлет все принятые данные в /dev/null, чтобы не помешала буферизация. Причем для сокращения затрат на загрузку файла с диска каждую тестовую отправку будем предва-рять локальным копированием в /dev/null:

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

# traceroute 192.168.11.2

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

# cat /etc/openvpn/test.conf

proto tcp-clienttcp-queue-limit 1000remote 192.168.11.2dev tunport 5000tcqueuelen 1000secret /etc/openvpn/static.keyifconfig 192.168.12.1 192.168.12.2route 192.168.12.0 255.255.255.0 192.168.12.1

# traceroute 192.168.11.2

# traceroute 192.168.12.2

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

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 2 192.168.11.2 0.233 ms 0.000 ms 0.000 ms

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

# dd if=/home/tovert/100M.bin bs=1024 count=102400 >>/dev/null# dd if=/home/tovert/100M.bin bs=1024 count=102400 | ↵ ssh [email protected] "cat - >>/dev/null"

80

сети

netcat, точно так же предварительно произведя локальное копирование:

На приемной стороне UDP-трафик будет приниматься специальным слушателем и подсчитываться:

В точке прохождения трафика через хост server включим ограничитель полосы типа HTB (Hierarchical Token Buckets) на 10 Мбит со следующей конфигурацией:

Так что фильтр будет направлять в шейпер только тра-фик, помеченный маркером 10 (0xa). Весь непомеченный трафик будет проходить в обход шейпера, так как в HTB не указан поток по умолчанию. Метиться будут лишь паке-ты, направляемые на виртуальный адрес wskostja:

Последняя деталь – эмулятор помех. По логике, ес-ли шейпер на исходящем интерфейсе хоста server имити-рует сужение канала, то участок с потерями должен нахо-диться за ним.

И у нас не остается иного места, где можно внести (или точнее изъять) потери в трафик, кроме входного ин-терфейса wskostja:

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

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

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

С примерами некоторых скриптов, использованных для настроек, можно ознакомиться в архиве [9].

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

Протокол передачи данных

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

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

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

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

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

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

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

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

TCP 105 TCP 103.9 1.2 112 81218 100951 0 1

TCP 105 TCP 103.90.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.90.18(до 0.19)

124 161677 7995 10 1.11

TCP 105 UDP 117.1 0.0791 126 164227 6281 10+10 1.13

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

# 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

# netcat -vlnu -s 192.168.12.2 -w 15 -p 22222 | wc -c

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 fwfilter parent 1: protocol ip pref 1 fw handle 0xa ↵ classid 1:10

# iptables -L INPUT

Chain INPUT (policy ACCEPT)target prot opt source destinationDROP all -- anywhere 192.168.12.2 random 10%ACCEPT all -- anywhere 192.168.12.2

# iptables -n -L OUTPUT

Chain OUTPUT (policy ACCEPT)target prot opt source destinationDROP all -- 192.168.12.2 0.0.0.0/0 random 10%ACCEPT all -- 192.168.12.2 0.0.0.0/0

# traceroute 192.168.11.2

Chain POSTROUTING (policy ACCEPT)target prot opt source destinationMARK all -- anywhere 192.168.11.2 MARK set 0xa

81№12, декабрь 2005

сети

туннеля 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), то использова-

ние 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, что показал тестовый про-гон. Но вот само базовое соотноше-ние пропорции доставки неутешитель-

Таблица 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

82

сети

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

Итак, трафик UDP тоже не приобре-тает ничего хорошего от завертывания его в туннель UDP. Быть может, никако-го особого улучшения связи из-за при-менения CIPE и не происходило? Быть может, все это лишь проказы шаловли-вого кабельщика? Сейчас трудно разо-браться, но безымянного кабельщика надо поблагодарить. Ведь именно из-за его работы Олаф Титц, как Колумб, «поплыл в Индию, а прибыл в Амери-ку», то есть не важно, о чем он там ду-мал, когда создавал CIPE, но, безу-словно, что его инициатива подтолкну-ла многих других разработчиков сход-ных программных средств.

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

пользовать, переходит в плоскость экс-пертных оценок. Перечислю их, и пусть читатели сами решат, подходят ли им такие рекомендации.

Во-первых, современные сети яв-ляются в большей степени 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/UDP-dominance) именно за счет его управля-емости. То есть, если два типа трафика смешиваются в одной полосе регули-рования, то 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 tp : / /www.barabanov.ru/arts/tcp/tovert.tgz.

10. RFC 3168 – http://sysadmins.ru /r fc /rfc3168.html.

83№12, декабрь 2005

bugtraq

Обход ограничений безопасности в Sun Java JREПрограмма: 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.Опасность: Критическая.Описание: Неизвестная ошибка позволяет недоверенно-му апплету получить доступ на чтение, запись и выполне-ние приложений на системе.

Уязвимость существует в JDK/JRE 5.0 Update 3 и более ранних версиях на платформах Windows, Solaris и Linux.

Уязвимость обнаружена из-за ошибки в использовании reflection API. Недоверенный апплет может получить доступ на чтение, запись и выполнение приложений на системе. Уязвимость существует в следующих продуктах на плат-формах 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, может позволить злоумышленни-ку просмотреть и записать произвольные файлы, а также выполнить произвольные приложения на системе. Уязви-мость обнаружена в JDK/JRE 5.0 Update 3 и более ранних версиях на платформах Windows, Solaris и Linux.URL производителя: www.sun.com.Решение: Установите последнюю версию с сайта произ-водителя.

Переполнение динамической памяти в Panda Antivirus при обработке ZOO-архивовПрограмма: Panda SendmailSecure Antivirus, Panda QmailSecure Antivirus, Panda ProxySecure Antivirus, Panda PostfixSecure Antivirus, Panda PerimeterScan, Panda ISASecure Antivirus, Panda FileSecure Antivirus, Panda ExchangeSecure Antivirus, Panda DominoSecure Antivirus, Panda CVPSecure Antivirus, Panda CommandlineSecure Antivirus, Panda AntiVirus Titanium, Panda AntiVirus Small Business Edition, Panda AntiVirus Platinum 7.x, Panda AntiVirus Enterprise Suite.Опасность: Критическая.Описание: Уязвимость существует из-за ошибки в библио-теке pskcmp.dll во время Lempel-Ziv-декомпрессии ZOO-ар-хивов. Удаленный пользователь может создать специаль-но сформированный ZOO-архив, вызвать переполнение ди-намической памяти и выполнить произвольный код на це-левой системе.URL производителя: www.pandasoftware.com.Решение: Способов устранения уязвимости не сущес-твует в настоящее время. В качестве временного реше-ния рекомендуется фильтровать ZOO-архивы на email или proxy-шлюзах.

Отказ в обслуживании в Microsoft IISПрограмма: Microsoft IIS 5.1.Опасность: Низкая.Описание: Уязвимость существует при обработке URL. Уда-ленный пользователь может послать веб-серверу специ-ально сформированный HTTP GET-запрос и аварийно за-вершить работу приложения inetinfo.exe. Уязвимость может быть эксплуатирована, если для директории установлены привилегии на выполнение сценариев и приложений. При-мером такой директории является «/_vti_bin».

Пример:

Страницу следует обновить 4 раза.Вместо «*» могут использоваться символы:

Последняя цифра, после тильды, может быть от 0 до 9.URL производителя: www.microsoft.com.Решение: Способов устранения уязвимости не существу-ет в настоящее время. В качестве временного решения ре-комендуется блокировать входящие запросы, содержащие: «~0», «~1», «~2», «~3», «~4», «~5», «~6», «~7», «~8», или «~9». Согласно уведомлению, исправление выйдет вместе с SP3 для Windows XP.

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

http://www.example.xom/_vti_bin/.dll/*\~0

%01-%1f, %3f, ", *, :, <, >

Множественные уязвимости в Microsoft Internet ExplorerПрограмма: Microsoft Internet Explorer 5.01, 5.5, 6.0.Опасность: Критическая.Описание: Обнаруженные уязвимости позволяют удален-ному пользователю обойти ограничения безопасности и вы-полнить произвольный код на целевой системе.

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

2. Ошибка дизайна при нажатии на клавишу мыши в но-вом окне браузера может позволить злоумышленнику вы-полнить произвольный файл на целевой системе.

3. Ошибка обнаружена при использовании HTTPS-прок-си сервера, который требует использовать обычный тип ау-тентификации. Удаленный пользователь может получить веб-адрес посещаемой страницы, даже если использует-ся HTTPS-соединение.

4. Ошибка существует при инициализации определен-ных COM-объектов. Удаленный пользователь может выпол-нить произвольный код на целевой системе с привилегия-ми пользователя, запустившего Internet Explorer.

5. Ошибка существует при инициализации определен-ных объектов, если используется функция windows() в со-бытии <body onload>. Удаленный пользователь может с по-мощью специально сформированной веб-страницы выпол-нить произвольный код на целевой системе.URL производителя: www.microsoft.com.Решение: Установите исправление с сайта производите-ля.

84

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

ПрелюдияЕсли покопаться в анналах мировой ис-тории развития вычислительной тех-ники и выудить из них компанию Apple, BeOS берёт своё начало именно с про-изводителя «яблочных» компьютеров. Жана-Луи Гассе знает, наверное, прак-тически каждый обладатель Macintosh (рис. 1). Человек, в одно время руко-водивший представительством Apple во Франции, благодаря своим успехам со временем занял должность началь-ника всех исследовательских и произ-водственных подразделений компании. На его счету выпуск моделей Mac Plus, Macintosh II и Macintosh SE, снискавших большую популярность у покупателей.

Но мало кто знает о секретных проек-тах, которыми руководил Гассе. Ими яв-лялись Aquarius – процессор на базе RISC-архитектуры, и Jaguar – профес-сиональная рабочая станция. Именно второй проект нас и интересует.

Целью «Ягуара» являлось созда-ние высокопроизводительной рабо-чей станции на основе RISC-процессо-ра Motorola 88110. Стратегия «правого верхнего угла», согласно которой в не-драх компании разрабатывались ком-пьютеры с высокой производительнос-тью и расширяемостью, обладавшие при этом такой же высокой ценой, бы-ла навязана Apple именно Жаном-Луи. Поэтому, когда один из инженеров ком-пании, Хью Мартин, предложил пред-приимчивому французу создать сверх-быстрый компьютер на базе новой тогда RISC-архитектуры, тот сразу же согла-

сился. Руководство Apple также не воз-ражало, правда, поставило лишь одно условие – новый компьютер не должен стоить больше 8000 долларов.

Работа закипела. Благодаря невы-сокой цене чипа Motorola 88100 инжене-ры смогли установить в первые прото-типы сразу четыре штуки. Платформа на новом процессоре требовала и но-вой операционной системы, поэтому группой из 80 программистов за пару месяцев была разработана новая ОС под кодовым названием Bojole, осно-ванная на микроядре Mach. Созданное в недрах университета Карнеги-Мелло-на, оно было основано на исходных ко-дах операционной системы UNIX, и од-но из немногих в то время обладало вы-тесняющей многозадачностью и подде-рживало защищённый режим памяти.

Четыре процессора и быстрая опе-рационная система позволили ново-му компьютеру ещё на стадии разра-ботки свободно обрабатывать аудио- и видеоданные, а также трёхмерную графику, а встроенные стереодина-мики и камера для проведения видео-конференций подняли возможности «Ягуара» на уровень графических ра-бочих станций, стоивших десятки ты-сяч долларов. По словам Хью Марти-на: «Мы сделали полноценный муль-тимедийный компьютер, на годы опе-редивший своё время».

К сожалению, несовместимость но-вой операционной системы с програм-мами для MacOS, а также возросшее до предела противоборство между ко-

мандами разработчиков проекта «Ягу-ар» и оригинального Macintosh вынуди-ли управляющего Apple Джона Скал-ли в июне 1990 г. закрыть сделанный на 50% проект.

Впоследствии Жан-Луи Гассе, дис-кредитировавший себя выпуском пер-вого ноутбука компании Macintosh Portable, а также вступивший в личную борьбу со Скалли, был вынужден по-дать в отставку. Случилось это в сере-дине 1990 года.

Гассе отправляется в свободное плаваниеУйдя из Apple, Гассе тем не менее не расстался с мыслью разрабаты-вать новые компьютеры. Однажды он встретился с Ирвином Гаулдом, управ-ляющим Commodore Business Machines. По словам самого Гассе: «Он хотел, что-бы я возглавил отдел исследований и разработок компании Commodore Amiga (разрабатывавшей одноимённые компьютеры), но я сказал: «Нет, я уже проходил через это. Я хочу управлять компанией». Гаулд ответил, что у не-го уже имеется прекрасная кандидату-ра, что означало отказ. Тем не менее Жан-Луи извлёк из встречи некоторые идеи относительно компьютеров Amiga: «Я немного обиделся на мистера Гаул-да и решил, что, возможно, я мог бы создать что-нибудь наподобие Amiga, только построенное на современной аппаратной базе. Кроме того, в отличие от высокомерной Commodore я бы луч-ше заботился о разработчиках програм-

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

«Взрыв сверхновой звезды» – именно так можно было охарактеризовать появление на рынке в 1996 году компьютера BeBox и операционной системы BeOS. Прошло время, и звезда постепенно угасла. Но, похоже, в скором времени настанет черёд повторного взрыва.

Дмитрий Мороз

85№12, декабрь 2005

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

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

По замыслу Гассе, его новинка должна была стать тем «мультимедий-ным монстром», на пост которого пре-тендовал так и не состоявшийся про-ект «Ягуар». На воплощение новой идеи у француза имелись 1,7 млн. долларов, с которыми он ушёл из Apple. Чуть поз-же Гассе благодаря своим связям по-лучил дополнительное 7-миллионное финансирование. Помощником Жана-Луи в организации собственной ком-пании стал Кори Ван Арсдейл, на кото-рого были возложены обязанности ад-воката и главного менеджера.

Первым инженером, кото-рого Гассе пригласил в свою, ещё в то время не названную, Be Inc., стал Стив Сакоман, один из бывших сотрудников Apple, «отец» проекта Newton, позже ставшего первым кар-манным персональным ком-пьютером в мире.

Вначале Сакоман работал у себя дома. Буквально че-рез несколько дней после на-чала воплощения идеи Гассе в жизнь, он разработал пер-вый прототип компьютера, состоявший из текстолито-вой платы, 20 МГц процессора Hobbit производства компании

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, предназна-ченного для энтузиастов-про-граммистов. Кроме того, сис-тема обзавелась первыми средствами разработки при-ложений.

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

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

Рисунок 2. Одна из ранних версий BeOS для BeBox на базепроцессоров Hobbit

86

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

BeOS построена на микроядер-ной архитектуре. ОС состоит из микроядра, а также различных серверов, каждый из которых отве-чает за выполнение определённых функций.

Интерфейс программирования приложений (API) у BeOS осно-ван на объектно-ориентирован-ном дизайне вместо процедурно-ориентированного. Благодаря та-кому подходу программисты могут свободно использовать части кода в различных программах, что поз-воляет значительно ускорить про-цесс их создания.

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

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

Ориентация на обработку муль-тимедийных и коммуникацион-ных задач. Многопоточный ди-

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

64-разрядная файловая система BFS поддерживает жёсткие дис-ки объёмом до нескольких тера-байт и благодаря журналирова-нию транзикаций предотвраща-ет потерю данных.

Выход на финишную прямуюВ 1994 году для BeBox пришлось ис-кать новую платформу, поскольку процессоры Hobbit прекратили своё существование. Apple использовала Hobbit в первых прототипах проекта Newton. Когда же инженеры компании совместно с Acorn создали новую архи-тектуру ARM-процессоров, Hobbit стал не нужен. В результате летом 1994 го-да AT&T, не получив дальнейшего фи-нансирования от Apple, отказалась продолжать разработку чипов Hobbit и окончательно ушла с рынка процес-соростроения.

В поиске нового чипа для BeBox выбор инженеров Be Inc. пал на про-цессор PowerPC: новый, но уже доста-точно разрекламированный компания-ми Apple, IBM и Motorola продукт. Имея меньшую стоимость, чем у процессора 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. «На внезапное предложение Жана-Луи помочь им в разработке ком-

пьютера на базе нового чипа я с радос-тью согласился», – вспоминает он.

Таким образом, BeBox обзавёлся новым «сердцем», вернее, двумя. Пер-вые версии BeBox содержали пять про-цессоров – два Hobbit-чипа и три DSP. Для того чтобы компьютер можно было без проблем перенести на новую архи-тектуру, инженер Глен Адлер добавил в старые прототипы плату с ещё дву-мя процессорами PowerPC, доведя, та-ким образом, общее количество чипов в системе до семи штук. Позднее, ког-да программисты Be Inc. перенесли ос-новной код BeOS на новую архитекту-ру, старые процессоры и DSP оконча-тельно канули в Лету (рис. 3).

Позже новый инженер Be Inc., Джо-сеф Палмер, в одиночку занялся до-водкой BeBox до финального состо-яния. Им была разработана мате-ринская плата, основанная на спе-цификации PReP. В то же самое вре-мя, из-за недостатка средств, Палме-ру пришлось использовать стандар-тную подсистему ввода/вывода, ана-логичную той, что была на обычных персональных компьютерах из мира Windows.

С «лёгкого языка» Джо Палме-ра BeBox обзавелась своим назва-нием. Вот что он сказал по этому по-воду в одном из интервью: «Первые прототипы компьютера на базе про-цессоров Hobbit и DSP-чипов называ-лись просто Be-1. Когда пришёл черёд PowerPC, машины именовались Be-2, или BeBox. Со временем второе назва-ние прочно прилипло к нашим прототи-

Рисунок 3. Внешний вид BeBox

87№12, декабрь 2005

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

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

Триумф BeBoxКонец 1994 года мог стать концом ком-пании Be Inc: 9 миллионов долларов компании иссякли, а разработка ком-пьютера только подходила к своему за-вершению. Ещё минимум год ушёл бы на то, чтобы довести «до ума» операци-онную систему. Жан-Луи Гассе принял решение найти для компании нового владельца. Его взор обратился к быв-шему работодателю – Apple. В недрах «яблочной» компании в то время разра-батывалась операционная система под кодовым названием Copland, призван-ная заменить стремительно устарева-ющую MacOS 7.x.

«Финансовых средств у нас не ос-талось, и мне пришлось пригласить на встречу руководителя Apple Майкла Шпиндлера, чтобы поговорить с ним о возможности покупки Be Inc.», – вспо-минает Гассе. К сожалению, встреча за-кончилась, не принеся никакого резуль-тата. Но Гассе никогда не забудет слов, произнесённых Шпиндлером на проща-ние: «Тебе, наверное, спится лучше, чем мне». «Я помню этот момент, поскольку Шпиндлер всегда очень хорошо пред-чувствовал опасность», – говорит Гас-се. Apple была на краю пропасти: проект Copland разросся до невероятных раз-меров и превратился в «неповоротли-вый Титаник», готовый в любую мину-ту пойти ко дну от внезапного столкно-вения с айсбергом.

Неудача попытки продажи Be Inc. за-ставила Гассе готовиться к единствен-ному выходу – публичной демонстрации BeBox потенциальным инвесторам в на-дежде привлечь хоть какие-нибудь де-нежные средства для продолжения про-екта. Данное событие должно было со-стояться на выставке Agenta’95.

Специально для будущей выстав-ки Стив Сакоман подготовил презен-тацию, демонстрировавшую обработ-ку на BeBox восьми AVI-видеофайлов и трёхмерной графики (Жан-Луи Гассе хотел лицензировать у Apple технологию QuickTime, но цена в 5 млн. долларов оказалась для Be Inc., ещё не выбрав-шейся из «долговой ямы», просто непо-мерной). Всё это работало одновремен-но и без какого-либо торможения.

Один из журналистов, присутство-вавших в тот памятный день на выстав-

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

Удержаться на волне успехаВыставка Agenta’95 принесла Be Inc. дополнительные инвестиции на сумму 6 млн. долл. (одним из инвесторов стал известный разработчик суперкомпью-теров Сеймур Крей), которые позволи-ли компании доработать BeBox до со-стояния полной готовности и 3 октяб-ря начать отгружать компьютеры пер-вым заказчикам. В то же время рабо-та над совершенствованием BeOS про-должалась.

До апреля 1996 года компанией было выпущено семь тестовых версий системы (так называемые Development Release), каждая из которых добавляла в ОС новые возможности, а также улуч-шала уже существующие. Та же BeOS DR7 могла «похвастаться»: поддержкой 32-битного цвета, новой файловой сис-темой BFS, виртуальными Рабочими столами, а также улучшенными сете-выми возможностями.

По словам Жана-Луи Гассе, внача-ле BeOS необходимо было набрать ми-нимальную «критическую массу» про-грамм, для чего компьютеры BeBox по-падали, в основном, в руки програм-мистов, поражённых демонстрацией

возможностей компьютера и ОС и же-лающих начать разрабатывать для неё новое ПО. Кроме того, 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 млн. долл.),

88

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

поэтому переговоры, дливши-еся на протяжении полугода, ни к чему не привели.

Тем не менее, убедив-шись в полном крахе проек-та Copland, в 1997 году, пос-ле покупки за 430 млн. долл. Стива Джобса и его компании NeXT Inc., Apple объявит о на-чале разработки новой опе-рационной системы под ко-довым названием Rhapsody на базе ОС NEXTSTEP.

5 августа 1996 года из недр Be Inc. вышли сразу два новых продукта. Первым из них был новый BeBox, в основу которо-го были положены те же PowerPC 603e, работавшие, правда, на частоте 133 МГц. Также был немного изменён цвет корпуса. В остальном новый компьютер полностью копировал своего старшего собрата, правда, стоил уже 2995 у.е.

Вместе с новым BeBox свет увиде-ла и новая версия BeOS, DR8 (рис. 4). Из улучшений стоит отметить появив-шуюся библиотеку 3D Kit, позволявшую разработчикам наделить свои прило-жения интерактивной трёхмерной гра-фикой; библиотеку Game Kit, обеспе-чивавшую прямой доступ к графичес-кому адаптеру компьютера; встроен-ную в файловую систему возможность работы с электронной почтой; новый веб-браузер NetPositive; новые элемен-ты графического интерфейса, а также расширенную поддержку аппаратного обеспечения: более ёмкие винчестеры, устройства для порта GeekPort, а так-же джойстики.

Дабы довести число анонсов за день до заветной цифры «3», Be Inc. 5 августа выпустила пресс-релиз, в котором объ-явила о лицензировании у Silicon Graphics Inc. графического API OpenGL, а также планах по его интеграции в BeOS.

Параллельно с развитием BeBox Гас-се налаживал отношения с производи-телями Mac-клонов, дабы те поставляли BeOS со своими компьютерами. 26 но-ября 1996 года Power Computing стала первой компанией, лицензировавшей BeOS. В скором времени за ней после-довали DayStar, Motorola и UMAX.

Наполеоновским планам Жана-Луи Гассе продать в 1996 году 10 тысяч, а в 1997-м – 100 тысяч BeBox не сужде-но было сбыться. К тому же лицензи-рование BeOS производителям клонов

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

В Интернете можно найти фотогра-фии прототипа четырёхпроцессорного BeBox, создававшегося в 1996 году, но так и не доведённого до конца. По сло-вам Джо Палмера, причин, послужив-ших приостановлению разработки, всего две. Первая: альянс AIM (Apple, IBM, Motorola) забросил дальнейшее развитие PowerPC 604 в пользу ново-го PowerPC 750 (известного также как G3), не предназначенного для исполь-зования в многопроцессорных конфи-гурациях. Вторая: у Be Inc. возникли трудности с получением различной ин-формации относительно архитектуры чипов из недр AIM, за что стоит сказать отдельное «спасибо» Apple.

В результате разработка четырёх-процессорного BeBox затянулась. Пос-кольку в то время наибольшее вни-мание публики было уделено работе BeOS на компьютерах Power Macintosh и его клонах, Be Inc. 30 января 1997 го-да объявила о прекращении выпуска собственных компьютеров и концен-трации исключительно на дальней-шем совершенствовании операцион-ной системы.

Специально для Mac-клонов Be Inc. выпустила BeOS Preview Release 1 и 2, ставшие первыми «публичными» вер-сиями операционной системы.

Так, PR1 принёс в BeOS обновлён-ную файловую систему BFS, ставшую 64-разрядной, программный режим ус-корения OpenGL, новую интерфейсную оболочку под названием Tracker. На до-лю PR2 можно записать: обновлённый

Tracker, улучшенный стек TCP/IP, а также расширенный лис-тинг поддерживаемого аппа-ратного обеспечения.

На конференции BeDevCon, проходившей в начале мая 1997 года и ознаменовавшей-ся выходом BeOS PR1, Эрик Рингвальд также объявил о планах компании интегри-ровать виртуальную машину Java в первую полноценную версию BeOS (v 3.0), выход которой был намечен на вес-ну 1998 года. В то же время компания Metrowerks пообе-щала дальнейшее улучше-

ние Java в своём пакете для разработ-ки CodeWarrior.

Дела у Be Inc. шли довольно непло-хо: более 500.000 распространённых копий BeOS, налаженные партнёрские отношения с производителями клонов Macintosh, увеличивающееся с каж-дым днём количество разработчиков ПО для операционной системы (на мо-мент выпуска BeOS PR2 – 4400), а так-же появление первых «серьёзных» про-грамм, таких как: VirtualMac (эмулятор MacOS 7.x), BeatBox (музыкальный ре-дактор), LRDraw (графический век-торный редактор), Be Basics (тексто-вый процессор и редактор электрон-ных страниц)…

Не жди беды, она сама к тебе при-дёт. Через некоторое время после того, как Apple приобрела NeXT Inc., Джил Амелио, сместивший Майкла Шпин-длера с поста управляющего компа-нией в начале 1996 года, был отправ-лен в отставку, а его место занял Стив Джобс, назначенный «временным» уп-равляющим.

Буквально сразу же после это-го Джобс приостановил производство КПК Newton, а также за пару месяцев «сдал в утиль» практически весь ры-нок производителей клонов Macintosh, аннулировав либо принудительно вы-купив их лицензии. Be Inc., оставшись без партнёрской поддержки, а также их компьютеров, очутилась в облике «наездника без коня». Жану-Луи Гас-се пришлось искать выход из сложив-шейся ситуации. Результат не заста-вил себя ждать.

Редактор рубрикиКирилл Тихонов

Рисунок 4. BeOS DR 8 для BeBox на базе процессоров PowerPC

89№12, декабрь 2005

содержание журнала за 2005 год

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

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

и крупных компаний Роман Марков №4

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

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

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

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

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

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

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

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

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

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

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

FreeBSD tips: какими возможностями обладает ftpd

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

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

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

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

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

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

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

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

Linux Xinerama: один монитор хорошо, а много – лучше

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

Linux из Редмонда: обзор Lycoris Desktop/LX

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

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

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

Кирилл Сухов №6

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

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

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

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

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

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

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

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

Scientific Linux – выбираем решение корпоративного

уровня по цене носителя Андрей Маркелов №10

Slackware на ракетном топливе, или

Обзор VectorLinux 5.0.1 SOHO Сергей Яремчук №4

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

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

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

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

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

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

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

и прокси-серверов Роман Марков №8

Автоматизация MS Windows, или AutoIt как мечта

эникейщика. Часть 1 Алексей Барабанов №4

Автоматизация MS Windows, или AutoIt как мечта

эникейщика. Часть 2 Алексей Барабанов №5

Автоматизация MS Windows, или AutoIt как мечта

эникейщика. Часть 3 Алексей Барабанов №6

Автоматизация MS Windows, или AutoIt как мечта

эникейщика. Часть 4 Алексей Барабанов №7

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

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

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

Иван Коробко №7

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

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

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

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

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

Базовая настройка маршрутизатора Cisco

начального уровня Андрей Маркелов №4

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

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

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

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

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

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

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

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

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

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

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

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

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

Сергей Жуматий №6

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Евгений Литвиненко №9

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

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

биллинговой системы FreeNIBS Евгений Литвиненко №9

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

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

Иван Коробко №9

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

Юлия Шабунио №5

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

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

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

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

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

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

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

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

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

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

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

90

содержание журнала за 2005 год

Расширяем права доступа в Linux с помощью ACL

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

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

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

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

Решаем нестандартные задачи с помощью

cтандартного Windows Scripting Host Михаил Кошкин №6

Сага о биллинге, или Считаем трафик на FreeBSD

(ng_ipacct + perl+ MySQL). Часть 1 Владимир Чижиков №2

Сага о биллинге, или Считаем трафик на FreeBSD

(ng_ipacct + perl+ MySQL). Часть 2 Владимир Чижиков №3

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

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

Система вещания на основе Windows Media Services 9.

Часть 2 Михаил Платов №5

Системная интеграция – комплексный подход

к самостоятельному решению проблемы Роман Марков №2

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

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

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

Рашид Ачилов №9

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

Рашид Ачилов №10

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

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

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

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

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

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

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

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

Управляем удаленными базами AIDE Рашид Ачилов №8

Управляем удаленными базами AIDE. Часть II – AIDEstart

Рашид Ачилов №9

Ускоряем MS SQL Server Юлия Шабунио №6

Устанавливаем и настраиваем Windows Server

Update Services Сергей Сергеев №7

Устанавливаем связку Postfix + Exchange Владимир Агапов №7

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

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

Что важно знать об IP-телефонии Михаил Платов №5

Чудо-юдо Resource Kit Александр Шибенко №4

Эмуляция при помощи QEMU Сергей Яремчук №3

Эффективно управляем полями пользователей в AD

Иван Коробко №5

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

CD, не подвластный копированию Крис Касперски №8

DansGuardian + ClamAV Андрей Авраменко №7

FreeBSD tips: повышаем безопасность с помощью

одноразовых паролей Сергей Супрунов №6

Linux/BSD как бастион на пути вирусов Крис Касперски №10

Windows Script Host: проводим аудит безопасности сети

Андрей Бирюков №11

Блокируем внешние устройства с помощью

GFI LANguard P.S.C. Сергей Яремчук №10

Все в одном, или Hogwash как пример Gateway-IDS

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

ПРОГРАММИРОВАНИЕ №

Zend Studio 4.0 – новая версия, новые возможности

Евгений Воякин №2

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

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

Все ли возможности ClamAV вы используете?

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

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

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

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

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

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

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

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

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

Денис Батранков №1

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

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

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

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

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

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

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

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

Контролируем безопасность сети с помощью OSSIM

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

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

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

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

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

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

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

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

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

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

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

от вторжений на основе Kerio WinRoute Firewall 6

Роман Марков №1

Проактивные системы защиты, или Есть ли жизнь

без антивируса? Сергей Яремчук №7

Проверяем HTTP-трафик на лету Андрей Маркелов №7

Проверяем защищенность сети и сервисов сканером

DragonSoft Secure Scanner Сергей Яремчук №11

Проводим аудит системы с помощью SNARE

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

Протокол SILC обеспечит вам безопасную конференц-связь

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

Развертываем Heimdal Kerberos Михаил Кондрин №7

Сетевой полицейский Сергей Яремчук №1

Управление безопасностью Internet Explorer

Наталья Мельникова №4

Устанавливаем Symantec Antivirus 9.0 в корпоративной сети

Роман Марков №5

Устойчива ли ваша сеть? Проверьте с помощью WHoppix!

Илья Александров №9

Шифрование данных в Linux – новый взгляд

на аппаратные ключи Александр Похабов №3

91№12, декабрь 2005

содержание журнала за 2005 год

Unformat для NTFS Крис Касперски №2

Восстановление NTFS – undelete своими руками Крис Касперски №1

Обучение при помощи ATutor Сергей Яремчук №1

Свободная информационная система для школ Centre

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

Сервер для школ Сергей Яремчук №4

ОБРАЗОВАНИЕ №

Alpha, или история одной архитектуры Павел Болотов №11

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

интересных операционных систем Алексей Коршунов №10

С чего начинался российский Интернет Алексей Коршунов №9

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

системы BeOS Дмитрий Мороз №12

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

БИЗНЕС-РЕШЕНИЯ В IT №

IT в сфере ресторанно-гостиничного бизнеса

Кирилл Тихонов №8

ИНТЕРВЬЮ №

Agnitum – путь к признанию Роман Марков №10

ALT Linux: третье пришествие. Скоро на экранах

ваших машин Андрей Бешков №6

MiniMo – минибраузер из семейства Mozilla Антон Борисов №11

Историческая неизбежность победы движения

отрытого кода Андрей Бешков №5

Ларри Уолл: «Сегодня Perl применяется для решения ряда

проблем, о которых я и не подозревал, создавая этот язык»

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

ПОЛЕЗНЫЕ СОВЕТЫ №

Системный администратор – ищем дополнительные

источники дохода Роман Марков №6

IMHO №

Размышления о UNIX Сергей Супрунов №6

ХОББИ №

Десять красок неба Наталья Алексютина №11

СКАЗКИ №

Админские сказки. 16 bit edition Алексей Барабанов №8

TCP поверх TCP – не такая уж плохая идея! Алексей Барабанов №12

Протоколы сетей хранения данных.

Часть I – ATA over Ethernet Антон Борисов №9

Строим защищённую беспроводную сеть:

WPA-Enterprise, 802.1x EAP-TLS Андрей Платонов №5

AJAX: заработавший Javascript Вячеслав Родионов №12

JpGraph Кирилл Сухов №1

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

Операции под наркозом Серафим Пикалов №12

Аккуратная настройка SSI Алексей Мичурин №9

Базовая HTTP-авторизация – защита от честных людей

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

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

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

Веб-сервис для разработчиков сайтов Даниил Алиевский №1

Используем ImageMagick в веб-разработке Кирилл Сухов №6

История развития сайтостроения Алексей Моисеев №7

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

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

Кто, куда, зачем пришел, или Анализируем логи

веб-сервера Денис Городецкий №7

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

на одном веб-сервере Павел Малахов №12

Печатаем документы с веб-сервера Дмитрий Острецов №12

Расширения РHP: пять шагов к написанию

Александр Календарев №11

Совершенствуем технологию CMS Алексей Моисеев №8

WEB №

HARDWARE №

Запись дисков CD-R/RW в Linux. Часть 3 Владимир Мешков №1

Запись дисков CD-R/RW в Linux. Часть 4 Владимир Мешков №2

Используем LinuxBIOS на системах VIA EPIA-M

Антон Борисов №8

Как спасти данные, если отказал жесткий диск

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

Модифицируем BIOS Крис Касперски №6

Настраиваем автоответчик на базе Linux Павел Закляков №10

Цифровое небо, или Организуем прием

спутникового вещания Антон Борисов №10

СЕТИ №БД PostgreSQL Владимир Мешков №10

Контролируем и ограничиваем системные вызовы

с помощью systrace Александр Байрак №8

Нити в Perl Алексей Мичурин №1

Программирование на shell в экстремальных условиях

Гаспар Чилингаров №3

Путешествие из Perl в Excel Сергей Супрунов №1

Разрабатываем информационные системы на PHP

методом визуального программирования Евгений Воякин №7

Редактор для создания скриптов: Primal Script 4.0

Иван Коробко №11

Система создания документации POD. Часть 1

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

Система создания документации POD. Часть 2

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

Техника оптимизации под Linux Крис Касперски №2

Техника оптимизации под Linux. Часть 2 – ветвления

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

Техника оптимизации под Linux. Часть 3 Крис Касперски №4

Управляем серверами в реальном времени

с помощью WSH-сценариев Андрей Бирюков №10

92

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

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

Книга по праву считается самой по-пулярной в России, посвященной DB InterBase и FireBird.

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

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

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

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

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

Год издания:

Количество страниц:

ISBN:

Цена:

Книга предоставлена издательством «Питер».

«Питер»

2005

896

5-7502-0064-7

≈ 578 руб.

Мир InterBaseАлексей Ковязин, Сергей Востриковсу полезного. Все содержание хоро-шо структурировано, и материал из-лагается последовательно. Знакомс-тво с 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. Книга остави-ла очень благоприятное впечатление – все четко и все по делу.

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

Год издания:

Количество страниц:

ISBN:

Цена:

Книга предоставлена издательством

«КУДИЦ-ОБРАЗ».

«КУДИЦ-ОБРАЗ»

2006

496

ISBN 5-9579-0105-9

≈ 335 руб.

93№12 декабрь 2005

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

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

Эпиграфом к книге может служить предложение, написанное в предис-ловии:

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

Oracle enterprise manager 101Ларс Бо Вонтинг, Дирк Щепанекми, как правильно делать те или иные вещи».

И с этим нельзя не согласиться, действительно, для человека, толь-ко начинающего осваивать Oracle (а книга для них и писалась), многие тривиальные задачи администриро-вания могут стать самым настоящим кошмаром.

Как ясно из названия, эта книга поможет вам освоить один из инстру-ментов для администрирования DB Oracle – Enterprise manager. После «ос-воения» материала, вы сможете ре-шать, упрощать и автоматизировать основные задачи DBA, и кроме того, научитесь проверять соответствие ап-паратным и программным требовани-ям, устанавливать и конфигурировать различные компонены EM, контроли-ровать цели при помощи системы со-бытий, функции планирования зада-ний, создавать собственные отчеты,

а также выполнять административ-ные задачи с консоли EM.

Авторам (надо заметить, что это специалисты с большим опытом ра-боты) удалось описать все основ-ные задачи DBA и способы их ре-шения в столь небольшом по объ-ему тексте.

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

В общем, отличный выбор для тех, кто только начинает (или собирается начать) работать с DB Oracle.

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

Год издания:

Количество страниц:

ISBN:

Цена:

«Лори»

2005

381

5-85582-230-3

≈ 456 руб.

Приемы объектно-ориентированного проектированияЭрих Гамма, Ритчард Хелм, Ральф Джонсон, Джон Влиссидесграммисты ищут методы увеличения степени повторного использования своих наработок, прибегая зачастую к нетривиальным схемам и изобретая очередной «велосипед». Как избежать всего этого и начать использовать тех-нологии паттернов, вы можете узнать, прочитав книгу. Прочитав первую гла-ву, вы поймете основные концепции использования паттернов. Основной круг рассмотренных вопросов: пат-терны проектирования в схеме MVC в языке Smalltalk, описание и каталог паттернов, организация каталогов. Также рассмотрены такие важнейшие вопросы, с которыми столкнется каж-дый разработчик, начавший исполь-зовать паттерны, – как решать зада-чи проектирования, как правильно вы-брать и использовать паттерн. Вторая глава носит исключительно практичес-кий характер, в качестве примера, –

проектирование WYSIWYG-редактора документов. Порождающие паттерны (Abstract factory, builder, factory method, prototype, singleon) рассмотрены в тре-тьей главе. Структурным паттернам также посвящена отдельная часть. Обо всех этих и некоторых других паттер-нах вы узнаете из главы «Паттерны поведения». В заключение книги ав-торы делятся своими мыслями и иде-ями о развитии технологий паттернов. Так же рассмотрены проектировщики паттернов. Книга несомненно должна быть на полке у каждого уважающего себя программиста.

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

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

Год издания:

Количество страниц:

ISBN:

Цена:

Книга предоставлена издательством «Питер».

«Питер»

2006

366

5-272-00355-1

≈ 230 руб.

94

подписка на 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

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

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

95№12, декабрь 2005

подписка на 2006 год

Стоимость подписки через редакцию:

900* руб.за 6 номеров

1800* руб.за 12 номеров

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

Для юридических лиц: Отправьте заявку по факсу (095) 928-82-53 или по e-mail:

[email protected]. Укажите наименование и банковские реквизиты своей

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

Для физических лиц: Заполните нижеприведенную квитанцию, оплатите в лю-

бом банке и пришлите в редакцию копию с отметками банка.

После поступления платежа редакция начнет отправ-лять вам номера.

* Включая НДС и почтовую доставку

№5(30) май 2005

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

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

Ищем причины

Строим защищенную беспроводную сеть:

WPA-Enterprise, 802.1x EAP-TLS

Настраиваем UPS под Linux

Как восстановить

удаленные файлы под BSD

Что важно знать об IP-телефонии

танавливаем Symantec Antivirus 9.0

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

Эффективно управляем

полями пользователей в AD

Контролируем безопасность сети

с помощью OSSIM

Интервью с Ларри Уоллом –

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

96

СИСТЕМНЫЙ АДМИНИСТРАТОР№12(37), Декабрь, 2005 год

РЕДАКЦИЯИсполнительный директорВладимир ПоложевецОтветственный секретарьНаталья Хвостова[email protected]Технический редакторВладимир ЛукинРедакторАлексей КоршуновВнештатные редакторыАндрей БешковАлексей БарабановКирилл ТихоновКирилл СуховТатьяна ИльченкоСергей Супрунов

РЕКЛАМНАЯ СЛУЖБАтел./факс: (095) 928-8253Дарья Хохловаreс[email protected]

Верстка и оформление[email protected]Дизайн обложкиНиколай Петрочук

По вопросам распространенияобращайтесь по телефону:(095) 928-8253 (доб. 120)

107045, г. Москва,Ананьевский переулок, дом 4/2, стр. 1тел./факс: (095) 928-8253Сайт журнала: www.samag.ru

РУКОВОДИТЕЛЬ ПРОЕКТАПетр ПоложевецУЧРЕДИТЕЛИВладимир ПоложевецАлександр МихалевИЗДАТЕЛЬЗАО «Издательский дом«Учительская газета»

Отпечатано типографиейГП «Московская Типография №13»Тираж 9000 экз.

Журнал зарегистрированв Министерстве РФ по делам печати, телерадиовещания и средств массо-вых коммуникаций (свидетельствоПИ № 77-12542 от 24 апреля 2002 г.).

За содержание статьи ответственность несет автор. За содержание рекламно-го объявления ответственность несет рекламодатель. Все права на опубли-кованные материалы защищены.

ЧИТАЙТЕВ СЛЕДУЮЩЕМНОМЕРЕ:

Уважаемые читатели!

Спешите оформить подпискуна первое полугодие 2006 года!

Приобрести новые и старые номера журналавы можете через интернет-магазины LinuxCenter.ru и Allsoft.ru.

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

DBMail: строим почтовую систему на основе реляционной СУБДПрактически все современные ин-формационные системы, используе-мые для управления бизнес-процес-сами предприятия, построены на ос-нове реляционных СУБД. Почтовая система предприятия – очень важ-ная часть его IT-инфраструктуры, од-нако до сих пор в качестве хранили-ща почтовых сообщений, как прави-ло, используются различные тексто-вые форматы. Нам предстоит постро-ить почтовый сервер на основе СУБД и посмотреть, какие преимущества это даст. И хотя DBMail придется прой-ти еще долгий путь, чтобы заслужить признание и получить такую же попу-лярность, как, например, Courier IMAP или Cyrus IMAP, но уже сейчас видно, что его потенциальные возможности очень широки.

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

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

Представляем EnterpriseDBВ наше время появление из «ниот-куда» новой СУБД уровня предпри-ятия выглядит довольно фантастич-но. Тем более если эта СУБД распро-страняется под открытой лицензи-ей и имеет в своём составе развитые средства администрирования и раз-работки. Впрочем, совсем новым про-дукт компании назвать трудно – он ос-нован на Open Source-базой данных. PostgreSQL, но существенно расши-ряет её возможности, добавляя но-вые возможности и наращивая про-изводительность. В статье будет рас-сказано об особенностях EDB и нача-ле работы с ней .

Судьба shell-кода на системах с неисполняемым стеком, или Атака на DEPОтчаявшись справиться со своими же собственными ошибками, компания Microsoft совместно с Intel и AMD ре-ализовала технологию DEP, призван-ную покончить с удаленными атаками раз и навсегда, но этого не произош-ло, и защиту удалось обойти...