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

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

№5(30) май 2005


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

СЬ
www.samag.ru

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

Ж ПИ
Строим защищенную беспроводную сеть:
ЗА ДНИ

WPA-Enterprise, 802.1x EAP-TLS


НУ

РА КУ
Настраиваем UPS под Linux
ЛЫ ГО

ТИ РАС
Как восстановить
удаленные файлы под BSD
К У ВО

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

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

О
танавливаем Symantec Antivirus 9.0
НИ НО

ТР
в корпоративной сети
Эффективно управляем

С
подписной индекс 20780
полями пользователей в AD

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

Интервью с Ларри Уоллом –


создателем языка Perl
www.samag.ru

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


инвентаризацию

И
ЬГ
ЬД О
РА СКА
ТЕ
К

ИС НН
ЕН
установленного софта
УС

БО
НА ТПУ

ИЛ ДА
ТП

НЧ ЖИ
ВО

РА Е О

КО НЕО
АВ СЛ
Л

Л
ХА

ПО

Мультизагрузка:
УЕ

ЗА
стелим соломку
Так видит журнал читатель, оформивший подписку: Архитектура современных
№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
Интервью с Ларри Уоллом –

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


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

Настраиваем
Cisco PIX Firewall 520
Размещаем несколько сайтов
на одном веб-сервере

ПОДПИШИТЕСЬ И ЧИТАЙТЕ! PHP: делаем отладку


на стороне клиента
№12(37) декабрь 2005

Роспечать – 20780, 81655 TCP поверх TCP –


Пресса России – 87836 не такая уж плохая идея!
Интер-почта – тел. (095) 500-00-60
оглавление
ТЕНДЕНЦИИ 52 Настраиваем Cisco PIX Firewall 520
для трансляции соединений между сетями
2 Взгляд на будущее от Microsoft Пример типовой схемы, часто используемой в неболь-
Обзор самых интересных моментов прошедшей в Мос- ших сетях. Малик Абдугалыев
кве седьмой ежегодной конференции Microsoft – «Плат- malik@elcat.kg
форма 2006. Определяя будущее».
Максим Востренков WEB
Кирилл Сухов
geol@altertech.ru 58 Печатаем документы с веб-сервера
Реализация решения с помощью Open Office.
АДМИНИСТРИРОВАНИЕ Дмитрий Острецов
dimon@ost.pp.ru
6 Как эффективно провести
инвентаризацию установленного софта 63 Многоликий Apache. Размещаем
Используем WSH-сценарии и групповые политики несколько сайтов на одном веб-сервере
Active Directory для сбора информации о приложениях, Установив Apache и предоставив через него на всеоб-
установленных на клиентских машинах. щее обозрение свой сайт, многие и не подозревают, ка-
Андрей Бирюков ким мощным инструментом они владеют.
mex_inet@rambler.ru Павел Малахов
24pm@mail.ru
12 Контролируем события с помощью
EventSentry 66 AJAX: заработавший Javascript
Возможности утилиты EventSentry, позволяющей про- Большие амбиции технологии Ajax.
водить мониторинг событий и вовремя реагировать Вячеслав Родионов
на возникающие проблемы. Сергей Яремчук bepcyc@gmail.com
grinder@ua.fm
70 PHP: делаем отладку на стороне клиента,
14 Мультизагрузка: стелим соломку или Операции под наркозом
Как избежать проблем с загрузкой и загрузочными Исправляем ошибки на работающей системе.
секторами? Сергей Супрунов Серафим Пикалов
amsand@rambler.ru pikalov_s_s@mail.ru

22 Круговорот почты в сети, СЕТИ


Или Архитектура современных почтовых
систем 76 TCP поверх TCP
Общая картина работы сервисов электронной почты. Не такая уж плохая идея!
Евгений Прокопьев Алексей Барабанов
eugene_prokopiev@mail.ru alekseybb@mail.ru

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


Развитие спамерских технологий, общее состояние
спама на 2005 год и прогнозы на будущее. РЕТРОСПЕКТИВА
Алексей Коршунов
akeeper@akeeper.ru 84 Сломленная, но не сдавшаяся:
история операционной системы BeOS
36 IСQ: разрешить нельзя запретить Взрыв сверхновой звезды – так можно было охаракте-
Если вы сомневаетесь, где правильнее в заголовке пос- ризовать появление на рынке в 1996 году компьютера
тавить запятую, то эта статья для вас. BeBox и операционной системы BeOs.
Павел Закляков Дмитрий Мороз
amdk7@mail.ru akuji@list.ru

БЕЗОПАСНОСТЬ 89 СОДЕРЖАНИЕ ЖУРНАЛА ЗА 2005 ГОД


45 Защищаем электронную почту КНИЖНАЯ ПОЛКА
средствами MailScanner
Какие возможности предлагает мощная и надежная 92 Обзор книжных новинок
система MailScanner. Сергей Яремчук Александр Байрак
grinder@ua.fm x01mer@pisem.net

Летим скорее
Лучше каждому Информация
Оформили на почту!
получать отдельный о подписке
подписку! экземпляр журнала на 94 стр.
Принес номер
Мужики, Почему я до сих пор на работу, И у меня А можно ещё Как же я без
Я забыл
где журнал этого не сделал?! «увели» почитать такая же беда успеть? любимого журнала?
подписаться!
взяли?

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


тенденции

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

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

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

2
тенденции
ложений. По сути это служба очере- седских запросов. Что нам даст пере- ботать со старыми версиями клиента.
ди сообщений. Что она дает? Приведу ход на использование Service Broker? Плюс – цена компьютера для сервера-
пример, показанный на лекции, немно- Microsoft SQL Server 2005 выпускает- агента гораздо ниже цены внешнего
го его расширив. Предположим, на- ся в нескольких лицензиях, одна из ко- дискового накопителя для организа-
ша фирма – туроператор и занимает- торых, Express, – бесплатная. В случае ции кластера.
ся продажей туров. При продаже тура ее использования нам достаточно пос-
нам надо зарезервировать билет и за- тавить в филиалах этот самый MS SQL Business Intelligence
бронировать место в гостинице. Теперь Server 2005 Express и развернуть на Business Intelligence – это целая плат-
на наш сервер поступает сообщение нем Service Broker, который будет за- форма для работы с разнородными
от клиентского приложения о необхо- ниматься приемом сообщений от кли- данными. Она базируется на трех ки-
димости оформить тур в Иваново. Сер- ентского приложения и переправкой тах от Microsoft – Integration Services,
вер отсылает сообщение в авиакомпа- их на основной сервер. Никаких про- Analysis Services и Reporting Services.
нию о резервировании билета и в ива- стоев, поскольку все работают с ло-  Integration Services – службы
новскую гостиницу о бронировании кальным сервером. И главное – ника- и н те г р а ц и и. Ес л и р а з о б р ат ь -
номера. От авиакомпании приходит ких затрат. ся, это новая версия DTS (Data
подтверждение брони, а от гостини- Transformation Services). Но, по уве-
цы – ответ о том, что мест нет. В этом Data Mirroring рениям Microsoft, весь код был пе-
случае у нас есть 2 варианта – отме- Data Mirroring – новая технология отка- реписан с чистого листа. Что дейс-
нить бронь на билет или попытаться зоустойчивости, которая сродни старо- твительно нового? Да по сути – все.
забронировать номер в другой гости- му доброму режиму репликации Log Теперь при написании сценария им-
нице. Вся прелесть данной технологии Shipping. Однако есть некоторые раз- порта или экспорта данных можно
заключается в том, что мы можем все личия. Использовать ее можно в двух воспользоваться всей мощностью
это реализовать на стороне сервера, вариантах – поддержка копии базы платформы .NET, что дает поисти-
то есть абсолютно не вдаваясь в под- в реальном времени или некоторая за- не безграничные возможности.
робности работы клиентского прило- мена кластера.  Analysis Services – службы анали-
жения и не вмешиваясь в нее. Рассмотрим оба. тики. Данная компонента являет-
Второй плюс данной технологии – В первом случае нам достаточ- ся продолжением развития служб
распределение нагрузки. Допустим, но иметь 2 сервера. При изменении OLAP (On-Line Analytical Processing)
у нас есть группа серверов, выполня- данных на одном из серверов клиент- SQL Server 2000. Рассказать про ее
ющих одни и те же задачи. В этом слу- ским приложением такая же команда отличия от OLAP в SQL 2000 на се-
чае сообщение, попавшее в очередь, отправляется на выполнение второ- годняшний момент нам не пред-
отправляется на случайно выбранный му серверу. Чем это хорошо? Да хо- ставляется возможным по баналь-
сервер из группы, что дает примерно тя бы тем, что в качестве второго сер- ной причине отсутствия опыта ра-
равномерное распределение нагрузки вера можно использовать гораздо бо- боты с ней. Надеемся, что скоро
между серверами. лее слабую машину, потихоньку коман- этот опыт появится. Стоит упомя-
Третье – гарантии. Служба Service ды обработаются и никуда не денутся. нуть, что выступавшие разработ-
Broker гарантирует 100% доставку со- Зато у нас всегда будет актуальная ко- чики были ей очень горды. Осо-
общений. Даже если по каким-то при- пия данных. бенно приятно то, что руководите-
чинам сообщение доставить не уда- Теперь второй вариант. В отли- лями разработки данного направ-
лось, будут предприниматься попыт- чие от первого здесь нам понадобит- ления в Редмонде являются быв-
ки отправить его снова до тех пор, по- ся еще и сервер-агент. Выполнение шие наши соотечественники – вы-
ка результат не будет достигнут. Вдо- команд происходит следующим об- ходцы из СНГ.
бавок к этому большие сообщения разом: команда поступает на сервер-  Reporting Services – службы от-
служба сама разбивает на более мел- агент, он пересылает ее на первый четности. Никакой информации об
кие и передает порциями, что в усло- сервер, первый сервер дублирует ее этих службах на конференции нам
виях российских каналов связи игра- на второй сервер, параллельно выпол- не дали, поэтому рискнем предпо-
ет немалую роль. няя ее сам, второй сервер выполняет ложить, что это прямое развитие
Четвертое – стоимость. Допустим, команду и отправляет первому серве- SQL 2000 Reporting Services, кото-
у вас есть основной офис, в котором ру подтверждение, первый сервер за- рое являлось отдельным продук-
стоят серверы, а также несколько фи- канчивает выполнение команды и ра- том, а теперь он просто интегри-
лиалов, территориально удаленных портует серверу-агенту об удачном рован его в сервер.
друг от друга. У вас есть некоторое выполнении. Что мы от этого выигры-
приложение, которое работает с ва- ваем? Сервером-агентом может слу- Доклады
шим сервером, к примеру, просто ре- жить любой самый дешевый совре- Представление Visual Studio 2005 на-
гистрирует покупки и списывает товар менный компьютер, но тем не менее чалось докладом Дмитрия Никонова
со склада. Также имеются некие «ча- это тоже расходы. Зато в случае выхо- и Анатолия Смолянинова о новом инс-
сы пик», когда из-за большого коли- да из строя одного из серверов агент трументе разработки – Visual Studio
чества покупок операторы вынуждены автоматически перенаправит запро- Team System. Были рассмотрены и про-
простаивать, ожидая выполнения со- сы на второй. Минус – он не будет ра- демонстрированы на примерах раз-

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


тенденции
личные этапы процесса разработки  Осуществлено автоматическое об- для платформы Microsoft Office System,
и проектирования, от спецификаций новление кэша сервера баз дан- включающее SharePoint v3, Excel Server
и управления исходным кодом до от- ных, используемых в веб-приложе- и Forms Server.
чётности по рабочим заданиям, с ак- нии. Пожалуй, одним из самых полез-
центом на специализацию и распреде- ных и интересных для системных адми-
ленность процесса разработки. С новыми технологиями .Framework нистраторов материалов был доклад
Продолжением стал доклад «Про- 2.0, WinForms 2.0, Windows Presentation «Мониторинг программно-аппаратных
ектирование и разработка корпоратив- Foundation и Application Blocks на при- ресурсов гетерогенных систем». В нём
ных приложений», где речь шла уже мере реальных приложений можно рассматривалось использование тех-
о Visual Studio Team Edition for Software было ознакомиться, слушая доклад нологии Microsoft Operation Manager
Architects. Это первый из узлов, состав- Ивана Бодягина и Андрея Корявчен- (MOM) для осуществления проектив-
ляющих будущее решение под назва- ко «Технология создания клиентских ного мониторинга серверных систем
нием Dynamic System Initiative. Это про- приложений». (не только на базе Microsoft).
ект Microsoft в области создания и под- Опоздавшие на доклад с баналь- Технология MOM, уже реализован-
держки корпоративных информацион- ным названием «Эффективная раз- ная в таких продуктах, как MOM 2005
ных систем. Были рассмотрены воз- работка приложений на базе Microsoft и MOM 2005 Workgroup Edition, также
можности оптимизации процесса раз- Visual Studio 2005» не могли не толь- является частью ранее упоминавше-
работки и внедрения веб-сервисов ко найти свободное кресло, но даже гося проекта Dynamic System Initiative
и распределённых сервисных архи- просто протиснуться в зал. Это и не (DSI).
тектур (SOA) путём верификации про- удивительно – Александром Ложеч- В процессе доклада было проде-
цессов проектирования, проверки ус- киным и Артуром Смоляниновым была монстрировано решение от компании
тановкой в среде разработки на ран- продемонстрирована работа с кодом Quest Software по управлению и мо-
них стадиях жизненного цикла продук- (на примере языка C#). Внимание бы- ниторингу сети, включающей в себя
та, с использованием языка описания ло сосредоточено в основном на ста- Linux, UNIX и Macintosh, рабочие стан-
систем (SDM). тическом анализе и рефакторинге ко- ции посредством Active Directory, с де-
Второй день конференции начался да, а также на полезных приёмах раз- монстрацией выявления и диагности-
с доклада «Разработка веб-приложе- работки приложений. ки проблем в гетерогеной среде.
ний на базе ASP.NET 2.0 и Atlas», в ко- Большой интерес вызвал доклад На следующий день этот доклад
тором Александр Ложечкин и Дмит- «Проект Linq (C# 3.0, VB 10.0)», в кото- был закреплён лабораторной работой
рий Мартынов представили новую ром Дмитрий Никонов рассказал о бу- «Microsoft Operations Manager 2005: мо-
версию платформы для веб-разра- дущем расширении Visual Studio – LINQ ниторинг и анализ производительнос-
ботки – ASP.NET 2.0 и новый инстру- (Language Integrated Query). ти серверов», которая, впрочем, была
ментарий Microsoft для создания ди- Сегодня разработчики использу- очень ограничена по времени и позво-
намических веб-приложений с разви- ют один язык программирования для лила лишь чуть-чуть «пощупать» но-
тым пользовательским интерфейсом – написания исходного кода программы вую технологию.
Atlas. Вообще, ASP.NET 2.0 и её под- и совершенно другой язык, например
держка в MSVS 2005 – это отдельная SQL, для доступа к данным из СУБД. Итоги
большая тема, и осветить её в рамках LINQ позволяет писать запросы к дан- За рамками данного обзора осталось
данного обзора возможным не пред- ным любого формата и обращаться немало интересного – представле-
ставляется. к объектам .NET, данным из XML и ба- ние BizTalk Server 2006, технологии
Нововведения, которые сразу об- зам данных одинаковым способом. Windows Workflow Foundation, Microsoft
ратили на себя внимание: Во время доклада были продемонс- CRM 3.0, доклады партнёров Microsoft
 Отпала необходимость исполь- трированы эффектные приёмы рабо- и многое другое. На всё просто не хва-
зовать Internet Information Server, ты, связанные с уже реализованными тило времени, за два дня ознакомить-
для отладки приложений во вре- возможностями расширения. ся со всей предложенной информаци-
мя разработки. Теперь в состав Cергею Одинцу и Александру Калу- ей было просто невозможно.
Visual Studio входит локальный веб- гину выпала честь представить компе- Стоит отметить – каждому учас-
сервер Visual Web Developer Web тентной публике продукт, находящийся тнику полагался подарок в виде не-
Server. в стадии раннего бета-тестирования, а коммерческих, но полнофункциональ-
 Значительно расширен и система- именно Microsoft Office 12. Со своей за- ных версий Microsoft SQL Server 2005
тизирован набор компонентов го- дачей они справились блестяще, при- и Microsoft Visual Studio 2005. Для чи-
товых блоков и прикладных интер- чём наибольшее впечатление произвёл тателей «Системного администрато-
фейсов. доклад «Первый взгляд на Microsoft ра» это значит, что в ближайших но-
 Реализован механизм использова- Office 12», на котором докладчики ра- мерах журнала появятся предвари-
ния шаблонов. ботали с будущим продуктом, демонс- тельные обзоры возможностей этих
 Значительно облегчена работа трируя уже реализованные пользо- продуктов, а также (благодаря непри-
с ролями пользователей за счёт вательские возможности. Несколько нуждённым разговорам в фойе конфе-
введения нового программного ин- ранее они же представляли Microsoft ренц-зала) некоторые другие небезын-
терфейса – диспетчера ролей. Office 12 Server – серверное решение тересные материалы.

4
тенденции
Sun добавила поддержку PostgreSQL «Web Application Stack» – самая простая редакция, вклю-
в Solaris 10 чающая в себя базовые компоненты веб-сервера (Apache,
Компания Sun Microsystems начинает официальную подде- MySQL, PHP и по просьбе покупателя PostgreSQL). В «Java
ржку PostgreSQL и распространение этой открытой СУБД Web Application Stack» (помимо LAMP) добавлена подде-
в комплекте ПО, поставляемого с ОС Solaris 10. ржка Apache Tomcat, а также дополнительных Java-биб-
Также представители Sun рассказали о намерении ин- лиотек и утилит (Struts, Axis, Hibernate, Ant, Jython и т. п.),
тегрировать в проект OpenSolaris возможность запуска XML-библиотек. В самый «продвинутый» набор («Enterprise
исполняемых файлов для Linux в контейнерах Solaris 10 Java Stack») также входит поддержка полноценного серве-
(без потребности изменять эти файлы). ра Java-приложений, основанного на разработках проекта
Помимо этого в Sun сообщили об успехах в коопера- ObjectWeb JOnAS, сертифицированного по J2EE.
ции с Open Source-проектом Xen, благодаря чему теперь
доступно управление ОС Solaris в виртуальной сервер- Линус Торвальдс рекомендует KDE
ной среде. Отец открытой операционной системы Linux вмешался
Чуть раньше стало известно о появлении уже давно в диалог в почтовой рассылке GNOME, высказав свое от-
обещанной 128-битной файловой системы ZFS в соста- ношение к процессу разработки этой популярной свобод-
ве OpenSolaris. ной графической среды.
Небольшой комментарий Торвальдса, естественно, вы-
Популярность Debian растет звал настоящий шквал отзывов от пользователей, а сооб-
быстрее других щение было следующим: «Лично я просто призываю лю-
По данным Netcraft по состоянию на декабрь, популярность дей переключиться на KDE. Подход проекта Gnome: «поль-
дистрибутива Debian GNU/Linux в среде веб-серверов рос- зователи – идиоты, они смущены функциональностью» –
ла быстрее всех остальных Linux-систем. Общее число веб- это болезнь. Если вы думаете, что пользователи Gnome –
сайтов, работающих под управлением Debian (из опрошен- идиоты, только идиоты и будут пользоваться ею. Я не ис-
ных исследователями), превысило 1,2 миллиона, что в про- пользую Gnome, потому что она в своем стремлении к то-
центном соотношении чуть больше 25%. му, чтобы быть простой, дошла до такого состояния, когда
Среди крупных европейских пользователей Debian в ка- уже не делает того, что я от нее хочу. Пожалуйста, просто
честве основной платформы для хостинга Netcraft выделя- скажите людям использовать KDE. Линус».
ет Komplex, Lycos Europe, Proxad и Deutsche Telecom.
Первое место сохраняет за собой Red Hat – около 34%, Составил Дмитрий Шурупов
а тройку замыкает бесплатная версия Linux той же ком- по материалам www.nixp.ru
пании, но поддерживаемая сообществом – 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 и призваны покрыть нужды пред-
приятий различного уровня.

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


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

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


установленного софта

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

К
ак правило, в сетях большинс- ния проектами и так далее. Или же еще са на установку программного обес-
тва организаций у пользовате- более сложная ситуация: ваша компа- печения. Однако в реальности все об-
лей нет прав на установку прило- ния объединилась с другой, а у той ор- стоит не так хорошо, и администратору,
жений, и на все машины «залит» оди- ганизации корпоративным стандар- особенно в крупной сети, необходимо
наковый образ операционной систе- том антивируса является, к приме- какое-либо программное средство для
мы. Однако даже в таких строго пост- ру, Symantec, а в вашей – Trend Micro, автоматического сбора информации о
роенных сетях рано или поздно возни- и вам необходимо узнать, сколько ли- приложениях. В данной статье для ре-
кает необходимость в установке отде- цензий того и другого программного шения поставленной задачи предла-
льным пользователям программ, кото- продукта необходимо продлить в сле- гается сценарий Windows Script Host,
рые требуются им для работы. Так, на- дующем году. Конечно, идеальным ре- который с помощью групповой поли-
пример, бухгалтерам нужны различ- шением во всех описанных выше си- тики Active Directory будет запускать-
ные конфигурации 1С, а менеджерам туациях было бы четкое документи- ся на клиентских машинах, собирать
нужна определенная система управле- рование сисадмином каждого запро- в текстовый файл информацию об ус-

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

Теоретическая часть
Как известно, информация об установленных в ОС Windows
приложениях хранится в реестре. Точнее, в разделе
HKEY_LOCAL_MACHINE\Software. Если зайти в эту ветвь
реестра, то можно увидеть подразделы, которые содержат
информацию об установленных приложениях, в частности,
название каждого подраздела соответствует установлен-
ному приложению. Конечно, можно собирать информацию
о приложениях отсюда, однако это не самый лучший вари-
ант, так как в этой ветке реестра также содержится много
служебной информации, которая может существенно ос-
ложнить сбор данных и в конечном итоге замедлить ра-
боту системы. Гораздо удобнее воспользоваться веткой
HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall. Рисунок 1. Содержимое ветки реестра Uninstall
Как парадоксально это ни выглядит, но каждое приложе- Set objNetwork = CreateObject("WScript.Network")
Set CheckDrive = objNetwork.EnumNetworkDrives()
ние после установки прописывает свои данные в эту вет- objNetwork.MapNetworkDrive "X:", "\\10.0.1.5\share"
ку реестра. Причем все данные содержат несколько обя-
зательных полей, например поле DisplayName, с помощью А отключить сетевой диск можно с помощью команды:
которого мы и будем идентифицировать приложения, уста-
новленные в системе. На рабочей машине это может вы- Листинг 2. Отключение сетевого диска
глядеть, например, вот так (см. рис. 1). WScript.Sleep 3000
Таким образом, для того чтобы собрать информацию objNetwork.RemoveNetworkDrive CheckDrive.Item(0), true
об установленных в системе пользовательских приложе-
ниях, необходимо обойти значения ветки реестра Uninstall Обратите внимание на то, что операционная система
и получить содержимое параметра DisplayName. Этот пара- не всегда может подключить сетевой диск и практически
метр является обязательным для записей об установленных сразу его отключить, иногда на это требуется определенное
приложениях данной ветки и содержит значение строково- время. Для решения данной проблемы используется коман-
го типа, которое удобно сохранять в текстовом файле. Ес- да WScript.Sleep, которая останавливает работу сценария
ли параметр ветки Uninstall не содержит поля DisplayName, на N/1000 секунд. В данном случае указаны три секунды.
то значит это не установленное приложение, а какая-то слу- Конечно, если в вашей сети уже используются сете-
жебная информация, и заносить эти данные в отчет не тре- вые диски или после подключения сетевого ресурса вам
буется. Таким вот довольно простым способом можно соб- не нужно отключать его (так как он может использовать-
рать необходимую нам информацию. ся еще для каких либо целей), то вы можете не использо-
Итак, рассмотрев теоретические аспекты написания дан- вать данные команды и сразу перейти к написанию сцена-
ного сценария, перейдем к практической части. Исходный текст рия, описанного ниже.
сценария, который был взят за основу, можно найти по адре- Ключевым моментом нашего сценария является цикл,
су http://www.computerperformance.co.uk/ezine/ezine63.htm. обходящий ветку реестра Uninstall:

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


Для программной реализации поставленной задачи мы unKeyPath = "Software\Microsoft\Windows\CurrentVersion\Uninstall"
традиционно воспользуемся WSH-сценарием, написан- unValueName = ("DisplayName")
objReg.EnumKey HKLM, unKeyPath, arrSubKeys
ным на языке VBScript. Все собранные данные будем со- i=0
хранять в текстовом файле, название которого будет со- For Each Subkey in arrSubKeys
objDictionary2.Add i, unKeyPath & "\"& subkey & (Enter)
стоять из имени компьютера, на котором выполнялся сце- i=i+1
нарий. Так как сохранять файлы с результатами на локаль- Next
………………………
ных дисках клиентских машин, а потом забирать их оттуда For Each objItem in objDictionary2
вручную – решение не самое удачное, особенно в больших strKeyPath = objDictionary2.Item(objItem)
objReg.GetStringValue HKLM ,strKeyPath, unValueName, strValue
сетях, то мы должны подготовить на сервере сетевую пап- 'сохраняем нужное значение в файл
ку, с правами на запись для администратора. А наш сце- objTextFile2.WriteLine (strValue)
If Err Then
нарий должен уметь подключать эту папку в качестве се- objDictionary2.Remove(objItem)
тевого диска, сохранять туда файлы с результатами и за- End If
Next
тем отключать. Сделать эти простые действия можно с по-
мощью следующих команд VBScript: Теперь остается лишь оформить полученные данные
должным образом (то есть добавить информацию об име-
Листинг 1. Подключение сетевого диска ни пользователя, имени компьютера и времени выполне-
On Error Resume Next ния сценария) и сохранить в файле.

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


администрирование
Для получения информации об имени пользователя userValueName = "DefaultUserName"
objReg.GetStringValue HKLM,pcName,pcNameValueName,pcValue
и названии машины воспользуемся следующими двумя objReg.GetStringValue HKLM,userPath,userValueName, ↵
значениями параметров реестра: userValue

strFileName = UserValue & "_" & "On" & "_" & PCValue ↵
Листинг 4. Ветки, содержащие информацию об имени & "_"& "Software" _
пользователя и имени компьютера & year(date()) & right("0" & month(date()),2) _
& right("0" & day(date()),2) & ".txt"
pcName = "SYSTEM\CurrentControlSet\Control\ ↵
ComputerName\ActiveComputerName\" Set objTextFile2 = objFSO.OpenTextFile(strPath ↵
pcNameValueName = "ComputerName" & strFileName, ForWriting, True)
userPath = "Software\Microsoft\Windows NT\ ↵ objTextFile2.WriteLine(vbCRLF & _
CurrentVersion\Winlogon\" "Current Installed Software " & vbCRLF & Time & vbCRLF ↵
userValueName = "DefaultUserName" & Date _
& vbCRLF & "Software For:" & "" & userValue & vbCRLF ↵
& "On System:" _
В результате работы описанных выше процедур мы по- & "" & pcValue & vbCRLF)
лучаем текстовый файл, в заголовке которого будут имя
For Each objItem in objDictionary2
пользователя, название, дата и время создания. strKeyPath = objDictionary2.Item(objItem)
Приведем полный текст сценария для сбора информа- objReg.GetStringValue HKLM ,strKeyPath, ↵
unValueName, strValue
ции об установленных на компьютере приложениях: objTextFile2.WriteLine (strValue)
If Err Then
Листинг 5. Полный текст сценария objDictionary2.Remove(objItem)
End If
' Объявляем константу HKEY_LOCAL_MACHINE Next
Const HKLM = &H80000002
Const REG_SZ = 1 ' End Sub
Const ForReading = 1 wscript.Quit
Const ForWriting = 2

On Error Resume Next


Set objFSO = CreateObject("Scripting.FileSystemObject") Сбор урожая
Set objDictionary2 = CreateObject("Scripting.Dictionary")
Если в вашей локальной сети менее десяти компьютеров,
Dim objNetwork, objShell, CheckDrive то запуск описанного выше сценария не составит особого
Dim strDriveLetter, strRemotePath, intDrive, bforce
труда. Можно воспользоваться столь любимой всеми сис-
' Данные для сетевого диска темными администраторами программой Remote Admin
strDriveLetter = UCase("x:" ) ' Имя диска
strRemotePath = "\\10.0.1.5\tmp" ' Сетевой путь и удаленно запустить сценарий на каждой клиентской ма-
bforce = true шине. Однако все эти решения требуют от администрато-
Set objShell = CreateObject("WScript.Shell") ров много ручной работы, а это не слишком хорошо. В ори-
Set objNetwork = CreateObject("WScript.Network") гинальной версии сценария [2] предлагалось использовать
Set CheckDrive = objNetwork.EnumNetworkDrives()
' А это уже путь, где будет создан файл с информацией следующую процедуру, которая сначала собирает данные
' о приложениях о машинах в домене, потом пытается запустить сценарий
strPath = "x:\"
strComputer = "localhost" ' Проверяем локальный компьютер на каждом из этих компьютеров.
' Подключаем сетевой диск
objNetwork.MapNetworkDrive strDriveLetter, strRemotePath Листинг 6. Запуск сценария на удаленных машинах домена
' Запускаем процедуру сбора информации
GetInstalledSoftware() Set objPCTXTFile = objFSO.OpenTextFile("c:\test.txt", ↵
' Отключаем сетевой диск ForWriting, True)
If CheckDrive.Item(intDrive) <> strDriveLetter Then ↵ ' Получаем информацию о домене
objNetwork.RemoveNetworkDrive CheckDrive.Item(0), ↵ Set objDomain = GetObject("WinNT://" & strDomain)
bforce ' Интересует объект компьютеры
objDomain.Filter = Array("Computer")
Sub GetInstalledSoftware() For Each pcObject In objDomain
On Error Resume next objPCTXTFile.WriteLine pcObject.Name
Set objReg=GetObject("winmgmts: ↵ Next
{impersonationLevel=impersonate}!\\" & _ objPCTXTFile.close
strComputer & "\root\default:StdRegProv")
If Err <> "0" Then ' Читаем компьютеры из созданного файла
Exit Sub Set readPCFile = objFSO.OpenTextFile(strPath ↵
End If & strPCsFile, ForReading)
i = 0
' Путь к разделу реестра Uninstall, содержащему информацию Do Until readPCFile.AtEndOfStream
' об установленных компонентах strNextLine = readPCFile.Readline
unKeyPath = "Software\Microsoft\Windows\ ↵ objDictionary.Add i, strNextLine
CurrentVersion\Uninstall" i = i + 1
unValueName = ("DisplayName") Loop
readPCFile.Close
objReg.EnumKey HKLM, unKeyPath, arrSubKeys ' Запускаем процедуру сбора информации на каждом компьютере
i=0 For each DomainPC in objDictionary
For Each Subkey in arrSubKeys strComputer = objDictionary.Item(DomainPC)
objDictionary2.Add i, unKeyPath & "\"& subkey & (Enter) GetInstalledSoftware()
i=i+1 Next
Next

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

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

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


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

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


что и файлы, которые мы получили. После запуска данный If i>6 Then
сценарий поочередно открывает каждый из файлов ката- s.Cells(n, 2) = strNextLine
objTextFile2.WriteLine (strNextLine)
лога и экспортирует данные о приложениях в таблицу Excel, n = n + 1
затем производится сбор сведений о количестве установок, End If
Loop
которые также экспортируются в Excel. В результате работы readPCFile.Close
сценария мы получаем книгу Excel, содержащую два лис- End If
Next
та: На первом таблица, состоящая из двух столбцов, – имя objTextFile2.close
компьютера и наименование приложений. f=3
Set objTextFile2 = objFSO.OpenTextFile("c:\temp\tmp", ↵
На втором листе список приложений и количество ус- ForReading)
тановок каждого из них. Do Until ObjTextFile2.AtEndOfStream
strNextLine = objTextFile2.Readline
Далее приводится фрагмент сценария, реализующего ' ищем вхождения имени приложения
все эти действия. Set fc = s1.Columns("A").Find(strNextLine)
If fc Is Nothing Then ' не нашли, тогда добавляем
s1.Cells(f,1)=strNextLine
Листинг 7. Создание документа Excel c результатами Set fc = s.Columns("B").Find(strNextLine)
……………. If Not fc Is Nothing Then
Set s = oE.Sheets(1) ' Лист 1 count=0
s.Name = "Список" With s.Columns("B")
Set s1 = oE.Sheets(2) ' Лист 2 Set c = .Find(strNextLine)
s1.Name = "Сумма" If Not c Is Nothing Then
s.Rows(1).RowHeight = 2 * s.StandardHeight firstAddress = c.Address
s.Cells(1,1) = "Список установленных приложений" Do
s.Cells(2,1) = "Имя компьютера" ' считаем количество установок
s.Cells(2,2) = "Приложения" count=count+1
s.Columns("A:B").Columns.AutoFit Set c = .FindNext(c)
With s.Range("A1:B1") Loop While Not c Is Nothing And c.Address <> ↵
.MergeCells = True firstAddress
.VerticalAlignment = xlCenter End If
.HorizontalAlignment = xlCenter End With
.Font.Size=14 s1.Cells(f,2)=Count ' сохраняем количество установок
End With End If
s1.Rows(1).RowHeight = 2 * s1.StandardHeight f=f+1
s1.Cells(1,1) = "Количество установленных приложений" End If
s1.Cells(2,1) = "Приложение" Loop
s1.Cells(2,2) = "Всего установок"
s1.Columns("A:B").Columns.AutoFit Теперь поставленная перед нами задача по сбору све-
With s1.Range("A1:B1")
.MergeCells = True дений об установленных на клиентских машинах приложе-
.VerticalAlignment = xlCenter ниях решена полностью. Мы получили таблицу Excel, кото-
.HorizontalAlignment = xlCenter
.Font.Size=14 рая содержит сведения о том, какие приложения установле-
End With ны на каждой конкретной машине, а также сведения о том,
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set fso = CreateObject("Scripting.FileSystemObject") сколько установок того или иного приложения имеется в се-
' Получаем сведения о файлах, находящихся в данной папке ти. Лучше всего выполнять описанные выше сценарии ре-
Set fld = fso.GetFolder(".")
Set objTextFile2 = objFSO.OpenTextFile("c:\temp\tmp", ↵ гулярно, с частотой один раз в месяц, для того чтобы всег-
ForWriting, True) да иметь под рукой актуальную информацию об использу-
For Each fi In fld.Files
If fi.name<>"excel.vbs" AND fi.name<>"result.xls" Then емом программном обеспечении.
' Файл сценария и файл отчета не открывать
Set readPCFile = objFSO.OpenTextFile(fi, ForReading)
i = 0 Литература:
s.Cells(n, 1) = fi.name ' Имя файла – это имя компьютера 1. Windows Server 2003. Справочник администратора.
Do Until readPCFile.AtEndOfStream
strNextLine = readPCFile.Readline 2. http://www.computerperformance.co.uk – англоязычный сайт, со-
i = i + 1 держащий множество примеров WSH сценариев, с коммента-
' Первые 6 строк в файлах отчетах – это шапка,
' экспортировать не нужно риями.

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

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


EventSentry

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

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

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

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


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

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

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

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

14
администрирование
Таблица 1. Формат MBR диск может содержать только 4 раз- и передачи ему управления. Именно по
Байты Назначение дела, описанные в MBR (такие разде- такому алгоритму происходит загрузка
0-445 MBR-код лы называют первичными). Для обхо- операционных систем семейства DOS
446-461 Описание 1-го раздела
да этого ограничения используются / Windows 9x.
дополнительные (extended) разделы
462-477 Описание 2-го раздела
(довольно часто можно встретить тер- Загрузочный сектор
478-493 Описание 3-го раздела
мин «расширенный раздел», хотя это В первом секторе раздела, с которого
494-509 Описание 4-го раздела не совсем верно). Первый сектор та- предусмотрена загрузка операцион-
510-511 Сигнатура 0xAA55 кого раздела аналогичен MBR и может ной системы, обычно располагается
содержать описание логического раз- код вторичного загрузчика, а сам сек-
Таблица 2. Формат описателя раздела
дела (диска) и ссылку на следующий тор именуется загрузочным. Он (код)
Байты Назначение
дополнительный раздел. В результате уже должен уметь работать с соответс-
0 Признак активности
несколько дополнительных разделов твующей файловой системой, посколь-
1 Номер головки начала раздела создают своего рода цепочку ссылок. ку в его задачу входит загрузка про-
Номер сектора (биты 0-5) и старшие На рис. 1 показан пример разбиения граммы-«лоудера» (загрузчика 3-й сту-
2 биты (биты 6-7) номера цилиндра начала
раздела диска, поясняющий сказанное. пени) или непосредственно ядра опе-
Младшие биты номера цилиндра нача-
К слову, у логического диска, раз- рационной системы, которые, как пра-
3
ла раздела мещенного на каком-нибудь «дале- вило, являются обычными файлами.
4 Тип файловой системы ком» дополнительном разделе, гораз- Загрузка непосредственно ядра
5 Номер головки конца раздела до больше шансов оказаться недоступ- может использоваться для безуслов-
Номер сектора (биты 0-5) и старшие
ным, т.к. в этом случае мы имеем боль- ной загрузки операционных систем се-
6 биты (биты 6-7) номера цилиндра конца ше секторов, повреждение одного из мейства DOS/Windows 9x, то есть тех,
раздела
которых разорвет всю цепочку. Поэто- где пользователю не предлагается вы-
Младшие биты номера цилиндра кон- му систему старайтесь, по возможнос- бор системы или параметров загрузки
7
ца раздела
ти, инсталлировать на один из основ- ядра, а требуется просто передать уп-
Номер первого сектора раздела
8-11
от начала диска ных разделов. равление ядру системы, размещенно-
12-15 Количество секторов, занятых разделом
В DPT для каждого раздела содер- му в строго определенном месте (что-
жатся его координаты, а также тип фай- бы его не приходилось искать).
Нужно заметить, что существует не- ловой системы и признак активности В более сложных случаях 512 байт
сколько схем разметки жестких дисков, раздела. Активным должен помечать- этого сектора уже недостаточно для
помимо привычного большинству поль- ся только один раздел; о том, зачем это размещения полнофункционального
зователей деления на разделы. Напри- нужно, поговорим чуть позже. кода, и поэтому запускается вспомо-
мер, FreeBSD может быть установлена Координаты раздела записывают- гательная программа – загрузчик яд-
на целый диск без использования таб- ся двумя способами – в виде номеров ра, практически лишенная каких-ли-
лицы разделов (так называемый ре- «цилиндр-головка-сектор» (CHS) нача- бо ограничений дискового пространс-
жим «dangerously dedicated»). Windows ла и конца раздела, а также указани- тва (естественно, в разумных преде-
на платформах Itanium использует схе- ем «линейного» номера первого сек- лах) и способная решать весьма ши-
му GUID Partition Table (GPT) и так да- тора и количества секторов (см. таб- рокий круг задач.
лее. Но в данной статье речь будет ид- лицу 2). Прочтите также врезку «Ска- Рассмотрим в общих чертах ра-
ти о традиционной разметке ATA-дис- зание о 1024 цилиндре», где вопро- боту наиболее популярных загрузчи-
ков, используемой большинством сис- сы геометрии рассмотрены несколь- ков (их подробное описание оставим
тем на платформе i386. ко подробнее. за рамками данной статьи).
Наконец, программный код (в даль-
Что скрывают три буквы – нейшем для него будет использовать- Загрузка в стиле DOS
MBR? ся термин «первичный загрузчик» или Поговорим немного подробнее о том,
Наиболее важный «субъект» проце- «MBR-код»), располагающийся в на- как происходит загрузка систем DOS
дуры загрузки – первый сектор жес- чале первого сек-
ткого диска. Как правило, его обоз- тора диска, в сво-
начают аббревиатурой MBR (Master ем «каноническом»
Boot Record). Упрощенно формат MBR виде предназначен
представлен в таблице 1. для анализа табли-
То есть он содержит код MBR-загруз- цы разделов, поис-
чика, таблицу разделов (disk partition ка в ней раздела,
table, DPT) и сигнатуру, позволяющую помеченного как
распознать данный сектор как загру- активный, загруз-
зочный. ки в память кода
Таблица разделов (64 байта) отво- из первого секто-
дит по 16 байт для описания каждого ра активного раз-
раздела жесткого диска. Очевидно, что дела (boot-сектора) Рисунок 1. Пример разбиения диска на разделы

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


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

А вот в NT все немножко Сказание о 1024 цилиндре боты с диском использует функцию BIOS
сложнее С давних времен умудренные опытом сис- INT13 (которая как раз и руководствуется
В операционных системах этого се- темные администраторы передают сво- CHS-адресацией), просто не сможет «дотя-
мейства используется еще один «пос- им молодым коллегам наказ – не ставить нуться» до раздела, размещенного за ука-
редник» – NTLoader. Эта программа операционную систему за пределами 1024 занным пределом.
позволяет более гибко управлять за- цилиндра. Что же это за магический ци- В современных BIOS используется, как
грузкой, указывая расположение яд- линдр и насколько проблема актуальна правило, расширенное прерывание INT13,
ра системы или передавая управле- в наши дни? позволяющее обойти это ограничение.
ние на другие разделы диска. Ее за- Если посмотреть на структуру табли- В этом случае для доступа к разделу ис-
грузчик (вторичный применительно цы разделов (таблица 2), то будет вид- пользуется преобразование геометрии «на
к процедуре загрузки) устанавлива- но, что при CHS-адресации там отводит- лету» (например, для цилиндра 1800 и го-
ется в boot-сектор активного диска, ся 6 бит для номера сектора, 8 – для го- ловки 16 возвращается «законный» номер
а программа ntldr помещается в корне ловки и 10 – для цилиндра. В результа- цилиндра 900 и головка 32). Кроме того, не-
этого диска, в терминологии Windows те мы получаем естественное (для BIOS) которые менеджеры загрузки способны са-
это диск C: (при этом сама NT-система ограничение на адресуемое пространс- мостоятельно рассчитывать местоположе-
может быть инсталлирована на другой тво: 63 сектора * 256 головок * 1024 ци- ние разделов, основываясь на «линейных»
раздел, включая и логические диски). линдра (те самые) * 512 байт в секторе = координатах, именуемых также LBA – Linear
NTLoader руководствуется в своей ра- 8 455 716 864 байт (диск около 8,4 Гб (как Block Addressing (для указания первого
боте конфигурационным файлом boot. правило, производители винчестеров ис- сектора раздела в DPT отводится 4 бай-
ini (который размещается в корне фай- пользуют «математику» 1 Кб = 1000 байт та, что позволяет адресовать порядка 2 Тб
ловой системы активного раздела, там (а не 1024), что, безусловно, более вы- данных: 232 сектора * 512 байт). Например,
же, где и ntldr). годно по маркетинговым соображениям)). так ведет себя LILO в случае использова-
NTLoader у же умеет работать Код первичного загрузчика, если он для ра- ния опции linear в файле lilo.conf.

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

Особенности именования терминологии разделы именуются слайса- Таблица 3. Обозначения разделов диска
разделов ми (slice), а созданные в них подразделы – Раздел GRUB Linux FreeBSD
Это было бы смешно, если бы не было так собственно разделами (partition). Эти раз- Первый раздел
(hd0,0) hda1 ad0s1
грустно… Каждая система использует свои делы обозначаются буквами (первый раз- на первом диске
наименования разделов, в которых мож- дел первого слайса будет обозначаться Второй раздел
(hd0,1) hda2 ad0s2
но и запутаться. Таблица 3 должна по- как «ad0s1a». на первом диске

мочь вам (приведены лишь некоторые при- Обратите внимание еще на одну осо- Первый раздел
(hd1,0) hdb1 ad1s1
на втором диске
меры, об остальном несложно догадать- бенность – FreeBSD и Linux привязывают
ся). Как видите, FreeBSD и GRUB нумеру- нумерацию раздела к контроллеру и ре- Таблица 4. Соответствие между
обозначением и контроллерами
ют «винчестеры» начиная с нуля, Linux ис- жиму работы диска (таблица 4), в то вре-
Диск Linux FreeBSD
пользует для их обозначения буквы «a», «b» мя как GRUB считает реально присутству-
Primary Master hda ad0
и т. д. Разделы Linux и FreeBSD считают ющие диски. Например, если вы подклю-
Primary Slave hdb ad1
с единицы, в то время как GRUB – с нуля. чите только один диск как Primary Slave,
Кроме того, FreeBSD использует собс- то Linux будет рассматривать его как hdb, Secondary Master hdc ad2

твенную разметку внутри раздела. В ее в то время как GRUB – как (hd0). Secondary Slave hdd ad3

ра, но зато привязали себя (и пользо- ете новое ядро) эти файлы не переза- ма FreeBSD. Четвертый раздел не раз-
вателей) к Linux-разделу. То есть, если писываются, сохраняя оригинальное мечен, поэтому в меню не представ-
вы на свой компьютер с Windows реши- содержимое. А вот если вы пробова- лен. В качестве загрузки по умолча-
те поставить для пробы Linux (с LILO), ли ставить GRUB, затем снова верну- нию (Default) предлагается та система,
а затем по тем или иным причинам за- лись на LILO, то при выполнении вы- которая расположена на активном раз-
хотите его удалить, то после удаления шеозначенной команды вы получите деле. Причем BSD-загрузчик, ко все-
раздела с Linux ваша система потеря- в MBR ваш старый GRUB-код. му прочему, умеет перезаписывать
ет способность загружаться. Но в любом случае потеря возмож- таблицу разделов, отмечая как актив-
Впрочем, это довольно легко обой- ности загружаться не означает поте- ный тот раздел, который был выбран
ти с помощью «организационных» ме- рю операционной системы. Просто вы пользователем. То есть если вы сейчас
тодов, например, размещая каталог должны понимать, что произошло, что- нажмете F1, то загрузится, к примеру,
/boot на отдельном небольшом раз- бы не впадать в панику… Windows 98, и в следующий раз имен-
деле (и проследив, чтобы все нуж- но она будет предлагаться как систе-
ные загрузчику файлы располага- «Самый умный загрузчик» ма по умолчанию.
лись в нем). Разработчики BSD-систем пошли дру- Обратите внимание, что эта спо-
Если же вы не были столь предус- гим путем, и им удалось каким-то чу- собность перезаписывать таблицу раз-
мотрительны и при очередной загруз- дом «втолкать» в 446 байт, оставших- делов может стать источником про-
ке видите на экране одинокое «L», ся в MBR после размещения там таб- блем. Об этом подробно рассказа-
то решить эту проблему несложно: за- лицы разделов и сигнатуры, полно- но далее, при описании использова-
грузитесь с системной дискеты DOS ценный (полноценный в том плане, что ния BSD-загрузчика при работе с не-
или Windows 98 и выполните команду способен предоставить пользовате- сколькими жесткими дисками. При не-
«fdisk /mbr» для записи стандартного лю меню выбора системы только си- обходимости вы можете отключить пе-
загрузчика в MBR вместо LILO. лами MBR-кода) загрузчик (BootEasy). резапись DPT, жестко назначив раз-
Или перед тем, как удалять раз- Он способен проанализировать таб- дел по умолчанию, переустановив
дел, деинсталлируйте LILO следую- лицу разделов и на ее основе предло- BootEasy с помощью команды boot0cfg
щей командой: жить вам меню для выбора загружае- (а заодно и изменив время ожидания
мой системы. Конечно, доступное про- выбора с 10 секунд, скажем, до 30
# lilo -u странство не позволяет заниматься ук- (на самом деле, значение 10 секунд
рашательством, поэтому выглядит ме- выбрано не с потолка, и является хо-
Правда, нужно учитывать, что ню предельно лаконично: рошо сбалансированным, предостав-
восстановление произойдет успеш- ляя пользователю достаточно време-
F1 DOS
но только в том случае, если в систе- F2 ?? ни на реагирование, и в то же время
ме есть файлы с копией MBR до уста- F3 FreeBSD не затягивает чрезмерно «умолчаль-
новки LILO (обычно они располагаются Default: F3 _
ную» загрузку)):
в каталоге /boot с именами boot.XXYY,
например, boot.0300 для MBR первого Из этого примера видно, что загруз- # boot0cfg -o noupdate -s 3 -t 550
диска). Когда вы выполняете коман- чик нашел три раздела: на первом –
ду /sbin/lilo для инсталляции загрузчи- DOS (под это же обозначение попа- Здесь опция -s задает номер разде-
ка, нужные файлы должны создавать- дают и системы Windows 9x), на вто- ла (начиная с 1), который будет исполь-
ся автоматически; при повторных ин- ром – неизвестная загрузчику система зоваться по умолчанию, -t – задержку в
сталляциях (когда вы меняете конфи- (например, так может выглядеть раз- «тиках» (1 секунда примерно соответс-
гурацию загрузчика или устанавлива- дел Linux swap), а на третьем – систе- твует 18 тикам). Будьте предельно ос-

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


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

Использование консоли Ус т а н о в к а н а д и с к в ы п о л н я е т- как следует из названия, перезаписыва-


восстановления ся из папки дистрибу тива командой: ет MBR стандартным кодом (не затраги-
Как ни странно, но системы семейства «winnt32.exe /cmdcons». вая таблицу разделов), вторая – заносит
Windows NT не предоставляют пользова- При следующей перезагрузке вы уви- код вторичного загрузчика в boot-сектор
телю возможность использовать утилиту дите новый пункт в меню NTLoader, вызы- активного раздела.
fdisk или как-то иначе работать с MBR и за- вающий загрузочный образ из места распо- Конечно, консоль, установленная
грузочными секторами. Для этого исполь- ложения файлов консоли восстановления на диске, в случае проблем с загруз-
зуется Recovery Console (консоль восста- (обычно это C:\cmdcons\BOOTSECT.DAT). кой, скорее всего, окажется недоступной.
новления), которую можно проинсталлиро- Загрузившись в консоль, вы сможе- В этом случае воспользуйтесь диском
вать на диск либо использовать непосредс- те выполнить ряд команд, среди которых с дистрибутивом или заранее приготов-
твенно с дистрибутивного CD. интересные нам fixmbr и fixboot. Первая, ленной дискетой.

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

Большая тайна маленькой дискетки Кстати, эта особенность активно используется при созда-
Вы никогда не задумывались, почему дискета, забытая в дис- нии загрузочных (не системных!) дискет в Windows NT/2000/XP –
ководе, прерывает загрузку компьютера с выдачей сообщения при форматировании дискеты в этих системах в boot-сектор поме-
«Non-System disk or disk error»? Казалось бы, если дискета не за- щается свой код (см. рис. 2). Даже без дизассемблирования вид-
грузочная, то BIOS должен просто приступить к опросу следую- но, что он ищет файл ntldr и выдает сообщения об ошибке только
щего по списку устройства… в случае неудачи. Если же ntldr на дискете будет обнаружен, то он
Загрузитесь во FreeBSD или Linux и запишите в файл первый загрузится в память, получит управление, считает boot.ini (его то-
сектор чистой дискеты, только что из коробочки: же следует разместить на дискете), и выполнит загрузку системы
«как положено», даже в случае повреждения кода в MBR.
# dd if=/dev/fd0 of=floppy.bs bs=512 count=1

Откройте его в каком-нибудь hex-просмотрщике (это мож-


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

ка, как и в случае с LILO, будет определяться настройками Загрузившись в Linux (например, с помощью дискеты;
NTLoader (если он имеется). можно воспользоваться и LiveCD-дистрибутивом), сохра-
По цепочке может быть загружена практически любая ните первый сектор раздела hda2 в файл и скопируйте его
система, в том числе и FreeBSD, если такой способ кажет- на Windows-раздел:
ся вам более удобным, чем приведенный выше:
# dd if=/dev/hda2 of=bootsect.lnx
# mount /dev/hda1 /mnt
title FreeBSD # cp bootsect.lnx /mnt
chainloader (hd0,2)+1 # umount /mnt
Кстати говоря, по цепочке можно передать управление
не только на тот или иной сектор, но и на образ сектора, Команды монтирования в этом примере предполага-
сохраненный в файле. Например, если у вас установлены ют, что Windows-раздел у вас описан в fstab. Иначе пот-
системы Windows 98, Windows 2000 и Linux, то Windows 98 ребуется также указать тип монтируемой системы и, воз-
можно загрузить и сразу из GRUB, минуя меню NTLoader. можно, некоторые дополнительные параметры. Данный
Для этого можно использовать такую конфигурацию: фрагмент сработает только в том случае, если на диске C:
вы используете файловую систему FAT.
title Windows 98 В случае NTFS запись возможна, если файл назна-
chainloader (hd0,0)/bootsect.dos
чения уже создан и имеет нужный размер, хотя проще
Файл bootsect.dos уже должен быть на вашем диске C: и безопаснее воспользоваться «посредником», напри-
(именно его использует NTLoader, когда вы выбираете за- мер, дискетой или «флэшкой», для переноса образа на
грузку Windows 9x из меню NT-загрузчика). Если в boot.ini ус- диск C:.
тановить нулевую задержку и в качестве варианта по умол- Далее, перегрузившись в Windows, добавьте в файл
чанию выбрать загрузку Windows 2000, то вы вообще не бу- boot.ini такую строчку (описание в кавычках может быть
дете видеть второе меню, делая выбор загружаемой сис- любым):
темы только в меню GRUB.
C:\bootsect.lnx="SUSE Linux 10.0"
А если я люблю NT?
Приложив некоторые усилия, можно заставить и NTLoader Теперь, при следующей загрузке компьютера, вы обна-
загружать «альтернативные» системы. Как мы уже упоми- ружите в предложенном вам меню новый пункт, выбрав ко-
нали выше, программа ntldr способна передавать управ- торый, попадете в Linux.
ление образу загрузочного сектора, записанному в файл. В случае FreeBSD все еще проще – вам просто нужно
Например, если у вас в hda1 (в терминологии Linux) уста- скопировать файл /boot/boot1 на диск C: под именем, ска-
новлена Windows XP, а в hda2 – Linux, то вы можете проде- жем, bootsect.bsd, и добавить соответствующий пункт в ме-
лать следующее: ню boot.ini.

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


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

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

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

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

Страховка на все случаи жизни


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

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


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

Круговорот почты в сети, или


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

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

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

Text file content

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

Как происходит отправка почтовых


сообщений
После создания сообщения MUA должен передать его MSA
(Mail Submission Agent). В RFC 2476 (Message Submission)
MSA описан как сервис, принимающий клиентские под-
Рисунок 1. Принципиальная схема работы электронной почты ключения на порту 678 по TCP/IP, и выполняющий первич-
и способы взаимодействия между ее основными компонентами
ную проверку почтовых сообщений на соответствие стан-
символов, но также содержит символы из других диа- дартам, авторизацию пользователей и блокирование UCE
пазонов. (Unsolicited Commercial Email – мы привыкли обозначать эту
 base64 – используется для двоичных данных. корреспонденцию словом «спам») еще на этапе отправ-
 8bit – до 998 октетов на строку из диапазона [1..255]\{CR, ки. Затем MSA должен передать письмо MTA (Mail Transfer
LF}. Этот тип кодирования в заголовках почтовых сооб- Agent) – сервису, принимающему клиентские подключения
щений использовать нежелательно, о причинах мы по- на порту 25 по TCP/IP, который, в свою очередь, уже дол-
говорим позже. жен заняться доставкой письма непосредственно адреса-
 binary – произвольная последовательность октетов ту. И в первом, и во втором случае должен использоваться
(фактически отсутствие какого бы то ни было кодиро- протокол SMTP, описанный в RFC 2821 (Simple Mail Transfer
вания). Этот тип кодирования использовать нельзя. Protocol) и RFC 1869 (SMTP Service Extensions), но MUA
и MTA не должны общаться напрямую друг с другом.
Таким же точно образом кодируется тело письма, при На практике отдельных реализаций MSA не существует,
этом кодировка и тип кодирования указывается в заголов- а большинство реализаций MTA способны также выполнять
ках Content-Type и Content-Transfer-Encoding. Вот пример ти- функции MSA. Более того, для MSA практически никогда
пичного почтового сообщения: не конфигурируется порт 678, а все почтовые сообщения
от MUA принимаются непосредственно на порт 25.
Message-ID: <436F19FC.7050901@mail.domain1.com>
Date: Mon, 07 Nov 2005 12:10:20 +0300
Поведение MTA после того, как он получил почтовое
From: User 1 <user1@domain1.com> сообщение от MUA или MSA, зависит от настроек самого
User-Agent: Mozilla Thunderbird 0.6 (X11/20040511) MTA, а также от домена, которому принадлежит почтовый
X-Accept-Language: en-us, en
MIME-Version: 1.0 адрес получателя. В простейшем случае (в отсутствие пос-
To: user2@domain2.com тоянного подключения к Интернету, постоянного реально-
Subject: =?KOI8-R?Q?=F4=C5=D3=D4?=
Content-Type: text/plain; charset=KOI8-R; format=flowed
го IP-адреса и DNS-имени – в сегодняшних реалиях такое
Content-Transfer-Encoding: 8bit происходит довольно редко) MTA вообще не берет на се-
бя ответственность за пересылку письма, а просто отдает
Привет!
ее вышестоящему MTA, который для него является реле-
Тело почтового сообщения может состоять из несколь- ем (relay – MTA, через который производится пересылка).
ких частей (которые используются для передачи вложе- Релей может определить список сетей/хостов и/или спи-
ний, не обязательно текстовых). Вот пример такого сооб- сок логинов/паролей, которым разрешено пересылать че-
щения: рез него свои почтовые сообщения. Домены, обслуживае-
мые релеем, как правило, являются исключением: для них
Message-ID: <436F2097.5060703@mail.domain1.com>
Date: Mon, 07 Nov 2005 12:38:31 +0300
сообщения принимаются от кого угодно.
From: User 1 <user1@domain1.com> Релей, не устанавливающий никаких ограничений на пе-
User-Agent: Mozilla Thunderbird 0.6 (X11/20040511) ресылку почтовых сообщений, называется открытым релеем
X-Accept-Language: en-us, en
MIME-Version: 1.0 (open relay). Все открытые релеи ждет одна и та же участь:
To: user2@domain2.com  Сначала их услугами начинают активно пользоваться
Subject: =?KOI8-R?Q?=F4=C5=D3=D4?=
спаммеры.
Content-Type: multipart/mixed;
boundary="------------070102080309020306010600"  Затем релей попадает в какой-либо черный список,
и все MTA, выполняющие фильтрацию по черным спис-
This is a multi-part message in MIME format.
--------------070102080309020306010600 кам (а их сейчас большинство), перестают принимать
Content-Type: text/plain; charset=KOI8-R; format=flowed от него почтовые сообщения.
Content-Transfer-Encoding: 8bit

Привет! МТА, принимающий на себя ответственность за пере-


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

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


администрирование
сата. В случае отрицательного решения MTA предприни- MUA отправителя ↔ MTA отправителя:
мает попытку найти другой MTA, обслуживающий этот до-
Response: 220 mail.domain1.com ESMTP Postfix
мен. Для этого он с помощью DNS-запроса получает список Command: EHLO host1.domain1.com
MX-записей домена, каждая из которых содержит приори- Response: 250-mail.domain1.com
тет в виде целого числа – чем оно меньше, тем MTA «глав- Response: 250-PIPELINING
Response: 250-SIZE 10240000
нее». В первую очередь предпринимается попытка отпра- Response: 250-ETRN
вить почтовое сообщение на главный MTA домена, а в слу- Response: 250-STARTTLS
Response: 250-AUTH PLAIN
чае его недоступности – по очереди на следующие за ним по Response: 250 8BITMIME
приоритету (резервные) до тех пор, пока сообщение не бу- Command: MAIL FROM: user1@domain1.com
дет отправлено. Резервные MTA могут передать сообще- Response: 250 Ok
Command: RCPT TO: user2@domain2.com
ния на главный после восстановления его работоспособ- Response: 250 Ok
ности, а могут выполнить доставку сообщения в почтовый Command: DATA
Response: 354 End data with <CR><LF>.<CR><LF>
ящик адресата самостоятельно. Message: Hello!
Response: 250 Ok: queued as 24D501771C
Анатомия протокола SMTP Command: QUIT
Response: 221 Bye
Давайте отправим тестовое письмо, используя протокол
SMTP. Он является текстовым протоколом, поэтому для от- MTA отправителя ↔ MTA получателя:
правки сообщения вместо полнофункционального MUA Response: 220 mail.domain2.com ESMTP Sendmail 8.13.5/8.13.1;
мы можем использовать telnet (это необходимо для лучшего Mon, 7 Nov 2005 16:29:00 +0300 (MSK)
Command: EHLO mail.domain1.com
понимания общих принципов работы протокола SMTP, а так- Response: 250-mail.domain2.com Hello mail.domain1.com [xxx.xxx.xxx.xxx],
же может быть очень полезно при отладке MTA): pleased to meet you
Response: 250-ENHANCEDSTATUSCODES
Response: 250-PIPELINING
# telnet localhost 25 Response: 250-8BITMIME
Response: 250-SIZE
Trying 127.0.0.1... Response: 250-DSN
Connected to localhost. Response: 250-ETRN
Response: 250-AUTH DIGEST-MD5 CRAM-MD5 LOGIN PLAIN
Escape character is '^]'.
Response: 250-STARTTLS
220 mail.domain1.com ESMTP Postfix Response: 250-DELIVERBY
EHLO host1.domain1.com Response: 250 HELP
250-mail.domain1.com Command: MAIL FROM:<user1@domain1.com> SIZE=361
250-PIPELINING Response: 250 2.1.0 <user2@domain2.com>... Sender ok
250-SIZE 10240000 Message: Received: from host1 (host1.domain1.com [xxx.xxx.xxx.xxx])
250-ETRN Message: by mail.domain1.com (Postfix) with ESMTP id 24D501771C
250-STARTTLS Message: for <user2@domain2.com>; Mon, 7 Nov 2005 16:30:58 +0300 (MSK)
Message: Message-Id: <20051107133058.24D501771C@mail.domain.com>
250-AUTH PLAIN
Message: Date: Mon, 7 Nov 2005 16:30:58 +0300 (MSK)
250 8BITMIME Message: From: user1@domain1.com
MAIL FROM: user1@domain1.com Message: To: undisclosed-recipients:;
250 Ok Message:
RCPT TO: user2@domain2.com Message: Hello!
250 Ok Message: .
DATA Message: QUIT
Response: 250 2.0.0 jA7DT0o5090086 Message accepted for delivery
354 End data with <CR><LF>.<CR><LF>
Response: 221 2.0.0 mail.domain2.com closing connection
Hello!
. Наше однострочное сообщение обзавелось всеми не-
250 Ok: queued as 24D501771C
QUIT обходимыми заголовками, и теперь вполне соответству-
221 Bye ет стандартам – MTA также выполнил часть функций MSA.
Connection closed by foreign host.
Тем не менее полагаться на это поведение нельзя – другие
Немного о том, что происходит в telnet-сессии. Полу- MTA или тот же самый, но с более строгими настройками,
чив приглашение, мы представляемся с помощью команды вправе отказать нам в приеме такого сообщения.
EHLO, и в ответ получаем список расширений, поддержива-
емых тем MTA, к которому мы подключились. Сейчас нас не Что еще нужно знать об отправке
интересуют расширения, нам просто нужно отправить со- Протокол SMTP не позволяет однозначно идентифициро-
общение. Мы указываем отправителя с помощью команды вать отправителя сообщения, однако существует возмож-
MAIL FROM: и получателя c помощью команды RCPT TO:. ность потребовать от отправителя авторизоваться – для это-
После команды DATA мы вводим содержимое самого пись- го служит расширение AUTH, описанное в RFC 2554 (SMTP
ма и завершаем его точкой на новой строке. С помощью ко- Service Extension for Authentication). Для реализации этого
манды QUIT мы отключаемся от MTA. расширения MTA используют механизм SASL, описанный
Обратите внимание: содержимое письма, мягко говоря, в RFC 2222 (Simple Authentication and Security Layer), кото-
не соответствует никаким стандартам и совсем не похоже рый позволяет использовать различные способы переда-
на те примеры «правильных» писем, которые мы приводи- чи и хранения логина и пароля, в том числе и те, которые
ли. Тем не менее, MTA принял письмо. Если до отправки используют не сам пароль, а его хэш.
письма включить прослушивание SMTP-трафика с помо- Существует также возможность шифровать SMTP-тра-
щью ethereal, а затем обработать экспортированные текс- фик с помощью технологий TLS/SSL (Transport Security
товые логи средствами grep и sed, мы получим следующие Layer / Secure Socket Layer), для чего могут использовать-
протоколы обмена. ся 2 механизма:

24
администрирование
 Устаревший протокол SMTPS – это фактически тот же токолы, а как уж они устроены внутри – это их личное дело.
самый SMTP, но шифруется весь трафик, начиная от на- Соответственно, дело администратора – выбрать тот MTA,
чального приветствия MTA, при этом используется порт который проще и гибче настраивается, надежнее и быст-
465. рее работает, да и вообще, более симпатичен.
 Расширение STARTTLS, описанное в RFC 2487 (SMTP Кратко перечислим несколько наиболее распростра-
Service Extension for Secure SMTP over TLS) – если кли- ненных MTA:
ент MTA (MUA, MSA или другой MTA) поддерживает  Sendmail – старожил, самый первый MTA, до сих пор со-
его, то отправка сообщения может выглядеть, напри- храняющий свои позиции, отчасти по инерции (в BSD-
мер, так (при этом используется порт 25 – тот же самый, системах и во многих дистрибутивах Linux именно он ус-
что и для обмена незашифрованными сообщениями): танавливается по умолчанию), отчасти благодаря воз-
можности очень гибкой настройки. Однако процеду-
Response: 220 mail.domain1.com ESMTP Postfix
Command: EHLO host1.domain1.com ра конфигурирования, монолитная архитектура, рабо-
Response: 250-mail.domain1.com та с полномочиями суперпользователя и регулярно об-
Response: 250-PIPELINING
Response: 250-SIZE 10240000 наруживаемые уязвимости вызывают множество наре-
Response: 250-ETRN каний, поэтому его использование уже становится дур-
Response: 250-STARTTLS
Response: 250-AUTH PLAIN ным тоном.
Response: 250 8BITMIME  Qmail – первая более защищенная и модульная аль-
Message: STARTTLS
Response: 220 Ready to start TLS тернатива Sendmail, за взлом которой учреждена до
Message: \026\003\001\000S\001\000\000O\003\001\000\033\2144\341\024A\
361\322EP\370yF\257\370x\273?\031<+\326\355\327\337X\347\207\305P\234\
сих пор никем не полученная премия. Однако этот MTA
000\000(\0009\0008\0005\0003\0002\000\004\000\005\000/\000\026\000\02 так и не получил широкого распространения из-за ли-
3\376\377\000
Message: \000\025\000\022\376\376\000\t\000d\000b\000\003\000\006\001\000
цензионных ограничений, благодаря которым многие
дистрибутивы Linux не включают его в свой состав. Фак-
Расширение 8BITMIME, описанное в RFC 1652 (SMTP тически, уже несколько лет Qmail не развивается авто-
Service Extension for 8bit-MIME transport), позволяет исполь- ром, и чтобы получить нормально работающую систе-
зовать тип MIME-кодирования 8bit. Оно не является обяза- му на его основе, придется собирать его с множеством
тельным, поэтому использовать заголовки, закодирован- патчей.
ные таким образом, нежелательно.  Postfix – еще одна альтернатива Sendmail, получившая
Мы не будем рассматривать все расширения SMTP, значительно большее распространение благодаря вме-
скажем только, что каждому из них посвящен отдельный няемой лицензионной политике, модульной архитекту-
RFC, а искать их проще по названиям расширений в об- ре, высокой производительности, простой процедуре
щем списке RFC. конфигурирования и использованию в некоторых дис-
Кроме использования протокола SMTP существует трибутивах Linux и в Mac OS X по умолчанию. В журна-
более простой способ отправить почтовое сообщение – ле уже публиковался цикл статей Андрея Бешкова, пос-
это так называемая локальная отправка, поддерживае- вященных Postfix, поэтому детально рассматривать этот
мая почти всеми MTA. Общепринятым способом локаль- MTA мы не станем.
ной отправки является использование pipe-интерфейса  Exim – монолитный MTA подобно Sendmail, однако с бе-
программы sendmail, существуют MUA, которые поддержи- зопасностью у него дело обстоит гораздо лучше. Кро-
вают этот способ отправки (KMail, mutt, pine), а mailx вооб- ме того, Exim претендует на звание MTA с максималь-
ще никаких других способов, кроме этого, не поддержива- ной функциональностью и самой логичной системой
ет. Простейший shell-скрипт, выполняющий локальную от- конфигурирования, которое, впрочем, требует боль-
правку, выглядит так: ших усилий по сравнению с аналогичной процедурой
для Postfix. Exim используется по умолчанию в Debian
#!/bin/sh Linux. В журнале уже публиковались статьи, посвящен-
/usr/sbin/sendmail -t << EOF ные этому MTA, поэтому останавливаться на нем мы
From: user1@domain1.com не будем, а пойдем дальше.
To: user2@domain2.com
Subject: Test Message
Hello! Доставка почтовых сообщений
EOF
Количество MTA, через которые пройдет письмо, пока не
найдет своего адресата, в принципе не ограничено, хотя
Кто занимается транспортировкой в большинстве случаев достаточно двух MTA, если доме-
сообщений ны отправителя и получателя обслуживаются разными MTA
До сих пор мы говорили только об интерфейсах, пре- (и между ними есть прямой TCP/IP маршрут), или одного
доставляемых MTA, но даже не произносили их на- в противном случае. Задачей MTA после получения пись-
званий. Только в протоколах ethereal видно, что на уз- ма для своего домена является сохранение письма в пос-
ле mail.domain1.com в качестве MTA используется Postfix, тоянное хранилище, откуда его сможет прочесть адресат
а на узле mail.domain2.com – Sendmail. Это именно та мо- с помощью своего MUA. Доставкой письма в это хранили-
дульность, о которой говорилось выше: существует множес- ще занимается очень широкий класс ПО, который носит об-
тво различных MTA, все они реализуют приблизительно од- щее название MDA (Mail Delivery Agent).
ну и ту же функциональность, используют одни и те же про- Когда-то в процедуре доставки ничего сложного не было.

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


администрирование
Использовалась исключительно push-технология: MTA пос- Subject: Test Message
Message-Id: <20051023123325.CEA8840F0@mail.domain1.com>
редством собственного локального MDA доставлял почто- Date: Sun, 23 Oct 2005 16:33:25 +0400 (MSD)
вые сообщения куда-нибудь в /var/mail или /var/spool/mail,
Hello!
а MUA, появившиеся в те времена (mailx, mutt, pine), читали
сообщения непосредственно оттуда – при этом они обязаны Хранение всех сообщений в одном файле приводит
были находиться на одной машине с MTA или монтировать к тому, что писать приложения, осуществляющие одно-
свои почтовые ящики, например, по NFS. Затем более по- временное добавление новых сообщений и редактирова-
пулярными стали pop-технологии: /var/mail и /var/spool/mail ние уже существующих, не так просто, как хотелось бы,
выродились в специализированные серверные хранилища не слишком надежно (возможностей повредить mbox пре-
почты с собственными специализированными средствами достаточно), а иногда и просто невозможно (блокировка
доставки почты, появились сервисы, предоставляющие до- mbox на запись при доставке сообщений делает невозмож-
ступ к этим хранилищам по протоколам POP3 и IMAP по за- ной параллельную доставку). Именно это и было причиной
просу самого MUA – причем новые MUA (Mozilla, Outlook, появления другого формата – Maildir.
The Bat!) по другому себе жизнь уже не мыслят и о /var/mail Maildir – это каталог с тремя подкаталогами внутри:
и /var/spool/mail ничего не знают. tmp, new, cur. При доставке сообщения оно помещается
в файл в подкаталоге tmp, имя файла формируется из теку-
Форматы серверных почтовых щего времени, имени хоста, идентификатора процесса, со-
хранилищ здавшего этот файл, и некоторого случайного числа – таким
На сегодняшний день существует два стандартных форма- образом гарантируется уникальность имен файлов. После
та серверных хранилищ почты (mbox и Maildir – их стандарт- записи в файл всего сообщения создается жесткая ссыл-
ность проявляется в том, что доставлять в них почту и извле- ка на этот файл в каталоге new, а текущая ссылка из tmp
кать ее оттуда могут различные MDA) и несколько нестан- удаляется – это делается для того, чтобы никакой другой
дартных (например, файловое хранилище Cyrus, похожее процесс не смог прочитать содержимое сообщения до тех
по идеологии на Maildir, но несовместимое с ним, и храни- пор, пока оно не будет записано полностью. По такому же
лище DBMail, использующее БД MySQL или PosgreSQL, – алгоритму при чтении сообщения (это может делать как
если использовать эти хранилища, то вместе с их преиму- MUA, так и другой MDA, предоставляющий доступ к Maildir
ществами мы одновременно резко ограничим себя в выбо- по протоколу POP3 или IMAP) оно перемещается в каталог
ре MDA для доставки и извлечения почты). Впрочем, в лю- cur, при этом название файла изменяется: к нему добавля-
бом случае мы говорим об открытых хранилищах, формат ются пометки о прочтении, ответе, удалении и т. д.
которых документирован (в худшем случае в исходных ко- Maildir++ – это дальнейшее усовершенствование Maildir
дах MDA), поэтому нет никаких препятствий к тому, чтобы с поддержкой вложенных каталогов IMAP (они должны на-
написать конвертор из одного хранилища в другое (и та- читаться с «.») и квот.
кие конверторы есть).
Нестандартные хранилища (Cyrus и DBMail) и MDA, ра- Кто занимается доставкой сообщений
ботающие с этими хранилищами, лучше будет рассмотреть в серверные хранилища
в отдельных статьях (статья о DBMail планируется опубли- Все MTA содержат в своем составе локальные MDA для до-
ковать в следующем номере журнала, статья о Cyrus IMAP ставки в mbox, а иногда и в Maildir, но часто для доставки
уже публиковалась), а сейчас мы сосредоточим свое вни- выгоднее бывает использовать внешние MDA общего на-
мание на стандатных хранилищах: mbox и Maildir. значения, позволяющие выполнить дополнительные опера-
Mbox – это целое семейство не совсем совместимых ции с почтовыми сообщениями: переложить в другой поч-
друг с другом форматов, различные модификации кото- товый ящик, переслать на другой почтовый адрес, пере-
рых используются как в хранилищах почты на серверах, дать другой программе по pipe-интерфейсу для дальней-
так и локально в MUA. Все эти форматы объединяет то, шей обработки и т.д.
что все сообщения хранятся в одном файле, начинаются Самыми распространенными внешними MDA общего
с поля From и отделены друг от друга пустой строкой. В про- назначения являются:
цессе доставки новые сообщения дописываются в конец  Procmail – в основном используется для доставки со-
mbox-файла. Если вернуться к нашему примеру письма общений в mbox (хотя существует патч для поддержки
от user1@domain1.com к user2@domain2.com, то после его Maildir).
сохранения в конце mbox-файла (скорее всего, это файл  Maildrop – является частью проекта Courier, может до-
будет называться /var/mail/user2 или /var/spool/mail/user2) ставлять почту в mbox, но чаще используется для до-
добавится следующее: ставки почты в Maildir. Более эффективно расходует сис-
From user1@domain1.com Sun Oct 23 16:26:52 2005
темные ресурсы, чем Procmail, поддерживает виртуаль-
Return-Path: <user1@domain1.com> ных пользователей, информация о которых может хра-
Received: from mail.domain1.com (mail.domain1.com [xxx.xxx.xxx.xxx])
by mail.domain2.com (8.13.5/8.13.1) with ESMTP id j9NCQqTZ012628
ниться в Berkley DB, LDAP, MySQL и PostgreSQL.
for <user2@domain2.com>; Sun, 23 Oct 2005 16:26:52 +0400 (MSD)
(envelope-from user1@domain1.com)
Received: from host1.domain1.com (host1.domain.com [xxx.xxx.xxx.xxx])
И Procmail, и Maildrop используют pipe-интерфейс
by mail.domain1.com (Postfix) with ESMTP id CEA8840F0 для приема почты от MTA: для каждого почтового сообще-
for <user2@domain2.com>; Sun, 23 Oct 2005 16:33:25 +0400 (MSD)
From: user1@domain1.com
ния создается отдельный процесс MDA, получающий со-
To: user2@domain2.com общение на stdin. Это не слишком экономный способ об-

26
администрирование
работки почты, особенно при больших объемах, поэтому его же для аутентификации используют многие MTA
MTA предлагают еще один способ получения сообщений – и Сyrus IMAP. Но в целом по функциональности Dovecot
протокол LMTP, описанный в RFC 2033 (Local Mail Transfer пока не дотягивает до Courier IMAP.
Protocol). MDA, использующий LMTP, принимает сообще-  Cyrus IMAP – наиболее продвинутая почтовая система,
ния по TCP/IP или UNIX-сокету подобно MTA, поэтому со- которая помимо уже перечисленных возможностей, до-
здавать отдельный процесс на каждое сообщение не нуж- ступных в других MDA, включает возможности класте-
но. Cyrus и DBMail предлагают MDA, использующие LMTP, ризации и проксирования, быстрый и гибкий механизм
для доставки в собственные хранилища, а вот для mbox фильтрации почтовых сообщений Sieve (описанный
и Maildrop таких MDA нет. в RFC 3028). Однако все компоненты Cyrus используют
Кроме фильтрующих MDA общего назначения в про- собственный формат хранилища почтовых сообщений
цессе доставки сообщения в серверное хранилище также и не умеют работать со стандартными mbox и Maildir.
могут использоваться специализированные контент-филь-
тры. Такие фильтры могут выполнять функцию отсеива- В тех случаях, когда поддержка протокола IMAP не тре-
ния спама и вирусов, в этом качестве часто используют- буется, возможно использование более простых MDA, пре-
ся SpamAssassin и SpamOracle в связке с популярными ан- доставляющих доступ к mbox и Maildir только по протоколу
тивирусами. Они могут использовать как pipe-интерфейс, POP3: к их числу относятся Cubic Circle (cucipop), QPopper
так и интерфейс LMTP. Последний вариант, как правило, и Popa3d.
является более производительным, но затрудняет исполь-
зование контент-фильтра в MDA общего назначения – ос- Как происходит получение сообщений
тается использовать MDA из комплекта MTA. И MDA, используемые для доставки почты в mbox и Maildir,
и MDA, предоставляющие доступ к ним по протоколам POP3
Организация доступа к серверным и IMAP, взаимозаменяемы точно так же, как и различные
хранилищам MTA. MUA ничего не знает о типе хранилища и о том, с каким
Наиболее популярными MDA, предоставляющими доступ к POP3/IMAP-сервером он работает, он всего лишь использу-
mbox и Maildir по протоколам POP3 и IMAP, являются: ет протоколы POP3 и IMAP для доступа к хранилищу.
 UW IMAP – самый простой из всех перечисленных. Ра- Протокол POP3, описанный в RFC 1939 (Post Office
ботает под inetd/xinetd, не имеет вообще никаких настро- Protocol – Version 3), подразумевает, что пользователи за-
ек, в качестве механизма аутентификации использует бирают сообщения из серверного хранилища и работают
только PAM, по умолчанию работает только с mbox (хотя с ними в локальном хранилище своего MUA. Продемонстри-
существует патч для поддержки Maildir). Предоставля- руем использование этого протокола с помощью telnet:
ет доступ ко всем файлам в домашнем каталоге поль-
зователя как к каталогам IMAP, даже если они не явля- # telnet localhost 110
ются mbox – обязанность отображения только нужных Trying 127.0.0.1...
Connected to localhost.
файлов (действительно являющихся mbox) возлагает- Escape character is '^]'.
ся на MUA. Да и история безопасности у него очень не- +OK Hello there.
USER user1
хорошая. +OK Password required.
 Courier IMAP – часть проекта Courier, в который также PASS pwd1
+OK logged in.
входят собственный (но не слишком распространен- STAT
ный) MTA, уже упоминавшийся Maildrop, менеджер спис- +OK 1 422
LIST
ков рассылки, средства совместной работы (groupware) +OK POP3 clients that break here, they violate STD53.
и средства доступа к почте через Web. В качестве фор- 1 422
.
мата хранилища поддерживается только Maildir. Для ау- RETR 1
тентификации и Courier IMAP, и Maildrop используют об- +OK 422 octets follow.
Return-Path: <user1@domain1.com>
щую библиотеку Courier Authentication Library, которая Received: from mail.domain1.com (mail.domain1.com [xxx.xxx.xxx.xxx])
поддерживает хранение логинов, паролей, пути к Maildir by mail.domain2.com (8.13.5/8.13.1) with ESMTP id j9NCQqTZ012628
for <user2@domain2.com>; Sun, 23 Oct 2005 16:26:52 +0400 (MSD)
пользователя и квот Maildir в Berkley DB, LDAP, MySQL (envelope-from user1@domain1.com)
и PostgreSQL – таким образом, почтовые пользовате- Received: from host1.domain1.com (host1.domain.com [xxx.xxx.xxx.xxx])
by mail.domain1.com (Postfix) with ESMTP id CEA8840F0
ли не обязаны иметь системные учетные записи. Кро- for <user2@domain2.com>; Sun, 23 Oct 2005 16:33:25 +0400 (MSD)
ме того, для аутентификации возможно использование From: user1@domain1.com
To: user2@domain2.com
PAM. Subject: Test Message
 Dovecot – позиционируется как сервер POP3/IMAP, Message-Id: <20051023123325.CEA8840F0@mail.domain1.com>
Date: Sun, 23 Oct 2005 16:33:25 +0400 (MSD)
при написании которого в первую очередь учитыва-
Hello!
лась безопасность: другими словами, он относится к UW .
IMAP и Courier IMAP, как Qmail и Postfix к Sendmail. В ка- DELE 1
+OK Deleted.
честве формата хранилища поддерживается как mbox, QUIT
так и Maildir, для увеличения производительности (ко- +OK Bye-bye.
торая всегда была слабым местом при работе с mbox)
используются специальные индексы. Для аутентифика- После аутентификации с помощью команд USER и PASS
ции используется уже упоминавшийся механизм SASL – мы получаем количество сообщений в почтовом ящике

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


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

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

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

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

Е
сли допустить лёгкий налёт ро- чающие специальные антиспам- мере, известный) из наших соотечест-
мантики, то можно смело ут- фильтры для уменьшения потока венников – это Михаил Армалинский.
верждать – борьба со спамом нежелательной корреспонденции. В наше время, по информации
давно приобрела характер извест-  Это компании и корпорации, тратя- спам-аналитиков лаборатории Кас-
ного противостояния «меча и щита». щие немалые средства на покупку, перского на 2005 год, спам составля-
По одну сторону баррикад находятся внедрение и модификацию анти- ет 70-80% от общего объёма почто-
спамеры, занимающиеся постоянным спам-технологий. вого трафика, то есть на каждые 2-3
сбором почтовых адресов пользова-  Это компании – разработчики раз- обычных письма приходится 7-8 спа-
телей Интернета, изобретением и мо- личного программного обеспече- мерских. Точной цифры по ежеднев-
дификацией технологий отправки спа- ния, позволяющего в какой-то ме- ному количеству рассылаемого спама,
ма, а также обхода средств его блоки- ре сократить миллионы ежеднев- по понятным причинам, быть не может.
рования. По другую сторону находят- ных сообщений, которые попада- Но цифры, озвучиваемые различными
ся все остальные пользователи элек- ют в почтовые ящики пользовате- источниками, внушают опасение за бу-
тронной почты: лей. дущее электронной корреспонденции,
 Это простые пользователи, кото- так как любая крупная компания, рабо-
рые ежедневно удаляют из своих История развития тающая с почтой, находится под угро-
ящиков от единиц до сотен спам- спамерских технологий зой быть просто погребённой под не-
сообщений, а более тесно «дружа- Родоначальницей спама можно счи- вообразимым количеством почтово-
щие» с программным обеспече- тать рассылку от 2 мая 1978 года, ког-го мусора.
нием обучают персональные поч- да было разослано 600 спам-сообще-
товые программы по возможнос- ний для приглашения на презентацию Среда передачи
ти распознавать и удалять сооб- DEC. С этого дня можно начинать от- Технологии рассылки спам-сообще-
щения (как вариант, маркировать счёт века спам-сообщений. 12 апре- ний развивались достаточно бурно.
специальным образом или изоли- ля 1994 года Лоренс Кантер и Марта Началось всё с обычной прямой от-
ровать в специально отведённом Сигель впервые использовали спе- правки респондентам, указанным
месте), содержащие мусор. циальное программное обеспечение в поле CC и BCC. Однако этот метод
 Это системные администраторы для рассылки спама в конференциях быстро ушёл в историю ввиду своей
компаний, устанавливающие и обу- USENET. Первый спамер (по крайней неэффективности.

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

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

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

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


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

32
администрирование
сообщений привели даже к тому, что не устраивает имеющийся на данный меримом с уровнем рекламного спа-
появилась некая новая форма язы- момент результат. ма. Не стоит забывать и о том, что каж-
ка (как в пункте два), которую многие дое фишинговое письмо потенциально
даже понимают. Почему я делаю та- Фишинг способно причинить в сотни раз боль-
кой вывод? Ну обращаются же люди Говоря о спаме, невозможно прой- ший ущерб (в случае успешного «об-
в компании, которые рекламируют та- ти мимо такого явления, как фишинг. лапошивания» получателя), чем тыся-
ким образом. Фишинг – это мошеннические рас- чи сообщений обычного рекламного
Не стоит забывать и спам, возни- сылки («нигерийские письма», подде- спама. Если потери от чтения рекла-
кающий из-за неидеальных почтовых льные извещения о выигрыше и т. д.). мы можно свести к трафику и затратам
серверов. Имеются в виду различные Дословно фишинг можно перевести времени на его отсеивание, то потери
отчёты. Как пример можно привести как “ловля на удочку”. Как правило, та- от фишинга могут быть поистине фа-
настоящий бум отчётов от антивиру- кие письма призывают совершить ка- тальными для финансового положения
сов о найденном в теле письма виру- кое-то действие (например, пройти по «попавшегося» пользователя. К сожа-
се. Разумеется, речь идёт о тех случа- ссылке или просто заплатить деньги), лению, есть достаточно много факто-
ях, когда поле отправителя является но не за нечто реальное, как в случае ров, затрудняющих борьбу с фишин-
поддельным и пользователь получа- рекламного спама, а за нечто несу- гом, то есть при одинаковом допусти-
ет отчёты о письмах, которые в дейс- ществующее. мом проценте ложных срабатываний
твительности не отправлял. Сюда же Целью фишинг-рассылок являют- любая современная антиспам-систе-
относятся многочисленные автомати- ся персональные данные пользовате- ма пропустит меньше рекламных со-
чески генерируемые отчёты о невоз- ля (логины, пароли, пин-коды, номе- общений, чем фишинговых.
можности доставки сообщения полу- ра кредитных карт и тому подобное). Историю фишинга, скорее всего,
чателю. Ситуация та же – поле отпра- В дальнейшем, как не сложно дога- следует начинать с середины 90-х го-
вителя подделано. К этому можно от- даться, эти данные используются зло- дов. Тогда в компании AOL были силь-
носиться, как к необходимой отладоч- умышленниками для получения воз- но распространены сообщения, подпи-
ной информации, если вы работаете можной наживы. Как правило, фишин- санные якобы администрацией. В этих
системным администратором или яв- говые письма весьма талантливо ими- сообщениях предлагали (объясняя это
ляетесь продвинутым пользователем. тируют настоящие сообщения реаль- разными причинами) прислать пароль
Или же как к неизбежному, но от то- но существующих организаций. На- от своего аккаунта, который в против-
го не менее надоедливому «техничес- иболее часто они пародируют различ- ном случае угрожали закрыть.
кому» спаму, если вы руководитель ные платёжные системы (ebay, paypal). Разумеется, со временем до поль-
или менеджер, почта которого «пест- В таких письмах содержится ссыл- зователей довели информацию, что па-
рит» отчётами о письмах, которых он ка, пройдя по которой, потенциаль- роли в письмах не запрашиваются и не
не отправлял. ная жертва попадает на поддельную отсылаются, поэтому эффективность
Менялось и оформление спам- страницу, специально изготовленную этого метода стала стремиться к ну-
письма: мошенником. Страница выглядит как лю. Однако новая уловка мошенни-
 Близкие по начертанию, но раз- реально существующая на сайте ком- ков не заставила себя долго ждать.
ные символы. Например, буква «А» пании, от имени которой было отправ- Немного изменив содержимое писем,
в русской и английской раскладке. лено письмо. На фальшивом сайте под они стали сообщать о каком-либо со-
 Невидимый текст в HTML. тем или иным предлогом жертве пред- бытии на сервере (например, PayPal),
 Картинки, зашумление картинок. лагается ввести свои личные данные требующем от пользователя некой ре-
Если сначала фильтры научились для авторизации. Как итог – личная ин- акции. В теле сообщения была ссылка,
по подсчитанной сумме выявлять формация посетителя попадает в ба- которая, как уже было сказано выше,
одинаковые сообщения, то внесе- зы мошенников. вела на поддельную страницу легаль-
ние невидимых глазу незначитель- Если верить статистике из разных ного сайта. Где ничего не подозрева-
ных изменений избавляет от этой источников, фишинг пока что не яв- ющие пользователи и оставляли свои
«проблемы». ляется чрезмерно опасным явлением. персональные данные, так как мало
 Подделка технической части пись- На данный момент даже «писем счас- кто привык смотреть в адресную стро-
ма. Думаю, каждый хоть раз в жиз- тья» пользователям приходит значи- ку браузера. (Я лично несколько раз
ни видел отчёт от SpamAssassin тельно больше, чем фишинговых со- наблюдал, что у некоторых пользова-
в виде «forged outlook header». общений. Однако, наиболее вероят- телей адресная строка вообще скры-
но, что такое положение дел времен- та. На мой вопрос, как они работают,
Противостояние спамеров и ан- ное. Индустрия фишинга в России ещё был дан гениальный ответ – я сам(а)
тиспамерских технологий порождает не доросла до таких «поставленных ничего не набираю, только ссылки от-
всё больше новых ухищрений со сто- на рельсы» механизмов, как реальный крываю.) На этом возможные злоклю-
роны первых. Однако, судя по инфор- спам. Сейчас энтузиасты только обка- чения пользователей могли не закон-
мации от спам-аналитиков лаборато- тывают новые технологии на рунетов- читься, потому что на поддельной стра-
рии Касперского и других источников, ских пользователях. Но, по прогнозам нице мог оказаться троян, который
2005 год не дал новаторских техноло- mail.ru, уже к 2006-2007 году доля та- впоследствии «высасывал» из ком-
гий спамерам. По-видимому, их впол- кого спама окажется на уровне, соиз- пьютера все пароли и учётные запи-

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


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

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

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


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

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

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

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

36
администрирование
с Perl, то можно сделать ICQ самому Таблица. Основные доводы «за» и «против» использования ICQ
(http://www.gonzo.kiev.ua/projects/vicq), Разрешить ICQ Запретить ICQ
но это не так просто как воспользо- «+»: Простота, быстрота и удобство общения с посто- «+»: Сотрудники не будут отвлекаться от работы.
ваться готовым веб-сайтом, подде- янными партнёрами, меньше проблем и бюрокра- «-»: Угроза безопасности: есть вероятность появления
тии. «левых» шлюзов в Интернет, в обход основного
рживающим общение по ICQ. Именно «+»: Ниже затраты на телефонные переговоры, теле- канала.
по ICQ, а не только между пользова- фонные линии меньше заняты. «-»: Повышение уровня занятости телефонных линий
«+»: Популярная мера. и рост расходов на связь.
телями сайта. «+»: Короткое общение снимает стресс. «-»: Не популярная мера.
До последнего времени работал «-»: Угроза безопасности: возможна утечка нежела- «-»: Больше времени тратится на общение с труднодо-
тельной информации. ступными и удалёнными партнёрами.
веб-проект www.aska.ru, для того что- «-»: Угроза безопасности: если программу ICQ-клиен- «-»: Психологический момент запрета для тех, кто при-
бы воспользоваться своей ICQ, на- та ставит пользователь – возможны вирусы. вык пользоваться.
«-»: Отвлечение от основной работы и «болтовня» «-»: Затраты времени сотрудников на обдумывание
до было просто зайти на этот сайт не по делу. вопроса «Как обмануть систему?».
и ввести свой логин и пароль. Се- «-»: Есть небольшая вероятность увольнения сотруд-
ников.
годня работающим проектом являет-
ся http://911.ru. Воспользоваться им вас к выбору того или иного решения, часть на том же сервере, которая, мас-
под силу даже персоналу, далёко- ведь у вас могут быть и другие влия- кируясь под того или иного пользовате-
му от техники. Аналогичный сервис тельные факторы, однако я хотел бы ля, подключалась бы к настоящим сер-
под названием icq2go есть и на офи- предложить два возможных варианта верам от его имени. При этом клиент-
циальном сайте ICQ. Если официаль- решения проблемы. ская часть могла бы получать сообще-
ный сайт можно постараться закрыть, Первый вариант более интересный, ния и помещать их во внутреннюю БД,
то не стоит думать, что если закрыли но в то же время более сложный, поэ- делая их доступными для внутренне-
ICQ на всех портах, то и закроют все тому я про него расскажу лишь толь- го пользования. Также она бы могла
известные веб-ICQ, а также будут пос- ко в качестве идеи с задатком на воз- отправлять сообщения во внешний
тоянно отслеживать появление новых. можную будущую реализацию. мир. Клиентов, в том числе и распро-
Практика жизни показывает, что это Второй вариант решения пробле- страняемых под лицензией GNU Public
не так даже в банках. В дело вступа- мы попроще, его практическое реше- License, множество. Значит, реали-
ет человеческий фактор. Дотошных ние мы сегодня рассмотрим. зация этой идеи лишь дело времени
админов, закрывающих аськи, нет и желания.
по той причине, что все они получа- Интерактивный Теперь, если предположить что
ют либо небольшую, либо конечную фильтрующий идея реализовалась и мы имеем рабо-
зарплату, в то время как у них обыч- ICQ-прокси-сервер чий ICQ-прокси-сервер, то почему мы
но полно других дел. Однако следует Не помню, как давно я попал на стра- не можем сделать на нём фильтрацию
хорошо понимать, что уж если кто-то ничку Александра Шутко с его проек- сообщений (см. рис. 1)?
необоснованно чем-то насолил адми- том IServerd [4] по созданию ICQ-сер- Руководитель, отвечающий за то,
ну, то он скорее из принципа, с особой вера на базе Linux/*BSD с хранени- кому можно пользоваться ICQ, а кому
тщательностью и забесплатно, выпол- ем всех сообщений в БД PostgreSQL, нет, через специальную форму адми-
нит указание руководства и всё закро- но именно в тот момент я понял, на- нистрирования в определённую таб-
ет по максимуму. сколько этот проект интересен и куда личку БД прописывает разрешённые
Другие подобные сайты появля- его можно развить. Как мне кажется, ICQ-контакты. Например, для поль-
ются постоянно и регулярно и так бу- на базе данного проекта сделать пред- зователей отдела бухгалтерии, ко-
дет и дальше, поскольку это хоро- лагаемую реализацию будет гораздо му с кем можно общаться. Также про-
шая возможность привлечь посети- проще. Также на сайте [4] имеется до- писываются разрешённые контакты
телей на свой сайт, чтобы показывать статочно информации по протоколам для каждого ICQ-пользователя из от-
баннеры и зарабатывать на этом де- ICQ и всем с ними связанным. дела продаж, с кем они могут общать-
ньги. Например, на момент написа- Если можно сделать свой собствен- ся, аналогично и для всех остальных
ния статьи веб-ICQ можно было най- ный сервер ICQ и обязать пользовате- отделов. Если пользователю по дол-
ти на http://www.domeni.info, http://www. лей оправлять сообщения через него, гу службы нужна ICQ, то с разрешён-
riska.ru/modules.php?name=web_icq то почему нельзя сделать клиентскую ными контактами работа идёт в про-
и др. При этом, если эти сайты окажут-
ся закрыты, то к ним также можно об-
ращаться через всякие анонимайзеры
и cgi-proxy, которые аналогично «мно-
жатся и дохнут как мухи». В общем, это
скорее философский вопрос борьбы
оружия и брони. Для наглядности по-
дытожим всё вышенаписанное в ви-
де таблицы.
Как видно, принять однозначное
решение, где поставить запятую в за-
головке, сложно. Я не хочу склонять Рисунок 1. Схема фильтрации сообщений

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


администрирование
зрачном режиме без каких-либо про- её от этого может разорвать. Согласи-
блем. В то же время, общение с дру- тесь, ситуации очень похожие. Поэто-
гими (не разрешёнными) пользовате- му, «если какое-то движение не под-
лями фильтруется. А чтобы сообще- даётся вашему контролю, то надо его
ния не терялись, сервер может высы- возглавить!», чем мы займёмся.
лать ответные сообщения о недостав- Мы создадим страничку, на ко-
ке внешним пользователям. Например: Рисунок 2. Нормальное распределение. торой руководство или контролиру-
«Ваше сообщение «.....», отправлен- «Всплески» превышающие утроенное ющее лицо, а также сами пользова-
средне квадратическое отклонение
ное пользователю Ivanov нашей се- можно считать практически невозможными тели, смогут смотреть свои и чужие
ти, не было доставлено, так как обще- [18] сообщения. В результате просмот-
ние по ICQ в рабочее время на фирме бывает), а скорее из разумности и но- ра будет получен однозначный ответ
XXXXX запрещено решением руко- сят статистический характер. Как бы «а по каким вопросам общаются поль-
водства №148 от 29.09.2005». мы ни хотели, но от теории вероят- зователи сети, не отвлекаются ли они
Внутренним пользователям может ностей и нормального распределения от работы?». При этом можно публич-
выдаваться сообщение другого содер- нам никуда не уйти потому как это на- но и «прозрачно» наказывать, либо
жания, например «Общение с поль- ша жизнь. Мы, люди – «аналоговые отчитывать на общих собраниях тех
зователем ICQ 32323232 вам запре- существа», а не цифровые компью- или иных провинившихся пользова-
щено, если общение вам необходи- теры с нулями и единицами. Хотя, на- телей. И тут, при грамотной реализа-
мо по работе – обратитесь к началь- сколько компьютеры цифровые мож- ции сдерживающего фактора («кнута»,
нику IT-отдела для получения разре- но поспорить, для этого достаточно а возможность общения – это «пря-
шения». Как вариант, можно сделать посмотреть на нечёткую логику, ней- ник»), реализуется принцип свободы
временные рамки, когда будет рабо- ронные сети и на те же «прямоуголь- выбора, при котором психологически
тать фильтрация, скажем с 9 до 18. ные» тактовые импульсы в увеличении люди себя чувствуют лучше, чем в ок-
Можно даже учесть обеденный пере- и убедиться, что они никакие не пря- ружении железных запретов. Лучше
рыв. А фильтруемые сообщения ра- моугольные, как это принято считать чувствуют – значит есть вероятность,
зумнее не выбрасывать, а сохранять при первом приближении. Нельзя нам что лучше будут работать.
в буфер, чтобы их можно было полу- сказать «0», то есть «нет», достаточ-
чить в разрешённый для работы ин- но вспомнить известную русскую по- Чем лучше хватать
тервал времени. говорку «если нельзя, но очень хочет- ICQ-сообщения?
Как появится возможность, плани- ся, то можно», чем вам не иллюстра- Я не хочу обсуждать вопросы этичнос-
рую создать проект и заняться реали- ция выбросов за пределы интервала ти, морали, тайны переписки и закон-
зацией задуманного. Даже если меня в три сигма при нормальном распре- ности, каждый на эту тему пусть поду-
кто-то опередит и создаст свой проект делении (см. рис. 2)? мает самостоятельно, но программ, ре-
раньше, то пишите, я с удовольствием Причём избежать или защититься ализующих перехват и показ ICQ со-
стану его участником. Форум журнала от этих выбросов вы вряд ли сможете, общений на сегодня существует мно-
(http://samag.ru/cgi-bin/yabb/YaBB.pl) – потому как в теории существует не ну- жество. Вот лишь ссылки [5-9] на не-
отличное место для старта описан- левая вероятность очень больших от- которые наиболее популярные из них.
ной идеи. клонений. И тут уже сложно предуга- Из массы просмотренных программ не
дать, кто окажется сильнее, вы или подошла ни одна по тем или иным при-
Просмотр сообщений ICQ выброс. Если вы начальник, то не на- чинам. Почти все программы работа-
Если фильтрующий прокси-сервер до безумствовать, закручивая гай- ют под Windows и не имеют исходных
может работать без участия людей ки при принятии своих решений, ра- текстов, то есть что-то подправить и на-
и обойти его при грамотной реализа- но или поздно вы можете столкнуть- строить под собственные запросы бу-
ции невозможно, то данная схема бо- ся с тем, что вы пытаетесь сжать жид- дет сложно. Помимо этого, многие про-
лее простая и более лояльная. Также кость, которая, как известно из курса граммы коммерческие, а их «триаль-
она требует сдерживающего фактора общей физики, плохо поддаётся сжа- ные» и урезанные версии не самое
вроде человека на случай, если кто-то тию. Скорее всего, протечёт в дру- лучшее решение.
будет превышать рамки допустимого гом месте. Перехватчиков много по той при-
в общении и будет сильно отвлекаться Например, нет гарантии, что ка- чине, что все хотят заработать на этом
от работы. Как говорится: «на то и щу- кой-нибудь продвинутый пользова- денег, а написать такую программу
ка, чтобы карась не дремал». тель не подключит к своему компью- специалисту не очень сложно. ICQ-со-
Я не психолог и не кадровый работ- теру телефон Sky-Link или GPRS с це- общения передаются по сети в откры-
ник, чтобы оценить, какая из двух схем лью обойти ваш запрет по ICQ и тог- том виде, поэтому даже вы у себя мо-
более эффективна с точки зрения мо- да ваши чрезмерные усилия приведут жете поставить эксперимент. Взять се-
тивации сотрудников к работе, но мо- к появлению лишнего шлюза из гло- тевой сниффер под любую операци-
гу предположить, что в той или иной бальной сети в локальную, что вряд ли онную систему и запустить его, что-
степени полезны будут обе. Все запре- одобрит служба безопасности фирмы. бы он перехватывал пакеты целиком,
ты обычно исходят не из соображений Никто в жизни не будет закрывать вы- а не только заголовки. Далее, просто
«запретить из принципа» (хотя и такое пускной клапан у скороварки, так как просматривая всё перехваченное гла-

38
администрирование
зами, вы быстро найдёте читаемый текст сообщений среди взять всё остальное. Библиотеку pcap можно скачать тут:
прочего нечитаемого мусора. Фактически все программы, ftp://ftp.ee.lbl.gov/libpcap.tar.Z. Все остальные perl-моду-
делающие перехват ICQ-сообщений, просматривают дан- ли стоит искать на http://search.cpan.org, вводя их имена
ные за вас, находят сообщения и выводят вам их в краси- в окошке для поиска.
вых окошках и табличках. Иногда эти функции дополняют- В результате поисков получаем конечные ссылки
ся некоторым удобным сервисом вроде поиска, фильтра- для скачивания:
ции и пр. Даже если «менюшечный» сервис очень удобен,  http://search.cpan.org/CPAN/authors/id/T/TI/TIMPOTTER/
выделять отдельный компьютер для просмотра ICQ-сооб- Net-Pcap-0.04.tar.gz
щений – это дорого, поэтому проще всего перехватывать их  http://search.cpan.org/CPAN/authors/id/A/AT/ATRAK/
на шлюзе. А шлюзы обычно делают на FreeBSD или Linux, NetPacket-0.04.tar.gz
поэтому для нашей задачи надо найти что-то более подхо-  http://search.cpan.org/CPAN/authors/id/G/GA/GAAS/
дящее, с открытым кодом, желательно под лицензией GPL 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/
ект AIM Sniff [10] (автор Shawn Grimes). Поскольку ICQ была Proc-Simple-1.21.tar.gz
выкуплена фирмой America Online (AOL), то используемый  h t t p : / / s e a r c h . c p a n . o r g / C PA N / a u t h o r s / i d / M / M H /
в последних версиях ICQ протокол OSCAR (Open System MHARNISCH/Syslog-0.97.tar.gz
for Communication in Realtime) и протокол AIM, как бра-  http://search.cpan.org/CPAN/authors/id/C/CA/CAPTTOFU/
тья-близнецы, очень похожи, если не сказать, что это поч- DBD-mysql-3.0002.tar.gz
ти одно и то же, поэтому слово AIM не должно вас пугать.
На сегодня AIM Sniff – это живой проект, с автором кото- Если вы решите сделать «по-своему» и не делать вы-
рого можно связаться по почте. На сайте имеется действу- вод в БД, то можете модуль DBD::mysql не скачивать
ющий форум, где не очень бурно обсуждаются различные и не ставить.
проблемы проекта. Ставим libpcap.tar.Z., для этого распаковываем архив,
например, в директорию /progi:
Реализация с помощью AIM Sniff
AIM Sniff, если говорить о версии 0.9d, – это небольшая # cat libpcap.tar.Z|tar -xvz -C /progi
(~43 Кб) программа на Perl – aimSniff.pl +6 дополнитель-
ных файлов: Заходим внутрь:
 ChangeLog – изменения в версиях.
 README – документация и информация об установке; # cd /progi/libpcap-0.4
 aimsniff.config – шаблон конфигурационного файла.
 install.pl – программа, помогающая автоматизировать Запускаем конфигурирование и создание Makefile
процесс установки AIM Sniff и необходимых для него под вашу систему:
модулей (можно обойтись и без неё).
 rc.aimsniff – скрипт автоматизации запуска для помеще- # ./configure
ния в /etc/rc.d/init.d.
 table.struct – SQL-файл, создающий необходимую струк- Запускаем компиляцию:
туру таблиц в БД MySQL.
# make
Несмотря на кажущуюся первоначальную простоту,
для успешного запуска потребуются, естественно, язык Perl, Устанавливаем скомпилированное:
библиотека pcap (libpcap.tar.Z) и установленные модули:
 Net::Pcap  DBD::mysql # make install
 NetPacket::Ethernet  Unicode::String
 NetPacket::IP  Proc::Daemon Далее ставим модули. Каждый модуль аналогичным об-
 NetPacket::TCP  Proc::Simple разом распаковываем:
 NetPacket::UDP  Unix::Syslog
 DBI # cat файл_архива_модуля.tar.gz|tar -xvz -C /progi

Все эти модули в процессе инсталляции могут быть Заходим внутрь:


установлены автоматически, если использовать install.
pl. Однако я с неохотой доверяю подобным непроверен- # cd /progi/директория_модуля
ным средствам, так как не редки случаи сбоев, и пред-
почитаю ставить всё «руками», поэтапно решая задачу Запускаем конфигурирование и создание Makefile
и более глубоко вникая в то, что происходит. Предпола- под вашу систему:
гая, что perl у вас скорее всего стоит, не будем рассмат-
ривать его установку, а рассмотрим ссылки, где можно # perl Makefile.PL

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


администрирование
Запускаем компиляцию: нацию. После чего адаптация их программ под наши зада-
чи кажется делом пустяковым.
# make С учётом того, что Shawn Grimes согласился разместить
у себя на страничке http://www.aimsniff.com/downloads.html
Как вариант можно запустить тесты: модифицированный aimSniff.pl, не имеет смысл рассказы-
вать о том, что и как было исправлено, поэтому просто ска-
# make test чиваем «Cyrillic Patched AIM Sniff». Распаковываем архив
и используем вместо aimSniff.pl файл aimSniff.Cyr.pl. Если же
однако смысла особого в этом нет, потому как у меня неко- кому-то интересно, какие были внесены изменения, и есть
торые тесты не прошли, а программа работала правильно. желание присоединиться к проекту, то добро пожаловать
Чтобы не тратить время, сразу после компиляции устанав- на форум сайта.
ливаем скомпилированные модули: Замечание. На момент написания статьи случайно вы-
яснилось, что небольшой процент русских сообщений не-
# make install правильно декодируется. Скорее всего, к выходу журнала
из печати эта проблема будет уже решена.
После того как все модули установлены, можно попы-
таться запустить файл aimSniff.pl, если все модули стоят, Тестовый запуск
то он успешно запустится и начнёт перехватывать пакеты, Как сказано в README, пробуем запустить программу
если же чего-то не стоит, то вы увидите сообщение об ошиб- в тестовом режиме:
ке, что-то вроде:
# ./aimSniff.Cyr.pl -nodb
# ./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 # tcpdump -s 10000 -i eth0 src or dst port 5190 ↵
/usr/lib/perl5/vendor_perl .) at ./aimSniff.pl line 37. -w /path/traffic_dump.bin
BEGIN failed--compilation aborted at ./aimSniff.pl line 37.
(Учитывая, что MTU обычно 1500, snap length(ключ -s)
или в 10000 может показаться большим, но тут от этого явно
хуже не будет.) после файл дампа переписать на компью-
# ./aimSniff.pl тер с AIM Sniff и запустить команду:
Can’t locate Unicode/String.pm in @INC
(@INC contains: /usr/lib/perl5/5.6.1/i386-linux # ./aimSniff.Cyr.pl --nodb -r=traffic_dump.bin
/usr/lib/perl5/5.6.1 /usr/lib/perl5/site_perl/5.6.1/i386-linux
/usr/lib/perl5/site_perl/5.6.1
/usr/lib/perl5/site_perl /usr/lib/perl5/vendor_perl/5.6.1/i386-linux вы должны увидеть не экране перехваченные сообщения
/usr/lib/perl5/vendor_perl/5.6.1
/usr/lib/perl5/vendor_perl .) at ./aimSniff.pl line 42. в читаемом виде.
BEGIN failed--compilation aborted at ./aimSniff.pl line 42. При желании сообщения можно перенаправить в текс-
товый файл, например:
откуда легко понять, какой модуль вы ещё не установи-
ли. Если программа запустилась без ошибок, выдав что- # ./aimSniff.Cyr.pl --nodb>>/var/www/html/icq_messages_log.txt
то вида:
А этот файл уже можно скачивать и просматривать с по-
############################# мощью веб-сервера и браузера. Однако несмотря на то,
AIM Sniff v. 0.9d
Developed by: Shawn Grimes что в текстовом файле можно делать поиск, на мой взгляд,
############################# лучше сообщения сохранять в базу данных, где при гра-
мотной организации возможности по работе с сообщени-
Beginning Sniff...
FILTER: port 5190 ями намного шире.
Если тестовый запуск прошёл успешно, то, возможно,
то это лишь только половина успеха, потому как пользова- имеет смысл скопировать файл aimSniff.Cyr.pl в директорию
тели зарубежной части Интернета часто и не знают о су- /usr/local/bin и запускать его в дальнейшем оттуда.
ществовании великого и могучего русского языка, не го-
воря уже о наших изобретательных админах, талантливых Запись сообщений в базу данных
программистах и прочих специалистах. Если в своё время AIM Sniff умеет работать с СУБД MySQL [15-17]. Предпола-
мы подковали их блоху, а наши космонавты умудрились гаю, эта СУБД у вас уже установлена.
починить американский космический корабль за два часа, Для организации сохранения в базу данных необходи-
который, по словам американцев, они не смогли починить мо сделать три вещи:
за два месяца, с помощью «молотка, зубила и какой-то ма- 1. Создать базу данных aimsniff с необходимой структурой
тери», то от этого начинаешь чувствовать гордость за нашу таблиц.

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

# mysqladmin create aimsniff # dos2unix -n aimsniff.config aimsniff.conf


# mysql aimsniff < table.struct

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

Пароль можно ввести как с консоли, так и в команд- # /usr/local/bin/aimSniff.Cyr.pl ↵


-C=/путь/конфигурационный_файл.conf
ной строчке. Подключившись к БД, мы можем увидеть,
что структура таблиц не очень сложная: Для постоянной работы программы это не очень удобно,
потому как занимается консоль. Можно, конечно, запустить
# mysql -D aimsniff -u root -p команду со знаком «&» в конце (повесив процесс выпол-
mysql> describe имя_таблицы;
няться в фоновом режиме) и «nohup» перед ней (на случай
если вы соберётесь вдруг закрыть консоль) или даже запус-
тить программу в режиме демона, указав ключ -D, но это
не спасёт вас от сбоев и перезагрузок. Сбои надо отслежи-
вать отдельно, например, написав небольшой скрипт и ор-
ганизовав его запуск через crontab. Этого мы делать не бу-
дем, а вот как организовать автоматический останов и за-
пуск программы, рассмотрим ниже.

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

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

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

# chmod +x /etc/rc.d/init.d/aimsniff
Второй момент решается средствами СУБД при помо-
щи следующей команды: Далее, в зависимости от того, где у вас находится про-
грамма и её конфигурационный файл, правим в нём стро-
mysql> GRANT ALL ON aimsniff.* TO aimsniff@hotsname ↵ ку запуска:
IDENTIFIED BY 'пароль_к_БД_aimsniff';

где hostname – имя хоста, с которого будет осуществлять- /usr/local/bin/aimSniff.Cyr.pl -C=/usr/local/etc/aimsniff.conf


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

mysql> FLUSH PRIVILEGES; # /etc/rc.d/init.d/aimsniff start

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

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


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

а для остановки можно использовать те же команды с па-


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

# ln -s ../init.d/aimsniff /etc/rc.d/rc3.d/S89aimsniff
# ln -s ../init.d/aimsniff /etc/rc.d/rc0.d/K10aimsniff
# ln -s ../init.d/aimsniff /etc/rc.d/rc6.d/K10aimsniff

Цифры 89 и 10 у вас могут быть другими. В моём слу-


чае они выбраны из тех соображений, что у меня СУБД
MySQL и AIM Sniff расположены на одной машине, поэто-
му есть файлы S78mysqld и K12mysqld, отвечающие за за-
пуск и останов MySQL. Получается: 10<12, а 89>78, то есть Рисунок 3. Результаты работы программы script1.php
запуск AIM Sniff будет выполняться после того как старто-
вала база данных, а останов, наоборот, раньше. echo "<td>".$row[6]."</td>";
echo "</tr>";
В результате создания ссылок, система записи сооб- }
щений в БД должна автоматически стартовать на третьем echo "</table>";
?>
уровне и завершать свою работу при переходе на нулевой </body>
(останов) или шестой (перезагрузка). </html>

Просмотр перехваченных Результат работы скрипта см. на рис. 3.


ICQ-сообщений из БД Меняя запросы в переменной $request, например
После того как сообщения попали в БД, мы встречаемся на «SELECT * FROM logs WHERE id>100 LIMIT 100», мож-
с ещё одной проблемой – как их просматривать. Обычно эта но вывести следующие 100 сообщений или вывести все
проблема не стоит остро, потому как есть универсальный сообщения за последние три дня: «SELECT * FROM logs
phpMyAdmin[19]. В нашем случае данные довольно просты, WHERE unix_timestamp(now())-unix_timestamp(ts)<3*24*60*
поэтому напишем небольшой скрипт на php. Он будет под- 60». В целом, если вы умеете писать запросы к БД, то всё
ключаться к БД, делать запрос на получение данных и да- довольно просто и все дальнейшие возможности находят-
лее будет печатать на экран их в виде таблицы. Файл на- ся в ваших руках.
зовём script1.php
Лучшее – враг хорошего
<html> Для удобства использования можно создать две таблицы
<head>
<title>ICQ message database</title> в БД. В одной, например, можно хранить IP-адреса (если
<meta name="content" http-equiv="Content-Type" ↵ они статические) локальных пользователей с их именами
CONTENT="text/html; charset=koi8-r">
</head> и внутренними телефонами.
<body> CREATE TABLE 'localusers' (
<?php 'ip' VARCHAR(20) NOT NULL ,
$server="localhost:3306"; 'name' VARCHAR(30) NOT NULL ,
$login="aimsniff"; 'phone' VARCHAR(10) NOT NULL ,
$password="aimpassword"; PRIMARY KEY ('ip')
);
$conn=mysql_connect($server,$login,$password);
$color=1;
$request="SELECT * FROM logs LIMIT 100"; А в другой – IСQ-номера с никами или комментариями.
$result=mysql("aimsniff",$request,$conn);
echo "<table border=\"1\">";
echo "<tr align=\"center\" bgcolor=\"lightgrey\"><td>id</td> CREATE TABLE 'nicnames' (
<td>timestamp</td> 'icq' VARCHAR(255) NOT NULL ,
<td>local IP</td> 'nickname' VARCHAR(50) NOT NULL ,
<td>from UID</td> PRIMARY KEY ('icq')
<td>to UIN</td> );
<td>direction</td>
<td>message</td></tr>»; (Типы полей не оптимальны, они выбраны из соображения
while($row=mysql_fetch_array($result))
{ совместимости с имеющейся БД aimsniff.)
if ($color) { echo "<tr bgcolor=\"#FBE0E0\">"; $color=0; } Теперь вместо непонятных IP-адресов можно выводить
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>"; } жется, что проще сделать несколько усложнённый запрос

42
администрирование
к БД, содержащий в себе, например, левое внешнее объ-  WAS использует упрощенные теги «<? ?>» (вместо бо-
единение: лее правильных «<?php ?>»), поэтому необходимо их
включить. Для этого надо в /etc/php.ini прописать «short_
$request="SELECT logs.id,logs.ts,logs.ip,logs.fromHandle, open_tag = On».
logs.handle,logs.direction,logs.message,
localusers.name  Конфигурационный файл .config.php. Если вы не може-
FROM logs LEFT JOIN localusers ON ↵ те сменить конфигурацию во вкладке «admin», а туда
logs.ip=localusers.ip LIMIT 100";
вы, наверно, обратитесь в первую очередь, чтобы про-
Вывод будет на один столбец больше (чем в скрипте). писать вашу БД, то, скорее всего, у вас проблемы с пра-
В «лишнем» столбце будет указываться имя локального вами доступа к файлу конфигурации. Решить эту про-
пользователя. блему можно, задав для файла группу apache (так как
Для того чтобы его увидеть на веб-странице, надо прос- от этого имени скорее всего работает ваш веб-сервер,
то дописать ещё одну строчку: а значит и все выполняемые им скрипты, т.е. в том числе
и WAS) и открыть для на неё разрешение на запись:
echo "<td>".$row[6]."</td>";
# chgrp apache .config.php
# chgrp g+w .config.php
Думаю, и так понятно где. Как вариант, количество стол-
бцов можно не увеличивать. Например, в графе «local IP»  Вывод сообщений, содержащих кириллицу, может не ра-
можно выводить имена, если они известны, либо IP-адре- ботать так, как вы этого ожидаете, по той причине, что
са в противном случае. Наглядно данный вопрос реализу- все php-файлы в своём заголовке содержат другую ко-
ется следующим кодом: дировку.

if ($row[7]) { echo "<td>".$row[7]."</td>"; } <meta http-equiv="Content-Type" ↵


else { echo "<td>".$row[2]."</td>"; content="text/html; charset=iso-8859-1">

Кому-то может показаться более удобным использова- Вопрос решается заменой кодировки на koi8-r (или
ние имён столбцов в том виде, как они выводятся из базы windows-1251 в зависимости от вашего случая) во всех
данных, вместо подсчёта номеров начиная с нуля, тогда вы- неправильно отображающих php-файлах. Так же
вод будет выглядеть так: в aimSniff.Cyr.pl есть пара строчек, отвечающих за пе-
рекодирование русских букв, которые без проблем на-
if ($row['name']) { echo "<td>".$row['name']."</td>"; } ходятся при просмотре «вручную», либо через поиск
else { echo "<td>".$row['ip']."</td>"; }
по ключевым словам «translation» или «cp1251». Навер-
Аналогичным образом можно заменить номера ICQ ни- ное, было бы разумнее везде использовать utf-8, но про-
ками из другой таблицы. Те же, кто хорошо знаком с язы- цесс перехода на эту кодировку, особенно на старых
ком SQL, могут попробовать решить эту задачу средства- серверах, идёт со скрипом и без энтузиазма.
ми СУБД.
Замечание 1. Так как изначально планировалось раз-
Web AIM Sniff (WAS) мещать все сообщения на всеобщее обозрение, может
На сайте проекта www.aimsniff.com вы также можете най- возникнуть ситуация, когда тот же начальник, решивший
ти Web AIM Sniff (WAS) – это небольшая программка, точ- организовать у себя эту систему, может оказаться под её
нее несколько скриптов на PHP, специально написанных просмотром, чего ему или ей, естественно, не хотелось бы.
для просмотра сообщений из БД, создаваемой програм- В этом случае можно поступить двумя способами. Первый,
мой AIM Sniff. Поставляются они отдельно, и для их рабо- демократический – смириться с тем, что правила для всех
ты необходимо, чтобы у вас уже были установлены язык должны быть едины. Второй, как всегда, – сделать исключе-
PHP с поддержкой MySQL и веб-сервер Apache. По сути ние. В этом случае можно сделать небольшую фильтрацию
это то, во что может развиться написание вами собствен- по «закрытым» номерам ICQ, сообщения которых не долж-
ного скрипта. Скачать WAS можно на том же сайте в раз- ны показываться. Дописав, например, к запросу:
деле Download. Однако на сегодня программа (во всех её
версиях) является «сырой» и рекомендовать её читателям WHERE fromHandle <>'1111112' AND handle<>'1111112'
мне не хотелось бы, поскольку она адаптирована для AIM,
пока ещё не понимает русских букв и не может даже отоб- При желании можно вообще сделать два скрипта, а в иде-
разить сообщения, хотя может строить красивые графи- але, можно усложнить БД, организовав некоторое подобие
ки. Shawn Grimes не очень оперативно, но реагирует на за- мандатной политики безопасности, присвоив каждому но-
мечания и присылаемые ему патчи, так что есть надежда, меру ICQ свой уровень в отдельной таблице. Аналогичные
что в будущем (может, и благодаря вашим усилиям) ситуа- уровни можно присвоить и просматривающим. Можно коп-
ция изменится, так что следите за сайтом и форумом. нуть ещё глубже и внести изменения в AIM Sniff, тогда со-
Если же кто-то захочет рискнуть и разобраться с про- общения даже в базу данных попадать не будут. Тут тоже
ектом WAS самостоятельно, вам пригодятся несколько со- всё зависит от вашей фантазии и возможностей, например,
ветов: для удобства можно даже какое-нибудь ключевое слово или
 Скачивайте CVS-версию, там исправлена ошибка деле- последовательность, встречая которые в теле сообщения
ния на 0 при отсутствии сообщений в БД. разборщик не будет вносить сообщения в базу.

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


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

# 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

но чаще доступ нужен и снаружи тоже. В этом слу-


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

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

где 192.168.0.0/255.255.255.0 – есть адреса локальной се- Рисунок 4. Cкриншот сайта www.aimsniff.org
ти, откуда доступ разрешён. Если диапазон внутренних ад-
ресов жёстко не определён или также нужен доступ сна- Спасибо за помощь в исправлении ошибок и координа-
ружи, скажем из других филиалов, то можно организовать цию моих мыслей: Рыжакову Глебу, tuziha и Realtex-sux.
парольную защиту. Для этого необходимо создать файл
с учётными записями пользователей, куда занести инфор- Литература, ссылки:
мацию, например, о пользователе user1: 1. PHProxy – http://sourceforge.net/projects/poxy.
2. Simple Browser Proxy – http://sourceforge.net/projects/sbp.
# htpasswd -c /путь/файл_с_учётными_записями user1 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/
(Если файл с учётными записями уже имеется, ключ -c icqsnif.
следует опустить.) После, в конфигурационном файле веб- 6. EtherBoss Monitor (for ICQ Monitoring) – http://www.etherboss.
сервера пишем: com/icq.
7. Shadow IM Sniffer – ICQ Sniffer,MSN Sniffer, AOL Sniffer, Yahoo
<Directory /var/www/html/was> Sniffer – http://www.safety-lab.com/en/products/imsniffer.htm.
AuthType Basic
AuthName "Web AIM Shiff" 8. Spy ICQ: SpyArsenal ICQ Logger – http://www.spyarsenal.com/
AuthUserFile /путь/файл_с_учётными_записями spy-icq-sniffer.
Require user user1
AllowOverride None 9. Network Sniffer: Give-Me-Too – invisible net sniffer – http://www.
</Directory> spyarsenal.com/network-sniffer.
10. Проект Aim Sniff – http://www.aimsniff.com, http://sourceforge.net/
При желании можно совместить проверку IP-адреса, от- 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.
# /etc/rc.d/init.d/httpd restart 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).
о том, разрешать пользоваться ICQ или нет, а жизнь поль- 19. phpMyAdmin MySQL Database Administration Tool – http://www.
зователей в новом году станет только лучше. phpmyadmin.net.

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

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

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

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

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


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

46
безопасность
ле проведения всех проверок оно помещается уже в дру- держит ClamAV и SpamAssassin, если планируется их ис-
гую папку (Outgoing Queue Dir), откуда забирается МТА пользование, то лучше воспользоваться готовым комплек-
и отсылается по назначению. Отличие здесь в работе ис- том install-Clam-SA.tar.gz, который можно взять со страницы
пользуемых МТА. Например, структура sendmail позволяет Downloads раздел Other stuff. Установка из rpm- и tar-архи-
MailScanner без перекомпиляции и изменений в конфигу- вов, в том числе и пакета install-Clam-SA, довольно проста.
рационных файлах принять сообщение от одного процесса, Разработчики избавили администраторов от поиска паке-
а затем после проверки запустить второй процесс. тов для удовлетворения зависимостей, а всего требуется
Все необходимые подготовки могут быть сделаны пос- около 30 Perl-модулей и программ, включив все необходи-
редством редактирования команд запуска sendmail. Не- мое в единый архив. После распаковки требуется ввести
сколько другая ситуация с Exim, в котором прием и отправ- лишь ./install.sh. Скрипт произведет анализ системы и ус-
ка сообщений являются полностью независимыми процес- тановит все компоненты в каталог /opt/MailScanner. Конеч-
сами. Все вроде бы хорошо, но вот указать Exim на то, что- но же, этот путь можно изменить, покопавшись в скриптах,
бы он использовал для приема/передачи отдельные оче- или просто перенести каталог в другое место, изменив за-
реди, проходящие через MailScanner, нет возможности. тем путь в стартовых скриптах. В случае с архивом, содер-
Поэтому приходится использовать два отдельных процес- жащим MailScanner, при установке не должно быть сооб-
са Exim, каждый со своим собственным конфигурацион- щений об ошибке, а скрипт внутри install-Clam сам предуп-
ным файлом. реждает, когда ошибки можно игнорировать.
При этом процесс-получатель почты не должен иметь
Do not worry about warnings or errors from the next 3 commands
возможности отправлять сообщение. При компилирова- ./install.sh: line 192: groupadd: command not found
нии Exim-получателя местонахождение конфигурационно- ./install.sh: line 193: useradd: command not found
You can start worrying about errors again now
го файла указывается на этапе конфигурирования. А за-
пуском Exim-отправителя занимается MailScanner, который
и передаст ему необходимые параметры. Конфигурационный файл
С Postfix легче всего, так как использование независи- MailScanner.conf
мых резидентных модулей позволяет одной копией серве- MailScanner является гибким инструментом, обладающим
ра управлять поступающей и уходящей SMTP почтой. Итак, большим количеством возможностей. Все доступные па-
письмо положено в папку, предназначенную для входящих раметры настраиваются в одном конфигурационном фай-
сообщений, после чего проходит несколько тестов, некото- ле /opt/MailScanner/etc/MailScanner.conf.
рые из них являются необязательными и могут отключать- Строение файла стандартно для UNIX-программ. На-
ся. Тест RBL (Real time Blackhole List) – производится срав- стройки указываются в виде строк option = value, знак ре-
нение адреса отправителя с известными спамерскими ад- шетки (#) указывает на комментарий, пустые строки и про-
ресами, если письмо отправлено с такого адреса, то оно белы игнорируются. В значениях можно использовать лю-
отбрасывается. Стоит отметить, что тест RBL в зависи- бые переменные оболочки вроде $HOSTNAME. Для удобс-
мости от настроек может производиться на трех уровнях тва восприятия файл разбит на несколько секций, все па-
со своими характеристиками: MTA (письмо отбрасывает- раметры можно не трогать. В принципе и в конфигурации
ся), MailScanner (возможен выбор – удалить, пропустить, за- по умолчанию MailScanner способен защитить систему. Кро-
архивировать и т. д.) и SpamAssassin (наиболее тонкий, но ме того, можно добавить и свои параметры, подправив файл
в то же время ресурсоемкий). Далее оценкой письма зани- CustomConfig.pm, лежащий в подкаталоге lib.
мается SpamAssassin, после чего MCP, тест на вирусы и на-
конец анализ типа, имени присоединенного файла и поиск # Main configuration file for the MailScanner E-Mail
# Virus Scanner
атак, направленных на почтовых клиентов. После прохож-
дения тестов в тело письма могут добавляться специфи- # Здесь указывается каталог, в котором содержатся все
# сообщения, на нужном языке. К сожалению, русского нет,
ческие метки, вроде X-Spam-Status: yes. Далее сообщение # этим придется заниматься самому
попадает в модуль принятия решений. Если все тесты прой- %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
Установка MailScanner # Название организации короткое, длинное (без пробелов)
Про установку различных МТА журнал писал неоднократ- # и веб-сайт
но, поэтому останавливаться на этом подробно не бу- %org-name% = yoursite
%org-long-name% = Your Organisation Name Here
ду. На странице закачки можно найти готовые пакеты %web-site% = www.your-organisation.com
для RedHat, Fedora, Mandriva, SuSE, Debian, Solaris,
# System settings
FreeBSD. Если вашего дистрибутива в списке нет, то вос- # Количество одновременных процессов MailScanner.
пользуйтесь tar-архивом, содержащим исходные тексты # При мощном процессоре и большой нагрузке можно
# увеличить эту цифру. Один процесс занимает около 20 Мб
MailScanner-install-4.45.4-1.tar.gz. Базовый комплект не со- Max Children = 5

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


безопасность
# По умолчанию MailScanner работает от имени пользователя # Количество сообщений в очереди, превышение этого числа
# и группы sendmail. # приведет к переключению в «ускоренный» режим
# В некоторых системах его нужно изменить # сканирования, когда сообщения проверяются не по дате,
Run As User = postfix # а в порядке поступления
Run As Group = postfix Max Normal Queue Size = 800

# Время (в секундах), через которое будет производиться # Опция ниже включает проверку на вирусы и спам для всех
# проверка папок на наличие новых сообщений # сообщений, установка в «no» приведет к тому, что почта
Queue Scan Interval = 6 # проверяться не будет. Можно использовать файл с правилами,
# где указать, какие сообщения сканировать, а какие нет
# Папка, в которую будут помещаться входящие сообщения. # checked *at all*, and so any viruses or other problems
# Можно задать имя каталога – /var/spool/mqueue.in # will be ignored.
# Шаблон – /var/spool/mqueue.in/* # Если используется файл правил
# Имя файла, в котором описаны каталоги # /etc/MailScanner/rules/scan.messages.rules,
# /opt/MailScanner/etc/mqueue.in.list.conf # то используем строку:
Incoming Queue Dir = /var/spool/postfix/hold # Scan Messages = %rules-dir%/scan.messages.rules.
# Иначе включаем проверку для всей почты
# Каталог, куда будут складываться письма, прошедшие Scan Messages = yes
# проверку (исходящий)
Outgoing Queue Dir = /var/spool/postfix/incoming # Максимально разрешенное количество вложений в одном
# письме. Некоторые почтовые системы сохраняют информацию
# Каталог, в котором почта перед проверкой будет # при переписке в виде присоединения к письму, их распаковка
# распаковываться. При достаточном количестве ОЗУ можно # занимает много времени
# использовать tmpfs или ramdisk Maximum Attachments Per Message = 20
Incoming Work Dir = /var/spool/MailScanner/incoming
# Проверка TNEF (Microsoft’s Transport Neutral Encapsulaton
# Каталог для хранения зараженных сообщений (карантин) # Format) при помощи внешней программы.
Quarantine Dir = /var/spool/MailScanner/quarantine # Некоторые антивирусы (Sophos, McAfee) самостоятельно
# проверяют такие вложения, в этом случае ставим «no».
# Местонахождение pid-файла Expand TNEF = yes
PID file = /opt/MailScanner/var/MailScanner.pid
# Некоторые версии Microsoft Outlook генерируют неправильный
# Во избежание утечки ресурсов MailScanner периодически # TNEF, который используемый модуль проверить не может.
# перезапускается. Здесь указывается время в секундах # Здесь можно запретить пропуск сообщений с таким
Restart Every = 14400 # присоединением. Как вариант можно использовать файл правил
Deliver Unparsable TNEF = no
# Установка МТА – postfix, sendmail, exim или zmailer
MTA = postfix # Команда запуска декодера TNEF, как вариант указывается
# ключевое слово «internal», подключающее Perl-модуль,
# Ниже описываются местонахождение и параметры запуска # выполняющий ту же работу. Можно использовать файл правил
# второй копии MTA. Postfix и Qmail здесь не настраиваются #TNEF Expander = internal
# (см.выше). TNEF Expander = /opt/MailScanner/bin/tnef --
# Sendmail = /usr/lib/sendmail maxsize=100000000
# Sendmail2 используется для запуска Exim
# For Exim users: Sendmail2 = /usr/sbin/exim ↵ # Максимальное время для работы с одним сообщением TNEF
-C /etc/exim/exim_send.conf # (в секундах)
# For sendmail users: Sendmail2 = /usr/lib/sendmail TNEF Timeout = 120
# Sendmail2 = /usr/sbin/sendmail -C /etc/exim/exim_send.conf
# Sendmail2 = /usr/lib/sendmail # Месторасположение команды «file», позволяющей определить
# тип файла. Если не планируется проверка типа файлов,
# # можно отключить
# Incoming Work Dir Settings File Command = /usr/bin/file
# File Timeout = 20
# Ниже указываются настройки для каталога входящих
# сообщений, в большинстве случаев трогать их не надо Unrar Command = /usr/bin/unrar
Unrar Timeout = 50
# Здесь можно указать пользователя отличного
# от «Run As User» и «Run As Group». # Максимальный размер сообщений, включая заголовки.
# Эта опция может понадобиться при работе с некоторыми # Установка в 0 снимает ограничения. Можно использовать
# антивирусами # файл правил и использовать возможность принудительного
Incoming Work User = # ограничения размера сообщения более тонко
Incoming Work Group = Maximum Message Size = 0

# Права доступа к файлам, если не используется внешний # Максимальный размер в байтах для вложений.
# антивирус, то ставим 0600, иначе заносим пользователя, # Установка в 0 запретит вложения, -1 снимает ограничения.
# от имени которого работает антивирус, в группу, # Более тонко настройки можно указать в файле правил
# в нашем случае postfix и ставим 0640. Maximum Attachment Size = -1
# Хотя возможен вариант и с 0644
Incoming Work Permissions = 0640 # Минимальный размер вложений, опция бывает полезна
# при удалении очищенных антивирусом файлов, можно
# # использовать файл правил
# Quarantine and Archive Settings Minimum Attachment Size = -1
#
# То же что и выше, только для файлов, которые попадут # Максимальная глубина распаковки архивов zip,
# в карантин. Если захотите дать к ним доступ при помощи # для проверки имен и типов файлов
# внешней программы, например, веб-интерфейс, Maximum Archive Depth = 2
# то переопределяем их
Quarantine User = # Обнаружение архивов не только по имени,
Quarantine Group = # но и по содержимому, можно использовать файл правил
Quarantine Permissions = 0600 Find Archives By Content = yes

# Ниже идут параметры проверки входящих сообщений. # Проверка писем на вирусы.


# Ограничения по размеру (в байтах) и количеству # Можно использовать файл правил.
Max Unscanned Bytes Per Scan = 100000000 Virus Scanning = yes
Max Unsafe Bytes Per Scan = 50000000
Max Unscanned Messages Per Scan = 30 # Установка используемого вирусного сканера.
Max Unsafe Messages Per Scan = 30 # В конфигурационном файле приведены примеры для всех
# поддерживаемых антивирусов. Можно добавить любой другой,

48
безопасность
# для этого его необходимо описать в файле # Разрешение соответствующих тегов в сообщении
# %etc-dir%/virus.scanners.conf, в который необходимо # yes => Разрешает
# занести 3 позиции: имя сканера, сценарий для запуска # no => запрещает
# и месторасположение (в некоторых системах путь придется # disarm => Разрешает, но нейтрализует тег
# подправить). Например, для СlamAV строка в этом файле Allow IFrame Tags = disarm
# выглядит так: Allow Form Tags = disarm
# clamav /opt/MailScanner/lib/clamav-wrapper /usr/local Allow Script Tags = disarm
# Установка в none отключает проверку. Allow Object Codebase Tags = disarm
# Если планируется использование сразу нескольких
# антивирусов, они перечисляются через пробел # То же для <Img>, но только два действия yes и disarm
# Virus Scanners = drweb kaspersky mcafee Allow WebBugs = disarm
#
Virus Scanners = clamav # Эта опция перекликается с «Allow ... Tags», т.е. при
Virus Scanner Timeout = 300 # разрешении тега сообщение может быть преобразовано
# из HTML в текст
# Удаление вируса с зараженного файла, очищенное сообщение Convert HTML To Text = no
# присоединяется как файл «VirusWarning.txt».
# Можно использовать файл правил. # Проверка вложений.
Deliver Disinfected Files = yes # Указываем файл с правилами, содержащий описание типов
# и имен файлов и производимым действием при обнаружении
# Строка, которую ищет MailScanner на выходе антивируса. # определенного типа и имени
# При обнаружении этих строк отправитель не предупреждается, # allow/deny/deny+delete
# вирус очищается, а дойдет ли письмо до получателя – зависит Filename Rules = %etc-dir%/filename.rules.conf
# от «Still Deliver Silent Viruses». Filetype Rules = %etc-dir%/filetype.rules.conf
# Для обозначения используются 5 ключевых слов:
# HTML-IFrame, HTML-Codebase, HTML-Script, HTML-Form #
# и Zip-Password. # Reports and Responses
# Опция All-Viruses соответствует поиску всех вариантов. # Действия с потенциально опасными объектами, во многих
# Можно использовать файл правил # случаях возможно использование файла правил.
Silent Viruses = All-Viruses # Использование карантина для зараженных сообщений
Quarantine Infections = yes
# Доставлять ли сообщение получателю после очистки? Quarantine Silent Viruses = no
# Можно использовать файл правил
Still Deliver Silent Viruses = no # Копии сообщений с модифицированным HTML
# (вариант файл правил)
# Опция противоположная предыдущей, при обнаружении Quarantine Modified Body = no
# указанных строк все участники получат предупреждения
Non-Forging Viruses = Joke/ OF97/ WM97/ W97M/ eicar # Сохранение всего сообщения или только зараженной части
Quarantine Whole Message = no
# Запрет отправки зашифрованных сообщений.
# Можно использовать файл правил # Сохранение в оригинальном или удобочитаемом виде
Block Encrypted Messages = no Quarantine Whole Messages As Queue Files = no

# Запрет отправки незашифрованных сообщений. # Сохранение зараженного спама или MCP


# Можно использовать файл правил Keep Spam And MCP Archive Clean = no
Block Unencrypted Messages = no
# Файлы, содержащие сообщения, выдаваемые пользователю
# Разрешение использования зашифрованных архивов. Language Strings = %report-dir%/languages.conf
# Можно использовать файл правил Deleted Bad Content Message Report = ↵
Allow Password-Protected Archives = no %report-dir%/deleted.content.message.txt
Deleted Bad Filename Message Report = ↵
# %report-dir%/deleted.filename.message.txt
# Options specific to ClamAV Anti-Virus Deleted Virus Message Report = ↵
# %report-dir%/deleted.virus.message.txt
Stored Bad Content Message Report = ↵
# В файле имеются предустановки для некоторых антивирусов. %report-dir%/stored.content.message.txt
# В большинстве случаев достаточно проверить все пути Stored Bad Filename Message Report = ↵
Monitors for ClamAV Updates = /usr/local/share/clamav/*.cvd %report-dir%/stored.filename.message.txt
Stored Virus Message Report = ↵
ClamAVmodule Maximum Recursion Level = 5 %report-dir%/stored.virus.message.txt
ClamAVmodule Maximum Files = 1000 Disinfected Report = %report-dir%/disinfected.report.txt
ClamAVmodule Maximum File Size = 10000000 # (10 Mб) Inline HTML Signature = %report-dir%/inline.sig.html
ClamAVmodule Maximum Compression Ratio = 250 Inline Text Signature = %report-dir%/inline.sig.txt
Inline HTML Warning = %report-dir%/inline.warning.html
# Далее указываются параметры работы MailScanner с Inline Text Warning = %report-dir%/inline.warning.txt
# потенциально опасным контентом. Практически везде можно Sender Content Report = ↵
# использовать файл с правилами. Включение всех проверок %report-dir%/sender.content.report.txt
Dangerous Content Scanning = yes Sender Error Report = ↵
%report-dir%/sender.error.report.txt
# Работа с неполным вложением Sender Bad Filename Report = ↵
Allow Partial Messages = no %report-dir%/sender.filename.report.txt
Sender Virus Report = ↵
# Разрешение сообщений, загружающих контент из Интернета. %report-dir%/sender.virus.report.txt
# Запрещаем однозначно
Allow External Message Bodies = no # Скрываем полный путь к каталогу, в который помещен
# вирус. Эта опция может понадобиться для сокрытия
# Поиск подмены адресов # настроек системы
Find Phishing Fraud = yes Hide Incoming Work Dir = yes

# Обычно в легальных письмах редко используется IP-адрес, # Включение имени сканера в отчеты
# фишеры же прибегают к этому способу для обмана. Запрещаем Include Scanner Name In Reports = yes
Also Find Numeric Phishing = yes
# Добавление дополнительных заголовков и конвертов к
# Вставка предупреждения о подмене # обработанной почте (возможно использование файла правил)
Highlight Phishing Fraud = yes Mail Header = X-%org-name%-MailScanner:
Spam Header = X-%org-name%-MailScanner-SpamCheck:
# Список сайтов, которые игнорируются при поиске фишеров Spam Score Header = X-%org-name%-MailScanner-SpamScore:
Phishing Safe Sites File = %etc-dir%/phishing.safe.sites.conf Information Header = X-%org-name%-MailScanner-Information:

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


безопасность
Add Envelope From Header = yes # Опции изменения поля Subject могут использоваться
Add Envelope To Header = no # для удобства фильтрации в почтовом клиенте.
Envelope From Header = X-%org-name%-MailScanner-From: # Варианты no, start (добавить в начало) и end.
Envelope To Header = X-%org-name%-MailScanner-To: # Все варианты поддерживают правила
Scanned Modify Subject = no # end
# Символ, который будет использоваться для вывода оценки # Здесь текст, добавляемый к Subject
# спамовости сообщения. Установка x при значении 3 может Scanned Subject Text = {Scanned}
# быть воспринята неправильно, т.е. xxx, некоторые
# другие знаки #, @, *, ?, точка могут вызвать проблемы # Сообщение о вирусе, добавляемое в тему
# с procmail и др. Virus Modify Subject = yes
Spam Score Character = s Virus Subject Text = {Virus?}

# Вставка оценки спама в сообщение # Сообщение о проверке имени файла


SpamScore Number Instead Of Stars = no Filename Modify Subject = yes
Filename Subject Text = {Filename?}
# Минимальное число оценки спама, вставляемое в сообщение
Minimum Stars If On Spam List = 0 # Проверке содержимого
Content Modify Subject = yes
# Заголовок clean/infected/disinfected сообщений Content Subject Text = {Dangerous Content?}
Clean Header Value = Found to be clean
Infected Header Value = Found to be infected # О нейтрализации HTML
Disinfected Header Value = Disinfected Disarmed Modify Subject = yes
Information Header Value = Please contact the ISP for ↵ Disarmed Subject Text = {Disarmed}
more information
# О подделке адреса
# Полный отчет о спаме Phishing Modify Subject = no
Detailed Spam Report = yes Phishing Subject Text = {Fraud?}

# Оценка SpamAssassin или просто название # О спаме


Include Scores In SpamAssassin Report = yes Spam Modify Subject = yes
# Значение «_SCORE_» будет заменен числовой оценкой
# Включение отчета о спаме в любом случае, даже если спам # SpamAssassin.
# обнаружен не был # Строка «_STARS_» будет заменена звездочками
Always Include SpamAssassin Report = no Spam Subject Text = {Spam?}

# Тесты MailScanner могут добавлять свои заголовки в # То же, что и предыдущее, но только при превышении
# сообщение. Здесь указывается, как поступать с такими # значения «High SpamAssassin Score»
# заголовками. Варианты: «append», «add или «replace» High Scoring Spam Modify Subject = yes
Multiple Headers = append High Scoring Spam Subject Text = {Spam?}

# Имя узла, если требуется скрыть реальное


Hostname = the %org-name% ($HOSTNAME) MailScanner # Изменения в теле сообщения. Многие опции допускают
# использование файла правил. Предупреждение об удалении
# Подпись сообщения уже обработанного другой копией # записывается в само сообщение или присоединяется к файлу
# MailScanner Warning Is Attachment = no
Sign Messages Already Processed = no
# Имя файла такого вложения.
# Добавление «Inline HTML Signature» или «Inline Text Attachment Warning Filename = %org-name%-Attachment-Warning.txt
# Signature» в очищенное сообщение Attachment Encoding Charset = СР-1251
Sign Clean Messages = yes
Mark Infected Messages = yes # Архивирование и мониторинг почты.
# Указывается почтовый адрес, каталог или имя файла.
# Маркировать ли не просканированные антивирусом сообщения? # Возможно добавление переменных в имени вроде _DATE_,
Mark Unscanned Messages = yes # которая будет заменена текущим временем.
# Можно использовать правила
# И текст такой маркировки #
Unscanned Header Value = Not scanned: please contact your ↵ Archive Mail = /var/spool/MailScanner/archive
Internet E-Mail Service Provider for details
# Предупреждения локальному администратору.
# Все заголовки в сообщении, содержащие эти строки, будут # Можно использовать правила
# удалены. Опция может быть полезна при удалении Send Notices = yes
# сообщения о доставке или прочтении сгенерированных Notices Include Full Headers = yes
# почтовым клиентом Hide Incoming Work Dir in Notices = no
Remove These Headers = X-Mozilla-Status: ↵ Notice Signature = -- \nMailScanner\nEmail ↵
Disposition-Notification-To: Return-Receipt-To Virus Scanner\nwww.mailscanner.info
# Поле «From:»
# Доставлять ли очищенные от вирусов сообщения Notices From = MailScanner
Deliver Cleaned Messages = yes Notices To = postmaster
Local Postmaster = postmaster
# Отправка уведомления отправителю о том, что в сообщении
# содержится вирус или файл с подозрительным именем. # Имена файлов, транслирующих имена spam-списков и областей
# Лучше использовать файл с правилами, где указать # в реальные области DNS. Другие варианты можно поискать
# своих корреспондентов # http://www.declude.com/JunkMail/Support/ip4r.htm
Notify Senders = yes Spam List Definitions = %etc-dir%/spam.lists.conf
Virus Scanner Definitions = %etc-dir%/virus.scanners.conf
# Опция, переопределяющая предыдущую, при установке в no
# сообщения отправителям об обнаруженном вирусе отсылаться # Проверка на спам по адресу отправителя. Везде можно
# не будет. Учитывая, что обратный адрес часто # использовать правила. Отключение следующей опции приведет
# подделывается, лучше оставить, как есть. Вариант – # к остановке проверки на спам как самим MailScanner,
# использование файла правил # так и SpamAssassin
Notify Senders Of Viruses = no Spam Checks = yes

# Сообщение о блокировании файла по имени или типу # Выбор используемого spam blacklists (RBLs)
Notify Senders Of Blocked Filenames Or Filetypes = yes # Смотри файл указанный в «Spam List Definitions»
# И всего прочего Spam List = ORDB-RBL SBL+XBL SORBS-DNSBL CBL RSL ↵
Notify Senders Of Other Blocked Content = yes DSBL spamcop
Never Notify Senders Of Precedence = list bulk Spam Domain List = RFC-IGNORANT-DSN

50
безопасность
# Число одинаковых сообщений, начиная с которого # Настройка параметров журналирования. Включать большую
# они будут рассматриваться как спам, # часть лучше только при отладке. Следующая опция
Spam Lists To Be Spam = 1 # определяет взаимодействие с syslog
Spam Lists To Reach High Score = 3 Syslog Facility = mail
Spam List Timeout = 10 Log Speed = no
Max Spam List Timeouts = 7 Log Spam = no
Spam List Timeouts History = 10 Log Non Spam = no
Log Permitted Filenames = no
# «Белый список». Сообщения, принятые с попавших в этот Log Permitted Filetypes = no
# список узлов, не будут рассматриваться как спам Log Silent Viruses = no
#Is Definitely Not Spam = no Log Dangerous HTML Tags = no
Is Definitely Not Spam = %rules-dir%/spam.whitelist.rules
# Настройка некоторых параметров SpamAssassin.
# «Черный список» узлов спамеров. Эта величина # Может понадобиться, если SpamAssassin установлен в другой
# переопределяется значением «Is Definitely Not Spam». # каталог или процесс не может получить доступ к файлам.
# При no все, не вошедшие в 1 список, являются # Параметры понятны, приводиться не будут
# потенциальными спамерами
# Is Definitely Spam = %rules-dir%/spam.blacklist.rules # Настройки MCP
Is Definitely Spam = no MCP Checks = no
# Что проверяется первым: spam или mcp
Definite Spam Is High Scoring = no First Check = mcp
# Если количество получателей превышает число, то «белый # Ниже идут опции, значение которых аналогично таковым
# список» игнорируется, и письмо обрабатывается обычным # при проверке на спам, приводиться они не будут
# образом
Ignore Spam Whitelist If Recipients Exceed = 20

# Использование SpamAssassin.
Это не все опции, которые можно настроить при помо-
# Можно применить правила и обработать письма более тонко щи файла конфигурации. Среди оставшихся: работа с LDAP,
Use SpamAssassin = yes запуск процесса в фоне, обработка поля «To:», в случае ког-
# Если письмо превышает указанный размер (в байтах), да сообщение адресовано нескольким получателям, фор-
# SpamAssassin просматривать его не будет. матирование заголовков, отладка и прочее.
# Письма спамеров редко бывают большими, а рисунки и др.
# определяются другими опциями
Max SpamAssassin Size = 30000 Настройка Рostfix
# Переопределение значения «required_hits», если оценка Установка Postfix хорошо описана в [2] , если он уже настро-
# достигает его – это спам ен и нормально работает, осталось сделать немного. Как
Required SpamAssassin Score = 6
High SpamAssassin Score = 10 говорилось выше, Рostfix удобен тем, что одна копия про-
# Включение автоматического «белого списка», функции доступной
цесса позволяет управлять как входящей, так и исходящей
# в SpamAssassin, начиная с версии 3.0. Подробности в [3] почтой. Но в принципе можно использовать и две разных
SpamAssassin Auto Whitelist = no копии со своими конфигурационными файлами, применяя
SpamAssassin Prefs File = %etc-dir%/spam.assassin.prefs.conf
SpamAssassin Timeout = 75 схему работы Exim. Мы используем первый вариант.
Max SpamAssassin Timeouts = 10 В конфигурационном файле /etc/postfix/main.cf раском-
SpamAssassin Timeouts History = 30
ментируем следующую строку:
# Проверять ли сообщение, если оно находится в спам-списке
Check SpamAssassin If On Spam List = no
header_checks = regexp:/etc/postfix/header_checks
# Включение оценки спама в сообщение
Spam Score = yes
Создаем /etc/postfix/header_checks и добавляем следу-
# Перестройка Bayesian-статистики. ющую строку:
# 0 отключает такую возможность. Например, перестройка
# раз в сутки
Rebuild Bayes Every = 86400 /^Received:/ HOLD
# Отключение проверки на время перестройки
Wait During Bayes Rebuild = no После этого Рostfix будет складывать поступающие со-
# В этом разделе описываются параметры работы Custom общения в /var/spool/postfix/hold.
# Spam Scanner, написанного самим пользователем. Запускаем:
# Подробности в
# lib/MailScanner/CustomFunctions/GenericSpamScanner.pm
Use Custom Spam Scanner = no # /etc/init.d/postfix start
# /opt/MailScanner/bin/check_mailscanner
# Что делаем со спамом?
Spam Actions = deliver Если права доступа к каталогам установлены правиль-
High Scoring Spam Actions = deliver
Non Spam Actions = deliver но, то система будет работать. Если что-то не получается,
# Файлы с сообщениями, выдаваемыми пользователю
журналы вам в помощь.
Sender Spam Report = ↵
%report-dir%/sender.spam.report.txt Литература, ссылки:
Sender Spam List Report = ↵
%report-dir%/sender.spam.rbl.report.txt 1. Сайт проекта MailScanner – http://www.mailscanner.info.
Sender SpamAssassin Report = ↵ 2. Бешков А. Почтовая система для среднего и малого офи-
%report-dir%/sender.spam.sa.report.txt
Inline Spam Warning = ↵ са. – Журнал «Системный Администратор», №5, май 2003 г. –
%report-dir%/inline.spam.warning.txt 46-54 с.
Recipient Spam Report = ↵
%report-dir%/recipient.spam.report.txt 3. Супрунов С. Профессия – убивать спам. Все, что вы хотели
Enable Spam Bounce = %rules-dir%/bounce.rules узнать о тонкостях настройки Spamassassin. – Журнал «Сис-
Bounce Spam As Attachment = no
темный Администратор», №10, октябрь 2005 г. – 10-17 с.

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


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

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


для трансляции соединений между
сетями

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

Краткие сведения ля 2001-го, не выпускает обновлений ся достаточно интересным устройс-


о Cisco PIX Firewall 520 программного обеспечения с июня твом, особенно с учётом его нынеш-
520-я серия firewall компании Cisco 2004-го, а поддержка аппаратной час- ней стоимости.
устарела довольно давно – произво- ти закончится в июне 2006 года. Но не- С виду данный firewall представляет
дитель более не поставляет их с ию- смотря на это firewall всё ещё остаёт- собой несколько модернизированный

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

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


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

show ca mypubkey rsa access-group 101 in interface outside

Сохранить текущую конфигурацию в долговременную Сам список создаётся примерно как и на маршрутиза-
память можно командой: торах Cisco, например:

write mem access-list 101 permit tcp host 4.5.6.100 any eq 22


access-list 101 deny tcp any any eq 22
access-list 101 permit ip any any
Записать конфигурацию на сервере по tftp-протоколу
можно командой: Данный пример намеренно упрощён для того, чтобы
подчеркнуть его неполноту.
write net 192.168.255.2:pix-gtw Следует помнить о том, что в списках доступа подразу-
мевается ещё и последнее, неявное правило, которое за-
где 192.168.255.2 – адрес tftp-сервера, а pix-gtw – имя файла. прещает весь остальной трафик, для которого не описано
подходящего правила.
Сетевые интерфейсы
Эти интерфейсы имеют аппаратные идентификаторы Статическая маршрутизация
(hardware_id), например ethernet0. Для каждого интерфейса Командой route можно добавить статический маршрут. Фор-
задаётся его скорость и административное состояние: мат команды прост:

interface ethernet0 auto route имя_интерфейса сеть маска шлюз [метрика]


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

ip address outside 1.2.3.246 255.255.255.252


ip address inside 192.168.255.1 255.255.255.252
ip address www 192.168.255.5 255.255.255.252 Доступ к firewall по ssh
Если firewall уже соответствующим образом настроен, то к
К сожалению на один интерфейс можно назначить толь- нему можно подключиться по ssh с именем пользователя
ко один адрес. pix, например:

54
безопасность
ssh pix@192.168.255.1 ного диапазона глобальных адресов (пула). Количество ло-
кальных адресов, которые должны транслироваться, долж-
Доступ к firewall нужно ограничить минимально необ- но равняться количеству глобальных адресов.
ходимым количеством хостов. Сделать это можно коман- Данные о соответствии локальных и глобальных адре-
дой ssh: сов хранятся в таблице трансляций. Идентификация тра-
фика производится по соответствию локального и глобаль-
ssh 4.5.6.100 255.255.255.255 outside ного адресов.
ssh 192.168.255.2 255.255.255.255 inside
PAT позволяет транслировать локальные адреса в один
Маска и интерфейс являются необязательными пара- глобальный, случайным образом назначая для каждого со-
метрами. единения новый порт на глобальном интерфейсе. Иденти-
Кроме этого доступ к ssh-порту должен быть открыт фикация трафика производится по соответствию адресов
и в соответствующих списках доступа. и портов. Статический PAT позволяет задать постоянное со-
ответствие локальных и глобальных адресов и портов.
Сохранение логов на сервере Механизм работы трансляций достаточно прост – в па-
Для удобства использования и хранения системных сооб- кете, полученном от локального хоста, адрес отправителя
щений firewall лучше передать их на syslog-сервер. К при- меняется на глобальный, а в случае использования дина-
меру, передаём логи на хост 192.168.255.2 с идентификато- мического PAT, также меняется (на случайный) номер пор-
ром LOCAL7 (по нумерации firewall – 23), с уровнем warnings та отправителя. В таком виде пакет и отправляется полу-
и выше (critical, alerts, emergencies), а также с идентифика- чателю во внешней сети, который отсылает ответный па-
тором устройства «pix-gtw»: кет на указанные адрес и номер порта отправителя. Полу-
чив пакет из внешней сети, firewall ищет в таблице трансля-
logging on ций соответствующую запись и, если таковая имеется, мо-
logging trap warnings
logging facility 23 дифицирует полученный пакет, заменяя глобальный адрес
logging device-id string pix-gtw получателя локальным и в случае динамического PAT так-
logging host inside 192.168.255.2
же и номер порта получателя, после этого пакет отсылает-
На указанном хосте должен быть доступен по сети ся локальному хосту.
syslog-демон, а в конфигурации демона должна быть за- Практически все прикладные программы могут рабо-
пись для логов с нашим идентификатором, указывающая тать через NAT без каких-либо затруднений, т.к. произво-
на существующий файл: дится только замена локального адреса, в случае же при-
менения PAT не будут работать некоторые приложения, ко-
local7.* /var/log/pix.log торые, например, используют разные порты для входяще-
го и исходящего трафика.
Эти логи будут очень полезны при настройке и отладке Один из особых вариантов NAT – исключение из NAT
конфигурации firewall. (NAT Exemption). Исключение из NAT настраивается ко-
Не забудьте настроить архивацию этих логов, чтобы они мандой:
не занимали слишком много места.
nat 0 access-list
NAT и PAT
Трансляции предназначены для того, чтобы дать возмож- и отключает трансляцию для адресов, указанных в спис-
ность локальным хостам обращаться к хостам во внешнем ке доступа, т.е. обмен идёт без какой-либо трансляции во-
мире. Кроме этого, трансляции скрывают адреса локальных обще.
хостов, что положительно сказывается на безопасности.
В Cisco PIX используются два вида трансляций Network Зависимость трансляций от уровней
Address Translation (NAT) и Port Address Translation (PAT), безопасности интерфейсов
которые, в свою очередь могут быть статическими или ди- Как уже говорилось выше, способ настройки трансляции за-
намическими. висит от уровня безопасности интерфейсов – для настрой-
NAT позволяет транслировать каждый локальный адрес ки доступа из более безопасной сети в менее безопасную
в соответствующий ему глобальный один к одному. При ста- нужно использовать команду nat, а для доступа из менее
тическом NAT это соответствие задаётся жёстко. При дина- безопасной сети в более безопасную – static.
мическом NAT используются свободные адреса из задан- Для просмотра уровней безопасности можно восполь-
Таблица соответствий зоваться командой:
Откуда Куда Команда
show nameif
inside outside nat
inside www nat
которая также покажет и имена интерфейсов:
www outside nat
www inside static nameif ethernet0 outside security0
nameif ethernet1 inside security100
outside inside static
nameif ethernet2 www security20
outside www static nameif ethernet3 not_used security25

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


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

Таблица трансляций (xlate) Обращения из внешнего мира к серверу


Для трансляции соединений firewall создаёт таблицу соот- На нашем сервере есть несколько служб, которые долж-
ветствий, которая в терминологии Cisco PIX 520 называется ны быть доступны извне, в нашем случае это DNS, SSH,
xlate или translation slots. Мы можем посмотреть уже сущес- SMTP, FTP.
твующие записи в таблице командой «show xlate», а очис- Для настройки трансляции с интерфейса outside на ин-
тить всю таблицу – командой «clear xlate». Кстати, послед- терфейс inside используется команда «static».
нюю операцию рекомендуется делать после изменений пра- Команда static позволяет задать статическую транс-
вил трансляции, но учтите, что это приведёт к разрыву уже ляцию, указав точное соответствие локального адреса и
установленных соединений, если они созданы с использо- глобального адреса и порта. В качестве порта можно ука-
ванием какой-либо трансляции. зать его номер или имя. Соответствие номеров и имён пор-
Для удаления только определённых записей можно тов описано в документации. В конфигурации firewall все
указать глобальный или локальный адрес и, если это PAT, номера портов заменяются их именами, если таковые из-
то и соответствующий порт: вестны.
Кроме самой команды «static», необходимые разреши-
clear xlate global 1.2.3.246 тельные правила должны быть указаны в соответствующих
clear xlate local 192.168.255.6 lport 80
списках доступа (access-list).
При отсутствии обмена записи в таблице трансляций Синтаксис команды «static», используемый в данном
удаляются по истечении тайм-аута, который задаётся ко- случае, достаточно прост:
мандой «timeout xlate» и по умолчанию равен трём часам.
Записи для протокола UDP удаляются через 30 секунд пос- static (локальный_интерфейс, глобальный_интерфейс) ↵
протокол глобальный_адрес локальный_адрес
ле закрытия соединения, независимо от заданного значе-
ния тайм-аута. Так же как в описанном ранее случае использования ко-
манды «global» мы можем в качестве глобального адреса
Обращения с сервера во внешний мир указать ключевое слово interface.
Для настройки обращений сервера во внешний мир исполь- Следующей командой мы задаём статическую трансля-
зуются команды «global» и «nat». цию с глобального интерфейса outside на локальный интер-
Команда «global» создаёт пул глобальных адресов, фейс inside для протокола tcp с 25-го порта глобального ин-
т.е. реальных адресов на внешнем интерфейсе, которые терфейса на 25-й порт хоста 192.168.255.2:
используются определённой трансляцией. В нашем случае
пул состоит только лишь из одного адреса, который непос- static (inside,outside) tcp interface 25 192.168.255.2 25
редственно указан на внешнем интерфейсе firewall, поэто-
му мы можем использовать ключевое слово interface вмес- Применительно к SMTP-протоколу нужно упомянуть,
то собственно IP-адреса. что firewall из соображений безопасности изменяет стро-
Следующей командой мы создаём глобальный пул ку приветствия нашего SMTP-сервера, заменяя почти всё
с номером 1 на внешнем интерфейсе, использующий ад- звёздочками. Например, из строки:
рес этого интерфейса, т.е. все обращения из этого пула бу-
220 mail.domain.tld ESMTP Sendmail 8.13.0/8.13.0; Mon, 5 Dec 2005
дут уходить во внешний мир с нашего глобального адре-
18:01:32 +0600 (KGT)
са 1.2.3.246:
получается что-то вроде этого:
global (outside) 1 interface
220 ********************************0******0********** ***200****
*0***0 *0*00 *****
Команда «nat» позволяет нам указать локальные ад-
реса, которые должны транслироваться, и задаёт соот- По аналогии с предыдущей командой выполняем сле-
ветствие с пулом глобальных адресов, описанным коман- дующие:
дой «global».
Следующей командой мы задаём, что обращения с хос- static (inside,outside) tcp interface 20 192.168.255.2 20
static (inside,outside) tcp interface 21 192.168.255.2 21
та 192.168.255.2, подключенного на интерфейсе inside, бу- static (inside,outside) udp interface 53 192.168.255.2 53
дут транслироваться через глобальный пул номер 1:
Для настройки подключения к серверу по протоко-
nat (inside) 1 192.168.255.2 255.255.255.255 лу ssh придётся использовать отличный от стандартного
порт, т.к. 22-й занят самим firewall. Следующей командой
Соответствие глобальных и локальных пулов опреде- мы задаём соответствие свободного порта на внешнем ин-
ляется по номеру (NAT ID), который указывается в этих ко- терфейсе firewall (например 222) и стандартного ssh-пор-
мандах. та сервера:
Всё, можно проверять доступность внешнего мира
с сервера. static (inside,outside) tcp interface 222 192.168.255.2 22

56
безопасность
Теперь при подключении к серверу извне нужно будет access-list 110 permit ip 10.0.1.0 255.255.255.0 ↵
host 192.168.255.6
указать номер порта. Например, для клиента из пакета access-list 110 permit ip host 192.168.255.2 ↵
openssh команда будет выглядеть вот так: host 192.168.255.6

ssh -p 222 malik@1.2.3.246 Конечно же, firewall должен иметь маршрут для адре-
сов локальной сети:
В то время как подключение к самому firewall будет про-
изводиться как обычно: route inside 10.0.1.0 255.255.255.0 192.168.255.2

ssh pix@1.2.3.246 Этот маршрут на firewall необходим и для взаимодейс-


твия веб-сервера с локальной сетью, т.к. firewall является
Ну и конечно, в списке доступа на внешнем интерфей- для веб-сервера маршрутизатором по умолчанию.
се должны быть соответствующие разрешающие правила
для обращений на порты, для которых мы настроили ста- Дополнительные примеры трансляций
тическую трансляцию: Возможно, кого-то заинтересуют несколько примеров
трансляций, не имеющих прямого отношения к нашей схе-
access-list 101 permit tcp any host 1.2.3.246 eq 20 ме. Соответственно и адреса в примерах не имеют отно-
access-list 101 permit tcp any host 1.2.3.246 eq 21
access-list 101 permit tcp any host 1.2.3.246 eq 25 шения к описанной схеме.
access-list 101 permit udp any host 1.2.3.246 eq 53
access-list 101 permit tcp host 4.5.6.100 ↵
host 1.2.3.246 eq 222 Первый пример
У нас есть несколько глобальных адресов, и мы хотим, что-
бы обращения из внешнего мира на какой-либо их порт
Доступ к веб-сайту из внешнего мира транслировались на определённые локальные адреса:
Вот этой командой мы задаём статическую трансляцию
с интерфейса outside на интерфейс www для протокола static (inside,outside) tcp 1.2.4.1 80 192.168.0.1 80
static (inside,outside) tcp 1.2.4.2 80 192.168.0.2 80
tcp с 80-го порта внешнего интерфейса на 80-й порт хос-
та 192.168.255.6:
Второй пример
static (www,outside) tcp interface 80 192.168.255.6 80 У нас есть несколько глобальных адресов, и мы хотим, что-
бы все обращения от некоторых локальных хостов уходили
В список доступа на внешнем интерфейсе добавляем во внешний мир со строго определённых глобальных ад-
разрешительное правило для 80-го порта: ресов – настраиваем два разных глобальных пула и соот-
ветствующие им NAT:
access-list 101 permit tcp any host 1.2.3.246 eq 80
global (outside) 1 1.2.4.1
global (outside) 2 1.2.4.2
Инициировать исходящие соединения с веб-сервера nat (inside) 1 192.168.0.1 255.255.255.255
мы не позволяем в целях повышения безопасности веб- nat (inside) 2 192.168.0.2 255.255.255.255
сервера.
Поэтому более никаких трансляций на внешнем интер- т.е. обращения с хоста 192.168.0.1 уйдут во внешний мир
фейсе для этого сервера мы не задаём. с адреса 1.2.4.1, а обращения с хоста 192.168.0.2 уйдут с ад-
реса 1.2.4.2.
Доступ из локальной сети к веб-серверу А если при этом мы хотим, чтобы ещё и обращения из-
Если из локальной сети доступ к веб-сайту будет осущест- вне на определённые глобальные адреса транслировались
вляться также, как и из внешнего мира, т.е. только по прото- на соответствующие локальные, то нам надо сделать и об-
колу http и на тот же глобальный адрес (1.2.3.246), то и до- ратную трансляцию:
статочно будет статической транляции http-порта, но те-
перь нам нужно будет указать не ключевое слово interface, static (inside,outside) 1.2.4.1 192.168.0.1
static (inside,outside) 1.2.4.2 192.168.0.2
а именно IP-адрес, под которым мы бы хотели видеть веб-
сервер: В итоге у нас получается двунаправленная трансляция
с соответствием глобальных и локальных адресов.
static (www,inside) tcp 1.2.3.246 80 192.168.255.6 80
Документация
Если же мы хотим, чтобы веб-сервер был напрямую до- Вся документация, использованная для настройки firewall и на-
ступен с хостов локальной сети и от нашего сервера и об- писания данной статьи, была взята с сайта компании Cisco
ращения к нему вообще не транслировались, то надо ис- (http://www.cisco.com):
пользовать конструкцию «nat 0 access-list» и соответству- 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
nat (inside) 0 access-list 110 Firewall.

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


web

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

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

В
этой статье я хочу поделиться ния печатных отчетов. Однако созда- В чем заключаются
с вами опытом организации пе- ние информационной системы на ба- проблемы печати
чати документов в корпоратив- зе веб-технологий позволяет обой- в системе, основанной
ной информационной системе, постро- тись без этих средств – работа с фор- на веб?
енной на основе веб-технологий. мами и БД средствами CGI-скриптов Мы хотим распечатывать именно до-
Для чего нужны корпоративные на PHP или Perl реализуется без про- кументы, поэтому просто печать стра-
информационные системы, понятно блем. При этом мы получаем про- ницы из браузера не годится – сверху
всем. Большие и сложные обычно по- грамму, не требующую для своей ра- и снизу печатается служебная инфор-
купаются у сторонних производите- боты у клиента ничего, кроме браузе- мация (номера страниц, URL и т. д.), от-
лей, но не о них речь. Нередко подоб- ра, и позволяющую организовать уда- ключение этих полей представляет со-
ные системы создаются силами ИТ-от- ленный доступ. бой задачу, не имеющую универсаль-
делов. Для этого обычно применяет- И только одна проблема, элемен- ного решения. Кроме того, документы
ся некий инструментарий, объединя- тарная для MS Access, не имеет адек- бывают книжной и альбомной ориен-
ющий в себе средства создания эк- ватного решения для веб-программис- тации, а способа указать, как должен
ранных форм, работы с БД и созда- та. Это печать документов. быть ориентирован HTML-документ,

58
web
при печати, нет. (Вернее, в стандарте есть способ это ука-
зать [2], но вот когда это будет реализовано в браузерах,
не известно.)
Этих проблем лишен формат PDF. Но тут встает во
весь рост вопрос формирования документа. Библиоте-
ки для работы с PDF существуют, но сформировать кра-
сивый документ с их помощью будет непросто. А как быть
с необходимостью изменять документы время от време-
ни (взять хотя бы счет-фактуру)? Программист на Access
просто подправит документ (report), возможно, одним дви-
жением мыши…
Я предлагаю организовать печать с веб-сайта при помо-
щи пакета OpenOffice. Цепочка действий будет такой: мы де-
лаем в OpenOffice макет документа и помещаем его на сер- Рисунок 1. Макет
вер. Веб-скрипт заполнит поля в макете и добавит необхо-
димые строки, в результате чего получится готовый доку- рамки, графические элементы, колонтитулы, устанавли-
мент, который останется только отправить на принтер. ваем необходимую ориентацию документа. Макет исполь-
зуется многократно, и при необходимости внести в форму
Что такое OpenOffice? документа изменения его нужно просто загрузить в редак-
OpenOffice – это бесплатный пакет офисных программ [3]. тор. Пример макета представлен на рис. 1.
Данный проект возник по инициативе и существует при В рамках описываемой технологии мы выделяем три
поддержке фирмы Sun. Недавно вышла версия 2.0, но опи- части документа: начальную часть, табличную часть (груп-
сываемая здесь технология реализована мной для версий пу повторяющихся строк) и конечную часть, содержащую
1.1.*, хотя есть основания полагать, что все будет работать суммы, линии для подписей и т. д. Если документ не со-
и с последней версией, несмотря на переименование суф- держит табличной части, то он состоит только из одной на-
фиксов у файлов документов. OpenOffice способен откры- чальной.
вать и редактировать основные форматы MS Office и ра- Любая часть может содержать поля. Поле – это просто
ботает практически под любой ОС. Проект прилично доку- текст с именем поля, который будет заменен значением по-
ментирован. В рамках данной статьи нас будет интересо- ля при генерации документа. Имя поля может быть набра-
вать собственный формат документов OpenOffice. но любым шрифтом и отформатировано любым способом,
Разные приложения OpenOffice (Writer, Calc…) исполь- и должно соответствовать такому шаблону:
зуют собственный суффикс для файлов, но файлы эти
имеют почти схожую структуру – это ZIP, который содер- fl.<part>.<field>
жит главный файл content.xml и вспомогательные, содер-
жащие стили, пользовательские настройки, ресурсы и т. д. fl – это метка начала имени поля, <part> – указатель части
Content.xml – это обычный XML-файл, который можно обра- документа (hd – начальная часть, ft – конечная, или имя ви-
батывать при помощи всех известных XML-средств. да строки табличной части), <field> – имя поля данной час-
Итак, мы будем самостоятельно формировать файл ти документа. Например:
формата OpenOffice и распечатывать его при помощи са-
мого OpenOffice. Для этого OpenOffice должен быть установ- fl.ft.Total
лен или на машине клиента, или на самом сервере. Как мне
кажется, для внутрикорпоративной системы более предпоч- Части документа явным образом никак не задаются и
тителен серверный вариант. При помощи OpenOffice легко определяются по наличию соответствующих полей. Соот-
получить и PDF, но об этом в конце статьи. ветственно поля различных частей не могут перемешивать-
ся и должны следовать в строгом порядке: сначала все по-
Как сгенерировать файл ля начальной части, затем табличной и конечной.
С точки зрения оформления документа, возможностей ре- Табличная часть у документа может быть только одна,
дактора OpenOffice (OOWriter) вполне достаточно, поэто- но зато видов строк у нее может быть несколько. У доку-
му я ограничусь примерами использования файлов фор- мента на рис. 1 два вида строк. Эти виды могут отличать-
мата SXW, хотя предлагаемая технология будет работать ся составом полей или оформлением. В данном случае
практически с любым файлом, созданным приложениями два вида строк заведены для создания документа с «по-
из пакета OpenOffice. В версии 2.0 основной формат доку- лосатой» таблицей.
ментов OOWriter имеет суффикс ODT, но структура фай- Строка табличной части должна представлять собой
лов очень похожа. вполне определенный элемент документа. Определенный,
Для начала мы создаем макет в OOWriter. Макет – это потому что при разборе макета скрипт должен будет выде-
почти готовый документ, в котором программно заполняе- лить эту самую строку табличной части и размножить ее
мые поля обозначаются специальными сигнальными фра- по числу строк в таблице. При размножении имена полей
зами. Выделяется специальными маркерами и табличная в строке табличной части будут заменяться соответствую-
часть, если таковая имеется. Щедро используем шрифты, щими значениями.

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


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

Пример скрипта
Что, собственно, нужно сделать? Распаковать ZIP, «прой-
тись» по XML-файлу и заменить одни текстовые значения
на другие. Отыскать элемент строки табличной части, раз-
Рисунок 3. Сформированный документ
множить его по числу строк, опять же, заменяя поля значе-
ниями. Наконец нужно поместить новый XML в копию стар- 10: $hdr = &$doc->GetHeaderPart("Number", "Date", "Byer");
11: // Определяем поля в 2 типах строк табличной части
го ZIP и сохранить ZIP под новым именем. 12: // (С белым и серым фоном)
Возможность работы с ZIP и XML сейчас имеется, навер- 13: $row1 = &$doc->GetNewRow("tb1", "Description", ↵
"Numb", "Price", "Amount");
ное, во всех языках. Здесь представлен пример реализа- 14: $row2 = &$doc->GetNewRow("tb2", "Description", ↵
ции на PHP. Собственно операции по обработке SXW-фай- "Numb", "Price", "Amount");
15: // Определяем поле в конечной части
ла убраны в библиотечный файл OODocFiller.php. Библио- 16: $ftr = &$doc->GetFooterPart("Total");
тека очень незатейлива, но все же для публикации ее тек- 17:
18: // Формирование документа
ста в журнале великовата. Скачать ее можно по ссылке [1], 19: // Заполняем начальную часть
никаких условий по ее применению автор не накладывает. 20: $hdr->Fill("12", "1.10.2005", "И.И. Иванов");
21: // Заполняем табличную часть
Платформа может быть любой, для работы самого скрип- 22: // Виды строк чередуются для «полосатости»
та OpenOffice не нужен (он понадобится для печати). PHP 23: $row1->Fill("Сапоги»,"2","12,50", "25,00");
24: $row2->Fill("Пироги»,"1","10,00", "10,00");
должен быть скомпилирован со следующими модулями: ZIP, 25: $row1->Fill("Плюшки»,"10","1,00", "10,00");
XPATH (для разбора XML), ENCODE (для перекодирования 26: $row2->Fill("DVD+R","1","5,00", "5,00");
27: // Заполняем конечную часть
текстовых значений в UTF 8). К сожалению, в 4 версии PHP 28: $ftr->Fill(«50,00»);
нет штатного модуля для создания ZIP-файлов, поэтому я 29: // Остается только сохранить сформированный документ ↵
в файл
использую библиотеку zip.lib.php из состава дистрибутива 30: if($doc->Error == ""){
phpMyAdmin. Скачать ее можно с [1] или [4]. 31: $fd = fopen ("report.sxw", "wb");
32: $out = fwrite ($fd, $doc->GetBinaryResult());
Представленный ниже скрипт будет создавать документ 33: fclose($fd);
OpenOffice, используя макет из рис. 1. Макет лежит в фай- 34: }
35: else{
ле template.sxw в той же директории, что и скрипт. 36: print "Error: ".$doc->Error;
37: }
01: include('OODocFiller.php');
02:
03: // Подключаем макет После запуска скрипт должен создать файл report.sxw
04: $doc = new OODocFiller('template.sxw'); в этой же директории (см. рис. 3). Если, конечно, вы не за-
05: // Задаем параметры
06: $doc->SetParameter("RowElement", 'text:p'); были обеспечить соответствующие права.
07: $doc->SetParameter("Encoding", "WINDOWS-1251"); Небольшие пояснения. Строки 6 и 7 задают параметры.
08:
09: // Определяем поля в начальной части Параметров у этой библиотеки хватает, ознакомиться с ни-

60
web
ми можно в файле OODocFiller.php. Все они имеют значе- на своем сервере организовали вторую X-консоль. Вот что
ния по умолчанию, поэтому если вас устроят стандартные мы добавили в наш /etc/inittab файл:
настройки, то явно задавать ничего не нужно. Даже здесь
строки 6 и 7 избыточны (даны для примера), они задают x1:5:respawn:/usr/X11R6/bin/xinit /usr/X11R6/bin/xclock ↵
-- /usr/X11R6/bin/Xorg :1
значения, которые используются по умолчанию. Внутрен-
нее представление OpenOffice – UTF-8, поэтому важно пра- Смысл полей этой строки примерно следующий:
вильно задать кодировку, в которой ваш скрипт будет давать  x1 – это просто уникальный идентификатор строки;
значения полей при вызове библиотечных функций.  5 – это уровень инициализации, при котором строка бу-
Строка 10, создавая ссылку на обьект начальной час- дет использоваться (5 – графический режим);
ти, определяет и имена полей в ней. Строка 16 полностью  respawn – перезапускать при завершении;
идентична 10, 13 и 14 задают два типа строк табличной час-  xinit xclock – Xorg-запуск графической консоли с про-
ти. Внутри макета они идентифицируются по именам, ко- граммой часы (наличие часов не дает xinit завершить-
торые задаются в качестве первого параметра. Остальные ся);
параметры тоже имена полей.  1 – номер создаваемого графического экрана. Этот но-
Строка 20 заполняет поля начальной части. Парметр Fill мер экрана мы будем сообщать OpenOffice при запуске
может быть единым массивом значений, что удобно при ра- в пакетном режиме.
боте с БД. Вместо строк 23-26 обычно находится цикл вы-
борки значений из таблицы БД. Теперь нужно определиться, под каким пользователем
веб-сервер будет запускать скрипты для печати. Этот поль-
Печать зователь должен обязательно иметь домашнюю директо-
Итак, мы получили файл. Как отправить его на принтер? рию. Необходимо один раз зайти этим пользователем и за-
Первый способ – это печать с клиента. Для этого на кли- пустить любую программу OpenOffice. При этом в домашней
енте должен быть установлен OpenOffice. При инсталляции директории создадутся персональные файлы OpenOffice.
он добавляет свои типы файлов в системный MIME, поэто- Без этих файлов пакетный режим, к сожалению, не срабо-
му серверу достаточно передать сгенерированный файл тает, поэтому важно, чтобы при работе скрипта перемен-
с нужным HTTP-заголовком, и OpenOffice будет автомати- ная окружения HOME была определена и указывала имен-
чески запущен браузером. но на домашнюю директорию этого пользователя.
Вот пример скрипта, который отправляет файл подоб- Если все требования соблюдены, то теперь скрипт, ра-
ным образом: ботающий под упомянутым пользователем, при помощи
команды:
$content = file_get_contents("report.sxw");
header("Pragma: public"); <путь к исп.файлам OO>/soffice -display :1 –p <документ>
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"); чанию. Обратите внимание, что число у display – это номер
header("Content-Disposition: attachment; filename= ↵
report.sxw;"); графического экрана из inittab.
header("Content-Transfer-Encoding: binary"); Если же на вашем Linux-сервере определено несколько
header("Content-Length: ".filesize("report.sxw"));
print $content; принтеров и вы хотите при печати иметь возможность вы-
бора принтера, то познавательный процесс настроек бу-
Второй способ – это отправка на печать непосредствен- дет продолжен.
но с сервера (мы ведь ведем речь о внутрикорпоративной Дело в том, что в версиях 1.1.* не убрали какую-то отла-
информационной системе). дочную заглушку. Поэтому в пакетном режиме OpenOffice
Для отправки документа на печать из-под Windows до- всегда печатает на принтере, являющимся по умолчанию
статочно запустить следующее: на момент старта программы.
Как же быть? Мы еще не тестировали на этот счет
<путь к исп.файлам OO>\SOFFICE.EXE –pt"<принтер>" <документ> OpenOffice 2.0, а для версии 1.1.* вышли из положения при
помощи печати через PDF. Файлы PDF печатаются систем-
или при печати на принтер по умолчанию: ными средствами Linux куда угодно, и кроме того, возмож-
ность генерации PDF имеет самостоятельную ценность.
<путь к исп.файлам OO>\SOFFICE.EXE –p <документ>
Как конвертировать SXW в PDF
На Linux-сервере все будет немного сложнее, плюс OpenOffice хорошо сохраняет свои файлы в PDF. Можно это
для настройки потребуются привилегии root. Но преодоле- делать и в пакетном режиме. Вот как выглядит подготовка
ние трудностей всегда раздвигало горизонты. Linux-сервера для реализации такой возможности.
Прежде всего, для OpenOffice, даже для работы в пакет- Прежде всего необходимо добавить макрос в среду
ном режиме, необходимо наличие запущенного X-термина- OpenOffice. Заходим в систему пользователем, под кото-
ла. На сайте oooforum.org [5] можно найти рецепты, как орга- рым будут работать скрипты, и запускаем OpenOffice. Про-
низовать для этих целей виртуальный терминал, например ходим по меню «Tools → Macros → Macro» и нажимаем кноп-
Xvfb [6], который вовсе не имеет доступа к экрану. Мы же ку «Organizer», выбираем закладку (tab) «Libraries» и в выпа-

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


web
#!/bin/bash

# Первый параметр – имя принтера,


# второй – имя (лучше полное) SXW-файла.

Printer=$1

# Получаем имя для PDF-файла


PDFname=${2/.sxw/.pdf}

# Внимание, замените :1 на номер графического дисплея,


# который вы указали в inittab
# Если вы назвали свою библиотеку не Example,
# то не забудьте подправить и это
/usr/lib/ooo-1.1/program/soffice -display :1 ↵
"macro:///Example.Print.ConvertWordToPDF($2)"
# В предыдущей строке мы создали PDF-файл с тем же
# именем (кроме суффикса) и в том же месте, что и SXW

# А теперь печатаем PDF


lp -s -d $Printer $PDFname

# Удаляем PDF
Рисунок 4. Окно редактора basic скрипта OpenOffice rm $PDFname

дающем списке «Application/Document» выбираем «soffice». Теперь, чтобы напечатать SXW-документ, нам доста-
Нажимаем кнопку «New» и вводим имя своей библиоте- точно запустить:
ки, например Example. Переходим на закладку «Modules»
и выбираем свою библиотеку (Example) из списка. Нажи- ooprint myprinter report.sxw
маем кнопку «New Module» и даем ему имя (Print). Теперь
выделяем появившийся модуль и нажимаем «Edit». Добра- Если же вместо печати нужна просто конвертация в PDF,
лись (см. рис. 4)! то нужно создать модифицированную версию ooprint. Наде-
Мы в более-менее привычном редакторе языка Basic. юсь, что это ни для кого не составит трудности.
Текст необходимых процедур:
Заключение
Sub ConvertWordToPDF( cFile ) Смысл данной статьи заключается не в описании представ-
On Error GoTo ErrHandler
' Открываем файл ленной библиотеки, а в демонстрации идеи. Для того что-
cURL = ConvertToURL( cFile ) бы добавить в веб-систему функцию печати, вовсе не обя-
oDoc = StarDesktop.loadComponentFromURL(cURL, ↵
"_blank", 0, Array(MakePropertyValue( "Hidden", ↵ зательно покупать что-то вроде CrystalReport. Обработка
True ),)) XML не сложна и может быть осуществлена на любом язы-
' Получаем имя для PDF-файла
cFile = Left( cFile, Len( cFile ) - 4 ) + ".pdf" ке. Кроме того, в качестве принт-процессора можно ис-
' Сохраняем через PDF-фильтр пользовать, например, TeX. Главное, берем макет, отыски-
cURL = ConvertToURL( cFile )
oDoc.storeToURL( cURL, Array(MakePropertyValue( ↵ ваем в нем поля…
"FilterName", "writer_pdf_Export" ),) Но OpenOffice все-таки заслуживает внимания. В целом
oDoc.close( True )
это зрелый и устойчивый продукт.
ExitSub: Описанная реализация вполне работоспособна, но тре-
Exit Sub
бует дальнейшего развития. Например, печать каждого эк-
ErrHandler: земпляра документа требует запуска тяжелого приложения
Shell("logger", 6, "-t ooffice ConvertWordToPDF: ↵
" + Error$) (soffice). Это может оказаться не быстро. Тут есть разные
пути модернизации.
End Sub
Во-первых, у OpenOffice есть резидентный модуль
Function MakePropertyValue( Optional cName As String, ↵ quickstart, который должен ускорять запуск. Можно попы-
Optional uValue ) As com.sun.star.beans.PropertyValue
Dim oPropertyValue As New com.sun.star.beans ↵ таться запускать quickstart из inittab.
.PropertyValue Во-вторых, у OpenOffice есть серверный режим, при ко-
If Not IsMissing( cName ) Then
oPropertyValue.Name = cName тором он будет обслуживать удаленные запросы. Есть API.
EndIf Но с этим разбираться и разбираться.
If Not IsMissing( uValue ) Then
oPropertyValue.Value = uValue Успехов!
EndIf
MakePropertyValue() = oPropertyValue
End Function Ссылки:
1. Файлы к статье – http://samag.ru/cgi-bin/go.pl?q=source.
Это все есть в файле print.bas на [1] – открываем его ка- 2. Cпецификация w3c для CSS 2 – http://www.w3.org/TR/REC-
ким-нибудь редактором и копируем содержимое в модуль. CSS2/page.html.
Сохраняемся и выходим из OpenOffice. 3. OpenOffice – http://www.openoffice.org.
Для упрощения использования механизма печати через 4. PhpMyAdmin – http://www.phpmyadmin.net.
PDF создадим небольшой shell-скрипт, который разместим 5. Форум по OpenOffice – http://www.oooforum.org.
в директории, упоминаемой в PATH, например, пусть пол- 6. Virtual framebuffer X server for X Version 11 – http://www.xfree86.
ное имя будет /usr/local/lib/ooprint: org/current/Xvfb.1.html.

62
web

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

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

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

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


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

Можно перенаправлять не со всего сайта, а только с оп- Теперь перейдём непосредственно к раздаче прав до-
ределённого каталога или даже документа: ступа. Существует два способа указать права доступа к ка-
талогу веб-сайта средствами Apache: поместить в каталог
Особенности директив Listen и NameVirtualHost файл .htaccess либо использовать директиву <Directory>
Директива Listen имеет больший приоритет чем, NameVirtualHost. в файле конфигурации. В обоих случаях правила распро-
Она говорит, откуда принимать запросы. В то время как послед- страняются и на вложенные каталоги.
няя определяет, как обрабатывать полученный запрос. Это значит, Перечислим преимущества использования файла
что если указано значение «Listen 80», то Apache будет прослуши- .htaccess:
вать порт 80 на всех IP-адресах, и директива «NameVirtualHost  при его изменении не нужно перезапускать Apache;
10.0.10.15» не ограничивает запросы, пришедшие на другие адреса,  при одинаковом уровне доступа к разным ресурсам мож-
и они будут обрабатываться наравне с указанным адресом, а ес- но пользоваться ссылками на один файл .htaccess;
ли указано значение «Listen 10.0.10.15:80», то «NameVirtualHost  можно предоставить пользователю право редактирова-
192.168.100.18» не возымеет действия, и сайт будет не доступен ния этого файла, что удобно, если у нас сервер с мно-
из локальной сети. жеством клиентских сайтов.

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

Ну а мириться придётся с тем, что для каждого ката- Добавим в него пользователя chef:
лога необходимо описывать права отдельно (помним, что
для подкаталогов права наследуются), даже если они оди- # /usr/bin/htpasswd /var/www/main_users chef
наковые.
Правда, есть поддержка масок, например: Остальных пользователей добавляем аналогичным спо-
собом. Такие файлы создаём для каждой группы пользо-
<Directory ~ "^/www/.*/[0-9]{3}"> вателей с одинаковыми правами доступа к ресурсу. Одни
и те же группы можно использовать во всех сайтах.
будет соответствовать именам каталогов в /www/ состоя-
щим из трёх цифр, но это не всегда может облегчить си- Последние штрихи
туацию. В заключение можно для изящности выделить настрой-
Мы рассмотрим оба способа и изменим права доступа ку каждого сайта в отдельный файл, и подключить их
к двум каталогам сайта logos. в httpd.conf:
Первый. Описываем права доступа к каталогам в глав-
ном конфигурационном файле httpd.conf: Include /etc/httpd/conf/vhosts/teo.conf
Include /etc/httpd/conf/vhosts/logos.conf
Include /etc/httpd/conf/vhosts/pantheon.conf
<VirtualHost logos.mynetwork.ru>
DocumentRoot /var/www/html/logos
ServerName logos.mynetwork.ru Кроме изящности мы получаем удобство в быстром
ErrorLog /var/log/httpd/logos/error_log подключении и отключении сайта путём добавления/сня-
CustomLog /var/log/httpd/logos/access_log combined
<Directory /var/www/html/logos/info1> тия символа комментария «#» в начале строки. Это особен-
Options +Indexes но актуально, когда настройка каждого сайта раздувается
Order deny,allow
Deny from all на несколько десятков строк.
Allow from 192.168.100.11 Также нелишне будет настроить ротацию журналов с по-
Allow from 192.168.100.17
</Directory> мощью logrotate.
<Directory /var/www/html/logos/info2>
AuthType Basic
AuthName "Boss" Ссылки:
AuthUserFile "/var/www/main_users" 1. http://httpd.apache.org/docs/1.3/vhosts – официальная докумен-
Require valid-user
</Directory> тация по созданию виртуальных сайтов.
</VirtualHost> 2. http://httpd.apache.org/docs/2.0/vhosts – другая версия этой же
документации для версии Apache 2.0. Отличия, на мой взгляд,
Второй. Чтобы предоставить такие же права с помо- коснулись только формы самой документации.
щью файлов .htaccess, нужно создать соответственно файл 3. http://httpd.apache.org/docs/2.0/ru/howto/htaccess.html – посо-
/var/www/html/logos/info1/.htaccess: бие по настройке .htaccess-файлов.

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


web

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

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

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

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

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


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

68
web
<html> Во-вторых, не обращайте внимание на усложнившуюся
<head>
<meta HTTP-EQUIV="content-type" ↵ схему получения объекта XMLHttpRequest, она нужна лишь
CONTENT="text/html; charset=UTF-8"> для того, чтобы скрипт работал и в Internet Explorer. Кста-
<title>Проверка почты с помощью новейших ↵
технологий</title> ти, скрипт следует запускать именно с локальной машины
</head> (не сервера), потому как иначе браузер не разрешит вам
<body>
<script language="javascript" type="text/javascript"> обратиться с одного сервера к другому.
Следующее, что может быть непонятно, – это строки:
var xmlHttp = false;

function callServer(name, password) { var xmlobject = (new DOMParser()).parseFromString ↵


(xmlData, "text/xml");
try { var root = xmlobject.getElementsByTagName('feed')[0];
netscape.security.PrivilegeManager. ↵ var number = root.getElementsByTagName("fullcount");
enablePrivilege("UniversalBrowserRead"); alert(name+ ", количество писем в вашем ящике: " ↵
} catch (e) { + number[0].firstChild.nodeValue);
alert("Недостаточно прав, чтобы использовать ↵
Ajax!");
} Здесь мы используем DOM-модель док умен-
та для прохода по xml-дереву полученных от серве-
//обычный браузер
if (window.XMLHttpRequest) { ра данных. Ищем корневой элемент <feed>...</feed>
try { (getElementsByTagName(‘feed’)), затем в нём находим тэг
xmlHttp = new XMLHttpRequest();
} catch(e) { <fullcount></fullcount> (getElementsByTagName(“fullcount”))
xmlHttp = false; и выводим значение, которое находится в этом тэге
}
} else (number[0].firstChild.nodeValue). Изначальный xml-код вы-
глядит примерно так:
/ случай IE
if (window.ActiveXObject) {
try { <feed version="0.3">
xmlHttp = new ActiveXObject ↵ <title>Gmail - Inbox for Vasya_Pupkin@gmail.com</title>
("Msxml2.XMLHTTP"); <tagline>New messages in your Gmail Inbox</tagline>
} catch(e) { <fullcount>1</fullcount>
try { <link rel="alternate" ↵
xmlHttp = new ActiveXObject ↵ href="http://mail.google.com/mail"type="text/html"/>
("Microsoft.XMLHTTP"); ...
} catch(e) { </feed>
xmlHttp = false;
} Чтобы скрипт корректно работал на вашей машине, же-
}
} лательно иметь Mozilla-совместимый браузер и быть авто-
ризованным в системе GMail (http://gmail.com).
xmlHttp.onreadystatechange = function() {
if (xmlHttp.readyState == 4) {
var xmlData = xmlHttp.responseText; Заключение
var xmlobject = (new DOMParser()).parseFromString ↵
(xmlData, "text/xml"); Мы разобрались с основами Ajax, с самым базовым функци-
var root = xmlobject.getElementsByTagName ↵ оналом, который использует любое ajax-приложение. В сле-
('feed')[0];
var number = root.getElementsByTagName ↵ дующих статьях я постараюсь показать всю мощь этой тех-
("fullcount"); нологии. Будет рассказано о таких вещах, как соединение
alert(name+ ", количество писем в вашем ящике: ↵
" + number[0].firstChild.nodeValue); с SQL-сервером, создание оконного интерфейса с подде-
} ржкой техники Drag&Drop. Вы узнаете о доступных фрейм-
}
xmlHttp.open('GET', 'https://'+name+':'+password+ ↵ ворках и различных средах разработки, позволяющих зна-
'@gmail.google.com/gmail/feed/atom', true); чительно упростить жизнь ajax-разработчика.
xmlHttp.overrideMimeType('text/xml');
xmlHttp.send(null); Напоследок, чтобы еще больше подогреть ваш инте-
} рес к этой замечательной технологии, приведу несколь-
</script> ко ссылок наиболее впечатляющих проектов, выполнен-
<form name='gmail'> ных с помощью Ajax.
Имя: <input name="name" type="text">
Пароль: <input name="password" type="password"> <br />
<a href="#" onclick="javascript:callServer ↵ Ссылки:
(gmail.name.value, gmail.name.password);"> ↵
Проверить почту</a> 1. http://www.backbase.com/demos/RSS – Backbase Ajax RSS
</form> reader, «читалка» RSS-лент новостей. Пока что в демо-режи-
</body>
</html> ме, но посмотреть на это стоит.
2. http://www.squarefree.com/htmledit – Real-time HTML Editor, поз-
Посмотрим, что нового здесь появилось. Во-первых, воляет редактировать HTML-код и одновременно его просмат-
следует вас предупредить, что по умолчанию ваш брау- ривать.
зер не позволит загрузить данные с нелокального ресурса. 3. http://www.unwieldy.net/ajaxim – icq- и jabber-подобный клиент
Поэтому мы попробуем изменить свои привилегии для до- для обмена сообщениями. Пока что тоже только в демо-ре-
ступа к данным Gmail: жиме.
4. http://demo.primalgrasp.com/spell/check_spelling – проверка ор-
netscape.security.PrivilegeManager.enablePrivilege ↵ фографии, не выходя из браузера.
("UniversalBrowserRead");
5. http://code.jalenack.com/periodic – таблица Менделеева.

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


web

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


или Операции под наркозом

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

70
web

В
се мы прекрасно знаем, что любой код перед уста- Ответ на поставленную проблему напрашивается сам
новкой клиенту должен быть тщательно оттестиро- собой: мы хотим, чтобы скрипт однозначно определял,
ван, все ошибочные ситуации описаны, и сообщения кто перед ним – разработчик или обычный пользователь,
о них должны быть максимально информативны. и в соответствии с этим работал по-разному. Для этого от-
С другой стороны, все мы знаем, что теория и практи- ладочный код выведем в условный блок, условием вхо-
ка – две разные вещи. Обнаружив ошибку, которую на тес- да в который будет то, что пользователь является разра-
товой версии системы смоделировать не удалось, мы стал- ботчиком.
киваемся с необходимостью редактировать код, уже уста- О том, как это установить смотрим ниже.
новленный клиенту и скорее всего выполняющийся в этот
момент. Тут возникает необходимость сделать всё как мож- Специальная GET-переменная
но более незаметно и безопасно. Довольно небезопасный способ, но нередко встречаемый.
О некоторых методах того, как это сделать, мы погово- Смысл заключается в помещении отладочного кода в ус-
рим в этой статье. ловный блок, проверяющий, установлена ли определённая
глобальная переменная.
Условия работы Например, так:
В рассматриваемой ситуации нам придётся работать со
скриптами, которые уже установлены у клиента и могут //---код скрипта
if (isset($_GET[‘debug’])) {
быть востребованы в любой момент. echo ‘Debug info!’;
Поэтому необходимо ввести некоторые ограничения: }
//---код скрипта
 Нам необходимо локализовать и исправить ошибку,
не испортив правильно работающие скрипты. Плюс метода – быстрота доступа к режиму отладки.
 Процесс нашей отладки должен быть виден только нам, Минус в том, что, зная имя переменной, отладку может
пользователи не должны ничего заметить. увидеть любой желающий, кроме того, метод не подходит,
 Мы не можем установить или перенастроить ПО на сер- если POST передает параметры скрипту.
вере, т.е. использование сторонних отладочных систем
невозможно, но мы можем добавлять новые или редак- Идентификация по IP
тировать старые php-скрипты. Очень удобный и довольно надёжный способ. Как и во всех
 Мы имеем только ssh (и/или telnet) и http-доступ. описанных тут методах, отладочный код помещается в ус-
ловный блок, условие – совпадение IP-пользователя с ус-
Теперь полностью прояснив, что нам можно, а чего не- тановленным разработчиком.
льзя, попробуем сделать нашу работу наиболее комфорт- Пример:
ной и продуктивной.
If ($_SERVER[‘REMOTE_ADDR’]==='123.234.234.15') {
Echo ‘Debug info2!’;
Идентификация разработчика }
В процессе поиска и исправления ошибки нам придётся
менять порядок работы программы и получать различную Плюс – вывод отладки не зависит от того, что мы пере-
информацию. даём скрипту.
Безусловно, можно пойти старым проверенным спосо- Минусы в следующем. Во-первых, не редактируя код,
бом и выводить отладку в error_log, но этот метод заста- мы не можем отключить отладку, т.е. для того чтобы пос-
вит нас метаться между браузером и файлом лога, замед- мотреть, как было и как стало, нам придётся редактиро-
лит выполнение скрипта для всех пользователей и засорит вать код.
лог, т.к. исполняться он будет для всех одинаково. Но да- Во-вторых, при использовании proxy-сервером REMOTE_
же смирившись с такими неудобствами, нельзя забывать, ADDR однозначно не определяет компьютер. Но даже про-
что код, который вы вводите в скрипт, также не застрахо- верка на значение HTTP_X_FORWARDED_FOR не даёт
ван от ошибок. 100% гарантии, т.к. эти значения зависят от того, что воз-

Определяем основные термины ют сложную вложенность, из-за этого информация интерпрета-


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

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


web
вращает веб-сервер и proxy, а доверять им можно толь- ка определённым сроком после последней модификации
ко отчасти. файла, например, так:

Идентификация по cookie if ( ( time() - filemtime(__FILE__) ) < BLOCK_LIFE_TIME) {


//…
Пожалуй, самый надёжный способ определить в пользо- }
вателе разработчика – поставить условие на исполнение
отладочного блока – наличие определённой в cookie пе- где BLOCK_LIFE_TIME – константа, определяющая вре-
ременной. менной промежуток. Кстати, подключив фантазию, мож-
Пример: но, например, сделать систему оповещения о забытой от-
ладке.
if (!empty($_COOKIE[‘debug’])) { Всё вышеописанное очень удобно собрать в одну или
echo ‘Debug info3!’;
} несколько вспомогательных функций и подгружать их
как include при необходимости.
Плюс в том, что отладку будет видеть только тот поль-
зователь, у которого установлена cookie для данного ресур- Подставной файл
са с определённой переменной. Это позволяет достаточ- Зачастую количество отладочных блоков превышает до-
но просто давать доступ к отладочной информации толь- пустимый порог, и скрипт превращается в смесь разроз-
ко тем, кому это разрешено. Также очень удобно переклю- ненных кусков кода. Чтобы этого не было, можно использо-
чаться между режимами, выставляя и убирая cookie-пе- вать метод подставного скрипта. Суть метода в том, что мы
ременную. разделяем наш скрипт на стабильный и нестабильный. До-
Минусы в том, что опять же возможно получение не- ступ к нашему скрипту осуществляется через специаль-
санкционированного доступа к отладочной информации. ный подставной скрипт, который определяет, что за поль-
Если злоумышленник узнает, какая cookie-переменная уп- зователь перед ним и подгружает стабильный или неста-
равляет выводом, он может сформировать такую же cookie, бильный код.
но этого достаточно просто избежать, меняя имя перемен- Например, мы ведём серьёзные работы со скриптом
ной, или способом, описанным чуть ниже. myscript.php.
Для удобства управлением отладки можно написать Переименуем стабильную версию в myscript.php.stable,
и установить у клиента скрипт по установке и удалению а нестабильную – в myscript.php.unstable и создадим сле-
нужной cookie-переменной. дующий подставной скрипт myscript.php:

Комбинированный способ <?php


$d_file=__FILE__;
Два вышеописанных способа можно скомбинировать в один //is_debug функция, проверяющая, кто использует скрипт –
и таким образом избежать проблем, связанных как с неуни- //обычный пользователь или разработчик
if (is_debug()) {
кальным IP, так и с кражей cookies. onyma_include($d_file.'.unstable');
Пример: }
else {
onyma_include($d_file.'.stable');
if (!empty($_COOKIE['DBG']) }
&&($_SERVER[‘REMOTE_ADDR’]=== '123.234.234.15')) { ?>
echo ‘Debug4’;
} Таким образом, каждый будет работать с той версией,
которая необходима.
В принципе, используя скрипт установки cookie-пе- Нетрудно заметить, что приведённый подставной скрипт
ременной со случайным именем из предыдущего разде- является универсальным и при использовании с другими
ла с авторизацией в начале работы, можно IP вносить как скриптами не требует ничего, кроме изменения своего име-
значение в cookie (параноики могут его ещё и кодировать), ни. Так же обратите внимание на то, что мы меняем расши-
и тогда отладочный блок примет более удобный и универ- рения у скриптов, и без специальной настройки веб-серве-
сальный вид. ра их можно будет загрузить как обычный текст!
Теперь управлять режимом выполнения удалённого
скрипта можно, не изменяя код. Отслеживание ошибки
Теперь, когда мы можем делать почти всё что захотим, не бо-
Время жизни отладки ясь быть замеченными, поговорим непосредственно о по-
Чтобы, исправив ошибку и случайно забыв об одном за- иске самой ошибки.
терявшемся блоке, потом не ломать голову, почему это у
нас всё работает не так, удобно ограничить время жизни Ошибка PHP
отладки. Рассмотрим самую простую ситуацию, когда интерпрета-
Если использовать метод с cookie, то тут всё просто – тор сообщает нам о возникновении ошибки в конкретной
указываем время жизни cookie в функции setcookie, и де- строке конкретного файла.
ло в шляпе (null означает время жизни до закрытия браузе- В этом случае удобней всего установить свой обра-
ра). Но если этот способ нам по каким-то причинам не под- ботчик ошибкой (error_handler) и внутри вызвать стан-
ходит, то можно ограничить время жизни отладочного бло- дартную PHP-функцию debug_backtrace() (однозначно

72
web
определит путь к ошибке), вывести значения элемен- к месту, где она выводится, и отключаем анализатор, что-
тов суперглобального массива $GLOBALS и параметра бы не выполнять напрасную работу.
error_context. Подобным же методом можно найти место вывода
Пример: и формирования нужной строки или выполнения некото-
рой операции, а также отслеживать «жизнь» глобальных
If (is_debug()) { переменных (только глобальных) – своего рода Watch-фун-
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’); трукцию declare для отслеживания истории жизни пере-
} менной, по сути дела, мы сделали аналог функции watch
// место перед возникновением ошибки
If (is_debug()) { в отладчике.
set_error_handler($eh); Далее мы рассмотрим, как с помощью этой конструкции
}
реализовать простенькое подобие отладчика.
Таким образом, мы получим полную информацию о том,
где и как возникла ошибка. Очень часто достаточно прос- Сетевой отладчик
то вывести debug_backtrace в месте её возникновения. Для реализации сетевого отладчика нам будет необходи-
мо, чтобы PHP был собран с поддержкой сокетов. В ка-
Ошибка в алгоритме честве сервера управления отладкой проще всего вы-
Теперь рассмотрим задачку посложней. Допустим, код вы- брать приложение терминального типа (например, в Linux
полняется без ошибок, но результат не совпадает с наши- удобно использовать netcat), которое будет запускаться
ми ожиданиями. Очевидно, что ошибка где-то в алгоритме, в качестве сервера, ожидающего соединения, к примеру,
но как же её локализовать? на порт 9998. Клиентом будет наш отлаживаемый скрипт,
Для начала нужно чётко определить, что мы должны который будет получать команды и возвращать результа-
получить, и чем ожидаемый результат отличается от по- ты действия, а функцию отладки реализуем с помощью
лученного. тик-функции.
Свести различия нужно к какому-нибудь конкретному Схема работы будет следующая: при запуске скрипта
тезису, к примеру: «Тут мы должны были увидеть две стро- создаётся сокетное соединения с сервером отладки. Пос-
ки, а видим только одну». После этого нам придётся про- ле этого при каждом тике запускается нами определённая
вести анализ кода и определить переменные, от которых функция отладки, которая посылает данные о текущем со-
зависит вывод данных строк. стоянии к серверу и ждёт ответа – команды:
Сделать это можно, к примеру, такими способами:  s (step) – один шаг вперёд.
Ограничиваем код выводом двух отладочных сообще-  bp (break point) – точка останова. Определяется как но-
ний и сдвигаем их друг к другу до тех пор, пока они не будут мер строки и имя файла.
обрамлять строки, считаемые нами ошибочными.  st (stop) – немедленная остановка выполнения.
Второй способ заключается в анализе вывода скрип-  g (go) – выполнить скрипт до конца.
та. Для этого включаем буферизацию вывода и обработ-
чик на каждый тик PHP: После получения одной из описанных команд отладчик
её обрабатывает и выполняет необходимые действия.
<?php Приведем код:
define('FIND_PATERN','/some_str/');

function find_str() { <?php


if (preg_match(FIND_PATERN,ob_get_contents())) { // Отключим буферизацию, чтобы видеть пошаговое
$db=debug_backtrace(); // выполнение программы
print_r($db); ob_implicit_flush();
unregister_tick_function('find_str'); // Убираем лимит времени на выполнение скрипта, т.к. это
} // может воспрепятствовать пошаговому выполнению
ob_flush(); // Это необходимо для сбрасывания буфера set_time_limit(0);
}
// Функция посылки сообщения отладчику
function D_write($msg) {
ob_start(); global $fp;
if (is_resource($fp)) {
register_tick_function('find_str'); fwrite($fp,"$msg\n");
// тут можно поставить побольше, хотя от этого зависит }
// точность места определения }
declare (ticks=1); // Функция принятия сообщения от отладчика
function D_read() {
//код программы... global $fp;
// Приглашение на ввод команды
ob_end_flush(); D_write('Enter command = [g, s, bp ↵
?> [line number]:[file name], st]');
if (is_resource($fp)) {
return fread($fp, 8192);
Таким образом, на каждом тике мы проверяем буфер }
вывода, ищем там необходимую подстроку, выводим путь }

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


web
// Функция отладки Или интерфейс управления формируется в начале от-
function debug_func() {
global $fp; лаживаемого скрипта и по средствам AJAX обращается
static $GO=false; к другому скрипту, создающему файл с необходимой ко-
static $STOP_LINE,$STOP_FILE;
$db=debug_backtrace(); мандой. То есть в самом начале выполнения в браузер от-
// Проверка: не достигли ли мы точки останова, сылается небольшой AJAX-движок и несколько управляю-
// (break point) и если нет, то уходим из функции
// отладки (функцию is_bp реализуйте сами) щих кнопок. При нажатии на определённую кнопку с помо-
if (!is_bp($db,$STOP_FILE,$STOP_LINE)) return; щью JavaScript посылается определённая команда к скрип-
// Посылаем текущее состояние. Сюда же можно добавить
// другую необходимую информацию ту, единственная функция которого – создать файл и по-
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)= ↵ function D_write($msg) {
split(':',substr($ret,3, ↵ //Для простоты будем считать, что такой вывод
strlen($ret)-4)); // не нарушит структуру документа
break; echo "<script language=JavaScript>";
} // Будем выводить отладку в отдельный div
case “g\n”: { // (другой вариант, например, писать информацию
// Так как необходимо выполнить // во временный файл, вставлять его с помощью iframe
// скрипт до конца без остановки, // и тут этот iframe перегружать)
// убираем вызов функции отладки echo "dbg_div=document.getElementById('dbg_div');";
unregister_tick_function ('debug_func'); echo "dbg_div.innerHTML=dbg_div.innerHTML+'<HR>$msg';";
break; echo "</script>";
} }
case “s\n”: // Функция принятия сообщения от отладчика
default: { function D_read() {
break; global $fp;
} while (!file_exists($fp)) ;
// Думаю, длина команды не более 600 байт
} return fread($fp, 600);
}
}
// debug_func() практически не изменился, за исключением
//подключаемся к серверу управления отладкой // того, что после обработки полученной команды
$fp = fsockopen('10.0.2.145', 9998); // необходимо зачистить (удалить) файл с командой, чтобы
register_tick_function('debug_func'); //включаем отладчик // она повторно не обрабатывалась
declare (ticks=1);
/*Код программы*/ // Вместо сокета открываем файл
fclose($fp); $fp = fopen('dbg_cmd.txt', 'r');
?>
// Вставляем управляющие элементы в начало скрипта.
// В ajax.js помещаем AJAX-движок с функцией Send2Dbg(cmd)
Этот довольно простой код с лёгкостью можно рас- // отправки команды скрипту dbgfile.php, который создаёт
ширить, обезопасить, введя авторизацию, и реализовать // dbg_cmd.txt и пишет туда команду
echo "<script language='JavaScript' src=ajax.js></script>"
как отдельный include. 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>';
мы установили систему, в целях безопасности установил // Далее всё так же
PHP без сокетов, в таком случае описанный ранее отлад-
чик работать не будет. Нельзя забывать, что подгружать эти отладчики необхо-
Реализуем такой же по функциональности код, но без димо, только если к скрипту обратился программист. Как это
использования сокетов. сделать, мы уже описали ранее.
Поскольку соединение с удалённой машиной создать
нельзя, для передачи данных мы будем использовать фай- Заключение
ловую систему, а точнее – один файл. Мы разобрали несколько несложных приемов по реализа-
Схема работы теперь приобретет следующий вид: ции невидимой работы с уже используемым кодом. Будем
при каждом тике в браузер выдается информация о теку- надеяться, описанные выше способы помогут вам в реа-
щем состоянии, и запускается нами определённая функция лизации и улучшении собственных механизмов исправле-
отладки, которая ожидает появление в определённой ди- ния ошибок на работающей системе, но в любом случае
ректории определённого файла, как только файл появля- всё описанное выше призвано решать проблемы, кото-
ется, из него считывается команда, и он удаляется. рые не должны появляется, их необходимо предотвращать
Управление отладкой можно реализовать двумя спо- ещё на этапе разработки. Серьёзное тестирование и хоро-
собам. шо реализованная система сообщения об ошибках могут
Создаётся отдельный скрипт, который генерирует ин- значительно облегчить поддержку. Так что лучше оставь-
терфейс управления и создаёт файл с командой. те эти методы на самый крайний случай.

74
сети

TCP поверх TCP –


не такая уж плохая идея!

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

И
спользование TCP стало столь представлений, то у многих просто не- нимается как святое откровение. Хотя
привычным, что большинс - достает знаний правильно оценить по- многие далее вынесенного в ее заголо-
тво просто не задумывается лученную информацию. Что приводит вок тезиса «Why TCP Over TCP Is A Bad
о заложенных в этот протокол меха- к появлению технологических мифов. Idea» и не читают. Чтобы уравнять шан-
низмах и во всех случаях полагает- Один из которых, порожденный ста- сы тех, кто имеет затруднения с анг-
ся на «интеллект» системы. Одновре- тьей [1] Олафа Титца (Olaf Titz), здесь лийским языком, предложим дослов-
менно с этим, если встречаются какие- и попробуем опровергнуть. К сожа- ный технический перевод упомянуто-
то сведения, объясняющие что-то в его лению, в России все, что написано го опуса [2]. В переводе не использо-
поведении, или теории, построенные на иностранном языке да еще разме- вались никакие литературные экстра-
на основе, так сказать, «упрощенных» щено на зарубежном сайте, воспри- поляции, чтобы максимально точно до-

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

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


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

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

78
сети
в центре маршрута ограничим полосу, например до 10 Мбит, ки OpenVPN в режиме клиента TCP-туннеля будут произво-
и внесем случайные потери в трафик. Конечно, 10 Мбит зна- диться согласно следующему файлу конфигурации:
чительно выше типичной скорости канала, предоставлен-
ного ISP для подключения к Интернету. Но иначе придет- # cat /etc/openvpn/test.conf
ся уменьшить объем пересылаемых данных, чтобы в при- proto tcp-client
емлемое время провести эксперимент. Перечислим эле- tcp-queue-limit 1000
remote 192.168.11.2
менты, которые нужны для организации таких проверок. dev tun
Во-первых, хост-отправитель и хост-получатель трафика. port 5000
tcqueuelen 1000
Во-вторых, два хоста, между которыми проложен туннель. secret /etc/openvpn/static.key
Поскольку «удаленный» конец туннеля может совпадать с ifconfig 192.168.12.1 192.168.12.2
route 192.168.12.0 255.255.255.0 192.168.12.1
хостом-получателем, то, кроме перечисленных трех хос-
тов, нужен еще один, где будет эмулироваться «узкое мес- Для станции wskostja все аналогично, меняются лишь
то» в сети. Итого, достаточно будет 4 компьютера соединить адреса, протокол на tcp-server и удаляется строка remote,
последовательно. Строго говоря, хост-отправитель можно что переводит туннель в состояние прослушивания. В ре-
совместить с «ближним» концом туннеля. Но надо учесть, жиме UDP на обоих концах протокол просто переключает-
что вход в туннель тоже является своего рода ограничите- ся в udp и удаляется параметр tcp-queue-limit. И теперь путь
лем трафика, или шейпером, поэтому пусть будут в тес- между wstovert до wskostja проходит через туннель.
товой сети четыре компьютера, которые назовем wstovert,
wsalekseybb, wskostja и server. Общий вид полученной сети # traceroute 192.168.12.2
представлен на рис. 3, и дальнейший комментарий будем traceroute to 192.168.12.2 (192.168.12.2), 30 hops max, 40 byte packets
1 192.168.10.2 0.000 ms 0.000 ms 0.000 ms
вести согласно изображенной там схемы. 2 192.168.12.2 7.088 ms 5.756 ms 0.787 ms
Все компьютеры включены в общую сеть 192.168.0.0/24,
объединены общей кабельной системой с помощью ком- Чтобы доказать, что сам туннель проходит через
мутатора 1 Гбит и обмениваются данными по протоколу server, проверим путь до удаленного конца туннеля
1000BaseTX, то есть значительно выше проверяемых ско- от wsalekseybb:
ростей передачи, что позволит максимально снизить сис-
тематическую ошибку. На эту сеть наложены две виртуаль- # traceroute 192.168.11.2
ные сети. Первая из них, с адресом 192.168.10.0/24 вклю- traceroute to 192.168.11.2 (192.168.11.2), 30 hops max, 40 byte packets
1 192.168.10.1 0.195 ms 0.106 ms 0.120 ms
чает wstovert, wsalekseybb и server, а вторая – с адресом 2 192.168.11.2 0.233 ms 0.000 ms 0.000 ms
192.168.11.0/24 – только server и wskostja. Практически все
компьютеры могут резолвить адреса друг друга с помо- Таким образом, можно, отправляя трафик со станции
щью arp и обмениваться пакетами через общий коммута- wstovert до станции wskostja, осуществлять на промежуточ-
тор. Но нам ведь нам надо обеспечить передачу трафика ном хосте server нужные манипуляции в соответствии с ис-
между компьютерами так, будто они включены последова- следуемой моделью канала.
тельно один за другим. Поэтому с помощью правил мар- Для работы создадим на всех участвующих в экспери-
шрутизации и преобразования адресов заставим трафик ментах хостах специального пользователя tovert и разместим
от wstovert проходить до wskostja через wsalekseybb и server в его домашних директориях в файле .ssh/authorized_keys2
так, как указывает стрелка на рис. 3. Для этого на каждом специально подготовленные ключи, чтобы можно было вы-
компьютере укажем статический маршрут до следующей по полнять необходимые действия в автоматическом режиме
ходу движения стрелки на рисунке 3 сети через соседний с одной из станций. И для удобства разрешим через sudo
компьютер, а на том включим NAT так, чтобы заменять в та- выполнение пользователем tovert команд с привилегиями
ком маршруте адрес отправителя на собственный. Оконча- суперпользователя без ввода пароля.
тельно должно получиться так: На wstovert подготовим файл с данными, которые будут
посылаться в тестовых сеансах:
# traceroute 192.168.11.2
traceroute to 192.168.11.2 (192.168.11.2), 30 hops max, 40 byte packets # ssh tovert@wstovert "dd if=/dev/urandom ↵
1 192.168.10.2 0.000 ms 0.000 ms 0.000 ms of=~/100M.bin bs=1024 count=102400"
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 Симуляцию TCP-трафика будем создавать с помощью
команды, отправляющей 100 Мб из файла на целевой хост.
Поскольку главный вопрос заключается в изучении по- В качестве слушателя TCP используем sshd, который пере-
ведения инкапсулированного трафика, то в тестовой се- шлет все принятые данные в /dev/null, чтобы не помешала
ти настроим также и туннель. Воспользуемся програм- буферизация. Причем для сокращения затрат на загрузку
мным обеспечением, которое позволит поднять туннель, файла с диска каждую тестовую отправку будем предва-
как на основе UDP-транспорта, так и TCP. По этой причине рять локальным копированием в /dev/null:
CIPE [6] не подходит. Выберем OpenVPN [7]. Тем более что
согласно сравнительной таблице [8] этот проект рекордсмен # dd if=/home/tovert/100M.bin bs=1024 count=102400 >>/dev/null
# dd if=/home/tovert/100M.bin bs=1024 count=102400 | ↵
в разделе Popularity. Туннельная сеть образует виртуальное ssh tovert@192.168.12.2 "cat - >>/dev/null"
соединение между wsalekseybb и wskostja, определенное
как сеть 192.168.12.0/24. Для станции wsalekseybb настрой- Симуляция UDP-трафика будет производить утилитой

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


сети
Таблица 1. Передача TCP-трафика в туннелях
Протокол Объем Скорость Шейпер, Шейпер,
Режим Передано Шейпер, Идеальный трафик шейпера /
передачи отправленных передачи, передано число Потери, %
туннеля в tun0, Мб передано Мб трафик шейпера
данных данных, Мб Мбайт/сек пакетов задержек

TCP 105 TCP 103.9 1.2 112 81218 100951 0 1

0.177
TCP 105 TCP 103.9 128 152585 5504 10 1.14
(до 0.188)

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

0.18
TCP 105 UDP 103.9 124 161677 7995 10 1.11
(до 0.19)

TCP 105 UDP 117.1 0.0791 126 164227 6281 10+10 1.13

netcat, точно так же предварительно произведя локальное # iptables -L INPUT


копирование:
Chain INPUT (policy ACCEPT)
target prot opt source destination
# dd if=/home/tovert/100M.bin bs=1024 count=102400 >>/dev/null DROP all -- anywhere 192.168.12.2 random 10%
# dd if=/home/tovert/100M.bin bs=1024 count=102400 | ↵ ACCEPT all -- anywhere 192.168.12.2
netcat -vu -w 1 192.168.12.2 22222
Тут проницательный читатель заметит, что недостает
На приемной стороне UDP-трафик будет приниматься еще эмулятора помех для обратного трафика. Но какой
специальным слушателем и подсчитываться: может быть обратный трафик у UDP? И внося еще поме-
хи для пакетов, движущихся в обратную сторону, мы явно
# netcat -vlnu -s 192.168.12.2 -w 15 -p 22222 | wc -c ухудшаем характеристики всех TCP-соединений, которые
принципиально всегда интерактивны, в отличие от UDP.
В точке прохождения трафика через хост server включим Скажите несправедливо? Ну и пусть! Нам нечего бояться.
ограничитель полосы типа HTB (Hierarchical Token Buckets) Сделаем так:
на 10 Мбит со следующей конфигурацией:
# iptables -n -L OUTPUT
qdisc htb 1: r2q 10 default 0 direct_packets_stat 0 Chain OUTPUT (policy ACCEPT)
Sent 0 bytes 0 pkts (dropped 0, overlimits 0) target prot opt source destination
class htb 1:1 root rate 10Mbit ceil 10Mbit burst 14704b ↵ DROP all -- 192.168.12.2 0.0.0.0/0 random 10%
cburst 14704b ACCEPT all -- 192.168.12.2 0.0.0.0/0
Sent 0 bytes 0 pkts (dropped 0, overlimits 0)
lended: 0 borrowed: 0 giants: 0
tokens: 9191 ctokens: 9191 Чуть выше уже было замечено, что это очень грубая ими-
class htb 1:10 parent 1:1 prio 0 rate 10Mbit ceil 10Mbit ↵ тация линии с потерями. Дело в том, что потери являются
burst 14704b cburst 14704b функцией линии передачи, а не числа переданных пакетов,
Sent 0 bytes 0 pkts (dropped 0, overlimits 0)
lended: 0 borrowed: 0 giants: 0 как в нашем случае. Но даже такая модель позволит понять,
tokens: 9191 ctokens: 9191 что же происходит с трафиком в ненадежных сетях.
filter parent 1: protocol ip pref 1 fw Теперь все окружение построено. Договоримся о точ-
filter parent 1: protocol ip pref 1 fw handle 0xa ↵ ках, где будут сниматься данные. В условиях эксперимен-
classid 1:10
та будет тип трафика, тип туннеля, объем отправленных
Так что фильтр будет направлять в шейпер только тра- с wstovert данных. Скорость передачи нам сообщит ко-
фик, помеченный маркером 10 (0xa). Весь непомеченный манда dd на wstovert. Объем данных, поступивших в тун-
трафик будет проходить в обход шейпера, так как в HTB нель, и число уничтоженных на входе пакетов узнаем через
не указан поток по умолчанию. Метиться будут лишь паке- ifconfig tun0 на wsalekseybb. Статистика шейпера на server
ты, направляемые на виртуальный адрес wskostja: покажет, сколько данных и пакетов прошло через ограничи-
тель трафика, сколько пакетов было уничтожено. На счет-
# traceroute 192.168.11.2 чиках iptables на wskostja узнаем, сколько данных добра-
Chain POSTROUTING (policy ACCEPT) лось до назначения и сколько было уничтожено как ими-
target prot opt source destination
MARK all -- anywhere 192.168.11.2 MARK set 0xa
тация потерь в линии связи. И для UDP после отключения
слушателя netcat получим объем реально полученных дан-
Последняя деталь – эмулятор помех. По логике, ес- ных, подсчитанный командой wc.
ли шейпер на исходящем интерфейсе хоста server имити- С примерами некоторых скриптов, использованных
рует сужение канала, то участок с потерями должен нахо- для настроек, можно ознакомиться в архиве [9].
диться за ним.
И у нас не остается иного места, где можно внести Передача TCP в туннелях
(или точнее изъять) потери в трафик, кроме входного ин- Сначала проверим самую главную версию, что трафик TCP
терфейса wskostja: внутри TCP-туннеля якобы плохо передается, а вот внутри

80
сети
Таблица 2. Передача UDP-трафика в туннелях
Протокол Объем Шейпер, Шейпер,
Режим Передано Потеряно Шейпер, Отправлено /
передачи отправленных передано уничтожено Потери, % Реально прибыло, Мб
туннеля в tun0, Мб в tun0 пакетов передано Мб прибыло
данных данных, Мб пакетов пакетов
UDP 105 TCP 1.8 75375 1.94 1406 0 0 1.73 1.04
UDP 105 TCP 2.1 75195 2.29 1729 0 10 1.867 1.12
UDP 105 UDP 5.3 72744 3.5 4490 1611 0 3.125 1.69
UDP 105 UDP 8.0 70678 5.02 6441 2611 10 4.08 1.96

туннеля UDP напротив очень хорошо. ние TCP-транспорта добавляет толь- UDP ограничивает полосу скоростью
Для этого поднимем туннель OpenVPN ко 4% к переданному объему по срав- 5,9 Мбайт/сек, а в режиме TCP даже
сначала в режиме TCP, затем в режи- нению с применением UDP-туннеля. То еще ниже 2,9 Мбайт/сек. Вероятно, это
ме UDP, и в каждом состоянии прове- есть, 10% трафика «честно» пропада- связано с тем, что туннель организован
дем тестовую пересылку без потерь, ет в линии передачи, а погрешности как программа, работающая не в про-
с потерями 10% и с двухсторонними двойного дублирования не превыша- странстве ядра, а в пользовательском
потерями. Полученные числа собе- ют 4%. Замечу, туннель достаточно ус- пространстве. Но, так или иначе, по-
рем в таблицу. К сожалению, так как ловен, сетка высокоскоростная, и рас- тери UDP-трафика начнутся сразу же
используется высокоскоростная сеть, хождения RTT минимальны, что пока- на входном интерфейсе туннеля, даже
тестовый файл невелик, а время не зала и утилита traceroute выше по тек- если в нем не настроен собственный
позволяет делать сотни прогонов сту. И все равно не получается полного шейпер. Второй барьер для UDP бу-
и затем производить сглаживание ре- удвоения или учетверения. В условиях дет создавать ограничитель трафика,
зультатов, то в таблицу 1 будут зане- реального туннеля, где RTT будут раз- имитирующий «узкое место», взведен-
сены наиболее показательные дан- личаться больше, скорости будут ниже, ный в нашем случае после хоста server.
ные из 2-3 прогонов на каждом усло- а потери, скорее всего, будут меньше, Ну и, наконец, в тестах с потерей тра-
вии и дополнительно указан возмож- разница в условиях прохождения TCP- фика дополнительную убыль пакетов
ный разброс. трафика через TCP- и UDP-туннель ста- UDP обеспечит фильтрация на входе
Колонка 5 не выявила никакого пре- нет совсем незаметной. wskostja. Обратный трафик «портить»
имущества UDP-туннелей в скорости. Другими словами, никакого су- не будем, так как это не скажется су-
Средний разброс показателей +/-5%. щественного ухудшения TCP внутри щественно на выводах. Результаты
То есть независимо от несущего про- TCP в нашем эксперименте замечено тестов сведены в таблице 2.
токола внутренний TCP рано или поз- не было. Но если нет ухудшения при Судя по колонке 4, неявный шей-
дно подстраивался под условия пе- работе через TCP-туннель, то, быть мо- пинг самого туннеля привел к тому,
редачи и находил примерно одинако- жет, надо искать улучшение при работе что в режиме TCP «пролетело» в ин-
вый максимум. А вот показатели ко- через UDP-туннель? И если проверка терфейс в два раза меньше пакетов,
лонки 6 имеют более интересную ин- TCP-трафика не выявила преимущес- чем в режиме UDP. Ну и как следс-
терпретацию. Итак, в идеальных ус- тва одного над другим, то может, сто- твие, окончательно попало в точку на-
ловиях на шейпере насчитано 112 Мб, ит проверить, как передается UDP-тра- значения (колонка 10) меньше в режи-
как в TCP-туннеле, так и в туннеле UDP. фик в таких туннелях. ме TCP, чем в UDP. Поскольку туннель
Но, как только включаем уничтожение TCP, кроме всего прочего, может под-
10% трафика, туннель UDP ведет се- Передача UDP в туннелях страиваться под реальную пропускную
бя пропорционально потерям и добав- Передача UDP-трафика – это весьма способность туннеля, то в TCP-режиме
ляет уничтоженное повторной пере- условное понятие. Фактически это бо- на шейпере после server нет потерь,
сылкой дополнительных 10% объема лее похоже на ветер. И поэтому поня- а в UDP они присутствуют. Но самые
112*11=123,2, что примерно равно по- тие «скорость передачи» теряет всякий интересные результаты дает расчет
лученным 124 Мб на счетчике шейпе- смысл. В тестовых проверках скорость отношения трафика, реально отправ-
ра (все индексы в колонке 10). Туннель случайным образом определялась ленного через туннель, и того, что был
TCP реагирует на уничтожение трафи- в диапазоне от 13 до 29 Мбайт/сек. получен в точке назначения. И в том
ка предсказанным способом – выпол- Но если на пути такого «ветра» встре- и в другом режиме работы туннеля
няет дублирование повторов, и трафик чается участок с меньшей полосой это соотношение подчиняется пра-
на шейпере возрастает, но, как это то- пропускания, недостаточной, чтобы вилу, что трафик в проверке работы
же было предсказано, не на полные передать все имитированные паке- с потерями выше трафика в идеаль-
20%, а лишь на 14%. Как только вклю- ты, то излишки просто уничтожаются. ном случае примерно на величину по-
чаем уничтожение обратного трафика, Как показали прогоны трафика через терь. Например, для TCP 1,04*1,1=1,14
то потери еще выше, но опять не 40%, туннель OpenVPN вместе с шейпером, приблизительно равно 1,12, получен-
как при полных повторах, и не 20%, настроенным на большие предельные ному в эксперименте. Или для UDP –
а всего лишь 16%! Если сопоставить скорости, чем 10 Мбит/сек, сам тун- 1,69*1,1=1,86 приблизительно рав-
показатели трафика через туннель- нель является скрытым ограничите- но 1,86, что показал тестовый про-
ный интерфейс (колонка 4) и через лем полосы. При настройках, соглас- гон. Но вот само базовое соотноше-
шейпер (колонка 6), то использова- но, указанным выше, туннель в режиме ние пропорции доставки неутешитель-

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


сети
но для UDP. Получается, что в идеаль- пользовать, переходит в плоскость экс- трафик в TCP-туннель, можно сделать
ном случае для TCP-туннеля достав- пертных оценок. Перечислю их, и пусть его более надежным и предсказуе-
ляются практически все пакеты – ко- читатели сами решат, подходят ли им мым. И часы у ваших компьютеров бу-
эффициент 1,04 , а вот в туннеле UDP такие рекомендации. дут корректироваться чаще, и DNS бу-
лишь не более чем два из трех – коэф- Во-первых, современные сети яв- дет работать стабильнее. А если в та-
фициент 1,69. Здесь еще раз видно, что ляются в большей степени TCP-сетя- кой туннель завернуть ICMP, то и мо-
полученные результаты могут носить ми. Они приспособлены для транспор- ниторинг внешних ресурсов также бу-
лишь оценочный характер. Ясно же, тировки именно такого трафика. Сис- дет стабильнее.
что коэффициент передачи TCP-тун- темы ограничения полос взаимодейс- Нет, решительно невозможно об-
неля должен в идеальном случае рав- твуют с потоками TCP-трафика и пу- наружить никаких аргументов против
няться единице. Но реальные значения тем накопления и торможения сегмен- туннелирования в TCP. Быть может, на
счетчиков интерфейсов интерпретиру- тов в очередях заставляют отправите- дату написания статьи [1] все обстоя-
ют по-разному пакеты, их заголовки лей TCP замедлять трафик без потерь. ло иначе? Ну, разве что RFC 3168 бы-
и даже константы пересчета байт в ки- Технология предотвращения перегруз- ло в стадии утверждения. А все осталь-
лобайты. Однако общий смысл ясен: ки RED (Random early detection) рабо- ные механизмы регулирования TCP
UDP-туннель совсем не способствует тает только в отношении TCP-потоков. были реализованы задолго до рожде-
полноте доставки данных до получате- Разрабатываются дополнительные ния столь оригинальной мысли о не-
ля. Главная причина в том, что UDP-по- функциональные расширения, ори- приемлемости туннелирования тра-
ток не может подстраиваться под фак- ентированные на управление именно фика внутри TCP. Конечно, не стоит
тическую ширину канала по маршру- TCP-трафиком в первую очередь. На- забывать о таком эффекте, как вытес-
ту роутинга. И именно этим объясня- пример, явное уведомление о пере- нение TCP-потока (TCP-starvation/UDP-
ется присутствие специальной опции грузке, или ECN, предложенное в RFC dominance) именно за счет его управля-
ограничения канала на входе тунне- 3168 [10], реализовано как расширение емости. То есть, если два типа трафика
ля OpenVPN. В настоящих настройках формата TCP. И в том же RFC более смешиваются в одной полосе регули-
она не применялась, а в реальной жиз- половины его содержания посвящено рования, то TCP-трафик, поддающий-
ни ее использование позволит сокра- проблеме, как транзитный маршрути- ся регулирующему воздействию, будет
тить расходы на оплату трафика, кото- затор сможет управлять с помощью уступать полосу UDP. Быть может, это
рый в противном случае будет «поре- ECN трафиком, завернутым в IPsec. и послужило причиной того, что TCP-
зан» одним из маршрутизаторов уже Отдельно там же сказаны и «добрые» туннель у Олафа Титца не работал как
после того как «провернутся» счетчи- слова в отношении других не-TCP-тун- надо. Но тогда, кроме признания из-
ки ISP. Обращаю внимание, в OpenVPN нелей. Про UDP-туннели слов нет, пос- вестного недружелюбного кабельщи-
такая опция есть, а вот в CIPE отсутс- кольку UDP как достойный транспорт ка, надо согласиться с существовани-
твует, что вообще не свидетельствует не рассматривается вообще. Конечно, ем нерадивого сотрудника ISP. Мне ка-
в пользу этого проекта. если очень озаботиться, то в Интернете жется, это уже слишком.
Итак, трафик UDP тоже не приобре- можно разыскать документ «A proposal
тает ничего хорошего от завертывания for the use of ECN bits with UDP flows». Ссылки:
его в туннель UDP. Быть может, никако- Но предлагаю попробовать найти за- 1. Olaf Titz. Why TCP Over TCP Is A Bad
го особого улучшения связи из-за при- регистрированный RFC на эту же тему. Idea – http://sites.inka.de/sites/bigred/
менения CIPE и не происходило? Быть Или попытаться его дождаться. 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/
«поплыл в Индию, а прибыл в Амери- то и здесь следует предпочесть TCP- RFC/rfc2001.pdf.
ку», то есть не важно, о чем он там ду- транспорт. Очень часто проблемы се- 4. RFC 793 – http://www.protocols.ru/files/
мал, когда создавал CIPE, но, безу- тевого взаимодействия связаны с по- RFC/rfc793.pdf.
словно, что его инициатива подтолкну- терями UDP-пакетов. Например, за- 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.
были у Олафа, то почему бы и здесь им тывая, что UDP-трафик самый «безза- ece.uic.edu/~papers/volans/table.html.
не появиться. Поскольку в процессе щитный», то даже на проводных сетях 9. П р и м е р ы с к р и п т о в – ht t p : / / w w w.
практической проверки никаких осо- в условиях сильной загруженности бу- barabanov.ru/arts/tcp/tovert.tgz.
бых выгод от использования UDP-тун- дет происходить вытеснение UDP-па- 10. RFC 3168 – http://sysadmins.ru /rfc /
нелей не замечено, то вопрос, что ис- кетов в первую очередь. Завернув UDP- rfc3168.html.

82
bugtraq

Множественные уязвимости Обход ограничений безопасности


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

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


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

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

Дмитрий Мороз
«Взрыв сверхновой звезды» – именно так можно было охарактеризовать появление на рынке
в 1996 году компьютера BeBox и операционной системы BeOS. Прошло время, и звезда
постепенно угасла. Но, похоже, в скором времени настанет черёд повторного взрыва.

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

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

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


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

86
ретроспектива
пам, вследствие чего стало основным ке Agenta’95, позже назвал BeBox «су- возможностей компьютера и ОС и же-
и единственным». перкомпьютером в компактном кор- лающих начать разрабатывать для неё
пусе ПК» (вспомните, какая компания новое ПО. Кроме того, Be Inc. воплоти-
Триумф BeBox в 1999 году придаст своему компью- ла в жизнь новую концепцию продаж
Конец 1994 года мог стать концом ком- теру приставку «супер»). Два процес- программного обеспечения: вместо то-
пании Be Inc: 9 миллионов долларов сора PowerPC 603e, несмотря на свои го, чтобы раскошеливаться на рекла-
компании иссякли, а разработка ком- 66 Мгц, помогали BeBox демонстриро- му, компании, а также программисты-
пьютера только подходила к своему за- вать производительность на уровне ра- одиночки предлагали потенциальным
вершению. Ещё минимум год ушёл бы бочих станций IBM RS/6000, стоивших покупателям демо-версии своих про-
на то, чтобы довести «до ума» операци- десятки тысяч долларов. Возможность грамм, размещённых на специально
онную систему. Жан-Луи Гассе принял установки до 256 Мбайт ОЗУ в обыч- созданном Be Inc. сайте BeDepot.com.
решение найти для компании нового ный ПК в 1995 году была также чем-то Если пользователю понравилась де-
владельца. Его взор обратился к быв- нереальным. А уж 26 различных портов мо-версия, он мог при помощи обычно-
шему работодателю – Apple. В недрах ввода/вывода, располагавшихся на за- го телефона заказать себе полную вер-
«яблочной» компании в то время разра- дней стенке компьютера, делали из ком- сию. Кстати, многие компании-разра-
батывалась операционная система под пьютера Be Inc. поистине «чудо». Чего ботчики ПО для BeOS (например, та же
кодовым названием Copland, призван- уж говорить об операционной системе, BeatWare) «вышли в свет» именно бла-
ная заменить стремительно устарева- о возможностях которой было написа- годаря такой системе продаж.
ющую MacOS 7.x. но выше. Зрители были в шоке от де- В начале 1996 года производство
«Финансовых средств у нас не ос- монстрации BeBox. А довольно низкая BeBox, вследствие иссякших в очеред-
талось, и мне пришлось пригласить на цена в 1995 у.е., как для системы, де- ной раз денежных средств, было при-
встречу руководителя Apple Майкла монстрирующей подобный уровень про- остановлено. Компания была на грани
Шпиндлера, чтобы поговорить с ним изводительности и возможности, стала банкротства. Тем не менее на волне бу-
о возможности покупки Be Inc.», – вспо-«последним гвоздём». Многотысячная ма, поднятого демонстрацией компью-
минает Гассе. К сожалению, встреча за- аудитория, присутствовавшая в зале, тера на Agenta’95, быстро нашлись но-
кончилась, не принеся никакого резуль- устроила Жану-Луи Гассе овацию. Это вые инвесторы и, после 14-миллионно-
тата. Но Гассе никогда не забудет слов,был его день, день всей команды Be Inc., го «вливания» в активы компании, про-
произнесённых Шпиндлером на проща- и, конечно же, триумф BeBox и BeOS. цесс производства был возобновлён.
ние: «Тебе, наверное, спится лучше, чем Следующей целью Жана-Луи Гассе
мне». «Я помню этот момент, поскольку Удержаться на волне стала выставка MacWorld Expo, прохо-
Шпиндлер всегда очень хорошо пред- успеха дившая летом 1996 года. Официально
чувствовал опасность», – говорит Гас- Выставка Agenta’95 принесла Be Inc. Be Inc., кстати, запрещалось присутс-
се. Apple была на краю пропасти: проект дополнительные инвестиции на сумму твовать на выставке, поскольку её про-
Copland разросся до невероятных раз- 6 млн. долл. (одним из инвесторов стал дукция никаким образом не была связа-
меров и превратился в «неповоротли- известный разработчик суперкомпью- на с Apple. Тем не менее 6 августа 1996
вый Титаник», готовый в любую мину- теров Сеймур Крей), которые позволи- года тысячи людей столпились возле
ту пойти ко дну от внезапного столкно- ли компании доработать BeBox до со- стенда компании: на нём демонстриро-
вения с айсбергом. стояния полной готовности и 3 октяб- валась BeOS, работавшая на компьюте-
Неудача попытки продажи Be Inc. за- ря начать отгружать компьютеры пер- ре Power Macintosh. Зрители были в шо-
ставила Гассе готовиться к единствен- вым заказчикам. В то же время рабо- ке: то, чего все уже который год жда-
ному выходу – публичной демонстрации та над совершенствованием BeOS про- ли от Copland (главным образом, вы-
BeBox потенциальным инвесторам в на- должалась. тесняющую многозадачность и защи-
дежде привлечь хоть какие-нибудь де- До апреля 1996 года компанией щённый режим памяти), уже было воп-
нежные средства для продолжения про- было выпущено семь тестовых версий лощено в BeOS и работало на их ком-
екта. Данное событие должно было со- системы (так называемые Development пьютерах! Кроме того, ОС также рабо-
стояться на выставке Agenta’95. Release), каждая из которых добавляла тала на клонах Macintosh, производив-
Специально для будущей выстав- в ОС новые возможности, а также улуч- шихся компанией Power Computing. Mac-
ки Стив Сакоман подготовил презен- шала уже существующие. Та же BeOS версия операционной системы от Be Inc.
тацию, демонстрировавшую обработ- DR7 могла «похвастаться»: поддержкой произвела очередной фурор.
ку на BeBox восьми AVI-видеофайлов 32-битного цвета, новой файловой сис- Но мало кто знает, что предназна-
и трёхмерной графики (Жан-Луи Гассе темой BFS, виртуальными Рабочими чалась эта версия ОС для другой це-
хотел лицензировать у Apple технологию столами, а также улучшенными сете- ли – демонстрации Apple возможнос-
QuickTime, но цена в 5 млн. долларов выми возможностями. ти работы BeOS на компьютерах Power
оказалась для Be Inc., ещё не выбрав- По словам Жана-Луи Гассе, внача- Macintosh. Да-да, теперь Apple первой
шейся из «долговой ямы», просто непо- ле BeOS необходимо было набрать ми- предложила Гассе купить его компа-
мерной). Всё это работало одновремен- нимальную «критическую массу» про- нию. Правда, запрошенная им цена
но и без какого-либо торможения. грамм, для чего компьютеры BeBox по- в 300 млн. долл. показалась «яблочной»
Один из журналистов, присутство- падали, в основном, в руки програм- компании слишком большой (она пред-
вавших в тот памятный день на выстав- мистов, поражённых демонстрацией лагала Be Inc. «лишь» 100 млн. долл.),

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


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

88
содержание журнала за 2005 год
АДМИНИСТРИРОВАНИЕ № Автоматизация процесса подключения баз 1С с помощью
сценария регистрации пользователей в сети Иван Коробко №3
Alt-N MDaemon – почтовая система для средних Автоматизируем подключение баз 1С новой версии 8.0
и крупных компаний Роман Марков №4 Иван Коробко №7
Alt-N MDaemon – почтовая система для средних Автоматизируем установку драйверов в Windows
и крупных компаний. Часть 2 Роман Марков №5 Алексей Барабанов №11
Apache как прокси-сервер Валентин Синицын №4 Автоматическая установка ОС и сопутствующего
Asterisk и Linux: миссия IP-телефония Михаил Платов №6 программного обеспечения Иван Коробко №2
Asterisk и Linux: миссия IP-телефония. Действие 2 Архивируем данные с помощью Bacula Алексей Гринько №4
Михаил Платов №7 Базовая настройка маршрутизатора Cisco
Asterisk и Linux: миссия IP-телефония. Действие 3 начального уровня Андрей Маркелов №4
Михаил Платов №8 «Бритва» для спама Сергей Супрунов №9
FreeBSD tips: NAT по старинке Сергей Супрунов №2 Восстанавливаем удаленные файлы под BSD
FreeBSD tips: использование ipnat Сергей Супрунов №3 Крис Касперски №5
FreeBSD tips: использование syslog Сергей Супрунов №5 Восстановление удаленных файлов под Linux
FreeBSD tips: какими возможностями обладает ftpd Крис Касперски №3
Сергей Супрунов №11 Всегда на связи, или IP-роуминг: вводный курс
FreeBSD tips: работаем с TFTP Сергей Супрунов №7 Сергей Яремчук №2
FreeBSD в домене Microsoft Windows Рашид Ачилов №3 Домены Windows 2000/2003 – отказываемся
GRUB на CD, или Ещё один способ восстановить MBR от рабочей группы Роман Марков №9
Алексей Мичурин №11 Знакомимся с HPC-кластером OpenMosix Антон Борисов №8
HOTSPOT – это просто! Андрей Платонов №1 Использование альтернативных потоков данных
IСQ: разрешить нельзя запретить Павел Закляков №12 Максим Костышин №3
Kaspersky Anti-Spam 2.0 + Sendmail Денис Городецкий №4 Испытываем Antmon – новую систему мониторинга
Linux Xinerama: один монитор хорошо, а много – лучше Сергей Жуматий №6
Павел Закляков №3 Как посчитать трафик в Linux Александр Кузнецов №10
Linux из Редмонда: обзор Lycoris Desktop/LX Как эффективно провести инвентаризацию
Валентин Синицын №1 установленного софта Андрей Бирюков №12
LinuxBIOS – фундамент для Linux? Антон Борисов №7 Конструктивный Dialog Сергей Супрунов №2
MySQL 5 – что нового предлагают нам разработчики? Контролируем события с помощью EventSentry
Кирилл Сухов №6 Сергей Яремчук №12
Open-Xchange – свободу группам! Павел Лебедев №7 Крепкий орешек NUT Валентин Синицын №5
PhpGACL – система управления правами Кирилл Сухов №3 Круговорот почты в сети, Или Архитектура
Postfix: диагностируем и устраняем неисправности современных почтовых систем Евгений Прокопьев