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

№8(33) август 2005

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


www.samag.ru

Сможет ли PC-BSD
конкурировать
с Linux-дистрибутивами?
Оцените WrSpy!
Считаем трафик почтовых
и прокси-серверов
Настраиваем DSPAM –
ваш личный спам-фильтр
Проводим аудит системы
с помощью SNARE
Упрощаем управление
Asterisk-сервером
Asterisk-сервером
OpenMosix – превратим сеть
в единый суперкомпьютер!
CD, не подвластный
копированию
№8(33) август 2005

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

СЬ

И
ИЛ
ЛИ
ТЯ Е
ЗА ДНИ

Ж П
НУ

РА КУ
ЛЫ ГО

ТИ РАС
КУ ВО

РО
НИ НО

СТ
БЫ
КА

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

ИС НН
ЕН
УС

БО
НА ТПУ

ИЛ ДА
ТП

НЧ ЖИ
ВО

РА Е О

КО ЕО
АВ СЛ
Л

Л
ХА

ЗА Н
ПО
УЕ
Так видит журнал читатель, оформивший подписку:

ПОДПИШИТЕСЬ И ЧИТАЙТЕ!
Роспечать – 81655
Пресса России – 87836
Интер-почта – тел. (095) 500-00-60
оглавление
2 РЕПОРТАЖ БЕЗОПАСНОСТЬ
3 ТЕНДЕНЦИИ 60 Проводим аудит системы
с помощью SNARE
АДМИНИСТРИРОВАНИЕ Полноценный контроль за системными событиями.
Сергей Яремчук
6 Сможет ли PC-BSD конкурировать grinder@ua.fm
с Linux-дистрибутивами?
Обзор настольного дистрибутива PC-BSD, основан- 64 CD, не подвластный копированию
ного на FreeBSD. Сергей Супрунов Список популярных ошибок в механизмах защиты
amsand@rambler.ru CD от копирования, рекомендации по их устране-
нию, а также готовый алгоритм защиты.
10 Asterisk и Linux: миссия IP-телефония Крис Касперски
Действие 3 kk@sendmail.ru
Рассматриваем несколько веб-интерфейсов, значи-
тельно облегчающих работу пользователей и адми- ПРОГРАММИРОВАНИЕ
нистраторов Asterisk. Михаил Платов
platov@cs.vsu.ru 72 Контролируем и ограничиваем
системные вызовы с помощью
20 Создаем систему учета systrace
исходящих телефонных звонков Как всегда быть в курсе того, что происходит в ва-
Готовое решение на примере УАТС LG GDK-162. шей системе? Александр Байрак
Денис Соколов x01mer@pisem.net
box1739@yandex.ru
HARDWARE
24 Настраиваем DSPAM – ваш личный
спам-фильтр 76 Используем LinuxBIOS на системах
Основанная на алгоритмах статистического анали- VIA EPIA-M
за, самообучающаяся система DSPAM существенно Вдохнем жизнь в barebone-систему на базе EPIA-M
упростит жизнь пользователю, выполняя за него ра- и технологии LinuxBIOS. Антон Борисов
боту по сортировке входящей корреспонденции. a.borisov@tesv.tmb.ru
Сергей Супрунов
amsand@rambler.ru WEB
36 WrSpy – считаем и контролируем 82 Совершенствуем технологию CMS
трафик почтовых и прокси-серверов Возможности проекта Habitat 2.0.
Оцените возможности бесплатной программы WrSpy Алексей Моисеев
для контроля за интернет-трафиком ваших пользо- tsaralex@alpe.ru
вателей. Роман Марков
stepan-razin@newmail.ru БИЗНЕС-РЕШЕНИЯ В IT
42 Знакомимся с HPC-кластером 86 IT в сфере ресторанно-гостиничного
OpenMosix бизнеса
Превратим сеть в единый суперкомпьютер! Обзор программных и аппаратных продуктов, позво-
Антон Борисов ляющих эффективно управлять современными гос-
a.borisov@tesv.tmb.ru тиничными комплексами. Кирилл Тихонов
aka_shaman@mail.ru
48 Управляем удаленными базами AIDE
Требуется оснастить все сервера программой конт- СКАЗКИ
роля от вторжений – AIDE. Но сервера территориаль-
но разбросаны, а хотелось бы хранить базы AIDE на 88 Админские сказки. 16 bit edition
съемных носителях. Как собрать данные со всех ком- Совершенно выдуманные истории, рассказанные
пьютеров, не вставая с места? Рашид Ачилов без какой-нибудь видимой цели или морали, и да-
shelton@granch.ru же не ко сну. Алексей Барабанов
alekseybb@mail.ru
54 SAP+MySQL=MaxDB
Обзор возможностей MaxDB – СУБД, базирующей- 93 КНИЖНАЯ ПОЛКА
ся на исходном коде SAP DB. Кирилл Сухов
geol@altertech.ru 75, 85, 94 BUGTRAQ
№8, август 2005 1
репортаж

ИТОГИ CHAOS CONSTRUCTIONS 2005


20-21 сентября в Санкт-Петербурге традиционно прошла demo-party Chaos Construction.
Я бы обозначил это событие как фестиваль компьютерного искусства.

М
ероприятие происходило в здании Ленинградского что поспать особо не удалось. Утром за нами прибыл ав-
дворца молодежи. В одном месте собирались твор- тобус, и мы отправились на второй день мероприятия. Про-
ческие личности: программисты, художники, музы- грамма этого дня была не менее насыщенной по сравне-
канты, аниматоры. нию с первым днем.
Одновременно с CC’05 в том же зале проходила выстав-
ка retro-компьютеров.

Посетители и участники съехались со всего бывшего Союза


Программа мероприятий была очень насыщенной [1].
Основные представленные работы были для PC и ZX
Spectrum, к сожалению, работ для Amiga было не очень
много. На фестивале царила чрезвычайно дружественная и Выставка retro-компьютеров
располагающая к общению атмосфера. Люди знакомились, В этом году было представлено около 15 различных экс-
обсуждали показанные работы и строили новые планы. понатов. За каждым компьютером можно было самому по-
сидеть, поработать. Большинство владельцев были непо-
далеку и с радостью отвечали на все вопросы.
После завершения всех конкурсов и подсчета голо-
сов состоялось торжественное вручение дипломов побе-
дителям.

Игра StarWars for ZX Spectrum by Newart


После показа каждой работы зрители выставляли
свою оценку, занося ее в специальный блокнот. После по-
каза всех работ одного конкурса листок с выставленными
оценками надлежало поместить в «урну для голосования». Вручение дипломов
По завершении второго дня demo-party, исходя из этих дан- Само собой, после официального завершения CC’05 бы-
ных, были объявлены итоги. ло и неофициальное. Два дня пролетели просто незаметно,
По окончании первого дня желающие (предварительно полученных впечатлений хватит до следующего года.
оплатив) могли отправиться на hidden-party, которая про-
ходила неподалеку от Ломоносова (Ораниенбаум) – приго- Ссылки:
рода Санкт-Петербурга, на территории пионерского лаге- 1. http://cc5.org.ru/index.php?uid=pubgrafik.
ря. По замыслу организаторов на hidden-party люди могли 2. Результаты: http://cc5.org.ru/index.php?uid=vote_result.
пообщаться в более неформальной обстановке, обсудить 3. Работы участников: ftp://ftp.cc5.org.ru/pub/2005.
первый день CC’5 и отдохнуть. После ужина началось «про-
должение банкета». Очень запомнился поход ночью к Фин- Александр Байрак
скому заливу и выступление музыкантов ChipCult. Жаль, Фото Евгения Давыдова

2
тенденции
Novell привлекает сторонних
Linux-разработчиков
В первой половине августа американская компания анон-
сировала и запустила инициативу OpenSuse, «открыв» раз-
работку своего ключевого Linux-продукта – дистрибути-
ва SUSE. Проект OpenSuse, по своей сути напоминающий
Fedora Project, поддерживаемый Red Hat, прямым конку-
рентом Novell, доступен на веб-сайте www.opensuse.org, где
вскоре и были опубликованы бета-релизы свободной версии
SUSE Linux 10.0. По словам Грега Манкузи-Унгаро, директо-
ра по маркетингу ОС Linux и Open Source в Novell, компания
таким образом рассчитывает привлечь большее число сто-
ронних разработчиков, новых пользователей и в конечном
счете получить более значимую долю на Linux-рынке.

«Жесткий» real-time в Linux


Специалистам из MontaVista Software удалось добиться ре-
ализации поддержки режима «жесткого реального време-
ни» (hard real-time) в Linux намного раньше, чем планиро-
валось, – это позволит операционной системе реагировать
на прерывания с высоким приоритетом за короткий, фикси-
рованный промежуток времени. Разработчики MontaVista,
пользовавшиеся и трудами сторонних Linux-программистов,
смогли снизить показатель задержки до 98 микросекунд,
что приблизительно в 100 раз лучше, чем позволяет обыч-
ное Linux-ядро версии 2.6.10. «Мы сделали это на два квар-
тала раньше, чем планировалось по графику», – заметил
Педер Уландер, вице-президент по маркетингу MontaVista.
Вскоре становится известно о взаимном сотрудничестве
MontaVista и PalmSource.

Создана Mozilla Corporation


Mozilla Foundation (MF) объявила о формировании нового
подразделения, которое поможет распространению своих
программных продуктов, – Mozilla Corporation. По словам
Mozilla, целью организации стоит дальнейшая популяри-
зация браузера Firefox, которая требует появления плат-
ных услуг по поддержке. Mozilla Corporation, что призвана
решить эту проблему, возглавила Митчелл Бэйкер, руко-
водящая и MF. Как она отметила в телефонном интервью,
новая корпорация будет прибыльной, однако ее целью ста-
нет реализация задач MF. «Наша фундаментальная цель –
продвижение открытого Интернета», – заявила она, доба-
вив, что нельзя игнорировать тот факт, что «Firefox стал
ценным активом». ИТ-аналитики (среди них специалисты
из RedMonk и Forrester Research) быстро отреагировали на
данное известие, одобрив создание Mozilla Corporation, что,
по их мнению, является вполне логичным шагом.

Новая акция раздачи дисков


с Open Source
Тысячи учеников средних школ Франции (провинции
Овернь) по возвращении к учебе в сентябре получат ком-
пакт-диски со свободным и открытым программным обес-
печением. По проекту, спонсируемому местным правитель-
ством, ученикам будет выдано 64 000 2-дисковых комп-
лектов с популярным FOSS. На первом CD представле-
но свободное программное обеспечение для ОС Microsoft
Windows и Apple Mac OS X, среди которого OpenOffice.org,

№8, август 2005 3


тенденции
Mozilla Firefox и GIMP, а второй диск – LiveCD на базе Kaella
(французской разновидности KNOPPIX). Любой желающий
сможет ознакомиться с миром Linux без потребности в ус-
тановке системы на жесткий диск.

Открыты исходники Quake 3


Выступая на QuakeCon 2005, Джон Кармак сообщил, что
после некоторых задержек id Software все-таки приготови-
ла к релизу все исходные коды популярной игры «Quake III:
Arena» под свободной лицензией GNU GPL. И 19 августа на
FTP-сайте компании появляется долгожданный архив с ис-
ходниками Quake3 1.32b. Кроме того, Кармак выразил за-
интересованность в том, чтобы кто-нибудь воспользовался
этим кодом для завершения работы над своим 3D-шутером
и продавал получившуюся игру с полным исходным кодом
на CD. Он добавил, что испытывает разочарование из-за
людей, слишком обеспокоенных защитой своего кода, боль-
шая часть которого основана на чужих разработках.

В среде Xen запущена ОС Windows


Компания XenSource сообщила об успешном запуске опе-
рационной системы Microsoft Windows (XP SP2) в среде
Xen, что стало важным шагом на пути к коммерциализа-
ции открытой виртуальной машины. Программное обеспе-
чение Xen, предназначенное для запуска множества опе-
рационных систем на одном компьютере, ранее обычно
использовалось в связке с Linux, однако сложно переоце-
нить важность возможности запуска и широко используе-
мой ОС Windows.
Составил Дмитрий Шурупов
по материалам www.nixp.ru

Началась работа над PHP 6.0


9 августа 2005 года в среде разработчиков PHP произошло
знаковое событие: CVS HEAD был отделен в ветку PHP 5.1,
после чего HEAD стал PHP 6.0.0. Пока в качестве основного
нововведения в PHP 6.0.0 планируется поддержка Unicode
(см. PHP Unicode support design document – http://news.php.
net/php.internals/17771). Вполне возможно, что будут и дру-
гие значительные изменения в лучшую сторону. Ветка 5.0
скорее всего не будет поддерживаться, ветка 5.1 становит-
ся стабильной и замораживается полностью вплоть до ре-
лиза, после чего в неё тоже будут допускаться только баг-
фиксы и другие незначительные изменения. «Девелопер-
ской» теперь становится ветка 6.0, и все новые разработ-
ки будут реализовываться именно здесь.
12 августа, отец-основатель PHP, Расмус Лендорф
(Rasmus Lerdorf), выступил со списком пожеланий к новой
версии языка (http://beeblex.com/lists/index.php/php.internals/
17883). В обсуждаемых сейчас PHP-сообществом девяти те-
зисах содержатся предложения по избавлению языка от та-
ких функций и настроек, как register_globals и magic_quotes,
удалению функций помеченных ещё в PHP 4 как deprecated
и т. д. В то же время Лендорф предлагает включить в базо-
вую поставку PHP кэширование байт-кода и новое расши-
рение для фильтрации входных данных. Обсуждение бу-
дущего языка возможно по адресу: http://beeblex.com/lists/
index.php/php.internals/17883.
Кирилл Сухов

4
конкурс

IT-ACADEMY 2005
НОВАЯ АКЦИЯ
ДЛЯ МОЛОДЫХ СПЕЦИАЛИСТОВ
Еще не закончился «Кубок сетевых проектов Microsoft», технические материалы с которого
мы планируем опубликовать в последующих номерах, как те же организаторы – компании
Microsoft, Softline и ZyXEL объявили о начале новой акции. Как и в прошлый раз, акция
проводится для молодежи – школьников, студентов, аспирантов и молодых специалистов
(недавних выпускников вузов), но теперь ее география расширилась – она проходит
в нескольких городах России: Москве, Томске, Омске, Воронеже и Самаре.

П
олное название акции – «Моло- бом из тестов не менее 60 процентов Почему во втором этапе нужно сна-
дежный чемпионат IT-Academy правильных ответов. Участники второ- чала пройти платный курс и только
2005». Несмотря на слово «чем- го этапа должны пройти специальный потом сдавать проверочный тест на
пионат», акция не имеет ничего общего 12-часовой курс «Построение IT-инфра- усвоение материала. Можно ли сда-
с турнирами для программистов и дру- структуры предприятия на основе про- вать тест без курса?
гими соревнованиями, в которых мо- дуктов Microsoft» стоимостью 599 руб- Нам кажется, что проверять началь-
гут участвовать только очень опытные лей. Курс рассматривает ОС Windows ную техническую подготовку участ-
специалисты. Наоборот, чтобы при- XP и Windows Server 2003, Групповую ника не очень логично. В самом деле,
нять участие в IT-Academy 2005 доста- политику и серверные продукты MS если человек и так все знает, зачем
точно лишь иметь общее представле- Exchange Server 2003 и MS ISA Server ему дополнительное обучение? На-
ние о том, чем занимаются компании 2004. В каждом городе по результатам ша идея – предоставить возможность
Microsoft и ZyXEL. обучения определится тройка побе- пройти обучение и сертифицировать-
Акция состоит из двух этапов, и у дителей, которые и смогут бесплатно ся тем людям, которые хотят и могут
каждого этапа свои призы. На первом пройти профессиональное обучение. эффективно учиться новому, незави-
этапе нужно сдать на сайте http://www. Акция показалась нам интересной, симо от их начального уровня знаний.
it-academy.ru бесплатный онлайн-тест и мы решили задать несколько вопро- Поэтому, чтобы поставить всех в рав-
Microsoft или ZyXEL. Задачей теста не сов организаторам. На наши вопросы ные условия, мы сначала обучаем, а
является проверка технических зна- отвечает директор по развитию реги- только потом тестируем. Что касает-
ний участника. Вместо этого тест про- ональных образовательных проектов ся платности курса, то цена установ-
веряет общее знакомство с компани- SoftLine Андрей Степанов. лена чисто символическая и даже ес-
ей, ее историей, новостями и продукта- ли не рассматривать возможность вы-
ми/услугами. С учетом того, что все от- В чем идея акции? игрыша, курс более чем оправдывает
веты можно найти в Интернете, сдача Мы хотели поощрить активных и лю- свою стоимость.
теста не выглядит особо сложной за- бознательных молодых людей, кото-
дачей. Главный приз в каждом городе рые знают или хотят узнать больше
получит тот, кто сдаст тест раньше и об IT-компаниях, а также серьезно за-
лучше всех. Среди остальных участ- думываются о повышении своего про-
ников будут разыграны по лотерее два фессионализма и получении междуна-
дополнительных приза. родных сертификатов.
Второй этап не является обязатель-
ным, но если есть желание побороться Как будут отбираться победители
за бесплатное обучение на несколь- второго этапа?
ких авторизованных курсах Microsoft Во время курса и сразу после его окон-
по программе MS IT Academy и за меж- чания будет проводиться тестирование
дународный сертификат Профессиона- усвоения материала. Те студенты, ко- Главный приз от компании ZyXEL –
802.11g+ беспроводной модем ADSL2+
ла Microsoft (MCP), то предваритель- торые покажут лучшие результаты, с 2-портовым шлюзом VoIP и 4-портовым
ным условием является набор на лю- и станут победителями. коммутатором P-2602HW EE

№8, август 2005 5


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

СМОЖЕТ ЛИ PC-BSD КОНКУРИРОВАТЬ


С Linux-ДИСТРИБУТИВАМИ?

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

СЕРГЕЙ СУПРУНОВ

М
ы рассмотрим дистрибутив PC-BSD. В руки мне по- тинка (рис. 1), которая позволит воспользоваться различ-
палась версия 0.7.8, основанная на FreeBSD 5.4- ными режимами загрузки в случае проблем.
RELEASE #2. Сейчас, когда я пишу эти строки, ве- Далее, перед переходом в графический режим, будет
дутся работы над версией 0.8, и не исключено, что к момен- выведено еще одно текстовое окно, предоставляющее
ту выхода журнала актуальной будет уже она. Тем не ме- еще несколько путей для преодоления возможных трудно-
нее основные свои черты дистрибутив должен сохранить, стей, например, вы сможете загрузиться в режим команд-
так что продолжим. ной оболочки (рис. 2).
Инсталлятор потребует некоторого знания английского
Процесс установки языка (можно надеяться, что в следующих релизах появит-
Инсталляция, снабженная удобным графическим интер- ся и русский), однако для человека, в общих чертах пред-
фейсом, прошла без каких-либо эксцессов. При загрузке с ставляющего себе установку операционной системы, ни-
диска вас встретит знакомая пользователям FreeBSD кар- каких сложностей возникнуть не должно.

6
администрирование
Итак, после приветствия и нескольких общих фраз
(рис. 3) вам будет предложено выбрать место на имею-
щихся у вас дисках, куда вы хотели бы выполнить уста-
новку (рис. 4).
Если отметить опцию «Customize DiskLabel», то вы по-
лучите возможность разбить выбранный слайс на подраз-
делы по своему желанию (рис. 5). Иначе будет выполне-
на нехитрая автоматическая разбивка, на мой взгляд, не
совсем оптимальная – 999 Мб будет занято под Swap, ос-
тальное место – под корневой раздел. При таком распре-
делении слайса резко возрастает риск повредить систе-
му при аварийном завершении работы. Учитывая, что ка-
Рисунок 1. Стандартное меню загрузчика BSD
чество электросети в нашей стране по-прежнему остав-
ляет желать лучшего, а ИБП дома – роскошь, вероятность
неприятностей становится еще выше. Хотя файловая сис-
тема FreeBSD достаточно устойчива к сбоям, все же луч-
ше потратить несколько минут и указать более удачное
разбиение, выделив, по крайней мере, отдельные разде-
лы для /usr и /var. Кроме того, подобное разбиение позво-
лит более гибко оптимизировать работу ФС в зависимос-
ти от решаемых задач, например, включив асинхронный
режим работы для /var.
Далее инсталлятор поинтересуется, желаете вы устано-
вить загрузчик BSD или нет. После чего начнется процесс
копирования файлов, который займет минут 15-20. (Кста-
ти, если во время копирования ваш экран вдруг станет чер- Рисунок 2. Окно выбора режима работы
ным, не пугайтесь – это screen-saver.) В конце вам нужно бу- На рабочем столе не будет видно иконок быстрого мон-
дет ввести пароль суперпользователя, а также заполнить тирования CD и жестких дисков. Они размещены под икон-
данные непривилегированного пользователя, от имени ко- кой «Computer» и далее – «Drives». Там же можно найти и не-
торого вы будете в дальнейшем работать в системе. Здесь что вроде «Сетевого окружения» для Samba. Монтирование-
же вы сможете отметить, хотите ли входить в систему ав- размонтирование дисков выполнялось легко, что называет-
томатически (опция «Autologon»). Теперь со спокойной со- ся, парой кликов (рис. 6). Подключение разделов NTFS тоже
вестью можно перезагрузиться. возможно, но только на чтение. Кстати говоря, для непри-
вилегированного пользователя и FAT будет доступна толь-
Про маленькую проблему ко для чтения – писать туда по умолчанию может лишь root.
Упомяну здесь про интересное поведение дистрибутива, И еще, что бросилось в глаза, – в папке автомонтирования
когда я попытался его поставить на свой домашний ком- были предложены только диски, размещенные на основных
пьютер с отключенным Primary Master-диском (был подклю- разделах. Логический диск с FAT32, который у меня находит-
чен только Slave). Сперва он не нашел никакие диски во- ся на дополнительном разделе, обнаружен не был.
обще, но после нажатия кнопки «Обновить» в окне выбора Среди имеющихся приложений можно найти несколько
диска предложил поставить систему на неизвестно откуда простых текстовых редакторов (Kate, KWrite), средства для
взявшийся BSD-раздел размером около 2 Гб. просмотра графики, PDF, аудиоплейер, десятка два обыч-
Когда я ради интереса согласился и продолжил установ- ных для KDE игрушек.
ку, PC-BSD 15 минут честно копировал свои файлы в нику- Для работы в Интернете к вашим услугам браузер
да, сопровождая это сообщениями «Failed to create dir…», не Konqueror, почтовый клиент KMail, менеджер закачек KGet.
прерывая тем не менее работы. После перезагрузки, естес- Столь популярный ныне Firefox в дистрибутив не попал, так
твенно, ничего установленного найдено не было. же как и старушка Mozilla.
Таким образом, прежде чем начинать установку, убеди- Ни исходных кодов, ни дерева портов в дистрибутиве
тесь, что в системе есть диск Primary Master (саму установ- нет, так что вам придется добывать их самостоятельно, ес-
ку не обязательно выполнять на него). ли возникнет необходимость пересобрать ядро или устано-
вить какой-нибудь пакет. Впрочем, для работы с приложе-
Первые впечатления ниями PC-BSD предлагает собственное решение.
При загрузке в свежеустановленную систему вы сразу по-
падете в KDE. Все довольно стандартно, однако в дистри- Установка дополнительных приложений
бутивах Linux я уже успел привыкнуть к кнопке вызова тер- Еще на этапе инсталляции вы можете встретить подсказ-
минала, размещенной непосредственно на панели инстру- ку, что при желании вы можете закачать себе дерево пор-
ментов или, по крайней мере, в главном меню KDE. Здесь тов простой командой:
же пришлось добираться до нее через несколько вложен-
ных меню. # cvsup /root/ports-supÞle

№8, август 2005 7


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

Рисунок 3. Начинаем инсталляцию PC-BSD Рисунок 4. Диалог выбора раздела для установки

Рисунок 5. Разбиваем слайс на подразделы Рисунок 6. Инструмент автомонтирования дисков

Рисунок 7. Установка Firefox из pbi-пакета Рисунок 8. Рабочее окно KPackage

Но разработчики PC-BSD предлагают другое реше- ляторах. Как будто вы ставите msi-приложение в системе
ние – пакеты pbi. Скачать их можно с сайта http://www.pcbsd. Windows.
org, однако на данный момент выбор не очень богатый – Установленные таким образом приложения можно бу-
чуть больше 50. Зато это наиболее востребованное ПО – дет найти в PC-BSD Package Manager (рис. 7). Из этого же
OpenOffice, Firefox, Opera, Thunderbird, GIMP, ClamAV и др. окна лишнее можно и удалить.
Так вот достаточно скачать себе pbi-файл, и одним щел- Ну и помимо данного способа вы можете воспользо-
чком мыши вы получите у себя готовое к работе приложе- ваться более традиционным менеджером пакетов KPackage
ние. Не нужно заботиться ни о зависимостях, ни о компи- (рис. 8) либо использовать коллекцию портов традицион-

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

Рисунок 9. KDE Control Center. Keyboard layout Рисунок 10. Настройка сети вручную

ным способом, выполнив предварительно указанную вы- языка – огромный минус, однако можно надеяться, что в сле-
ше команду. дующих версиях ситуация изменится в лучшую сторону.
Опытному пользователю, конечно же, будет не хватать
Поддержка русского языка коллекции портов и исходных кодов, но, потратив пару со-
Вот чего нет, того нет. Конечно, вы можете выбрать рус- тен мегабайт трафика, можно легко привести систему в при-
скую раскладку клавиатуры в KDE Control Center (рис. 9), вычное состояние.
и это позволит вам набирать тексты в простых редакто- Таким образом, PC-BSD – хорошая отправная точка
рах типа Kate на родном языке (используется кодиров- для установки FreeBSD на свой домашний или рабочий
ка Unicode). Однако, установив тот же OpenOffice как pbi- компьютер, хотя по сравнению с большинством дистрибу-
пакет, вы обнаружите полное отсутствие кириллических тивов Linux этот дистрибутив пока еще заметно отстает и
шрифтов. Так что придется предварительно потрудиться требует доводки «напильником». Впрочем, это можно объ-
над русификацией. яснить его молодостью.

Поддержка сети
Естественно, сеть дистрибутивом поддерживается в пол-
ном объеме. Но, как это ни печально, графической утилиты
для ее настройки я не нашел. Поэтому придется восполь-
зоваться старым добрым консольным способом (рис. 10).
Кстати, обратите внимание, что ipfw по умолчанию вклю-
чен как открытый. То есть он будет пропускать все пакеты,
что выглядит не очень правильным решением. Работать с
правилами ipfw также придется вручную.

Средства разработки
В самом дистрибутиве помимо C-компилятора (куда же без
него) можно найти Perl 5.8.7, Python 2.4.1, Ruby 1.8.2. Таким
образом, у вас есть достаточно инструментов, чтобы сде-
лать свою работу простой и комфортной. При необходи-
мости вы можете установить KDevelop или Quanta из упо-
мянутых ранее pbi-пакетов либо же воспользоваться сис-
темой портов, предварительно скачав себе свежее дере-
во коллекции.

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

№8, август 2005 9


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

ASTERISK И LINUX: МИССИЯ IP-ТЕЛЕФОНИЯ


ДЕЙСТВИЕ 3

Соединив нашу мини-АТС с «городом» [1], мы уже получили привлекательное решение,


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

МИХАИЛ ПЛАТОВ
Послушаем почту? +--------- Asterisk Web Voicemail ----------+
Как вы помните, для проверки голосовой почты в нашем + +
+ Asterisk Web Voicemail is installed in +
номерном плане есть специальный номер – 8500. Позво- + your cgi-bin directory. IT USES A SETUID +
нив на него и введя личный пароль, наши пользователи мог- + ROOT PERL SCRIPT, SO IF YOU DON'T LIKE +
ли прослушать оставленные им сообщения. Правда, иног- + THAT, UNINSTALL IT! +
+ +
да такой способ доступа бывает несколько неудобен (на- +-------------------------------------------+
пример, вы находитесь в другом городе или просто под ру-
кой нет телефона). Для решения этой проблемы можно от- Если использование setuid вас устраивает, проигно-
сылать записанные сообщения на e-mail (см. [2]) или орга- рируйте это сообщение и перейдите к следующему шагу.
низовать централизованный доступ через Интернет с ис- В противном случае вы можете воспользоваться специаль-
пользованием безопасного SSL-соединения. Отрадно то, ным патчем для Asterisk, описанным в [3].
что в состав стандартного дистрибутива Asterisk веб-ин- Отредактируем файл скрипта vmail.cgi, определив сле-
терфейс для работы с голосовой почтой уже входит, прос- дующее значение для контекста по умолчанию:
то в целях безопасности автоматически он не устанавли-
вается. Что, впрочем, не мешает нам сделать это самосто- context="ofÞce"
ятельно. Для работы данного интерфейса необходим веб-
сервер apache с пакетом perl-suid. Краткости ради будем Откроем ваш любимый браузер и введем URL только
считать, что эти пакеты у нас уже установлены и работают, что установленного интерфейса (в моем случае это будет
а веб-сервер сконфигурирован так, что cgi-bin расположен http://ast-test/cgi-bin/vmail.cgi). Если все было сделано пра-
в /var/www/cgi-bin, и cgi-скрипты, входящие в стандартную вильно, то мы увидим следующее (см. рис. 1).
поставку, выполняются без проблем. Итак, перейдем в ка- Введя имя пользователя (номер телефона) и пароль, мы
талог /usr/src/asterisk и выполним команду make webvmail. попадем в папку «Входящие» нашего ящика (см. рис. 2).
Программа make скопирует все необходимые файлы и вы- Пользователей linux-систем придется немного расстро-
даст следующее предупреждение: ить – воспроизведение в браузере через плагин (кнопка

10
администрирование
play) скорее всего не заработает, и для прослушивания со-
общений придется загружать файлы на компьютер (кнопка
download), а вот с Windows все нормально (см. рис. 3).
При организации работы из Интернета рекомендуется
ограничить доступ к странице средствами веб-сервера, а
также настроить использование SSL (https://) для безопас-
ной передачи паролей.

Виртуальный «круглый стол»


Возможности современных систем телефонии не ограничи- Рисунок 1. Окно входа веб-интерфейса системы
голосовой почты
ваются ведением разговоров между двумя абонентами. С
помощью специального режима – конференц-связь – воз-
можно организовать одновременное общение нескольких
человек. Системы разного «калибра» отличаются макси-
мально допустимым количеством конференций, а также
числом участников в них. И если в недорогих офисных ми-
ни-АТС количество собеседников, как правило, невели-
ко (не больше 8-10 человек), то в Asterisk их максималь-
ное число ограничивается лишь аппаратными возможнос-
тями используемого сервера. Существует как минимум 3
известных модуля, предоставляющих возможности конфе-
ренций для Asterisk:
! MeetMe
! Conference
! MeetMe2

MeetMe является исторически первым приложением,


предоставившим возможности конференций. Модуль яв- Рисунок 2. «Входящие» сообщения голосовой почты
ляется достаточно функциональным и позволяет решать
широкий класс задач. Несмотря на то что MeetMe входит в
стандартную поставку Asterisk, для его работы необходи-
мы высокоточные таймеры, присутствующие в аппаратуре
Digium. Модуль conference же, напротив, не требует нали-
чия zaptel-устройств, однако он предоставляет несколько
меньшую функциональность. Отличительной особенностью
conference является более эффективное использование ре-
сурсов сервера, что позволяет обеспечивать одновремен-
ную работу большего числа пользователей. MeetMe2 яв-
ляется переработанной версией MeetMe. Наиболее значи-
мые отличия – хранение конфигурации в СУБД и несколь-
ко другие возможности управления.
Все модули имеют схожую схему использования. Пос-
ле звонка по определенному номеру абонент попадает
в «виртуальную комнату». Как только в «комнате» окажут-
ся хотя бы два участника, начнется разговор. В конферен- Рисунок 3. Прослушивание сообщения голосовой почты
циях существует 3 типа пользователей: «слушатели», «ора- uhci) и 2.6.x. Откроем Makefile библиотеки zaptel и уберем
торы» и «администраторы». «Слушатели» лишены права комментарий (символ «#») перед ztdummy. Для zaptel 1.0.9
голоса, «ораторы» могут не только слушать, но и разго- это строка 61. После этого пересоберем библиотеку (make
варивать. На «администраторов» возлагаются обязаннос- & make install) и попробуем загрузить модуль ztdummy:
ти управления – изменение статуса, удаление и добавле-
ние пользователей, открытие и закрытие «комнаты» и т. д. # modpobe ztdummy
Основы работы с конференциями рассмотрим на приме-
ре модуля MeetMe. Убедимся, что у нас это получилось:
Как было сказано выше, для работы MeetMe необходи-
мы высокоточные таймеры, присутствующие в оборудова- # lsmod |grep ztdummy
нии Digium. Если же никаких плат в машине с Asterisk нет, ztdummy 3620 0
не расстраивайтесь, есть несколько способов программной zaptel 225732 1 ztdummy

эмуляции таймеров! Одним из них мы сейчас и воспользу- Настроим автоматическую загрузку модуля, добавив
емся. Этот способ применим для ядер 2.4.x (с модулем usb_ соответствующую запись в стартовые скрипты системы

№8, август 2005 11


администрирование
(в случае Gentoo это будет строка в одном из файлов внут- [general]
enabled = yes
ри /etc/modules.autoload.d). После этого можно смело при- port = 5038
ступать к настройке конференций. bindaddr = 127.0.0.1
Определим «место встречи» (conference room) пользо- [webmm]
вателей. Для этого в файл /etc/asterisk/meetme.conf доба- secret = webmmpw
permit=127.0.0.1
вим следующее: read = system,call,log,verbose,command,agent,user
write = system,call,log,verbose,command,agent,user
[rooms]
conf=> 400
С конфигурационными файлами теперь все нормаль-
Этим мы создали «комнату» с номером 400. Теперь сде- но, а вот с самими PHP-скриптами не очень. Дело в том,
лаем в ней «дверь». Для этого в файл extensions.conf доба- что web-meetme написан с учетом того, что переменная
вим следующие строки: PHP RegisterGlobals определена как «On». Из соображе-
ний безопасности, начиная с PHP-4.2.0, значение по умол-
[confs] чанию для этой переменной – Off. Поэтому, для того что-
exten => 400 , 1, Meetme, 400
[ofÞce] бы скрипты заработали, необходимо либо поменять зна-
include=> confs чение RegisterGlobals в файле php.ini, либо модифициро-
вать файл conf_control.php, добавив в его начале следую-
Перезапустите Asterisk и позвоните на номер 400 со щие строки:
всех телефонов. Пользователи попадут в общую «комнату»
№400 и смогут одновременно общаться друг с другом. getpost _ ifset(array('confno'));
getpost _ ifset(array('action'));
Кроме статического описания «комнат» конфереций getpost _ ifset(array('user _ id'));
(пример, который мы только что рассмотрели), MeetMe так-
же может создавать их динамически. В этом случае чело- Кроме того, для нормальной работы с версией Aster-
век, открывающий «комнату», определяет для нее соответс- isk 1.0.9 мне пришлось закомментировать строку 113 (вы-
твующий пароль доступа. После этого он сообщает номер зов break) в файле conf_control.php.
комнаты и пароль остальным участникам, и они начинают Если интерфейс установился нормально, то в браузере
обсуждение. А любители подслушивать телефонные разго- мы увидим следующее (см. рис. 4).
воры в это время злобно грызут ногти и кусают локти.
Реализовать эту возможность на практике можно с по- Системный телефон
мощью следующей конструкции номерного плана: Неотъемлемым атрибутом любой мини-АТС является сис-
темный телефон. С его помощью оператор может полностью
[confs-dynamic] контролировать состояние мини-АТС (какие линии в данный
exten => 500, 1,MeetMe(|MD)
[ofÞce] момент свободны, какие заняты и т. д.). Более функциональ-
include => confs-dynamic ным аналогом системного телефона для Asterisk является
Flash Operator Panel. C помощью FOP можно переключать
Теперь сделаем еще один шаг в сторону «идеального сер- и завершать звонки, просматривать запаркованные вызо-
вера» и установим веб-интерфейс для управления конферен- вы, следить и управлять конференц-комнатами, да и прос-
циями. С его помощью можно легко и просто подключать и то наблюдать за тем, что происходит с Asterisk.
отключать участников, давать и отбирать «право» голоса, да С точки зрения администратора, FOP является кли-
и вообще – просто наблюдать за тем, что происходит в наших ент-серверным приложением. В качестве клиента высту-
«комнатах». Для работы с интерфейсом нам так же, как и с пает flash-приложение, выполняемое в любом из популяр-
голосовой почтой, понадобится веб-сервер, только теперь с ных браузеров (IE, Opera, Mozilla/Firefox). Серверная часть
интерпретатором PHP. Будем считать, что все это у нас име- представлена perl-скриптом, в реальном времени получа-
ется, поэтому без промедлений приступим к установке. ющим от Asterisk информацию о совершаемых в нем дейс-
Первым делом скачаем с [12] архив с Web-MeetMe и рас- твиях. На момент написания этих строк последняя доступ-
пакуем его в Apache_DocumentRoot/meetme. Зайдем в ка-
талог phpagi и скопируем файл phpagi.example.conf в /etc/
asterisk/phpagi.conf. Внесем в этот файл некоторые изме-
нения:

server=127.0.0.1
port=5038
username=webmm
secret=webmmpw

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


мандный интерфейс управления Asterisk (Asterisk Manager
Interface – AMI). В целях безопасности по умолчанию он от-
ключен, нам же потребуется его включить. Для этого отре-
дактируем файл /etc/asterisk/manager.conf: Рисунок 4. Интерфейс управления конференциями

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

№8, август 2005 13


администрирование
ная версия FOP – .22 (см. рис. 5). Домашняя страница про-
екта – [4].
При работе с Asterisk FOP также использует Asterisk
Manager Interface. Таким образом, первое, что нам нужно
будет сделать, – добавить в файл manager.conf соответс-
твующую разрешающую запись:
Рисунок 5. Структура Flash Operator Panel
[fop _ user] «комнат», которые будут использоваться для реализации
secret = superfopsecret
deny=0.0.0.0/0.0.0.0 этой возможности. Кроме того, на панели FOP можно груп-
permit=127.0.0.1/255.255.255.0 пировать кнопки по контекстам. Для этого перед ними необ-
read = system,call,log,verbose,command,agent,user
write = system,call,log,verbose,command,agent,user ходимо написать имя соответствующего контекста.
Параметры визуализации (клиентская часть) задаются в
Теперь перейдем к FOP. Настройки серверной части за- файле op_buttons. Синтаксис его достаточно прост. Сначала
даются в файле op_server.cfg. Наиболее значимыми для нас описываются кнопки, отвечающие за абонентов Asterisk:
параметрами являются:
[SIP/200] ; имя абонента
Position=1 ; номер кнопки на консоли
manager _ host=127.0.0.1 Label="Vasya" ; надпись на кнопке
manager _ user=fop _ user Extension=200 ; номер абонента
manager _ secret=superfopsecret Context=ofÞce ; контекст, в котором
; определен абонент
Этим мы указали perl-серверу, где и как нужно искать Mailbox=200@ofÞce ; ящик голосовой почты пользователя
Icon=1 ; номер иконки для данного
Asterisk. К слову, с помощью FOP можно отслеживать состо- ; пользователя (то 1 до 6)
яние несколько серверов Asterisk. В этом случае надо про-
дублировать эти строки необходимое количество раз, задав Чтобы не определять настройки для каждого пользова-
в них соответствующие параметры других серверов. теля вручную, можно задать общее описание с использо-
ванием регулярного выражения:
ßash _ dir=/var/www/html/fop
web _ hostname=ast-test [ _ SIP/.*]
security _ code=fop _ pwd Position=n ; использовать следующий
poll _ voice _ mail=1 ; незанятый номер
Label="SIP Users"
Extension=-1 ; на эту кнопку перенаправлять
Первой строкой мы задали местоположение файлов ; звонки нельзя
панели. Второй – имя, по которому к серверу будут обра- Context=generic _ inc
Icon=2
щаться клиенты (это необходимо для того чтобы FOP пра-
вильно формировал URL в процессе своей работы). Пара- Для отображения состояния места парковки восполь-
метр security_code назначает пароль, который необходимо зуемся следующим:
будет вводить для выполнения действий (переключение,
завершение звонков). Четвертый параметр говорит сер- [PARK701]
Position=n
веру о том, что ему следует периодически самостоятельно Icon=3
проверять состояние голосовых ящиков (без использова- Extension=700
Label="Park 701"
ния AMI). Данный параметр необходим в случаях, если для
доступа к почте используется веб-интерфейс. Следующие А вот так опишем «комнату» конференций:
настройки касаются работы с конференциями:
[400]
Position=n
conference _ context=confs Label="Meetme 400"
barge _ rooms=400 Extension=400
barge _ muted=1 Context=confs
Icon=6
Первая строка тривиальна – контекст номерного пла-
на, содержащий внутренний номер для доступа к конфе- Следующие строки покажут нам состояние внешней
ренции. zaptel-линии:
А вот на последних двух остановимся более подробно.
Дело в том, что с помощью fop можно «собирать» людей в [Zap/1]
Position=10
конференции. Третий параметр очень полезен в тех ситу- Label="External 1"
ациях, когда оператору необходимо прослушать разговор Extension=-1
Icon=2
других абонентов. При значении «1» у пользователей, до-
бавляемых FOP к конференции, будет «отключены микро- Для большего удобства на панели можно нарисовать
фоны», таким образом можно незаметно подключать учас- разделяющие прямоугольники и вспомогательные подпи-
тников к конференции или организовывать прослушивание си. Сделать это можно, отредактировав файл, отвечающий
разговоров оператором. При необходимости «микрофон» за визуальное представление – op_style.cfg.
можно включить, воспользовавшись все тем же веб-интер- В качестве последнего штриха настроим автоматичес-
фейсом. Строкой barge_rooms мы определяем те номера кий запуск perl-сервера при старте системы. Для этого мож-

14
администрирование
но воспользоваться одним из готовых скриптов, входящих
в состав дистрибутива (есть скрипты для Debian и Redhat)
или просто прописать вызов op_server.pl (или safe_opserver)
в стартовых скриптах вашего дистрибутива.

Единый центр управления


Как вы могли заметить, настраивая Asterisk, мы редакти-
ровали те или иные конфигурационные файлы. Некоторым
такой способ администрирования может показаться не-
сколько неудобным. В таком случае рекомендую посмот-
реть в сторону Asterisk Management Portal. AMP представ- Рисунок 6. Связь AMP и Asterisk
ляет собой веб-приложение, позволяющее управлять на- характер работы данного приложения, не имеет смысла
стройками Asterisk с помощью популярного веб-браузера. придерживаться уже созданной нами конфигурации. По-
Для лучшего понимания его работы обратимся к следую- этому при настройке Asterisk с использованием AMP бу-
щей схеме (см. рис. 6). дем считать, что перед нами вновь лежит «чистый лист».
Управление производится следующим образом: пос- Итак, возьмем клавиатуру в руки и отправимся навстречу
редством веб-интерфейса администратор редактирует базу к нашей цели!
данных, задавая в ней необходимые параметры (добавле-
ние/удаление пользователя, смена пароля, изменение пра- Устанавливаем AMP
вил маршрутизации и т. д.). Затем, по информации, храни- Для установки портала нам понадобятся все компоненты
мой в этой базе, веб-сервер обновляет конфигурационные популярной платформы LAMP – Linux, Apache, MySQL и PHP
файлы Asterisk и с помощью AMI сообщает серверу о том, (последний должен быть скомпилирован с поддержкой nls).
что настройки необходимо применить заново. Кроме того, Кроме того, нам также потребуются PHP-PEAR-DB, интер-
используя дополнительный модуль (веб-интерфейс, для ко- претатор perl, а также perl-модули: Net::Telnet, IPC:Signal и
торого также входит в состав AMP), Asterisk помещает ин- Proc:WaitStat.
формацию о всех совершенных звонках непосредственно Первые установим с помощью средств, имеющихся
в MySQL, что открывает дополнительные возможности для в распоряжении вашего дистрибутива, а для вторых вос-
анализа исходящего голосового трафика организации. пользуемся репозитарием CPAN:
После некоторого практического изучения данного про-
дукта сложилось впечатление, что больше всего AMP под- # perl -MCPAN -e "install Net::Telnet"
# perl -MCPAN -e "install IPC::Signal"
ходит для 2 групп пользователей: # perl -MCPAN -e "install Proc::WaitStat"
! Начинающие пользователи, имеющие лишь общее пред-
ставление об Asterisk. Помимо этого нам потребуется добавить поддержку perl
! Администраторы, уже имеющие опыт работы с Asterisk, к самому Asterisk. Для этого установим модуль asterisk-perl,
без труда разбирающиеся в его конфигурационных предварительно загрузив его с [6].
файлах и желающие упростить выполнение некоторых На этом подготовительные действия завершены, и мы
наиболее типичных задач. можем смело приступить к установке самого AMP. По уже
сложившейся традиции, воспользуемся последней стабиль-
Для первой группы пользователей AMP позволит на- ной версией, доступной на момент написания этих строк –
строить наиболее популярные вещи, не вдаваясь при этом 1.10.008. Загрузим и распакуем tarball с файлами проек-
в дебри конфигурационных файлов с их многочисленными та в удобное для нас место. Для определенности пусть это
и зачастую непонятными параметрами. Для данной катего- будет /usr/src:
рии самым сложным этапом является правильная установ-
ка портала. Впрочем, эта проблема легко решается приме- # cd /usr/src
# wget http://citkit.dl.sourceforge.net/sourceforge/ ↵
нением специализированных дистрибутивов, уже имеющих amportal/AMP-1.10.008.tar.gz
в своем составе все необходимое, в том числе и AMP. На- # tar xfz ./AMP-1.10.008.tar
иболее известный из них – Asterisk@Home [5].
Для второй категории пользователей AMP является Создадим две базы данных в MySQL. В первой будет
мощным средством, позволяющим в короткие сроки по- храниться служебная информация AMP, во второй – инфор-
лучить законченное и достаточно функциональное реше- мация о совершенных пользователями звонках.
ние на базе Asterisk. Причем здесь AMP выступает не как
полный отказ от ручного редактирования конфигурацион- # mysqladmin create asterisk -p
ных файлов (как это было в первом случае), а скорее как Enter password: <пароль root-пользователя MySQL>
удобное дополнение к ним (например, стандартные вещи # mysql-u root asterisk -p < usr/src/AMP/SQL/newinstall.sql
делаются в портале, а нестандартные – путем custom-ко-
манд AMP или непосредственным редактированием кон- Первая база создана. Теперь дадим пользователю
фигурационных файлов). Asterisk необходимые права доступа:
На этом позвольте закончить описание теоритеское и
перейти к практическому рассмотрению AMP. Учитывая # mysql -u root -p

№8, август 2005 15


администрирование
Enter password: <пароль root-пользователя MySQL> /usr/sbin/asterisk -U asterisk
mysql> GRANT ALL PRIVILEGES
-> ON asterisk.*
-> TO auser@localhost
Убедимся, что автозапуск op_server.pl настроен и сам сер-
-> IDENTIFIED BY 'p0rtalpwd'; вер запущен. Если все было сделано правильно, то, открыв
Query OK, 0 rows affected (0.00 sec) http://имя_машины, мы увидим следующее (см. рис. 7).
mysql> \q

Создадим вторую базу: Настройка AMP


С интерфейсом голосовой почты мы уже знакомы, поэтому
# mysqladmin create asteriskcdrdb –p без лишних проволочек перейдем в основной раздел управ-
Enter password: <пароль root-пользователя MySQL> ления, щелкнув по ссылке «Asterisk Management Portal».
# mysql -u root asterisk -p < ↵ Перед нами предстанут три раздела меню: настройка
usr/src/AMP/SQL/cdr _ mysql _ table.sql (Setup), отчеты (Reports) и панель FOP. Как следует из на-
Enter password: <пароль root-пользователя MySQL>
звания, для конфигурации системы используется Setup. Воз-
mysql> GRANT ALL PRIVILEGES можные действия в этом разделе перечислены в меню слева.
-> ON asteriskcdrdb.* Первым делом перейдем в подраздел Extensions и создадим
-> TO auser@localhost
-> IDENTIFIED BY 'p0rtalpwd'; несколько учетных записей пользователей (см. рис. 8).
Query OK, 0 rows affected (0.00 sec) При настройках по умолчанию (и с уставленным zaptel-
mysql> \q
оборудованием) сразу же после добавления пользователей
Теперь установим модуль регистрации звонков cdr_ и применения конфигурации уже можно совершать звонки,
mysql, входящий в состав пакета asterisk-addons.: в том числе и с использованием ZAP-каналов через пре-
фикс 7. Правда, скорее всего нам предварительно потребу-
# wget http://www.asterisk.org/html/downloads/ ↵ ется немного подправить настройки zaptel для учета специ-
asterisk-addons-1.0.9.tar.gz
# tar xfz ./asterisk-addons-1.0.9.tar.gz фики отечественных АТС, но, учитывая наш опыт из [1], это
# cd ./asterisk-addons-1.0.9 вряд ли вызовет у нас какие либо серьезные трудности.
В Makefile добавим следующую запись (строка 21): Для настройки междугородней IP-телефонии необхо-
димо создать транки (способ описания точек терминации
CFLAGS+=DMYSQL _ LOGUNIQUEID внешнего по отношению к Asterisk трафика) и добавить со-
ответствующие правила маршрутизации (раздел Outbound
И завершим инсталляцию модулей, выполнив команды: Routing). Формат этих правил во многом совпадает с тем,
что мы определяли в текстовых файлах, поэтому практи-
# make && make install ческое рассмотрение данной возможности мы оставим для
самостоятельного изучения. Благо с использованием кон-
Стандартная схема установки AMP предполагает, что текстных подсказок веб-интерфейса этот процесс не явля-
Asterisk и веб-сервер должны выполняться одним пользо- ется очень сложным.
вателем: В разделе Ring Groups мы несколькими движениями
мышки можем объединить абонентов в единую группу вы-
# groupadd asterisk зова. Кроме того, также имеется возможность задать аль-
# useradd -c "asterisk PBX" -d /var/lib/asterisk -u ↵
5060 –g asterisk asterisk тернативное поведение системы для случаев, когда ни один
из абонентов группы не доступен (см. рис. 9).
Настроим запуск веб-сервера от пользователя Asterisk. В Incoming Calls определяются правила обработки звон-
Для этого в конфигурационном файле apache напишем: ков, приходящих с ZAP-каналов. Стандартной функцио-
нальностью коробочного номерного плана AMP является
Userasterisk возможность определения различных правил маршрутиза-
Groupasterisk
ции для рабочего и нерабочего времени. При этом в качес-
Теперь установим файлы самого AMP. Для этого запус- тве адресатов могут выступать группы вызова, системы го-
тим соответствующий установочный скрипт (учтите, что лосовых меню, очереди или обычные абоненты.
после его выполнения существующие файлы конфигура-
ции Asterisk будут замещены, поэтому при необходимости
не забудьте сделать резервные копии):

# /usr/src/AMP/install _ amp

В интерактивном режиме скрипт выведает у нас все не-


обходимые имена, явки и пароли (попутно сохранив их для
потомков в /etc/amportal.conf), скопирует все необходимые
файлы и проинициализирует базу данных MySQL. Настро-
им работу asterisk с использованием учетной записи обыч-
ного пользователя. Для этого в стартовом скрипте Asterisk
используем конструкцию следующего вида: Рисунок 7. Стартовая страница AMP

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

Рисунок 8. Создание абонентов в AMP Рисунок 9. Группы вызовов абонентов

Рисунок 10. Модуль отчетов AMP Рисунок 11. Интерфейс Flash Operator Panel
Для остальных разделов конфигурации ограничимся ! On Hold Music – в этом подразделе мы можем загру-
кратким описанием их назначения. зить на сервер дополнительные мелодии для музыки
! Queues – здесь определяются параметры очередей и при ожидании.
агентов. Более подробно эти параметры будут рассмот- ! System Recording – с помощью этого пункта меню мож-
рены в одном из следующих номеров журнала. но добавлять (или записывать) в Asterisk дополнитель-
! Digital Receptionist – автосекретать. С помощью этого ные звуковые сообщения, которые впоследствии могут
пункта можно быстро создать голосовое меню. Напри- быть использованы в голосовых меню.
мер, запишем такой текст: «Здравствуйте! Вы позвони- ! Backup & Restore – как следует из названия, с помощью
ли в СамуюЛучшуюКомпанию. Для соединения с ком- данного раздела можно резервировать и восстанавли-
мерческим отделом нажмите 1. Технический отдел – 2. вать конфигурацию Asterisk-сервера. Для работы этой
Бухгалтерия – 3 и т. д.» Затем с помощью того же мас- функции необходимо добавить в crontab выполнение со-
тера создадим правила маршрутизации для этого ме- держимого /etc/asterisk/backup.conf.
ню, перенаправляющие пользователей в соответству- ! General Settings – в этом пункте определяются некото-
ющие отделы (в общем случае правила могут не соот- рые системные параметры AMP – время дозвона до або-
ветствовать текстовому сообщению). И, наконец, назна- нента перед перенаправлением к голосовой почте, па-
чим созданное меню для входящих звонков в подраз- раметры работы с каталогом пользователей и настрой-
деле Incoming Calls. Этим самым мы значительно сни- ки обработки входящих факсов.
зим нагрузку на нашего секретаря, освободив его вре-
мя для более интересной работы. Более менее разобравшись с имеющимися возможнос-
! DID Routes – маршруты прямого вызова. С помощью тями настройки, остановимся на модуле отчетов. С его по-
данной функции можно напрямую позвонить внутрен- мощью администратор может не только получить деталь-
нему абоненту/агенту/группе вызова Asterisk с исполь- ную информацию за любой интересующий его период вре-
зованием механизма DID (при этом DID также должен мени, но и просмотреть статистическую информацию о за-
поддерживаться городской телефонной станцией). грузке сервера в течение дня или на протяжении месяца.

№8, август 2005 17


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

Лирическое отступление зуем протокол UDP, не предоставляю- больше похож на использование T.38
о факсах щий гарантий доставки пакетов). Ес- вместо обычного кодека (факсовые
Как вы могли заметить, один из раз- ли вдобавок еще и взглянуть на пер- данные упаковываются в обычные
делов меню AMP посвящен настройке вую строчку таблицы в [8], то мы уви- RTP-пакеты). Проще говоря, подде-
приема факсов в Asterisk, однако в ста- дим, что при передаче факса через ржка в прокси-серверах первых двух
тье об этой возможности не было ска- Интернет нам потребуется канал с ре- протоколов требует дополнительных
зано ни единого слова. Причиной тому альной пропускной способностью око- усилий от разработчиков, в то время
является текущий уровень реализации ло 80 кБит, что, согласитесь, уже не- как для третьего варианта достаточ-
поддержки работы с факсами в систе- мало. По этим и другим причинам для но поддержки в конечных устройствах.
мах IP-телефонии в целом и в Asterisk передачи факсов через голосовые се- К тому же ситуация усугубляется тем,
в частности. Давайте рассмотрим эту ти все чаще стараются использовать что зачастую производители голосово-
проблему более внимательно. T.38. Данный протокол был разрабо- го оборудования если и реализуют под-
На самом верхнем уровне можно тан организацией ITU-T специально держку T.38 в своих устройствах, то ог-
выделить два основных способа пере- для передачи факсов в VoIP-сетях. раничиваются лишь одним из вариан-
дачи факсимильных сообщений в сис- Механизм работы устройств, подде- тов реализации (чаще первым), со все-
темах IP-телефонии: рживающих данный протокол, следу- ми вытекающими отсюда несовмести-
! Поверх существующего голосово- ющий – при обнаружении голосовым мостями и проблемами.
го кодека. шлюзом сигналов факса он пытается Что же касается Asterisk, то на дан-
! С использованием протокола T.38. установить дополнительное соедине- ный момент он абсолютно точно не
ние с другим шлюзом (благо и H323 и поддерживает два первых варианта
Первый способ фактически пред- SIP это позволяют), но уже с исполь- использования T.38 (заметьте, это вов-
ставляет собой обычный факс, под- зованием T.38. Благодаря использова- се не означает, что такая поддержка
ключенный к голосовому шлюзу, на- нию помехоустойчивого кодирования, невозможна в принципе). С третьим
пример с интерфейсом FXS. При этом, а также протокола с гарантией достав- способом ситуация комичнее – до на-
если мы хотим передать факс, мы на- ки – TCP с использованием T.38 мож- стоящего времени ни одного устройс-
бираем нужный нам номер, пытаем- но получить практически идеальное тва, использующего T.38 поверх RTP,
ся установить соединение с аппара- качество передачи факсов. Правда, сообществом разработчиков Asterisk
том на другой стороне и т. д. А теперь и для этой ложки меда имеется своя обнаружено не было, поэтому инфор-
вопрос на засыпку: «Помните ли вы, бочка дегтя – поддержка протокола мации о его практической работоспо-
как работает модем? А как он работа- T.38 в существующих на сегодняш- собности нет. Таким образом, реаль-
ет на очень плохих или «старых» ли- ний день устройствах все еще остав- ная поддержка передачи факсимиль-
ниях?» Факс, обработанный одним из ляет желать лучшего. Дело в том, что ных сообщений в Asterisk на данный
голосовых кодеков с сильным сжати- согласно стандартам, на данный мо- момент возможна только с использо-
ем (GSM, G723, G729), будет работать мент существует 3 (!) различных спо- ванием кодека G711, причем наиболее
еще хуже, вернее, скорее всего он не соба передачи факсов с использова- предпочтительна следующая схема:
будет работать вообще. С кодеками, нием T.38: входящий факс-сервер, работающий
не использующими сильное сжатие с ! Поверх протокола UDP. поверх G711 c использованием zaptel-
потерями (в Asterisk это G711 в вариан- ! Поверх протокола TCP. устройств Asterisk.
тах a-law и u-law), ситуация будет луч- ! Передача в RTP-пакетах. В завершение упомянем и другой
ше. При этом качество передачи фак- взгляд на эту проблему. А нужна ли во-
сов во многом будет зависеть от ре- Первые два способа фактически обще передача факсов в VoIP-сетях?
ального состояния IP-канала (потери, представляют собой специализиро- Если IP-инфраструктура уже сущес-
джиттер, задержка) между абонента- ванные протоколы для передачи фак- твует, то не проще ли в данном слу-
ми (ведь на самом деле мы переда- сов (протоколы IFP/udptl и IFP/TCP со- чае использовать что-то другое, на-
ем «голос», следовательно, исполь- ответственно), в то время как третий пример e-mail?

Поддерживается выгрузка отчетных данных в формате pdf от необходимости лишний раз редактировать файлы кон-
и csv (см. рис. 10). фигурации.
Давайте более подробно остановимся на графическом
Интерфейс панели управления интерфейсе. Как уже говорилось выше, клиентская часть
Третьим разделом интерфейса управления является уже FOP разработана с использованием Macromedia Flash. Это не
знакомая нам Flash Operator Panel. В состав последней вер- могло не оставить отпечатка на характере работы с визуаль-
сии AMP входит несколько устаревшая версия FOP (20 про- ным интерфейсом. Все действия с абонентами производятся
тив 22 на сайте разработчика). Правда, некоторой компен- либо с помощью двойного щелчка мыши, либо методом «drag
сацией за это является интеграция AMP и FOP при установ- and drop». Так, для того чтобы принудительно завершить се-
ке «из коробки». анс пользователя, необходимо нажать на «1» (см. рис. 11),
Так, добавляя нового пользователя в AMP, запись о а для того чтобы соединить двух абонентов, – перетащить
нем автоматически появляется и в FOP, что избавляет нас значок телефона на кнопку вызываемого абонента.

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

AMP мини-FAQ Asterisk начинает запускаться, но, дойдя до загрузки


Страница FOP «зависает» при открытии. В чем может zap-устройств, процесс внезапно завершается.
быть причина? Проверьте, что модули ядра zaptel и wcfxo загружены и
Убедитесь, что серверный perl-скрипт запущен. устройства проинициализировались без ошибок (lsmod,
dmesg).
При работе с веб-интерфейсом выдаются сообщения Или проверьте, что файл /etc/asterisk/zaptel.conf сущест-
об ошибках записи. вует и в нем правильно заданы параметры устройств.
Возможно, установлены неверные права доступа к файлам
конфигурации Asterisk. Для автоматического исправления Не показываются (или показываются неверно) сообще-
запустите скрипт apply_conf.sh из дистрибутива AMP. ния голосовой почты через веб-интерфейс.
Убедитесь, что пользователь веб-сервера имеет доступ
При работе с интерфейсом выдается сообщение об к файлам голосовой почты (/var/spool/asterisk/voicemail).
ошибке соединения с manager.
Неверно сконфигурирован (или отключен) интерфейс уп- Добавил пользователей, но в FOP они не появились.
равления Asterisk. Проверьте содержимое файлов /etc/ В чем может быть дело?
asterisk.manager.conf и /etc/amportal.conf. Необходимо перезапустить op_server.pl

К сожалению, текущая реализация совместной работы FOP ! Возможные проблемы с масштабируемостью (как следс-
и Asterisk не лишена недостатков. Так, в варианте «из короб- твие из предыдущего).
ки» FOP не видит стандартных конференций AMP. Для реше- ! Отсутствие управления параметрами MeetMe через веб-
ния этой проблемы воспользуемся нашими знаниями о струк- интерфейс.
туре конфигурационных файлов. Первым делом в файле op_ ! Отсутствие встроенной системы безопасности.
server.cfg в качестве контекста для конференций укажем ext- ! Достаточно сложная структура номерного плана (осо-
meetme, для параметра barge_roooms выберем одно из стан- бенно для начинающих пользователей).
дартных для AMP значений, например 8200, и опишем соот- ! Шероховатости в интеграции с FOP.
ветствующие кнопки в файле op_buttons_custom.cfg согласно ! Отсутствие русского интерфейса меню.
инструкции, приведенной выше для FOP. После этого переза- ! Проблемы совместимости между номерным планом
пустим perl-сервер, обновим страницу интерфейса клиента и и аппаратным голосовым оборудованием (некоторые
порадуемся, увидев в нем кнопки, соответствующие MeetMe. шлюзы не могут корректно набирать символы «#,*» кото-
Теперь с помощью веб-интерфейса мы можем «собирать» лю- рые очень активно используются в номерном плане).
дей в виртуальных «комнатах» для проведения совместных об-
суждений (drag-and-drop на картинку конференции), а также При всем этом, несмотря на указанные недостатки,
подключаться к уже идущим разговорам. (правда, для неза- Asterisk Management Portal, безусловно, можно считать од-
метной работы последнего, возможно, потребуется более тон- ним из лучших веб-интерфейсов для Asterisk. Проект очень
ко настроить работу модуля MeetMe). С отображением состоя- активно развивается, и вполне возможно, что многие из пе-
ния парковочных мест можно поступить аналогично. речисленных недочетов будут исправлены в следующей
версии. При этом не стоит забывать, что AMP полностью
Заключение открыт и вы сами можете принять непосредственное учас-
В заключение давайте еще раз кратко рассмотрим сильные тие в его дальнейшем развитии. Ну а если разработка веб-
и слабые стороны AMP. Итак, преимущества: приложений вам не близка, а AMP вам просто понравился
! Возможность редактирования параметров Asterisk че- как пользователю, не забудьте сделать donation на офици-
рез веб-интерфейс. альном сайте проекта [7].
! Возможность получения информации о совершенных
звонках. Литература, ссылки:
! Быстрое создание голосовых меню. 1. Платов М. Asterisk и Linux – миссия IP-телефония. Дейс-
! Возможности автосекретаря. твие 2. – Журнал «Системный администратор», №7,
! Использование «транков». 2005 г. – 32-38 c.
! Определение правил маршрутизации . 2. Платов М. Asterisk и Linux – миссия IP-телефония. –
! Загрузка мелодий для «музыки при ожидании». Журнал «Системный администратор», №6, 2005 г. –
! Определение групп вызова. 12-19 c.
3. http://www.voip-info.org/tiki-index.php?page=Asterisk+gui+
Но, как известно, у каждой медали есть и вторая сторо- vmail.cgi.
на. У AMP она выглядит так: 4. http://www.asternic.org.
! Необходимость перезаписи конфигурационных фай- 5. http://asteriskathome.sourceforge.net.
лов. 6. http://asterisk.gnuinter.net.
! Необходимость функционирования всех ключевых ком- 7. http://sourceforge.net/projects/amportal.
понент на одном компьютере (как следствие из преды- 8. Платов М. Что важно знать об IP-телефонии. – Журнал
дущего). «Системный администратор», №5, 2005 г. – 20-25 c.

№8, август 2005 19


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

СОЗДАЁМ СИСТЕМУ УЧЕТА


ИСХОДЯЩИХ ТЕЛЕФОННЫХ ЗВОНКОВ

ДЕНИС СОКОЛОВ
Сегодня мы займемся созданием системы учета исходящих телефонных звонков на примере
УАТС LG GDK-162. От вас требуется: навыки работы в UNIX-подобных операционных системах,
умение программировать на Perl и базовые знания в SQL.

Н
едавно руководство поставило задачу – необходи- Я подключился к последовательному порту УАТС при по-
мо вести учет всех исходящих телефонных звон- мощи терминальной программы и стал анализировать счи-
ков. В офисе установлена УАТС LG GDK-162 емкос- тываемые данные. Оказалось, что LG GDK-162 протоколи-
тью 48 внутренних номеров и 8 внешних линий. Различные рует свою работу в режиме реального времени, а записи об
программы тарификации имеются в избытке. Но ни одна исходящих звонках выглядят следующим образом:
меня не устроила. Большинство из них платные и написа-
1035 144 06 00:11 21/08/2005 16:21 O1234567 **
ны под Windows, из некоммерческих только SMDR 1.0 под-
держивает LG GDK-162. Рассмотрим её содержимое:
Для операционных систем Linux и FreeBSD существует ! первое поле – порядковый номер записи;
очень интересный проект ATSlog: http://www.atslog.dp.ua. ! второе – номер станции, с которой сделан вызов;
Вот описание с сайта программы: «ATSlog предоставляет ! третье – номер внешней линии;
удобный интерфейс с доступом через веб-браузер для про- ! четвертое – длительность звонка (mm:ss);
смотра и анализа звонков различных моделей мини-АТС. ! пятое – дата;
Программа бесплатная, распространяется под лицензией ! шестое – время (hh:mm);
GPL, имеет полностью открытый код. Программа успеш- ! седьмое – вызванный номер с ведущим символом O.
но работает с моделями Panasonic KX-TA308, KX-TA308RU, Седьмое поле может кроме цифр содержать символы
KX-TA616RU, KX-TD816RU, KX-TD1232; Samsung SKP-816». «#» и «*» – это происходит при звонках на голосовые
К сожалению, не нашел в списке поддерживаемых АТС шлюзы операторов IP-телефонии.
LG GDK. Для добавления поддержки нужной модели мож-
но отослать автору образцы текстовых лог-файлов. Но это Таким образом, задача учета исходящих телефонных
требует времени. Я решил попробовать справиться с зада- звонков свелась к написанию программы для считывания
чей своими силами. Это оказалось несложным. Надеюсь, журнала работы УАТС через порт RS-232, обработки и со-
что мой опыт окажется вам полезен. хранения соответствующих записей. Можно приступать к
LG GDK-162, как и большинство офисных АТС, можно реализации.
подключить к компьютеру через порт RS-232. Парамет- Исходные данные: учет будет осуществляться на маши-
ры порта: 9600 бит/с, 8 бит данных, без контроля парите- не Cel 1200/RAM 128 Мб/HDD 20 Гб, операционная систе-
та, 1 стоповый бит. ма – Debian GNU/Linux 3.1r Sarg, СУБД – PostgreSQL v. 7.4.7,
Таблица 1. Распайка кабеля (стандартный нуль-модем) УАТС подключена к последовательному порту /dev/ttyS1.
Создадим пользователя, от которого будет работать
программа и рабочий каталог. Кроме этого, изменим пра-
ва доступа к /dev/ttyS1:

# sudo useradd -d /var/gdklog -s /bin/sh gdk

20
администрирование
# sudo passwd gdk }
# sudo mkdir /var/gdklog print;
# sudo chown gdk:gdk /var/gdklog }
# sudo chown root:gdk /dev/ttyS1
# sudo chmod 640 /dev/ttyS1
Допустим, надо добавить поддержку АТС, пишущую
Создадим пользователя и базу данных в PostgreSQL: протокол в формате:

# createuser -U postgres -A -D gdk 2005-08-21 16-21-00 06 1234567 00:00:11 144


# createdb -U postgres -O gdk pbxbilling
Для этого достаточно будет дописать еще одну конструк-
Создадим таблицу gdklog для хранения статистики. Таб- цию if в функцию parse_log (кроме этого, надо не забыть
лица имеет пять полей: проверить параметры последовательного порта).
! d_time – дата и время;
! station – станция; if (/^(\d{4}\-\d{2}\-\d{2})\s+(\d{2}\-\d{2} ↵
\-\d{2})\s+(\d{2})\s+(\d+)\s+(\d{2}\:\d{2}\:\d{2})\s+
! line – внешняя линия; {
! t_call – продолжительность разговора; }
push (@log, "00 $6 $3 $5 $1 $2 $4");
! c_number – вызванный номер (я выбрал для этого поля
тип numeric, т.е. номер телефона сохраняется, как чис- Постоянно держать открытым соединение с базой дан-
ло, при этом ведущие нули усекаются, например, номер ных – не очень хорошая идея. Поэтому все строки, соответс-
01 сохранится в БД как 1). твующие регулярному выражению «/O\d/g» (журнал исходя-
щих вызовов), сначала заносятся в массив @log. Как только
# vi gdklog.sql в нем накапливается $m_cache строк – вызывается проце-
CREATE TABLE gdklog ( дура push_to_db, которая устанавливает соединение с ба-
"d _ time" timestamp, зой pbxbilling и записывает данные в таблицу gdklog:
"station" int2,
"line" int2,
"t _ call" time, # $d _ time // Дата и время
"c _ number" numeric (30, 0) # $station // Внутренний номер
); # $line // Внешняя линия
REVOKE ALL on "gdklog" from PUBLIC; # $t _ call // Продолжительность вызова
GRANT ALL on "gdklog" to "gdk"; # $date // Дата
# $time // Время
# psql -U gdk -d pbxbilling < gdklog.sql # $c _ number // Вызванный номер
my ($d _ time, $station, $line, $t _ call, $date,
$time, $c _ number, @log);
Писать программу учета я решил на perl. Полный текст
# Параметры соединения с базой данных
вы можете скачать с сайта www.samag.ru, раздел «Исходный my $base = "pbxbilling";
код». Для чтения данных из последовательного порта впол- my $user = "gdk";
my $pass = "";
не подойдут стандартные функции для работы с файлами.
Естественно, порт необходимо предварительно настроить. sub push _ to _ db
{
Для этого я использовал вызов программы sty: # Подготовка соединения
my $dbh=DBI->connect("DBI:Pg:dbname=$base",
"$user", "$pass",
my $ttys = "/dev/ttyS1"; {PrintError => 0, RaiseError => 0}
) or return 2;
# Количество строк журнала, кэшируемых в памяти # Подготовка запроса
my $m _ cache = 50; my $ins = $dbh->prepare(q{
INSERT INTO gdklog (d _ time , station, ↵
system ("/bin/stty -F $ttys 9600 cs8 -parenb -cstopb"); line, t _ call, c _ number)
VALUES (?, ?, ?, ?, ?)
# Читаем данные из последовательного порта });
open (TTYS, "< $ttys") or die "Can’t open $ttys!"; # Перебираем в цикле все сохраненные строки
while (<TTYS>) foreach my $log (@log)
{ {
parse _ log; # Разбираем строку
} (undef, $station, $line, $t _ call, $date, ↵
$time, $c _ number) = ↵
split (/\s+/, $log);
Функция parse_log – единственная в программе, специ- if (length ($t _ call) < 6)
фичная для LG GDK-162. {
$t _ call="00:$t _ call";
}
sub parse _ log $d _ time = "$date $time";
{ # Выполняем INSERT
# Если массив log содержит m _ cache строк, $ins->execute($d _ time, $station, $line, ↵
# то заносим данные в БД $t _ call, $c _ number)
if (@log >= $m _ cache) or return 2;
{ }
push _ to _ db; # Очистим массив
} undef (@log);
# Отбираем строки фиксирующие исходящие звонки $dbh->disconnect();
if (/O\d+/) return 0;
{ }
# Удаляем символы *, #, O
s/[\*,O,\#]+//g; Кроме этого, мне нужно было, чтобы программа могла
# Сохраняем полученную строку в массив log
push (@log, $ _ ); работать в режиме демона:

№8, август 2005 21


администрирование
# В режиме демона в этот файл перенаправляем все # vi /etc/init.d/gdklogd
# сообщения об ошибках
my $err _ Þle = "/var/gdklog/gdklogd.err"; #!/bin/sh
# PID-файл
my $pid _ Þle = "/var/gdklog/gdklogd.pid"; DAEMON=/usr/local/sbin/gdklogd
DAEMONFLAGS="-D"
sub begin _ daemon KILL=/bin/kill
{ PID=/var/gdklog/gdklogd.pid
# Делаем fork CAT=/bin/cat
my $pid = fork; SU=/bin/su
exit if $pid;
die "Couldn’t fork: $!" unless deÞned($pid); start ()
# Сохраняем PID в файл {
open (F _ PID, ">$pid _ Þle") or die "Can’t open ↵ echo -n $"Starting $DAEMON: "
$pid _ Þle: $!"; # Запуск с правами непривилегированного пользователя
print F _ PID "$$\n"; $SU -c "$DAEMON $DAEMONFLAGS" gdk 2>/dev/null 1>&2
close F _ PID; }
# Перенаправляем вывод STDERR в файл
open (*STDERR, ">> $err _ Þle") or die "Can’t ↵ stop ()
reopen *STDERR to $err _ Þle: $!"; {
# Перенаправляем STDIN и STDOUT в /dev/null echo -n $"Stopping $DAEMON: "
for my $handle (*STDIN, *STDOUT) $KILL `$CAT $PID` 2>/dev/null 1>&2
{ }
open ($handle, "> /dev/null") or die ↵
"Can’t reopen $handle to /dev/null: $!"; case "$1" in
} start)
# Установка sid процесса start
POSIX::setsid() ;;
or die "Can’t start a new session: $!"; stop)
} stop
;;
restart)
Чтобы обеспечить целостность данных, я установил об- stop
работчики сигналов INT и TERM. Получая один из них, про- start
;;
грамма будет пытаться немедленно записать данные в базу, *)
если это окончится неудачей (например, сервер БД отклю- echo $"Usage: $0 {start|stop|restart}"
exit 1
чен), то выполнится процедура dump_to_file, которая прос- esac
то запишет содержимое @log в текстовый файл. После это-
# sudo chown root:root /etc/init.d/gdklogd
го работа программы будет завершена. Второй обработчик # sudo chmod 700 /etc/init.d/gdklogd
добавляет возможность записи данных в базу по сигналу
HUP без выхода из программы. Запустим:

$SIG{INT} = $SIG{TERM} = sub { dump _ to _ Þle if ↵ # sudo /etc/init.d/gdklogd start


push _ to _ db; exit };
$SIG{HUP} = sub { dump _ to _ Þle if push _ to _ db };
После запуска сценария с параметром -D он переходит
Меняем владельца и права доступа: в режим демона, настраивает последовательный порт и на-
чинает считывать из него данные. При запуске без пара-
# sudo chown root:gdk /usr/local/sbin/gdklogd метра -D сценарий не отсоединяется от терминала, а запи-
# sudo chmod 750 /usr/local/sbin/gdklogd
си об исходящих звонках дублируются на экран.
Напишем стартовый сценарий: Если все сделано правильно, то через некоторое время
таблица gdklog начнет заполняться записями.

# sudo kill –HUP `cat /var/gdklog/gdklogd.pid`


# psql -c 'SELECT * FROM gdklog;' -U gdk pbxbilling

d_time | station | line | t_call | c_number


---------------------+---------+------+----------+----------
2005-08-21 16:21:00 | 144 | 6 | 00:00:11 | 1234567
(1 запись)

Вот и все. При минимуме усилий мы получили вполне


работоспособную и переносимую систему учета исходящих
звонков УАТС LG GDK-162. Работа скрипта проверялась на
Debian GNU/Linux 3.1r Sarg и FreeBSD 5.2.1 (надо изменить
только имя файла последовательного порта $ttys). Модуль
DBI позволяет использовать любую поддерживаемую им
СУБД с минимальной правкой кода, а также доступ к ба-
зе данных по сети. Для получения отчетов к нашим услу-
гам вся мощь SQL. Несложно добавить поддержку других
моделей УАТС. А при наличии свободного времени можно
написать веб-интерфейс.
Рисунок 1. Схема учета исходящих телефонных звонков Успехов!

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

НАСТРАИВАЕМ DSPAM –
ВАШ ЛИЧНЫЙ СПАМ-ФИЛЬТР

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


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

СЕРГЕЙ СУПРУНОВ

В
одной из предыдущих статей [1] рассматривалась янии защитить от писем, идущих с новых, еще не «засве-
система защиты от нежелательной почты, – spamd, ченных», адресов. Кроме того, подобные фильтры, будучи
использующая блокировку входящих соединений на запущенными на провайдерских серверах, могут стать ис-
основе «черных» списков. Такие способы эффективны для точниками конфликтов с пользователями, адресат которых
снижения входящего почтового трафика, однако не в состо- случайно попал в тот или иной список.

24
администрирование
Сегодняшняя статья посвящена второму эшелону спам- В алгоритме, предложенном Полом Грэмом (Paul
обороны, который будем строить на базе DSPAM (разра- Graham), для расчета применяется приведенная выше ме-
ботчик Jonathan Zdziarski, www.nuclearelephant.com). Дан- тодика с использованием следующих правил:
ная обучаемая статистическая система обрабатывает со- ! Для анализа сообщений используются не все слова, а
общения, благополучно прошедшие через MTA и направ- 15 наиболее «интересных», для которых p(w) наиболее
ляющиеся в ящик пользователя. Основным ее достоинс- сильно отклоняется от нейтрального значения 0,5.
твом является возможность персональной настройки для ! Если ранее слово встречалось менее чем в пяти пись-
каждого пользователя. мах, оно игнорируется.
! Новое слово, не встречавшееся ранее, получает стар-
Как происходит классификация писем товую «спамность» 0,4 (своего рода презумпция неви-
В основе работы системы DSPAM лежит несколько наибо- новности).
лее популярных алгоритмов статистического анализа, кото-
рые, в свою очередь, опираются на теорему Байеса (Thomas Алгоритм Бартона (Brian Burton) работает аналогич-
Bayes). Формула Байеса позволяет рассчитать вероятность но, но использует для анализа не 15, а 27 наиболее ярких
наступления некоторого события в зависимости от того, ка- слов, а также допускает «удвоенное» использование сло-
кова была вероятность данного события в прошлом. Приме- ва, если оно встречается в сообщении несколько раз. Это
нительно к спаму, упрощенно принцип работы байесового несколько повышает эффективность при ограниченных
классификатора можно описать такой формулой: данных. Кроме того, поддерживаются цепочки «токенов»,
когда два стоящих рядом слова рассматриваются вместе.
P= S / (S + G) (1) Также некоторые отличия от подхода Грэма имеются в на-
боре символов, которые считаются составной частью сло-
где: ва (такие, как $, ! и т. д.).
! P – вероятность того, что сообщение окажется спа- Следующий популярный алгоритм, разработанный Гари
мом, Робинсоном (Gary Robinson), модернизирует формулу Грэ-
! S – суммарный коэффициент «спамности» сообще- ма таким образом, чтобы решить проблему недостаточных
ния, исторических данных:
! G – суммарный коэффициент «неспамности» сообще-
ния. f(w) = (0,5 + n(w) * p(w)) / (1 + n(w)) (3)

Sи G рассчитываются по следующим формулам: где :


! p(w) – вероятность для слова, рассчитанная на основе
S = p(w1)*p(w2)*…*p(wn) (2) исторических данных;
G = (1 – p(w1))*(1 – p(w2))*…*(1 – p(wn))
! n(w) – количество ранее обработанных сообщений со
Здесь p(w1) и другие – коэффициенты «спамности» отде- словом w.
льных слов, входящих в анализируемое сообщение, получен-
ные на основе ранее классифицированных писем. Так, если Таким образом, если анализируемое слово ранее не
в прошлом 9 писем со словом «английский» было спамом и встречалось, оно автоматически получит коэффициент 0,5,
одно – не спамом, то p(‘английский’) = 9 / (9 + 1) = 0.9. а по мере накопления статистики это значение будет выхо-
В качестве примера проанализируем такое короткое дить на свой естественный уровень.
сообщение: В дальнейшем в формулах (2) вместо величин p(w) ис-
пользуется f(w).
Привет! Купи меня! Для анализа по алгоритму Робинсона используется вы-
борка из 25 слов.
Пусть ранее указанные слова встречались в следую- На базе алгоритма Робинсона был разработан улучшен-
щих письмах: ный алгоритм Фишера-Робинсона, известный также как Chi-
Square (переводить на русский язык не рискну). Помимо рас-
чета «спамности» сообщения вычисляется также вероят-
ность его «неспамности» по формуле Фишера, и в дальней-
шем рассматривается интегральная вероятность.
В фильтре DSPAM реализована поддержка всех четырех
описанных здесь алгоритмов. Причем анализу подвергается
p('Привет') = 35 / (35 + 64) = 0,35 не только тело сообщения, но и заголовок. Разработчик не
p('Купи') = 187 / (187 + 19) = 0,91
p('меня') = 9 / (9 + 11) = 0,45 рекомендует совмещать фильтры Грэма и Бартона с филь-
S= 0,35 * 0,91 * 0,45 = 0,14 трами Робинсона во избежание ложных срабатываний.
G= (1 – 0,35) * (1 – 0,91) * (1 – 0,45) = 0,03
P= 0,14 / (0,14 + 0,03) = 0,82
Способы интеграции DSPAM
Таким образом, приведенный выше пример будет с ве- с почтовой системой
роятностью 82% нежелательным сообщением, в основном Система DSPAM поддерживает два способа взаимодейс-
за счет высокой спамности слова «Купи». твия с почтовым сервером. В первом случае он может быть

№8, август 2005 25


администрирование
настроен как локальный агент доставки (LDA – local delivery это существенно упростит нам жизнь при настройке CGI-кли-
agent). При этом сообщения анализируются по пути от MTA ента. Сам же демон dspam будет работать с правами root, что
к почтовому ящику. После обработки фильтром почта от- определяется второй строкой приведенного выше фрагмента
дается на обработку реальному LDA, который и заверша- (см. следующий раздел про права доступа). Если вам удоб-
ет доставку. нее работать с ключами команды make, то же самое можно
Второй способ – работа DSPAM в сотрудничестве с сделать, задав ключ DSPAM_HOME_OWNER=dspam.
POP3-proxy. При этом спам отсеивается в то время, когда После ввода команды make вам будет предложено диа-
пользователь выкачивает корреспонденцию из своего поч- логовое окно (рис. 1), в котором следует отметить необходи-
тового ящика по протоколу POP3. мые опции. Обратите внимание на то, что должен быть отме-
Подробнее настройка для работы в том или ином режи- чен только один драйвер СУБД. Также отметьте опцию «Install
ме будет рассмотрена позже. CGI (pulls in apache)», если планируете использовать CGI-мо-
дуль. Еще следует указать используемый вами MTA.
Устанавливаем DSPAM Некоторые другие полезные опции приведены ниже:
из коллекции портов ! USER_HOMEDIR: использовать для хранения данных
Для конкретизации в данной статье будет рассматривать- пользователя его домашний каталог вместо директо-
ся работа DSPAM на системе со следующим версиями про- рии, определенной переменной DSPAM_HOME.
граммного обеспечения: ! TRUSTED_USERS: отключить (!) использование дове-
! Операционная система: FreeBSD 5.4. ренных пользователей. Если данная опция будет отмече-
! Веб-сервер: Apache 1.3.33 с включенной поддержкой на, все пользователи смогут управлять фильтром dspam
suexec. (если, конечно, будут обладать достаточными правами
! Система управления базами данных: PostgreSQL 8.0.2. для запуска соответствующих исполняемых файлов).
! LARGE_SCALE: опция полезна в системах с большим
Наиболее удобный способ инсталляции ПО в системе числом абонентов. При ее активации домашние катало-
FreeBSD (естественно, на мой взгляд – навязываться нико- ги пользователей будут находиться не непосредствен-
му не буду) – использование коллекции портов. но в папке data каталога /var/db/dspam, а во вложенных
Если планируется использовать CGI-сценарии для уп- подкаталогах по начальным буквам имени пользовате-
равления фильтром, я рекомендую создать отдельного ля. Например, каталог с данными пользователя gorod
пользователя dspam и одноименную группу. В дальнейшем будет находиться по следующему пути: /var/db/dspam/
мы настроим виртуальный хост, который будет работать от data/g/o/gorod. Данная опция и USER_HOMEDIR взаи-
имени добавленного пользователя. После этого выполня- моисключаемы.
ем обычные процедуры: ! VIRT_USERS: этот ключ используется, если ваш почто-
вый сервер работает с виртуальными пользователями.
# cd /usr/ports/mail/dspam При этом дополнительно будет создана таблица иден-
# vi MakeÞle
# make тификаторов пользователей (по умолчанию dspam в
# make install процессе работы руководствуется данными реальных
пользователей из /etc/passwd).
Конечно, вместо редактирования файла Makefile можно
использовать ключи в командах make и make install, но их После сборки (необходимые зависимости, такие как
может оказаться слишком много, да и мне удобнее, чтобы библиотека GD, будут удовлетворены автоматически) пе-
информация о параметрах оставалась не только в истории реходим к конфигурации.
командной оболочки. По большому счету, этот этап мож-
но вообще опустить – настройки, используемые по умол- Несколько слов о правах доступа
чанию, подходят в большинстве случаев, тонкую же под- Для нормальной работы DSPAM большое значение играют
стройку можно будет выполнить в дальнейшем путем ре- правильно установленные права доступа, особенно если
дактирования конфигурационного файла. используется CGI-модуль. Как было показано выше, в про-
Я выполнил только одну правку (красным показана ис-
ключенная строка, синим – добавленная):

DSPAM _ MODE?= 4510


DSPAM _ OWNER?= root
DSPAM _ GROUP?= mail

DSPAM _ HOME?= ${ _ VAR _ DIR}/db/dspam


#DSPAM _ HOME _ OWNER?= ${DSPAM _ OWNER}
DSPAM _ HOME _ OWNER?= dspam
DSPAM _ HOME _ GROUP?= ${DSPAM _ GROUP}
DSPAM _ HOME _ MODE?=

Этой настройкой владельцем домашнего каталога про-


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

26
администрирование
цессе сборки порта можно задать пользователя, отлично- #TrustedDeliveryAgent "/usr/bin/procmail" # Cygwin
#
го от root. С одной стороны, это способствует повышению # Other popular conÞgurations:
безопасности, но в то же время порождает массу дополни- #TrustedDeliveryAgent "/usr/cyrus/bin/deliver" # Cyrus
#TrustedDeliveryAgent "/bin/maildrop" # Maildrop
тельных сложностей. #TrustedDeliveryAgent "/usr/local/sbin/exim ↵
Во-первых, при работе в режиме LDA dspam должен быть -oMr spam-scanned" # Exim
способен вызывать агент доставки и передавать ему необ-
ходимые для дальнейшей работы права. А чтобы положить Далее, в строках Trust перечислены пользователи, ко-
почту в ящик пользователя при стандартных настройках, торым будет позволено управлять работой dspam. Допи-
эти права должны соответствовать пользователю root. шите туда пользователя, от имени которого работает поч-
Во-вторых, dspam должен иметь достаточно прав, что- товый сервер, и пользователя dspam (если вы его добав-
бы создать pid-файл при запуске в режиме демона, а так- ляли), а заодно удалите лишних:
же быть способным создать сокет на привилегированном
порту 24 (LMTP), что опять-таки требует прав суперполь- Trust root
#Trust mail
зователя. #Trust mailnull
Так, у меня попытка запустить dspam в режиме демона Trust smmsp # на моей системе от имени этого
# пользователя работает sendmail
после сборки с пользователем dspam, указанным как вла- Trust daemon
делец, завершилась такими ошибками: Trust dspam

# /usr/local/etc/rc.d/dspam.sh start Режим обучения (TrainingMode), используемые алго-


Starting dspam. ритмы и т. д. можно оставить по умолчанию. Если же вам
486: [7/26/2005 9:10:17] Daemon process starting захочется поэкспериментировать или работа с текущими
486: [7/26/2005 9:10:18] Unable to open file for writing:
/var/run/dspam.pid: Permission denied
настройками будет показывать неудовлетворительные ре-
486: [7/26/2005 9:10:18] Could not bind to :24 (Permission denied) зультаты, в файле /usr/local/share/doc/dspam/README мож-
486: [7/26/2005 9:10:18] daemon_listen() failed но найти достаточно подробное описание доступных ре-
486: [7/26/2005 9:10:18] Daemon process exiting
жимов (см. также раздел «Обучаем фильтр» далее в этой
Учитывая вышеизложенное, я решил оставить владель- статье).
цем dspam пользователя root, как это определено по умол- Среди параметров Feature отметим два следующих:
чанию. Хотя при наличии огромного желания и крепких не-
рвов можно добиться работы и от имени непривилегиро- Featurechained
Featurewhitelist
ванного пользователя.
Первая включает поддержку «цепочек», когда учитыва-
Основные настройки в dspam.conf ются не только отдельные слова, но и группы слов. С одной
Перед первым запуском необходимо переименовать файл стороны, эта «фича» заметно повышает точность класси-
/usr/local/etc/dspam.conf.sample в dspam.conf и произвести фикации писем, но с другой – способствует значительно-
в нем нужные изменения. Прежде всего введите правиль- му росту базы данных.
ные настройки для взаимодействия с СУБД. DSPAM уме- Второй строкой включается режим автоматического за-
ет использовать для хранения рабочей информации такие несения отправителя в «белый» список – если число писем
СУБД, как MySQL, PostgreSQL, SQLite, Oracle. Для слабо с одного и того же адреса превысит некоторое значение и
нагруженных систем можно использовать DB3 или DB4, но ни одно из них не будет признано спамом, их отправитель
разработчики это не рекомендуют. Например, мои значения заносится в «белый» список, и в дальнейшем сообщения
для PostgreSQL выглядят следующим образом: от него не будут анализироваться.
Группы строк Preference задают параметры по умол-
PgSQLServer 127.0.0.1 чанию:
PgSQLPort 5432
PgSQLUser dspam
PgSQLPass wj30sh3hs32 # 'quarantine' or 'tag'
PgSQLDb dspam Preference "spamAction=quarantine"
# 'message' or 'headers'
Для других СУБД будут свои настройки, раскоммен- Preference "signatureLocation=message"
Preference "showFactors=off"
тируйте соответствующие шаблоны и заполните нужные Preference "spamSubject=SPAM"
строки. Дополнительно потребуется выполнить ряд дейс-
твий для создания необходимых таблиц, смотрите следу- Группа AllowOverride позволяет указать, какие из пара-
ющий раздел. метров могут быть переопределены личными настройками
Потребуется также указать правильный LDA (если вы пользователя (для примера показаны лишь две строки):
планируете использовать подключение dspam в качестве
агента доставки). Просто снимите комментарий с той стро- AllowOverridetrainingMode
AllowOverride whitelistThreshold
ки, которая подходит для вашей системы:
Остальные параметры пока оставим без внимания. Те
# Most operating system defaults: из них, которые важны для выбора желаемого режима ра-
#TrustedDeliveryAgent "/usr/bin/procmail" # Linux
#TrustedDeliveryAgent "/usr/bin/mail" # Solaris боты, будут рассмотрены ниже, в соответствующих разде-
TrustedDeliveryAgent "/usr/libexec/mail.local" # FreeBSD лах. С остальными, вроде «SystemLog», думаю, вы без тру-

№8, август 2005 27


администрирование
да разберетесь самостоятельно – файл достаточно хоро- # IPv4 local connections:
host all all 127.0.0.1/32 trust
шо прокомментирован.
Все. База данных к работе готова.
Настраиваем СУБД для работы с DSPAM
Примеры настройки взаимодействия с конкретной СУБД Настраиваем DSPAM для работы
можно найти в соответствующих README-файлах. В дан- как LDA
ной статье рассмотрим работу с PostgreSQL. В этом режиме почтовый сервер (MTA) конфигурируется та-
В /usr/local/share/examples/dspam/pgsql располагаются ким образом, чтобы в качестве локального агента достав-
sql-файлы, содержащие необходимые для работы коман- ки выступал dspam. Способы «прикручивания» DSPAM к
ды. Сейчас нас интересует файл pgsql_objects.sql, кото- конкретному MTA подробно описываются в соответствую-
рый поможет создать все нужные таблицы, индексы и т. д. щих документах:
Но базу данных и пользователя придется создать самосто- ! /usr/local/share/doc/dspam/courier.txt
ятельно (хотя вы можете использовать и уже существую- ! /usr/local/share/doc/dspam/exim.txt
щие). Последовательность нужных шагов представлена на ! /usr/local/share/doc/dspam/postfix.txt
следующем листинге: ! /usr/local/share/doc/dspam/qmail.txt
! /usr/local/share/doc/dspam/sendmail.txt
# cd /usr/local/share/examples/dspam/pgsql
# psql -U pgsql template1
Например, для sendmail следует указать в mc-файле
Добро пожаловать в psql 8.0.2 - Интерактивный Терминал PostgreSQL. следующие строки:
Наберите: \copyright для условий распространения
\h для подсказки по SQL командам deÞne('LOCAL _ MAILER _ PATH', `/usr/local/bin/dspam')dnl
\? для подсказки по командам psql deÞne('LOCAL _ MAILER _ ARGS', ↵
\g или наберите ";" для завершения запроса и его выполнения `dspam "--deliver=innocent,spam" --user $u -d %u')dnl
\q для выхода

template1=# create user dspam nocreatedb nocreateuser password 'wj30sh3hs32';


CREATE USER
Они должны быть добавлены до строки «MAILER(local)».
template1=# create database dspam owner dspam; Здесь объявляется путь до агента доставки и его парамет-
CREATE DATABASE
template1=# \c dspam dspam ры запуска. Параметр --deliver указывает, что должны до-
Вы подсоединились к базе данных "dspam" как пользователь "dspam". ставляться как «хорошие» письма (innocent), так и спам
dspam=> \! ls
pgsql_objects.sql purge.sql virtual_users.sql (spam). Чтобы на реальный LDA письма, признанные спа-
dspam=> \i pgsql_objects.sql
psql:pgsql_objects.sql:10: NOTICE: CREATE TABLE / UNIQUE
мом, не передавались, удалите соответствующее упоми-
создаст подразумеваемый индекс "dspam_token_data_token_key" нание из строки параметров.
для таблицы "dspam_token_data"
CREATE TABLE После компиляции нового конфигурационного файла и
CREATE INDEX
CREATE INDEX
перезапуска почтового сервера все входящие сообщения
CREATE INDEX будут поступать на вход dspam. Далее в зависимости от на-
строек и результата анализа полученные сообщения будут
CREATE INDEX
psql:pgsql_objects.sql:24: NOTICE: CREATE TABLE / UNIQUE
создаст подразумеваемый индекс "dspam_signature_data_signature_key" либо передаваться на реальный LDA для доставки в ящик
для таблицы "dspam_signature_data"
CREATE TABLE пользователя, либо помещаться в карантин.
psql:pgsql_objects.sql:36: NOTICE: CREATE TABLE / PRIMARY KEY
создаст подразумеваемый индекс "dspam_stats_pkey"
для таблицы "dspam_stats" Настраиваем DSPAM в режиме
CREATE TABLE
psql:pgsql_objects.sql:44: NOTICE: CREATE TABLE / UNIQUE POP3-proxy
создаст подразумеваемый индекс "dspam_neural_data_node_key"
для таблицы "dspam_neural_data"
Одно из основных преимуществ работы в таком режиме за-
CREATE TABLE ключается в независимости от конкретного MTA. Более то-
CREATE INDEX
psql:pgsql_objects.sql:55: NOTICE: CREATE TABLE / UNIQUE го, почтовый сервер может вообще не располагаться на ва-
создаст подразумеваемый индекс "dspam_neural_decisions_signature_key" шей машине. Например, ящики пользователей могут быть
для таблицы "dspam_neural_decisions"
CREATE TABLE размещены на сервере провайдера, и если настроить полу-
psql:pgsql_objects.sql:62: NOTICE: CREATE TABLE / UNIQUE
создаст подразумеваемый индекс "dspam_preferences_preference_key"
чение почты через POP3-proxy, то защиту от спама вы мо-
для таблицы "dspam_preferences" жете реализовать на своем шлюзе без каких-либо измене-
CREATE TABLE
dspam=> ний со стороны провайдера. Скачиваем последний архив с
pop3filter.sourceforge.net (в портах он отсутствует):
Здесь мы создали пользователя dspam и одноименную
базу данных (должны соответствовать настройкам в dspam. # tar –xvzf pop3Þlter-0.5.5.tar.gz
# cd pop3Þlter-0.5.5
conf). Затем выполнили команды из внешнего файла. Те- #./conÞgure
перь осталось убедиться, что в файле pg_hga.conf содер- # make
жатся разрешающие строки для локальных подключений
к этой базе от имени соответствующего пользователя, на- Вот здесь поджидала еще одна неприятность (вторая
пример такие: после отсутствия приложения в коллекции портов) – сбор-
ка окончилась ошибкой:
# TYPE DATABASE USER CIDR-ADDRESS METHOD
if gcc -DHAVE_CONFIG_H -I. -I. -I.. -pedantic -Wall
# "local" is for Unix domain socket connections only -pedantic-errors -MT newopt.o -MD -MP -MF ".deps/newopt.Tpo"
local all all trust -c -o newopt.o `test -f 'newopt.c' || echo './'`newopt.c;

28
администрирование
then mv -f ".deps/newopt.Tpo" ".deps/newopt.Po"; # make install
else rm -f ".deps/newopt.Tpo"; exit 1; fi
newopt.c: In function `process':
newopt.c:464: error: ISO C forbids conversion of object pointer Запуск pop3filter можно выполнить такой командой:
to function pointer type
newopt.c: At top level:
newopt.c:146: warning: 'clone_argv' defined but not used # pop3Þlter --fork 127.0.0.1 110 7110 ↵
*** Error code 1 "dspam --user \$pop3 _ USERNAME ↵
--stdout --deliver=innocement,spam "
Поверхностный анализ исходного кода показал, что про-
блемные строки (464 в файле newopt.c и еще несколько в В данном случае входящие соединения будут ожидать-
main.c) используются только для обеспечения работы клю- ся на порту 7110 и передаваться на 110-й порт localhost. По-
чей --help и --version. Поскольку данными функциями впол- лученные от реального pop3-сервера сообщения будут от-
не можно пренебречь, было принято решение о небольшом даваться на обработку фильтру dspam, после чего переда-
хирургическом вмешательстве в указанные два файла (по- ваться пользователю в зависимости от настроек и резуль-
казаны различия в исходном и полученном файлах): тата классификации. Правда, должен признаться, что до-
биться устойчивой работы в этом режиме мне не удалось.
serg$ diff src/main.c.old src/main.c Довольно часто после обработки одного – двух сообщений
117,126c117,123
< {/*00*/ {"help", OPT _ NORMAL, 0, ↵ что-то где-то подвисало, и почтовый клиент при попытке ска-
OPT _ T _ FUNCT, (void *) help }, чать очередную порцию почты «отваливался» по истечении
< /*01*/ {"h", OPT _ NORMAL, 1, ↵
OPT _ T _ FUNCT, (void *) help }, тайм-аута. Возможно, кому-то из вас повезет больше.
< /*02*/ {"version", OPT _ NORMAL, 0, ↵
OPT _ T _ FUNCT, (void *) version},
< /*03*/ {"V", OPT _ NORMAL, 1, ↵ Запуск DSPAM в режиме демона
OPT _ T _ FUNCT, (void *) version}, По умолчанию dspam запускается как автономная програм-
< /*04*/ {"fork", OPT _ NORMAL, 0, ↵
OPT _ T _ FLAG, NULL }, ма. Однако при интенсивной нагрузке в этом случае тратит-
< /*05*/ {"f", OPT _ NORMAL, 1, ↵ ся много ресурсов на такие операции, как установка соеди-
OPT _ T _ FLAG, NULL },
< /*06*/ {"e", OPT _ NORMAL, 1, ↵ нения с СУБД. Более эффективным выглядит запуск в ре-
OPT _ T _ GENER, NULL }, жиме демона, когда серверный процесс dspam находится
< /*07*/ {"listen", OPT _ NORMAL, 0, ↵
OPT _ T _ GENER, NULL }, в памяти, поддерживая несколько постоянных соединений
< /*08*/ {"user", OPT _ NORMAL, 0, ↵ с СУБД. Для обработки же пользовательских соединений
OPT _ T _ GENER, NULL },
< /*09*/ {"group", OPT _ NORMAL, 0, ↵ dspam запускается как клиент, общающийся с сервером ли-
OPT _ T _ GENER, NULL }, бо по протоколу LMTP, либо через UNIX-socket.
---
> { Для работы в режиме демона нужно настроить парамет-
> /*04-0*/ {"fork", OPT _ NORMAL, 0, ↵ ры сервера и клиента в конфигурационном файле. Возмож-
OPT _ T _ FLAG, NULL },
> /*05-1*/ {"f", OPT _ NORMAL, 1, ↵ ны два режима работы – через локальные сокеты UNIX либо
OPT _ T _ FLAG, NULL }, по протоколу LMTP (используется 24-й TCP-порт). Для пер-
> /*06-2*/ {"e", OPT _ NORMAL, 1, ↵
OPT _ T _ GENER, NULL }, вого случая внесите в конфигурацию следующие строки:
> /*07-3*/ {"listen", OPT _ NORMAL, 0, ↵
OPT _ T _ GENER, NULL }, ServerDomainSocketPath "/var/run/dspam.sock"
> /*08-4*/ {"user", OPT _ NORMAL, 0, ↵ ClientHost "/var/run/dspam.sock"
OPT _ T _ GENER, NULL },
> /*09-5*/ {"group", OPT _ NORMAL, 0, ↵
OPT _ T _ GENER, NULL }, Естественно, пути к сокету для клиента и сервера должны
128,132c125,129 совпадать. Если вы собираетесь использовать LMTP (напри-
< }; lopt[4].data = lopt[5].data = ↵
(void *) &(opt->fork); мер, когда клиент и сервер находятся на разных машинах),
< lopt[6].data = (void *) &(opt->fstderr); то раскомментируйте и настройте следующие параметры:
< lopt[7].data = &(opt->listen _ addr);
< lopt[8].data = &(opt->username);
< lopt[9].data = &(opt->groupname); #ServerPort 24
--- #ServerPass.Relay1 "secret"
> }; lopt[0].data = lopt[1].data = ↵ #ServerPass.Relay2 "password"
(void *) &(opt->fork); #ClientHost 127.0.0.1
> lopt[2].data = (void *) &(opt->fstderr); #ClientPort 24
> lopt[3].data = &(opt->listen _ addr); #ClientIdent "secret@Relay1"
> lopt[4].data = &(opt->username);
> lopt[5].data = &(opt->groupname);
Строки Server* должны присутствовать в конфигураци-
serg$ diff lib/newopt.c.old lib/newopt.c онном файле сервера, Client* – соответственно клиента.
463,465c463,465
< case OPT _ T _ FUNCT: Заметьте, что если хотя бы одна строка ServerPass.RelayX
< (*(callbackT)table->data); будет раскомментирована, то dspam запустится для рабо-
< break;
--- ты по 24-му порту, даже если присутствуют строки, зада-
> /* case OPT _ T _ FUNCT: ющие UNIX-сокеты.
> (*table->data);
Далее установите в файле /etc/rc.conf переменную dspam_
То есть были удалены или закомментированы строки, в enable в «YES», что обеспечит автоматический запуск де-
которых упоминается OPT_T_FUNC, и соответственно ис- мона с помощью сценария /usr/local/etc/rc.d/dspam.sh. Этот
правлены индексы массива, используемые в дальнейшем. скрипт добавляется автоматически при установке из пор-
После этой «операции» сборка прошла успешно, а вслед тов, вам останется лишь проконтролировать его наличие
за ней и установка: и «исполняемость».

№8, август 2005 29


администрирование
Теперь, чтобы сервером электронной почты или pop3- Домашним каталогом виртуального хоста оставляем /usr/
фильтром программа dspam запускалась как клиент, ука- local/www/vhosts/dspam, при этом suexec должен быть собран
жите в соответствующих строках вызова дополнитель- таким образом, чтобы директория dspam находилась внут-
ный ключ --client либо используйте вместо dspam бинар- ри директории, определенной как suexec_docroot (задается
ник dspamc, специально предназначенный для работы в при компиляции Apache с помощью переменной APACHE_
режиме клиента. SUEXEC_DOCROOT либо правкой Makefile).
Если теперь выполнить следующую команду, то можно Далее, для работы suexec требуется, чтобы права на ка-
наблюдать основной процесс dspam и несколько процес- талог dspam и размещенные в нем скрипты принадлежали
сов для связи с базой данных (рекомендуется использо- пользователю и группе dspam, от имени которого будет ра-
вать MySQL или PostgreSQL): ботать наш виртуальный хост. Именно несоответствие прав
является наиболее частой причиной ошибок при работе с
# ps -ax |grep dspam suexec (которые можно будет найти в файле /var/log/httpd-
4843 ?? I 0:00,03 postmaster: dspam dspam 127.0.0.1(63076) idle (postgr suexec.log, если вы не меняли соответствующий параметр
4844 ?? I 0:00,12 postmaster: dspam dspam 127.0.0.1(58646) idle (postgr
4845 ?? I 0:00,03 postmaster: dspam dspam 127.0.0.1(54366) idle (postgr при компиляции).
4842 p0 S 0:00,25 /usr/local/bin/dspam -daemon
Помимо прав на CGI-сценарии, должны быть доступны
В результате, благодаря постоянным подключениям к и файлы, размещаемые в домашнем каталоге dspam (по
СУБД, нагрузка на систему несколько снижается. умолчанию /var/db/dspam). Именно для этой цели пользова-
тель dspam и был объявлен владельцем домашнего ката-
Подключаем CGI-модуль лога. Если что-то не будет работать через веб-интерфейс,
Этот модуль позволяет пользователям работать со свои- в первую очередь следует проверять именно наличие необ-
ми настройками, получать статистические данные о рабо- ходимых прав на файлах «проблемного» пользователя.
те фильтра, а также просматривать сообщения, помещен- Обратите внимание, что CGI-модуль не может быть
ные в карантин, и при необходимости инициировать пере- использован, если данные пользователей хранятся в их
обучение. В процессе инсталляции необходимые для рабо- домашних каталогах (был установлен параметр USER_
ты модуля файлы будут помещены в /usr/local/www/vhosts/ HOMEDIR). Конечно, запустив виртуальный хост с права-
dspam. Поскольку пользователь, от имени которого будут ми суперпользователя, можно разом решить все возмож-
исполняться данные cgi-скрипты, должен иметь доступ и ные проблемы доступа, но вряд ли в здравом уме можно
к иерархии файлов в /var/db/dspam, нужно либо дать со- пойти на подобный шаг.
ответствующие разрешения на домашний каталог dspam, Использование веб-интерфейса позволяет существенно
либо запускать веб-сервер от имени пользователя, имею- упростить настройку параметров работы фильтра. Кроме
щего необходимые привилегии. того, поскольку каждый пользователь может самостоятель-
Наиболее удобным мне показалось запустить для орга- но осуществлять большинство контрольно-управляющих
низации веб-интерфейса отдельный виртуальный хост от действий, то в итоге нагрузка на администратора сущест-
имени пользователя dspam. Для этого Apache должен быть венно снижается (правда, повышается нагрузка на сервер,
собран с поддержкой suexec. Проверить выполнение дан- особенно при интенсивном использовании графиков).
ного требования можно таким образом: Для доступа к веб-интерфейсу пользователь должен
пройти аутентификацию (используется Basic-аутентифи-
# /usr/local/sbin/httpd -l кация, по умолчанию проверка выполняется в файле паро-
... лей /usr/local/etc/apache/passwd, но вы можете перенастро-
mod_setenvif.c ить это в файле .htaccess). В зависимости от введенного
mod_ssl.c
suexec: enabled; valid wrapper /usr/local/sbin/suexec
имени (используется переменная $REMOTE_USER) стано-
вится доступным интерфейс пользователя или админист-
В дальнейшем конфигурируем Apache следующим об- ратора. Роль администратора может выполнять любой ау-
разом (естественно, далеко не единственным): тентифицированный пользователь, имя которого присутс-
твует в файле admins (здесь и далее речь идет о файлах,
NameVirtualHost 10.10.10.80 расположенных в каталоге виртуального хоста, в моем слу-
<VirtualHost 10.10.10.80>
ServerName dspam.test.ru чае это /usr/local/www/vhosts/dspam).
DocumentRoot /usr/local/www/vhosts/dspam Веб-интерфейс сценариев англоязычный, но, прило-
User dspam
Group dspam жив минимум усилий, его несложно перевести на русский
<Directory "/usr/local/www/vhosts/dspam"> язык, заодно добавив некоторые пояснения от себя в це-
Options Indexes FollowSymLinks ExecCGI
AllowOverride All лях сокращения числа вопросов. На сайте журнала в раз-
Order allow,deny деле «Исходный код» можно будет найти архив с моим пе-
Allow from all
DirectoryIndex index.html реводом.
AddHandler cgi-script .cgi Пользователь может просматривать только свою статис-
<IfModule mod _ perl.c>
PerlSendHeader On тику (рис. 2), выполнять некоторые настройки, если в кон-
AddHandler perl-script .cgi фигурационном файле не запрещено их переопределять
PerlHandler Apache::Registry
</IfModule> (рис. 3), работать с историей сообщений (рис. 4), просмат-
</Directory> ривать сообщения, помещенные в карантин (рис. 5), в час-
</VirtualHost>
тности, инициировать переобучение в случае ошибки. Так-

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

Рисунок 2. Страница статистики пользователя Рисунок 3. Страница персональных настроек

Рисунок 4. Страница истории Рисунок 5. Страница карантина


же можно полюбоваться графическим отображением ста- </Limit>
<FilesMatch "(cgi|css|gif|html)$">
тистики за последний период времени (рис. 6), наглядно order deny,allow
демонстрирующим эффективность работы фильтра. allow from all
</FilesMatch>
Администратор, кроме того что может работать в ин- order deny,allow
терфейсе любого пользователя, имеет доступ также к об- deny from all
щим настройкам, которые применяются, если пользователь
не определит собственные. Кроме того, ему предоставля- Для еще большей безопасности вместо «allow from all»
ется графическая статистика работы фильтра в целом по для соответствующих расширений можно задать ограни-
серверу (рис. 7). ченный список разрешенных адресов.
Поскольку по умолчанию доступ возможен ко всем фай-
лам, расположенным в каталоге виртуального хоста (на- Обучаем фильтр
пример, можно получить содержимое файла admins), име- Процесс обучения играет чрезвычайно важную роль для
ет смысл несколько ужесточить требования, внеся допол- правильной работы фильтра. Чтобы dspam знал, какие
нительные настройки в .htaccess. Естественно, чтобы они письма являются спамом, требуется дать ему на обработ-
имели силу, конфигурация Apache должна позволять пере- ку примеры подобных сообщений, а также образцы нор-
определение базовых настроек; также можно указать эти мальных писем. Если у вас есть архив спамерских писем
строки непосредственно в httpd.conf в секции VirtualHost: (допустим, вы сбрасываете такие сообщения в отдельную
папку), то эти сообщения могут быть переданы для обуче-
# cat /usr/local/www/vhosts/dspam/.htaccess ния, используя следующую команду:
AuthName dspam.test.ru
AuthType Basic
AuthUserFile /usr/local/etc/apache/passwd # dspam _ corpus --addspam sergei ↵
<Limit GET POST> /var/db/dspam/data/gorod/gorod.mbox
require valid-user command: '/usr/local/bin/dspam' --class=spam ↵

№8, август 2005 31


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

Рисунок 6. Графики активности Рисунок 7. Страница администратора


--source=corpus --user 'sergei' --mode=teft ↵ /etc/mail/aliases должны быть созданы псевдонимы следу-
--feature=chained,noise ющего вида:
/usr/local/bin/dspam _ corpus: 3 messages, ↵
00:00:57 elapsed, 0.05 msgs./sec.
# DSPAM aliases
spam-gorod: "|/usr/local/bin/dspam --user gorod ↵
В данном примере я обучил фильтр для sergei на основе --class=spam --source=error"
спама, собранного в карантине пользователя gorod. Обу-
чение «хорошими» сообщениями выполняется аналогично, Имя псевдонима в принципе может быть любым (роль
но без ключа -addspam. Для получения адекватных резуль- играет значение ключа --user при вызове dspam), но реко-
татов при обучении необходимо соблюдать баланс между мендуется формировать его как spam-<имя_пользователя>.
«хорошими» сообщениями и спамом, в идеале их количес- Теперь, если пользователь перенаправит спам, который
тво должно быть (примерно) одинаково. Также по умолча- попал в его ящик, на этот адрес будет инициировано пе-
нию dspam настраивается на постоянное обучение в про- реобучение.
цессе работы (режим TEFT). То есть им обрабатываются Нужно сказать, что каждое обработанное письмо помеча-
все входящие сообщения, и значения спамности для каж- ется сигнатурой вида «!DSPAM:42df44f092281550917839!», ко-
дого встречающегося в них слова пересчитываются в БД. торая обычно добавляется в тело сообщения. Когда письмо
Это увеличивает нагрузку на систему, но позволяет быстро перенаправляется для исправления ошибки, dspam ищет в
реагировать на изменение характера рассылок. нем эту сигнатуру и «откатывает» те изменения в базе, ко-
Если режим TEFT для вас не приемлем из-за слиш- торые были сделаны во время первоначальной обработки
ком высокой нагрузки, можно использовать другие (па- этого сообщения.
раметр TrainingMode конфигурационного файла или ключ Вспомогательная утилита dspam_genaliases автома-
запуска): тически формирует список псевдонимов на основе фай-
! TOE: обучение выполняется только в том случае, если ла /etc/passwd.
фильтр допускает ошибку.
! TUM: фильтр обучается на каждом сообщении, пока не Несколько слов о «вакцинации»
будет достигнуто определенное число повторений то- Это хорошо, что пользователь может самостоятельно обу-
кена, затем переходит в режим обучения по ошибке. чать фильтр. Благодаря этому число ложных срабатываний
! NOTRAIN: обучение не проводится. снижается до минимума. Но, с другой стороны, одно и то
же сообщение, впервые попавшее в почтовый ящик, каж-
Возникает вопрос: а как фильтр узнает, что он ошиб- дый пользователь должен обработать лично. Для преодо-
ся? Конечно, об этом ему должен сообщить пользователь. ления этого неудобства DSPAM поддерживает так называ-
Для обратной связи предусмотрено два механизма – с по- емую «вакцинацию». Суть ее заключается в том, что в на-
мощью CGI-сценариев и путем пересылки сообщений на стройки почтового сервера добавляется еще один псевдо-
специальный адрес. ним (или несколько), которые перенаправляются на dspam
В первом случае пользователь имеет возможность в в режиме прививки:
списке своей истории щелчком мыши инициировать пере-
обучение для сообщений, которые, по его мнению, были об- inoc-gorod: "|/usr/local/bin/dspam --user gorod ↵
--class=spam --source=inoculation"
работаны ошибочно (используя ссылки «Retrain as Spam»
и «Retrain as Innocent» соответственно). Также переобуче- Далее этот псевдо-адрес можно «засветить» на различ-
ние происходит, если пользователь возвращает сообще- ных досках объявлений, форумах и т. д. с тем, чтобы он по-
ние из карантина. пал по возможности в большее число спамерских баз. Так
Для реализации второго механизма обучения в файле же можно попросить своих друзей пересылать на этот ад-

32
администрирование
рес спам, который получают они. В результате dspam смо- ! dspam_admin: данная утилита предназначена для уп-
жет обработать большее число нежелательной почты и эф- равления персональными настройками пользователей
фективнее реагировать, когда подобные письма будут пос- или общими настройками dspam. Синтаксис команды
тупать на реальные ящики пользователей. можно посмотреть, введя ее без аргументов:
Чтобы не заводить отдельные адреса-ловушки для каж-
дого пользователя, используются группы, о которых пойдет # dspam _ admin
речь в следующем разделе. syntax: dspam_admin [function] [arguments] [--profile=PROFILE]
add preference [user] [attrib] [value]
Группы change preference [user] [attrib] [value]
delete preference [user] [attrib] [value]
Чтобы придать работе с пользователями большую гибкость, list preference [user] [attrib] [value]
а также «обобществлять» информацию о спаме, накоплен- aggregate preference [user]

ную отдельными пользователями, в системе DSPAM имеет- Например, так можно отключить использование авто-
ся поддержка групп. Также группы используются и для ре- матически заполняемого «белого» списка для пользова-
ализации идеи «вакцинации». теля gorod:
Фильтром поддерживаются следующие типы групп:
! Shared: пользователи, входящие в shared-группу, рабо- # dspam _ admin change preference gorod enableWhitelist off
тают каждый со своим карантином, но используют об-
щую базу токенов. Для однотипных пользователей эф- Файл с настройками будет размещаться в директории
фективность повышается за счет снижения размера ба- dspam в подкаталоге, соответствующем пользователю –
зы и ее более быстрой наполняемости. С другой сторо- /var/db/dspam/data/gorod, в СУБД либо в домашнем ката-
ны, если характер корреспонденции отдельного поль- логе пользователя. Это можно настроить в процессе инс-
зователя отличается от среднего по группе, возраста- талляции фильтра (см. выше).
ет вероятность ложных срабатываний. ! dspam_clean: выполняет очистку базы. В процессе ра-
! Inoculation: включение пользователя в одну из таких боты база маркеров может достигать значительных раз-
групп позволяет ему получать информацию из «при- меров. Очистка служит для того, чтобы удалить беспо-
вивок», обработанных любым из членов группы. Та- лезные (или малополезные) записи. В частности, мо-
ким образом, описанный в предыдущем разделе псев- гут быть удалены токены, коэффициент спамности ко-
до-адрес можно сопоставить с одним из пользовате- торых близок к 0,5, то есть нейтральные слова, а также
лей inoculation-группы, чтобы она оказывала влияние устаревшие сигнатуры (которые фильтр хранит на слу-
на всех остальных. чай переобучения). Очистка служит не только для опти-
! Classification: члены такой группы практически незави- мизации размера БД, но и для поддержания ее в акту-
симы, но если у фильтра возникают сомнения при клас- альном состоянии: удаление устаревших токенов поз-
сификации какого-то сообщения, то он сможет восполь- воляет более точно реагировать на изменение харак-
зоваться данными остальных членов группы для приня- тера рассылки.
тия окончательного решения.
! Global: такая группа позволяет создавать так называ- Например, для удаления сигнатур старше 7 дней для
емых глобальных пользователей. Любой новый поль- всех пользователей служит команда:
зователь сможет использовать данные, размещенные
в пространстве глобального пользователя, пока не на- # dspam _ clean –s7
копит достаточную для самостоятельной работы базу.
! Merged: пользователи, входящие в такую группу, полу- Удаление всех (в том числе и самых последних) ней-
чают возможность добавлять в процессе анализа к сво- тральных токенов из пространства пользователя gorod:
им данным информацию из пространства глобального
пользователя (описанного в группе Global). При этом имя # dspam _ clean –p0 gorod
merged-группы должно совпадать с именем используе-
мого глобального пользователя. Подробности по использованию утилиты см. на страни-
цах man dspam_cleanup.
Для того чтобы включить пользователя в ту или иную Говоря об очистке базы, следует также упомянуть уда-
группу, используется файл /var/db/dspam/group: ление малоэффективных и устаревших данных силами
СУБД. Например, для PostgreSQL cоответствующий sql-
group1:shared:user1,user2,user3 файл можно найти в /usr/local/share/examples/dspam/pgsql
group2:inoculation:user4,user5,user6
под именем purge.sql.
Существуют ограничения на вхождения одного и того Для регулярного автоматического запуска процедур
же пользователя в разные группы. Подробную информацию очистки можно использовать crontab.
можно получить из уже упоминавшегося файла README. ! dspam_stats: выводит статистику работы dspam по всем
или указанным пользователям (количество спама, «хо-
Вспомогательные утилиты роших» писем, ошибок):
В состав пакета DSPAM входит ряд служебных утилит, на-
значение которых – выполнение ряда сервисных функций: # dspam _ stats serg gorod alex

№8, август 2005 33


администрирование
serg TS: 0 TI: 12 SM: 0 IM: 0 SC: 0 IC: 0 циент спамности» (вероятность того, что следующее пись-
gorod TS: 1 TI: 44 SM: 11 IM: 0 SC: 0 IC: 0 мо с данным словом будет спамом), LH – время последнего
alex TS: 0 TI: 20 SM: 0 IM: 0 SC: 0 IC: 0
появления данного слова во входящих сообщениях.
С ключом -H утилита выдает более «читабельную» ин- Вопреки своему названию, наводящему на мысль о ре-
формацию: зервном копировании, dspam_dump используется только
для анализа работы фильтра.
# dspam _ stats -H gorod ! dspam_2sql: формирует SQL-команды, которые могут
gorod: быть использованы для заполнения таблиц данными
TS Total Spam: 1 практически в любой СУБД:
TI Total Innocent: 44
SM Spam Misclassified: 11
IM Innocent Misclassified: 0 # dspam _ 2sql
SC Spam Corpusfed: 0
insert into dspam_token_data (uid, token, spam_hits, innocent_hits, last_hit)
IC Innocent Corpusfed: 0 values(1002, "16628239873585525635", 0, 3, 1121889600);
TL Training Left: 2456 insert into dspam_token_data (uid, token, spam_hits, innocent_hits, last_hit)
SR Spam Catch Rate: 8.33% values(1002, "3386138115020307445", 0, 3, 1121889600);
IR Innocent Catch Rate: 100.00% .. .. .. ..
OR Overall Rate/Accuracy: 80.36%
Может использоваться при переносе данных на дру-
! dspam_corpus: данная утилита позволяет указать филь- гую систему управления БД для резервного копирования
тру файл в формате mbox, содержимое которого сле- (хотя и гораздо менее эффективного, чем силами самой
дует «изучить». Будучи выполненной без дополнитель- СУБД) и т. д.
ных аргументов, команда выведет на экран подсказку ! dspam_crc: эта служебная программа рассчитывает
по синтаксису. Также имеется man-страница. цифровой «отпечаток» для того или иного слова (как
! dspam_genaliases: с помощью этой команды можно ав- оно будет храниться в базе):
томатически добавить в файл /etc/mail/aliases нужные
псевдонимы, для генерации которых используется спи- # dspam _ crc "viagra"
сок пользователей из файла /etc/passwd. TOKEN: 'viagra' CRC: 6625426497525293056
! dspam_logrotate: лог-файлы имеют привычку разрас-
таться до немыслимых размеров. С помощью этой ути- Помимо удовлетворения любопытства, данная утилита
литы, помещенной в crontab, можно организовать пери- может быть полезной, например, при автоматизированной
одическую очистку логов, скажем, таким образом (при- обработке содержимого базы данных.
мер из README):
Итоги
0 0 * * * dspam _ logrotate -a 30 /var/db/dspam/system.log ↵ Система DSPAM, конечно, не уменьшает почтовый трафик
`Þnd /var/db/dspam/data -name "*.log"`
(все сообщения принимаются полностью), но зато сущес-
Преимущества этого способа перед другими способа- твенно упрощает жизнь конечному пользователю, выпол-
ми ротации (например, newsyslog) в том, что можно обра- няя за него работу по сортировке входящей корреспонден-
ботать сразу все лог-файлы. В приведенном выше приме- ции на спам и легальную почту. Благодаря персонифици-
ре с помощью find формируется список всех файлов с рас- рованному подходу к обучению пользователь практически
ширением log, найденных в каталоге data и его подкатало- не зависит от предпочтений системного администратора,
гах. Ключ -а задает возраст файлов в днях, которые долж- обслуживающего систему, самостоятельно формируя пра-
ны быть подвержены очистке. вила фильтрации. С другой стороны, DSPAM не относится
! dspam_merge: данная команда объединяет метадан- к системам типа «поставил – и спи». Прежде чем будет за-
ные нескольких пользователей, имена которых зада- метен положительный эффект от внедрения, как от адми-
ются как аргументы командной строки, и сохраняет их нистратора, так и от пользователей потребуется приложить
в пространство другого пользователя, заданного клю- немало усилий по обучению системы. Но, на мой взгляд,
чом –o. Частное применение утилиты – формирование оно того стоит.
«стартового» наполнения для вновь создаваемого поль-
зователя на основе некоторого существующего, уже Дополнительная информация:
прошедшего «цикл обучения». Подробности см. в man 1. Супрунов С. Запускаем spamd на FreeBSD. – Журнал
dspam_merge. «Системный админстратор», №7, 2005 г. – 14-19 с.
! dspam_dump: выводит на экран токены и характеризу- 2. http://dspam.nuclearelephant.com – домашняя страница
ющие их значения для указанного пользователя: проекта DSPAM.
3. http://www.paulgraham.com/spam.html – «A Plan for Spam»
# dspam _ dump gorod by Paul Graham.
2382717757724374224 S: 00007 I: 00000 P: 0.9998 LH: Wed Jul 27 00:00:00 2005 4. http://www.paulgraham.com/better.html – «Better Bayesian
2180264270330443047 S: 00004 I: 00000 P: 0.4000 LH: Mon Jul 25 00:00:00 2005
4180468462601491382 S: 00004 I: 00000 P: 0.4000 LH: Mon Jul 25 00:00:00 2005 Filtering» by Paul Graham.
.. .. .. ..
5. http://radio.weblogs.com/0101454/stories/2002/09/16/
Здесь в первом поле отображается токен в цифровой spamDetection.html – «Spam Detection» by Gary Robinson.
форме (см. dspam_crc в этом разделе) и далее: S – коли- 6. http://linuxjournal.com/article/6467 – «A Statistical Approach
чество спама, I – количество хороших писем, P – «коэффи- to the Spam Problem» by Gary Robinson.

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

WrSpy – СЧИТАЕМ И КОНТРОЛИРУЕМ ТРАФИК


ПОЧТОВЫХ И ПРОКСИ-
ПРОКСИ-СЕРВЕРОВ
СЕРВЕРОВ

РОМАН МАРКОВ

Тема контроля за интернет-трафиком пользователей не теряет своей актуальности.


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

Н
емного истории. Название этого лог-анализатора анализатор. В процессе попыток внедрить данную систему у
пошло от популярного продукта для Windows – Kerio себя выявилось много неточностей и недоработок, которые
WinRoute Pro, несмотря на то что сейчас данный про- автор программы оперативно устранял по нашим советам.
дукт распознает форматы логов почти всех популярных В результате такой совместной работы продукт «отполиро-
прокси- и почтовых серверов. Причина в том, что сначала вали», добавили возможность анализа лог-файлов других
WrSpy был написан его автором «исключительно для собс- популярных серверов, прибавив при этом целый букет но-
твенной сети». Начало развития было положено около трех вых функций. Программа абсолютно бесплатна, за это ог-
лет назад на одной из интернет-конференций, посвященной ромная благодарность Аркадию Патрушеву.
администрированию локальных сетей. Аркадий Патрушев – Итак, начнем с традиционного описания возможностей.
системный администратор и программист из Новосибирс- Программа предназначена для анализа логов и форми-
ка, известный в сети под псевдонимом Walker, на очеред- рования разнообразных отчетов как в автоматическом (па-
ной вопрос в стиле: «Как считать трафик?» – предложил кетном), так и в интерактивном режиме. Именно изначаль-
всем желающим свою программу, честно предупредив, она ное наличие пакетного режима и, разумеется, бесплатность
что «жутко сырая» и была написана для себя. сделало программу столь привлекательной, вытеснив уже
Я также использовал встроенный прокси-сервер существовавшие на тот момент аналогичные Windows-сис-
WinRoute 4 Pro, и поэтому попросил выслать и мне данный темы. Однажды настроив систему импорта и анализа логов

36
администрирование
и прописав в планировщике задач автоматический запуск ределенного ресурса), нельзя не заметить, что, пожалуй,
администратор получал систему класса «настроил и за- единственным недостатком WrSpy является именно боль-
был». Помимо этого, автор использовал, казалось бы, прос- шая нагрузка на дисковую систему. Однако глубокий ана-
той, но остроумный способ блокировки доступа пользова- лиз plain-text файлов с накоплением статистики всегда под-
телей, превысивших персональный лимит. Автоматически разумевает это.
корректируя необходимые настройки программы в реест-
ре, WrSpy переносил пользователя в другую группу безо- Установка
пасности, не имеющую никаких прав. Позднее при развитии Рассмотрим пример настройки системы. Для написа-
продукта этот же принцип лег в основу блокировки пользо- ния данной статьи я использовал связку Kerio WinRoute
вателей в Squid-NT. Кстати, несмотря на то, что WrSpy ра- Firewall 6 и Alt-N Mdaemon 8, установленные на OS Windows
ботает под управлением ОС Windows, поддерживается ана- Server 2003. Принцип настройки взаимодействия c други-
лиз лог-файлов популярных прокси- и почтовых серверов ми поддерживаемыми ПП аналогичен. Если есть какие-ли-
для UNIX-систем. В данный момент WrSpy и утилиты под- бо особенности (например, настройка блокировки пользо-
держивают анализ лог-файлов следующих систем. вателей в Squid или Kerio WinRoute Pro 4), то они подробно
Proxy-серверы: WinRoute 4 Pro, Kerio WinRoute Firewall 5, описаны на официальном сайте WrSpy.
Kerio WinRoute Firewall 6, Kerio Network Monitor, BSB, Скачиваем дистрибутив (WrSpySetup.rar) и последнее
UserGate, Squid NT, Squid OS/2, WinGate, ISA, ExtraSystems обновление (WrSpyUpXXX.rar – где XXX номер версии) с
Proxy Server, WinProxy CZ, WinProxy, ISA2004. официального сайта программы (ссылки приведены в кон-
Почтовые серверы: WinRoute, MDaemon, Kerio Mail це статьи). Распаковываем архивы, устанавливаем основ-
Server, CommuniGate Pro, Postfix, SendMail, Weasel, WinProxy ной дистрибутив.
CZ и POPCon. Обратите внимание на предупреждение: «Будьте осо-
Помимо этого, на сайте программы имеется большое бенно внимательны, если в системе уже установлен Visual
количество отдельных утилит. FoxPro 6.0 (VFP6.0) или приложения, созданные с его ис-
Отдельные анализаторы для: MDaemon, Kerio Mail пользованием. Возможно нарушение их функционирова-
Server, Kerio Network Monitor, Serv-U, Apache, IIS. ния». Если при запуске обнаружится сообщение: «Несов-
падение версии файла ресурсов», то скорее всего в систе-
Системные требования ме установлен VFP6.0 или программа, из-под него писан-
Работа программы основана на анализе файлов форма- ная, с несовпадающей версией обновления. Чтобы обойти
та plain-text, что накладывает определенные требования данную ошибку, необходимо использовать режим полной
к производительности дисковой системы, процессорной установки поверх существующей версии VFP.
мощности и количеству памяти. Однако никаких минималь- Выполняем стандартные действия, отвечая на вопро-
ных требований нет, поскольку работоспособной окажет- сы инсталлятора о варианте установки и местоположении
ся практически любая система. С другой стороны, для по- файлов (рекомендуется устанавливать WrSpy на быстрые
лучения определенной скорости обработки лучше все-та- дисковые системы, как рекомендовалось выше). В конце
ки обеспечить разумный минимум. Тут все зависит от раз- установки отказываемся от запуска WrSpy (снимаем соот-
мера лог-файлов (соответственно – активности пользова- ветствующий флажок). Вы можете прочитать файл Readme.
телей) и необходимой частоты обновления статистики. Ес- txt (нажатием кнопки после завершения установки). В нем
ли размер анализируемых файлов не превышает 10-100 Мб кратко описываются принципы настройки, которые я рас-
в месяц, а статистику достаточно обновлять один-два ра- смотрю более подробно. Сразу после установки основно-
за в сутки, когда отсутствует активность пользователей, – го дистрибутива обновляем его до последней версии, за-
с поставленной задачей справится абсолютно любой ком- пустив файл обновления. Внимательно проверьте путь для
пьютер, на котором работают поддерживаемые програм- установки, так как инсталлятор не проверяет, куда именно
мные продукты. был установлен WrSpy. Это сделано не случайно, так как
При большом количестве пользователей, приросте раз- иногда требуется произвести несколько установок с раз-
мера лог-файлов до 1-2 Гб в месяц, рекомендуется реже об- ными настройками на один компьютер (например, для ана-
новлять статистику – 1-2 раза в сутки. При необходимости лиза архивных лог-файлов, не прерывая работу основной
более частого переиндексирования размещайте лог-файлы системы анализа). После установки обновления соглаша-
и формируемые отчеты на быстрых дисках SATA или SCSI. емся с предложением инсталлятора запустить WrSpy (ли-
Рекомендуется также озаботиться созданием ежедневных бо запускаем вручную файл WrSpy.exe). Запустится интер-
копий информации, находящейся на таком диске. Личный активная первоначальная настройка (рис. 1).
пример: для обновления статистики для 100 пользовате- Выбираем используемые нами прокси- и почтовый сер-
лей прокси-сервера Kerio WinRoute 4 Pro и 250 почтовых веры, задаем параметры сети (подсеть и маску). Созда-
ящиков Alt-N Mdaemon с интервалом один раз в час я ис- ем на диске папку для отчетов (именно в нее будут поме-
пользую компьютер следующей конфигурации: Intel Celeron щаться формируемые программой результаты) и указыва-
1.3 ГГц, 256 Мб RAM, 2 SATA HDD 40 Гб, SATA-RAID-1, OS ем путь к ней. Затем указываем пути к лог-файлам, а так-
Windows 2000 Server. же почтовые домены. Если какой-то из лог-файлов (почто-
При наличии неоспоримых достоинств этой програм- вый или прокси) анализироваться не должен – оставляем
мы, таких как подробнейшие отчеты (вплоть до того, ка- соответствующее поле пустым. Переходим к следующему
кой именно файл скачал конкретный пользователь с оп- экрану настроек (рис. 2).

№8, август 2005 37


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

Разделы сводного отчета:


! Открывать при создании – при установленном переклю-
чателе в интерактивном режиме после создания отчет
автоматически будет открыт.
! Сортировка по трафику – в HTML-отчете список пользо-
вателей будет выводиться в соответствии с использован-
ным трафиком – первыми будут идти «рекордсмены».
Рисунок 2. Настройка вида отчета
! Выделение цветом – наглядное отображение о прибли-
Обычно наибольшие трудности возникают при настрой- жении к персональному лимиту – от белого к красному.
ке именно этих параметров. Синий цвет графы пользователя означает, что персо-
Для краткости скажу, что обычно использую настрой- нальный лимит превышен и пользователь отключен.
ки, приведенные на рис. 2. Поясню функции каждого пе- ! Трафик по дням – при установке данной опции для каж-
реключателя: дого пользователя будет формироваться и сохранять-
Глубина анализа: ся в персональной папке дополнительный ежедневный
! Отчет по пользователям – анализ будет осуществлять- отчет (что, разумеется, увеличит нагрузку на систему).
ся по имени пользователя прокси-сервера.
! Отчет по станциям – учет по IP-адресам (DNS-именам) Формировать с головным – интеграция дополнитель-
станций независимо от имен пользователей прокси-сер- ных отчетов с основным:
вера. ! Сайты по пользователям – для ежечасного автомати-
! Отчет по почте – при анализе также будут учитываться ческого режима формирования отчетов рекомендует-
лог-файлы почтового сервера. ся включить только эту опцию – детализация трафика
! Отчет по группам – разделение пользователей по груп- пользователя по посещенным ресурсам.
пам (например, по отделам).
Остальные возможности используются не так часто, по-
Графы сводного отчета: этому для снятия нагрузки с системы их можно формиро-
! Группа – выводится статистика по заданным группам. вать только при необходимости в интерактивном режиме.
! Суммарный входящий – весь входящий трафик (прок- Например, очень интересен отчет «Бюджет времени», поз-
си и почтовый). воляющий получить общую картину активности пользовате-
! Суммарный прокси – суммарный трафик прокси-серве- ля в разрезе временного интервала. Данный режим не пред-
ра. назначен для временной тарификации – он всего лишь по-

38
администрирование
казывает приблизительные графики активности и относи-
тельно время, проведенное в сети. Для того чтобы понять,
чем занят сотрудник (если, конечно, серфинг по сайтам – не
его прямые обязанности), – этого вполне достаточно.
В следующем окне настроек задаем параметры режи-
мов анализа, а также рабочий интервал (рис. 3).
Минимально необходимо настроить два режима – ин-
терактивный и автоматический. Автоматических режимов
существует несколько. Каждый из них можно настроить в
соответствии со своими задачами – например, добавить
дополнительный режим для формирования и сохранения
ежемесячного отчета, так как после начала нового рабо-
чего периода отчеты обнуляются.
Режим «0» – интерактивный: формирование отчета про-
исходит в окне программы, в ручном режиме. Переключа-
тель «Блокировка пользователей» предназначен для при-
остановки доступа пользователям, превысившим свой пер-
сональный лимит в Kerio WinRoute 4 Pro или SquidNT, пос-
кольку в этих популярных продуктах нет встроенной систе-
Рисунок 3. Настройка режимов анализа
мы ограничения. В нашем случае этот влажок можно снять,
так как Kerio WinRoute Firewall уже имеет встроенную фун- На следующем экране «Учет реального трафика» необ-
кцию ограничения. Если вы используете Kerio WinRoute 4 ходимо указать, какой интерфейс является внешним. Дан-
Pro или SquidNT – включите этот режим и для интерактив- ный режим доступен для продуктов Kerio и может не поя-
ного, и для автоматического режима. Более подробно про виться при использовании других ПП.
настройку блокировки пользователей при использовании Последним шагом первоначальной настройки необходи-
этих продуктов можно прочитать на сайте программы. мо задать ширину полей формируемого отчета. Меню «На-
Итак, в режиме «0» включаем опцию «Отчет в html», от- стройка» – «Ширина полей» (из меню «Настройка» также
ключаем рассылку отчетов, при использовании Squid, ISA, можно изменить заданные при первоначальном запуске
ESPS или WinProxy указываем, какой трафик подсчиты- параметры). Помните, что чем больше задана ширина по-
вать (логичнее всего, конечно, считать «мимо кэша», так лей, тем дольше будет формироваться отчет, поэтому не-
как именно он берется снаружи. Задаем интервал сбора обходимо найти разумную середину. В принципе значения
статистики до обнуления (например, текущий месяц). по умолчанию оптимальны. Можно только увеличить поле
Затем настроим один из автоматических режимов. Пе- «адреса и доменные имена» до 30-40 символов.
реключаем опцию режим до «Автоматический-2» и также Если вы используете Kerio WinRoute Pro 4, то для на-
настраиваем его. стройки блокировки пользователей, превысивших персо-
Опция «Ротация логов» в настройках режимов позво- нальный лимит, создайте в конфигурации группу, которая
ляет настроить специальный режим для очистки накопив- не будет иметь никакого доступа к веб-ресурсам. После
шихся лог-файлов в тех ПП, которые не предусматрива- этого зайдите в меню «Настройка» – «Блокировка досту-
ют автоматическое удаление. Однако даже если указан- па» и выделите эту группу. При превышении персонального
ная возможность автоматической очистки лог-файлов при- лимита пользователь будет перенесен в нее и доступ пре-
сутствует в используемом вами прокси или почтовом сер- кратится. Настройка блокировки пользователей в SquidNT
вере – использовать указанный способ предпочтительнее описана на сайте программы.
во избежание потерь в логах. При запуске программы в Теперь произведем первичный ввод информации. Меню
данном режиме база отчетов очищается от введенной ин- «Данные» – «Очистка и закачка с нуля». Если лог-файлы
формации, сбрасываются внутренние счетчики, после че- велики, то потребуется довольно продолжительное время
го запускается файл savelog.bat из папки WrSpy. Универ- для первоначального ввода (дальнейший ввод будет быс-
сальность метода заключается в том, что в этот файл вы трее, так как чтение информации будет осуществляться
можете поместить любые команды, которые необходимо только с последней обработанной позиции).
выполнить после очистки базы данных WrSpy. Чаще всего После окончания ввода информации будет выдано со-
это копирование и архивация старых лог-файлов, секунд- общение о добавление новых пользователей и предложе-
ная остановка прокси и почтовых служб, удаление лог-фай- но исправить их. После утвердительного ответа мы полу-
лов, запуск служб. чим таблицу с четырьмя закладками:
Настройка «Рассылка отчетов» используется для опо- ! Адреса и имена. Здесь хранится информация о пользо-
вещения пользователей по e-mail о их персональном тра- вателях и их лимитах. Поле «Пользователь» заполняет-
фике. Для введения этого режима необходимо задать соот- ся автоматически, по логину пользователя. Для удобс-
ветствие почтовых адресов для пользователей и зарегис- тва восприятия значение этого поля можно менять на
трировать в системе дополнительную компоненту SMTP, любое, например на ФИО пользователя. Поле «Адрес»
которая доступна для скачивания на официальном сай- заполняется автоматически либо IP-адресом компью-
те программы. тера, с которого пользователь подключается к прокси-

№8, август 2005 39


администрирование
серверу, либо случайной последовательностью симво- ; запускаем программу с параметром "2" - указание номера
; режима
лов, если пользователь мигрирует между компьютера- wrspy.exe 2
ми (или наоборот – с одного IP подключались разные
пользователи). Поле «Логин» оставляем, как есть, а ли- Все! Настраиваем в любом планировщике задач за-
мит – также можно свободно изменять – каждому персо- пуск написанного нами bat-файла, повторяем задание с
нальный. При импорте новых пользователей это значе- необходимой периодичностью и проверяем работу систе-
ние берется из настройки «Лимит по умолчанию». Зна- мы в целом. Результатом будет автоматическая биллинго-
чение «0» – отсутствие ограничений. Если указать в по- вая система, не претендующая на абсолютную точность
ле «Группа» наименование подразделения – можно бу- (ведь подсчитывается только трафик, прошедший через
дет выводить отчет и суммарный трафик групп. прокси- и почтовый сервера, а не весь прошедший через
! Переходим на закладку «Почтовые сервера» и удаля- интерфейс), но полностью достаточная для малых и сред-
ем уже прописанные туда значения – там для примера них компаний.
указаны внешние почтовые сервера, которые должны Отчеты создаются в папке, указанной вами при перво-
восприни