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

№7(20) июль 2004

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


www.samag.ru
Почтовая система на базе MTA exim
Обзор системы поддержки
списков рассылок GNU Mailman
Как различать и считать
маркированный трафик?
FreeBSD tips: ARP в «заморозке»
Строим шлюз с Luinux
CrossOver и лицензионный вопрос
Упрощаем себе жизнь с Webmin
PostgreSQL: первые шаги
HA-кластер LifeKeeper
компании SteelEye
№7(20) июль 2004

Русификация FreeDOS
Metro Ethernet
оглавление

IMHO Строим шлюз с Luinux


Сергей Яремчук
Есть такая профессия grinder@ua.fm 40
Алексей Коршунов
akeeper@akeeper.ru 4 «Стальной глаз на страже жизни».
HA-кластер LifeKeeper компании SteelEye

АДМИНИСТРИРОВАНИЕ Антон Борисов


a.borisov@tesv.tmb.ru 43
Почтовая система на базе MTA exim
Вежливый отказ
Всеволод Стахов
cebka@jet.msk.su 6 Александр Шибенко
pulse@hotmail.ru 50
Настройка почтовой системы на базе
Postfix + Dovecot + PostgreSQL + Управление файловыми серверами
Amavisd-new + SpamAssassin + ClamAV
Иван Коробко
Рустам Атнагулов ikorobko@prosv.ru 52
mosqit@sc.rb.ru 14
Русификация FreeDOS
«Кто стучится в дверь ко мне…»
Обзор системы поддержки списков Вадим Дружин
рассылок GNU Mailman vdruzhin@mail.ru 59
Андрей Маркелов
andrew@markelov.net 18 ПРОГРАММИРОВАНИЕ

Как различать и считать Техника внедрения кода в РЕ-файлы


маркированный трафик? и методы его удаления
Павел Закляков Крис Касперски
amdk7@mail.ru 20 kk@sendmail.ru 62

PostgreSQL: первые шаги СЕТИ


Сергей Супрунов
amsand@rambler.ru 26 Metro Ethernet
Денис Еланский
Упрощаем себе жизнь с Webmin grosm@samag.ru 84
Сергей Яремчук
grinder@ua.fm 34 ОБРАЗОВАНИЕ

FreeBSD tips: ARP в «заморозке» Второе начало термодинамики – гарант


успеха систем с открытым исходным
Сергей Супрунов кодом
amsand@rambler.ru 38
Алексей Мичурин
alexey@office-a.mtu-net.ru 91
№7(20), июль 2004 1
конкурс

С 24 июня по 3 августа 2004 года на страницах популяр- вы разместите свое сообщение, тем больше пользовате-
ного каталога программного обеспечения SOFT@Mail.Ru лей его прочитает и тем больше у вас шансов победить.
(http://soft.mail.ru) проводится конкурс «Сисадмин – тоже Итоги конкурса будут подведены 3 августа. Системно-
человек», посвященный Международному дню системно- го администратора, чье сообщение будет пользоваться
го администратора (30 июля). Конкурс организован ком- наибольшим вниманием пользователей и авторов откры-
панией SoftLine и интернет-холдингом Mail.Ru. ток, ждет главный приз от генерального спонсора конкур-
Конкурс посвящен вам, уважаемые сисадмины, и ва- са «Сисадмин – тоже человек» – Учебного Центра SoftLine
шему нелегкому труду, и не только нелегкому, но еще и (http://softline.ru/edu). Это программа подготовки Microsoft
нервному, а иногда и просто вредному. Для здоровья, ко- Certified Systems Administrator (MCSA 2003). Программа
нечно, а не для пользователей. Вознаграждать этот труд представляет собой трек продолжительностью 17 дней,
обычно некому: для пользователя сисадмин – работник состоящий из набора полезных курсов:
«невидимого фронта», чем незаметней, тем лучше, да и ! управление и поддержка среды Windows Server 2003;
сами сисадмины по природе обычно скромные и сдержан- ! установка, настройка и администрирование Windows
ные. Работа обязывает. XP Professional;
Сисадмин в России часто отвечает за работу, не име- ! внедрение сетевой инфраструктуры Windows Server
ющую прямого отношения к его профессиональным обя- 2003: сетевые узы;
занностям. Более половины сисадминов официально не ! внедрение, управление и сопровождение сетевой ин-
называются системными администраторами. Поэтому к фраструктуры Windows Server 2003: сетевые службы;
участию в этом летнем творческом конкурсе приглаша- ! установка и управление Microsoft Internet Security and
ются также веб-мастера, администраторы баз данных и Acceleration Server 2000.
служб электронной почты, системные программисты, ад-
министраторы телефонных сетей и систем голосовой по- Победитель может заменить входящие в трек MCSA
чты и других служб. 2003 курсы на аналогичные по стоимости и длительности
Конкурс «Сисадмин – тоже человек» будет способство- курсы Microsoft. Сисадминов-победителей ждут фирмен-
вать мягкой психологической реабилитации работников ные призы от Mail.Ru, а также бесплатная подписка на
системного администрирования: вам, уважаемые сисад- второе полугодие 2004 года на журнал «Системный ад-
мины, предлагается поделиться своими размышлениями министратор» от редакции журнала. Авторы лучших от-
о работе, пользователях, компьютерах и жизни в целом. крыток получат ценные призы от интернет-магазина
Рассказав о трудностях (а может, и радостях) сисадминс- Allsoft.ru (http://www.allsoft.ru) компании SoftLine, главный
кой жизни, изложив всю правду о «юзерах» и почитав со- из которых – графический планшет Wacom. А 30 июля – в
общения ваших коллег, вы снимете напряжение, рас- Международный день сисадмина – всех участников кон-
слабитесь, выскажетесь и … улыбнетесь. Ваши оригиналь- курса ждет приятный сюрприз.
ные рассказы, жалобы, истории вдохновят пользователей Официальная страничка конкурса в Интернете – http://
на создание открыток в честь дня сисадмина. Создание soft.mail.ru/competitions/sysadmin.
открыток для сисадминов составит вторую часть конкур- По адресу info@soft.mail.ru вы можете задать любые
са под кодовым названием «Утешить сисадмина». вопросы, связанные с проведением конкурса, а также при-
Открытки разместятся на сайте Открытки@Mail.Ru слать ваши предложения и пожелания.
(http://cards.mail.ru). С этого сайта все желающие смогут С уважением организаторы конкурса – компании SoftLine
послать поздравления своим знакомым сисадминам. Каж- и Mail.Ru.
дая открытка будет создаваться автором в честь одного
из сисадминов, оставивших свое сообщение в книге жа-
лоб. Победитель среди сисадминов будет определяться
по числу размещенных в его честь открыток. Чем раньше

№7(20), июль 2004 3


IMHO

ЕСТЬ ТАКАЯ
ПРОФЕССИЯ
АЛЕКСЕЙ КОРШУНОВ
В последнее время профессия системного администра-
тора стала крайне популярной, особенно среди молодых
людей. Практически в любой компании есть специалисты
такого профиля. Кто эти люди, и какое у них как специа-
листов будущее?
Так как официально профессии «системный админист-
ратор» не существует, количество её трактовок неимовер-
но велико, каких только не приходилось мне слышать. От
ужасно вычурных до откровенно «забавных», но в одном
сходятся все – это человек, настраивающий и следящий за
работой «компьютерного хозяйства» компании. Будь то Любой специалист-сисадмин на пальцах разложит и
мощные сервера и сотни пользовательских станций или докажет, что такое утверждение не верно в принципе.
десяток пользовательских компьютеров и одиннадцатый Но так ли это? Работа многих и многих системных ад-
в «качестве сервера». министраторов заключается (разумеется, не всегда, но
Из-за неразберихи с определением, а значит, и обя- чаще всего) в следовании некоторым схемам. «Настроил,
занностями системных администраторов, большинство следишь за работой, избегаешь нештатных ситуаций, если
бизнесменов и начальников слабо представляют, чем че- таковые возникают, исправляешь последствия». По боль-
ловек с такой специальностью должен заниматься. Очень шому счету схему работы среднего системного админис-
часто приходится слышать, как сисадмина называют по- тратора небольшой компании можно было бы описать в
свойски «компьютерщик». Я неспроста привел этот тер- одной не самой толстой книжке. Даже места для карти-
мин. Дело в том, что довольно давно, когда он появился, у нок хватило бы. «А как же искусство?» – спросите вы. «Как
людей в голове сложилась картина этакого «маньяка кла- же решение нестандартных проблем и задач?» Полнос-
виатуры», который, грубо говоря, просто хорошо разби- тью с вами согласен – для решения действительно нетри-
рается в компьютерах. Следовательно, этот человек мо- виальных и сложных задач (проблем) нужен достаточный
жет разобраться и в серверах, и в компьютерах пользова- опыт и просто элементарное знание основ плюс голова
телей и… может настроить мини-АТС, починить ксерокс, на плечах. Но, господа хорошие, поймите, что работода-
поменять бумагу в факсе. Ведь начальство действитель- телей устраивает «работа по схеме». Поэтому совсем не
но свято верит, что все это оборудование напрямую отно- удивительно, что они предпочитают взять на работу сту-
сится к «компьютерному хозяйству» компании, а значит, дента-недоучку за маленькие деньги вместо матерого и
в ведении системного администратора. Другими слова- опытного специалиста на весьма и весьма хорошие день-
ми, круг обязанностей системного администратора может ги. Более того, ситуация не стоит на месте, и многие уже
оказаться весьма широк. пришли к тому, что можно и настоящего специалиста взять
Возросшая популярность профессии привела к пони- за копейки, дописав ему количество обязанностей, кото-
жению общего уровня зарплат и уровня востребованнос- рые в принципе не способен выполнять один и тот же че-
ти системных администраторов. Я говорю о тех толпах сту- ловек по причине отсутствия трех голов и восьми рук. Но
дентов и просто безработных молодых людей, которые по кого это интересует? Реально – никого, кроме самих «оби-
какой-то причине вообразили, что они могут работать си- женных» системных администраторов. Для работающих
стемными администраторами. Давайте посмотрим на си- на данный момент специалистов назрела проблема – как
туацию честно и непредвзято. Для большинства (относи- быть дальше. Куда развиваться, где искать заработок нор-
тельно количественной, а не качественной массы) ныне мального уровня. Причин возникновения данной ситуации
существующих системных администраторов эта специаль- существует немало, и если вдаваться в детали и тонко-
ность есть способ заткнуть дыру своей незанятости как сти, то получится как минимум хорошая курсовая для ка-
работающего человека. «Я нигде не работаю, но знаю ком- кого-нибудь студента. Давайте лучше подумаем, как вый-
пьютеры (это «знаю» заслуживает отдельного длинного ти из этого положения.
обсуждения, ну да бог с ним) – значит, я могу работать Первое, что приходит в голову, – это повышение про-
системным администратором». Правильно? И да, и нет. фессионального уровня. Прохождение курсов и получе-

4
IMHO
ние сертификатов помогают найти высокооплачиваемую (от момента «смены профиля») он добился желаемого ре-
работу по специальности. К слову сказать, некоторые сер- зультата и, насколько я знаю, весьма им (как результа-
тификаты можно получить, не посещая курсы, а лишь со- том, так и профилем) доволен.
вершенствуя свои познания в нужной области с последу- Другой пример не связан с поиском места работы «вок-
ющей сдачей экзаменов. руг себя», однако имеет прямое отношение к профессии
Настоящие системные администраторы-профессиона- системного администратора. Так как многие достаточно
лы не сидят на месте и не имеют возможности «зависать» долго работающие в данной специальности люди имеют
на форумах и в чатах целыми днями. У них слишком мало свои «рабочие» схемы и способы анализа как задач, так
времени и слишком много дел, за которые они и получа- и различных внештатных ситуаций (другими словами, ис-
ют достойную оплату. пользуют системный подход), не удивительно, что анали-
Также возможен последующий переход на новые сту- тическая часть ума у этих людей развита превосходно.
пени. Известны случаи, когда администратор-професси- Поэтому лично я ничуть не удивился, когда узнал, что два
онал перерастал в руководителя крупного IT-отдела боль- моих знакомых стали аналитиками в достаточно крупных
шой компании или же вовсе начинал собственное дело. компаниях. Разумеется, эта работа гораздо более инте-
Но скажите честно, все ли вы действительно собирае- ресна для них, так как не зациклена на чем-то одном (ком-
тесь всю жизнь работать системными администраторами, пьютеры, сервера и проч.), а охватывает несоизмеримо
пусть даже в надежде стать начальниками IT-отдела? Не больший круг вопросов.
та это специальность, которая способствует постоянному Другими словами, примеров смены основного профи-
профессиональному росту и радует душу будущими зо- ля масса. Зачастую они сделаны с учетом тех сильных
лотыми горами. (Исключаем из рассмотрения места в ком- сторон человека, которые были выявлены в процессе ра-
паниях, где данное утверждение не верно по причине боль- боты в должности системного администратора. Какая-то
шого размера компании и широчайших возможностей часть людей находит интересную для себя работу в том
карьерного роста – такая ситуация не настолько типична, же офисе, где они обслуживали компьютерную сеть. Как
как многим хотелось бы.) правило, все вопросы, связанные с аналитическими, так-
Если представить, что вы уже прошли тот период, ког- тическими сторонами работы, достаточно легко даются
да вам «срочно нужны деньги на пиво» и предположить человеку, работавшему системным администратором.
смещение приоритетов в более серьезную сторону, то Видимо, причина в типе мышления людей, выбирающих
представляется весьма неплохая картина для смены ос- эту специальность.
новной специализации. Работа у вас уже есть, нехватки Так в чем же дело? Может быть, пора перестать де-
свободного времени (как правило) нет, какие-никакие лать большие круглые глазки, встречая очередное объяв-
деньги компания ежемесячно вам «отслюнявит». Что ме- ление о поиске «человека-комбайна» и вплотную занять-
шает прекратить ныть о тяжести судьбы и начать менять ся своим будущим? Я понимаю, что возможность целыми
ситуацию хотя бы относительного себя самого? Думаю, днями фактически ничего не делать, а только сидеть на
что только лень. форумах и в чатах, для многих притягательна, но пора за-
Кем может быть человек, проработавший какое-то вре- думаться о том, чем это обернется в будущем. Огляни-
мя системным администратором? Да кем угодно! Более тесь вокруг, может быть, «ваша» специальность скрыва-
того, у системных администраторов зачастую даже боль- ется за соседним столом менеджера по работе с корпора-
ше возможностей найти специальность «под себя», так тивными клиентами.
как по воле работы им зачастую приходится поверхност- Мне приходилось слышать уверения вроде «я больше
но вникать в аспекты работы многих сотрудников. ничего делать не умею». Думаю, нетрудно вспомнить, что
Примером смены основного профиля может послужить когда-то вы и UNIX не смогли бы установить. Или вы ро-
ситуация, когда люди в процессе работы понимали, что дились, зная, как работать в шелле? Сомневаюсь.
общая деятельность компании им как минимум интерес- Специальность системного администрирования нельзя
на. Обычно впоследствии эти люди получали соответству- сравнивать со сферой коммунальных услуг, все-таки она
ющее их интересам образование (как вариант, если это требует некоторого интеллектуального труда, а не слепо-
возможно, прохождение нужных курсов) и, случалось, что го следования инструкциям. Но и рассматривать ее как
меняли род деятельности на совершенно иной. Так, на- постоянную специальность для состоявшегося человека,
пример, один мой знакомый, работавший в компании, за- мне кажется, не совсем правильно, так как эта профес-
нимающейся продажей мото- и автотехники, захотел быть сия не может дать достойного развития и карьерного рос-
руководителем отдела продаж (там и заработки выше, и та (повторюсь – за исключением редких случаев, рассмат-
работа много интересней, не говоря уже о различных пер- ривать которые я не берусь особенно в свете глобальной
спективах «полезных знакомств»). Получил образование, популяризации этой специальности) для действительно
прошел курсы менеджмента и сообщил своему началь- умного сотрудника.
ству о желании работать в новом качестве. Разумеется, Начальство зачастую и не подозревает, какие ценные
никто не назначил новоиспеченного менеджера руково- кадры скрыты в их компании до тех пор, пока вы сами это
дителем уже состоявшегося отдела в тот же миг, и ему им не покажете.
пришлось какое-то время работать, доказывая свою со- Может быть, уже пришло время активных действий,
стоятельность как исполнителя, так и руководителя. Од- чтобы не было мучительно больно за впустую потрачен-
нако для нас гораздо важнее то, что спустя всего полгода ные годы лет так через десять?

№7(20), июль 2004 5


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

ПОЧТОВАЯ СИСТЕМА НА БАЗЕ MTA EXIM

ВСЕВОЛОД СТАХОВ

6
администрирование
В этой статье пойдет речь о создании эффективного по- первых, надо очень четко представлять порядок сборки
чтового сервера на базе MTA exim. Первый вопрос, кото- различных компонентов. Во-вторых, необходимо разби-
рый, конечно же, приходит в голову – «Почему именно раться в куче опций для связки различных библиотек. В-
exim?». Отвечают на этот вопрос по-разному, поэтому я третьих, надо четко представлять себе все пути и знать,
скажу, что меня так привлекает в exim: каких пользователей надо добавлять. Ну и в-четвертых,
! логичная схема обработки почты; это дело очень сложно обновлять. Потому мы воспользу-
! высокая скорость работы; емся услугами системы портов (если у вас, например,
! удобный формат конфигурационного файла; Debian GNU Linux, то нужный пакет называется exim4-
! широчайшие возможности по поиску каких-либо зна- daemon-heavy).
чений в файлах, СУБД, LDAP; Для этого ставим следующие порты:
! встроенная поддержка smtp-аутентификации;
! небольшое число найденных уязвимостей (фактичес- databases/pogstgresql7
mail/exim
ки я знаю только об одной, найденной недавно, она ка-
салась версий exim до 4.20 включительно); при компиляции необходимо указать следующие опции:
! очень большое количество возможностей, а также
чрезвычайная гибкость; make WITH_PGSQL=yo
mail/p5-Mail-SpamAssassin
! возможность полной замены sendmail (т.е. можно сде- security/clamav
лать): mail/courier-imap

ln -sf /usr/local/sbin/exim /usr/libexec/sendmail при компиляции опять же указываем:

На мой взгляд, exim является весьма и весьма удач- make WITH_CRAM=yo WITH_POSTGRESQL=yo
mail/squirrelmail
ным продуктом, не зря он используется по умолчанию в
ОС Debian GNU Linux. Два больших минуса exim состоят в После сборки всего нужного переходим к стадии на-
том, что отсутствует качественная документация на рус- стройки. Тут придется затратить порядочное количество вре-
ском языке (этот недостаток я, возможно, постараюсь в мени на настройку всех компонентов почтовой системы, и
скором времени исправить написанием книги, посвящен- целью этой статьи является минимизация этого времени.
ной целиком и полностью этому замечательному MTA) и Итак, начнем с настройки СУБД PostgreSQL, как осно-
необходимость правки Makefile для включения тех или вы для построения почтовой системы. Во-первых, Postgre
иных возможностей exim. SQL работает с правами системного пользователя pgsql
Итак, для начала подумаем, что должна содержать (обратите внимание, этот пользователь имеет реальный
«идеальная» с точки зрения удобства администрирования shell и домашний каталог – /usr/local/pgsql). Поэтому для
и использования почтовая система. Сформулируем ряд начала задаем пароль для данного пользователя:
требований к почтовой системе:
! простота управления пользователями; # passwd pgsql
! возможность предоставления доступа для отправки по-
чты пользователям локальной сети и мобильным поль- Далее делаем su pgsql и начинаем создание базы дан-
зователям (при помощи smtp-аутентификации); ных:
! максимальная защита от хакерских атак, вирусов и спа-
ма. # su pgsql
% psql

Базовой системой для установки MTA явилась FreeBSD Вводим пароль пользователя pgsql и попадаем в ко-
5.2.1, что обусловило определенные особенности установ- мандную строку SQL-запросов. Для подробного ознаком-
ки. Перечислю весь набор программного обеспечения для ления с возможностями СУБД советую обратиться к ру-
организации mail-сервера: ководству или же одной из книг. Создаем БД:
! exim-4.34;
! MTA (mail transfer agent – агент передачи почты); CREATE DATABASE users;
! courier-3.0.4 – imap-сервер для доступа к почте поль-
зователей, не имеющих локальных пользовательских Присоединяемся к данной БД:
учетных записей (виртуальные пользователи);
! ClamAV – для поиска вирусов; \c users
! SpamAssasin – для поиска спамерских писем;
! PostgreSQL-7.4.2 – для хранения всех данных о пользо- Создаем таблицу пользовательских аккаунтов, а так-
вателях почтовой системы; же constraint для нее:
! SquirrelMail – просто приятный веб-интерфейс для по-
чты (требует веб-сервер и php). CREATE TABLE accounts (
uid serial NOT NULL,
login character varying(128),
Конечно, можно собрать все вышеперечисленные ком- "password" character varying(128),
maildir character varying(255),
поненты и вручную, но я не поклонник такого подхода. Во- gecos character varying(255),

№7(20), июль 2004 7


администрирование
gid integer DEFAULT 150, мет их допустимости для данного сервера. Этот этап мо-
home character varying(255), жет предваряться аутентификацией и установкой TLS-сес-
mailquota integer DEFAULT 20
); сии. Если пользователь прошел какой-либо из этих этапов,
ALTER TABLE ONLY accounts ему присваиваются определенные флаги, которые в даль-
ADD CONSTRAINT uid_k PRIMARY KEY (uid);
ALTER TABLE ONLY accounts нейшем могут использоваться на этапе проверки конвер-
ADD CONSTRAINT login_k UNIQUE (login); та. По умолчанию exim осуществляет проверку недопусти-
Создаем таблицу алиасов: мых символов в адресах и позволяет отправлять почту толь-
ко из локальных доменов и только на локальные домены.
CREATE TABLE aliases ( Кроме того, при успешной аутентификации письмо прохо-
mail character varying(128) NOT NULL,
alias character varying(128) дит и в Интернет. Для остальных писем релей (передача
); писем) запрещена. Все проверки в exim4 осуществляются
ALTER TABLE ONLY aliases
ADD CONSTRAINT mail_k PRIMARY KEY (mail); на основании механизма acl (access control list – список
доступа). Также может осуществляться проверка данных
Поясню назначение таблиц и полей: (этот механизм добавляется при установке патча exiscan,
! таблица accounts предназначена для хранения данных который при установке портов уже ставится). После успеш-
о виртуальных пользователях почтовой системы, на- ного прохождения этого этапа exim просматривает rewrite-
значение полей: правила для переписывания отдельных частей конверта
! uid – уникальный номер пользователя, имеет авто- (может использоваться в целях перенаправления всех пи-
инкрементный тип; сем на какой-либо смарт-хост, например). Далее письмо
! login – строка, содержащая имя пользователя в фор- попадает на цепочку так называемых роутеров, которые
мате «имя@домен» для возможности доставки по- определяют, как именно доставлять письмо. Среди роуте-
чты для пользователей различных доменов; ров фигурирует dnslookup, доставляющий письма на осно-
! password – пароль в открытом виде (для возможно- вании MX-записей в DNS, проверка файла алиасов и
сти безопасной cram-md5 аутентификации); .forward-файлов, ну и локальная доставка. Каждый роутер
! maildir – путь к почтовому ящику в формате maildir - имеет некое условие срабатывания и соответствующий
gecos – комментарий (для чего-нибудь да пригодит- транспорт. При выполнении условия exim выбирает указан-
ся); ный транспорт для доставки письма, иначе письмо прохо-
! gid – идентификатор группы (не нужен реально, но дит на следующий роутер (поэтому важен порядок описа-
зачем-то требуется для courier); ния роутеров в конфигурационном файле). Транспорты же
! home – аналогично gid; определяют порядок доставки письма. Таким образом,
! mailquota – число в мегабайтах, указывающее кво- настройка exim состоит из нескольких частей:
ту для пользователя; ! настройка глобальных параметров;
! таблица aliases представляет собой просто замену /etc/ ! настройка acl’s;
aliases, содержит два поля – mail (исходный адрес) и ! настройка роутеров;
alias (адрес для перенаправления). ! настройка транспортов;
! настройка аутентификаторов;
После этого будем считать, что PostgreSQL у нас ра- ! настройка очереди;
ботает. Однако для полного использования возможностей ! настройка rewrite-правил.
этой СУБД лучше почитать документацию.
Далее перейдем к настройке собственно MTA exim. В настройке exim широко используются различные
Конфигурационный файл для версии «из портов» хранит- списки (hostlist, domainlist и dnslist) и так называемые
ся в /usr/local/etc/exim/configure. Для начала я бы хотел lookup, при помощи которых exim извлекает данные из
пояснить значение некоторых терминов и рассказать о внешних источников.
базовых принципах работы exim. Многие мои знакомые, пытаясь освоить exim, считали
Представим себе путь прохождения любого почтового lookup самой запутанной темой, потому я остановлюсь на
сообщения. Любое письмо состоит из так называемого кон- этом вопросе чуть подробнее. Существует два типа поис-
верта и собственно данных. То, с чем мы привыкли рабо- ка: поиск по одному ключу (single-key) и поиск по запросу
тать в почтовых клиентах, как раз является «данными» и (query). Первый используется для поиска в локальных
не имеет к конверту никакого отношения. В конверте опи- файлах, а второй – в различного рода базах (sql, ldap и
сываются 2 параметра: mail from: и rcpt to:, которые указы- прочее). Любые lookup могут быть вложенными, то есть в
вают отправителя и получателей соответственно. Сеанс одном поиске используются результаты другого.
работы с MTA может предваряться «приветствием» – стан- Поиск на основе single key строится примерно так:
дартным (HELO) и расширенным (EHLO). В приветствии
должно указываться FQDN клиента, хотя по ряду причин ${lookup{$var_to_search}lsearch{/path/to/file}}
не стоит слишком строго следить за именно FQDN, т.к.
многие машины могут находиться за NAT. MTA в ответ на Особо следует отметить расставление фигурных ско-
HELO или EHLO сообщает о своих возможностях, обеспе- бок. Если вы знакомы с функциональными языками вро-
чивая тем самым синхронизацию клиента и сервера. Да- де лиспа, то такой синтаксис для вас будет привычен, ина-
лее exim осуществляет проверку целевых адресов на пред- че просто нужно считать каждую конструкцию списком,

8
администрирование
который обрабатывает exim. Тогда все строковые и дру- Заметьте необходимость замены пробелов на %20, как
гие константы тоже заключаются в фигурные скобки.То того требует стандарт. Более подробно обо всем этом
есть вышеприведенный пример можно рассматривать как: можно узнать на http://www.exim.org/exim-html-4.30/doc/
html/spec_9.html#CHAP9. Думаю, для дальнейшего пони-
$ñïèñîê -> ${lookup ñïèñîê} -> ${lookup {$var_to_search} ↵ мания статьи этого вполне достаточно.
driver{driver_arguments}}
Итак, собственно конфигурационный файл exim. Кое-
При этом сам файл, в котором осуществляется поиск, где я добавил свои комментарии, чтобы улучшить пони-
должен выглядеть так: мание различных директив.

$var_to_search: çíà÷åíèå ##########################################################


# Runtime configuration file for Exim #
##########################################################
Приведу более конкретный пример – построение спис-
# Çäåñü ìû îïðåäåëÿåì ìàêðîñû, îïèñûâàþùèå ðàçëè÷íûå ïóòè
ка доменов из файла на основании адреса отправителя
(пример из документации): CONFIG_PREFIX=/usr/local/etc/exim
ACL_PREFIX=CONFIG_PREFIX/acls
CERTDIR=CONFIG_PREFIX/certs
domainlist domains = ${lookup{$sender_host_address} ↵
lsearch{/some/file}} # Çäåñü ìû óêàçûâàåì, ãäå íàõîäèòü íàø PostgreSQL-ñåðâåð,
# ñîåäèíåíèå îñóùåñòâëÿåòñÿ ÷åðåç ëîêàëüíûé ñîêåò, êîìàíäà
при этом сам файл должен выглядеть следующим образом: # hide ïîìîãàåò ñïðÿòàòü ýòó íàñòðîéêó ïðè âûçîâå exim -bP,
# êîãäà exim âûâîäèò âñå êîíôèãóðàöèîííûå îïöèè â ñòàíäàðòíûé
# âûâîä. Ó÷òèòå, ÷òî ñàì /usr/local/etc/exim/configure äîëæåí
192.168.3.4: domain1 : domain2 : ... # èìåòü âëàäåëüöà root:wheel è èìåòü ïðàâà äîñòóïà 0600, ÷òî
192.168.1.9: domain3 : domain4 : ... # îòëè÷àåòñÿ îò òîãî, ÷òî ïðèíÿòî ïî óìîë÷àíèþ (0644)
hide pgsql_servers = (/tmp/.s.PGSQL.5432)/users/pgsql/pAsSwOrD
При этом поиск осуществляется по первому полю. Отли-
# Òóò ìû îïèñûâàåì ñïèñêè äîìåíîâ
чие query-style-поиска в том, что мы явно не обозначаем, # Local_domains âêëþ÷àåò äîìåíû, ñ÷èòàþùèåñÿ ëîêàëüíûìè, òî
что искать, указывая вместо этого запрос. Так выглядит # åñòü òå äîìåíû, äëÿ êîòîðûõ exim äåëàåò ëîêàëüíóþ äîñòàâêó,
# äëÿ îñòàëüíûõ äîìåíîâ ïî÷òà äîñòàâëÿåòñÿ ïî MX çàïèñÿì â DNS.
типичный запрос к SQL-базе: # Îáðàòèòå âíèìàíèå íà äîïîëíèòåëüíûå ôàéëû ACL_PREFIX/localdomains
# è ACL_PREFIX/hostingdomains, â êîòîðûõ ïåðå÷èñëåíû äîìåíû,
${lookup driver{query}{action_if_query_succeed} ↵ # ðàçäåëåííûå ïåðåâîäîì ñòðîêè (òî åñòü ïî îäíîìó äîìåíó íà
{action_if_query_failed}} # êàæäóþ ñòðîêó)
domainlist local_domains = unona.test.ru : ↵
ACL_PREFIX/localdomains : ACL_PREFIX/hostingdomains
Например: # Äîïîëíèòåëüíàÿ íàñòðîéêà
domainlist hosting_domains = ACL_PREFIX/hostingdomains
domainlist domains = ${lookup pgsql{select domains from ↵ # Ñïèñîê õîñòîâ, ïî÷òó íà êîòîðûå ìû ÿâíî îòâåðãàåì
domains where sender='$sender_host_address'}{$value}fail} hostlist host_reject = ACL_PREFIX/hostreject
domainlist relay_to_domains =
# Ñïèñîê àäðåñîâ, ñ êîòîðûõ ðàçðåøåíà ïåðåäà÷à ïî÷òû âî
При успешном выполнении запроса возвращается зна- # âíåøíèé ìèð
чение из базы, иначе совершается специальное действие hostlist relay_from_hosts = localhost : 192.168.1.0/24 : ↵
ACL_PREFIX/relayfromhosts
fail, означающее неудачный запрос.
Несколько пугающими бывают запросы к LDAP. Раз- # Ïðîâåðêà ïîëó÷àòåëÿ
acl_smtp_rcpt = acl_check_rcptú
беру их поподробнее. Указание сервера и порта LDAP выг- # Ïðîâåðêà mime ñîäåðæèìîãî
лядит следующим образом: acl_smtp_mime = acl_check_mime
# Ïðîâåðêà íà ñïàì è âèðóñû
acl_smtp_data = acl_check_virus
ldap_default_servers = 127.0.0.1::389
# Çäåñü ìû îïèñûâàåì íàø àíòèâèðóñ
av_scanner = clamd:127.0.0.1 3310
Запросы к директории выглядят так: # È spamassasin
spamd_address = 127.0.0.1 783
# Íàñòðîéêè ïîëüçîâàòåëÿ è ãðóïïû ïî óìîë÷àíèþ
${lookup ldap{ldap://ldap.test.ru/dc=${domain},ou=mail, ↵ exim_user = mailnull
o=tehnopark?mail?sub?(&(objectClass=inetOrgPerson) ↵ exim_group = mail
(mail=${local_part}@${domain}))}{$value} fail} # Íèêîãäà íå îñóùåñòâëÿåì äîñòàâêó ïîä ðóòîì - root äîëæåí
# áûòü àëèàñîì íà äðóãîãî ëîêàëüíîãî ïîëüçîâàòåëÿ. Êñòàòè,
# ýòî îáÿçàòåëüíîå óñëîâèå, çàäàííîå åùå íà ýòàïå êîìïèëÿöèè
Форма запроса описана в стандарте, но, думаю, ее сто- never_users = root
ит дополнительно пояснить. В запросе мы указываем ад-
# Íàñòðîéêè äèðåêòîðèè äëÿ î÷åðåäè
рес LDAP-сервера (ldap://ldap.test.ru/), basedn для поиска spool_directory = /var/spool/exim
(dc=${domain},ou=mail,o=tehnopark), значение, которое # Ðàçäåëÿåì spool_directory íà íåñêîëüêî áîëåå ìàëåíüêèõ,
# àíàëîã õåø-òàáëèöû, óñêîðÿåò îáðàáîòêó spool
нужно вернуть (mail), описание запроса (также в постфик- split_spool_directory
сной форме, характерной для функциональных языков:
# Ïûòàåìñÿ ñäåëàòü ñîîòâåòñòâèå ïðÿìîé è îáðàòíîé çîíû DNS
(&(objectClass=inetOrgPerson)(mail=${local_part}@${domain}))). # äëÿ êàæäîãî õîñòà. Íåñêîëüêî çàòðàòíî, íî âåñüìà ïîëåçíî
Когда требуется аутентификация на сервере, тогда host_lookup = *
просто указываем нечто вроде: # Óáèðàåì ïðîâåðêó identd íà êëèåíòñêîé ñòîðîíå. Èç-çà
# íåïðàâèëüíî íàñòðîåííûõ firewall ýòî ÷àñòî âûçûâàåò
${lookup ldap # äëèòåëüíûå òàéì-àóòû, êðîìå òîãî, ýòîò ñåðâèñ ïîäíÿò
{user="cn=manager,o=tehnopark of innovation,c=RU" pass=secret # íå ó ìíîãèõ
rfc1413_query_timeout = 0s
ldap:///o=tehnopark%20of%20innovation,c=RU?sn?sub?(cn=foo)}
{$value}fail}
# Óêàçûâàåì êîå-êàêèå ëèìèòû (èõ íàçíà÷åíèå ÿñíî èç íàçâàíèÿ)

№7(20), июль 2004 9


администрирование
smtp_accept_max = 50 # Ïðèíèìàåì ëþáûå ñîåäèíåíèÿ, êîòîðûå áûëè óñïåøíî
smtp_connect_backlog = 40 # àâòîðèçîâàíû
smtp_accept_max_per_host = 10 accept authenticated = *
smtp_accept_queue = 22
smtp_accept_queue_per_connection = 10 # Ðåàëèçàöèÿ íàøåãî áàí-ëèñòà
recipients_max = 16 deny hosts = +host_reject
recipients_max_reject = true message = You are banned. Go away.
message_size_limit = 16M # Çàïðåùàåì âñå, ÷òî íå ðàçðåøåíî, çàêðûâàÿ òåì ñàìûì ðåëåé
accept_8bitmime # äëÿ ñïàìåðîâ
deny message = relay not permitted
# Èãíîðèðóåì ñîîáùåíèÿ, êîòîðûå ïðèõîäÿò íàì æå, äàâíîñòü
# êîòîðûõ áîëåå 12 ÷àñîâ
ignore_bounce_errors_after = 12h # Ñïèñîê äîñòóïà äëÿ ïðîâåðêè mime-÷àñòåé ñîîáùåíèÿ
acl_check_mime:
# Óäàëÿåì çàìîðîæåííûå ñîîáùåíèÿ, äàâíîñòü êîòîðûõ áîëüøå
# íåäåëè. # Ïðîèçîäèì äåêîäèðîâàíèå mime-ñîîáùåíèé. Ïîëåçíî äëÿ
timeout_frozen_after = 7d # äàëüíåéøåé ïðîâåðêè íà âèðóñû
warn decode = default
# Íàñòðîéêè TLS
tls_certificate = CERTDIR/mailed.crt # Ìîæíî î÷åíü áûñòðî îòñåÿòü ñîîáùåíèÿ, ïðîñòî çàïðåòèâ
tls_privatekey = CERTDIR/mailed.key # íåêîòîðûå mime-âëîæåíèÿ, ÷àùå âñåãî ñîäåðæàùèå âèðóñû,
tls_advertise_hosts = * # õîòÿ, êîíå÷íî, ýòî íå ïàíàöåÿ
tls_verify_certificates = * deny message = Blacklisted file extension detected
# Ñëåäóþùàÿ îïöèÿ çàêîììåíòèðîâàíà, íî âåñüìà ïîëåçíà, condition = ${if match {${lc:$mime_filename}} ↵
# ïîçâîëÿÿ àâòîðèçèðîâàòüñÿ {\N(\.wav|\.cpl|\.pif| ↵
# òîëüêî ÷åðåç áåçîïàñíûé ssl-êàíàë \.bat|\.scr|\.lnk| ↵
#auth_advertise_hosts = ${if eq{$tls_cipher}{}{}{*}} \.com)$\N} {1}{0}}

# Ìíîãî ëè ó íàñ ëþäåé, çíàþùèõ êèòàéñêèé? À âîò êèòàéñêîãî


########################################################## # ñïàìà ýòî ïîóáàâèò
# ACL CONFIGURATION # deny message = Sorry, noone speaks chinese here
# Specifies access control lists for incoming SMTP mail # condition = ${if eq{$mime_charset}{gb2312}{1}{0}}
######################################################################
accept
begin acl
# Ïðîâåðêà ñîäåðæèìîãî íà âèðóñû è ñïàì
# Ýòîò ñïèñîê äîñòóïà îïèñûâàåò ïðîâåðêè, îñóùåñòâëÿåìûå acl_check_virus:
# ïðè âûçîâå ëþáîé RCPT-êîìàíäû # Ìû íå çàïðåùàåì ïèñüìà ñî ñïàìîì, à ïðîñòî äîáàâëÿåì
acl_check_rcpt: # çàãîëîâîê, ñîäåðæàùèé êîëè÷åñòâî ñïàìåðñêèõ î÷êîâ,
# à ïîëüçîâàòåëü íà ñâîåé ñòîðîíå óæå ïðîñòî íàñòðàèâàåò
# Âíà÷àëå ïðîâåðÿåì äîñòîâåðíîñòü îòïðàâèòåëÿ # ñâîè ôèëüòðû. Òàê ìû èñêëþ÷àåì æàëîáû ñî ñòîðîíû
require verify = sender # ïîëüçîâàòåëåé î ïîòåðÿííûõ ïèñüìàõ
# Ïðèíèìàåì ñîåäèíåíèÿ îò ëîêàëüíûõ MUA (òî åñòü íå ÷åðåç TCP/IP) warn message = X-Spam-Score: $spam_score ($spam_bar)
accept hosts = : spam = nobody:true
##########################################################
# Ïðîâåðêà ñîîòâåòñòâèÿ ïî÷òîâîãî àäðåñà ñòàíäàðòó # Äîáàâëÿåì çàãîëîâêè, óêàçûâàþùèå, ÷òî ïèñüìà áûëè ïðîâåðåíû
deny message = Restricted characters in address # SpamAsssasin
domains = +local_domains warn message = X-Spam-Scanned: Yes
local_parts = ^[.] : ^.*[@%!/|] warn message = X-Spam-Scanner: SpamAssassin running ↵
accept domains = +local_domains on mail.test.ru
# Çäåñü ïðîïèñàíû òàê íàçûâàåìûå dnsbl, òî åñòü ÷åðíûå
# ñïèñêè MTA ñ îòêðûòûì ðåëååì, ìû ïðîâåðÿåì IP-àäðåñ # Âîò ÷òî-÷òî, à âèðóñû íàì íå íóæíû
# îòïðàâèòåëÿ íà ñîîòâåòñòâèå òàêèì ñïèñêàì è áëîêèðóåì ïèñüìî, deny message = Message rejected: virus found.
# åñëè îòïðàâèòåëü áûë íàéäåí â òàêîì ñïèñêå Your message was successfully
deny message = host is listed in $dnslist_domain trashed.
dnslists = blackholes.mail-abuse.org: ↵ hosts = *
dialups.mail-abuse.org: ↵ malware = *
relays.mail-abuse.org: ↵ accept
relays.ordb.org: ↵
work.drbl.caravan.ru: ↵
dul.ru:sbl.spamhaus.org ##########################################################
# ROUTERS CONFIGURATION #
# Ïðàâèëî íà ïðîâåðêó âñåõ ïî÷òîâûõ àäðåñîâ, êðîìå ëîêàëüíûõ # Specifies how addresses are handled #
# (ìåíåå ñòðîãîå) ##########################################################
deny message = Restricted characters in address # THE ORDER IN WHICH THE ROUTERS ARE DEFINED IS IMPORTANT!#
domains = !+local_domains # An address is passed to each router in turn until it is #
local_parts = ^[./|] : ^.*[@%!] : ^.*/\\.\\./ # accepted. #
########################################################## ######################################################################
# Ïðèíèìàåì ïî÷òó äëÿ ïîëüçîâàòåëÿ postmaster ëîêàëüíûõ
# äîìåíîâ, íå âçèðàÿ íà îòïðàâèòåëÿ begin routers
accept local_parts = postmaster
domains = +local_domains # Ðîóòåð, îñóùåñòâëÿþùèé ïîèñê ïî MX-çàïèñÿì â DNS
dnslookup:
# Deny unless the sender address can be verified driver = dnslookup
domains = ! +local_domains
accept domains = +local_domains transport = remote_smtp
endpass ignore_target_hosts = 0.0.0.0 : 127.0.0.0/8
verify = recipient no_more
# Åñëè äîìåí â ñïèñêå relay_to_domains, òî ðàçðåøàåì ðåëåé # Âñå îñòàíëüíûå ðîóòåðû îáñëóæèâàþò äîñòàâêó ëîêàëüíîé ïî÷òû
accept domains = +relay_to_domains # Äðàéâåð àëèàñîâ ïîëüçîâàòåëÿ. Îáðàòèòå âíèìàíèå íà lookup
endpass # â pgsql-áàçå. ×òî èíòåðåñíî, ýòîò lookup ðàáîòàåò äàæå äëÿ
verify = recipient # èåðàðõè÷åñêèõ àëèàñîâ, íàïðèìåð, postmaster -> root ->
accept domains = +hosting_domains # cebka -> cebka@jet.msk.su Òàêæå îïðåäåëÿþòñÿ òðàíñïîðòû
endpass # äëÿ ïåðåäà÷è ïî÷òû â ôàéë (>/path/to/file) è â pipe
verify = recipient # (|/usr/local/libexec/slocal)
system_aliases:
accept hosts = +relay_from_hosts driver = redirect

10
администрирование
allow_fail server.\n\
allow_defer This means, that your mailbox is 75% full. If you would \n\
data = ${lookup pgsql{select alias from aliases where ↵ override this limit new mail would not be delivered ↵
mail ='$local_part@$domain'}{$value}fail} to you!\n"
user = mailnull quota_warn_threshold = 75%
group = mail
file_transport = address_file # Òðàíñïîðò, îñóùåñòâëÿþùèé äîñòàâêó â pipe
pipe_transport = address_pipe address_pipe:
driver = pipe
# Äëÿ ëîêàëüíûõ ïîëüçîâàòåëåé òàêæå ñîçäàåì âîçìîæíîñòü return_output
# ïåðåíàïðàâëåíèÿ ïî÷òû ÷åðåç ~/.forward-ôàéë. Åñëè âêëþ÷åíà
# äèðåêòèâà allow_filter, òî â .forward-ôàéëå ìîæíî # Òðàíñïîðò, îñóùåñòâëÿþùèé äîñòàâêó ïðÿìî â ôàéë
# èñïîëüçîâàòü ÿçûê sieve-ôèëüòðîâ. Äëÿ ïîäðîáíîñòåé address_file:
# ñì. äîêóìåíòàöèþ íà www.exim.org, ò.ê. íà ðàññìîòðåíèå driver = appendfile
# ýòîé òåìû óéäåò ñëèøêîì ìíîãî âðåìåíè delivery_date_add
userforward: envelope_to_add
driver = redirect return_path_add
check_local_user
file = $home/.forward # Ýòîò òðàíñïîðò èñïîëüçóåòñÿ äëÿ àâòîìàòè÷åñêîãî îòâåòà íà
no_verify # ñîîáùåíèÿ îá îøèáêàõ
no_expn address_reply:
check_ancestor driver = autoreply
# allow_filter
file_transport = address_file
pipe_transport = address_pipe ##########################################################
reply_transport = address_reply # RETRY CONFIGURATION #
condition = ${if exists{$home/.forward} {yes} {no} } ##########################################################
# Ëîêàëüíàÿ äîñòàâêà, åñëè äàííûé ïîëüçîâàòåëü íàéäåí â áàçå begin retry
localuser: # Íàñòðîéêè ïî óìîë÷àíèþ, êîòîðûå ÿ íå òðîãàë, óïðàâëÿþò
driver = accept # èíòåðâàëîì ïîâòîðíîé ïåðåäà÷è ñîîáùåíèé
condition = ${lookup pgsql {select uid from accounts where ↵
login = '$local_part@$domain'}{yes}{no}} # This single retry rule applies to all domains and all
transport = local_delivery # errors. It specifies retries every 15 minutes for 2 hours,
cannot_route_message = Unknown user # then increasing retry intervals, starting at 1 hour and
# increasing each time by a factor of 1.5, up to 16 hours,
# then retries every 6 hours until 4 days have passed since
########################################################## # the first failed delivery.
# TRANSPORTS CONFIGURATION #
###################################################################### # Address or Domain Error Retries
# ORDER DOES NOT MATTER # # ----------------- ----- -------
#Only one appropriate transport is called for each delivery.#
###################################################################### * * F,2h,15m; G,16h,1h,1.5; F,4d,6h
begin transports
##########################################################
# Äðàéâåð äëÿ äîñòàâêè ÷åðåç ñîåäèíåíèÿ ñ óäàëåííûìè # REWRITE CONFIGURATION #
# smtp-ñåðâåðàìè ##########################################################
remote_smtp:
driver = smtp begin rewrite
# Ýòîò òðàíñïîðò äîñòàâëÿåò ïî÷òó â ëîêàëüíûå maildir. Ïóòü # Ñîçäàåì ïðàâèëî ïî ïåðåïèñûâàíèþ çàãîëîâêà To: ñ *@test.ru
# ê maildir õðàíèòñÿ îïÿòü æå â òàáëèöå accounts. Ðàçðåøåíèÿ # íà ëîêàëüíûé smart-host - @unona.test.ru. Ýòî áûëî ñäåëàíî
# íà äèðåêòîðèþ 0700 äëÿ âîçìîæíîñòè ðàáîòû ñ äàííûìè # äëÿ ëîêàëüíûõ ïîëüçîâàòåëåé, ïî èäåå ñ õðàíåíèåì
# äèðåêòîðèÿìè imap-ñåðâåðà. Ïðè ýòîì âëàäåëüöåì ÿâëÿåòñÿ # ïîëüçîâàòåëåé â postgres óæå íå íóæíî, ïîêàçàíî äëÿ ïðèìåðà.
# ãðóïïà è ïîëüçîâàòåëü èç accounts (ïîòîìó ïðè âêëþ÷åíèè *@test.ru $1@unona.test.ru T
# çàïèñåé â ýòó òàáëèöó íàäî íà÷èíàòü çíà÷åíèÿ uid
# ñ äîñòàòî÷íî áîëüøîãî ÷èñëà, íàïðèìåð, 2000 è ïåðåñåêàòüñÿ
# ñ ðåàëüíûìè ïîëüçîâàòåëÿìè îíî äîëæíî, òîëüêî åñëè ðåàëüíîìó ##########################################################
# ïîëüçîâàòåëþ íóæåí ëîêàëüíûé äîñòóï ê maildir). # AUTHENTICATION CONFIGURATION #
# Òàêæå èç òàáëèöû accounts èçâëåêàþòñÿ äàííûå î ðàçìåðå ##########################################################
# êâîòû, è óñòàíàâëèâàåòñÿ ïîðîã â 75% îò êâîòû, êîãäà
# ïîëüçîâàòåëþ ïîñûëàåòñÿ óêàçàííîå ïðåäóïðåæäåíèå îá ïîäõîäå # Îïèñàíèÿ àóòåíòèôèêàöèè
# ê ïîðîãó êâîòû
local_delivery: begin authenticators
driver = appendfile # CRAM-MD5-àóòåíòèôèêàöèÿ, òðåáóåò íàëè÷èÿ ïàðîëÿ â îòêðûòîì
directory = ${lookup pgsql{select maildir from accounts ↵ # âèäå, èìÿ ïîëüçîâàòåëÿ äîëæíî áûòü â ôîðìàòå user@domain,
where login = '$local_part@$domain'}{$value}fail} # êàê îíî õðàíèòñÿ â òàáëèöå accounts
create_directory lookup_cram:
directory_mode = 0770 driver = cram_md5
maildir_format public_name = CRAM-MD5
delivery_date_add server_secret = ${lookup pgsql {select password from ↵
envelope_to_add accounts where login='$1'}{$value}fail}
return_path_add server_set_id = $1
group = ${lookup pgsql{select gid from accounts where ↵ # LOGIN-àóòåíòèôèêàöèÿ - íå òðåáóåò õðàíåíèÿ ïàðîëÿ
login = '$local_part@$domain'}{$value}fail} # â îòêðûòîì âèäå, îäíàêî, ïî ñåòè ïàðîëü ïåðåäàåòñÿ
user = ${lookup pgsql{select uid from accounts where ↵ # â îòêðûòîì âèäå - òðåáóåòñÿ ëèøü âûïîëíåíèå óñëîâèÿ
login = '$local_part@$domain'}{$value}fail} # server_condition - $1 - èìÿ ïîëüçîâàòåëÿ, à $2 - ïàðîëü.
mode = 0660 # LOGIN áåçîïàñåí òîëüêî ïðè óñòàíîâëåíèè ssl-ñîåäèíåíèÿ.
no_mode_fail_narrower login:
quota = ${lookup pgsql{select mailquota from accounts ↵ driver = plaintext
where login = '$local_part@$domain'}{$value}fail}M public_name = LOGIN
quota_warn_message = "\ server_prompts = Username:: : Password::
To: $local_part@domain\n\ server_condition = ${lookup pgsql {select login from ↵
From: postmaster@test.ru\n\ accounts where login='$1' and password='$2'}{yes}{no}}
Subject: Your maildir is going full\n\ server_set_id = $1
This message is automaticaly gnerated by your mail ↵

№7(20), июль 2004 11


администрирование
########################################################## Этот файл указывает настройки для программы freshclam,
# CONFIGURATION FOR local_scan() # использующейся для обновления антивирусных баз ClamAV.
##########################################################
# If you have built Exim to include a local_scan() function
# that contains tables for private options, you can define
# those options here. Remember to uncomment the "begin"
# line. It is commented by default because it provokes
# an error with Exim binaries that are not built with
# LOCAL_SCAN_HAS_OPTIONS set in the Local/Makefile.
# begin local_scan

# End of Exim configuration file

Далее необходимо создать сертификат для smtp-сер-


вера. В ходе эксплуатации выяснилось, что некоторые кли-
енты, например, The Bat!, требуют, чтобы в CN-сертифика-
те (подробнее о сертификатах и способах их генерации мож-
но прочитать в моей статье из данного журнала, распола-
гающейся по адресу http://cebka.pp.ru/my/openssl.txt) содер-
жалось имя (FQDN) сервера. Например, для сервера на
mail.test.ru серификат должен содержать CN: mail.test.ru.
Содержание остальных полей некритично. Создать сер-
тификат можно, например, так:
SpamAssassin работает без дополнительных настроек.
# openssl genrsa -out mailed.key 2048
# openssl req -new -x509 -key mailed.key -days 365 -out mailed.crt

При этом все поля сертификата будут запрошены. Уч-


тите, что файл секретного ключа не должен быть зашиф-
рован, иначе exim не сможет его прочитать, просто уста-
новите владельцем этого файла root:wheel и установите
права 0600. После этого можно попробовать запустить
exim в режиме отладки:

exim -bd -d+all

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


чить exim вместо sendmail, выполняем следующие дей-
ствия: в файле /etc/rc.conf нужны строки:

sendmail_enable="NONE"
exim_enable="YES"
# À òàêæå äëÿ spamassasin è clamav:
clamav_clamd_enable="YES"
spamd_enable="YES"
Перейдем к следующей части – настройка courier. Этот
Затем настраиваем доставку почты для локальных при- imap-сервер для своей работы использует несколько про-
ложений через exim, для чего файл /etc/mail/mailer.conf у цессов, которые, в свою очередь, настраиваются из раз-
нас должен выглядеть следующим образом: личных конфигурационных файлов. В моем примере за-
пущено 3 процесса – authdaemon, courier-imapd и courier-
sendmail /usr/local/sbin/exim imapd-ssl. Причем во внешний мир открыт только courier-
send-mail /usr/local/sbin/exim
mailq /usr/local/sbin/exim imapd-ssl. Для начала создадим сертификат для imapd-ssl
newaliases /usr/local/sbin/exim и для TLS-соединений с imapd: правим файл /usr/local/etc/
hoststat /usr/local/sbin/exim
purgestat /usr/local/sbin/exim couier-imap/imapd.cnf на предмет своего dn для сертифи-
ката, для чего в части req_dn прописываем свои настрой-
После этого перейдем к настройке ClamAV: заходим в ки (не забудьте, что cn должен совпадать с FQDN imap-
/usr/local/etc/ и копируем clamav.conf.sample в clamav.conf сервера):
и правим его таким образом, чтобы он принимал соеди-
нения через tcp/ip, а не через локальный сокет, для чего в [ req_dn ]
clamav.conf нужны следующие строки: C=RU
ST=Moskow region
TCPSocket 3310 L=Moskow
TCPAddr 127.0.0.1 O=Tehnopark
OU=Internet technologies
CN=test.ru
Далее копируем freshclam.conf.sample в freshclam.conf. emailAddress=postmaster@test.ru

12
администрирование
Далее генерируем сертификат специальным скриптом: или из-под непосредственно DocumentRoot самого apache.
Вот в принципе, и все.
cd /usr/local/share/courier-imap/
./mkimapdcert

После чего настроим imap-аутентификацию:

cd /usr/local/etc/courier-imap/
cp authdaemonrc.dist authdaemonrc

Далее в authdaemonrc заменяем список модулей для


аутентификации на:

authmodulelist="authpgsql"

Теперь courier знает, что ему нужно аутентифициро-


ваться через pgsql. Надо только настроить сам pgsql-мо-
дуль, настройки которого хранятся в authpqsqlrc. Он дол-
жен содержать следующее:

# Ñîåäèíÿåìñÿ ñ ÑÓÁÄ ÷åðåç ëîêàëüíûé ñîêåò (íå óêàçàí àäðåñ)


PGSQL_PORT 5432
PGSQL_USERNAME pgsql
PGSQL_PASSWORD pAsSwOrD Есть некоторые особенности запуска SquirrelMail при
PGSQL_DATABASE users
включенном safe_mode в php. Во-первых, все php-файлы и
# Íàñòðîéêè òàáëèöû äëÿ àóòåíòèôèêàöèè, çäåñü ìû óêàçûâàåì, каталоги SquirrelMail должны принадлежать тому пользова-
# â êàêèõ ïîëÿõ òàáëèöû õðàíÿòñÿ ðàçëè÷íûå ïîëüçîâàòåëüñêèå
# äàííûå: телю, из-под которого работает apache (настройка VirtualHost
PGSQL_USER_TABLE accounts или глобальная, по умолчанию – www:nogroup). Кроме того,
PGSQL_CLEAR_PWFIELD password
DEFAULT_DOMAIN test.ru необходимо сменить разрешения в /var/spool/squirrelmail:
PGSQL_UID_FIELD uid
PGSQL_GID_FIELD gid # chmod 1777 /var/spool/squirrelmail/attach
PGSQL_LOGIN_FIELD login # chmod 1777 /var/spool/squirrelmail/pref
PGSQL_HOME_FIELD home
PGSQL_NAME_FIELD gecos
PGSQL_MAILDIR_FIELD maildir Ну и владельца установить того же, что и на /usr/local/
www/squirrelmail.
Перейдем к настройке непосредственно imapd: скопири- Комментарии вы можете присылать на cebka@jet.msk.su.
уем imapd.dist в imapd. Правим следующие строчки (для ос-
тальных настроек вполне подходят значения по умолчанию): Cписок полезных ссылок:
1. http://www.exim.org – сайт MTA exim, очень хорошая и
# imapd ñëóøàåò òîëüêî íà ëîêàëüíîì àäðåñå, äëÿ âíåøíèõ подробная документация;
# ñîåäèíåíèé ìû áóäåì èñïîëüçîâàòü imapd-ssl
ADDRESS=127.0.0.1 2. ftp://ftp.exim.org/pub/exim/config.samples.tar.bz2 – приме-
ры разнообразных конфигурационных параметров, по-
# Ïî óìîë÷àíèþ â NO, äåëàåì â YES, ÷òîáû imapd ìîã çàïóñêàòüñÿ
IMAPDSTART=YES лезно для ознакомления;
3. http://duncanthrax.net/exiscan-acl/ – патч exiscan с сопут-
Этих настроек в принципе хватает. Далее копируем ствующей документацией;
imapd-ssl.dist в imapd-ssl и правим следующие строчки: 4. http://www.clamav.net – сайт свободного антивируса
ClamAV;
IMAPDSSLSTART=YES 5. http://www.spamassasin.org – официальный сайт
SpamAssasin;
После чего делаем запуск courier-imap при старте сис- 6. http://www.courier-mta.org – ресурс courier продуктов, в
темы. Для этого заходим в /usr/local/etc/rc.d и снова не- том числе и courier-imap;
много попереименовываем файлы: 7. http://www.squirrelmail.org – сайт web-mail-системы
SquirrelMail;
# mv courier-imap-imapd-ssl.sh.sample courier-imap-imapd-ssl.sh 8. http://www.nixp.ru/cgi-bin/go.pl?q=articles;a=mta-home –
# mv courier-imap-imapd.sh.sample courier-imap-imapd.sh
exim+mutt+bmx – для домашней почтовой системы (хо-
После этого считаем, что наша почтовая система прак- рошая и интересная статья);
тически готова. Нужно только немного понастраивать 9. http://tomster.org/geek/freebsdcookbook/ – альтернатив-
SquirrelMail, для чего заходим в /usr/local/www/squirrelmail ный вариант реализации почтовой системы, где вмес-
и запускаем скрипт ./configure. В принципе интерфейс кон- то courier используется cyrus imapd;
фигурации понятен без лишних пояснений, потому я не 10. http://cebka.pp.ru/samag/clamstat.tar.bz2 – скрипт стати-
буду особо останавливаться на этой проблеме (не забудь- стики ClamAV;
те, главное, указать imap- и smtp-сервера). Делаем сим- 11. http://cebka.pp.ru/samag/uidchk.pl – скрипт проверки
линк на /usr/local/www/squirrelmail из какого-либо VirtualHost пересечения uid из БД и системных.

№7(20), июль 2004 13


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

НАСТРОЙКА ПОЧТОВОЙ СИСТЕМЫ НА БАЗЕ


Postfix + Dovecot + PostgreSQL + Amavisd-new +
SpamAssassin + ClamAV
В данной статье будет рассмотрена установка почтового сервера на базе AltLinux Master 2.2
с использованием пакетов из репозитария Sisyphus. Наша система обеспечит поддержку виртуальных
доменов в связке Postfix + Dovecot + PgSQL с защитой от спама и вирусов с помощью SpamAssasin
и ClamAV.
РУСТАМ АТНАГУЛОВ
Итак, посмотрим, для чего предназначен каждый из этих Создадим пользователя mailuser в базе данных Postgre
компонентов SQL, c правами которого Postfix и Dovecot будут подклю-
! Postfix (http://postfix.org) – это популярный MTA (Mail чаться к базе данных и выполнять запросы:
Transfer Agent), позволяющий эффективно передавать
письма адресатам. [root@mosqit /]# createuser -U postgres
! Dovecot (http://dovecot.org) – Secure IMAP server. IMAP-
сервер, рассчитанный на максимальную безопасность
и надежность. Преимуществом этой программы явля-
ется то, что для поиска в больших файлах применяется
бинарный древовидный индекс. Как указывает автор Устанавливаем пароль пользователю mailuser:
этого сервера, он тестировал его с 367 000 почтовыми
учетными записями и не обнаружил проблем. Также про- [root@mosqit /]# psql -U postgres template1
грамма может обслуживать запросы пользователей с
помощью протоколов imap, imaps, pop3, pop3s.
! ClamAV (http://clamav.sourceforge.net) – opensource-ан-
тивирус.
! SpamAssasin (http://spamassasin.org) – почтовый фильтр.
Предназначен для борьбы со спамом.
! Amavisd-new (http://www.ijs.si/software/amavisd) – высо-
коэффективный и надежный интерфейс между MTA и
одним или несколькими фильтрами содержимого: ви-
русные сканеры, спам-фильтры (в нашем случае Spam
Assassin). Amavisd-new написан на Perl, обеспечиваю-
щим высокую надежность, мобильность и ремонтоп-
ригодность. Он взаимодействует с MTA через (E) SMTP
или LMTP или при использовании программ-посред- Следующий этап – это создание базы данных, в кото-
ников. рой будет все храниться.

Сначала устанавливаем все необходимые пакеты из [root@mosqit /]# createdb -U postgres mails
репозитария:

[root@mosqit /]# apt-get install postfix postfix-pgsql ↵ База данных mails создана. Далее создаем в ней таб-
postgresql postgresql-server dovecot amavisd ↵
clamav spamassasin лицы. Есть 2 способа: писать SQL-команды руками в кли-
енте postgresql или приготовить файл с SQL-запросом, а
Далее переходим к конфигурированию нашей почтовой потом создать структуру таблиц, выполнив этот самый
системы. Создаем пользователя, от имени которого бу- запрос.Я выбираю последний способ. Создаем файл
дет работать наша почтовая система: createtables.sql:

[root@mosqit /]# groupadd -g 5000 mailuser CREATE TABLE "public"."users" (


[root@mosqit /]# adduser -d /var/spool/mail -M -g mailuser ↵ "userid" VARCHAR(128) NOT NULL,
-s /sbin/nologin -u 5000 mailuser "password" VARCHAR(128),
"realname" VARCHAR(128),
"uid" INTEGER NOT NULL,
"gid" INTEGER NOT NULL,
PostgreSQL "home" VARCHAR(128) NOT NULL,
"mail" VARCHAR(255),
Настройку и конфигурирование PostgreSQL не привожу, CONSTRAINT "users_pkey" PRIMARY KEY("userid")
т.к. информации об этом предостаточно. ) WITHOUT OIDS;

14
администрирование
grant select on users to mailuser; queue_directory = /var/spool/postfix
mail_owner = postfix
CREATE TABLE "public"."aliases" ( # Ýòîò ïàðàìåòð îòíîñèòñÿ ê Amavisd
"alias" VARCHAR(128) NOT NULL, # Ïîêà êîììåíòèðóåì, ÷òîáû ìîæíî áûëî ïðîâåðèòü
"dest" VARCHAR(128) NOT NULL, # ðàáîòîñïîñîáíîñòü postfix.
"comment" TEXT DEFAULT ''::text #content_filter=smtp-amavis:[127.0.0.1]:10024
) WITH OIDS;
grant select on aliases to mailuser;
Остальные параметры по умолчанию, но их можно из-
менить по собственному усмотрению.
Структура таблиц создана: Далее редактируем конфигурационный файл master.cf:

[root@mosqit /]# /usr/bin/psql -U postgres mails < createtable.sql master.cf:

Запускаем PostgreSQL:

[root@mosqit /]# service postgresql start

Postfix
Переходим к правке конфигурационного файла main.cf,
который находится в /etc/postfix.main.cf. Он хорошо коммен-
тирован, поэтому внимательно вчитываемся в описание и
настраиваем согласно своим требованиям. У меня main.cf
выглядит так:

main.cf:
# Çàäàåì èìÿ íàøåãî ïî÷òîâîãî óçëà
myhostname = testdomain.ru
# Èìÿ íàøåãî äîìåíà, åñëè íå óêàçûâàòü, òî ïî óìîë÷àíèþ
# âûñòàâèòñÿ ìèíóñ ïåðâûé êîìïîíåíò èìåíè óçëà
mydomain = testdomain.ru
myorigin = $myhostname
# RECEIVING MAIL # äàëåå îòíîñèòñÿ ê Amavisd
# Çäåñü çàäàåì, íà êàêèõ ñåòåâûõ èíòåðôåéñàõ áóäåò ðàáîòàòü
# Postfix, â ìîåì ñëó÷àå íà âñåõ
inet_interfaces = all -o smtp_data_done_timeout=1200
# Ñïèñîê äîìåíîâ, íà êîòîðûå áóäåò îñóùåñòâëÿòüñÿ äîñòàâêà -o smtp_send_xforward_command=yes
# ÷åðåç local transport -o disable_dns_lookups=yes
mydestination = localhost, $myhostname, ↵
localhost.$mydomain, $config_directory/mydestination
-o content_filter=
# REJECTING MAIL FOR UNKNOWN LOCAL USERS -o relay_recipient_maps=
# Çäåñü ìû óêàçûâàåì, ÷òî ïîëüçîâàòåëåé testdomain.ru íóæíî -o smtpd_restriction_classes=
# ïðîñìàòðèâàòü â $virtual_maibox_maps -o smtpd_client_restrictions=
local_recipient_maps = $virtual_maibox_maps -o smtpd_helo_restrictions=
unknown_local_recipient_reject_code = 550 -o smtpd_sender_restrictions=
-o smtpd_recipient_restrictions=permit_mynetworks,reject
# TRUST AND RELAY CONTROL -o mynetworks=127.0.0.0/8
# çäåñü óêàçûâàåì, êîìó ðàçðåøåí relay, ò.å. ïîëüçîâàòåëÿì -o strict_rfc821_envelopes=yes
# îáñëóæèâàåìîé ñåòè -o smtpd_error_sleep_time=0
mynetworks = 127.0.0.0/8, 10.70.1.0/24 -o smtpd_soft_error_limit=1001
# Çàäàåì äèðåêòîðèþ, ãäå áóäåò õðàíèòüñÿ ïî÷òà -o smtpd_hard_error_limit=1000
mail_spool_directory = /var/spool/mail
mailbox_command = /usr/bin/procmail -a $DOMAIN -d $LOGNAME
# Íàø ïî÷òîâûé ñåðâåð òðåáóåò ñíà÷àëà êîììàíäó helo И соответственно создаем файлы aliases.pgsql,
smtpd_helo_required = yes maibox.pgsql, transport.cf:
transport_maps = hash:/etc/postfix/transport.cf
# Çàäàåì äèðåêòîðèþ, ãäå áóäåò õðàíèòüñÿ ïî÷òà aliases.pgsql:
# èç âèðòóàëüíûõ äîìåíîâ hosts = localhost
virtual_mailbox_base = /var/spool/mail/ user = mailuser
# Ïðîñìîòð òàáëèö ñ öåëüþ ïðîâåðêè äåéñòâèòåëüíîñòè àäðåñà password = topsecret
virtual_mailbox_maps = pgsql:/etc/postfix/mailbox.pgsql dbname = mails
virtual_alias_maps = pgsql:/etc/postfix/aliases.pgsql table = aliases
# Èñïîëüçóþ ñòàòè÷åñêèå uid & gid; 5000 – ýòî mailuser select_field = dest
virtual_uid_maps = static:5000 where_field = alias
virtual_gid_maps = static:5000
virtual_minimum_uid = 5000 mailbox.pgsql:
hosts = localhost
# INSTALL-TIME CONFIGURATION INFORMATION user = mailuser
readme_directory = /etc/postfix/README_FILES password = topsecret
sample_directory = /etc/postfix/samples dbname = mails
sendmail_path = /usr/sbin/sendmail table = users
setgid_group = postdrop select_field = home
command_directory = /usr/sbin where_field = userid
manpage_directory = /usr/share/man
daemon_directory = /usr/lib/postfix transport.cf:
newaliases_path = /usr/bin/newaliases testdomain.ru virtual:
mailq_path = /usr/bin/mailq another.domain.ru virtual:

№7(20), июль 2004 15


администрирование
В transport.cf указываем, каким образом будут обра- read email
батываться домены, наши домены – через virtual, в про- pos=`expr match "$email" '[a-z1-9A-Z.]*@'`
if [ $pos = "0" ]
тивном случае они будут обработаны с помощью local_ then echo "Íåïðàâèëüíîå èìÿ ïîëüçîâàòåëÿ"
transport. exit
fi
Запускаем postfix: domain=${email:$pos}
name=${email:0:($pos-1)}
cd $basedir/$domain/$name &> /dev/null
[root@mosqit /]# service postfix start if [ $? = "1" ];
then
echo 'Òàêîé ïîëüçîâàòåëü íå ñóùåñòâóåò !! '
Проверяем работу нашего сервера: exit
fi
echo "DELETE from public.users where userid='$email';" | ↵
[root@mosqit /]# telnet 127.0.0.1 25 usr/bin/psql -U postgres mails
rm -rf $basedir/$domain/$name &> /dev/null
cd $basedir/$domain/$name &> /dev/null
echo $?
if [ $? = "0" ];
then
echo 'Îøèáî÷êà âûøëà! '
exit
fi
echo "Ïîëüçîâàòåëü óäàëåí óñïåøíî"
Работает, иначе смотрим лог-файлы в /var/log/maillog. add_alias.bash:
#! /bin/bash
Создание учетных записей echo "Ââåäèòå aliasname âèäå name@domain"
пользователей read aliasname
Для этого я написал пару простейших скриптов на bash: pos=`expr match "$aliasname" '[a-z1-9A-Z.]*@'`
if [ $pos = "0" ]
then echo "Íåïðàâèëüíûé aliasname"
add_mailuser.bash: exit
#! /bin/bash fi
basedir=/var/spool/mail
echo "Ââåäèòå destination â âèäå name@domain"
echo "Ââåäèòå e-mail â âèäå name@domain" read dest
read email pos=`expr match "$dest" '[a-z1-9A-Z.]*@'`
pos=`expr match "$email" '[a-z1-9A-Z.]*@'` if [ $pos = "0" ]
if [ $pos = "0" ] then echo "Íåïðàâèëüíûé destination"
then echo "Íåïðàâèëüíîå èìÿ ïîëüçîâàòåëÿ" exit
exit fi

fi echo "Ââåäèòå êîììåíòàðèé"


domain=${email:$pos} read comment
name=${email:0:($pos-1)} echo -E "INSERT INTO public.aliases (email, alias, comment) ↵
cd $basedir/$domain/$name &> /dev/null VALUES ('$aliasname', '$dest', '$comment');" ↵
if [ $? = "0" ]; | /usr/bin/psql -U postgres mails
then echo "Alias ñîçäàí óñïåøíî"
echo 'Òàêîé ïîëüçîâàòåëü ñóùåñòâóåò !! '
exit Скрипты созданы на скорую руку и поэтому не совер-
fi шенны, но всегда существует возможность модифициро-
cd $basedir/$domain &> /dev/null вать их по своему усмотрению.
if [ $? = "1" ];
then Создаем почтового пользователя test@testdomain.ru:
echo 'Òàêîãî äîìåíà íå ñóùåñòâóåò'
exit [root@mosqit /]# add_mailuser.bash
fi
echo "Ââåäèòå ïîëíîå èìÿ "
read fullname
echo "Ââåäèòå ïàðîëü " Выполняем инструкции, которые выводятся на экран.
read pass Далее проверяем, как Postfix доставляет почту:
echo "ïàðîëü $pass"
echo -E "INSERT INTO public.users (userid, password, ↵
realname, uid, gid, home, mail) VALUES ('$email', '$pass', ↵ [root@mosqit /]# service postfix restart
'$fullname', '42', '42','$domain/$name/inbox', NULL);" ↵ [root@mosqit /]# telnet 127.0.0.1 25
| /usr/bin/psql -U postgres mails
mkdir $basedir/$domain/$name
touch $basedir/$domain/$name/inbox
chmod 600 $basedir/$domain/$name/inbox
chmod 700 $basedir/$domain/$name
chown postfix:postfix $basedir/$domain/$name -R
ls $basedir/$domain/$name/inbox &> /dev/null
if [ $? = "1" ];
then
echo 'Îøèáî÷êà âûøëà! '
exit
fi
echo "Ïîëüçîâàòåëü ñîçäàí óñïåøíî"
del_mailuser.bash:
#! /bin/bash
basedir=/var/spool/mail

echo "Ââåäèòå e-mail, êîòîðûé õîòèòå óäàëèòü â âèäå name@domain" Обращаю внимание на точку c новой строки после test

16
администрирование
message, это означает, что передача данных завершена. auth_user = root
Далее идем в каталог /var/spool/mail/testdomain/test и
смотрим содержимое файла inbox, в нем и должно нахо- После этого нам требуется сгенерировать SSL-сер-
диться наше сообщение. Если файл пуст, то опять же смот- тификат, т.к. у нас заявлены протоколы imaps и pop3s
рим лог-файл (maillog). (s – secure).
Для этого правим файл /etc/dovecot/dovecot-openssl.cnf:
ClamAV
Идем в /etc/clamav.conf и находим строчку ScanMail и рас- [ req ]
default_bits = 1024
комментируем ее, для того чтобы антивирус проверял encrypt_key = yes
файлы формата mailbox. Запускаем ClamAV: distinguished_name = req_dn
x509_extensions = cert_type
prompt = no
[root@mosqit /]# service clamd start
[ req_dn ]
# country (2 letter code)
C=RU
Amavisd-new # State or Province Name (full name)
Далее настраиваем /etc/amavis/amavisd.conf по своему ST=Bashkortostan
усмотрению, конечно же, перед этим прочитав докумен- # Locality Name (eg. city)
тацию. Лично я ничего не изменял, но скорее всего со вре- L=Ufa
менем придется внести коррективы. # Organization (eg. company)
Запускаем Amavisd-new: O=Home Organizations.

# Organizational Unit Name (eg. section)


[root@mosqit /]# service amavisd start OU=POP3 IMAP server

# Common Name (*.example.com is also possible)


Проверяем его работу: CN=testdomain.ru

# E-mail contact
[root@mosqit /]# telnet 127.0.0.1 10024 emailAddress=master@testdomain.ru

[ cert_type ]
nsCertType = server
Раскомментируем строчку: filter=smtp-amavis:[127.0.0.1]:
10024 в файле main.cf. Перезапускаем Postfix, запускаем Запускаем скрипт для генерации сертификата.
ClamaV, Amavisd:
[root@mosqit /]# /usr/share/dovecot/mkcert.sh
[root@mosqit /]# service postfix restart
Правим файл /etc/dovecot/pgsql.conf, в котором указы-
Как и ранее, проверяем с помощью telnet работоспо- ваем, как Dovecot будет подключаться и забирать данные.
собность postfix. Если все нормально, то переходим к на-
стройке Dovecot. connect = host = localhost dbname = mails user = mailuser ↵
password = secret
default_pass_scheme = PLAIN
Dovecot password_query = SELECT password FROM users WHERE userid = '%u'
user_query = SELECT '/var/spool/mail/'|| home, uid, gid ↵
Далее редактируем файл настроек dovecot /etc/dovecot.conf. FROM users WHERE userid = '%u'
Так же внимательно вчитываемся в комментарии к пара-
метрам. Все настройки произведены, можно испытать работо-
способность нашего pop3-сервера:
dovecot.conf:
# Ïðîòîêîëû, êîòîðûå ìû èñïîëüçóåì [root@mosqit /]# service dovecot start
protocols = imap imaps pop3 pop3s
## IMAP login process
login = imap
Настраиваем наш почтовый клиент и проверяем, дос-
## POP3 login process тавляется почта или нет. Имя пользователя указывается
login = pop3
полное, т.е. test@testdomain.ru, а не test.
## Mail processes Если же не получается, то заглядываем в /var/log/
first_valid_uid = 5000 messages и устраняем причину (довольно часто причиной
# Ïóòü ê äèðåêòîðèè, ãäå õðàíèòñÿ ïî÷òà, ãäå %d – бывает банальная опечатка при редактировании конфи-
# èìÿ äîìåíà, %n – èìÿ ïîëüçîâàòåëÿ
default_mail_env = mbox:/var/spool/mail/%d/%n/: ↵ гурационных файлов).
INDEX=/var/spool/mail/%d/%n

mbox_locks = fcntl flock Используемая литература:


## Authentication processes 1. Postfix Documentation: http://postfix.org/documentation.html
auth = default
auth_mechanisms = plain 2. Documentation: http://dovecot.org/documentation.html
auth_userdb = pgsql /etc/dovecot/pgsql.conf 3. DovecotPostgresql: http://wiki.dovecot.org/moint.cgi/Dovecot
auth_passdb = pgsql /etc/dovecot/pgsql.conf
# root ò.ê. èñïîëüçîâàòü ïîðòû äî 1024 ïîðòà ìîæåò òîëüêî root Postgresql

№7(20), июль 2004 17


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

«КТО СТУЧИТСЯ
В ДВЕРЬ КО МНЕ…»
ОБЗОР СИСТЕМЫ ПОДДЕРЖКИ
СПИСКОВ РАССЫЛОК GNU MAILMAN
АНДРЕЙ МАРКЕЛОВ
Нет, это, конечно, не милиция (надеюсь, вы не использу- момент написания статьи была 2.1.5. Конечно, можно было
ете знания, полученные со страниц журнала, в целях, про- бы найти и поставить Mailman из rpm-файла. Так было бы
тиворечащих вашему местному законодательству). Речь проще, но, учитывая, что не все читатели используют си-
пойдет об открытом программном продукте, предназна- стемы на основе менеджера пакетов rpm, рассмотрим ус-
ченном для создания собственных списков рассылки – тановку из исходных текстов. Разархивируем скачанный
Mailman (в переводе с англ. – почтальон). Сей продукт файл в каталог /tmp.
расположился в глобальной паутине по адресу http://
www.list.org. Mailman распространяется в соответствии с gunzip mailman.tar.gz
tar –xvf mailman.tar
General Public License. Используется в своих рассылках
такими маститыми IT-компаниями, как Red Hat, Apple Для дальнейших действий требуются полномочия су-
Computer, Dell Computers и большим числом GNU-проек- первизора. Создаем пользователя mailman, являющего-
тов, включая The XFree86 Project, Samba, Exim, XEmacs. ся членом группы mailman.
Со списком сайтов, где используется рассматриваемый В дистрибутивах, основывающихся на Red Hat Linux
продукт, можно ознакомиться по ссылке http://www.list.org/ это делается одной командой:
inthenews.html.
Программа обладает обширным списком возможнос- useradd mailman
тей. Вот некоторые из них:
! Управление списками, подпиской и пользовательской Теперь создаем директорию, в которую будет установ-
конфигурацией через веб-интерфейс. лен Mailman и даем на нее права:
! Модерирование рассылок, поддержка открытых и зак-
рытых списков рассылки, фильтров. mkdir /usr/local/mailman
chgrp mailman /usr/local/mailman
! Поддержка архивов списков рассылки. chmod a+rx,g+ws /usr/local/mailman
! Автоответчик.
Далее заходим в систему как пользователь mailman или
Прежде чем приступить к установке, ознакомимся с другой пользователь, которого вы предварительно вклю-
требованиями к системе, на которую ставится Mailman: чили в группу mailman. Важно, чтобы эти шаги выполня-
! Естественно, должен присутствовать почтовый сервис. лись не от лица суперпользователя:
Mailman работает с Sendmail, Postfix, Exim и qmail. На
моей тестовой системе стоял Sendmail, поэтому на него cd /tmp/mailman-2.1.5/
./configure --with-cgi-gid=apache --with-mail-gid=mail
и буду ориентироваться в описании. make install
! Веб-сервер с поддержкой CGI/1.1 API.
! GCC 2.8.1 или выше. Теперь проверим корректность разрешений на файлы
! Интерпретатор Python, на котором, собственно, и на- при помощи специального скрипта, входящего в пакет:
писана система (с небольшими кусочками кода на C).
Поддерживаются версии 2.1 и выше. cd /usr/local/mailman
./bin/check_perms

Я проверял установку системы на дистрибутиве White Скрипт должен выдать сообщение о том, что проблем
Box Enterprise Linux 3 (http://www.whiteboxlinux.org/), который с правами не обнаружено.
является версией Red Hat Enterprise Linux 3, заново собран- Далее, даем команду exit, и уже под пользователем root
ной из свободно доступных исходников. правим httpd.conf, добавив туда строчки:
В моем случае интеграция «почтальона» производилась
с веб-сервером Apache. Далее в статье будет дан необхо- ScriptAlias /mailman/ /usr/local/mailman/cgi-bin/
Alias /pipermail/ /usr/local/mailman/archives/public
димый минимум сведений, достаточный для установки
Mailman и создания своего собственного списка рассылки. <Directory “/usr/local/mailman/archives/public/”>
AddDefaultCharset Off
</Directory>
Установка
Скачиваем с сайта проекта либо с одного из зеркал ар- Таким образом, мы предписываем Apache, что из ука-
хив mailman.tar.gz. Последняя версия «почтальона» на занного каталога разрешается выполнять CGI-скрипты, со-

18
администрирование
здаем алиас для /archives/public/ и выключаем для этого чанию). Шаблон содержит практически все настройки си-
каталога кодировку «по умолчанию». стемы, и хорошо задокументирован. При первой, тесто-
Потом копируем логотипы Mailman, Python, GNU Logo вой установке я предлагаю его не изменять, так как с на-
в доступное вашему веб-серверу место, и не забываем стройками можно «поиграться» и через веб-интерфейс.
перезапустить сам веб-сервер: Так будет намного нагляднее.

cp /usr/local/mailman/icons/* /var/www/icons ./bin/config_list –I data/sitelist.cfg mailman


service httpd restart

Создаем служебный «site-wide»-список под названи- Теперь задаем пароль администратора сайта. Он по-
ем mailman: надобится для создания публичных списков рассылки.

./bin/newlist mailman ./bin/mmsitepass

По запросу вводим mail ведущего список и пароль (на Если в процессе конфигурирования у вас что-то пой-
этот адрес будет выслано письмо с подтверждением и дет не очень гладко, рекомендую просмотреть FAQ по ад-
указанным паролем). ресу: http://www.python.org/cgi-bin/faqw-mm.py?req=index.
Теперь, согласно инструкциям, выданным после отра- Также обратите внимание на логи «почтальона», ведущи-
ботки команды, добавляем в /etc/aliases псевдонимы (в еся в каталоге /usr/local/mailman/logs/, и возможные бло-
качестве примера был создан список под именем test): кировки в /usr/local/mailman/loсks/.

test: "|/usr/local/mailman/mail/mailman post test"


test-admin: "|/usr/local/mailman/mail/mailman admin test"
Создаем список рассылки
test-bounces: "|/usr/local/mailman/mail/mailman bounces test" Теперь у нас все готово для создания первого списка рас-
test-confirm: "|/usr/local/mailman/mail/mailman confirm test" сылки. Идем по ссылке: http://сервер.домен.ru/mailman/
test-join: "|/usr/local/mailman/mail/mailman join test"
test-leave: "|/usr/local/mailman/mail/mailman leave test" create, и заполняем поля: имя списка, пароль, почтовый
test-owner: "|/usr/local/mailman/mail/mailman owner test" ящик владельца, язык. В самом последнем поле вводим
test-request: "|/usr/local/mailman/mail/mailman request test"
test-subscribe: "|/usr/local/mailman/mail/mailman ↵ пароль администратора сайта, который мы задавали ко-
subscribe test" мандой mmsitepass.
test-unsubscribe: "|/usr/local/mailman/mail/mailman ↵
unsubscribe test" После успешного создания списка вам придет письмо
с подтверждением, и будет доступна ссылка: http://
Если ваш Sendmail идет с включенной по умолчанию сервер.домен.ru/mailman/admin/имя_списка, по которой
опцией smrsh, ограничивающей исполнение скриптов че- можно вызвать интерфейс администратора. А по http://
рез MTA (а в случае использования дистрибутивов, не ба- сервер.домен.ru/mailman/listinfo/имя_списка можно подпи-
зирующихся на Red Hat Linux, это именно так), то вам необ- саться на список. Также по http://сервер.домен.ru /mailman/
ходимо в каталоге /etc/smrsh/ создать симлинк на mailman: listinfo приведен общий перечень всех списков рассылки,
существующих на сайте. Естественно, в нем пока присут-
cd /etc/smrsh/ ствует только один элемент.
ln –s /usr/local/mailman/mail/mailman mailman

Следующий шаг – создание списка периодически вы-


полняемых задач при помощи crontab (например, опове-
щение администратора о запросах на включение пользо-
вателей в список рассылки):

cd /usr/local/mailman/cron
crontab –u mailman crontab.in
cd ..

Теперь запустим демона вручную, а на будущее доба-


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

./bin/mailmanctl start
cp scripts/mailman /etc/init.d/mailman
chkconfig –add mailman

Проверьте правильность выставленных значений пере- Протестировать новый список, предварительно подпи-
менных DEFAULT_EMAIL_HOST и DEFAULT_URL_HOST в савшись на него, можно, отправив письмо на адрес имя_
файле ./Mailman/Defaults.py. Они должны содержать пол- списка@сервер.домен.ru.
ное имя вашего почтового и веб-сервера. Я не буду подробно описывать интерфейс администра-
Далее применяем шаблон сайта (его можно было пред- тора и настройки списков, поскольку все параметры снаб-
варительно отредактировать, но мы все оставим по умол- жены вполне понятными описаниями на русском языке.

№7(20), июль 2004 19


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

КАК РАЗЛИЧАТЬ И СЧИТАТЬ


МАРКИРОВАННЫЙ ТРАФИК?

ПАВЕЛ ЗАКЛЯКОВ
В предыдущей статье о пиринге [2] я специально не зат- рее научная, малоприменимая на практике, то вопрос с
рагивал технических вопросов, неизбежно возникающих трафиком более чем насущен для большинства сетей и
при раздельной тарификации. Сейчас я хотел бы в двух на практике очень актуален. С философской точки зре-
словах рассказать, что такое маркировка, зачем она нуж- ния получается интересная ситуация, когда конечным
на, когда и где может пригодиться. А также поделиться пользователям не очень интересен вопрос с маркиров-
опытом подсчёта маркированного трафика. кой. Что и говорить, если кругозор большинства пользо-
Подобно тому, как биологи и химики в своих химичес- вателей обычно не распространяется дальше, чем IP-
ких реакциях используют помеченные атомы (нуклиды, а адрес их компьютера, а их компьютеру, использующему
точнее, изотопы1) для выяснения в подробностях, какие в большинстве случаев ОС Windows, вообще не ведомо
именно из них участвуют в реакции, и в какие вещества такое понятие, как маркировка. Но в то же время, эти же
они переходят, в сети используют аналогичную схему с пользователи являются зависимыми от маркировки и
маркировкой с целью выяснения маршрутов и разделе- маршрутизации, так как большинство из них привыкло
ния различных видов трафика. экономить, а цена и другие параметры трафика напря-
Если выяснение перемещения атомов – задача ско- мую зависят от маршрута.

20
администрирование
Любой уважающий себя владелец сети, желая повы- следует понимать изменение значений определённых би-
сить её надёжность, как только появляется такая возмож- тов в пакетах в соответствии с принятыми договорённос-
ность, создаёт резервные каналы на ответственных учас- тями. По идее можно менять что угодно, как угодно и где
тках. В графе сети появляются петли, а это означает, что угодно, однако в большинстве случаев это негативно ска-
на этих участках уже не существует однозначного марш- жется на правильной работе тех или иных уже существу-
рута между двумя узлами. Проблема появляется в тот ющих протоколов, поэтому согласно RFC791 (Internet
момент, когда выясняется, что себестоимость доставки Protocol) было решено использовать для целей маркиров-
трафика по различным граням графа оказывается раз- ки только один, второй байт в заголовке IP-пакетов, име-
ной. Помимо стоимости у граней (маршрутов) имеются и нуемый ToS, сокращённо от Type of Service, изменения в
другие важные характеристики. Вот некоторые из них: рамках которого должны пониматься всеми корректно.
задержка, надёжность передачи, пропускная способность.
Можно точно сказать, что пиринг неразрывно связан с
поставленной проблемой. Допустим, имеется две сети с
реальными адресами в двух соседних микрорайонах, об-
служиваемых различными провайдерами. Для прохода
пакетов из одной сети в другую пакеты уходят к одному Ðèñóíîê 1. Çàãîëîâîê IP-ïàêåòà. Êðàñíûì âûäåëåíî ïîëå, îáû÷íî
провайдеру, передаются другому и попадают в соседнюю èñïîëüçóåìîå äëÿ ìàðêèðîâêè ïàêåòîâ
сеть. Пользователи двух сетей понимают, что даже если Согласно тому же самому RFC791 выделенное крас-
между провайдерами заключены пиринговые соглашения ным цветом поле ToS подразделяется на несколько под-
и трафик обходится в копейки, то канал между сетями, полей, которые имеют следующее предназначение для
какой бы он быстрый не был, так или иначе будет узким используемых в них битах.
местом. В попытках расширить это узкое место создаёт-
ся дополнительный канал и с этого момента трафик меж-
ду сетями может ходить по разным маршрутам. Ðèñóíîê 2. Ðàçäåëåíèå ïîëÿ ToS íà áèòû ñîãëàñíî RFC791
Если в данном примере между провайдерами нет пи- Первые три бита с 0 по 2 – это поле Precedence. Всего
ринговых соглашений, то одни и те же пользователи мо- может быть 8 комбинаций значений этих битов:
гут быть готовы к обмену файлами через бесплатный ка- ! 111 – Network Control
нал, а через платные каналы провайдеров – нет. Как же ! 110 – Internetwork Control
быть в этой ситуации? Когда-то бесплатный шлюз между ! 101 – CRITIC/ECP
сетями работает, а когда-то нет. Открыть свой ftp для ска- ! 100 – Flash Override
чивания и закачивания адресам другой сети – значит при- ! 011 – Flash
влечь к себе дополнительный трафик в те моменты, ког- ! 010 – Immediate
да шлюз между сетями по каким-то причинам не работа- ! 001 – Priority
ет или находится на профилактике. Не разрешать доступ ! 000 – Routine
к открытому ftp из другой сети – лишить себя возможнос-
ти получить новые файлы. Несмотря на то что согласно рекомендации поле
На уровне провайдеров проблемы нет, так как его ос- Precedence входит в состав поля ToS, иногда под полем ToS
новные маршрутизаторы, принимая трафик, всегда видят подразумевают всё, что идёт после поля Precedence, не
откуда (с какого интерфейса) он был получен, поэтому и включая его и зарезервированные 2 бита, а встречающие-
могут его правильно подсчитывать. Проблемы начинаются ся далее в нём биты имеют следующее предназначение.
у пользователей, которые, наоборот, не знают по какой цене Бит 3 (буква D (Delay) на рис. 2) отвечает за задержку тра-
им учитывать те или иные пакеты. Тут однозначно работа- фика и рекомендует в случае, если в этом поле стоит 1
ет придуманное мной правило (из разряда следствий зако- минимизировать задержку (0 = Normal Delay, 1 = Low Delay).
на Мёрфи): «меньше знаешь – больше платишь». Бит 4 (буква T (Throughput) на рис. 2) отвечает за пропуск-
Узнав, откуда приходит трафик, можно нежелательный ную способность: 0 – обычная (Normal Throughput), 1 – по
ограничить и платить меньше. возможности, повышенная (High Throughput). Бит 5 отве-
Логичным и давно используемым решением данной чает за надёжность передачи: 0 – обычная надёжность
проблемы служит маркировка трафика. Под маркировкой (Normal Reliability), 1 – повышенная (High Reliability). Биты 6 и
1
Изотопы: (от изо... и греч. topos – место ), разновидности одного химического элемента, занимающее одно место в
периодической системе элементов Менделеева, но отличающиеся массами атомов. Химические свойства атомов, т.е.
принадлежность атома к тому или иному химическому элементу, зависят от числа электронов и их расположения в
электронной оболочке атома. Место химического элемента в периодической системе элементов определяется его по-
рядковым номером Z, равным числу электронов в оболочке атома или, что то же самое, числу протонов, содержащихся
в атомном ядре. Кроме протонов, в ядро атома входят нейтроны, масса каждого их которых приблизительно равна массе
протона. Количество нейтронов N в ядре атома с данным Z может быть различным, но в определённых пределах... От
соотношения чисел протонов и нейтронов в ядре зависят различные свойства атомов. Атомы с одинаковым Z, но с
различным числом нейтронов N обладают идентичными химическими свойствами... и также называются изотопами.
Большая Советская Энциклопедия, том 10, М.: Издательство «Советская энциклопедия»,1972, стр 109.

№7(20), июль 2004 21


администрирование
7 не используются и зарезервированы для будущих целей. В сентябре 2001 вышел RFC 3168 (The Addition of Explicit
Замечание. Согласно RFC 792 (Internet Control Message Congestion Notification (ECN) to IP), который был нацелен
Protocol), так как у ICMP-пакетов используется заголовок, на то, чтобы внести стабильность в поле маркировки и
идентичный протоколу IP, то в них также может использо- закрепить сложившуюся ситуацию, обозначенную в уста-
ваться маркировка. Программа sing [9] не только показы- ревшем RFC 2481. Новая рекомендация заменила старые
вает значение поля ToS приходящих пакетов, но и позво- RFC 2481 и RFC 2474 и внесла поправки в некоторые дру-
ляет с помощью параметров менять это поле у отправля- гие документы.
емых ею пакетов. Использование маркировки IP-пакетов Такая бурная история изменения рекомендаций по ис-
в поле ToS было задумано в 1979 году с самого начала пользованию нескольких бит в заголовках IP-пакетов ска-
появления этого протокола, определяемого устаревшим залась на том, что используемые оборудование и програм-
на сегодня документом IEN 123. мы работают каждый по своей рекомендации. Каждая
Появившиеся вместо него документы RFC 760 (1980 г.) программа или железка считает своё понимание пробле-
и RFC 791 (1981 г.) не изменили ситуацию существенным мы единственно верным и действует по своему, субъек-
образом. тивному наиболее правильному алгоритму.
Последний документ действует и поныне, однако че- Администраторы по большей части, если и подозре-
рез 10 лет после появления протокола IP вышел RFC 1122 вают о существовании таких скрытых возможностей, во-
(Requirements for Internet Hosts – Communication Layers), обще с этим полем стараются не связываться без особой
который включил два зарезервированных бита в TOS, и на то надобности. Некоторые вообще не видят никакой
разделение полей стало выглядеть так: выгоды от использования этого поля. Всё и так прекрасно
работает с их точки зрения.

Ðèñóíîê 3. Ðàçäåëåíèå ïîëÿ ToS íà áèòû ñîãëàñíî RFC 1122 Маркировка и подсчёт различных видов
Чуть позже, когда назначение сети Интернет смести- трафика на практике
лось в коммерческую область, да и многие другие вещи Насколько мне известно, провайдеров, использующих раз-
стали замещаться денежными эквивалентами, в 1992 году дельную тарификацию, мало [2], а использующих марки-
к вопросу о маркировке пакетов вышло дополнение – RFC ровку – вообще один – ИМТЦ «МГУ». Помимо маркиров-
1349 (Type of Service in the Internet Protocol Suite), соглас- ки существуют и другие способы решения проблемы раз-
но которому у поля ToS был отобран последний бит, и оно дельной тарификации. Например, упомянутая мной в [2]
получило следующую трактовку битов. сеть gagarino.net, как было недавно выяснено, не исполь-
зует маркировку трафика для абонентов, а использует
списки доступа [3]. При этом договорённость с вышестоя-
Ðèñóíîê 4. Ðàçäåëåíèå ïîëÿ ToS íà áèòû ñîãëàñíî RFC 1349 щим провайдером у них близка по политике к провайдеру
По сравнению с предыдущей редакцией из двух после- Zenon N.S.P., когда не важно, как пришли пакеты, если
дних неиспользуемых битов (6-го и 7-го) только 6-му биту они из сети, принадлежащей списку [3], то тогда они счи-
было дано новое определение – минимизация возможной таются российскими. Такая система разделения трафи-
стоимости передачи трафика. Если 6-й бит равен 1, то сле- ка, с точки зрения конечных пользователей наиболее бла-
дует выбирать более дешёвые маршруты. гоприятна, конечно после полностью безлимитного Интер-
В 1993 году вышел RFC 1455, который предлагал ва- нета. Даже не смотря на частичную безлимитность, поль-
риант использования поля TOS (биты 3-6) для задания зователь, поставивший скачиваться десяток-другой филь-
гарантированного уровня безопасности соединений. мов на ночь из российского сегмента сети, может спать
С появлением IP-телефонии и других сервисов, став- спокойно. Если вдруг на каких-то участках сети нарушит-
ших доступными в сети, в декабре 1998 года вышел RFC ся связанность и пакеты начнут приходить из-за рубежа,
2474 (Definition of the Differentiated Services Field (DS Field) то на тарификации это не отразится.
in the IPv4 and IPv6 Headers), согласно которому значение Подсчёт скачанного трафика в этом случае с помощью
поля ToS целиком должно быть заменено полем DS (for iptables осуществляется следующим образом. Создают-
differentiated services). После чего значения поля ToS, от- ся цепочки, каждая отвечающая за ту или иную российс-
меченного на рис. 1, приобрели следующие значения. кую сеть и осуществляющая пометку принадлежащего ей
трафика как российского, например семёркой.
До прохождения правил весь трафик также метится,
Ðèñóíîê 5. Ðàçäåëåíèå ïîëÿ DS (áûâø. ToS) íà áèòû ñîãëàñíî RFC 2474
DSCP: differentiated services codepoint допустим шестёркой. Пакет, прошедший через все пра-
CU: currently unused вила, либо изменит маркировку на российскую, либо так
Cвято место пусто не бывает, через месяц, в январе и останется зарубежным.
1999-го, неиспользуемые два бита CU изменили своё на- Например, если российскими из всего списка [3] будут
звание на ECN и получили другое назначение, которое только две сети 217.26.176.0/20 и 217.146.192.0/20, а вхо-
стал определять документ RFC 2481 (A Proposal to add дящим интерфейсом будет eth0, то вышесказанное на
Explicit Congestion Notification (ECN) to IP). языке iptables будет выглядеть так:

iptables -A PREROUTING -t mangle -i eth0 -j MARK --set-mark 6


Ðèñóíîê 6. Ðàçäåëåíèå ïîëÿ DS (áûâø. ToS) íà áèòû ñîãëàñíî RFC 2481 iptables -A PREROUTING -t mangle -i eth0 -s 217.26.176.0/20 ↵
-j MARK --set-mark 7

22
администрирование
iptables -A PREROUTING -t mangle -i eth0 -s 217.146.192.0/20 ↵ пользователю, тут есть своя логика. Несомненно, более
-j MARK --set-mark 7 правильно при такой схеме дополнительно для удобства
Естественно, цель MARK должна поддерживаться яд- пользователей маркировать, например, зарубежный тра-
ром. фик. ИМТЦ «МГУ» маркирует трафик в поле Precedence
установкой 1-го и 2-го битов (Flash)(ToS=0x60) [4].

Ðèñóíîê 8. Ìàðêèðîâêà ïëàòíîãî òðàôèêà ÈÌÒÖ "ÌÃÓ" â ïîëå ToS


Недостатки этого способа в том, что при маркировке
трафика провайдером затрачиваются значительные вы-
числительные ресурсы маршрутизаторов. Возможно, по-
этому не все провайдеры используют маркировку, так как
просто не могут себе это позволить.
Если вы изменили какие-то биты в пакете, то необхо-
димо пересчитать и изменить контрольную сумму. А те-
перь представьте, что пакетов миллионы, в этом случае
не так-то просто сохранить пропускную способность мар-
Ðèñóíîê 7. Ïîääåðæêà öåëè MARK â ÿäðå шрутизатора, промаркировав при этом несколько терабайт
После того как пакеты были помечены, их можно уже пакетов за месяц.
раздельно учитывать и выполнять над ними различные Попытка выяснить в ИМТЦ «МГУ», кому и почему при-
действия. Например, подсчёт приходящего зарубежного шла в голову идея маркировать трафик так, а не по-дру-
трафика на адрес 192.168.0.5 можно осуществить следу- гому, результатов не дала. «Так исторически сложилось,
ющим правилом: – был их ответ, – работавшему на то время администра-
тору маркируемые биты, видимо, показались наиболее
iptables -A FORWARD -d 192.168.0.5 -m mark --mark 6 правильными, а после его ухода за ненадобностью никто
ничего не менял».
а российского: При маркировке трафика решить проблемы ограниче-
ния скачивания чего-то лишнего гораздо проще, чем без
iptables -A FORWARD -d 192.168.0.5 -m mark --mark 7 таковой. А именно, если поставить скачиваться какой-ни-
будь фильм на ночь из российской части сети и устано-
эти же самые метки трафика можно скармливать и дру- вить фильтр на запрет прихода любых пакетов из зару-
гим программам вроде tc для задач выборочного ограни- бежной части, то можно смело сказать, что вместо ска-
чения пропускной способности, например: чанных гигабайт в случае изменения маршрутизации вы
максимум получите несколько лишних килобайт платного
tc filter add dev eth0 parent 1:0 prio 0 protocol ip ↵ трафика.
handle 6 fw flowid 1:6
tc filter add dev eth0 parent 1:0 prio 0 protocol ip ↵ При подсчёте внешне маркированного трафика с по-
handle 7 fw flowid 1:7 мощью iptables первое, что приходит в голову – это вос-
пользоваться расширением dscp:
С финансовой точки зрения для провайдера данная
схема не очень удобна, особенно если пользователей у iptables -A FORWARD -d 192.168.0.5 -m dscp --dscp 0x18
провайдера тысячи. В этом случае лучше разграничить
ответственность таким образом, чтобы проблемы нару- Это правило будет считать все пакеты, у которых уста-
шения связанности каких-то участков сети переложить на новлены два бита маркировки, за исключением тех, у ко-
плечи пользователей. А именно, провайдер не гарантиру- торых почему-то оказались поднятыми и другие биты, кро-
ет идентичность маршрутов доставки трафика от одних ме отведённых двух.
узлов к другим и не занимается вопросами минимизации Например, если поле dscp будет содержать значение
стоимости. Если пакеты от некоторых российских узлов 19 (биты 01 1001), то формально биты платности будут в
по каким-то причинам начинают приходить с зарубежно- таком пакете установлены, но считаться вышеустановлен-
го интерфейса и их стоимость значительно увеличивает- ным правилом он уже не будет. Получится, что для под-
ся, то в этом случае затраты пользователей растут. Ми- счёта всех возможных случаев потребуется 16 правил (ос-
нимизировать затраты один раз и навсегда невозможно. тавшихся битов 4, 24=16), что не очень-то и удобно, если
Пользователи, если желают экономить, должны сами ог- учесть, что эти правила надо будет создавать на каждый
раничивать нежелательный трафик, выделяя его из об- адрес. От того, чтобы не писать так много правил, можно
щего числа косвенными способами, например, отслежи- застраховаться. Например, перед проверкой дополнитель-
вая маршруты движения пакетов с помощью traceroute, но потребовать, чтобы пакеты, идущие на правило под-
либо анализируя запоздавшую статистику уже пришед- счёта, имели другие биты равными нулю.
ших пакетов. Такая схема используется некоторыми про- Сделать это можно с помощью модуля ToS, реализую-
вайдерами, упомянутыми мной в [2]. Нельзя сказать, что- щего более раннюю рекомендацию, биты которого не пе-
бы это было совсем нечестно по отношению к конечному ресекаются с битами маркировки. Например:

№7(20), июль 2004 23


администрирование
iptables -N user-chain жения, в которых указано местонахождение исходников
iptables -A FORWARD -d 192.168.0.5 -m tos ↵ ядра и iptables. Если они окажутся пустыми, то нам будут
--tos Normal-Service -j user-chain
iptables -A FORWARD -d 192.168.0.5 -m dscp --dscp 0x18 заданы соответствующие вопросы. После ответа на них
вам будут предлагаться на выбор различные патчи с их
Однако толку от таких конструкций не будет, так как кратким описанием и примерами. Следует выбирать «n»
пакеты с ToS, не равным нулю, и так бы не посчитались до тех пор, пока у вас на экране не появится запрос на
последним правилом. Чтобы в правилах, описанных выше установку u32.
появился смысл, их надо изменить таким образом, чтобы
во всех приходящих пакетах насильно в поле ToS выстав-
лялось нулевое значение (Normal-service). Например, так:

iptables -t mangle -A PREROUTING -j TOS --set-tos 0


iptables -t mangle -A FORWARD -j TOS --set-tos 0

Тогда подсчитывающему правилу:

iptables -A FORWARD -d 192.168.0.5 -m dscp --dscp 0x18

не понадобятся никакие другие усложняющие конструк-


ции. Этот метод прост и хорош, и, возможно, даже не по-
требует перекомпиляции ядра, так как большинство ядер,
по умолчанию поставляемых с системами, уже знает про
используемые нами модули и осуществляет их поддерж-
ку. (Для тех, кто будет компилировать ядро самостоятель-
но, поддержку DSCP и TOS следует включить, см. рис. 7.)
Но в то же время такой способ решения проблемы неуда- Ðèñóíîê 9. Ïðèãëàøåíèå, ïðåäëàãàþùåå óñòàíîâèòü ïàò÷ u32
чен, потому что требует очень больших ресурсов. Если После этого выбираем «t» (test), и в случае успешного
пользователь Вася настраивает правила у себя на домаш- тестирования устанавливаем патч выбором «y». Далее
нем компьютере, то скорее всего, как бы он ни старался, появится предложение установить следующий патч и т. д.
у него не получится более 100 правил. Его система заве- Чтобы не выбирать много раз «n», можно сразу выйти с
домо справится со всеми пакетами без потерь и задер- помощью «q» (quit). По окончании вы увидите сообщение
жек. Но если речь идёт о маршрутизации на уровне не- о том, что исходники готовы к компиляции.
большого или среднего провайдера, то все ресурсы на
счету. Правил может быть больше тысячи, к тому же на
сервере могут работать другие задачи. Если в каждом
пакете придётся менять какие-то биты, обнулять что-то в
поле ToS, то непременно придётся у всех этих пакетов
пересчитывать контрольную сумму, что может значитель- Ðèñóíîê 10. Ñîîáùåíèå: èñõîäíèêè ãîòîâû ê êîìïèëÿöèè
но загрузить систему. Далее следует выполнить конфигурацию и компиля-
Поэтому лучше и красивее использовать другой спо- цию ядра и модулей обычным образом. Следует обратить
соб подсчёта. Наложить на ядро патч u32 [6, 7] от patch-o- внимание, что после наложения патча в разделе Networking
matic, написанный Don Cohen (don@isis.cs3-inc.com). options IP: Netfilter Configuration должен появиться пукт
Для этого, как обычно, скачиваем последние версии «U32 match support», который следует выбрать.
ядра (http://www.ru.kernel.org/pub/linux/kernel/v2.4/linux-
2.4.26.tar.gz), patch-o-matic (http://www.iptables.org/files/
patch-o-matic-ng-20040302.tar.bz2) и заодно iptables (http:/
/www.iptables.org/files/iptables-1.2.9.tar.bz2). Затем, распа-
ковав исходники, следует наложить на них патч.
Особенность patch-o-matic состоит в том, что предла-
гаемые патчи, хотя и были написаны отнюдь не дурака-
ми, всё же могут содержать неумышленные ошибки. Так-
же никто не гарантирует совместимость всех патчей меж-
ду собой. Поэтому, чтобы лишний раз не понижать надёж-
ность системы, следует устанавливать только те патчи,
которые вам реально необходимы. В нашем случае это
u32. Наложение патча несколько отличается от обычного
синтаксиса команды patch, поэтому об этом чуть подроб- Ðèñóíîê 11. Ïóíêò U32 match support
нее. Прочитав прилагающийся файл README, можно уз- После установки нового ядра, а также компиляции и
нать, что следует запустить файл runme с ключом extra. инсталляции iptables, можно приступать к написанию пра-
Затем программа проверит значения переменных окру- вил с использованием нового фильтра u32. К сожалению,

24
администрирование
документация, подготовленная автором модуля (Don даемое, хотя и не очень удобна в том плане, что сравни-
Cohen) и поставляемая в комплекте очень слаба, поэтому ваемое значение приходится окружать большим количе-
лучше воспользоваться руководством, написанным William ством нулей. Куда разумнее оба сравниваемых значения
Steams [7]. сдвинуть на 2 байта (16 бит) вправо, тогда лишних нулей
Краткий формат написания правил для u32 таков: можно будет избежать, при этом правило для iptables бо-
лее элегантно можно будет записать так:
iptables ... -m u32 --u32 "Start&Mask=Range"
iptables -A FORWARD -m u32 --u32 "0&0x00600000>>16=0x60" ↵
-d 192.168.0.5
где Start – это то, что будет сравниваться, Mask – маска
тех битов, которые будут сравниваться, Range – сравни- Логично догадаться, что если у вас маркируются другие
ваемое значение, если оно совпадёт с тем что будет в па- биты, то поменять значения в правиле не очень сложно.
кете, то правило «сработает». Замечание 1. Вадимом Беркгаутом было обнаружено,
Из-за особенностей реализации u32 в Start указывает- что маршрутизаторы Cisco (в частности 7206) помечают не
ся не абсолютное значение байта в пакете, начиная с нуле- все пакеты в поле DSCP. Почему-то не помечаются пакеты
вого, а относительное, смещённое на -3 байта от его ре- с установленными флагами SYN или FIN и иногда некото-
ального месторасположения. Например, если вы хотите рые пакеты, идущие перед последним. Также не всегда по-
фильтровать пакеты с TTL<4, то глядя на рис. 1, вы опреде- мечаются и ICMP-пакеты. Если на счёт SYN- и FIN-пакетов
ляете, что полю TTL в заголовке соответствует 8-й байт есть некоторые соображения, то по поводу случайной не
пакета (вначале пакета идёт заголовок). После чего можно маркировки некоторых ICMP-пакетов сделать выводы слож-
подсчитать (8-3=5), что в поле Start следует указать число но. В частности, есть предположение, что существуют те
5. Для сравнения следует учитывать все биты, поэтому ис- или иные RFC, которые рекомендуют так поступать. Напри-
пользуемая маска будет 1111 1111 (0xFF). Значения мень- мер, RFC 2873 (TCP Processing of the IPv4 Precedence Field),
ше 4 – это те, что принадлежат отрезку значений [0, 3]. указывающий, что во время установки соединения поле
Полученное таким образом правило будет выглядеть так: precedence должно игнорироваться обеими сторонами. Это
значит, что Cisco может думать так: «а зачем маркировать
iptables ... -m u32 --u32 "5&0xFF=0:3" пакеты, если поле всё равно игнорируется». Возможно, что
это особенности конкретного экземпляра, если кто-то из
при этом оно будет аналогично правилу: читателей знает, почему так происходит и как ведут себя
другие маршрутизаторы, буду рад услышать ваше мнение.
iptables ... -m ttl --ttl-lt 4 Замечание 2. Если поле ToS (DSСP+ECN по современ-
ной трактовке) никак не используется в сети и не обнуля-
Так как переменная Start не может быть меньше 0, то ется на межсетевом экране, а при этом есть возможность
получить вышеописанным образом доступ к первым трём свободному выходу определённых пакетов из сети (в сеть),
байтам не получится. Для доступа к ним используется бо- то создаётся хорошая лазейка для скрытной передачи ин-
лее сложная конструкция со сдвигом. Подробнее об этом формации. Много передать по такому каналу не получит-
можно прочитать в [7]. Так как маркируемые биты нахо- ся, но можно без особых усилий отправлять небольшие
дятся во втором байте заголовка (2-3=-1), то простым об- сообщения, не привлекая к происходящему процессу вни-
разом обратиться к ним не получится. Конструкция мания.
Start&Mask позволяет считать первые 4 байта сразу без Спасибо Павлу Янченко за ответы на некоторые мои
сдвига с помощью «0&0xFFFFFFFF», конструкция, считы- вопросы по теме данной статьи.
вающая второй по счёту (первый по нумерации, начиная
с нуля) байт выглядит так «0&0x00FF0000». Фактически Литература, ссылки:
это то, что нам нужно. Уже сейчас можно написать аналог 1. Список документов RFC: http://www.rfc-editor.org/rfc-
применяемого нами ранее правила: index.html
2. Закляков П. Пиринг. – Журнал «Системный админист-
iptables -A FORWARD -d 192.168.0.5 -m dscp --dscp 0x18 ратор» №6(19), июнь 2003 г. – 82-87 с.
3. IP-адреса Российских сетей по данным gagariono.net:
который будет выглядеть так: http://www.gagarino.net/ips.txt
4. ИМТЦ «МГУ» тарифы и маркировка трафика: http://
iptables -A FORWARD -m u32 --u32 "0&0x00FF0000=0x00600000" ↵ www.direct.ru/internet/index_line.html
-d 192.168.0.5
5. Classifying packets with filters: http://www.tldp.org/
Это правило полностью аналогично, то есть оно содер- HOWTO/Adv-Routing-HOWTO/lartc.qdisc.filters.html
жит все те недостатки, что были обсуждены ранее. Однако 6. Расширение u32 для iptables: http://www.iptables.org/
теперь их можно исправить, используя для сравнения не все patch-o-matic/pom-base.html#pom-base-u32
биты, а только те, которые нас интересуют 0110000 (0x60). 7. William Steams IPTables U32 Match Tutorial: http://
www.sans.org/rr/special/iptables_u32.pdf
iptables -A FORWARD -m u32 --u32 "0&0x00600000=0x00600000" ↵ 8. Страница со ссылками для скачивания iptables и patch-
-d 192.168.0.5
o-matic: http://www.iptables.org/downloads.html
Такая конструкция полностью делает всё от неё ожи- 9. Сайт проекта sing: http://sourceforge.net/projects/sing

№7(20), июль 2004 25


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

PostgreSQL: первые шаги


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

СЕРГЕЙ СУПРУНОВ
Все примеры в данной статье приведены для FreeBSD 5.2 PostgreSQL, те категории задач, для которых эта СУБД
и PostgreSQL 7.4.2, однако в принципиальном отношении более эффективна.
все изложенное остается верным и для других актуаль- Прежде всего следует отметить различия в организа-
ных сегодня операционных систем и версий. Статья но- ции данных. Если в MySQL каждая таблица заносится в
сит обзорный характер и предназначена прежде всего ад- собственный файл (для большинства типов БД), то Postgre
министраторам, желающим познакомиться с этой СУБД SQL организует единую файловую структуру, в которой
и оценить ее возможности для решения тех или иных за- отдельные файлы не соответствуют непосредственно таб-
дач. Предполагается, что читатель знаком с такими ве- лицам или другим объектам базы данных. То есть в MySQL
щами, как реляционная база данных, СУБД, а также с ба- вы можете создать резервную копию лишь части БД, со-
зовыми понятиями и операторами языка SQL. хранив соответствующие файлы. Для PostgreSQL такой
PostgreSQL – это объектно-реляционная система уп- номер пройдет только для всей структуры, включающей в
равления базами данных, работающая как клиент-сервер- себя все обслуживаемые сервером БД базы. Как след-
ная система. Основываясь на базовых понятиях реляци- ствие – MySQL полагается при организации БД на файло-
онных БД, PostgreSQL поддерживает и ряд «объектных» вую систему ОС, в то время как PostgreSQL зависит от нее
операций, например наследование. PostgreSQL соответ- меньше, но требует дополнительного обслуживания – пе-
ствует базовой спецификации SQL99 и поддерживает боль- риодической дефрагментации базы данных командой
шое число возможностей, описанных стандартом SQL92. VACUUM.
Может возникнуть вопрос – почему именно PostgreSQL? Далее эти две СУБД используют различную реализа-
Лучше всего ответить на него, сравнив этот продукт с не цию нескольких подключений. PostgreSQL имеет более
менее популярным и, пожалуй, более известным – MySQL. широкие возможности, как для обработки данных, так и
Моей целью не является доказательство, что один из них для администрирования, но это, в свою очередь, несколь-
лучше другого – это несколько разные продукты, области ко повышает сложность работы с этой СУБД. Наиболее
применения которых во многом пересекаются, но отнюдь характерные различия сведены в таблицу, после которой
не совпадают, и сравнением я хочу определить нишу приведены некоторые комментарии-выводы.

26
администрирование
раторов и т. д. Что, впрочем, не мешает использовать эту
СУБД и для веб-приложений, например, форума или га-
лереи изображений.

Типовая установка
Для установки PostgreSQL во FreeBSD лучше всего вос-
пользоваться системой портов (/usr/ports/databases/
postgresql7 или другая актуальная версия). Однако в дан-
ном случае установка по умолчанию, скорее всего, вас
не устроит, поскольку в ней отсутствует поддержка рас-
ширенных кодировок, а следовательно, операции сорти-
ровки данных, хранимых в кириллической кодировке (на-
пример, KOI8-r), будут работать неправильно.
Прежде всего нужно собрать PostgreSQL с поддержкой
расширенных кодировок. Для этого добавьте в файл Makefile,
Существуют также различия в реализации некоторых размещенный в директории порта, следующие строки пос-
SQL-функций (PostgreSQL лучше соответствует стандар- ле первого упоминания переменной CONFIGURE_ARGS:
там), в наборе типов данных и т. д. Как видно из таблицы,
разработчики MySQL делают акцент на наилучшую ско- CONFIGURE_ARGS+= --enable-locale --enable-multibyte=KOI8 ↵
--enable-recode
рость чтения (выборки) данных, чем и объясняется попу-
лярность этой СУБД в среде веб-разработчиков, где вы- Параметр --enable-locale необходим для поддержки
борка – основная операция. Достигается это отсутствием специфических для страны настроек (так называемой ло-
транзакций (они реализованы только для некоторых ти- кали), --enable-recode включает поддержку перекодиров-
пов таблиц, например InnoDB, BerkleyDB) и многопоточ- ки (данный параметр для описываемого варианта, в кото-
ной работой, однако это же и является причиной несколь- ром везде используется только KOI8-r, необязателен, но
ко меньшей надежности данной СУБД. В плане прав дос- зачастую может быть весьма полезен). Параметр --enable-
тупа MySQL несколько превосходит PostgreSQL, позволяя multibyte собственно и включает поддержку кодировки
задавать права доступа не только на уровне таблицы, но KOI8-r. Если вы предпочитаете работать с другой кодо-
и на уровне столбца, однако в PostgreSQL это с лихвой вой таблицей, укажите ее в качестве аргумента. Параметр,
компенсируется возможностью создавать пользователь- заданный без аргумента, включит поддержку всех муль-
ские представления («view»). тибайтовых кодировок.
Наиболее острый вопрос, вызывающий нескончаемые Таким же образом вы можете добавить другие нуж-
споры, – сравнение скоростных характеристик этих двух ные вам опции или изменить поведение СУБД по умолча-
пакетов. Результаты тестов, доступные в Интернете, весь- нию. Например, изменить номер порта, который
ма противоречивы, что говорит об отсутствии явного ли- PostgreSQL будет прослушивать в ожидании запросов,
дерства той или иной СУБД. Кроме того, результаты бу- можно с помощью параметра --with-pgport=NUM (по умол-
дут сильно зависеть от конкретной реализации теста, пре- чанию – 5432). А ключ --with-perl позволит в дальнейшем
обладания тех или иных операций и нагрузки на систему. использовать процедурный язык PL/Perl для разработки
В одних случаях первенство будет за MySQL, в других – хранимых процедур в дополнение к PL/pgSQL. Для полу-
за PostgreSQL. чения информации по всем ключам запустите configure --
Также PostgreSQL часто сравнивают с коммерческой help.
СУБД Oracle. Oracle несколько превосходит PostgreSQL в После того как в Makefile внесены все нужные парамет-
таких вопросах, как использование индексов, репликация ры конфигурации, установка выполняется как обычно:
и восстановление данных, да и вообще инструменты ад-
министрирования Oracle более развиты (но вместе с тем # make && make install
и более сложны). С другой стороны, PostgreSQL предос-
тавляет возможность использовать в качестве процедур- В ряде случаев может оказаться полезным выполнить
ного языка помимо PL/pgSQL (очень схожего с PL/SQL, регрессионное тестирование, которое позволит убедить-
используемым в Oralce) также PL/Perl, PL/Python, PL/Tcl, ся в полной работоспособности откомпилированных про-
что позволяет разработчику выбрать более привычный грамм и выявить возможные проблемы еще до их инстал-
инструмент. ляции. В этом случае сборку системы нужно выполнить
Таким образом, можно сказать, что место PostgreSQL – со следующей опцией:
базы данных, требующие высокой степени надежности
хранения информации, предъявляющие повышенные тре- # make –DWITH_TESTS
бования к проверке всех изменений, имеющие необходи-
мость в автоматической корректировке большого числа И затем, убедившись в успешности тестирования, вы-
данных при изменении информации в одной из таблиц, а полнить установку:
также задачи, где требуется возможность разработки не-
тривиальных решений, использование нестандартных опе- # make install

№7(20), июль 2004 27


администрирование
Если ваша система не поддерживает коллекцию пор- ладки, но для реальной работы он явно неудобен. Можно,
тов или вы предпочитаете ставить все вручную, скачав конечно, запустить его в фоновом режиме, указав в кон-
предварительно архив с исходниками, то после распаков- це команды знак амперсанда (&), но мне больше нравит-
ки вам нужно будет выполнить конфигурацию с приведен- ся управлять процессом postmaster с помощью специаль-
ными выше параметрами: но для этого разработанной утилиты pg_ctl.
В обоих вариантах ключ –D позволяет задать каталог,
./configure --enable-locale --enable-multibyte=KOI8 ↵ в котором хранятся данные. Каталог должен быть иници-
--enable-recode .
ализирован командой initdb, как описывалось ранее. В
Ну и любителям прекомпилированных RPM-пакетов нуж- принципе ничто не мешает инициализировать несколько
но будет найти пакет, собранный с требуемыми опциями. каталогов данных и запустить одновременно несколько
Теперь для инициализации базы данных нужно выпол- процессов postmaster (при этом также нужно позаботить-
нить следующую команду: ся о том, чтобы каждый из них прослушивал свой порт).
Один процесс может одновременно обслуживать только
# su –l pgsql –c “initdb –E KOI8” один каталог данных.
Теперь для проверки, что все работает так, как ожидает-
Обратите внимание, что инициализацию БД нужно вы- ся, присоединитесь к базе template1 следующей командой:
полнять с правами того пользователя, от имени которого
процесс будет в дальнейшем запускаться, и это не дол- $ psql –U pgsql template1
жен быть root. Если вы ставили PostgreSQL из коллекции
портов, то для этих целей автоматически будет создан Если вы получили приветствие Интерактивного Терми-
пользователь pgsql, чье имя мы и указываем в команде нала PostgreSQL, значит, БД проинициализировалась и
su как аргумент ключа –l. Если же вы собирали систему сервер запущен правильно. А если это сообщение еще и
самостоятельно, то этого пользователя вам придется со- на русском языке, то вообще замечательно. Если же нет,
здать вручную и позаботиться о правах доступа к нужным то убедитесь, что переменная окружения LANG соответ-
исполнимым файлам, библиотекам и каталогам данных. ствует выбранной кодировке:
Обратите внимание на ключ –E команды initdb. Он по-
зволяет задать кодировку по умолчанию, с которой будет
создана база данных. Поддержка указываемой как аргу-
мент кодировки должна быть включена во время сборки В случае возникновения проблем проанализируйте
пакета. полученные сообщения об ошибках, поступающие на эк-
В процессе инициализации в папке /usr/local/pgsql бу- ран и в журнальные файлы (в зависимости от характера
дет создан каталог data со структурами двух БД – template0 ошибки это могут быть файлы /var/log/pgsql, /var/log/
и template1. Изменить путь к БД можно с помощью ключа messages и т. п.). Убедитесь, что вы запускаете PostgreSQL
–D команды initdb: от имени созданного ранее пользователя pgsql (впрочем,
имя может быть иным, например postgres). Запустите про-
# su –l pgsql –c “initdb –E KOI8 –D /var/databases/postgres/data” цесс postmaster в интерактивном режиме, как было опи-
сано выше. Если анализ диагностических сообщений не
По умолчанию для FreeBSD установка исполнимых позволяет выявить источник проблем, может помочь воз-
файлов происходит в папку /usr/local/bin. Если вы измени- врат на стадию инсталляции и выполнение регрессион-
ли это и новый путь не включен в переменную PATH, то ных тестов.
потребуется указать полный путь к файлу initdb. Итак, мы подключились к БД, интерактивный клиент
По окончании инициализации вам будет предложено общается с нами на нашем родном (или, по крайней мере,
два способа запуска процесса postmaster, который явля- на очень знакомом) языке. Еще одна вещь, которую же-
ется сервером СУБД: лательно дополнительно проверить, – кодировка, с кото-
рой БД была инициализирована. Для этого в терминале
$ /usr/local/bin/postmaster –D /usr/local/pgsql/data выполните команду \l, которая выводит список всех БД:

или

$ /usr/local/bin/pg_ctl –D /usr/local/pgsql/data –l logfile start

В первом случае запускается непосредственно процесс


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

28
администрирование
Поскольку у нас все работает, как и ожидалось, то хоста localhost без ввода пароля, поскольку этот хост оп-
теперь можно позаботиться об автоматической загрузке ределен как доверенный (trust). Если вы – единственный
сервера PostgreSQL при старте системы. Если вы стави- пользователь, имеющий терминальный доступ к серверу
ли СУБД из коллекции портов, то беспокоиться вам не о (например, PostgreSQL установлена на вашей машине для
чем – в папке /usr/local/etc/rc.d уже есть файл 010.pgsql.sh, изучения), то это можно не менять. Но поскольку никогда
который и будет отвечать за запуск и останов сервера нельзя быть уверенным, что злоумышленник не получит
СУБД. Если же установка выполнялась вручную, то вам доступ к командной оболочке, то лучше не пренебрегать
нужно будет перенести в соответствующий каталог (/etc/ дополнительной защитой.
rc.d, /usr/local/etc/rc.d) сценарий автозапуска, соответ- Поэтому имеет смысл ужесточить права доступа к дан-
ствующий вашей операционной системе, из подкатало- ным. Но об этом речь пойдет чуть ниже, а пока – неболь-
га contrib/start-scripts той папки, куда был распакован ди- шой раздел для тех, кто практически не имеет опыта ра-
стрибутив. боты с базами данных.
Что еще важно иметь в виду: пользователь pgsql явля-
ется администратором СУБД, то есть его полномочия по Пример простой базы данных
отношению к базам PostgreSQL практически ничем не (основам SQL посвящается…)
ограничены. Решим простейшую задачу: создадим телефонный
Кроме того, настоятельно не рекомендуется исполь- справочник, который технически будет реализован как
зовать базы template0 и template1 для работы. Поэтому одна таблица с тремя полями (ФИО, должность, теле-
первое, что нужно сейчас сделать, это создать новую базу фон). Вся работа будет показана как листинг одного
данных и нового пользователя, который будет являться сеанса.
владельцем этой БД. Создаем таблицу с полями person, post и phone:
Для выполнения этих операций, как и всех остальных,
будем использовать терминал psql:

Просмотр списка таблиц в базе:

Теперь у нас есть база данных, с которой в дальней-


шем и будем экспериментировать. Обратите внимание, Просмотр структуры таблицы:
что нового пользователя мы создавали с опциями
nocreatedb и nocreateuser, то есть он не будет иметь прав
на создание баз и пользователей. В дальнейшем следует
подключаться под этим пользователем к вновь созданной
базе test:

$ psql –U test test Добавляем запись:

Чтобы не указывать имя пользователя и базу каж-


дый раз при вызове терминала, вместо базы test и поль-
зователя test создайте базу и пользователя с именем, Смотрим, что получилось:
совпадающим с вашим системным именем. В этом слу-
чае запуск клиента можно осуществлять просто коман-
дой psql.
Хотя это и достаточно очевидно, все же следует ука-
зать, что пользователи СУБД и системные пользовате-
ли – не одно и то же. Добавляем еще одну запись. Как видно, после имени
Наверняка вас удивило, что при подключении к БД не таблицы не обязательно перечислять заполняемые поля.
указывается пароль. Действительно, настройка PostgreSQL В этом случае поля будут заполняться значениями по по-
по умолчанию позволяет пользователям подключаться с рядку:

№7(20), июль 2004 29


администрирование
Выходим:

Вот так мы познакомились с интерактивным термина-


лом и убедились, что с PostgreSQL вполне можно общать-
ся на языке SQL. Обратите внимание на синтаксис при-
Команда \h позволяет получить подсказку по любой глашения. Оно состоит из имени базы данных (в нашем
SQL-команде: случае – test). Далее следует символ «=», если редакти-
руется новая строка; «--», если продолжается ввод коман-
ды, начатый на предыдущей строке; или «(», если продол-
жается ввод и в предложении имеется незакрытая скоб-
ка. Завершает приглашение символ «#», если текущий
пользователь является владельцем подключенной БД, или
«>» в противном случае. Каждая вводимая SQL-команда
Так можно просмотреть все команды интерактивной обо- должна завершаться точкой с запятой. Для команд тер-
лочки (здесь приведены наиболее часто используемые): минала это не требуется.

Специфика PostgreSQL
Теперь более подробно рассмотрим конкретные особен-
ности PostgreSQL. Было бы жестоко пытаться втиснуть
весь материал в одну журнальную статью, поэтому этот
раздел будет носить скорее обзорный характер. А наибо-
лее интересным особенностям постараюсь посвятить не-
сколько отдельных статей.
Сперва – о типах данных. Помимо стандартных, соответ-
ствующих SLQ99 и SQL92 (numeric, char, varchar, bool и т. д.),
поддерживается и ряд специфических, например, геомет-
Просматривать можно не всю таблицу, а только ее рические типы данных (point, line, box, circle, polygon), сете-
часть, для чего условие выборки следует указать в пред- вые типы (cidr – спецификация сети IP, inet – IP-адрес,
ложении where: macaddr – MAC-адрес) и т. д. Конечно, дополнительные типы
данных не являются незаменимыми, но в ряде случаев су-
щественно упрощают логику и структуру базы. Например,
геометрические типы могут оказаться весьма полезными
при разработке картографических приложений.
Особо следует отметить специальный тип данных serial.
Изменим поле записи. Обратите внимание, что если Он описывает поле типа integer, значения которого зада-
не указать условие where, то будут изменены соответству- ются автоматически создаваемой последовательностью
ющие поля всех записей: (см. далее) и так же автоматически индексируются. То есть
это, по сути, аналог ограничения AUTO_INCREMENT в
MySQL.
Будучи объектно-реляционной СУБД, PostgreSQL под-
держивает и составные типы данных – массивы. Чтобы
определить поле как массив, его тип дополняется парой
квадратных скобок (например, «char(10)[]»). Массив (как
константа) записывается с помощью фигурных скобок:
Удалим одну из записей. Отсутствие предложения where «’{1,2,3}’», «’{“один”, “два”, “три”, “четыре”}’». Обращение
очистит всю таблицу: к элементу массива, как и в других языках программиро-
вания, выполняется по индексу: arra[2].
Пример:

Наигравшись, удаляем таблицу phbook.

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

PostgreSQL имеет довольно развитые возможности ра-


боты с индексами. Создаются они командой CREATE INDEX,
синтаксис которой можно посмотреть в терминале коман-
дой «\h create index». В ряде случаев индексы создаются
автоматически (например, для полей с ограничением
PRIMARY KEY). Созданные пользователем индексы мож-
но просмотреть командой \di. Поддерживается три типа
индексов: B-tree (по умолчанию), R-tree и хэш. В большин-
стве случаев следует использовать B-деревья, хотя иног-
да (например, при операциях с геометрическими типами
Как видно, первый элемент массива имеет индекс «1». данных) R-tree-индекс может показать лучшие результа-
С точки зрения PostgreSQL массив представляет собой ты. В любом случае выбор остается за пользователем.
специально форматированную строку, и именно этим Модифицировать таблицы можно с помощью коман-
обусловлена необходимость заключать запись массива в ды ALTER TABLE. Однако нужно заметить, что она не по-
апострофы независимо от типа его элементов. Для мас- зволяет удалять столбцы или менять их тип, что связано с
сива строк каждый элемент также должен быть заключен особенностями организации базы данных. В большинстве
в двойные кавычки. Очевидно, что скорость обработки случаев достаточно переименовать ненужный столбец во
массивов оставляет желать лучшего, однако в ряде слу- что-нибудь типа «deleted» и забыть про него. Если же очень
чаев возможность работать с этим типом может оказать- хочется удалить его физически, то воспользуйтесь коман-
ся весьма удобной. дой CREATE TABLE AS, которая создаст новую таблицу
Теперь про обещанные ранее последовательности. на базе существующей (или даже нескольких, поскольку
Последовательность (sequence) представляет собой счет- источником данных может быть любой запрос). Кроме
чик, то есть автоматически увеличивающееся целое чис- того, всегда можно воспользоваться «универсальным ал-
ло. При вызове специальной функции nextval(‘seq_name’), горитмом»:
где seq_name – имя последовательности, значение пос- ! CREATE TABLE newtable .. – создаем новую таблицу с
ледовательности увеличивается на шаг, заданный при ее нужной структурой;
создании (по умолчанию – 1), и возвращается получен- ! INSERT INTO newtable SELECT .. FROM oldtable – встав-
ное значение. Прочитать это значение еще раз без увели- ляем в новую таблицу нужные поля записей из старой;
чения последовательности можно с помощью функции ! DROP TABLE oldtable – удаляем старую таблицу;
currval(‘seq_name’). Следующий листинг демонстрирует ! ALTER TABLE newtable RENAME TO oldtable – переиме-
основные принципы работы с последовательностью: новываем новую.

Очень интересная возможность, имеющаяся в Postgre


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

№7(20), июль 2004 31


администрирование
чу: требуется БД для учета имеющихся на предприятии ко со всеми производными (указав ключевое слово
компьютеров (IP-адрес машины, место установки, опера- CASCADE в команде DROP TABLE).
ционная система), при этом для серверов дополнительно PostgreSQL позволяет создавать собственные функции,
требуется указать работающие на них службы (WWW, FTP, которые сохраняются в базе данных и могут быть исполь-
DNS и т. д.). В классической реляционной СУБД это ре- зованы при модификации полей записи, в операциях вы-
шалось бы созданием отдельной таблицы для хранения борки по условию, как триггеры, и т. д. Разработчику, по-
информации по службам и привязкой ее к таблице ма- мимо процедурного языка PL/pgSQL (являющегося ана-
шин по IP либо по дополнительному полю-идентификато- логом PL/SQL в СУБД Oracle), доступны PL/Perl, PL/Python
ру. Объектные возможности PostgreSQL позволяют ре- и др. Для этого PostgreSQL должна собираться с соответ-
шить указанную задачу следующим образом: ствующими опциями.
Создаем родительскую таблицу (как обычно): Те, кому доводилось работать с Oracle, знакомы с та-
кой удобной возможностью для автоматизации операций
с БД, как триггеры. Спешу их обрадовать – PostgreSQL
также поддерживает триггеры в полном объеме. Триггер
Добавляем в нее запись для рабочей станции (все опе- связывает функцию с операцией модификации таблицы.
рации – обычные): Например, с его помощью можно проверять правильность
вводимых данных или при удалении одной записи авто-
матически удалять и все, логически связанные с удаляе-
мой (или соответствующим образом модифицировать). В
данной статье я не буду останавливаться на описании
работы с функциями и триггерами, поскольку это доволь-
но обширная тема.
Создаем дочернюю таблицу (предложение inherits с Следующая особенность СУБД – возможность созда-
указанием родительских таблиц): вать представления пользователя (view), которые пред-
ставляют собой результаты выборки (запроса), доступные
для непосредственного обращения к ним в будущем без
пересылки повторных запросов. Помимо упрощения ло-
Хотя таблица servers создавалась с одним полем, три гики работы с БД (когда вместо сложных запросов к не-
других она унаследовала от родительской: скольким таблицам можно отправить весьма простой зап-
рос к представлению пользователя), эта возможность по-
зволяет гибко управлять доступностью данных для раз-
личных пользователей. Например, если в БД есть табли-
ца, содержащая имена и пароли клиентов, но оператор
В родительской таблице видим записи и из родитель- должен получить доступ только к именам, то достаточно
ской, и из дочерней, но без учета полей, заданных только создать представление, в которое выбрать поле «Имя», и
в дочерней: дать оператору доступ к нему, а возможность чтения са-
мой таблицы исключить.
Ну и напоследок несколько слов о транзакциях. Этот
механизм позволяет выполнять несколько операций по
модификации БД единым блоком, что гарантирует целос-
тность данных. Например, если при оформлении покупки
через интернет-магазин нужно занести запись о покупке
В дочерней – только те, которые заносились непосред- и одновременно уменьшить количество соответствующих
ственно в нее: товаров на складе, то в результате сбоя может сложиться
ситуация, когда запись о покупке будет сделана, а товар –
не зарезервирован. В ходе же транзакции изменения в
базу данных записываются только в случае успешности
всех операций.
Транзакционный блок открывается командой BEGIN (не
Ключевое слово ONLY позволяет выбрать записи из забывайте завершать эту команду, как и все остальные,
родительской таблицы без учета содержимого дочерней: точкой с запятой). Все изменения, выполняемые в блоке,
не отражаются на базе данных, пока не поступит команда
COMMIT, по которой выполняется запись всех сделанных
изменений. Отменить транзакцию (например, в случае вы-
явления ошибки) позволяет команда ROLLBACK. Если вы
недостаточно хорошо представляете, как это работает,
Как видите, наследование позволяет создавать впол- попробуйте поработать с таблицами внутри транзакцион-
не логичные и удобные для работы структуры. Следует ного блока, анализируя изменения, происходящие при под-
также заметить, что удалить базовую таблицу можно толь- тверждении транзакции (COMMIT) и ее откате (ROLLBACK).

32
администрирование
Обратите внимание, что такие операции, как удаление таб-
лицы, внутри транзакции выполнены быть не могут.

Вопросы администрирования
В начале статьи упоминалось, что локальные пользовате-
ли компьютера, на котором запущен сервер postmaster,
могут подключаться к БД под именем любого пользова-
теля без указания пароля. Связано это с тем, что хост
localhost по умолчанию является доверенным. Изменить
это можно в файле pg_hba.conf, находящемся в каталоге
data, инициированном командой initdb. Некоторого пояснения требуют команды назначения и
Синтаксис этого файла хорошо прокомментирован в отмены привилегий (GRANT и REVOKE). Команда GRANT
нем самом. Поле TYPE содержит тип записи, который позволяет давать пользователю или группе следующие
может быть одним из следующих: local (соединение, уста- права (перечислены только основные):
навливаемое с того же компьютера, на котором работает
сервер СУБД; использует сокеты UNIX), host (соединение
TCP/IP) или hostssl (защищенное соединение TCP/IP с
использованием протокола SSL).
Поле METHOD может содержать следующие записи:
! trust – доверенный хост, подключения не требуют па-
роля; Аналогично, команда REVOKE ограничивает соответ-
! reject – отклонить соединение; ствующие права. В качестве объекта, для работы с кото-
! password – требовать соответствия пароля (передает- рым назначаются права, могут выступать таблицы, пред-
ся в открытом виде); ставления пользователя и последовательности. Посмот-
! crypt – требовать соответствия пароля (пароль шиф- реть назначенные привилегии доступа позволяет коман-
руется); да терминала \z.
! krb4, krb5 – аутентификация Kerberos; При необходимости программного доступа к инфор-
! ident – аутентификация по карте соответствия имени мации о пользователях и привилегиях весьма полезны
пользователя PostgreSQL системному имени пользо- служебные таблицы pg_shadow (таблица пользователей)
вателя. Карты соответствия содержатся в файле и pg_class (права доступа к объектам БД).
pg_ident.conf. Для тех, кто клавиатуре предпочитает мышь, разрабо-
тан пакет phpPgAdmin (аналог phpMyAdmin для MySQL),
Назначение остальных полей файла pg_hba.conf пояс- позволяющий работать с СУБД через веб-интерфейс. Для
нений, думаю, не требует. При запросе соединения про- FreeBSD найти его можно в коллекции портов: /usr/ports/
верка условий выполняется с начала файла до обнаруже- databases/phppgadmin.
ния соответствия, после чего выполняется действие, за- Также существует мультиплатформенная графическая
данное полем METHOD. Если соответствие не будет най- оболочка pgAdmin (www.pgadmin.org/pgadmin3), обеспечи-
дено, соединение не будет установлено. Следует заме- вающая доступ ко всем функциям администрирования и
тить, что после внесения изменений в этот файл требует- разработки.
ся перезапустить процесс postmaster, послав ему сигнал
SIGHUP, либо перезагрузить сервер СУБД командой: Заключение
Итак, были рассмотрены основные особенности СУБД
# pg_ctl reload PostgreSQL. Описание получилось несколько расплывча-
тым и отрывочным, но надеюсь, эта статья все же позво-
Чтобы сервер мог обслуживать подключения по прото- лит вам оценить возможности этой системы управления
колу TCP/IP, процесс postmaster должен быть запущен с базами данных и принять принципиальное решение о ее
ключом –i. Для SSL-соединений также требуется ключ –l, использовании (или неиспользовании) для решения сто-
и, кроме того, СУБД должна быть собрана с поддержкой ящих перед вами задач.
SSL (ключ --with-openssl).
Управление базой данных может осуществляться с Дополнительная информация:
помощью SQL-команд. Ряд функций может быть выпол- ! Страницы справочного руководства man (см. каталог
нен внешними программами. Ниже представлена табли- /usr/local/pgsql/man/man1 (программы «обвязки») и
ца, описывающая некоторые полезные команды: man7 (справки по командам SQL));
! Встроенная справка интерактивного терминала (\h –
справочник по SQL-командам, \? – справочник по ко-
мандам терминала);
! Официальный сайт проекта – www.postgresql.org, один
из русскоязычных сайтов – www.linuxshare.ru/docs/
software/SQL/postgresql)

№7(20), июль 2004 33


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

УПРОЩАЕМ СЕБЕ ЖИЗНЬ С WEBMIN

СЕРГЕЙ ЯРЕМЧУК
У UNIX-подобных операционных систем много положи- у которых нет в данный момент доступа к компьютеру с
тельных сторон: безопасность, стабильность и, что осо- установленной UNIX-подобной системой, а стандартные
бенно привлекает внимание многих, – бесплатность. Но сетевые средства Windows не блещут особым выбором
для начинающих системных администраторов настройка необходимых утилит. В этом случае, используя любой веб-
системы может превратиться в настоящий ад. Копание в браузер, поддерживающий таблицы и формы (и JAVA для
конфигурационных файлах, постоянное чтение докумен- некоторых модулей), можно без затруднений в наглядной
тации, к тому же на не для всех понятном английском язы- форме с локального или удаленного компьютера настро-
ке, может отпугнуть любого, привычного к удобному ин- ить пользовательские аккаунты, установить/удалить про-
терфейсу Windows-систем. Да что там отпугнуть, ошибки граммы, настроить Web, mail, DNS-сервер, сервер печа-
в конфигурационных файлах могут привести к серьезным ти, управлять базами данных, организовать совместное
проблемам с безопасностью. Мне часто в письмах прихо- использование файлов, применяя Samba или NFS, настро-
дят просьбы от новичков помочь подобрать дистрибутив ить firewall, синхронизировать время, организовать совме-
для использования в качестве шлюза, но с обязательным стный доступ в Интернет, мониторинг состояния серви-
наличием веб-интерфейса, сегодня попробуем раз и на- сов, осуществить резервное копирование, записать CD-
всегда решить эту проблему. диск, получить доступ к файлам на удаленном компьюте-
Webmin (http://www.webmin.com) представляет собой ре, в том числе документации и прочие бесчисленные за-
веб-интерфейс для системного администрирования UNIX, дачи администрирования, коих не счесть, но требующих
использование которого существенно упрощает процесс определенных умений. При этом Webmin избавит вас от
управления системой. Кроме того, он будет полезен для синтаксических ошибок и неточностей, как сможет пре-
удаленного управления системой тем администраторам, дупредит о потенциально опасных действиях. Но это, прав-

34
администрирование
да, не значит, что совсем не обязательно все знать, и ум-
ная утилита сделает все сама. Иметь некоторые представ-
ления о строении UNIX, значениях тех или иных утилит,
особенностях работы протоколов и сервисов все-таки не-
обходимо. Опытным администраторам также не стоит иг-
норировать наличие такой удобной утилиты, ведь помнить
все параметры в конфигурационных файлах и тонкости
настройки сервисов на различных системах, согласитесь,
довольно тяжело.
Написанный Джейми Камероном (Jamie Cameron) на Еще один момент. Для возможности работы по защи-
языке Perl, Webmin имеет модульную структуру, позво- щенному каналу (а из внешней сети работать нужно толь-
ляющую свободно наращивать требуемую функциональ- ко так, да и во внутренней не будет лишней подстраховка)
ность или, наоборот, убрать все ненужное. В настоящее требуется наличие модуля Net::SSLeay и OpenSSL (http://
время доступно около 200 модулей как входящих в стан- www.openssl.org/). Поэтому при появлении сообщения
дартную поставку, так и доступных для загрузки отдель-
но. Дополнительно ко всему интерфейс переведен на 32
языка, среди которых имеется и русский. На странице загрузите модуль с CPAN и повторите установку, за до-
http://www.webmin.com/support.html найдете список из 35 полнительной информацией обращайтесь по адресу: http:/
UNIX-подобных операционных систем (в том числе и /www.webmin.com/ssl.html. Иначе в строке веб-браузера
Cygwin, Mac OS X), на которых Webmin без проблем бу- набирайте http вместо https. Кстати, удалить Webmin так-
дет работать. Если вашего дистрибутива в нем нет, то же просто. Запускаем скрипт /etc/webmin/uninstall.sh, и его
отчаиваться не стоит, скорее всего, Webmin удастся зас- как не бывало. Дальнейшую настройку можно произво-
тавить работать без трудностей. При этом одним из ос- дить уже через Webmin. Но, например, если вы забыли
новных преимуществ Webmin является то, что он факти- пароль, то локально его изменить можно при помощи
чески подстраивается, в том числе изменяя свой интер- скрипта changepass.pl.
фейс и поведение в соответствии с используемой ОС,
т.е. фактически скрывает от конечного пользователя раз- #/usr/local/webmin-1.140/changepass.pl /etc/webmin ↵
ïîëüçîâàòåëü íîâûé_ïàðîëü
личия между всеми вариантами UNIX. Еще одним преиму-
ществом Webmin является возможность делегировать Также изменить некоторые настройки можно, напря-
часть полномочий по настройке определенных сервисов мую редактируя конфигурационные файлы miniserv.conf
другим пользователям. Установить Webmin проще просто- и config, которые лежат в каталоге с Webmin. В них воз-
го: скачиваем архив размером чуть меньше 7 Мб (доступ- можно изменить значение сетевого порта, включить/вык-
ны и прекомпилированные пакеты), распаковываем его, лючить SSL (опция ssl=0/1), изменить месторасположение
заходим внутрь и даем команду ./setup с указанием ка- рабочих файлов, установить другой язык интерфейса (для
талога, в котором вы хотите видеть установленный русского значение lang должно быть ru_RU (для кодиров-
Webmin. По умолчанию установка будет произведена в ки СР-1251) или ru_SU (koi8-r)). Если планируете часто за-
текущий каталог. После чего необходимо будет ответить ходить с компьютеров, где установлена ОС Windows, вы-
на ряд вопросов о будущем размещении конфигураци- берите лучше вариант с СР-1251, тогда будете реже пе-
онных файлов, нахождении интерпретатора Perl, номе- ренастраивать кодировку в браузере. После изменений
ре порта, на котором Webmin будет ожидать соединения перезапустите webmin.
(по умолчанию 10000), логин и пароль для доступа, ав-
томатический запуск при старте системы. # /etc/webmin/stop && /etc/webmin/start

Но все настройки, повторяю, теперь доступны через веб-


браузер. Набираем в строке браузера https://hostname:10000,
авторизируемся (рис. 1):

В большинстве случаев можно со всем соглашаться и


нажимать Enter. Если программа установки что-либо сама
не найдет, то тогда в другой консоли при помощи whereis
самостоятельно находим и прописываем путь вручную.
После чего запустится свой мини-веб-сервер и будет вы- Ðèñóíîê 1
дана подсказка, по которой можно найти в сети webmin. После чего попадаем в главное окно программы (рис. 2).

№7(20), июль 2004 35


администрирование
ляется родным языком админа, но, согласитесь, общать-
ся на родном все же приятней. Заходим «Webmin
Configuration → Language» и выбираем из выпадающего
списка нужный язык, после чего подтверждаем свой вы-
бор нажатием на «Change Language». И возвращаемся
теперь уже к пункту «Настройка Webmin». По умолча-
нию Webmin будет принимать подключения со всех ад-
ресов, что не всегда нужно и безопасно, используя пункт
«Управление доступом по IP» (IP Access Control), можно
ограничить доступ, оставив его только для тех адресов,
которым вы доверяете (например, внутренняя сеть), пол-
ный доступ можно разрешить, только если вы, например,
уезжаете в отпуск и хотите иметь возможность попасть
на свой сервер. Здесь возможно задать в качестве па-
раметра сразу сеть или подсеть, отдельные узлы по IP-
адресу или доменному имени. В последнем случае для
Ðèñóíîê 2 подстраховки установите галочку в пункте «Определять
Как видите, вполне привычная большинству пользо- IP-адрес по имени при каждом запросе». Для быстроты
вателей рабочая обстановка. эту операцию можно проделать и вручную, использовав
Небольшое примечание: если Webmin уже был уста- в файле /etc/webmin/miniserv.conf параметры allow= или
новлен в системе, то для входа вместо admin придется deny=. Первый содержит список узлов и компьютеров,
воспользоватья root (нужного пользователя можно посмот- перечисленных через пробел, которым позволено соеди-
реть в файле webmin.acl, он идет первым, например, няться, второй, наоборот, попытки доступа с которых
admin), но затем заведите лучше отдельного пользовате- будут игнорироваться.
ля для работы с Webmin. Также в некоторых дистрибути- После установки при положительном ответе на воп-
вах может быть выставлен другой порт, используемый рос «Start Webmin at boot time» Webmin будет загружать-
Webmin, иногда при выборе его значения следует учиты- ся при старте системы, другим вариантом запуска бу-
вать, что некоторые провайдеры не любят пропускать па- дет использование для этих целей xinetd. Для этого в
кеты на порты с адресами выше 1024, и, например, если файл miniserv.conf добавляем строчку inetd=1 и убира-
не используется защищенный веб-доступ, то вполне по- ем session=1. После этого пишем в файл /etc/xinetd.conf
дойдет порт 443, также и проследите, чтобы нужный порт (в некоторых дистрибутивах вроде Slaskware его сна-
был открыт firewall. чала создаем командой touch /etc/xinetd.conf):
А так, зная особенности работы тех или иных серви-
сов, настроить их с Webmin особого труда не составит, service webmin
{
просто выбираете нужную категорию (рис. 3) и заполняе- user = root
те или выбираете параметры, к тому же по адресу http:// env = LANG=
port = 10000
www.swelltech.com/support/webminguide-1.0/index.html до- socket_type = stream
ступна неплохая книга по использованию, которая будет protocol = tcp
wait = no
особенно полезна начинающим «The book of Webmin». disable = no
type = UNLISTED
server = /usr/local/webmin-1.140/miniserv.pl
server_args = /etc/webmin/miniserv.conf
}

После чего перезапускаем xinetd.


Теперь самое время заняться пользователями. Для
начала используем модуль «Аутентификация», который
позволяет включить увеличение задержки между неудач-
ными попытками ввода пароля для одного и того же
пользователя и блокирование доступа после нескольких
неудачных попыток на определенное время, что затруд-
нит попытки подбора пароля в лоб, все подобные дей-
ствия можно также заносить в журнал. Для забывчивых
и ленивых пользователей можно активировать опцию, по-
зволяющую автоматически отключать доступ после оп-
ределенного интервала времени, и здесь же отключить
Ðèñóíîê 3 возможность запоминания введенного пароля. Для улуч-
Остановлюсь лишь на мерах безопасности и удобстве. шения защиты от перебора стоит также установить ути-
Вполне возможно, что после регистрации перед вами литу logwatch http://www.logwatch.org/, с которой отлично
предстанет английский интерфейс. Хоть английский и яв- ладит Webmin.

36
администрирование
Следующий полезный модуль «Пользователи Webmin» ты. Некоторые модули доступны с главного сайта, большую
(Webmin Users) позволит создать пользователя или груп- коллекцию модулей найдете по адресу http://www.thirdparty
пу, наделенную определенными правами по работе с теми modules.com/webmin. В первую очередь хотелось бы от-
или иными сервисами. метить модуль Usermin (http://www.usermin.com), написан-
Здесь же можно преобразовать пользователей UNIX в ный также Джейми Камероном. В отличие от Webmin, на-
пользователей Webmin с определенными правами, настро- целенного на администратора, Usermin ориентирован на
ить синхронизацию пользователей, при которой вновь со- конечного пользователя, позволяя читать почту, работать
зданные пользователи автоматически попадают в одну из с GPG, иметь удаленный доступ к своим файлам, управ-
групп Webmin, настроить аутентификацию пользователей, лять заданиями cron и пр.
просмотреть журналы работы и прервать сеанс пользо-
вателя.
Webmin может вести журнал событий в стандартном
формате журнальных файлов CLF (combined log format),
при этом имеет довольно гибкие возможности по регист-
рации. Так, зайдя в меню «Настройка Webmin» → «Жур-
нал» можно указать, какие IP-адреса и имена узлов будут
заноситься в журнал, действия каких пользователей бу-
дут регистрироваться, а также как часто журнал будет
очищаться. Записи журнала будут заноситься в файл /var/
webmin/miniserv.log.
Кроме того, при активации опции «Заносить измене-
ния, произведенные в файлах при каждом действии» так-
же будут вестись подробные записи действий пользова-
телей в файл /var/webmin/webmin.log. Этот журнал может
быть просмотрен и проанализирован с помощью модуля
«Журнал действий Webmin» (Webmin Actions Log). Ðèñóíîê 4
Если возможностей Webmin не хватает или соскучи- Для установки достаточно зайти в раздел «Настрой-
лись по командной строке, то во вкладке «Прочее» (Others) ка Usermin» (Usermin Configuration) и нажать на кнопку
имеются несколько специальных пунктов. «Вход по SSH/ «Install Usermin tar.gz package». Для работы с модулями
Telnet» (SSH/Telnet Login), который по умолчанию пыта- (обычно файл с расширением .wbm, хотя возможна ус-
ется подключиться к 23 порту сервиса telnet, чтобы из- тановка и rpm-пакетов) заходим в «Модули Webmin»
менить поведение, нажимаем вкладку «Настройка моду- (Webmin Modules), где можно установить новый, указав
ля» и в строке «Тип соединения» выбираем Secure Shell, его местонахождение на локальном диске или в Интер-
здесь же можно выставить количество строк, другой узел нете, удалить модуль, выбрав его из списка, или копиро-
для работы и использование отдельного окна. Так что вать модуль. Копирование модулей позволяет иметь один
Webmin может пригодиться для того, чтобы попасть на и тот же модуль с разными настройками, который можно
свои компьютеры, используя SSH в местах, где не так положить в разные группы для быстрого доступа и раз-
просто найти необходимые приложения (даже из интер- решить доступ разным пользователям.
нет-кафе), для этого достаточно запустить его на одной Из других удобств следует отметить возможность из-
из своих машин. менения внешнего вида (в одноименной вкладке), позво-
Далее во вкладке «Прочие» обнаруживается и интер- ляющую подобрать цвета по вкусу и более глобально из-
фейс к командному интерпретатору «Командная оболоч- менить вид, в том числе значки, цвета, фон и располо-
ка (shell)» (Command Shell), позволяющий удаленно вы- жение страниц темы. Может, кому это покажется и иг-
полнять команды оболочки и поддерживающий историю рушкой, но когда приходится удаленно настраивать ра-
команд. боту нескольких узлов одновременно, то разное оформ-
Следующий пункт «Команды пользователя» (Custom ление позволяет меньше путаться.
Commands) позволяет неподготовленным пользователям Вот такой он, Webmin. Простой в установке и настрой-
выполнять команды или скрипты нажатием одной кнопки. ке, полезный в работе, позволяющий администраторам
Админу достаточно создать команду, заполнив соответ- больше сосредоточиться на процессе настройки системы
ствующие поля (прописать комманду, задать параметры и дающий возможность безопасно работать и получать
пользователя, от имени которого будет выполняться ко- информацию из тех мест, где нет доступа нужным утили-
манда, добавить описание и пр.). там. Есть, конечно, и другие утилиты, имеющие аналогич-
Здесь же во вкладке «Прочее» найдете и менеджер ные (почти) возможности, наиболее популярен здесь
файлов (рис. 4) (требует подержки JAVA), который позво- linuxconf (http://www.solucorp.qc.ca/linuxconf), традиционно
лит получить доступ к файлам на удаленном компьютере входящий в состав RedHat и умеющий работать как в кон-
в удобной графической оболочке. соли, так и в Х, и позволяющий подключаться через сеть.
Модульность Webmin позволяет нарастить функцио- Но все-таки linuxconf, как мне кажется, менее удобен, осо-
нальность до нужного уровня, а с другой стороны, убрать бенно для новичка, имеет меньше возможностей и ори-
лишнее, чтобы не мозолило глаза и не отвлекало от рабо- ентирован в первую очередь на локальное применение.

№7(20), июль 2004 37


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

FreeBSD TIPS: ARP В «ЗАМОРОЗКЕ»

При работе в локальной сети правила безопасности на сервере чаще всего относятся сразу ко всей
подсети. Причем вполне обычная практика – оставлять в адресном пространстве резерв для будущего
расширения. Да и невозможно в принципе задать подсеть, содержащую ровно 7 адресов, – все равно
придется выделять 14. То есть практически в любой сети есть неиспользуемые адреса, на которые
распространяются общие правила доступа. Конечно, любые поползновения извне можно очень
эффективно отсекать пакетными фильтрами и прочими изобретениями изворотливого человеческого
разума. Но вряд ли найдется организация, в которой системный администратор может свято верить
в грамотность, ответственность и порядочность всех без исключения сотрудников, работающих в сети
изнутри. А если политика компании включает еще и попытки учитывать и ограничивать трафик
с каждого IP-адреса, то нет никаких гарантий, что никому не придет в голову «случайно» прописать
в своих настройках адрес соседа…

СЕРГЕЙ СУПРУНОВ
Данная заметка о том, как решить указанную выше про- IP-адресах, то кто-то должен уметь сопоставлять IP-адрес
блему, если роутер, через который локальная сеть выхо- сетевого устройства с MAC-адресом его адаптера. Этим
дит в «мир», построен на базе FreeBSD, а сама сеть вклю- «кем-то» является протокол ARP (address resolution protocol).
чает два-три десятка машин, сосредоточенных в одном Собственно говоря, вся работа ARP заключается в том,
сегменте (при большем количестве компьютеров эффек- чтобы по IP-адресу хоста возвратить MAC-адрес его адап-
тивность описываемой методики заметно снижается, хотя тера, который используется для связи с данной машиной.
она и остается вполне работоспособной). Не могу гаран- Для этого ARP формирует в памяти компьютера (или дру-
тировать, что на всех версиях этой ОС все будет работать гого устройства, на котором он запущен, например, ком-
так, как описано, но для FreeBSD 5.2 никаких проблем об- мутатора) таблицу соответствия, именуемую далее ARP-
наружено не было. Да, собственно, и взяться им неотку- таблицей. Если требуемый физический адрес в ARP-таб-
да, настолько все просто. лице существует, то все соответствующие кадры направ-
Сначала немного теории. Для передачи кадра (речь бу- ляются на него. Если нет, то отправляется широковеща-
дет идти об Ethernet) другому устройству сетевой адаптер тельный фрейм с IP-адресом искомого хоста. Этот фрейм
машины должен знать его физический (MAC) адрес. Уда- принимают все адаптеры, и если, обработав этот запрос,
ленное устройство будет принимать только кадры, содер- удаленный хост видит в нем свой интернет-адрес, то он
жащие в заголовке (поле Destination) его адрес, то есть отсылает ответ запросившему устройству, в котором по-
адресованные именно ему. Ну еще широковещательные мимо прочего содержится и MAC-адрес его адаптера. Эта
кадры, адресованные на специальный адрес ff:ff:ff:ff:ff:ff. Но информация добавляется в ARP-таблицу для дальнейше-
поскольку работа протоколов верхних уровней основана на го использования.

38
администрирование
Формируемые описанным выше способом, то есть ди- # arp –an | awk –v OFS=”\t” ‘{print(substr($2, 2, ↵
намически, записи в ARP-таблице сохраняются временно. length($2)-2), $4)}’ > ethers
Если в течение 20 минут (значение по умолчанию) обраще- Теперь файл ethers будет заполнен нужным образом.
ния к записи не происходит, она удаляется из таблицы. Останется только удалить записи, которые мы хотим ос-
Помимо динамических записей в ARP-таблице могут тавить динамическими (например, маршрутизаторы
быть созданы постоянные (permanent), они же статичес- CISCO при перезагрузке могут менять MAC-адрес своих
кие, записи. Они хранятся «вечно» (точнее, до перезаг- интерфейсов, выбирая их из некоторого пула, а добирать-
рузки), и, кроме того, попытка установить соединение с ся среди ночи на работу, чтобы подправить ARP-таблицу –
«чужим» IP-адресом с треском провалится, а в систем- занятие не из приятных).
ном журнале появится сообщение об ошибке. К слову ска- Для адресов, которые не задействованы в подсети,
зать, изменение динамической записи также сопровож- можно создать статические записи с фиктивными физи-
дается соответствующим сообщением, но соединение при ческими адресами (например, 00:11:22:33:44:55). Это ис-
этом устанавливается без каких-либо трудностей. Кроме ключит возможность использования кем-либо данных IP-
того, если на момент подмены IP-адреса динамической адресов.
записи с его участием в ARP-таблице не существует, то и Далее очищаем ARP-таблицу и заполняем ее из сфор-
никаких разоблачающих сообщений не появится. мированного файла:
Управлять записями ARP-таблицы позволяет одно-
именная утилита arp. Ее полный синтаксис доступен в man # arp –d –a
# arp –f /usr/local/etc/ethers
arp(8). Нам понадобятся следующие команды:
! arp –a – выводит содержимое таблицы ARP. Естественно, имя и местоположение файла соответ-
! arp <host> – выводит ARP-запись для заданного хоста. ствия может быть любым – удобным для вас. Теперь оста-
! arp –d <host> – удаляет запись, соответствующую хосту. лось занести указанные команды в сценарий автозапус-
! arp –d –a – удаляет все записи таблицы. ка, например, с именем /usr/local/etc/rc.d/statarp.sh:
! arp –s <host> <MAC-address> – добавляет запись.
! arp –f <file> – добавляет записи из файла соответствия #!/bin/sh
# Static ARP-table loader
<file>.
case $1 in
start)
Таким образом, дальнейшие действия понятны – для arp -d -a > /dev/null
всех «критических» (а если сеть небольшая, то просто для arp -f /usr/local/etc/ethers > /dev/null
echo 'Static ARP-table is loaded'
всех) IP-адресов можно создать статические записи в ARP- ;;
таблице, тем самым исключив их подмену. Для этого су- stop)
arp -d -a > /dev/null
ществует два пути: echo 'Static ARP-table is unloaded'
! Использовать команду arp –s <host> <MAC-address> restart)
;;
для создания каждой записи; arp -d -a > /dev/null
! Создать файл соответствия и выполнить команду arp –f arp -f /usr/local/etc/ethers > /dev/null
echo 'Static ARP-table is reloaded'
<file>. ;;
status)
arp -an
Первый способ слишком трудоемкий, поэтому возьмем ;;
на вооружение второй вариант. В этом случае файл соот- *)
echo "Usage: `basename $0` ↵
ветствия требуется создать один раз, и в дальнейшем {start|stop|restart|status}" >&2
будет очень легко обеспечить автоматическое заполне- ;;
esac
ние ARP-таблицы статическими записями при перезагруз- exit 0
ке компьютера.
Формат файла соответствия продемонстрирован на Осталось не забыть сделать данный файл исполняе-
следующем примере: мым.
Итак, мы получили статическую таблицу соответствия
между IP- и MAC-адресами. Теперь выход в Интернет че-
рез FreeBSD-сервер с «чужого» IP-адреса станет невоз-
То есть в каждой строке записывается IP-адрес хоста можным, если, конечно, заодно не подменить и MAC-ад-
(либо его каноническое имя) и через пробелы или симво- рес (с последним явлением можно бороться разве что
лы табуляции – соответствующий ему MAC-адрес. Запол- организационными методами).
нить его достаточно просто – включите все машины сег- Но любая палка, как известно, о двух концах. За повы-
мента и обратитесь с них к серверу (или с сервера к ним) шение защищенности сети придется платить дополнитель-
любым способом, например, запустите на них браузер или ными заботами по администрированию, поскольку теперь
выполните обычный пинг. Это обновит ARP-таблицу, пос- добавление новой машины в сеть, замена сетевого адап-
ле чего достаточно будет сохранить в файле результат вы- тера, смена IP-адреса должны сопровождаться правкой и
полнения команды «arp –an» и немного его подправить, перезагрузкой ARP-таблицы. Хотя это все равно лучше,
удалив все лишнее и добавив нужное. Сократить необхо- чем бегать по этажам, «вычисляя» недобросовестного
димые правки позволит следующая команда: пользователя.

№7(20), июль 2004 39


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

СТРОИМ ШЛЮЗ С LUINUX

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

СЕРГЕЙ ЯРЕМЧУК
Построенный на основе Debian испанский дистрибутив прозрачное http-кэширование, для удаленной настройки
Luinux http://www.masilla.org/luinux/ предназначен как раз используется SSH, статистику о работе можно получить
для использования в качестве интернет-шлюза (ПК, ви- при помощи веб-интерфейса, возможность создания сво-
деоконсоль, ТВ) в домашних сетях или для небольших его сервера для обмена мгновенными сообщениями, на-
организаций. Построен по принципу «установил и исполь- стройка совместного использования файлов, в том числе
зуй». Распознает большую часть Ethernet-адаптеров, кро- и NetBios, автоматическая установка времени при помо-
ме традиционного для Linux firewall, имеет в своем соста- щи NTP (Network Time Protocol).
ве и NIDS Snort, поддерживается возможность легкого Для работы Luinux требуется по нынешним временам да-
создания бекапов в iso, поддержка QoS позволяет распо- леко не самый мощный компьютер: процессор 166 МГц+,
ложить по приоритетам важный трафик, поддерживается ОЗУ 64 Mб+ (128 Mб рекомендуется) и жесткий диск не

40
администрирование
менее 1 Гб (SCSI не поддерживаются). И два сетевых адап- настроен на адрес 192.168.1.1, рекомендую его так и ос-
тера: к первому eth0 подключается провайдер, ко второ- тавить, если не хотите потом перестраивать самостоятель-
му eth1 – локальная сеть. но все остальные сервисы. Проверяем, как поднята сеть.

Установка #ifconfig
Установка особых проблем вызвать не должна. Загружа-
ем ISO-образ размером 77 Мб, записываем и загружаем- Если утилита выдала информацию о двух сетевых ин-
ся с него. Если BIOS не поддерживает загрузку с CD-ROM, терфейсах с выставленными IP-адресами, значит можете
то используйте образ bootflop.img для загрузки с дискеты. считать себя счастливчиком и приступать к тестированию
Через некоторое время система, пожужжав, выдаст та- сервисов. К сожалению, на сайте разработчика нет спис-
кое сообщение. ка поддерживаемых адаптеров, поэтому узнать, будет ли
работать ваше сетевое оборудование, можно только экс-
периментальным путем. Как вариант выхода из ситуации
можно скомпилировать необходимый модуль в Debian и
подгрузить его самостоятельно при помощи insmod. Плюс
ко всему можно воспользоваться утилитой apt-get для того,
чтобы обновить или доустановить приложения, которые
посчитаете нужными. Для того чтобы выставить другую
конфигурацию сетевых интерфейсов, которая будет ра-
ботать и после перезагрузки системы, изменяем значе-
ния параметров в файле /etc/network/interfaces, взяв за
пример конфигурацию eth1.
Все, как видите, просто. Для установки переходим в
каталог /etc/recovery и вводим ./install.sh, после чего скрипт #mcedit /etc/network/interfaces
auto lo
все проделает сам – и диск разобьет, и пакеты распакует. iface lo inet loopback
Для работы в режиме expert, когда вы хотите разбить диск #òåïåðü äëÿ eth0 óêàçûâàåì íóæíûé ñòàòè÷åñêèé IP-àäðåñ
auto eth0
по своему усмотрению, запускаем fdisk /dev/hda и затем iface eth0 inet static
вводим ./clone-disk.sh. Для восcтановления старой фай- adress 190.2.34.100
netmask 255.255.255.0
ловой системы может понадобиться ./restore-fs.sh. Систе-
ма разбивает диск на четыре раздела hda1-4 (все данные И заносим в файл имена серверов DNS.
при этом будут потеряны), на которые будут примонтиро-
ваны соответственно swap, корневой, /var и /home, после- #mcedit /etc/resolv.conf
search
дние три форматируются с файловой системой ext3. Пос- nameserver ip_adress_your_provider_primary_dns
ле окончания процесса копирования систему можно пе- nameserver ip_adress_your_provider_secondary_dns
резагружать.
И в файле /etc/hostname можно выставить новое имя
Настройка и работа компьютера, но теперь придется и перенастроить другие
После загрузки заходим в систему как пользователь root сервисы, например, чтобы получать почту (в качестве МТА
с паролем luinux. Первым делом требуется сменить паро- используется Exim). Для того чтобы найти все примене-
ли по умолчанию у пользователей root и admin. Вводим ния имени, используемого по умолчанию, – servidor, по-
соответственно. пробуйте команду: grep -r servidor /etc /var /usr.
После чего выполняем:

#/etc/init.d/hostname.sh

После чего рекомендую сменить клавиатурную рас- И вводим в действие новые настройки:
складку – установленная по умолчанию несколько неудоб-
на для работы. #/etc/init.d/networking restart

# cp /usr/share/keymaps/i386/qwerty/ru4.kmap.gz ↵ После чего еще раз сверяемся при помощи ifconfig. Пос-
/etc/console/boottime.kmap.gz
#/etc/init.d/keymap.sh reload ле этого достаточно указать на пользовательских компью-
терах IP-адрес в диапазоне с 192.168.1.2 до 192.168.1.254,
Введя в консоли tzconfig, изменяем значение времен- сетевую маску 255.255.255.0, адрес шлюза 192.168.1.1 и
ного пояса. в качестве DNS указанные выше в /etc/resolv.conf адреса
Все сервисы уже запущены и настроены, вам необхо- (по обещанию разработчика в следующей версии 1.1 бу-
димо только проверить настройку сети и их работу. Ин- дет свой кэширующий DNS-сервер) и можно тестировать
терфейс eth0 по умолчанию автоконфигурируется при по- работу шлюза и установленных сервисов.
мощи DHCP, если DHCP провайдером не используется, Теперь попробуйте погулять по Интернету, Luinux будет
необходимо будет его настроить вручную, интерфейс eth1 кэшировать посещенные странички, затем зайдите в ftp-

№7(20), июль 2004 41


администрирование
архивы, отправьте почту, зайдите на сервер по протоколу Bittorrent, Gnutella (Bearshare, Limewire и др.), Gnutella2
SSH. У меня здесь проблем не было, что даже подозри- (Shareaza), Fasttrack (Kazaa, Imesh, Grobster), Soulseek
тельно. После чего зайдите по адресу: http://192.168.1.1/ (beta), Direct-Connect (alpha) и Opennap (alpha). На Luinux
stats/ для просмотра статистики работы сервера (рис. 1). запускается демон, для настройки и проверки работы ко-
торого набираем в строке браузера http://192.168.1.1:4080/
(рис. 2).
Для тестирования общедоступного каталога на серве-
ре используем пользователя – edonkey с паролем edonkey.
Вся документация по работе и настройке Mldonkey нахо-
дится в /var/opt/mldonkey/, ограничить максимальную ско-
рость upload/download можно, изменив значения перемен-
ных в файле start. Если Mldonkey не нужен, то отключите
его.

#update-rc.d mldonkey remove

И еще одна утилита mkCDrec (http://mkcdrec.ota.be/)


позволяет создать загрузочный iso-образ с копией систе-
мы, которую в случае неприятностей можно легко восста-
новить. Поддерживаются файловые системы ext2 , ext3,
Ðèñóíîê 1 minix, xfs , jfs, reiserfs, LVM и software RAID и примонтир-
Для сбора статистики в Luinux используется приложение ванные разделы с ФС msdos, fat, vfat и ntfs, сжатие при
HotSaNIC – «HTML overview to System and Network Information помощи gzip, bzip2, lzop и других утилит. Создать такой
Center» (домашняя страница http://hotsanic.sourceforge.net). образ легко, только процедура создания потребует нали-
Представляющее собой набор скриптов, написанных на Perl чия 3 Гб свободного места на жестком диске.
и использующих для работы rrdtool http://ee-staff.ethz.ch/
~oetiker/webtools/rrdtool/. Эти скрипты, основываясь на дан- #cd /var/opt/mkcdrec/
#make clean
ных, выдаваемых системными утилитами каждые 10 се- #make CD-ROM
кунд, просматривают статистику проходящего через интер-
фейсы трафика, загрузку процессора, памяти, пользова- И затем копируем с другого компьютера.
тели, данные, полученные о работе жесткого диска, и в ре-
зультате через 15 минут генерируют графики, по которым #scp root@192.168.1.1:/tmp/CDrec.iso
можно просмотреть статистику работы системы и нагрузку
на отдельные компоненты за последний час, неделю, ме- Записываем образ на болванку.
сяц и год. К сожалению, HotSaNIC не выводит статистику
отдельно по каждому клиентскому IP-адресу, но, очевид- #cdrecord -v speed=4 dev=0,0 CDrec.iso
но, исходя из задач дистрибутива, это и не требовалось, а
кому понадобится – на сайте есть документация, расска- В составе имеется также настроенный веб-сервер
зывающая, как создать к нему свой модуль. Следующий Apache, который используется для вывода статистики
на очереди проверки – сервис Mldonkey, представляющий HotSaNIC, можно естественно использовать его и по пря-
собой мультиплатформенный мультисетевой peer-to-peer мому назначению, дополнительно имеются интерпретато-
клиент, распространяемый под лицензией GNU. ры perl и php, так что разогнаться есть где.
Изменив значения параметров UP и DOWN в файле
/etc/init.d/packetfilter, можно изменить значения полосы
upload/download для интерфейса eth0, т.е. Интернета. Пос-
ле чего не забудьте перезапустить сервис.

#/etc/init.d/packetfilter stop
#/etc/init.d/packetfilter start

Для работы Samba-сервера отредактируйте файл /etc/


samba/smb.conf под свои нужды (как это сделать, описано
в моей статье «Что такое Samba», журнал «Системный
администратор», октябрь 2002 г.). После чего сервер Luinux
можно использовать еще и в качестве файл-сервера.
Вот вкратце и все. Дистрибутив хоть и не обладает су-
перпродвинутыми возможностями, это не всегда и требует-
ся, но основной конек – простота настройки, что может по-
Ðèñóíîê 2 дойти неподготовленному пользователю, не желающему вни-
В данный момент работает с сетями: eDonkey, Overnet, кать в тонкости настройки сервисов на UNIX-системах.

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

«СТАЛЬНОЙ ГЛАЗ НА СТРАЖЕ ЖИЗНИ»


HA-кластер LifeKeeper компании SteelEye

АНТОН БОРИСОВ
Слово «кластер» означает «подмножество объектов с оп- Кластеры имеют свою специализацию, но тем не ме-
ределенными наборами признаков». нее все они обладают схожими чертами, присущими толь-
Кластер – это две или более самостоятельные систе- ко кластерам, что в свою очередь отличает их от других
мы, соединенные в единую систему высокого уровня дос- вычислительных платформ.
тупности посредством специального программного и ап- Из компьютерного словаря:
паратного обеспечения. Cluster (кластер) – группа терминалов или рабочих
Существует четыре основных преимущества исполь- станций, подключенных к общему серверу, или группа не-
зования кластерных систем: скольких серверов, которые совместно выполняют общую
! высокая доступность (High Availability); задачу и способны заменить друг друга, если одно из уст-
! масштабируемость; ройств выйдет из строя.
! гибкость; Cluster (кластер) – группа компьютеров, объединенных
! простота управления. высокоскоростными каналами связи, и представляющая с
точки зрения пользователя одну многопроцессорную ма-
Кластер – это также возможность использовать вычис- шину. Кластерная архитектура обеспечивает высокую на-
лительные ресурсы системы так, что полученная система дежность и широкие возможности для масштабирования.
превосходит по своим возможностям суммарные возмож- Кластеры, которые мы будем собирать, сконструирова-
ности ее частей. ны из обычных персоналок, которые называются узлами,

№7(20), июль 2004 43


администрирование
без использования разделяемой физической памяти. Сей друге и не взаимодействуют между собой. Включены же
факт, а также то, что на отдельно взятом узле запущена они были по одной простой причине – с течением време-
операционная система, отличает наш кластер от класте- ни техника обслуживания запросов, возможно, претерпит
ров на платформе NUMA (Non-Uniform Memory Architecture) изменение, и узлы наконец-то начнут знать друг о друге.
и SMP (Symmetric Multi-Processor). Более подробно смот- А может быть, узлы так и не будут знать о существовании
рите в «вопросах и ответах» [8]. Однако никто не мешает друг друга. Время покажет.
построить кластер на основе и этих платформ. Кстати, в Когда говорят о кластерах хранения информации, под-
списке top 500 [9], содержащем самые быстродействующие разумевают системы, разработанные фирмой Sistina
кластеры планеты, есть несколько штук, собранных на PC- (GFS – Global FileSystem) и проектом OpenGFS. Кластеры
платформе. Их, в частности, можно определить по строч- состоят из узлов, которые обеспечивают параллельный и вы-
кам self-made (самособранные). Все остальное работает на соконадежный доступ к данным единой файловой системы.
основе специального оборудования. С точки зрения тепло- Кластер баз данных – это Oracle Parallel Server (OPS;
выделения, потреблямых энергоресурсов и занимаемого сейчас известный как Oracle 9I RAC), состоит из узлов,
пространства персоналки явно не лучший материал для которые обеспечивают параллельное, согласованное и
создания сколько-нибудь быстродействующих кластеров. высоконадежное соединение с базой данных.
Задача кластера заключается в обеспечении согласо- Высоконадежные кластеры представлены такими ре-
ванной работы всех узлов для достижения поставленной шениями, как LifeKeeper, FailSafe и Heartbeat. Они также
цели. Целью может быть высокая устойчивость (HA – High называются отказоустойчивыми кластерами. Происходит
Availability), высокая вычислительная способность (HP – High мониторинг ресурсов, а именно приложений и состояния
Performance), параллельное вычисление, параллельное об- узлов. При обнаружении сбоя система замещает IP-адре-
служивание запросов. Наконец, кластер отличается от кли- са, дисковые устройства, файловые системы на резерв-
ент-серверных распределенных вычислений тем, что клас- ные, т.е. другого узла. Также на новом узле происходит
терное взаимодействие – это все-таки равноценное взаи- старт целевых приложений, которые упали на отказавшем
модействие каждого узла друг с другом, по принципу пи- узле. Приложения могут и не упасть. Например, в случае,
ринговых сетей (peer-to-peer), когда каждый узел, в свою если у элемента кластера всего лишь вышла из строя се-
очередь, является членом более крупной системы. Услов- тевая карта и он стал недоступен для контроля. Поэтому
но в кластере выбирается мастер-узел, а другие являются такой тип отказа оборудования равноценен падению узла.
«подшефными» узлами. В случае отказа мастер-узла вы- Сегодня мы рассмотрим последний тип кластеров, а
бирается по заранее выбранному алгоритму новый мастер- именно HA-кластеры, т.е. из семейства отказоустойчивых.
узел, который и курирует в дальнейшем весь кластер. Остановим свое внимание на продукте LifeKeeper фир-
мы SteelEye.
Типы кластеров Согласно техническим характеристикам поддержива-
Высокопроизводительными (вычислительными) кластера- ется до 32 узлов в кластере. Узлы могут быть построены
ми считаются Beowulf-кластеры, которые конструируются как на базе Linux (в первую очередь это Red Hat и совме-
для задач, когда требуется запускать параллельные про- стимые с ней системы), так и на базе Windows 2000 и
граммы, например, симуляторы погоды, обработка дан- выше. Хотя я подозреваю, что есть и решения для узлов
ных и т. п. В таком типе кластера обычно присутствует на базе Sun Solaris, впрочем, это не афишируется, но лю-
мастер-узел, который и управляет всем кластером, в то бознательные читатели всё равно посмотрят установоч-
время как остальные узлы работают и взаимодействуют ные и сервисные скрипты.
в кооперативном режиме. Как сервера узнают о нормальном функционировании
Кластерами с распределением нагрузки (балансировоч- друг друга? Очень просто – с помощью heartbeat-меха-
ными) являются Mosix-кластеры. Они позволяют пользова- низма, т.е. с помощью обмена информацией по выделен-
телю одного узла прозрачно распределить нагрузку одно- ным каналам. Под термином heartbeat подразумевается
го узла кластера по всем остальным. Применение целе- сердцебиение. В нашем случае «сердцебиение» узлов кла-
сообразно в тех случаях, когда требуется использовать стера. Если один из серверов перестает отвечать друго-
задачи с интенсивными вычислительными запросами, ко- му, значит произошел отказ/сбой и предпринимаются ава-
торые, в частности, характеризуются высокой длительно- рийные меры. В нашем случае проверки происходят с по-
стью вычислений. К числу задач также следует отнести мощью запросов, отправленных на порты 81, 82. Если уда-
приложения, которые не были специально оптимизирова- ленная машина не формирует правильный ответ по дан-
ны под параллельное вычисление. ным портам, то очевидно, что на узле не запущено клас-
Кластеры проекта LVS (Linux Virtual Server) и класте- терное ПО или же узел «упал». В этом случае происходит
ры типа Piranha (RedHat Linux) считаются кластерами с перемещение функций на другой узел. Выделенными ка-
параллельным обслуживанием запросов. Они в чем-то по- налами могут выступать как отдельное, дополнительное
хожи на Mosix-кластеры, так как также занимаются рас- ethernet-соединение, так и соединение по RS-232 прото-
пределением нагрузки, правда, в несколько другом клю- колу. В первом случае ethernet-соединение может исполь-
че. Приходящие веб-запросы распределяются системой зоваться серверами как дополнительный канал для об-
между набором стандартных веб-серверов. Данный тип мена информацией по TCP/IP-протоколу. Рекомендуют
кластера больше напоминает ферму, нежели кластер, так делать не один канал для heartbeat-целей, а два и более.
как узлы с веб-службами обычно не подозревают друг о Подразумевается, что даже в случае отказа коммуника-

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

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


Slackware Linux, к сожалению, пока не удалась. Поэтому
пришлось обратиться к дистрибутиву ASP Linux 9.2. За-
роботало все достаточно быстро и беспроблемно. Кста-
Для мультисерверной конфигурации узлов следует ти, запрос в компанию Nordicmind, а именно она осуще-
использовать схему, представленную на рисунке. ствляет техническую поддержку для стран Европы, Бал-
тии и СНГ, подтвердил, что на данный момент последним
сертифицированным ядром является 2.4.21, т.е. работа-
ющие под 2.6.x. ядрами остаются пока не у дел, к сожале-
нию.
Итак, начинаем установку пакетов на ASP Linux-систе-
ме. Кластерное ПО можно взять по адресу [7], предвари-
тельно зарегистрировавшись. Там же получить ключи на
испытательный срок в 30 дней. Маленькое отступление.
Как я уже отмечал выше, поддерживается в первую Вашим идентификатором, на основе которого компания-
очередь Red Hat Linux. С выпуском LifeKeeper версии 4.4.3 разработчик сформирует вам ключи, является именно
кластер можно развернуть на следующих релизах: MAC-адрес сетевой карты. Что ж, время передать бразды
правления root.
Убедимся, что у вас присутствуют те же пакеты, что и
у меня.

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


жки из Nordicmind, подверсия ядра (т.е. -14, -19, -24) прин-
ципиальной разницы не играет. Поэтому ставим пакет
HADR.

# rpm -ih HADR-RedHat-2.4.18-14-4.4.2-3.i386.rpm

Аналогично поставим пакеты:

№7(20), июль 2004 45


администрирование
! HANFS-RedHat-2.4.18-14-4.4.2-3.i386.rpm – для NFS 10.0.0.101 bb-box1
служб; 10.0.0.200 pc-box2
! steeleye-lkRedHat70-4.2.0-13.i386.rpm – ядро LifeKeeper 10.0.0.201 bb-box2
под RedHat-платформу; 10.0.0.150 triton
! steeleye-lkLIC-4.2.0-13.i386.rpm – пакет для управления
лицензиями; где pc-box1, pc-box2 – названия узлов; bb-box1, bb-box2 –
! jre-1.3.1.i386.rpm – Java для GUI-интерфейса управле- названия plip-интерфейсов, которые будут использовать-
ния кластером. ся как heartbeat-каналы; triton – собственно разделяемый
ресурс.
[root@pc-box1 java]# rpm -ih jre-1.3.1.i386.rpm Ну а теперь запускаем приложение, управляющее кла-
стером.
Из директории licensing установим пакет управления ли-
цензиями. [root@pc-box1]# /opt/LifeKeeper/bin/lkGUIapp

# cd licensing/
# rpm -ih steeleye-lkLIC-4.4.2-3.i386.rpm

И наконец устанавливаем основные пакеты для клас-


тера:

steeleye-lk-4.4.2-2.i386.rpm
steeleye-lkIP-4.4.2-2.i386.rpm
steeleye-lkAPA-4.4.0-1.i386.rpm
steeleye-lkMAN-4.4.2-2.i386.rpm
steeleye-lkGUI-4.4.2-2.i386.rpm
steeleye-lkRAW-4.4.2-2.i386.rpm
steeleye-lkHLP-4.4.2-2.i386.rpm

[root@pc-box1]# rpm -ih steeleye-lk*

В ходе установки этих пакетов вы получите информа-


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

В итоге программное обеспечение поставлено в дирек-


торию /opt/LifeKeeper, параметры управления кластером
лежат в директории /etc/default/LifeKeeper.
Не забудьте записать ключи, полученные вами от ком-
пании steeleye или её представителя, в директорию /var/
LifeKeeper/license.
Затем запускаем кластер – /opt/LifeKeeper/bin/lkstart. В
/etc/inittab пропишутся необходимые для работы сервисы.
Также следует прописать в файл /etc/default/LifeKeeper
строку NOBCASTPING=1, т.к. тестировать кластер мы бу- Для того чтобы узлы «знали» о состоянии друг друга,
дем, вероятно, в отдельной сетке, где нет дополнитель- необходимо установить коммуникационный канал.
ных машин. Она означает, что кластерное ПО будет игно-
рировать пакеты бродкастов. При переносе в дикую сре-
ду не забудьте раскомментировать её.
Следует обратить внимание, что в /etc/hosts (или в DNS-
сервер) следует прописать как названия машин с их IP-
адресами, так и информацию о тех ресурсах, которые бу-
дут считаться разделяемыми.
Например, на каждом узле мой файл hosts выглядит
следующим образом: Этим мы сейчас и займемся. Начало процесса приве-
дено на lk-step2.png. Начинаем настройку с узла pc-box1.
10.0.0.100 pc-box1 Локальный IP-адрес выбираем такой же, что и в /etc/hosts,

46
администрирование
а именно 10.0.0.100. Собственно говоря, LifeKeeper отту-
да все и берет. Но помним, что 10.0.0.101 зарезервиро-
ван в качестве backbone-канала (или в данном случае как
heartbeat-соединение).
Далее заполняем необходимые значения для второго
узла.

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


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

Проверяем доступен ли новый IP-адрес. Да, он откли-


кается, причем с каждого из узлов. Достигается это сле-
дующим образом. На устройство eth0 добавляется алиас
в виде eth0:1 с новым IP-адресом. При переезде с одного
узла на другой алиас с первого узла удаляется и создает-
ся на новом.

[anthony@pc-box1 anthony]$ /sbin/ifconfig

Дальнейшая наша задача – создать ресурс, который


будет отказоустойчивым. В данном случае это IP-адрес с
кодовым названием «triton». Он-то и является ключевой
фигурой нашего повествования. Ведь именно он находится
в иерархии отказоустойчивых ресурсов, которыми мы се-
годня занимаемся.
Создание ресурса comm/ip напоминает наши предыду-
щие действия по созданию коммуникационного канала.
Отмечу, что ресурс я создал под названием «ip-triton-tag».
Можно назвать его по-другому, на ваше усмотрение.
Следующей нашей задачей будет создание ресурса для
запуска веб-сервера Apache, который создается анало-
гично предыдущим, показанным выше.

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

Видим, что на первом узле создался новый ресурс.

№7(20), июль 2004 47


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

Чтобы переключить узел с активного состояния на пас-


Теперь предстоит «расширить» настройки на второй сивное или же перевести ресурсы с одного узла на дру-
узел и завершить на этом настройку ресурсов. гой, надо выбрать пункт In Service/Out of Service на вклад-
ке конкретного узла. Это производится через GUI-прило-
жение. Вполне возможно произвести эту операцию через
командную строку:

[root@pc-box2]# /opt/LifeKeeper/bin/perform_action ↵
-a restore -t ip-triton-tag

Убедимся, что на двух узлах у нас стоят одинаковые


версии.

Как видите, я произвожу переключение кластера со


второго узла, на который переедут ресурсы.

[anthony@pc-box1 anthony]$ nmap -v triton

При обновлении следите также за тем, чтобы ключи


от кластера не затерлись в /var/LifeKeeper/license.
Установку кластера можно считать законченной. Не-
сколько слов о конфигурации apache. В файле httpd.conf
команду Listen следует применять по отношению к наше-
му «устойчивому» ресурсу triton. У меня она выглядит на
обоих узлах как Listen 10.0.0.150:80. Остальные опции не
изменялись. Маленький нюанс: при падении одного из
узлов также упадет и вся статистика от веб-сервера, т.к.
в этой статье мы не рассматривали создание отказоус-
тойчивого ресурса для файловой системы. Очевидно, что
конфигурация на каждом из узлов должна совпадать.
Условимся, что первый узел является основным, а вто- Несколько слов о том, как перенести файлы с одного
рой – резервным. Тогда при остановке основного узла узла на другой средствами ПО самого кластера. Для этих
ресурсы «переедут» на второй. Что мы и можем видеть целей существует утилита lcdrcp. Я нахожусь на втором узле
на приведенном рисунке. в директории /var/www/html, и требуется перенести файл

48
администрирование
index.html на первый узел. Запускаем следующим образом: Команды для создания настроек коммуникационных
путей:
[root@pc-box2 html]# /opt/LifeKeeper/bin/lcdrcp index.html
pc-box1:/var/www/html

Уточняем, куда именно следует положить файл – в


директорию /var/www/html, но уже на первом узле.
В первом примере мы переводили ресурс ip-triton-tag
с узла на узел, но тогда в иерархии он не был связан с
ресурсом apache-tag. Сейчас же давайте посмотрим, как
пройдет процесс переезда двух ресурсов. Уже скопиро- Пример:
вали индексный файл для apache и хотим посмотреть, как
запустятся ресурсы на первом узле. net_create -d pc-box1 -s pc-box2 -D MyPath -n TCP ↵
-r 10.0.0.200 -l 10.0.0.100 -p 1
crelcm pc-box1 pc-box2 TCP 10.0.0.100 10.0.0.200 10
[root@pc-box1 bin]# ./perform_action -a restore -t apache-tag
Команды по управлению приложениями:

Пример:

app_create -d pc-box1 -a apache-tag


app_list -d pc-box1

P.S. В брошюре, поставляемой с данным решением,


прозвучало, что время простоя – около 50 минут в год.
Будем надеяться, что это не только рекламный ход, но и
действительно грамотное решение.
Спасибо за поддержку сотрудникам Esko Wessman и
Marko Lehtimaki из компании NordicMind, а также за тех-
ническую помощь сотрудникам Denise Hodges и Randy Hinz
Ошибок в ходе «переезда» не возникло. Единствен- компании SteelEye.
ное, что следует отметить – это прекращение срока дея-
тельности лицензионного ключа. Впрочем, месяца на те- Ссылки:
стирование компонентов вполне должно хватить. 1. http://www.openmosix.org.ru/docs/openMosix-HOWTO-
Управлять кластером можно не только посредством multi/ch02.html
GUI-приложения, но из-командной строки, а также окош- 2. http://www.cio-world.ru/techniques/effect/29933/
ка браузера. Впрочем, последнее не слишком сильно от- 3. http://parallel.ru/parallel/russia/russian_clusters.html
личается от GUI-управления. Приведу несколько команд 4. http://distributed.org.ru/?main&newsday=24-Mar-2004
и их назначение. 5. http://www.steeleye.com/
Для старта и остановки кластера LifeKeeper, GUI-при- 6. http://licensing.steeleye.com/support/download_get.php/
ложения: configclusters.pdf?dir=0&file=configclusters.pdf
7. http://licensing.steeleye.com/download/
8. http://lse.sf.net/numa/faq/index.html
9. http://www.top500.org//lists/2003/11/

Мониторинг кластера:

Запуск ресурса на выполнение/остановку:

№7(20), июль 2004 49


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

ВЕЖЛИВЫЙ ОТКАЗ
– Капитан, барометр упал.
– Сильно?
– Вдребезги!

АЛЕКСАНДР ШИБЕНКО
Обеспечение бесперебойной работы и сохранности дан- можен и более сложный вариант: один компьютер резерви-
ных – головная боль для системного администратора, при- рует несколько серверов (рис. 1). При этом осуществляется
чем независимо от размеров обслуживаемой им сети. Од- дублирование приложений и данных со всех первичных сер-
нако при обсуждении проблем отказоустойчивости в ос- веров, но в случае сбоя (программного или аппаратного)
новном рассматриваются либо конструктивные особенно- вторичный может подменить только один из них.
сти достаточно дорогих моделей серверов, либо различ- клиентские ПК
ные кластерные конфигурации или построение сетей хра-
нения данных, что, на мой взгляд, может представлять ин-
терес лишь для крупных и/или достаточно богатых компа-
ний. И очень мало информации по решениям, пригодным
для использования в небольших фирмах, которых суще-
ственно больше, чем близких к нефтяным или финансо-
вым потокам. Поэтому когда в рамках одного из проектов
заказчик попросил включить в него предложения по обес- коммутатор ЛВС
печению отказоустойчивости для сети из нескольких ПК
и сервера под управлением ОС Windows 2000, на кото-
первичные (основные) вторичный (резервный)
ром размещен внутренний веб-сайт и хранятся совмест- сервера сервер
но используемые файлы, в первый момент возникло не-
которое замешательство. Готового рецепта не было. На-
чался поиск во всевозможных источниках, результат ко-
торого материализовался в виде CD-диска с программ-
ным продуктом SurviveIT 2000 фирмы Computer Associates.
коммутатор
Для чего же предназначен SurviveIT? В документации
написано следующее: «Это высоконадежное решение для
платформы Windows NT/2000, обеспечивающее бесперебой-
ный доступ к вашим приложениям и данным даже в случае выделенный сегмент
отказа сервера». Выглядит это следующим образом. В ло- Ðèñóíîê 1.
кальной сети устанавливается дополнительный компьютер, При отсутствии сбоя, когда вторичный компьютер не за-
называемый вторичным, который берет на себя выполне- мещает какой-либо из вышедших из строя защищаемых
ние всех функций, включая имя и IP-адрес основного (пер- первичных серверов, он может работать как обычный сер-
вичного) сервера в случае выхода последнего из строя. Воз- вер. Данная особенность оказалась очень полезной, т.к. по-

50
администрирование
зволила возложить на вторичный сервер дополнительные что и на первичном. Затем в свойствах задания на репли-
функции резервного копирования, что уменьшило общую кацию указывается, какие сценарии будут выполняться на
стоимость проекта. серверах в случае отказа. В состав пакета входят сцена-
На момент тестирования под рукой не было двух оди- рии для следующих приложений:
наковых компьютеров, но оказалось, что тип процессора, ! Unicenter TNG
сетевого адаптера и контроллера дисков первичных и вто- ! Lotus Notes Server
ричного серверов, а также объем установленной в них па- ! Microsoft Exchange Server
мяти могут отличаться. И действительно, ПК с процессо- ! Microsoft SQL Server
ром Pentium III 500 МГц и 20-ти Гб IDE-диском без проблем ! Microsoft Internet Information Server
заработал в качестве вторичного для старенького сервера ! Jasmine II
с обычным Pentium 200 и SCSI-диском на 8 Гб. Но прежде ! Microsoft Proxy Server
чем это произошло, естественно, необходимо было уста- ! Netscape SuiteSpot
новить SurviveIT на оба компьютера. ! Oracle Enterprise Server
Процесс установки не вызвал никаких проблем, доста- ! Sybase Adaptive Server
точно было следовать инструкциям инсталлятора и в конце ! Ingres II
перезагрузиться. Сложнее оказалось получить ключ акти-
вации. У меня был демо-диск с ограниченной лицензией, но Можно создавать и собственные сценарии. Для этого в
даже ее необходимо было зарегистрировать. Я попытался состав пакета включен соответствующий шаблон. Скачать
сделать это в режиме «on-line», но все попытки заполнить его можно на сайте журнала (www.samag.ru/source).
соответствующую форму системой регистрации отверга- Последнее, что нужно сделать, – настроить механизм
лись. Точно не знаю, какое па из исполняемых шаманских определения отказа основного сервера. Для обеспечения
танцев возымело действие, но ключ получить удалось. Воз- дополнительной надежности рекомендуется соединить со-
можно, проще было бы сделать все это по электронной по- ответствующим кабелем последовательные порты основ-
чте. И еще одну особенность регистрации хочется отметить. ного и вторичного серверов (по нему будет посылаться спе-
Похоже, ключ привязывается к IP-адресу сервера, и в слу- циальный сигнал «heartbeat», свидетельствующий о «жиз-
чае смены адреса он может оказаться недействительным. неспособности» основного сервера), а также указать один
После установки пакета на оба сервера с помощью кон- или несколько IP-адресов каких-либо сетевых устройств,
соли управления можно приступать к конфигурированию. независимо «пингуя» которые серверы могут определить,
Сначала необходимо задать серверам соответствующие произошел ли отказ и нужно меняться ролями, или это, к
роли: первичный или вторичный. Первичному серверу мож- примеру, сбой в работе ЛВС.
но указать, какое имя и IP-адрес он должен будет получить, Интерфейс управляющей консоли удобен и понятен, и
после того как снова перейдет в рабочее состояние после описываемый процесс много времени не занял. Можно
аварии. Это может оказаться нужным, ведь под его исход- было приступать непосредственно к тестированию. Для
ным именем и адресом в сети будет присутствовать дуб- имитации отказа основного сервера его просто выключи-
лер. Затем на вторичном сервере создается задание на реп- ли кнопкой питания. На консоли вторичного сервера появи-
ликацию. Для обеспечения дополнительной гибкости каж- лось предупреждение, и после небольшой паузы он пере-
дое задание может содержать несколько работ, в рамках загрузился. После этого клиентам вновь стали доступны
которых предлагается выбрать, какие каталоги на дисках веб-сервер и сетевые диски.
первичных серверов необходимо реплицировать и куда, а Необходимо учесть, что переключение на резервный
также какие каталоги вторичного сервера сделать доступ- сервер происходит не мгновенно, время переключения
ными для сетевых клиентов в случае отказа основного сер- складывается из времени, необходимого для определения
вера. Даже если сбой произошел во время репликации, самого факта отказа (в определенных пределах может за-
SurviveIT гарантирует целостность данных и исключает по- даваться администратором системы) плюс время на пере-
вреждения файлов, записывая на диск только завершен- загрузку резервного компьютера. Поэтому если в вашей
ные транзакции. После завершения синхронизации целос- сети даже такая задержка недопустима, этот продукт вам
тность поддерживается путем передачи по сети только не подойдет.
фактических изменений, а не за счет копирования файлов Обратная задача – восстановление status quo – тоже ре-
целиком. Поэтому защищаемые и резервный сервера мо- шается легко. После устранения неисправностей основно-
гут включаться непосредственно в локальную сеть или даже го сервера администратору достаточно просто инициали-
соединяться низкоскоростным каналом. Однако если пред- зировать соответствующий процесс. SurviveIT ресинхрони-
полагается реплицировать большие объемы данных, воз- зирует сервера (в это время они оказываются недоступны-
можно, окажется целесообразным установить в каждый ми для пользователей) и автоматически переключает поль-
сервер по дополнительному сетевому адаптеру и органи- зователей обратно, на основной сервер, а подменявший
зовать выделенный сегмент, изолированный от ЛВС, к ко- его вновь становится резервным (вторичным).
торой подключены клиентские рабочие места. К сожалению, не удалось протестировать SurviveIT в сети
SurviveIT позволяет обеспечить корректное функциони- с развернутой службой каталога Active Directory. Но и того,
рование на вторичном сервере приложений, работающих что было сделано, хватило, чтобы рекомендовать систем-
на первичном сервере. Для этого, во-первых, необходимо ным администраторам обратить внимание на этот продукт.
установить их в те же каталоги и с теми же параметрами, Вполне возможно, что кому-то он окажется очень полезен.

№7(20), июль 2004 51


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

УПРАВЛЕНИЕ ФАЙЛОВЫМИ СЕРВЕРАМИ

В данной статье будет рассмотрен круг


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

ИВАН КОРОБКО
Размер массива одного файлового сервера, собранного ляющий абстрагироваться от файловой системы и авто-
из жестких дисков, может достигать от нескольких сотен матизировать администрирование файловых серверов.
гигабайт до нескольких терабайт. Количество файловых
серверов может варьироваться в зависимости от потреб- Выбор варианта
ностей. Создание сервера является нетривиальной задачей, со-
Поддержка серверов является трудоемкой задачей, стоящей из нескольких основных этапов.
требующей пристального внимания системного админис- Первым этапом во время планирования сервера явля-
тратора, поскольку осуществляется постоянное обновле- ется определение списка услуг, которые будут предостав-
ние ресурсов. лены, и количество одновременно обслуживаемых поль-
Эта статья посвящена автоматизации администрирова- зователей, максимальное количество которых будет ва-
ния файловых серверов с помощью стандартных средств рьироваться в зависимости от типа ресурсов, хранимых
Microsoft Windows. Решением поставленной задачи явля- на сервере. Например, нагрузка на файловый сервер, на
ется инструмент, созданный на основе VBScript1, позво- котором хранится коллекция фильмов, и на файловый сер-

52
администрирование
вер, на котором хранятся дистрибутивы программ, раз- работка структуры каталогов при загрузке страницы за-
лична. Исходя из нагрузки на сервер будут определены нимает много времени, поэтому загрузка html-страницы
его аппаратные характеристики. Вторым фактором, вли- будет длиться десятки минут. Для увеличения скорости
яющим на аппаратные характеристики сервера, является работы приложения его разделяют на 2 части.
язык программирования, на основе которого создан ин- Первая часть представляет собой сценарий на VBScript,
струмент. В качестве такового выбран VBScript по следу- который создает промежуточный файл с данными – кэш-
ющим критериям: файл. Сценарий запускается планировщиком задач через
! Язык программирования VBScript входит в поставку определенные промежутки времени. В том случае если
Microsoft Windows, поэтому перенос инструмента с одно- размер файлового сервера велик, то нагрузку по созда-
го Windows-сервера на другой не представляет труда. нию кэш-файла можно распределить между несколькими
! Синтаксис языка достаточно прост. серверами.
! VBScript является объектно-базированным языком и Вторая часть представляет собой сайт (см. рис. 1а, 1б),
имеет встроенную поддержку объектов. созданный на основе ASP-страниц (для функционирова-
ния ASP-страниц требуется установка Internet Information
Одним из недостатков VBScript является низкая ско- Server (IIS). IIS является приложением, входящим в комп-
рость работы сценария, поскольку VBScript является ин- лект поставки Microsoft Windows). С помощью ASP осу-
терпретируемым языком. ществляется отображение информации, поиск по различ-
Увеличить его скорость работы можно за счет нара- ным критериям.
щивания аппаратных ресурсов, поскольку язык требова-
телен к этому фактору.
Вторым этапом создания файлового сервера является
планирование файловой структуры сервера, необходимо
дать ответы на следующие вопросы:
! По каким критериям должна осуществляться сортиров-
ка программного обеспечения: по названию продукта, по
названию фирмы-производителя приложения (Microsoft,
Adobe, Symantec и др), по назначению приложения (пап-
ка, содержащая архиваторы, такие как Zip, Rar, назы-
вается Arc; программы для тестирования аппаратных
средств – SysInfo и т. д.) или предпочесть смешанный
вариант. Каждый системный администратор решает
самостоятельно, какой из вариантов сортировки ресур-
сов ему удобнее использовать.
! Как осуществлять сортировку ресурсов по языковому Ðèñóíîê 1à
признаку (имеется в виду язык интерфейса)?
! Какое место в файловой структуре займет раздел
драйверов, документации и т. д.
! По какому принципу будет осуществляться сортиров-
ка драйверов – по названию фирмы-производителя
(HP, Canon, Intel, Asus, Maxtor) или по назначению уст-
ройств (Video, Audio, Chipset, Printer)?
! Как будут учитываться версия операционной системы,
для которой создан драйвер устройства?

Создавая файловый сервер, системный администра-


тор должен дать ответ на огромное количество вопросов.
Приведенные вопросы – лишь малая их часть. Создание
файловой структуры (иерархии директорий, подчиняю-
щихся некоторому принципу) на файловом сервере явля-
ется сложной задачей даже для опытного системного ад- Ðèñóíîê 1á
министратора. Род деятельности фирмы вносит свои кор-
рективы в окончательный вид структуры. Исправление VBScript: работа с массивами
ошибок, допущенных при ее создании, по прикладывае- При создании данного комплекса активно использовались
мым усилиям эквивалентно созданию новой файловой массивы. О некоторых особенностях работы с массивами
структуры. необходимо рассказать отдельно, чтобы впоследствии не
Предлагаемый инструмент позволяет полностью абст- отвлекаться на подобные разъяснения.
рагироваться от файловой структуры, однако это не зна- Немного теории: массивы бывают одномерные и мно-
чит, что она может быть хаотичной. гомерные. Могут быть статическими и динамическими. Для
Поскольку объем файлового сервера огромен, то об- статического массива память выделяется один раз в пол-

№7(20), июль 2004 53


администрирование
ном объеме, а динамический растет или уменьшается в вия упорядочивания массива смежные элементы меняют-
зависимости от надобности и записанных в него данных. ся местами. Затем происходит переход к следующему
элементу. В результате элементы массива становятся друг
Объявление массивов за другом в заданном порядке – происходит упорядочива-
Рассмотрим общий случай – многомерный массив. Мас- ние. В том случае, если читатель хочет использовать бо-
сивы объявляются с помощью оператора Dim. После име- лее производительный метод упорядочивания массивов,
ни многомерного массива в круглых скобках через запя- то ему необходимо переписать часть кода, касающегося
тую указывают границы каждого измерения массива. сортировки массива.
Особенности объявления массивов:
! индексация элементов массивов начинается с нуля; Ïðèìåð 2:
! в многомерном массиве может быть до 60 измерений; Dim Array(100)
! динамические одномерные и многомерные массивы ……………………
For j=0 to 100
объявляются одинаково. For i=0 to 100
If StrComp(Array_sort(i),Array_sort(i+1),0)=1 Then
temp=Array(i)
Приведем пример объявления многомерного и одно- Array (i)=Array(i+1)
мерного массивов. Одномерный массив является частным Array(i+1)=temp
End if
случаем многомерного (см. таблицу 1). Next
Next
Òàáëèöà 1

Первая часть: создание кэш-файла


Создание кэш-файла осуществляется с помощью сценария,
Переопределение размеров массива написанного на VBScript, который запускается через задан-
Размер массива может быть переопределен только в том ные промежутки времени стандартным планировщиком за-
случае, если он является динамическим. Эта процедура дач Microsoft Windows. По ходу выполнения сценария осу-
осуществляется с помощью команды ReDim, имеющей ществляется чтение структуры подкаталогов в указанном
следующий синтаксис: родительском каталоге. Анализируется содержимое подка-
талогов. Если в подкаталоге обнаружена метка – файл
ReDim [Preserve] array_name(subscripts) [, varname(subscripts)] ... !meta.txt, – путь к этой папке записывается в массив.
Файл !meta.txt является идентификационно-парамет-
! Preserve – переопределяет размер, сохраняя существу- рическим. Для удобства файл будем называть файлом
ющие данные в массиве, если параметр не указан, то параметров, или параметрическим. Он содержит в себе
все ячейки массива обнуляются; три параметра, по одному в каждой строке.
! Array_name – название массива; Первая строка включает в себя информацию о назва-
! Subscripts – количество элементов в массиве. нии раздела, в котором будет размещена ссылка на дист-
рибутив данного приложения. Названием раздела может
При изменении размера многомерного массива кор- быть либо название фирмы-производителя продукта, либо
ректировке поддается только размер последнего измере- жанр, к которому относится приложение. Вторая строка
ния. содержит название продукта. Третья – его описание.
Создаваемый кэш-файл представляет собой текстовый
Определение границ массива файл. Каждая строка файла включает в себя четыре па-
Определение размера выделенной памяти для массива раметра, содержащие название фирмы производителя,
осуществляется с помощью команд lbound(array_name) и путь к каталогу, название приложения и его версию, ком-
ubound(array_name), где array_name – название массива, ментарий. Параметры отделены символом-разделителем,
границы которого необходимо определить. С помощью который описывается в конфигурационном файле.
команды lbound определяется нижняя граница массива, с VBScript-сценарий состоит из нескольких частей:
помощью ubound – верхняя граница. ! чтение исходных параметров из конфигурационного
Данный прием часто используется для чтения всех эле- файла;
ментов динамического массива: ! чтение структуры подкаталогов;
! обработка считанной структуры подкаталогов;
Ïðèìåð1: ! формирование кэш-файла.
For i=Lbound(Array_) to Ubound(Array_)
Msgbox Array_(i) Чтение исходных параметров
Next
из конфигурационного файла
Все исходные параметры для скрипта содержатся в от-
Упорядочивание элементов массивов дельном конфигурационном файле, например, cache.ini.
Наиболее простым, хотя и неэффективным, методом упо- Он представляет собой текстовый файл и содержит сле-
рядочивания массивов является пузырьковый метод. Суть дующие параметры:
метода заключается в том, что при несоблюдении усло- ! Имя и путь создаваемого кэш-файла, например, cache.dat.

54
администрирование
! Путь к корневому каталогу, структура подкаталогов ко- value=left(cstr(array(i)), len1-1)
торого подлежит обработке, например \\server\software. msgbox "value: "& value
Select Case value
! Определение флага, по которому определяется необ- Case "Symbol" path1=right(cstr(array(i)), ↵
ходимая парапка. Флагом является имя параметричес- len(cstr(array(i)))-len1)
Case "Path_To_Root" path2=right(cstr(array(i)), ↵
кого файла, например, meta.txt. len(cstr(array(i)))-len1)
! Метка предназначеная для разделения параметров при Case "Label_FileName" path3=right(cstr(array(i)), ↵
len(cstr(array(i)))-len1)
формировании кэш-файла. Case "Cache_FileName" path4=right(cstr(array(i)), ↵
len(cstr(array(i)))-len1)
End Select
Рассмотрим структуры файла cache.ini. Файл содер- End if
жит следующие поля и соответствующие им характерис- Next
тики: MsgBox path1+chr(13)+ path2+chr(13)+ path3+chr(13)+ path4+chr(13)
Òàáëèöà 2

Чтение структуры подкаталогов


Чтение структуры подкаталогов осуществляется с помо-
щью объекта Scrpting.FileSystemObject WSH, который со-
Чтение данных из параметрического файла осуществ- здается функцией CreateObject. После создания объекта
ляется с помощью Windows Scripting Host (WSH)2, поддер- необходимо получить доступ к подкаталогу, элементы ко-
живаемого VBScript. торого (файлы и каталоги) должны быть обработаны. Пос-
Данные считываются в массив, элементами которого ледовательно перебирая все элементы массива, осуще-
являются строки, содержащиеся в файле, по следующе- ствляется считывание имен папок.
му шаблону:
Ïðèìåð 5:
Ïðèìåð 3:
Path=”C:\RootFolder”
Temp=””
Text="" Set fso=Wscript.CreateObject("Scripting.FileSystemObject")
i=0
Dim Array() Set oFolder=fso.GetFolder(path)
Set oFolders=oFolder.SubFolders
FileName="cache.ini" For Each oF In oFolders
Set fso = CreateObject("Scripting.FileSystemObject") Temp=Temp+cstr(oF.Path)+chr(13)+chr(10)
Next
If fso.FileExists(filename) Then MsgBox Temp
Set Fline = fso.OpenTextFile(FileName)
Do While Not (Fline.atEndOfStream)
redim preserve array(i) Как уже говорилось, данный фрагмент считывает все
Array(i)= Fline.ReadLine подкаталоги в заданном каталоге. Для чтения всей струк-
i=i+1
Loop туры подкаталогов необходимо этот механизм поместить
Else в функцию, а ее сделать рекурсивной4. Функция будет
Text="File Not Found"
End If иметь два параметра – путь к абсолютному подкаталогу
(PATH) и уровень вложенности подкаталогов (IDX).
For i=lbound(array) to ubound(array)
Text=Text+cstr(array(i))+vbCrLf ‘ vbCrLf=chr(13)+chr(10)=ENTER Данные, содержащие абсолютные пути к подкатало-
Next гам, разумно записывать в динамический одномерный
MsgBox Text
массив. Приведем пример создания и заполнения элемен-
После того как сформирован массив, содержащий тов динамического массива на примере чтения структу-
строки параметрического файла, осуществляется анализ ры подкаталогов (основа – предыдущий пример), затем
его элементов и распознавание значений параметров по шаблон рекурсивной функции. Листинг рекурсивной фун-
следующему алгоритму: кции см. в приложении5, листинг файла service.vbs.
! Чтение элементов массива.
! Поиск в строке символа «=» с помощью функции instr()3. Ïðèìåð 6:
! Сравнение строк до знака равенства с названиями па- Path=”C:\RootFolder”
раметров, перечисленных в таблице 1. i=0
Dim Array() 'Îáúÿâëåíèå äèíàìè÷åñêîãî ìàññèâà
! В случае совпадения названия параметра и части стро- Set fso=Wscript.CreateObject("Scripting.FileSystemObject")
ки до знака равенства осуществляется чтение строки Set oFolder=fso.GetFolder(path)
Set oFolders=oFolder.SubFolders
за знаком равенства и присвоение прочитанных зна- ' Èçìåíåíèå ðàçìåðà äèíàìè÷åñêîãî ìàññèâà
чений параметрам. Redim Preserve Array(oFolders.count)

For Each of In oFolders


В программном коде реализация описанного алгорит- Array(i)=cstr(oF.Path) ' Çàïèñü ýëåìåíòîâ â ìàññèâ
i=i+1
ма выглядит следующим образом: Next

Ïðèìåð 4: '×òåíèå ýëåìåíòîâ ìàññèâà


Temp=””
For i=Lbound(Array) to Ubound(Array)
For i=lbound(array) to ubound(array) Temp=Temp+cstr(Array(i))+chr(13)+chr(10)
len1=instr(cstr(array(i)),"=")
msgbox "len1: "&len1 Next
MsgBox Temp
if len(cstr(array(i)))<>0 then

№7(20), июль 2004 55


администрирование
Ïðèìåð 7: Øàáëîí ðåêóðñèâíîé ôóíêöèè Запись в файл ведется построчно: каждая строка фай-
……….. ла содержит четыре параметра, разделенных спецсимво-
' Âûçîâ ôóíêöèè RecFolder â òåëå ñöåíàðèÿ
RecFolder index, path лом. Параметры записываются в файл в следующем по-
……….. рядке: название фирмы-производителя продукта; путь к
Function Recfolder (idx, path)
……….. дистрибутиву приложения; название приложения; краткое
……….. описание приложения. Запись данных в текстовый файл
………..
Call Recfolder (idx+1, path) осуществляется в соответствии со следующим шаблоном:
………..
End Function
Ïðèìåð 8:

text= “____________”
Обработка структуры подкаталогов set fso = CreateObject("Scripting.FileSystemObject")
set MyFile = fso.CreateTextFile(strFileName, True, TRUE)
После завершения процесса считывания подкаталогов в ‘  òåêñòîâûé ôàéë çàïèñûâàåòñÿ çíà÷åíèå ïåðåìåííîé «text»
многомерный массив осуществляется упорядочивание MyFile.WriteLine(text)
MyFile.Close
элементов массива по первому полю (по названию фир-
мы). Впоследствии, во второй части инструмента, создан- Пример файла cache.dat см. в приложении.
ной на основе ASP, осуществляется упорядочивание на- В случае необходимости нагрузка по считыванию и
званий продуктов каждой фирмы. Таким образом, список обработке структуры подкаталогов может быть распреде-
будет упорядочен и по разделам, и по названиям продук- лена между несколькими серверами. На каждом сервере
тов в каждом из разделов. необходимо запустить самостоятельного агента, который
Пример упорядочивания одномерного массива – см. будет генерировать кэш-файл с уникальным именем. Фай-
пример 2; многомерных массивов см. в приложении, лис- лы, полученные от разных агентов, должны быть сохране-
тинги файлов service.vbs и soft.asp. ны в одной папке на сервере.

Формирование кэш-файла Внедрение агента


После завершения процесса сортировки многомерного Внедрение агента не представляет собой никакой слож-
массива по названию фирмы-производителя продукта ности: в файле-скрипте указывается путь к конфигураци-
осуществляется запись данных в кэш-файл, который пред- онному файлу. На основе данных, прочитанных из этого
ставляет собой текстовый файл. файла, будут определены параметры формируемого кэш-
Параметры в файле разделены спецсимволом, в ка- файла и его местоположение.
честве которого рекомендуется один из символов табли- Подключение к файловому серверу необходимо осуще-
цы ASCII-II (см. рис. 2),выбор которого обусловлен тем, ствлять с помощью сетевого диска, например, диска S (см.
что ни один из них не может быть использован в описании приложение файл cache.ini). Подключение к сетевому диску
параметров файла !meta.txt. в данном примере осуществляется при помощи команды:

net use s: \\server\software

Для обеспечения регулярного обновления кэш-файла


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

AT \\Server 20:00 /interactive /every:M,T,W,Th,F,S,Su ↵


C:\InetPub\Soft\Data\Service.vbs

Данная команда запускает сценарий Service.vbs каждый


день в 8 часов вечера на сервере под именем «Server».

Обработка кэш-файла
Файловая структура проекта на основе ASP
Инструмент представляет сайт, точкой входа в который
является страница на языке HTML. Сайт создан на осно-
ве окон (Frame): файл default.htm делит окно браузера на
два столбца.

Ïðèìåð 9: Ëèñòèíã ôàéëà default.htm

<html>
<head>
<title>Ïðîãðàììíîå îáåñïå÷åíèå </title>
<meta http-equiv="Content-Type" content="text/html; ↵
Ðèñóíîê 2 charset=windows-1251">

56
администрирование
<FONT FACE="Arial" size="3"></FONT> ляет вид приемника информации: кнопка (TYPE=«submit»
</head> или «reset» ); окно для ввода текста (TYPE=«text»), значе-
<!-- Ëåâûé ñòîëáåö ñîñòàâëÿåò 20% îò øèðèíû âñåãî îêíà. ние по умолчанию; кнопка выбора одного параметра из
Ëåâîå îêíî èìååò èäåíòèôèêàòîð «SortSearch», âòîðîå «Product». --> группы (TYPE=«radio»). VALUE – название поля, отобража-
<frameset cols="25%,*" FRAMEBORDER="5" BORDER="yes" ↵
FRAMESPACING="5" > емое в объекте. NAME – имя, которое участвует в форми-
<frame src="sortsearch.asp" name="sortsearch" scrolling="yes" ↵ ровании запроса.
ÌÀRGINHEIGHT=1 >
<frame src="soft.asp?Search_Text=&radGrp=1" name="product"> Запрос, который формируется с помощью метода GET,
</frameset> в общем виде выглядит следующим образом: http://имя_
</html>
страница.asp(htm)?П1=З1&П2=З2&...Пn=Зn.
В разделе <HTML> описываются таблицы стилей; ис- В приведенной строке присутствуют обозначения, име-
ходная кодировка документа; способ взаимодействия ющие следующую расшифровку: П – параметр, З – зна-
страниц, основанный на передаче форм; поиск по задан- чение. Опишем страницу-приемник, предназначенную для
ным критериям. получения и обработки данных. Считывание запроса, опи-
раясь на приведенный пример, осуществляется следую-
Таблица стилей и выбор исходной щим образом:
кодировки документа
Обе ASP-страницы используют таблицу стилей. Тексто- set search_t= Request.QueryString(«Search_Text»)
вая информация изначально выводится в кодировке WIN-
1251. Стили описываются в подключаемом файле style.css Прямой метод используется для осуществления поиска.
(см. приложение). Косвенный метод: также используется для передачи
Файл стилей описывается в разделе <LINK>, необхо- данных между сценариями на ASP. Метод основан на том,
димая кодировка – в разделе <META> (HTML): что при нажатии пользователем на картинку или текст,
являющийся ссылкой, сразу формируется запрос, кото-
Ïðèìåð 10: рый передает данные.
<HEAD>
<LINK HREF="style.css" TYPE=text/css REL=stylesheet> Ïðèìåð 12:
<META HTTP-EQUIV ="Content-Type" CONTENT="text/html; ↵
CHARSET=windows-1251"> <% <A HREF="http://èìÿ_ñòðàíèöà.asp(htm)?Ï1=Ç1&Ï2=Ç2&...Ïn=Çn"
</HEAD> target=" & chr(34) &"var"& chr(34) & " > ↵
<IMG SRC =images\pr1.jpg BORDER=0> </A> %>

Значение параметра CHARSET определяет исходную


кодировку документа. Клиент, загрузив страницу, может Поиск по заданным критериям:
конвертировать ее для наилучшего отображения в любую файл sortsearch.asp
другую удобную для него кодировку. Поиск базируется на использовании фильтра. Перед осу-
Остальные страницы, отображающиеся в 2 фреймах, ществлением этой процедуры пользователь задает сле-
см. рис. 1, взаимосвязаны друг с другом и являются ре- дующие параметры: критерий поиска, искомое словосо-
курсивными. Обе страницы создаются с помощью скрип- четание.
тов ASP. В качестве критерия может быть выбран один из пара-
метров: «Везде», «Фирма», «Название». По умолчанию
Взаимодействие страниц принято значение «Везде». Выбор значения по умолча-
Взаимодействие страниц основано на передаче данных, нию осуществляется меткой CHECKED в соответствую-
которая осуществляется с помощью двух методов: пря- щем разделе INPUT. Форма на странице-отправителе выг-
мого и косвенного. лядит следующим образом (HTML):
Прямой метод: в исходной странице создается фор-
ма, содержащая поля для ввода информации, кнопку для Ïðèìåð 13:
отправки информации: <FORM ACTION="printer_adsi.asp" TARGET="main" METHOD="get">
<INPUT TYPE="submit" VALUE="Ïîèñê"></INPUT>
Ïðèìåð 11: <INPUT NAME="Search_Text"></INPUT>
<BR>
<INPUT CHECKED TYPE="radio" VALUE="1" NAME="radGrp">Íàçâàíèå
<FORM ACTION="printer_adsi.asp" TARGET="main" METHOD="get"> < INPUT TYPE="radio" VALUE="2" NAME="radGrp">Îïèñàíèå
<INPUT TYPE="submit" VALUE="Ïîèñê"></INPUT>
<INPUT NAME="Search_Text"></INPUT> < INPUT TYPE ="radio" VALUE="3" NAME="radGrp">Ðàçìåùåíèå
</FORM>
</FORM>

В разделе FORM присутствуют следующие парамет- Вторая часть поисковой системы – «приемник» инфор-
ры: ACTION, TARGET, METHOD. В параметре ACTION мации находится в ASP-файле.
указывается имя файла, который содержит сценарий. Считывание значений параметров осуществляется
Сценарию будут передаваться данные после нажатия на следующим образом:
кнопку.
Подразделом, который обязательно присутствует в раз- Ïðèìåð 14:
деле <FORM>, является INPUT. INPUT имеет следующие set radio_=Request.QueryString("radGrp")
параметры: TYPE, NAME, VALUE. Параметр TYPE опреде- set search_= Request.QueryString("Search_Text")

№7(20), июль 2004 57


администрирование
после того как считаны параметры, указывающие, где ис- рых следует осуществлять поиск. Затем выполняется про-
кать (radio_) и что искать (Search_), выполняется проце- цедура поиска и запись в переменную. Результат выво-
дура поиска: дится на экран.

Ïðèìåð 15:
Select case radio_
Внедрение визуальной части
Case "1" В качестве месторасположения инструмента можно выб-
If instr(ucase(cstr(array_(i,0))), ucase(search_)) then рать любой из серверов, на котором должен быть уста-
T=T+cstr(array_data(i,0)))+… новлен IIS. При установке IIS будет создана стандартная
End If папка C:\InetPub, в которой предлагается сделать подпап-
Case "2" ку Soft. В ней расположить файлы – defalt.htm, style.css,
If instr(ucase(cstr(array_data(i,1))), ucase(search_)) then softsearch.asp, soft.asp.
T=T+cstr(array_data(i,0)))+… В следующей статье будет рассказано о том, как сде-
End If лать мастер, позволяющий пополнять коллекцию про-
……
End Select грамм и вносить изменения в метафайлы.

1
Visual Basic Script Edition (VBScript) является интерпре-
Отображение результатов: файл soft.asp тируемым языком. Представляет собой сокращенную
Файл soft.asp является по своей сути сердцем проекта. версию VB. Имеет встроенную поддержку объектов.
Все остальные файлы являются вспомогательными. Фун- Сценарии могут быть не только встроенными в код веб-
кция рождения страницы, содержащей всю необходимую страницы, но и могут быть автономными файлами с
информацию, возложена на сценарий, содержащийся в расширением VBS.
2
этом файле. Рассмотрим алгоритм работы данного сце- В 1998 году Microsoft предложила в качестве инстру-
нария. мента разработки и выполнения сценариев для опера-
На первом этапе осуществляется чтение информации, ционной системы Microsoft Windows сервер сценариев
переданной прямым методом из HTML-файла. Из конфи- Windows Scripting Host (WSH). В комплект поставки
гурационного файла soft.ini считываются параметры, оп- Microsoft Windows 98 входит WSH версии 1.0, в Microsoft
ределяющие символ «разделить» и местоположение кэш- Windows 2000 – WSH 2.0; Сценарии WSH поддержива-
файла. На этом подготовительный этап завершен. ет два встроенных в Microsoft Windows языка програм-
В результате работы функции чтения кэш-файла вре- мирования – Microsoft Visual Basic Script Edition
менный массив заполняется прочитанными строками. В (VBScript) и Miscrosoft Java Script Edition(Jscript). WSH
массив заносятся только те строки, в которых встречает- предъявляет минимальные требования к объему ОП,
ся символ «разделить». Это означает, что считанная стро- является удобным инструментом для создания сцена-
ка записана в нужном формате. риев и автоматизации повседневных задач. Возмож-
Затем каждая строка временного массива делится на ности WSH-сценариев: выводить информацию в виде
параметры, разграниченные спецсимволом. Полученные диалоговых сообщений; cчитывать информацию из
данные заносятся в многомерный массив. потока данных; управлять процессами Microsoft
Добавление в динамический массив данных, читаемых Windows; подключать сетевые диски и принтеры; ра-
из другого массива, вызывает изменение первого изме- ботать со специальными папками; с системным реест-
рения заполняемого массива. Но из-за ограничений, на- ром; управлять OLE-объектами и т. д.
3
кладываемых VB на работу с массивами, такие измене- InStr([start, ]string1, string2[, compare]) – функция опре-
ния выполнить невозможно. Поэтому необходимо снача- деляет наличие подстроки в строке. Ее возвращаемым
ла сосчитать количество элементов массива и только пос- значением является номер символа, начиная с которо-
ле этого создавать массив и выделять память. Таким об- го подстрока совпадает со строкой. start – начальная
разом, мы видим, что методы работы с динамическими позиция, с которой начинается поиск. Является обяза-
массивами в языке VBScript далеки от настоящей дина- тельным параметром в случае использования парамет-
мичности. ра тип сравнения; string1 – строка, в которой ищется
Следующий шаг – сортировка многомерного массива. подстрока, указанная в параметре string2; compare –
Сортировка осуществляется по следующему алгоритму. числовой параметр, определяющий тип поиска строки
Данные читаются из кэш-файла в многомерный массив. в подстроке. Параметр compare может принимать сле-
Элементами первого измерения массива являются назва- дующие значения:
ния фирмы-производителя продукта. Эти данные уже от-
сортированы по алфавиту. Элементы второго измерения
массива требуют сортировки. Ими являются названия при-
4
ложений. Рекурсивная функция – это функция, вызывающая
Весь html-код, получаемый в результате обработки мас- саму себя, при этом она обязательно передает пара-
сива, записывается в текстовую переменную. метры. Рекурсивные функции, как правило, использу-
Переменная формируется по следующему алгоритму: ются для чтения иерархической структуры.
5
с помощью процедуры select case и полученного из дру- Приложение со всеми листингами смотрите на сайте
гого файла параметра определяют поля массива, в кото- журнала: http://www.samag.ru/source.

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

РУСИФИКАЦИЯ FreeDOS

ВАДИМ ДРУЖИН
Разработка системы FreeDOS началась более 10 лет на- Недавно, подготавливая загрузочную антивирусную
зад – файл HISTORY.TXT в исходных текстах ядра начи- дискету, у меня возникли трудности в ограничении по раз-
нает отсчёт с 25 мая 1993 года. Несмотря на столь солид- меру – необходимые файлы не удавалось упаковать в объём
ную историю, пригодной для практического использова- 3,5-дюймовой дискеты, несмотря на все ухищрения. Тог-
ния в современных условиях система стала недавно – под- да я решил поискать версию DOS с поддержкой FAT32, но
держка файловой системы FAT32 начала разрабатывать- с меньшим объёмом загрузочных файлов, чем у MS-DOS
ся в 2001 году. Конечно, не все применения DOS требуют из комплекта Windows. Оказалось, что у FreeDOS уже име-
поддержки большой файловой системы. Задолго до по- ются нужные возможности и при этом сохранился малень-
явления FAT32 FreeDOS использовалась как встроенная кий объём загрузочного файла. Сравним размер ядра MS-
операционная система в условиях малого дискового про- DOS из состава Windows 98 Second Edition RUS и ядра из
странства и небольших объемов оперативной памяти, а дистрибутива FreeDOS Beta9RC5:
также входила в состав дистрибутива программы
DOSEMU – среды эмуляции DOS для Linux. Однако для
меня DOS – это прежде всего система, которую можно
загрузить с дискеты и использовать для восстановления
работоспособности операционной системы на жестком Разница почти в 5 раз! Так что для запуска с дискеты
диске, среда для запуска утилит аварийного восстанов- предпочтительно использовать именно FreeDOS.
ления данных и антивирусных программ. После появле- К сожалению, при работе с FreeDOS выяснился один
ния версий Microsoft Windows с поддержкой файловой неприятный момент – FreeDOS не поддерживает смену
системы FAT32 использовать для аварийно-восстанови- информации о кодовых страницах. Команда COUNTRY в
тельных работ DOS без поддержки этой файловой систе- файле CONFIG.SYS обрабатывается только частично, ис-
мы было проблематично. Поэтому достаточно длительное пользуется первый параметр (код страны) для установки
время FreeDOS меня не интересовала. национальных форматов даты, времени, валюты и разде-

№7(20), июль 2004 59


администрирование
лителей, а указанная кодовая страница (второй параметр) Все скачанные архивы нужно распаковать в какой-нибудь
игнорируется, и используется страница, жёстко зашитая каталог, пусть для определенности это будет C:\WATCOM.
во время компиляции. Поэтому после установки из дист- Распаковывать архивы нужно с сохранением структуры
рибутива FreeDOS не может нормально обрабатывать каталогов.
файлы и каталоги с русскими именами. Но эту проблему Кроме компилятора C для сборки понадобится также
можно решить. Так как FreeDOS распространяется с пол- ассемблер NASM версии не ниже 0.98.36. Я использовал
ными исходными текстами, никто не мешает нам собрать версию 0.98.38 (DOS 32-bit). Загрузить NASM можно по
версию ядра с поддержкой нужной кодовой страницы. Опи- адресу: http://nasm.sourceforge.net. Будем считать, что
санию этой процедуры и посвящена статья. NASM распакован в каталог C:\NASM.
Для сборки ядра FreeDOS нам понадобится компиля- Маленький размер ядра FreeDOS достигается при по-
тор языка C. Выполнять компиляцию можно при помощи мощи использования динамической упаковки. После ком-
Turbo C 2.01, Turbo C++ 1.01, Turbo C 3.0, Borland C 4.51 и пиляции файл дополнительно обрабатывается упаковщи-
5.01, по утверждению авторов, можно использовать другие ком UPX, и при загрузке происходит его автоматическая
компиляторы Borland, Microsoft C и (Open)Watcom C. Хотя распаковка в оперативную память. Похожую технологию
некоторые версии компиляторов Borland сейчас доступны использует ядро Linux, там для упаковки используется
в Интернете для свободного скачивания, я (как и разработ- алгоритм GZIP или BZIP2. Скачать UPX можно по адресу:
чики FreeDOS) рекомендую использовать OpenWatcom C. http://upx.sourceforge.net. Я пользовался UPX 1.24d (32-bit
Я пробовал использовать для сборки компилятор Turbo C DOS version). По аналогии с NASM пусть UPX располага-
2.01. Процесс прошёл успешно, но получившееся ядро не ется в каталоге C:\UPX.
смогло нормально загрузиться. А после сборки компиля- Итак, все утилиты, необходимые для компиляции, у нас
тором OpenWatcom C 1.2 получился полностью рабочий есть, теперь нужно получить сами исходные тексты FreeDOS.
исполняемый файл. Вы можете скачать с сайта http://www.freedos.org/ дис-
Компилятор OpenWatcom можно свободно загрузить трибутив FreeDOS в виде образа загрузочного компакт-
из Интернета по адресу: http://openwatcom.mirrors.pair.com/ диска (ISO), в который входят исходные тексты, скомпи-
watcom/open-watcom-win32-1.2.exe – это полный инсталя- лированные версии всех файлов и интерактивный инстал-
тор для среды Win32, включая компиляторы C и Fortran77 лятор, либо скачать с того же адреса по отдельности не-
(размер файла 63.1 Mб). обходимые утилиты (команды и драйверы DOS) и по ад-
Если вы не хотите качать весь файл, можно получить ресу http://sourceforge.net/projects/freedos/ исходные тексты
набор только необходимых для компиляции компонентов по ядра.
адресу: http://openwatcom.mirrors.pair.com/watcom/zips-1.2. Если скачивать утилиты по отдельности, вы получите
Компиляцию можно выполнять как из-под Windows, так самые последние версии, программы, входящие в устано-
и из-под DOS. Версию компилятора для DOS можно ис- вочный образ, могут быть устаревшими. Я использовал для
пользовать, например, в среде DOSEMU под Linux. В за- сборки исходные тексты ядра версии 2.0.34 из дистрибути-
висимости от ОС, под которой будет проходить компиля- ва FreeDOS Beta9RC5, они находятся в файле FREEDOS\
ция, нужно скачать соответствующий набор ZIP-архивов. PACKAGES\SRC_BASE\DISK04\KERNELS.ZIP на компакт-
диске. После распаковки архива с сохранением структу-
ры каталогов в корне диска C мы получим каталог
C:\SOURCE\KE2034, в котором и располагаются исходные
тексты, документация на английском языке (в подкатало-
ге DOCS) и командные файлы, выполняющие сборку.
Сборка производится с помощью командного файла
BUILD.BAT или утилиты make. При запуске make без па-
раметров выполняется вызов того же самого BUILD.BAT,
так что разницы фактически никакой.
Перед началом компиляции нужно задать парамет-
ры, такие как тип и место нахождения используемого
компилятора, архитектура процессора, для которого
предназначено ядро (16 или 32 бита), и необходимость
поддержки файловой системы FAT32. Задаются эти па-
раметры в файле CONFIG.BAT. Чтобы получить исход-
ный вариант файла (с настройками по умолчанию), нуж-
но скопировать с этим именем файл CONFIG.B (copy
CONFIG.B CONFIG.BAT). Теперь вносим в файл
CONFIG.BAT необходимые изменения.
Следующие строки нужно закомментировать:

set COMPILER=TC2
set TC2_BASE=c:\tc201
set XCPU=86
set XFAT=16

60
администрирование
А взамен раскомментировать (убрать символы «:- » в Теперь вернемся в каталог KE2034 и, собравшись с ду-
начале строки): хом, запустим команду BUILD.BAT. После окончания ком-
пиляции в каталоге BIN мы получим файл KERNEL.SYS –
:- set COMPILER=WATCOM наше новое ядро FreeDOS. Кроме него, в каталоге BIN
:- if not \%WATCOM% == \ goto watcom_defined
:- set WATCOM=c:\watcom находятся дополнительные файлы и утилиты:
:-
:-
set PATH=%PATH%;%WATCOM%\binw
set XCPU=386
! AUTOEXEC.BAT – пример конфигурационного коман-
:- set XFAT=32 дного файла;
! CONFIG.SYS – пример конфигурационного файла DOS;
Следующие строки изменить: ! INSTALL.BAT – командный файл для создания загру-
зочной дискеты с собранным ядром;
set XNASM=c:\bin\nasm16 → set XNASM=c:\nasm\nasm ! KWC38632.map – карта памяти ядра (отладочная ин-
set XUPX=upx --8086 –best → set XUPX=c:\upx\upx --8086 --best
формация);
Если вы используете версию компилятора Watcom C ! KWC38632.sys – копия ядра, в имени файла которого
для среды Win32, то в строку указаны использованные опции сборки – тип компиля-
тора, тип процессора, тип файловой системы;
set PATH=%PATH%;%WATCOM%\binw ! SYS.COM – команда для копирования системных фай-
лов и записи на диск загрузочного сектора.
нужно добавить путь к каталогу binnt:
Я не разбирался, привязана ли жёстко команда
set PATH=%PATH%;%WATCOM%\binw;%WATCOM%\binnt SYS.COM к версии ядра, скорее всего нет, но на всякий
случай я использую оба файла, собранные совместно.
Итак, для компиляции у нас всё готово, осталось толь- Чтобы проверить работоспособность скомпилирован-
ко выполнить то, ради чего всё это затевалось – русифи- ных файлов, можно использовать командный файл
кацию. INSTALL.BAT. Вставьте в дисковод A: чистую дискету и,
Минимально необходимая модификация ядра, кото- находясь в каталоге KE2034\BIN, выполните команду
рая позволяет без проблем обрабатывать файлы с рус- INSTALL. На дискету будет скопировано ядро, конфигура-
скими символами в именах, – это задание правильной ционные файлы и командный интерпретатор.
таблицы преобразования строчных/заглавных букв. Ин- Только при копировании файла COMMAND.COM воз-
формация о кодовой странице (частью которой являет- никает небольшая проблема. Дело в том, что команда SYS
ся таблица преобразования) хранится в файле KERNEL\ ищет этот файл в трёх местах – в исходном каталоге, в
NLS_HC.ASM. Этот файл является копией одного из ис- корневом каталоге исходного диска и в переменной сре-
ходных файлов, находящихся в каталоге KERNEL\NLS. ды «COMSPEC», при этом она не проверяет, принадле-
В стандартном ядре это KERNEL\NLS\001-437.HC. жит ли найденный файл именно FreeDOS. Так как в ката-
Насколько я понял из комментариев, для создания логе KE2034\BIN после завершения сборки никакого
HC-файлов должна использоваться некая утилита, ко- COMMAND.COM нет, найден и скопирован на дискету бу-
торая преобразует файл формата UNF (Universal NLS дет командный интерпретатор той операционной систе-
data Format) в ассемблерный листинг (HC). Никаких сле- мы, под которой выполнялась компиляция. Не самое пло-
дов этой утилиты мне обнаружить не удалось, поэтому хое решение, однако если окажется, что текущая опера-
я решил взять в качестве исходного ассемблерный код ционная система – это не FreeDOS, а MS-DOS (или MS
файла NLS_HC.ASM и поменять таблицу непосредствен- Windows), то загрузочная дискета будет неработоспособ-
но в нём. Структура файла вполне очевидна. Хотя, кро- ной, так как COMMAND.COM от Microsoft работает только
ме заголовка, комментарии в файле отсутствуют, име- в «своей» версии DOS. Чтобы исправить эту ситуацию,
ющиеся имена меток достаточно информативны. Таб- можно либо заранее скопировать в каталог KE2034\BIN
лица преобразования регистра символов имеет метку командный интерпретатор от FreeDOS, либо после созда-
_nlsUpcaseHardcoded. Кроме этой таблицы, я также ис- ния дискеты скопировать файл на неё, заменив вариант,
правил таблицу порядка сортировки, которая помечена записанный командой SYS. На инсталяционном компакт-
как _nlsCollHardcoded. диске FreeDOS COMMAND.COM можно найти в каталоге
Порядок сортировки в изменённом варианте исполь- isolinux\buildcd.
зуется не алфавитный, а по возрастанию расширенных Теперь осталось перезагрузить компьютер (не забыв
ASCII-кодов символов. в настройках BIOS Setup разрешить загрузку с дискеты)
Для русской кодовой страницы 866 использование та- и убедиться в работоспособности скомпилированного
кого порядка даёт почти правильный результат, только в ядра.
последовательность строчных русских букв вклинивает-
ся набор символов псевдографики (эти символы в име- Ссылки:
нах файлов встречаются нечасто). 1. FreeDOS – http://www.freedos.org
Мой вариант файла NLS_HC.ASM можно скачать по 2. OpenWatcom – http://www.openwatcom.org
ссылке http://vdruzhin.chat.ru/freedos/007-866.hc. После 3. NASM (Netwide Assembler)- http://nasm.sourceforge.net
скачивания файл нужно переименовать и скопировать 4. UPX (Ultimate Packer for eXecutables) – http://upx.source-
вместо оригинального NLS_HC.ASM. forge.net

№7(20), июль 2004 61


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

ТЕХНИКА ВНЕДРЕНИЯ КОДА


В РЕ-ФАЙЛЫ И МЕТОДЫ
ЕГО УДАЛЕНИЯ

Настоящая статья – попытка систематизировать и классифицировать существующие алгоритмы


внедрения в PE32/PE64-файлы, способы визуальной идентификации потенциально опасного кода
и методы его удаления. Публикация рассчитана на широкий круг читателей, знакомых с языком Си
и имеющих опыт системного программирования на операционных системах семейства Windows 9x
и Windows NT.

КРИС КАСПЕРСКИ
Механизмы внедрения в PE-файлы весьма разнообраз- NOP. О репродуктивных способностях X-кода в общем слу-
ны, но довольно поверхностно описаны в доступной лите- чае ничего не известно, и для успокоения будем считать
ратуре. Имеющиеся источники либо катастрофически не- X-код несаморазмножающимся кодом. Всю ответствен-
полны, либо откровенно неточны, да к тому же рассеянны ность за внедрение берет на себя человек, запускающий
по сотням различных FAQ и tutorial. Приходится, выража- программу-внедритель (нет, не «вредитель», а «внедри-
ясь словами Маяковского, перелопачивать тонны словес- тель» от слова «внедрить»), которая, предварительно убе-
ной руды, прежде чем обнаружится нечто полезное. Дан- дившись в наличии прав записи в файл-носитель (а эти
ная работа представляет собой попытку систематизации права опять-таки дает человек) и его совместимости с выб-
и классификации всех известных способов внедрения. ранной стратегией внедрения, записывает X-код внутрь
Статья будет интересна не только специалистам по ин- файла и осуществляет высокоманевренный перехват уп-
формационной безопасности, занимающихся идентифика- равления, так что подопытная программа не замечает
цей и удаленем вирусов, но и разработчикам навесных за- никаких изменений.
щит конвертного типа и упаковщиков. Что касается виру- Для экономии места в статье используется ряд обще-
сописателей. Если человек задался целью написать вирус, принятых сокращений, перечисленных ниже:
то он его напишет. Публикации подобного рода на это ни- ! FA: File Alignment – физическое выравнивание секций;
как не влияют. Автор ни к чему не призывает и ни от чего ! SA, OA: Section Alignment или Object Alignment – вир-
не отговаривает. Это – прерогатива карательных органов туальное выравнивание секций;
власти, религиозных деятелей, ну и моралистов наконец. ! RVA: Relative Virtual Address – относительный виртуаль-
Моя же задача намного скромнее – показать, какие пути ный адрес;
внедрения существуют, на что обращать внимание при по- ! FS: First Section – первая секция файла;
иске постороннего кода и как отремонтировать файл, уг- ! LS: Last Section – последняя секция файла;
робленный некорректным внедрением. ! CS: Current Section – текущая секция файла;
! NS: Next Section – следующая секция файла;
Понятие X-кода и другие условные ! v_a: Virtual Address – виртуальный адрес;
обозначения ! v_sz: Virtual Size – виртуальный размер;
Код, внедряющийся в файл, мы будем называть X-кодом. ! r_off: raw offset – физический адрес начала секции;
Под это определение попадает любой код, внедряемый ! f_sz: raw size – физический размер секции;
нами в файл-носитель (он же подопытный файл или файл- ! DDIR: DATA DIRECTORY – нет адекватного перевода;
хозяин от английского host-file), например, инструкция ! EP: Entry Point – точка входа.

62
программирование
Под Windows NT, если не оговорено обратное, подра- ! Поиском необходимых функций в таблице импорта
зумевается вся линейка NT-подобных операционных сис- файла-хозяина (будьте готовы к тому, что там их не
тем: Windows NT 4.0/Windows 2000/Windows XP, а под окажется, либо отказывайтесь от внедрения, либо ис-
Windows 9x – Windows 95, Windows 98 и Windows Me. пользуйте другую стратегию поиска).
Под системным загрузчиком понимается компонент ! Поиском LoadLibrary/GetProcAddress в таблице импор-
операционной системы, ответственный за загрузку испол- та файла-хозяина с последующим импортированием
няемых файлов и динамических библиотек. всех необходимых функций вручную (будьте готовы к
Выше, левее, западнее – соответствует меньшим ад- тому, что и этих функций в таблице импорта также не
ресам, что совпадает с естественной схемой отображе- окажется).
ния дампа памяти отладчиком или дизассемблером. ! Прямым вызовом API-функций по их абсолютным ад-
ресам, жестко прописанным внутри X-кода (адреса
функций KERNEL32.DLL/NTDLL.DLL меняются от од-
ной версии системы к другой, а адреса USER32.DLL и
всех остальных пользовательских библиотек непосто-
янны даже в рамках одной конкретной системы и ва-
рьируются в зависимости от Image Base остальных заг-
ружаемых библиотек, поэтому при всей популярности
данного способа пользоваться им допустимо только в
образовательно-познавательных целях).
! Добавлением в таблицу импорта необходимых X-коду
функций, которыми, как правило, являются LoadLibrary/
GetProcAddress, с их помощью можно вытащить из
недр системы и все остальные (достаточно надежный,
Ðèñóíîê 1. Óñëîâíûå ãðàôè÷åñêèå îáîçíà÷åíèÿ, ïðèíÿòûå â ñòàòüå хотя и слишком заметный способ).
! Непосредственным поиском функций LoadLibrary/Get
Цели и задачи Х-кода ProcAddress в памяти, поскольку KERNEL32.DLL проеци-
Перед X-кодом стоят по меньшей мере три задачи: руется на адресное пространство всех процессов, а ее
! разместить свое тело внутри подопытного файла; базовый адрес всегда выровнен на границу в 64 Кб, от
! перехватить управление до начала выполнения основ- нас всего лишь требуется просканировать первую по-
ной программы или в процессе оного; ловину адресного пространства процесса на предмет
! определить адреса API-функций, жизненно важных для поиска сигнатуры «MZ». Если таковая найдена – убеж-
собственного функционирования. даемся в наличии сигнатуры «PE», расположенной по
смещению e_lfanew от начала базового адреса загруз-
Методология перехвата управления и определения ад- ки. Если она действительно присутствует, анализируем
ресов API-функций уже рассматривалась нами ранее в DATA DIRECTORY и определяем адрес таблицы экспор-
[1, 2, 3], поэтому здесь не описывается. Ограничимся тем, та, в которой требуется найти LoadLibraryA и GetProc
что напомним читателю основные моменты. Address. Если же хотя бы одно из этих условий не со-
Перехват управления обычно осуществляется следу- впадает, уменьшаем указатель на 64 Кб и повторяем
ющими путями: всю процедуру заново. Пара соображений в подмогу:
! переустановкой точки входа на тело X-кода; прежде чем что-то читать из памяти, вызовите функ-
! внедрением в окрестности оригинальной точки входа цию IsBad ReadPtr, убедившись, что вы вправе это де-
команды перехода на X-код (естественно, перед пере- лать; помните, что Windows 2000 Advanced Server и
дачей управления X-код должен удалить команду, вос- Datacenter Server поддерживают загрузочный параметр
становив исходное содержимое EP); /3GB, предоставляющий в распоряжение процесса 3 Гб
! переустановкой произвольно взятой команды JMP/ оперативной памяти и сдвигающий границу сканирова-
CALL на тело X-кода с последующей передачей управ- ния на 1 Гб вверх; для упрощения отождествления
ления по оригинальному адресу (этот прием не гаран- KERNEL32.DLL можно использовать поле Name RVA, со-
тирует, что X-коду вообще удастся заполучить управ- держащееся в Export Directory Table и указывающее на
ление, но зато обеспечивает ему феноменальную имя динамической библиотеки, однако оно может быть
скрытность и максимальную защищенность от анти- и подложным (системный загрузчик его игнорирует).
вирусов); ! Определением адреса функции KERNEL32!_except_
! модификацией одного или нескольких элементов таб- handler3, на которую указывает обработчик структур-
лицы импорта с целью подмены вызываемых функций ных исключений по умолчанию. Эта функция не экс-
своими собственными (этой технологией в основном портируется ядром, однако присутствует в отладочной
пользуются stealth-вирусы, умело скрывающие свое таблице символов, которую можно скачать со следую-
присутствие в системе). щего сервера http://msdl.microsoft.com/download/symbols.
(Внимание! Сервер не поддерживает просмотр браузе-
Определение адресов API-функций обычно осуществ- ром, и с ним работают только последние версии Microsoft
ляется следующими путями: Kernel Debugger и NuMega Soft-Ice). Это делается так:

№7(20), июль 2004 63


программирование
mov esi, fs:[0]/lodsd/lodsd Требования, предъявляемые к X-коду
Во-первых, X-код должен быть полностью перемещаем,
После выполнения кода регистр EAX содержит адрес, т.е. сохранять свою работоспособность независимо от
лежащий где-то в глубине KERNEL32. Выравниваем базового адреса загрузки. Это достигается использова-
его по границе 64 Кб и ищем MZ/PE-сигнатуры, как по- нием относительной адресации: определив свое текущее
казано в предыдущем пункте (это наиболее коррек- расположение вызовом команды:
тный и надежный способ поиска).
! Определением базового адреса загрузки KERNEL32.DLL CALL $+5/POP EBP
через PEB:
X-код сможет преобразовать смещения внутри своего тела
mov eax, fs:[30h]/mov eax, [eax + 0Ch]/mov esi, ↵ в эффективные адреса простым сложением их с EBP. Ра-
[eax + 1Ch]/lodsd/mov ebx, [eax + 08h]
зумеется, это не единственная схема. Существуют и дру-
Базовый код возвращается в регистре EBX (это очень гие, однако мы не будем на них останавливаться, посколь-
простой, хотя и ненадежный прием, т.к. структура PEB ку к PE-файлам они не имеют ни малейшего отношения.
в любой момент может измениться, и за все время су- Во-вторых, грамотно сконструированный X-код никог-
ществования Windows она уже менялась по меньшей да не модифицирует свои ячейки, поскольку не знает, име-
мере три раза, к тому же PEB есть только в NT); ются ли у него права на запись или нет. Стандартная сек-
! Использованием native API операционной системы, вза- ция кода лишена атрибута IMAGE_SCN_MEM_WRITE, и
имодействие с которым осуществляется либо через присваивать его крайне нежелательно, т.к. это не только
прерывание INT 2Fh (Windows 3.x, Windows 9x), либо че- демаскирует X-код, но и снижает иммунитет программы-
рез прерывание INT 2Eh (Windows NT, Windows 2000), носителя. Разумеется, при внедрении в секцию данных
либо через машинную команду syscall (Windows XP). это ограничение теряет свою актуальность, однако дале-
Краткий перечень основных функций можно найти в ко не во всех случаях запись в секцию данных разреше-
Interrupt List Ральфа Брауна: http://www.pobox.com/~ralf/ на. Оптимизм – это прекрасно, но программист должен
files.html (это наиболее трудоемкий и наименее надеж- закладываться на наихудший вариант развития событий.
ный способ из всех, мало того, что native API-функ- Разумеется, это еще не означает, что X-код не может быть
ции не только недокументированы и подвержены по- самомодифицирующимся или не должен модифицировать
стоянным изменениям, так они еще и до безобразия никакие ячейки памяти вообще! К его услугам и стек (ав-
примитивны, т.е. реализуют простейшие низкоуров- томатическая память), и динамическая память (куча), и
невые функции, непригодные к непосредственному кольцевой стек сопроцессора наконец!
использованию). В третьих, X-код должен быть предельно компактным,
поскольку объем пространства, пригодного для внедре-
Принципы внедрения X-кода в PE-файлы с техничес- ния, подчас очень даже ограничен. Имеет смыл разбить
кой точки зрения практически ничем не отличаются от ELF, X-код на две части: крошечный загрузчик и протяжный
разве что именами служебных полей и стратегией их мо- хвост. Загрузчик лучше всего разместить в PE-заголовке
дификации. или регулярной последовательности внутри файла, а хвост
Однако детальный анализ спецификаций и дизассем- сбросить в оверлей или NTFS-поток, комбинируя тем са-
блирование системного загрузчика выявляет целый мым различные методы внедрения.
пласт тонкостей, неизвестных даже профессионалам (во Наконец, X-код не может позволить себе задерживать
всяком случае ни один известный мне протектор/упаков- управление более чем на несколько сотых, ну от силы
щик не избежал грубых ошибок проектирования и реа- десятых долей секунд, в противном случае факт внедре-
лизации). ния станет слишком заметным и будет сильно нервиро-
Существуют следующие способы внедрения: вать пользователя, чего допускать ни в коем случае
! размещение X-кода поверх оригинальной программы нельзя.
(так же называемое затиранием);
! размещение X-кода в свободном месте программы Внедрение
(интеграция); Перед внедрением в файл необходимо убедиться, что он
! дописывание X-кода в начало, середину или конец не является драйвером, не содержит нестандартных таб-
файла с сохранением оригинального содержимого; лиц в DATA DIRECTORY и доступен для модификации.
! размещение X-кода вне основного тела файла-носи- Присутствие оверлеев крайне нежелательно, и без осо-
теля (например, в динамической библиотеке или NTFS- бой необходимости в оверлейный файл лучше ничего не
потоке), загружаемого «головой» X-кода, внедренной внедрять, а если и внедрять, то придерживаться наибо-
в файл одним из предыдущих способов. лее безболезненной стратегии внедрения – стратегии А
(см. раздел «Классификация механизмов внедрения»).
Поскольку первый способ приводит к необратимой по- Ниже все эти требования разобраны подробнее:
тере работоспособности исходной программы и реально ! если файл расположен на носителе, защищенном от
применяется только в вирусах, здесь он не рассматрива- записи, или у нас недостаточно прав для его записи/
ется. Все остальные алгоритмы внедрения полностью или чтения (например, файл заблокирован другим процес-
частично обратимы. сом), отказываемся от внедрения;

64
программирование
! если файл имеет атрибут, запрещающий модифика- Предотвращение повторного внедрения
цию, либо снимаем этот атрибут, либо отказываемся В то время как средневековые алхимики пытались создать
от внедрения; алмогест – универсальный растворитель, растворяющий
! если поле Subsystem > 2h или Subsystem < 3h, отказы- все и вся, – их оппоненты язвительно замечали: задумай-
ваемся от внедрения; тесь, в чем вы его будете хранить? И хотя алмогест так и
! если FA < 200h или SA < 1000h – это, вероятнее всего, не был изобретен, его идея не умерла и до сих пор будо-
драйвер, и в него лучше ничего не внедрять; ражит умы вирусописателей, вынашивающих идею прин-
! если файл импортирует одну или несколько функций ципиально недетектируемого вируса. Может ли существо-
из hal.dll и/или ntoskrnl.exe, отказываемся от внедре- вать такой вирус хотя бы в принципе? И если да, то как он
ния; сможет отличать уже инфицированные файлы от еще не
! если файл содержит секцию INIT, он, возможно, явля- зараженных? В противном случае заражения одного и того
ется драйвером устройства, а возможно, и нет, но без же файла будут происходить многократно и навряд ли мно-
особой нужды лучше сюда ничего не внедрять; гочисленные копии вирусов смогут мирно соседствовать
! если DATA DIRECTORY содержит ссылки на таблицы, друг с другом.
использующие физическую адресацию, либо отказы- X-код, сохраняющий работоспособность даже при мно-
ваемся от внедрения, либо принимаем на себя обяза- гократном внедрении, называют рентабельным. Рентабель-
тельства корректно «распотрошить» всю иерархию ность предъявляет жесткие требования как к алгоритмам
структур данных и скорректировать физические адре- внедрения в целом, так и к стратегии поведения X-кода в
са; частности. Очевидно, что X-код, внедряющийся в MS-DOS-
! если ALIGN_UP(LS.r_off + LS.r_sz, A) > SizeOfFile, файл заглушку, рентабельным не является и каждая последую-
скорее всего содержит оверлей, и внедряться в него щая копия затирает собой предыдущую. Протекторы, моно-
можно только по методу А; полизирующие системные ресурсы с целью противостояния
! если физический размер одной или нескольких сек- отладчикам (например, динамически расшифровывающие/
ций превышает виртуальный на величину большую или зашифровывающие защищаемую программу путем перево-
равную FA и при этом виртуальный размер не равен да страниц памяти в сторожевой режим с последующим пе-
нулю, подопытный файл содержит оверлей, допуская рехватом прерываний), будут конфликтовать друг с другом,
тем самым использовать внедрения только типа А. вызывая либо зависание, либо сбой программы. Классичес-
ким примером рентабельности является X-код, дописываю-
Следует помнить о необходимости восстановления щий себя в конец файла и после совершения всех заплани-
атрибутов файла и времени его создания, модификации рованных операций возвращающий управление программе-
и последнего доступа (большинство разработчиков огра- носителю. При многократном внедрении X-коды как бы «раз-
ничивается одним лишь временем модификации, что де- матываются», передавая управление словно по эстафете,
маскирует факт внедрения). однако, если нить управления запутается, все немедленно
Если поле контрольной суммы не равно нулю, следует рухнет. Допустим, X-код привязывается к своему физичес-
либо оставить такой файл в покое, либо рассчитать новую кому смещению, отсчитывая его относительно конца фай-
контрольную сумму самостоятельно, например, путем вызо- ла. Тогда при многократном внедрении по этим адресам бу-
ва API-функции CheckSumMappedFile. Обнулять контрольную дут расположены совсем другие ячейки, принадлежащие чу-
сумму, как это делают некоторые, категорически недопус- жому X-коду, и поведение обоих станет неопределенным.
тимо, т.к. при активных сертификатах безопасности опера- Перед внедрением в файл нерентабельного X-кода
ционная система просто откажет файлу в загрузке! необходимо предварительно убедиться, что в файл не был
Еще несколько соображений общего типа. В последнее внедрен кто-то еще. К сожалению, универсальных путей
время все чаще и чаще приходится сталкиваться с испол- решения не существует, и приходится прибегать к раз-
няемыми файлами чудовищного объема, неуклонно при- личным эвристическим приемам, распознающим присут-
ближающегося к отметке в несколько гигабайт. Обрабаты- ствие инородного X-кода по косвенным признакам.
вать таких монстров по кускам нудно и сложно. Загружать Родственные X-коды всегда могут «договориться» друг
весь файл целиком – слишком медленно, да и позволит ли с другом, отмечая свое присутствие уникальной сигнату-
Windows выделить такое количество памяти! Поэтому име- рой. Например, если файл содержит строку «x-code
ет смысл воспользоваться файлами, проецируемыми в па- ZANZIBAR here», отказываемся от внедрения на том ос-
мять (Memory Mapped File), управляемыми функциями новании, что здесь уже есть «свои». К сожалению, этот
CreateFileMapping и MapViewOfFile/UnmapView OfFile. Это трюк очень ненадежен, и при обработке файла любым упа-
не только увеличивает производительность, упрощает про- ковщиком/протектором сигнатура неизбежно теряется. Ну
граммирование, но и ликвидирует все ограничения на пре- разве что внедрить сигнатуру в ту часть секции ресурсов,
дельно допустимый объем, который теперь может дости- которую упаковщики/протекторы предпочитают не трогать
гать 18 экзобайтов, что соответствует 1 152 921 504 606 (иконка, информация о файле и т. д.). Еще надежнее вне-
846 976 байтам. Как вариант можно ограничить размер дрять сигнатуру в дату/время последней модификации
обрабатываемых файлов несколькими мегабайтами, лег- файла (например, в десятые доли секунды). Упаковщики/
ко копируемыми в оперативный буфер и сводящими коли- протекторы ее обычно восстанавливают, однако короткая
чество «обвязочного» кода к минимуму (кто работал с фай- длина сигнатуры вызывает большое количество ложных
лами от 4 Гб и выше, тот поймет). срабатываний, что тоже нехорошо.

№7(20), июль 2004 65


программирование
Неродственным X-кодам приходится намного хуже. Чу- ! К категории C относятся механизмы, вызывающие из-
жих сигнатур они не знают и потому не могут наверняка менения адресации как физического, так и виртуаль-
утверждать – возможно ли осуществить корректное вне- ного образов. Длина файла и выделяемая при загруз-
дрение в файл или нет? Поэтому X-код, претендующий на ке память увеличиваются. Базовые структуры могут
корректность, обязательно должен быть рентабельным, в либо оставаться на своих местах (т.е. изменяются лишь
противном случае сохранение работоспособности файлам смещения, отсчитываемые от конца образа/файла),
уже не гарантировано. либо перемещаться по страничному имиджу произ-
Упаковщики оказываются в довольно выигрышном по- вольным образом, требуя обязательной коррекции.
ложении: дважды один файл не сожмешь, и если коэф- Этой категории соответствует расширение последней
фициент сжатия окажется исчезающе мал, упаковщик секции файла, создание своей собственной секции и
вправе отказаться обрабатывать такой файл. Протекто- расширение серединных секций.
рам – другое дело. Протектор, отказывающийся обраба- ! К «засекреченной» категории Z относятся механизмы,
тывать уже упакованные (зашифрованные) файлы, мало вообще не дотрагивающиеся до файла-носителя и вне-
кому нужен. Если протектор монополизирует ресурсы, от- дряющиеся в его адресное пространство косвенным
казываясь их предоставлять кому-то еще, он должен обя- путем, например модификацией ключа реестра, ответ-
зательно контролировать целостность защищенного фай- ственного за автоматическую загрузку динамических
ла и, обнаружив внедрение посторонних, выводить соот- библиотек. Этой технологией интересуются в первую
ветствующее предупреждение на экран, возможно, пре- очередь сетевые черви и шпионы. Вирусы к ней рав-
кращая при этом работу. В противном случае защищен- нодушны.
ный файл могут упаковать и попытаться защитить повтор-
но. Последствия такой защиты не заставят себя ждать… Категория A наименее конфликтна и приводит к от-
казу лишь тогда, когда файл контролирует свою целост-
Классификация механизмов внедрения ность. Сфера применений категорий B и C гораздо бо-
Механизмы внедрения можно классифицировать по-раз- лее ограничена, в частности, она неспособна обрабаты-
ному: по месту (начало, конец, середина), по «геополити- вать файлы с отладочной информацией, поскольку от-
ке» (затирание исходных данных, внедрение в свободное ладочная информация практически всегда содержит
пространство, переселение исходных данных на новое большое количество ссылок на абсолютные адреса. Ее
место обитания), по надежности (предельно корректное, формат не документирован, и к тому же различные ком-
вполне корректное и крайне некорректное внедрение), по пиляторы используют различные форматы отладочной
рентабельности (рентабельное или нерентабельное) и т. д. информации, поэтому скорректировать ссылки на новые
Мы же будем отталкиваться от характера воздействия на адреса нереально. Помимо отладочной информации еще
физический и виртуальный образ подопытной програм- существуют сертификаты безопасности и прочие струк-
мы, разделив все существующие механизмы внедрения туры данных, нуждающиеся в неприкосновенности сво-
на четыре категории, обозначенные латинскими буквами их смещений. К сожалению, механизмы внедрения кате-
A, B, C и Z. гории А налагают достаточно жесткие ограничения на
! К категории А относятся механизмы, не вызывающие предельно допустимый объем X-кода, определяемый
изменения адресации ни физического, ни виртуально- количеством свободного пространства, имеющегося в
го образов. После внедрения в файл ни его длина, ни программе, и достаточно часто здесь не находится мес-
количество выделенной при загрузке памяти не изме- та даже для крохотного загрузчика, поэтому приходится
няется и все базовые структуры остаются на своих идти на вынужденный риск, используя другие категории
прежних адресах. Этому условию удовлетворяют вне- внедрения.
дрение в пустое место файла (PE-заголовок, хвосты Кстати говоря, различные категории можно комби-
секций, регулярные последовательности), внедрение нировать друг с другом, осуществляя «гибридное» вне-
путем сжатия части секции и создание нового NTFS- дрение, наследующее худшие качества всех использу-
потока внутри файла1. емых механизмов, но и аккумулирующее их лучшие
! К категории B относятся механизмы, вызывающие из- черты.
менения адресации только физического образа. Пос-
ле внедрения в файл его длина увеличивается, одна- Категория A: внедрение в пустое место файла
ко количество выделенной при загрузке памяти не из-
меняется, и все базовые структуры проецируются по Внедрение в PE-заголовок
тем же самым адресам, однако их физические смеще- Типичный PE-заголовок вместе с MS-DOS-заголовком и
ния изменяются, что требует полной или частичной пе- заглушкой занимает порядка 300h байт, а минимальная
рестройки структур, привязывающихся к своим физи- кратность выравнивания секций составляет 200h. Таким
ческим адресам. Если хотя бы одна из них останется образом, между концом заголовка и началом первой сек-
нескорректированной (или будет скорректирована не- ции практически всегда имеется 100h бесхозных байт,
правильно), файл-носитель с высокой степенью веро- которые можно использовать для «производственных це-
ятности откажет в работе. Категории B соответствуют лей», размещая здесь либо всю внедряемую программу
раздвижка заголовка, сброс части оригинального фай- целиком, либо только загрузчик X-кода, считывающий
ла в оверлей и создание своего собственного оверлея. свое продолжение из дискового файла или реестра.

66
программирование
! иначе:
! сканируем PE-заголовок на предмет поиска непре-
рывной цепочки нулей и, если таковая будет дей-
ствительно найдена, внедряем свое тело, начиная с
10h байта от ее начала;
Ðèñóíîê 2. Âíåäðåíèå X-êîäà â ñâîáîäíîå ïðîñòðàíñòâî õâîñòà ! внедряем X-код в MS-DOS-заглушку, не сохраняя ее
PE-çàãîëîâêà старого содержимого;
Внедрение. Перед внедрением в заголовок X-код дол- ! если внедрение прошло успешно, перехватываем уп-
жен убедиться, что хвостовая часть заголовка (ласково на- равление на X-код.
зываемая «предхвостием») действительно свободна, т.е.
SizeOfHeadres < FS.r_off. Если же SizeOfHeadres == FS.r_off Идентификация пораженных объектов. Внедрение
вовсе не факт, что свободного места в конце заголовка в PE-заголовок в большинстве случаев можно распоз-
нет. «Подтягивать» хвост заголовка к началу первой сек- нать и визуально. Рассмотрим, как выглядит в hex-ре-
ции – обычная практика большинства линкеров, усматри- дакторе типичный исполняемый файл (см. рис. 3): вслед
вающих в этом гармонию высшего смысла. Сканирова- за концом MS-DOS-заголовка, обычно содержащим в
ние таких заголовков обычно выявляет длинную цепочку себе строку «This program cannot be run in DOS mode»
нулей, расположенных в его хвосте и, очевидно, никак и (или что-то подобное), расположена «PE»-сигнатура, за
никем не используемых. Может ли X-код записать в них которой следует немного мусора, щедро разбавленного
свое тело? Да, может, но только с предосторожностями. нулями и плавно перетекающего в таблицу секций, со-
Необходимо отсчитать по меньшей мере 10h байт от пос- держащую легко узнаваемые имена .text, .rsrc и .data
леднего ненулевого символа, оставляя этот участок не- (если файл упакован, названия секций скорее всего бу-
тронутым (в конце некоторых структур присутствует до 10h дут другими).
нулей, искажение которых ни к чему хорошему не приве- Иногда за таблицей секций присутствует таблица
дет). BOUND импорта с перечнем имен загружаемых динами-
Некоторые программисты пытаются проникнуть в MS- ческих библиотек. Дальше, вплоть до начала первой сек-
DOS-заголовок и заглушку. Действительно, загрузчик ции, не должно быть ничего, кроме нулей, использующих-
Windows NT реально использует всего лишь шесть байт: ся для выравнивания (отождествить начало первой сек-
сигнатуру «MZ» и указатель e_lfanew. Остальные же его ции легко, hiew ставит в этом месте точку). Если же это не
никак не интересует и могут быть использованы X-кодом. так, то исследуемый файл содержит X-код (см. рис. 4).
Разумеется, о последствиях запуска такого файла в го- Восстановление пораженных объектов. Не все ди-
лой MS-DOS лучше не говорить, но… MS-DOS уже давно зассемблеры позволяют дизассемблировать PE-заголо-
труп. Правда, некоторые вполне современные PE-загруз- вок. IDA PRO относится к числу тех, что позволяют, но
чики дотошно проверяют все поля MS-DOS-заголовка (в делает это только в случаях крайней необходимости, ког-
особенности это касается win32-эмуляторов), поэтому без да точка входа указывает внутрь заголовка. Заставить же
особой нужды лучше в них не лезть, а вот использовать ее отобразить заголовок вручную, судя по всему, невоз-
для своих нужд MS-DOS-заглушку можно, пускай и не без можно. HIEW в этом отношении более покладист, но RVA-
ограничений. Многие системные загрузчики неспособны адреса и переходы внутри заголовка он не транслирует и
транслировать виртуальные адреса, лежащие к западу от их приходится вычислять самостоятельно. Дизассембли-
PE-заголовка, что препятствует размещению в MS-DOS- ровав X-код и определив характер и стратегию перехвата
заголовке/заглушке служебных структур PE-файла. Даже управления, восстановите пораженный файл в исходный
и не пытайтесь внедрять сюда таблицу импорта или таб- вид или потрассируйте X-код в отладчике, позволив ему
лицу перемещаемых элементов! А вот тело X-кода вне- сделать это самостоятельно, а в момент передачи управ-
дрять можно. ления оригинальной программе сбросьте дамп (разуме-
Кстати говоря, при обработке файла популярным упа- ется, прогон активного X-кода под отладчиком всегда таит
ковщиком UPX X-код, внедренный в PE-заголовок, не вы- в себе угрозу и отлаживаемая программа в любой момент
живает, поскольку UPX полностью перестраивает заголо- может вырваться из-под контроля, поэтому если вы хотя
вок, выбрасывая оттуда все «ненужное» (MS-DOS-заглуш- бы чуточку не уверены в себе, пользуйтесь дизассембле-
ку он, к счастью, не трогает). Упаковщики ASPack и tElock ром, так будет безопаснее).
ведут себя более корректно, сохраняя и MS-DOS-заглуш- Если X-код оказался утрачен, например, вследствие
ку, и оригинальный PE-заголовок, однако X-код должен упаковки UPX, распакуйте файл и постарайтесь иденти-
исходить из худшего варианта развития событий. фицировать стартовый код оригинальной программы (в
В общем случае внедрение в заголовок осуществля- этом вам поможет IDA PRO), переустановив на него точ-
ется так: ку входа. Возможно, вам придется реконструировать ок-
! считываем PE-заголовок и приступаем к его анализу; рестности точки входа, разрушенные командой перехо-
! если SizeOfHeaders < FS.r_off и (SizeOfHeaders + sizeof(X- да на X-код. Если исходный стартовый код начинался с
code))< FS.r_off, то: пролога (а в большинстве случаев это так), то на ремонт
! увеличиваем SizeOfHeaders на sizeof(X-code) или же файла уйдет совсем немного времени (первые 5 байт
просто подтягиваем его к raw offset первой секции; пролога стандартны и легко предсказуемы, обычно это
! записываем X-код на образовавшееся место; 55 8B EC 83 EC, 55 8B EC 83 C4, 55 8B EC 81 EC или

№7(20), июль 2004 67


программирование
55 8B EC 81 C4, правильный вариант определяется по которая, к сожалению, неверна. Как уже говорилось выше,
правдоподобности размера стекового фрейма, отводи- любой компилятор/линкер вправе использовать все
мого под локальные переменные). При более серьезных SizeOfHeaders байт заголовка.
разрушениях алгоритм восстановления становится нео- Если таблица диапазонного импорта дублирует стан-
днозначен, и вам, возможно, придется перебрать боль- дартную таблицу импорта (а чаще всего это так), то про-
шое количество вариантов. Попробуйте отождествить стейший способ ремонта файла сводится к обнулению
компилятор и изучить поставляемый вместе с ним стар- 0x11-го элемента DATA DIRECTORY, а точнее, ссылки на
товый код – это существенно упрощает задачу. Хуже, структуру IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT.
если X-код внедрился в произвольное место программы, Если же таблица диапазонного импорта содержит (точ-
предварительно сохранив оригинальное содержимое в нее, содержала) уникальные динамические библиотеки,
заголовке (которого теперь с нами нет). Возвратить ис- отсутствующие во всех остальных таблицах, то для вос-
порченный файл из небытия скорее всего будет невоз- становления достаточно знать базовый адрес их загруз-
можно, во всяком случае, никаких универсальных рецеп- ки. При отключенном диапазонном импорте эффективные
тов его реанимации не существует. адреса импортируемых функций, жестко прописанные в
Некорректно внедренный X-код может затереть таб- программе, будут ссылаться на невыделенные страницы
лицу диапазонного импорта, обычно располагающуюся памяти и операционная система немедленно выбросит
позади таблицы секций, и тогда система откажет файлу в исключение, сообщая виртуальный адрес ячейки, к кото-
загрузке. Это происходит, когда разработчик определяет рой произошло обращение. Остается лишь найти дина-
актуальный конец заголовка по следующей формуле: мическую библиотеку (и этой библиотекой скорее всего
будет собственная библиотека восстанавливаемого при-
e_lfanew + SizeOfOptionalHeader + 14h + NumberOfSections*40 ложения, входящая в комплект поставки), содержащую по

Ðèñóíîê 3. Òàê âûãëÿäèò òèïè÷íûé PE-çàãîëîâîê íåçàðàæåííîãî ôàéëà

68
программирование
данному адресу более или менее осмысленный код, со- Внедрение в хвост секции
впадающий с точкой входа в функцию. Зная имена им- Операционная система Windows 9x требует, чтобы физи-
портируемых библиотек, восстановить таблицу диапазон- ческие адреса секций были выровнены по меньшей мере
ного импорта не составит никакого труда. на 200h байт (Windows NT – на 002h), поэтому между сек-
Для приличия (чтобы не ругались антивирусы) можно циями практически всегда есть некоторое количество сво-
удалить неактивный X-код из файла, установив SizeOf бодного пространства, в котором легко затеряться.
Headers на последний байт таблицы секций (или таблицы Рассмотрим структуру файла notepad.exe из поставки
диапазонного импорта, если она есть) и вплоть до FS.r_off, Windows 2000 (см. листинг 2). Физический размер секции
заполнив остальные байты нулями, символом «*» или .text превышает виртуальный на 6600h – 65CAh == 36h байт,
любым другим символом по своему вкусу. Например, «по- а .rsec – аж на C00h! Вполне достаточный объем простран-
сторонним вирусам вход воспрещен!». ства для внедрения, не правда ли? Разумеется, такое ве-
зение выпадает далеко не всегда, но пару десятков сво-
Ëèñòèíã 1. Äèçàññåìáëåðíûé ôðàãìåíò X-êîäà, âíåäðåííîãî бодных байт можно найти практически в любом файле.
â çàãîëîâîê (âñå êîììåíòàðèè ïðèíàäëåæàò Èäå)
HEADER:01000300 ; The code at 01000000-01000600 is hidden Ëèñòèíã 2. Òàê âûãëÿäèò òàáëèöà ñåêöèé ôàéëà notepad.exe
; from normal disassembly
HEADER:01000300 ; and was loaded because the user ordered Number Name v_size RVA r_size r_offst flag
; to load it explicitly 1 .text 00065CA 0001000 0006600 0000600 60000020
HEADER:01000300 ; 2 .data 0001944 0008000 0000600 0006C00 C0000040
HEADER:01000300 ; <<<< IT MAY CONTAIN TROJAN HORSES, 3 .rsrc 0006000 000A000 0005400 0007200 40000040
; VIRUSES, AND DO HARMFUL THINGS >>>

HEADER:01000300 ;
HEADER:01000300 public start
HEADER:01000300 start:
HEADER:01000300 call $+5
HEADER:01000305 pop ebp
HEADER:01000306 mov esi, fs:0
HEADER:0100030C lodsd
HEADER:0100030D push ebp
HEADER:0100030E lodsd Ðèñóíîê 5. Âíåäðåíèå X-êîäà â õâîñò ñåêöèè, îñòàâøèéñÿ
HEADER:0100030F push eax îò âûðàâíèâàíèÿ

Ðèñóíîê 4. Òàê âûãëÿäèò çàãîëîâîê ôàéëà ïîñëå âíåäðåíèÿ X-êîäà

№7(20), июль 2004 69


программирование
Внедрение. Перед внедрением необходимо найти вать свое тело в стек или в буфер динамической памяти и
секцию с подходящими атрибутами и достаточным сво- вернуть нули на место. К сожалению, многие об этом за-
бодным пространством в конце или рассредоточить X- бывают, в результате чего часть программ отказывает в
код в нескольких секциях. При этом необходимо учиты- работе.
вать, что виртуальный размер секции зачастую равен фи- Код, внедренный в конец секции, как правило, выжи-
зическому или даже превышает его. Это еще не значит, вает при упаковке или обработке файла протектором (т.к.
что свободное пространство отсутствует, – попробуйте внедренная область памяти теперь помечена как заня-
просканировать хвостовую часть секции на предмет на- тая). Исключение составляют служебные секции, такие
личия непрерывной цепочки нулей – если таковая там как секция перемещаемых элементов или секция импор-
действительно присутствует (а куда бы она делась?), ее та, сохранять которые упаковщик не обязан и вполне
можно безбоязненно использовать для внедрения. может реконструировать их, выбрасывая оттуда все «не-
Правда тут есть одно «но», почему-то не учитывае- нужное».
мое подавляющим большинством разработчиков: если Обобщенный алгоритм внедрения выглядит приблизи-
виртуальный размер секции меньше физического, заг- тельно так:
рузчик игнорирует физический размер (хотя и не обязан ! считываем PE-заголовок;
это делать) и он может быть любым, в том числе и заве- ! анализируем Section Table, сравнивая физическую
домо бессмысленным! Если виртуальный размер равен длину секций с виртуальной;
нулю, загрузчик использует в качестве него физический, ! ищем секции, у которых r_sz > v_sz, и записываем их
округляя его на величину Section Alignment. Поэтому, в кандидаты на внедрение, предварительно убедив-
если r_off + r_sz некоторой секции превышает r_off сле- шись, что в хвосте секции содержатся одни нули;
дующей секции, следует либо отказаться от обработки ! если r_sz – v_sz >= FA, не трогаем такую секцию, т.к.
такого файла, либо самостоятельно вычислить физичес- скорее всего она содержит оверлей;
кий размер на основе разницы raw offset двух соседних ! если кворума набрать не удалось, ищем секции, у ко-
секций. торых r_sz <= v_sz, и пытаемся найти непрерывную це-
Некоторые программы хранят оверлеи внутри файла почку нулей в их конце;
(да, именно внутри, а не в конце!), при этом разница фи- ! из всех кандидатов отбираем секции с наибольшим ко-
зического и виртуального размеров, как правило, ока- личеством свободного места;
зывается больше кратности физического выравнивания. ! находим секцию, атрибуты которой располагают к вне-
Такую секцию лучше не трогать, т.к. внедрение X-кода дрению (IMAGE_SCN_MEM_SHARED, IMAGE_SCN_MEM_
скорее всего приведет к неработоспособности файла. К DISCARDABLE cброшены, IMAGE_SCN_MEM_READ или
сожалению, оверлеи меньшего размера данный алгоритм IMAGE_SCN_MEM_EXECUTE установлены, IMAGE_SCN_
отловить не в состоянии, поэтому всегда проверяйте вне- CNT_CODE или IMAGE_SCN_CNT_INITIALIZED_DATA
дряемый участок на нули и отказывайтесь от внедрения, установлены), а если таких среди оставшихся канди-
если здесь расположено что-то другое. датов нет, либо корректируем атрибуты самостоятель-
Большинство разработчиков X-кода, проявляя преступ- но, либо отказываемся от внедрения;
ную небрежность, пренебрегают проверкой атрибутов ! если v_sz != 0 и v_sz < r_sz, увеличиваем v_sz на
секции, что приводит к критических ошибкам и прочим sizeof(X-code) или подтягиваем к v_a следующей сек-
серьезным проблемам. Внедряемая секция должна быть, ции.
во-первых, доступной (флаг IMAGE_SCN_MEM_READ ус-
тановлен) и, во-вторых, невыгружаемой (флаг IMAGE_ Идентификация пораженных объектов. Распознать
SCN_MEM_DISCARDABLE сброшен). Желательно, но нео- внедрения этого типа достаточно проблематично, осо-
бязательно, чтобы по крайней мере один из флагов бенно если X-код полностью помещается в первой кодо-
IMAGE_SCN_CNT_CODE, IMAGE_SCN_CNT_INITIALIZED_ вой секции файла, которой, как правило, является сек-
DATA был установлен. Если же эти условия не соблюда- ция .text.
ются и других подходящих секций нет, допустимо моди- Внедрение в секцию данных разоблачает себя нали-
фицировать флаги одной или нескольких секций вручную, чием осмысленного дизассемблерного кода в ее хвосте,
однако работоспособность подопытного приложения в но если X-код перехватывает управление хитрым обра-
этом случае уже не гарантирована. Если флаги IMAGE_ зом, дизассемблер может и не догадаться дизассембли-
SCN_MEM_SHARED и IMAGE_SCN_MEM_WRITE установ- ровать этот код и нам придется сделать это вручную, са-
лены, в такую секцию может писать кто угодно и что угод- мостоятельно отыскав точку входа. Правда, если X-код
но, а во-вторых, адрес ее загрузки может очень сильно зашифрован и расшифровщик находится вне кодовой сек-
отличаться от v_a, поскольку та же Windows 9x позволяет ции, этот прием уже не сработает.
выделять разделяемую память только во второй полови- Внедрение во все служебные секции (например, сек-
не адресного пространства. цию ресурсов или fixup) распознается по наличию в них
Поскольку при внедрении в хвост секции невозможно чужеродных элементов, которые не принадлежат никакой
отличить данные, инициализированные нулями, от неини- подструктуре данных (см. рис. 6).
циализированных данных, перед передачей управления Восстановление пораженных объектов. Чаще всего
основному коду программы X-код должен замести следы, приходится сталкиваться с тем, что программист не пре-
аккуратно подчистив все за собой. Например, скопиро- дусмотрел специальной обработки для виртуального раз-

70
программирование
мера, равного нулю, и вместо того чтобы внедриться в дется где-то хранить, иначе как потом прикажете их вос-
хвост секции, необратимо затер ее начало. Такие файлы станавливать?
восстановлению не подлежат и должны быть уничтоже- Регулярные последовательности чаще всего обнару-
ны. Реже встречается внедрение в секцию с «неудачны- живаются в ресурсах, а точнее – в bitmap и иконках. Тех-
ми» атрибутами: секцию, недоступную для чтения, или нически внедриться сюда ничего не стоит, но пользова-
DISCARDABLE-секцию. Для реанимации файла либо за- тель тут же заметит искажение иконки, чего допускать
берите у X-кода управление, либо отремонтируйте атри- ни в коем случае нельзя (даже если это и не главная икон-
буты секции. ка приложения, «Проводник» показывает остальные по
Могут также попасться файлы с неправильно «подтя- нажатию кнопки «сменить значок» в меню свойств яр-
нутым» виртуальным размером. Обычно вирусописатели лыка). Существует и другая проблема: если регулярная
устанавливают виртуальный размер внедряемой секции последовательность относится к служебным структурам
равным физическому, забывая о том, что если r_sz < v_sz, данных, анализируемых загрузчиком, то файл «упада-
то виртуальный размер следует вычислять исходя из раз- ет» еще до того, как X-код успеет восстановить эту регу-
ницы адресов виртуальных адресов текущей и последую- лярную последовательность в исходный вид. Соответ-
щей секции. К счастью, ошибки внедрения этого типа не ственно если регулярная последовательность содержит
деструктивны и исправить виртуальный размер можно в какое-то количество перемещаемых элементов или эле-
любой момент. ментов таблицы импорта, то в исходный вид ее восста-
навливать ни в коем случае нельзя, т.к. это нарушит ра-
Внедрение в регулярную последовательность байт боту загрузчика. Поэтому поиск подходящей последова-
Цепочки нулей необязательно искать в хвостах секций. тельности существенно усложняется, но отнюдь не ста-
Дался нам этот хвост, когда остальные части файла ни- новится принципиально невозможным!
чуть не хуже, а зачастую даже лучше конца! Скажем Правда, некоторые программисты исподтишка внедря-
больше, необязательно искать именно нули – для вне- ются в таблицу перемещаемых элементов, необратимо за-
дрения подходит любая регулярная последовательность тирая ее содержимое, поскольку, по их мнению, исполняе-
(например, цепочка FF FF FF… или даже FF 00 FF 00…), мым файлам она не нужна. Варвары! Хоть бы удостовери-
которую мы сможем восстановить в исходный вид пе- лись сначала, что 01.00.00.00h >= Image Base >= 40.00.00h,
ред передачей управления. Если внедряемых цепочек в противном случае таблица перемещаемых элементов
больше одной, X-коду придется как бы «размазаться» реально нужна файлу! К тому же не все файлы с расши-
по телу файла (а скорее всего так и будет). Соответ- рением EXE исполняемые. Под их личиной вполне может
ственно стартовые адреса и длины этих цепочек при- прятаться и динамическая библиотека, а динамическим

Ðèñóíîê 6. Îñìûñëåííûé ìàøèííûé êîä â õâîñòå ñåêöèè äàííûõ – ïðèçíàê âíåäðåíèÿ

№7(20), июль 2004 71


программирование
библиотекам без перемещения – никуда. Кстати говоря, после загрузки программы в память. С «сырыми» сме-
вопреки распространенному мнению, установка атрибута щениями внутри файла они вправе не совпадать. Как
IMAGE_FILE_RELOCS_STRIPPED вовсе не запрещает си- правильно вычислить относительный адрес перехода?
стеме перемещать файл, и для корректного отключения Определяем смещение команды перехода от физичес-
таблицы перемещаемых элементов необходимо обнулить кого начала секции, добавляем к нему пять байт (дли-
поле IMAGE_DIRECTORY_ENTRY_BASERELOC в DATA на команды вместе с операндом). Полученную вели-
DIRECTORY. чину складываем с виртуальным адресом секции и
Автор знаком с парой лабораторных вирусов, умело кладем полученный результат в переменную a1. За-
интегрирующих X-код в оригинальную программу и ак- тем определяем смещение следующей цепочки, отсчи-
тивно использующих строительный материал, найденный тываемое от начала той секции, к которой она принад-
в теле файла-хозяина. Основной интерес представляют лежит, и складываем его с виртуальным адресом, за-
библиотечные функции, распознанные по их сигнатуре писывая полученный результат в переменную a2. Раз-
(например, sprintf, rand), а если таковых не обнаружива- ность a2 и a1 и представляет собой операнд инструк-
ется, X-код либо ограничивает свою функциональность, ции jmp;
либо реализует их самостоятельно. В дело идут и оди- ! запоминаем начальные адреса, длины и исходное со-
ночные машинные команды, такие как CALL EBX или держимое всех цепочек в импровизированном храни-
JMP EAX. Смысл этого трюка заключается в том, что по- лище, сооруженном либо внутри PE-заголовка, либо
добное перемешивание команд X-кода с командами ос- внутри одной из цепочек. Если этого не сделать, тог-
новной программы не позволяет антивирусам делить X- да X-код не сможет извлечь свое тело из файла-хо-
код от файла. Однако данная техника еще не доведена зяина для внедрения во все последующие. Некото-
до ума и все еще находится в стадии разработки… рые разработчики вместо команды jmp используют
call, забрасывающий на вершину стека адрес возвра-
та. Как нетрудно сообразить, совокупность адресов
возврата представляет собой локализацию «хвостов»
всех используемых цепочек, а адреса «голов» хранят-
ся в операнде команды call! Извлекаем очередной
Ðèñóíîê 7. Âíåäðåíèå X-êîäà â ðåãóëÿðíûå öåïî÷êè адрес возврата, уменьшаем его на четыре и относи-
Внедрение. Алгоритм внедрения выглядит приблизи- тельный стартовый адрес следующей цепочки перед
тельно так: нами!
! сканируем файл на предмет поиска регулярных пос-
ледовательностей и отбираем среди них цепочки наи- Идентификация пораженных объектов. Внедрение
большей длины, причем сумма их длин должна не- в регулярную последовательность достаточно легко рас-
сколько превышать размеры X-кода, т.к. на каждую познать по длинной цепочке jmp или call, протянувшихся
цепочку в среднем приходится 11 байт служебных дан- через одну или несколько секций файла и зачастую
ных: четыре байта – на стартовую позицию, один байт – располагающихся в совсем несвойственных исполняемо-
на длину, один – на оригинальное содержимое и еще му коду местах, например, секции данных (см. листинг 3).
пять байт – на машинную команду перехода к другой А если X-код внедрится внутрь иконки, она начинает ха-
цепочке; рактерно «шуметь» (см. рис. 8). Хуже, если одна регуляр-
! убеждаемся, что никакая часть цепочки не принадле- ная цепочка, расположенная в кодовой секции, вмещает
жит ни одной из подструктур, перечисленных в DATA в себя весь X-код целиком – тогда для выявления внедрен-
DIRECTORY (именно подструктур, а не структур, по- ного кода приходится прибегать к его дизассемблирова-
скольку таблицы экспорта/импорта, ресурсов, переме- нию и прочим хитроумным трюкам. К счастью, такие ре-
щаемых элементов образуют многоуровневые древо- гулярные цепочки в живой природе практически не встре-
видные иерархии, произвольным образом рассеянные чаются. Во всяком случае, просканировав содержимое
по файлу, ограничиться одной лишь проверкой к при- папок WINNT и Program Files, я обнаружил лишь один та-
надлежности IMAGE_DATA_DIRECTORY.VirtualAddress кой файл, да и то деинсталлятор.
и IMAGE_DATA_DIRECTORY.Size категорически недо-
статочно); Ëèñòèíã 3. Âíåäðåíèå X-êîäà â ðåãóëÿðíûå öåïî÷êè
! проверяем атрибуты секции, которым принадлежит це- .0100A708: 9C pushfd
почка (IMAGE_SCN_MEM_SHARED, IMAGE_SCN_MEM_ .0100A709: 60 pushad
.0100A70A: E80B000000 call .00100A71A --- (1)
DISCARDABLE cброшены, IMAGE_SCN_MEM_READ .0100A70F: 64678B260000 mov esp,fs:[00000]
или IMAGE_SCN_MEM_EXECUTE установлены, IMAGE_ .0100A715: 6467FF360000 push d,fs:[00000]
.0100A71B: 646789260000 mov fs:[00000],esp
SCN_CNT_CODE или IMAGE_SCN_CNT_INITIALIZED_ .0100A721: E800000000 call .00100A726 --- (2)
DATA установлены); .0100A726: 5D pop ebp
.0100A727: 83ED23 sub ebp,023 ;"#"
! «нарезаем» X-код на дольки, добавляя в конец каж- .0100A72A: EB2B jmps .00100A757 -------- (3)
дой из них команду перехода на начало следующей,

не забывая о том, что тот jmp, который соответствует
машинному коду EBh, работает с относительными ад- .0100A757: EB0E jmps .00100A767 -------- (1)
ресами, и это те самые адреса, которые образуются …

72
программирование
.0100A767: 8BC5 mov eax,ebp Отдельный случай представляет восстановление таб-
.0100A769: EB2C jmps .00100A797 -------- (1) лицы перемещаемых элементов, необратимо разрушен-
… ных внедренным X-кодом. Если Image Base < 40.00.00h, та-
.0100A797: EB5E jmps .00100A7F7 -------- (1)
кой файл не может быть загружен под Windows 9x, если в
нем нет перемещаемых элементов. Причем поле IMAGE_
… DIRECTORY_ENTRY_BASERELOC имеет приоритет над
.0100A7F7: EB5E jmps .00100A857 -------- (1) флагом IMAGE_FILE_RELOCS_STRIPPED, и если IMAGE_

DIRECTORY_ENTRY_BASERELOC != 0, а таблица переме-
щаемых элементов содержит мусор, то попытка переме-
.0100A857: EB3E jmps .00100A897 -------- (1) щения файла приведет к непредсказуемым последстви-
… ям – от зависания до отказа в загрузке. Если это возмож-
.0100A897: EB3D jmps .00100A8D6 -------- (1)
но, перенесите поврежденный файл на Windows NT, ми-
нимальный базовый адрес загрузки которой составляет
… 1.00.00h, что позволяет ей обходиться без перемещений
.0100A8D6: EB0D jmps .00100A8E5 -------- (1) даже там, где Windows 9x уже не справляется.

X-код, не проверяющий флага IMAGE_FILE_DLL, мо-
жет внедриться и в динамические библиотеки, имеющие
.0100A8E5: 2D00200000 sub eax,000002000 ;" " расширение EXE. Вот это действительно проблема! В от-
.0100A8EA: 89857E070000 mov [ebp][00000077E],eax
.0100A8F0: 50 push eax личие от исполняемого файла, всегда загружающегося
.0100A8F1: 0500100000 add eax,000001000 ;" " первым, динамическая библиотека вынуждена подстраи-
.0100A8F6: 89857E070000 mov [ebp][00000077E],eax
.0100A8FC: 50 push eax ваться под конкретную среду самостоятельно, и без пере-
.0100A8FD: 0500100000 add eax,000001000 ;" " мещаемых элементов ей приходится очень туго, посколь-
.0100A902: EB31 jmps .00100A935 -------- (1)
ку на один и тот же адрес могут претендовать множество
библиотек. Если разрешить конфликт тасованием библио-
тек в памяти не удастся (это можно сделать утилитой
EDITBIN из SDK, запущенной с ключом /REBASE), придет-
ся восстанавливать перемещаемые элементы вручную.
Ðèñóíîê 8. Âíåäðåíèå X-êîäà â ãëàâíóþ èêîíêó ôàéëà Для быстрого отождествления всех абсолютных адресов
Восстановление пораженных объектов. Отличить можно использовать следующий алгоритм: проецируем
и отделить фрагменты X-кода от фрагментов оригиналь- файл в память, извлекаем двойное слово, присваиваем
ного файла практически нереально. Да и нужно ли? Ведь ее переменной X. Нет, X не годится, возьмем Y. Если
достаточно отобрать у него управление… К счастью, та- Y >= Image Base и Y <= (Image Base + Image Size), объяв-
ких изощренных X-кодов в дикой природе практически ляем текущий адрес кандидатом в перемещаемые эле-
не встречается, и обычно они ограниваются внедрением менты. Смещаемся на байт, извлекаем следующее двой-
в свободные с их точки зрения регулярные последова- ное слово и продолжаем действовать в том же духе, пока
тельности, которые вполне могут принадлежать буфе- не достигнем конца образа. Теперь загружаем исследуе-
рам инициализированных данных, и если X-код перед мый файл в ИДУ и анализируем каждого кандидата на
передачей управления оригинальной программе не под- «правдоподобность» – он должен представлять собой
чистит их за собой, ее поведение рискует стать совер- смещение, а не константу (отличие констант от смещений
шенно непредсказуемым (она ожидала увидеть в иници- подробно рассматривалось в «Фундаментальных основах
ализированной переменной ноль, а ей что подсунули?). хакерства» Криса Касперски). Остается лишь сформиро-
Восстановление иконок и bitmap не представляет вать таблицу перемещаемых элементов и записать ее в
большой проблемы и осуществляется тривиальной прав- файл. К сожалению, предлагаемый алгоритм чрезвычай-
кой ресурсов в любом приличном редакторе (например, но трудоемок и не слишком надежен, т.к. смещение легко
в Visual Studio). Задачу существенно упрощает тот факт, спутать с константой. Но других путей, увы, не существу-
что все иконки обычно хранятся в нескольких экземпля- ет. Останется надеяться лишь на то, что X-код окажется
рах, выполненных с различной цветовой палитрой и раз- мал и затрет не всю таблицу, а только ее часть.
решением. К тому же из всех регулярных последователь-
ностей программисты обычно выбирают для внедрения Категория A: внедрение путем сжатия
нули, соответствующие прозрачному цвету в иконках и части файла
черному в bitmap. Сама картинка остается неповрежден- Внедрение в регулярные последовательности фактичес-
ной, но окруженной мусором, который легко удаляется ки является разновидностью более общей техники вне-
ластиком. Если после удаления X-кода файл отказыва- дрения в файл путем сжатия его части, в данном слу-
ется запускаться, просто смените редактор ресурсов чае осуществляемое по алгоритму RLE. Если же исполь-
либо воспользуйтесь hiew, при минимальных навыках зовать более совершенные алгоритмы (например, Хаф-
работы с которым иконки можно править и в hex-режиме фмана или Лемпеля-Зива), то стратегия выбора подхо-
(считайте, что идете по стопам героев «Матрицы», рас- дящих частей значительно упрощается. Давайте со-
сматривающих окружающий мир через призму шестнад- жмем кодовую секцию, а на освободившееся место за-
цатеричных кодов). пишем свое тело. Легко в реализации, надежно в эксп-

№7(20), июль 2004 73


программирование
луатации! Исключение составляют, пожалуй, одни лишь ! сжимаем секцию и размещаем X-код либо в начале
упакованные файлы, которые уже не ужмешь, хотя… секции, либо в ее конце;
много ли X-коду нужно пространства? А секция кода ! анализируем таблицу перемещаемых элементов и от-
упакованного файла по-любому должна содержать упа- бираем оттуда все элементы, относящиеся к сжатой ча-
ковщик, хорошо поддающийся сжатию. Собственно го- сти секции, и размещаем их внутри X-кода, а на осво-
воря, разрабатывать свой компрессор совершенно нео- бодившиеся места записываем IMAGE_REL_BASED_
бязательно, т.к. соответствующий функционал реали- ABSOLUTE – своеобразный аналог команды NOP для
зован и в самой ОС (популярная библиотека lz32.dll для перемещаемых элементов.
наших целей непригодна, поскольку работает исключи-
тельно на распаковку, однако в распоряжении X-кода Идентификация пораженных объектов. Распознать
имеются и другие упаковщики: аудио-/видео-кодеки, факт внедрения в файл путем сжатия части секции труд-
экспортеры графических форматов, сетевые функции но, но все-таки возможно. Дизассемблирование сжатой
сжатия и т. д.). секции обнаруживает некоторое количество бессмыслен-
Естественно, упаковка оригинального содержимого ного мусора, настораживающего опытного исследовате-
секции (или ее части) не обходится без проблем. Во- ля, но зачастую ускользающего от новичка. Разумеется,
первых, следует убедиться, что секция вообще подда- речь не идет о внедрении в секцию данных – присутствие
ется сжатию. Во-вторых, предотвратить сжатие ресур- постороннего кода в которой не заметит только слепой
сов, таблиц экспорта/импорта и другой служебной ин- (однако если X-код перехватывает управление косвен-
формации, которая может присутствовать в любой под- ным образом, он не будет дизассемблированной ИДОЙ
ходящей секции файла и кодовой секции в том числе. и может прикинуться овечкой невинного массива дан-
В-третьих, перестроить таблицу перемещаемых элемен- ных).
тов (если, конечно, она вообще есть), исключая из нее Обратите внимание на раскладку страничного имид-
элементы, принадлежащие сжимаемой секции и пору- жа. Если виртуальные размеры большинства секций мно-
чая настройку перемещаемых адресов непосредствен- го больше физических, файл, по всей видимости, сжат
но самому X-коду. каким-либо упаковщиком. В несколько меньшей степе-
Возникают проблемы и при распаковке. Она должна ни это характерно для протекторов, вирусы же практи-
осуществляться на предельной скорости, иначе время заг- чески никогда не уменьшают физического размера сек-
рузки файла значительно возрастет и пользователь тут ций, т.к. для этого им пришлось бы перестраивать всю
же почует что-то неладное. Поэтому обычно сжимают не структуру заражаемого файла целиком, что не входит в
всю секцию целиком, а только ее часть, выбрав места с их планы.
наибольшей степенью сжатия. Страницы кодовой секции Восстановление пораженных объектов. Типичная
от записи защищены, и попытка их непосредственной мо- ошибка большинства разработчиков – отсутствие про-
дификации вызывает исключение. Можно, конечно, при верки на принадлежность сжимаемой секции служебным
внедрении X-кода присвоить кодовой секции атрибут структурам (или некорректно выполненная проверка). В
IMAGE_SCN_MEM_WRITE, но красивым это решение ни- большинстве случаев ситуация обратима, достаточно об-
как не назовешь: оно демаскирует X-код и снижает на- нулив все поля DATA DIRECTORY загрузить файл в ди-
дежность программы. Это все равно что сорвать с котла зассемблер, реконструировать алгоритм распаковщика
аварийный клапан – так и до взрыва недалеко. Лучше (и и написать свой собственный, реализованный на любом
правильнее!) динамически присвоить атрибут PAGE_ симпатичном вам языке (например, ИДА-Си, тогда для
READWRITE вызовом VirtualProtect, а после завершения восстановления файла даже не придется выходить из
распаковки возвратить атрибуты на место. ИДЫ).
Если же файл запускается вполне нормально, то для
удаления X-кода достаточно немного потрассировать
его в отладчике, дождавшись момента передачи управ-
ления оригинальной программе, и немедленно сбросить
дамп.

Категория A: создание нового NTFS-потока


Ðèñóíîê 9. Âíåäðåíèå X-êîäà ïóòåì ñæàòèÿ ñåêöèè внутри файла
Внедрение. Обобщенный алгоритм внедрения выгля- Файловая система NTFS поддерживает множество по-
дит так: токов в рамках одного файла, иначе называемых рас-
! открываем файл, считываем PE-заголовок; ширенными атрибутами (Extended Attributes) или имено-
! находим в таблице секций секцию с атрибутом IMAGE_ ванными разделами. Безымянный атрибут соответству-
SCN_CNT_CODE (как правило, это первая секция фай- ет основному телу файла, атрибут $DATE – времени со-
ла); здания файла и т. д. Вы также можете создавать и свои
! убеждаемся, что эта секция пригодна для внедрения атрибуты практически неограниченной длины (точнее, до
(она сжимается, не содержит в себе никаких служеб- 64 Кб), размещая в них всякую всячину (например, X-
ных таблиц, используемых загрузчиком, и не имеет код). Аналогичную технику использует и Mac OS, только
атрибута IMAGE_SCN_MEM_DISCARDABLE); там потоки именуются труднопереводимым словом forks.

74
программирование
Подробнее об этом можно прочитать в «Основах Windows рое может осуществляться как непосредственным импор-
NT и NTFS» Хелен Кастер, «Недокументированных воз- том из NTDLL.DLL, так и прямым вызовом:
можностях Windows NT» А.В.Коберниченко и «Windows
NT File System Internals» Rajeev Nagar. INT 2Eh.EAX=067h/INT 2Eh.EAX = 9Ch
Сильной стороной этого алгоритма является высочай-
шая степень его скрытности, т.к. видимый объем файла а в Windows XP еще и машинной командой syscall. Воз-
при этом не увеличивается (под размером файла систе- можен также вызов по прямым адресам NTDLL.DLL или
ма понимает отнюдь не занимаемое им пространство, а динамический поиск экспортируемых функций в памяти.
размер основного потока), однако список достоинств на Восстановление пораженных объектов. Если пос-
этом и заканчивается. Теперь поговорим о недостатках. ле обработки упаковщиком/архиватором или иных внеш-
При перемещении файла на не NTFS-раздел (например, не безобидных действий файл неожиданно отказал в ра-
дискету, zip или CD-R/RW) все рукотворные потоки бес- боте, одним из возможных объяснений является гибель
следно исчезают. То же самое происходит при копиро- расширенных атрибутов. При условии, что потоки не ис-
вании файла из оболочки наподобие Total Commander (в пользовались для хранения оригинального содержимо-
девичестве Windows Commander) или обработке архива- го файла, у нас неплохие шансы на восстановление.
тором. К тому же полноценная поддержка NTFS есть Просто загрузите файл в дизассемблер и, проанализи-
только в Windows NT. ровав работу X-кода, примите необходимые меры про-
Внедрение. Ввиду хрупкости расширенных атрибу- тиводействия. Более точной рекомендации дать, увы, не
тов X-код необходимо проектировать так, чтобы пора- получается, поскольку такая тактика внедрения суще-
женная программа сохраняла свою работоспособность ствует лишь теоретически и своего боевого крещения
даже при утрате всех дополнительных потоков. Для это- еще не получила.
го в свободное место подопытной программы (например, Для удаления ненужных потоков можно воспользовать-
в PE-заголовок) внедряют крошечный загрузчик, кото- ся уже описанной функцией NtSetEaFile.
рый считывает свое продолжение из NTFS-потока, а если
его там не окажется, передает управление программе- Категория B: раздвижка заголовка
носителю. Никакой уважающий себя X-код не захочет зависеть от
Функции работы с потоками недокументированы и до- наличия свободного места в подопытном файле, посколь-
ступны только через Native-API. Это NtCreateFile, NtQuery ку это унизительно и вообще не по-хакерски.
EaFile и NtSetEaFile, описание которых можно найти, в Когда пространства, имеющегося в PE-заголовке (или
частности, в книге «The Undocumented Functions Microsoft какой-либо другой части файла) оказывается недостаточ-
Windows NT/2000» Tomasz Nowak, электронная копия ко- но для размещения всего X-кода целиком, мы можем по-
торой может быть бесплатно скачана с сервера NTinterl- пробовать растянуть заголовок на величину, выбранную
nals.net. по своему усмотрению. До тех пор, пока SizeOf Headers
Создание нового потока осуществляется вызовом фун- не превышает физического смещения первой секции, та-
кции NtCreateFile, среди прочих аргументов принимающий кая операция осуществляется элементарно (см. «Внедре-
указатель на структуру FILE_FULL_EA_INFORMATION, пе- ние в PE-заголовок»), но вот дальше начинаются пробле-
редаваемый через EaBuffer. Вот она-то нам и нужна! Как мы, для решения которых приходится кардинально пере-
вариант можно воспользоваться функцией NtSetEaFile, пе- страивать структуру подопытного файла. Как минимум не-
редав ей дескриптор, возвращенный NtCreateFile, откры- обходимо увеличить raw offset всех секций на величину,
вающей файл обычным образом. Перечислением (и чте- кратную принятой степени выравнивания, прописанной в
нием) всех имеющихся потоков занимается функция поле File Alignment, и физически переместить хвост фай-
NtQueryEaFile. Прототипы всех функций и определения ла, записав X-код на освободившееся место.
структур содержатся в файле NTDDK.H, в котором при- Максимальный размер заголовка равен виртуально-
сутствует достаточное количество комментариев, чтобы му адресу первой секции, что и неудивительно, т.к. заго-
со всем этим хозяйством разобраться, однако до тех пор, ловок не может перекрываться с содержимым странич-
пока Windows 9x не будет полностью вытеснена с рынка, ного имиджа. Учитывая, что минимальный виртуальный
подобная техника внедрения, судя по всему, останется не- адрес составляет 1000h, а типичный размер заголовка –
востребованной. 300h, мы получаем в свое распоряжение порядка 3 Кб
Идентификация пораженных объектов. По непонят- свободного пространства, достаточного для размещения
ным маркетинговым соображениям штатные средства практически любого X-кода.
Windows не позволяют просматривать расширенные ат- В крайнем случае можно поместить оставшуюся часть
рибуты файлов, мне также неизвестна ни одна утилита в оверлей. Хитрость заключается в том, что системный
сторонних производителей, способная справиться с этой загрузчик загружает лишь первые SizeOfHeaders байт
задачей, поэтому необходимый минимум программного заголовка, а остальные (при условии, что они есть) остав-
обеспечения приходится разрабатывать самостоятельно. ляет в оверлее. Мы можем сдвинуть raw offset всех сек-
Наличие посторонних потоков внутри файла однозначно ций хоть на мегабайт, внедрив мегабайт X-кода в заголо-
свидетельствует о его зараженности. вок, но в память будет загружено только SizeOf Headers
Другой, не менее красноречивый признак внедрения, – байт, а о загрузке остальных X-код должен позаботиться
обращение к функциям NtQueryEaFile/NtSetEaFile, кото- самостоятельно.

№7(20), июль 2004 75


программирование
К сожалению, одной лишь коррекции raw offset для ! увеличиваем поле SizeOfHeaders на заданную ве-
сохранения файлу работоспособности может оказаться личину;
недостаточно, поскольку многие служебные структуры ! иначе:
(например, таблица отладочной информации) привязыва- ! вставляем между концом заголовка и началом стра-
ются к своему физическому местоположению, которое пос- ничного имиджа ALIGN_UP((sizeof(X-code) + SizeOf
ле раздвижки заголовка неизбежно отнесет в сторону. Headers – FS.r_off), FA) байт, физически перемещая
Правила этикета требуют либо скорректировать все ссыл- хвост файла; при загрузке файла системный загруз-
ки на абсолютные физические адреса (а для этого мы чик спроецирует только первые FS.v_a – SizeOf
должны знать формат всех корректируемых структур, сре- Headers байт X-кода, а все последующие ему при-
ди которых есть полностью или частично недокументиро- дется считывать самостоятельно;
ванные – взять хотя бы ту же отладочную информацию), ! SizeOfHeaders := FS.v_a;
либо отказаться от внедрения, если один или несколько ! увеличиваем raw offset всех секций на величину физи-
элементов таблицы DATA DIRECTORY содержат нестан- ческой раздвижки файла;
дартные структуры (ресурсы, таблицы экспорта, импорта ! корректируем все структуры, привязывающие к физи-
и перемещаемых элементов используют только виртуаль- ческим смещениям внутри файла, перечисленные в
ную адресацию, поэтому ни в какой дополнительной кор- DATA DIRECTORY.
ректировке не нуждаются). Следует также убедиться и в
отсутствии оверлеев, поскольку многие из них адресуют- Идентификация пораженных объектов. Данный ме-
ся относительно начала файла. Проблема в том, что мы тод внедрения распознается аналогично обычному мето-
не можем надежно отличить настоящий оверлей от мусо- ду внедрения в PE-заголовок (см. «Внедрение в PE-заго-
ра, оставленного линкером в конце файла, и потому при- ловок») и по соображениям экономии места здесь не дуб-
ходится идти на неоправданно спекулятивные допущения, лируется.
что все, что занимает меньше одного сектора, – не овер- Восстановление пораженных объектов. При растяжке
лей. Или же различимыми эвристическими методами пы- заголовка с последующим перемещением физического со-
таться идентифицировать мусор. держимого всех секций и оверлеев вероятность нарушения
работоспособности файла весьма велика, а причины ее сле-
дующие: неверная коррекция raw offset и привязка к физи-
ческим адресам. Ну против неверной коррекции, вызванной
грубыми алгоритмическими ошибками, не пойдешь, и с ис-
порченным файлом скорее всего придется расстаться (но
все-таки попытайтесь, отталкиваясь от виртуальных разме-
ров/адресов секций, определить их физические адреса или
идентифицируйте границы секций визуальными методами,
благо они достаточно характерны), а вот преодолеть при-
вязку к физическим адресам можно! Проще всего это сде-
Ðèñóíîê 10. Ïîäîïûòíûé ôàéë è åãî ïðîåêöèÿ â ïàìÿòü лать, вернув содержимое секций/оверлеев на старое место.
äî è ïîñëå âíåäðåíèÿ X-êîäà ïóòåì ðàçäâèæêè çàãîëîâêà Последовательно сокращая размер заголовка на величину
Внедрение. Типичный алгоритм внедрения выглядит так: File Alignment и физически подтягивая секции на освободив-
! считываем PE-заголовок; шиеся место, добейтесь его работоспособности. Ну а если
! проверяем DATA DIRECTORY на предмет присутствия не получится, значит, причина в чем-то еще.
структур, привязывающихся к своему физическому
смещению, и, если таковые обнаруживаются, либо от- Категория B: сброс части секции в оверлей
казываемся от внедрения, либо готовимся их скоррек- Вместо того чтобы полностью или частично сжимать сек-
тировать; цию, можно ограничиться переносом ее содержимого в
! если SizeOfHeaders = FS.v_a, отказываемся от внедре- оверлей, расположенный в конце, середине или начале
ния, т.к. внедряться уже некуда; файла. Дописаться в конец файла проще всего. Ника-
! если SizeOfHeaders != FS.r_off первой секции, подопыт- кие поля PE-заголовка при этом корректировать не
ный файл содержит оверлей и после внедрения может надо – просто копируем sizeof(X-code) байт любой части
оказаться неработоспособным, однако, если от Size секции в конец файла, а на освободившееся место вне-
OfHeders до raw offset содержатся одни нули, внедрять- дряем X-код, который перед передачей управления про-
ся сюда все-таки можно; грамме-носителю считывает его с диска, возвращая на
! если sizeof(X-code) <= FS.r_off, переходим к главе «вне- исходное место.
дрение в PE-заголовок»; Сложнее разместить оверлей в середине файла, на-
! если sizeof(X-code) <= FS.v_a, то: пример, расположив его между секциями кода и данных,
! вставляем между концом заголовка и началом стра- что обеспечит ему высокую степень скрытности. Для это-
ничного имиджа ALIGN_UP((sizeof(X-code) + Size го будет необходимо увеличить raw offset всех последу-
OfHeaders – FS.r_off), FA) байт, физически переме- ющих секций на величину ALIGN_UP(sizeof(X-code), FA),
щая хвост файла; при загрузке файла весь X-код физически сдвинув секции внутри файла. Аналогичным
будет спроецирован в память; образом осуществляется и создание оверлея в заголов-

76
программирование
ке, о котором мы уже говорили (см. «раздвижка заго- ! при желании находим первый пролог и последний эпи-
ловка»). лог внутри выбранных частей секции, чтобы линия «от-
При обработке файла упаковщиков оверлеи (особенно реза» не разорвала функцию напополам (это не нару-
серединные) обычно гибнут, но даже если и выживают, то шит работоспособности файла, но сделает факт вне-
оказываются расположенными совершенно по другим фи- дрения более заметным);
зическим смещениям, поэтому X-код при поиске оверлея ! если мы хотим создать оверлей внутри файла, то:
ни в коем случае не должен жестко привязываться к его ! увеличиваем raw offset всех последующих секций на
адресам, вычисляя их на основе физического адреса сле- величину ALIGN_UP(sizeof(X-code), FA);
дующей секции. Пусть длина оверлея составляет OX байт, ! физически сдвигаем все последующие секции в
тогда его смещение будет равно: NS.r_off – OX, а для пос- файле на эту же величину;
леднего оверлея файла: SizeOfFile – OX. Оверлеи в заго- ! перемещаем выбранные части секции в оверлей, за-
ловках намного более выносливы, но при упаковке UPX писывая их в произвольном формате, но так, чтобы
гибнут и они. сами потом смогли разобраться;
! иначе:
! дописываем выбранные части секции в конец фай-
ла, записывая их в произвольном формате, но так,
чтобы сами потом смогли разобраться;
! на освободившееся место записываем X-код.

Идентификация пораженных объектов. Дизассембли-


рование таких файлов не выявляет ничего необычного: X-
код расположен в секции кода, там, где и положено всякому
нормальному коду быть. Никакого подозрительного мусора
Ðèñóíîê 11. Âíåäðåíèå X-êîäà â ôàéë ïóòåì ñáðîñà ÷àñòè ñåêöèè также не наблюдается. Правда, обнаруживается некоторое
â îâåðëåé количество перекрестных ссылок, ведущих в середину фун-
Внедрение. Обобщенный алгоритм внедрения выгля- кций (и эти функции, как нетрудно догадаться, принадлежат
дит так: X-коду, даже если он и обрежет выдираемые фрагменты
! считываем PE-заголовок и приступаем к его анализу; секций по границам функций, смещения функций X-кода
! если DATA DIRECTORY содержит ссылку на структу- внутри каждого из фрагментов будут отличаться от ориги-
ру, привязывающуюся к физическим смещениям, либо нальных, вырезать каждую функцию по отдельности не пред-
готовимся скорректировать ее надлежащим образом, лагать – это слишком нудно), однако такое нередко случает-
либо отказываемся от внедрения; ся и с заведомо не зараженными файлами, поэтому основа-
! если LS.r_off + LS.r_sz > SizeOfFile, файл скорее всего ний для возбуждения уголовного дела как будто бы нет. При-
содержит оверлей, и лучше отказаться от внедрения; сутствие серединного оверлея легко распознать по несоот-
! если физический размер какой-либо секции превыша- ветствию физических и виртуальных адресов, чего не на-
ет виртуальный на величину большую или равную блюдается практически ни у одного нормального файла,
File Alignment, файл скорее всего содержит середин- однако наличие оверлея в конце файла – это нормально.
ный оверлей, и настоятельно рекомендуется отказать- Ничего другого не остается, как анализировать весь
ся от внедрения; X-код целиком, и если манипуляции с восстановлением
! выбираем секцию, подходящую для внедрения секции будут обнаружены – факт внедрения окажется ра-
(IMAGE_SCN_MEM_SHARED, IMAGE_SCN_MEM_DIS зоблачен. X-код выдает себя вызовом функций Virtual
CARDABLE cброшены, IMAGE_SCN_MEM_READ или Protect (присвоение атрибута записи) и GetCommandLine,
IMAGE_SCN_MEM_EXECUTE установлены, IMAGE_SCN_ GetModuleBaseName, GetModuleFullName или GetModule
CNT_CODE или IMAGE_SCN_CNT_INITIALIZED_DATA FullNameEx (определение имени файла-носителя). Убеди-
установлены); которой, как правило, является первая тесь также, что кодовая секция доступна только лишь на
секция файла; чтение, в противном случае шансы на присутствие X-кода
! физическое смещение начала секции в файле равно существенно возрастут (и ему уже будет не нужно выз-
ее raw offset (это надежное поле, и ему можно верить); вать VirtualProtect).
! физическое смещение конца секции в файле вычис- Восстановление пораженных объектов. Обычно при-
ляется более сложным образом: min(CS.raw offset + ходится сталкиваться с двумя алгоритмическими ошибка-
ALIGN_DOWN(CS.r_sz, FA), NS.raw_off); ми, допущенными разработчиками внедряемого кода: кор-
! находим часть секции, не содержащую подструктур ректной проверкой на пересечение сбрасываемой части
служебных таблиц PE-файла, таких, например, как таб- секции со служебными данными и внедрение в секцию с
лицы импорта/экспорта; неподходящими атрибутами. Обе полностью обратимы.
! в выбранной части (частях) секции находим один или Реже встречаются ошибки определения длины сбра-
несколько регионов, свободных от перемещаемых эле- сываемой секции: если CS.v_sz < CS.r_sz и CS.r_off +
ментов, а если это невозможно, выбираем эти элемен- CS.raw_sz > NS.raw_off, то системный загрузчик загружа-
ты из fixup table для последующей обработки X-кодом ет лишь CS.v_sz байт секции, а внедряемый код сбрасы-
вручную; вает CS.r_sz байт секции, захватывая кусочек следующей

№7(20), июль 2004 77


программирование
секции, не учитывая, что она может проецироваться со- называемый «стандартным способом внедрения»), одна-
вершенно по другим адресам и при восстановлении ори- ко его тактико-технические характеристики оставляют же-
гинального содержимого сбрасываемой секции, кусочек лать лучшего: он чрезвычайно конфликтен, слишком за-
секции так и не будет восстановлен. Хуже того, X-код ока- метен и реально применим лишь к некоторым PE-файлам,
жется как бы разорван двумя секциями напополам, и эти отвечающим всем предъявляемым к ним требованиям
половинки могут находиться как угодно далеко друг от дру- (зато он хорошо, безболезненно переносит упаковку и
га! Естественно, работать после этого он не сможет. обработку протекторами).
Если же пораженный файл запускается нормально, для На первый взгляд идея не встречает никаких препят-
удаления X-кода просто немного потрассируйте его и, дож- ствий: дописываем X-код в хвост последней секции, уве-
давшись момента передачи управления основной про- личиваем размер страничного имиджа на соответствую-
грамме, снимите дамп. щую величину, не забывая о ее выравнивании и переда-
ем на X-код управление. Никаких дополнительных пере-
Категория B: создание своего движений одних секций относительно других осуществ-
собственного оверлея лять не нужно, а значит, не нужно корректировать и их
Оверлей может хранить не только оригинальное содержи- raw offset. Проблема конфликтов со служебными структу-
мое секции, но и X-код! Правда, полностью вынести весь X- рами PE-файла также отпадает, и нам нечего опасаться,
код в оверлей не удастся – как ни крути, но хотя бы крохот- что X-код перезапишет данные, принадлежащие таблице
ный загрузчик в основное тело все-таки придется внедрить, импорта или, например, ресурсам.
расположив его в заголовке, предхвостии, регулярной пос- Но стоит только снять розовые очки и заглянуть в гла-
ледовательности или других свободных частях файла. за реальности, как проблемы попрут изо всех щелей. А
Достоинства этого механизма в простоте его реализа- что, если конец последней секции не совпадает с концом
ции, надежности, неконфликтности и т. д. Теперь уже не файла? Может же там оказаться оверлей или просто му-
требуется анализировать служебные подструктуры на сор, оставленный линкером? А что, если последней сек-
предмет их пересечения со сбрасываемой частью секции цией файла является секция неинициализированных дан-
(мы ничего не сбрасываем!), и если случится так, что овер- ных или DISCARDABLE-секция, которая в любой момент
лей погибнет, загрузчик просто передаст управление ос- может быть выгружена из файла?
новной программе без нарушения ее работоспособности. Внедряться в последнюю секцию файла не только тех-
Располагать оверлей следует либо в конце файла, либо нически неправильно, но и политически некорректно. Тем
в его заголовке. Хоть это и будет более заметно, шансы не менее и этот способ имеет право на существование,
выжить при упаковке у него значительно возрастут. поэтому рассмотрим его поподробнее.
Внедрение. Алгоритм внедрения полностью идентичен
предыдущему за тем лишь исключением, что в оверлей
сбрасывается не часть секции файла-хозяина, а непосред-
ственно сам X-код, обрабатываемый специальным загруз-
чиком. Внедрение загрузчика обычно осуществляется по
категории А (см. «Внедрение в пустое место файла»), хотя
в принципе можно использовать и другие категории.
Идентификация пораженных объектов. Внедрения
этого типа легко распознаются визуально по наличию заг-
рузчика, как правило, внедренного по категории А и при-
сутствию сверления в начале, конце или середине файла.
Восстановление пораженных объектов. Если X-код Ðèñóíîê 12. Âíåäðåíèå X-êîäà â ôàéë ïóòåì ðàñøèðåíèÿ
спроектирован корректно, для его удаления достаточно ïîñëåäíåé ñåêöèè
убить оверлей (например, упаковав программу ASPack со Внедрение. Если физический размер последней секции,
сброшенной галочкой «сохранять оверлеи»). Методика будучи выровненным на величину File Alignment, не «дотя-
удаления загрузчика, внедренного по категории А, уже гивается» до физического конца файла, значит, X-код дол-
была описана выше, так что не будем повторяться. жен либо отказаться от внедрения, либо пристегивать свое
тело не к концу секции, а к концу файла. Разница не принци-
Категория C: расширение последней пиальна за исключением того, что оверлей теперь придется
секции файла загружать в память, увеличивая как время загрузки, так и
Идея расширения последней секции файла не нова и сво- количество потребляемых ресурсов. Внедряться же между
ими корнями уходит глубоко в историю, возвращая нас во концом секции и началом оверлея категорически недопус-
времена господства операционной системы MS-DOS и тимо, т.к. оверлеи чаще всего адресуются относительно на-
файлов типа OLD-EXE (помните историю с фальшивыми чала файла (хотя могут адресоваться и относительно конца
монетами, на которых было отчеканено 2000 г. до н. э.? последней секции). Другая тонкость связана с пересчетом
Древние не знали, что они живут до нашей эры! OLD-EXE виртуального размера секции – если он больше физическо-
тогда еще не были OLD). го (как чаще всего и случается), то он уже включает в себя
Это наиболее очевидный и наиболее популярный ал- какую-то часть оверлея, поэтому алгоритм вычисления но-
горитм из всех алгоритмов внедрения вообще (часто даже вого размера существенно усложняется.

78
программирование
С атрибутами секций дела обстоят еще хуже. Секции ческие ошибки, совершенные ими непростительны и тре-
неинициализированных данных вообще не обязаны заг- буют сурового наказания, ну или по крайней мере обще-
ружаться с диска (хотя 9x/NT их все-таки загружают), а ственного порицания.
служебные секции (например, секция перемещаемых Чаще всего встречаются ошибки трех типов: неверное
элементов) реально востребованы системой лишь на определение позиции конца файла, отсутствие выравни-
этапе загрузки PE-файла, активны только на стадии заг- вания и неподходящие атрибуты секции, причем большая
рузки, а дальнейшее их пребывание в памяти негаран- часть из них необратима, и пораженные файлы восста-
тированно, и X-код запросто может схлопотать исключе- новлению не подлежат.
ние еще до того, как успеет передать управление основ- Начнем с того, что LS.r_off + LS.r_sz не всегда совпа-
ной программе. Конечно, X-код может скорректировать дает с концом файла, и если файл содержит оверлей, он
атрибуты последней секции по своему усмотрению, но будет безжалостно уничтожен. Если LS.v_sz < LS.r_sz, то
это ухудшит производительность системы, и будет слиш- r_sz может беспрепятственно вылетать за пределы фай-
ком заметно. Если физический размер последней сек- ла, и разработчик X-кода должен это учитывать, в про-
ции равен нулю, что характерно для секций неинициали- тивном случае в конце последней секции образуется каша.
зированных данных, лучше ее пропустить, внедрившись Очень часто встречается и такая ошибка: вместо того
в предпоследнюю секцию. чтобы подтянуть LS.r_sz к концу X-кода, программист уве-
Типичный алгоритм внедрения выглядит так: личивает LS.r_sz на размер X-кода, и, если конец после-
! загружаем PE-заголовок и анализируем атрибуты пос- дней секции не совпадал с концом оригинального файла,
ледней секции; X-код неожиданно для себя окажется в оверлее! К счас-
! если флаг IMAGE_SCN_MEM_SHARED установлен, от- тью, этой беде легко помочь – просто скорректируйте поле
казываемся от внедрения; LS.r_sz, установив его на действительный конец файла.
! если флаг IMAGE_SCN_MEM_DISCARDABLE установ- Нередко приходится сталкиваться и с ошибками кор-
лен, либо отказываемся от внедрения, либо самостоя- рекции виртуальных размеров. Как уже говорилось, уве-
тельно сбрасываем его; личивать LS.v_sz на размер X-кода нужно лишь тогда, ког-
! если флаг IMAGE_SCN_CNT_UNINITIALIZED_DATA ус- да LS.v_sz <= LS.r_sz, в противном случае виртуальный
тановлен, лучше всего отказаться от внедрения; образ уже содержит часть кода или даже весь X-код це-
! если ALIGN_UP(LS.r_sz, FA) + LS.r_a > SizeOfFile, файл ликом. Если LS.v_sz != 0, такая ошибка практически ни-
содержит оверлей, лучше отказаться от внедрения; как не проявляет себя, всего лишь увеличивая количество
! если LS.v_sz > LS.r_rz, хвост секции содержит данные памяти, выделенной процессору, но если LS.v_sz == 0,
инициализированные нулями, и следует либо отказать- после внедрения он окажется равным… размеру X-кода,
ся от внедрения, либо перед передачей управления который много меньше размера всей секции, в результа-
подчистить все за собой; те чего ее продолжение не будет загружено, и файл отка-
! дописываем X-код к концу файла; жет в работе. Для возращения его в строй просто обнули-
! устанавливаем LS.r_sz на SizeOfFile – LS.r_off; те поле LS.v_sz или вычислите его истинное значение.
! если LS.v_sz >= (LS.r_a + LS.r_sz + (SizeOfFile – (LS.r_a + После изменения виртуальных размеров секции тре-
ALIGN_UP(LS.r_sz, FA))), оставляем LS.v_sz без изме- буется пересчитать Image Size, что многие программисты
нений; иначе LS.v_sz := 0; делают неправильно, либо просто суммируя виртуальные
! если LS.v_sz != 0 пересчитываем Image Size; размеры всех секций, либо увеличивая его на размер вне-
! при необходимости корректируем атрибуты внедряе- дряемого кода, либо забывая округлить полученный ре-
мой секции: сбрасываем атрибут IMAGE_SCN_MEM_ зультат на границу 64 Кб, либо допуская другие ошибки.
DISCARDABLE, и присваиваем атрибут IMAGE_SCN_ Правильный алгоритм вычисления Image Size выглядит
MEM_READ; так: LS.v_a + ALIGN_UP((LS.v_s)? LS.v_s:LS.r_sz, OA).
! пересчитываем Image Size. Самый безобидный баг – неудачные атрибуты расши-
ряемой секции, например, внедрение в DISCARDABLE-
Идентификация пораженных объектов. Внедрения секцию, которой, в частности, является секция переме-
этого типа идентифицировать проще всего – они выдают щаемых элементов, обычно располагающася в конце фай-
себя присутствием кода в последней секции файла, кото- ла. Коррекция атрибутов должна решить эту проблему.
рой обычно является либо секция неинициализированных Для удаления X-кода из файла просто отберите у него
данных, либо секция ресурсов, либо служебная секция, управление, отрежьте sizeof(X-code) байт от конца после-
например, секция импорта/экспорта или перемещаемых дней секции и пересчитайте значения полей: Image Base,
элементов. LS.r_sz и LS.r_off.
Если исходный файл содержал оверлей (или мусор,
оставленный линкером), он неизбежно перекрывается Категория C: создание своей
последней секцией. собственной секции
Восстановление пораженных объектов. Любовь на- Альтернативой расширению последней секции файла ста-
чинающих программистов к расширению последней сек- ло создание своей собственной секции, что не только
ции файла вполне объяснима (более или менее подроб- «модно», но и технически более грамотно. Теперь, по край-
ное описание этого способа внедрения можно найти прак- ней мере, ни оверлеи, ни таблицы перемещаемых элемен-
тически в любом вирусном журнале), но вот алгоритми- тов не будут понапрасну болтаться в памяти.

№7(20), июль 2004 79


программирование
в конец кодовой секции, которой в подавляющем боль-
шинстве случаев является первая секция файла. Этот
алгоритм наследует все лучшие черты создания оверлея
в середине, многократно усиливая их: внедренный X-код
принадлежит страничному имиджу, оверлея нет, поэтому
нет и конфликтов с протекторами/упаковщиками.
Внедрение в начало. Внедрение в начало кодовой сек-
ции можно осуществить двояко: либо сдвинуть кодовую
секцию вместе со всеми последующими за ней секциями
вправо, физически переместив ее в файле, скорректиро-
вав все ссылки на абсолютные адреса в страничном имид-
Ðèñóíîê 13. Âíåäðåíèå X-êîäà â ôàéë ïóòåì ñîçäàíèÿ же, либо уменьшить v_a и r_off кодовой секции на одну и
ñîáñòâåííîé ñåêöèè ту же величину, заполняя освободившееся место X-кодом,
Внедрение. Обобщенный алгоритм выглядит так: тогда ни физические, ни виртуальные ссылки корректи-
! загружаем PE-заголовок и смотрим, что расположено ровать не придется, т.к. секция будет спроецирована в
за таблицей секций; память по прежним адресам.
! если здесь не нули, отказываемся от внедрения; Легко показать, что перемещение кодовой секции при
! если (e_lfanew + SizeOfOptionalHeader + 14h + (Number внедрении X-кода в ее начало осуществляется аналогич-
OfSections + 1)*40) > SizeOfHeaders, раздвигаем заголо- но перемещению секции данных при внедрении кода в
вок, как показано в разделе «Внедрение в PE-заголовок», конец и поэтому во избежание никому не нужного дубли-
а если это невозможно, отказываемся от заражения; рования описывается в одноименном разделе (см. «Вне-
! дописываем X-код к концу файла; дрение в конец»), здесь же мы сосредоточимся на запад-
! увеличиваем NumberOfSections на единицу; ной границе кодовой секции и технических аспектах ее
! выравниваем LS.r_sz на величину FA; отодвижения вглубь заголовка.
! дописываем к таблице секций еще один элемент, за- Собственно говоря, вся проблема в том, что подавля-
полняя поля следующим образом: ющее большинство кодовых секций начинается с адреса
! имя: не имеет значения; 1000h, – минимально допустимого адреса, диктуемого
! v_a: LS.v_a + ALIGN_UP( (LS.v_sz)? LS.v_sz: LS.r_sz), выбранной кратностью выравнивания OA, так что отсту-
Section Alignment); пать уже некуда – заголовок за нами. Здесь можно посту-
! r_offset: SizeOfFile; пить двояко: либо уменьшить базовый адрес загрузки на
! v_sz: sizeof(X-code) или 0x0; величину, кратную 64 Кб, и скорректировать все ссылки
! r_sz: sizeof(X-code); на RVA-адреса (что утомительно, да и базовый адрес заг-
! Charic.: IMAGE_SCN_CNT_CODE | IMAGE_SCN_MEM_ рузки подавляющего большинства файлов – это мини-
EXECUTE; мальный адрес, поддерживаемый Windows 9x), либо от-
! остальные: 0x0; ключить выравнивание в файле, отодвинув границу на
! пересчитываем Image Size. любое количество байт, кратное двум (но тогда файл не
будет запускаться под Windows 9x).
Идентификация пораженных объектов. Внедрения Типовой алгоритм внедрения путем уменьшения базо-
этого типа легко распознаются по наличию кодовой сек- вого адреса загрузки выглядит так:
ции в конце файла (стандартно кодовая секция всегда идет ! считываем PE-заголовок;
первой). ! если Image Base < 1.00.00h и перемещаемых элемен-
Восстановление пораженных объектов. Ошибочное тов нет, отказываемся от внедрения;
определение смещения внедряемой секции обычно при- ! если Image Base <= 40.00.00h и перемещаемых эле-
водит к полной неработоспособности файла без малей- ментов нет, лучше отказаться от внедрения, т.к. файл
ших надежд на его восстановление (подробнее об этом не сможет запускаться в Windows 9x;
мы уже говорили в предыдущем разделе). Ошибки осталь- ! внедряем 1.00.00h байт в заголовок по методу, опи-
ных типов менее коварны. санному в разделе «Раздвижка заголовка», оформляя
Живая классика – невыровненный физический размер все 1.00.00h байта как оверлей (т.е. оставляя SizeOf
предпоследней секции файла. Как уже говорилось выше, Headers неизменным), а если это невозможно, отка-
выравнивать физический размер последней секции нео- зываемся от внедрения;
бязательно, но при внедрении новой секции в файл пос- ! уменьшаем FS.v_a и FS.r_off на 1.00.00h;
ледняя секция становится предпоследней со всеми отсю- ! увеличиваем FS.r_sz на 1.00.00h;
да вытекающими последствиями. ! если FS.v_sz не равен нулю, увеличиваем его на 1.00.00h;
! увеличиваем виртуальные адреса всех секций, кроме
Категория C: расширение серединных первой, на 1.00.00h;
секций файла ! анализируем все служебные структуры, перечислен-
Внедрение в середину файла относится к высшему пило- ные в DATA DIRECTORY (таблицы экспорта, импорта,
тажу и обеспечивает X-коду наибольшую скрытность. перемещаемых элементов и т. д.), увеличивая все RVA-
Предпочтительнее всего внедряться либо в начало, либо ссылки на 1.00.00h;

80
программирование
! внедряем X-код в начало кодовой секции от FS.r_off ! если таблица перемещаемых элементов присутству-
до FS.r_off + 1.00.00; ет, увеличиваем все абсолютные ссылки на переме-
! пересчитываем Image Size. щенные секции на ALIGN_UP(sizeof(X-code), OA) байт,
если же таблицы перемещаемых элементов нет, ис-
Типовой алгоритм внедрения путем переноса запад- пользуем различные эвристические алгоритмы;
ной границы первой секции, выглядит так: ! пересчитываем ImageSize.
! считываем PE-заголовок;
! если OA < 2000h лучше отказаться от внедрения, т.к. Идентификация пораженных объектов. Данный тип
файл будет неработоспособен на Windows 9x, но если внедрения до сих пор не выловлен в живой природе, по-
мы все-таки хотим внедриться, то: этому говорить о его идентификации преждевременно.
! устанавливаем FA и OA равными 20h; Восстановление пораженных объектов. Ни одного
! для каждой секции: если NS.v_a – CS.v_a – CS.v_sz > пораженного объекта пока не зафиксировано.
20h, подтягиваем CS.v_sz к NS.v_a – CS.v_a;
! для каждой секции: если v_sz > r_sz, увеличиваем дли- Категория Z: внедрение через
ну секции на v_sz – r_sz байт, перемещая все осталь- автозагружаемые DLL
ные в физическом образе и страничном имидже; Внедриться в файл можно, даже не прикасаясь к нему. Не
! для каждой секции: если v_sz < r_sz, подтягиваем верите? А зря! Windows NT поддерживает специальный
v_sz к NS.v_a – CS.v_a, добиваясь равенства физи- ключ реестра, в котором перечислены DLL, автоматичес-
ческих и виртуальных размеров; ки загружающиеся при каждом создании нового процес-
! внедряем в заголовок ALIGN_UP(sizeof(X-code), OA) са. Если Entry Point динамической библиотеки не равна
байт, оформляя их как оверлей; нулю, она получит управление еще до того, как начнется
! уменьшаем FS.v_a и FS.r_off на ALIGN_UP(sizeof(X- выполнение процесса, что позволяет ей контролировать
code), OA); все происходящие в системе события (такие, например,
! внедряем X-код в начало первой секции файла; как запуск антивирусных программ). Естественно, борь-
! пересчитываем Image Size. ба с вирусами под их руководством ни к чему хорошему
не приводит, и система должна быть обеззаражена. Убе-
Внедрение в конец. Чтобы внедриться в конец кодо- дитесь, что в HKLM\SOFTWARE\Microsoft\Windows NT\
вой секции, необходимо раздвинуть нестраничный имидж, CurrentVersion\Windows\AppInit_DLLs перечислены только
заново пересчитав ссылки на все адреса, т.к. старых дан- легальные динамические библиотеки и нет ничего лиш-
ных на прежнем месте уже не будет. Задача кажется не- него!
выполнимой (встраивать в X-код полноценный дизассем-
блер с интеллектом ИДЫ не предлагать), но решение ле- Заключение
жит буквально на поверхности. В подавляющем большин- Хотя собранная автором коллекция методов внедрения
стве случаев для ссылок между секциями кода и данных претендует на полноту (если вам встречались програм-
используются не относительные, а абсолютные адреса, мы, внедряющиеся в файл другим способом, пожалуйста,
перечисленные в таблице перемещаемых элементов (при дайте об этом знать), технический прогресс не стоит на
условии, что она есть). В крайнем случае абсолютные месте, и каждый день приносит новые технологии и идеи.
ссылки можно распознать эвристическими приемами: Поэтому не воспринимайте эту статью как догму. Это всего
если (Image Base + Image Size) >= Z >= Image Size, то Z – лишь путеводитель по кибернетической стране виртуаль-
эффективный адрес, требующий коррекции (разумеется, ного мира.
предложенный прием не слишком надежен, но все же он
работает). Дополнительная литература:
Типовой алгоритм внедрения выглядит так: 1. Касперски К. Борьба с вирусами: опыт контртеррорис-
! считываем PE-заголовок; тических операций, журнал «Системый администра-
! если нет перемещаемых элементов, лучше отказать- тор», №10(11), октябрь, 2003 г. – 68-76 с.
ся от внедрения, т.к. файл может потерять работоспо- 2. Касперски К. Вирусы в UNIX, или Гибель Титаника II,
собность; журнал «Системый администратор», №1(14), январь,
! находим кодовую секцию файла; 2004 г. – 6-23 с.
! если CS.v_sz ==0 или CS.v_sz >= CS.r_sz, увеличива- 3. Касперски К. Ошибки переполнения буфера извне и
ем r_sz кодовой секции файла; изнутри как обобщенный опыт реальных атак, журнал
! если CS.v_sz < CS.r_sz, CS.r_sz := NS.r_off + «Системый администратор», №3(16), март, 2004 г. –
ALIGN_UP(sizeof(X-code), FA); 64-72 с.
! если CS.v_sz < CS.r_sz, CS.v_sz := CS.r_sz;
! физически сдвигаем все последующие секции на 1
Как вариант, X-код может внедриться в хвост класте-
ALIGN_UP(sizeof(X-code), FA) байт, увеличивая их r_off ра, оккупируя один или несколько незанятых секторов
на ту же самую величину; (если они там есть), однако, здесь этот вариант не рас-
! сдвигаем все последующие секции в страничном имид- сматривается, т.к. никакого отношения к PE-файлов
же, увеличивая их v_a на ALIGN_UP(sizeof(X-code), OA) он имеет.
байт;

№7(20), июль 2004 81


на правах рекламы

ПЕРЕДОВАЯ ТЕХНОЛОГИЯ СТЕКИРОВАНИЯ


КОММУТАТОРОВ – SINGLE IP MANAGEMENT
ЯКОВ ЮНИЦКИЙ
ЗАО «ТАЙЛЕ»
Стекируемые коммутаторы существуют уже довольно В стек могут быть объединены устройства, располо-
давно и применяются сегодня во многих сетях. Техноло- женные в любом месте сети.
гия стекирования пришла на смену технологии каскади- ! SIM – это дополнительная функция коммутатора. Она
рования. Сразу определим эти термины, чтобы увидеть может быть включена через управляющий интерфейс
разницу между технологиями. и не влияет на его базовые функции.
Каскадирование – последовательное объединение меж-
ду собой двух и более устройств, с целью увеличения ко- В коммутаторах с поддержкой Single IP Management
личества портов с использованием базовых стандартных (SIM) термин «стек» равнозначен термину «SIM-группа».
интерфейсов, при этом устройства, входящие в каскад, (SIM-группа – это группа коммутаторов, которая управля-
управляются независимо друг от друга. ется, как единое устройство.)
Стекирование – объединение между собой двух или Их общие характеристики выглядят так:
более устройств с целью увеличения количества портов с ! Коммутаторы, входящие в стек, могут выполнять одну
использованием базовых стандартных или специальных из трех функций:
интерфейсов, при этом все компоненты стека являются ! Commander Swith (CS) – мастер-коммутатор в груп-
одним логическим устройством, функционирующим как пе. Ему присваивается IP-адрес. Один CS не может
единое целое. входить в разные SIM-группы.
Схем организации стека по сути две: ! Member Swith (MS) – коммутатор, который распоз-
! Звезда – схема, в основе которой находится мастер- нается CS, как член SIM-группы. Один MS может вхо-
коммутатор, имеющий несколько интерфейсов для под- дить только в одну SIM-группу.
ключения к нему ведомых устройств. ! Candidate Switch (CaS) – коммутатор, подключенный
! Кольцо – схема, в которой все устройства равнознач- физически к SIM-группе, но не определенный CS как
ные и соединены последовательно друг с другом, а ее член. Любой коммутатор в режиме CaS можно
мастер-коммутатор определяется либо подключением сконфигурировать на ручное или автоматическое
кабеля для стекирования, либо в процессе «выборов». подключение к SIM-группе.
! В SIM-группу может входить только один Commander
Другие возможные варианты сводятся к описанным Swith.
выше. Обе схемы имеют свои достоинства и недостатки, ! Все коммутаторы SIM-группы должны входить в один
но общим узким местом является длина стекирующего ка- широковещательный домен.
беля. Для преодоления этого ограничения разработчики ! В SIM-группу может входить до 32 коммутаторов (от 0
внедряют технологии стекирования на основе стандарт- до 31), включая Commander Switch (под номером 0).
ных базовых портов. Примером могут служить коммута- ! Нет ограничений на количество SIM-групп в одном ши-
торы D-Link серии DES-3500 и DES-6500, поддерживаю- роковещательном домене, однако один коммутатор мо-
щие технологию Single IP Management. жет входить только в одну группу.
Single IP Management (SIM) – это концепция стекиро- ! SIM позволяет включать промежуточные устройства,
вания коммутаторов друг с другом посредством стандар- которые не поддерживают эту технологию. Это позво-
тных Ethernet-портов вместо использования специальных ляет управлять коммутатором, удаленным более чем
портов или модулей. Устройства, поддерживающие эту на один транзитный участок от CS.
технологию, формируют стек, предоставляя порты 10/100/
1000 Мбит/с и возможность организации гигабитного под- С помощью встроенного веб-менеджера можно полу-
ключения к магистрали. Вот несколько достоинств, реа- чить информацию, представленную в виде дерева (Tree
лизованных в этой технологии: View) о членах стека и топологии сети, с указанием мес-
! SIM уменьшает количество IP-адресов, использующих- торасположения устройств стека и связей между ними.
ся в сети. Это простое и достаточно эффективное веб-управление
! Для объединения в стек SIM позволяет обойтись без исключает необходимость установки дорогого ПО для
специальных соединительных кабелей. Трафик, пере- SNMP-управления.
даваемый между устройствами стека, проходит через Виртуальный стек поддерживает любые модели ком-
интерфейсы Gigabit Ethernet с поддержкой полного дуп- мутаторов с функцией Single IP Management. Это означа-
лекса по обычным кабелям UTP или оптике. Отказ от ет, что стек может быть расширен коммутаторами, вклю-
использования специальных стекирующих кабелей чая коммутаторы 3-го уровня для ядра сети, коммутаторы
позволяет устранить барьеры, связанные с их длиной. на основе шасси или любые другие.

82
сети

METRO ETHERNET

ДЕНИС ЕЛАНСКИЙ
Концепция Metro Ethernet За эти годы из низкоскоростной технологии локальных
По меркам современных систем передачи данных идеоло- сетей, технологии, не обладающей возможностью обес-
гия Metropolitan Ethernet еще очень молода. В настоящее печить надежность и качество обслуживания, предназна-
время происходит активное становление этого подхода к ченной для объединения небольшого числа компьютеров,
построению распределенных систем передачи данных. Этот она превратилась в технологию, обеспечивающую пост-
процесс идет при поддержке производителей сетевого обо- роение магистральных линий связи, работающих на сверх-
рудования и международных комитетов в области связи. высоких скоростях, поддерживающую параметры обслу-
Базовую модель сети можно представить как объеди- живания, управляемую и снабженную множеством инст-
нение пользовательского оборудования (CE – Customer рументов интеллектуального управления.
Equipment). Для данной процедуры используются сетевые
интерфейсы пользователя (UNI – User Network Interface)
и непосредственно Metro Ethernet Network (MEN).

Ðèñóíîê 2. Àíàëîãèÿ MEN è Frame Relay


Ðèñóíîê 1. Áàçîâàÿ ìîäåëü MEN à) Âèðòóàëüíûå ñîåäèíåíèÿ Frame Relay
Причем в роли UNI используются стандартные полу- á) Âèðòóàëüíûå ÷àñòíûå ëèíèè íà áàçå ñåðâèñà E-Line
чившие широчайшее распространение во всем мире пла- Несмотря на то что технология Ethernet (низкоскорост-
ты Ethernet (10 Мб/с, 100 Мб/с, 1 Гб/с, 10 Гб/с). ные сети 10Base) используются только для объединения
Учитывая пространственную разнесенность абонентов периферийных пользователей, базовые принципы все рав-
и потенциальное отсутствие непосредственных связей но наследуются более современными последователями
между ними, вводится такое понятие, как Ethernet Virtual этого популярного стандарта. Поэтому автор позволит
Connection – EVC (виртуальное соединение Ethernet). При себе обратиться к истории.
этом разделяют три типа виртуальных соединений: Изначально Ethernet работал как единая шина и толь-
! Point to point (точка-точка), ко один электрический сигнал мог распространяться по
! Point to multipoint (точка-многоточка), сети в каждый момент времени. Если же случалось, что в
! Multipoint to multipoint (многоточка-многоточка). сеть было послано несколько сигналов, то они наклады-
вались друг на друга и переставали быть распознавае-
Данная терминология и сам подход к воплощению за- мыми. Неудивительно, что был разработан способ пере-
имствованы из таких транспортных технологий, как Frame дачи данных, учитывающий эту неприятную особенность –
Relay и ATM. в противном случае пользы от таких сетей не было бы вов-
се. Алгоритм, известный как CSMA/CD (множественный
Ethernet. История стандарта доступ с контролем несущей и с определением столкно-
Реализация концепции MetroEthernet базируется на техно- вений), определял порядок доступа к среде передачи.
логии Ethernet, которая известна уже более двадцати лет, В упрощенном виде алгоритм доступа к среде выгля-
но наиболее бурное развитие получила в поледние 8 лет. дит примерно так:

84
сети
! Устройство, имеющее кадры для передачи, прослуши- Благодаря этим позитивным тенденциям технология
вает сеть на предмет ее занятости. Ethernet перестает быть технологией построения ЛВС, втор-
! Если сеть свободна, отправитель начинает передачу. гаясь на рынок сетей масштаба города (Metropolitan Area
! Во время процесса передачи отправитель продолжает Networks).
прослушивать сеть, чтобы удостовериться в отсутствии
столкновений. Привлекательность MetroEthernet
! Если во время передачи произошла коллизия, пере- Так что же дает концепция Metro Ethernet провайдерам?
дающая сторона случайным образом генерирует ин- Почему все большее число производителей оборудова-
тервал ожидания, по истечении которого повторяет ния начинает поддерживать эту концепцию? Почему спе-
первую операцию. циалисты прогнозируют бурный рост сетей Metro Ethernet?
По мнению экспертов компании In-Start/MDR, рост при-
Протокол CSMA/CD решает значительное число про- быльности сетей Metro Ethernet составит колоссаль-
блем, однако его использование делает сеть малоэффек- ные значения и к 2008 году данная технология сравняется
тивной при большом количестве пользователей. Приведу по распространенности с SDH-сетями.
две наиболее негативные особенности протокола: Подобные оценки основаны на том, что пропускная спо-
! Все столкнувшиеся кадры уничтожаются, и их прихо- собность каналов Ethernet постоянно растет (достигая на
дится пересылать повторно. Это приводит к росту за- данном этапе величины в 10 Гб/с), вместе с этим улучша-
держек в сети. ются надежностные показатели технологии, ее управляе-
! Задержка растет также и для станций, ожидающих пра- мость и масштабируемость. При этом с распространени-
ва на передачу. Так как при возрастании количества уча- ем новых сред передачи (например, оптического волок-
стников обмена данными по сети трафик сети насыща- на) возросли перекрываемые дистанции.
ется, то и время ожидания для каждой станции растет.

Часть этих проблем решается применением коммута-


торов, а именно:
! Не происходит коллизий, а соответственно нет необ-
ходимости в повторной трансляции утерянных по этой
причине кадров. Ðèñóíîê 3. Ðîñò äîõîäîâ îò óñëóã ãîðîäñêèõ ñåòåé Ethernet â ÑØÀ
! Сетевые устройства не тратят времени на ожидание
освобождения среды передачи.
! Фактически можно достичь двойной номинальной ско-
рости, учитывая возможность одновременной двунап-
равленной передачи данных.

Современные реализации Ethernet


Gigabit Ethernet сохраняет черты своих более медленных
предшественников, разве что использование концентра-
торов для подобных сетей практически нонсенс, несмот-
ря на наличие оных. Отличительными особенностями этой
технологии являются также используемые кабели и мето-
ды кодирования передаваемых сигналов.
Стоит отметить, что развитие семейства стандартов
Ethernet идет такими темпами, что уже сейчас широким
спросом пользуются решения 10 Gigabit Ethernet, а произ-
водители оборудования ведут работы над созданием еще
более продуктивной технологии.
Помимо увеличения пропускной способности каналов
связи в сетях Ethernet наблюдаются и другие, менее оче-
видные, но не менее значимые тенденции. Во-первых, ди- Ðèñóíîê 4. Ãèáêîñòü ðîñòà ïðîïóñêíîé ñïîñîáíîñòè â ñåòÿõ Ethernet
аметр сети более не ограничивается, во-вторых, длина сег- Помимо этого, технология Ethernet не просто домини-
мента сети также перестала быть определяющей величи- рует на рынке ЛВС, а осталась практически единствен-
ной: используя волоконно-оптические кабели, можно пе- ной, сохранившейся до настоящего времени (более 90 %
рекрывать дистанции до 100 км. В-третьих, и это также рынка ЛВС приходится на сети Ethernet).
нельзя не отнести к положительным сторонам техноло- Все это лежит в основе перспективности технологии Metro
гии, оборудование становится все более интеллектуаль- Ethernet как для провайдеров, так и для абонентов. Что по-
ным, при этом не дорожая, а наоборот, снижаясь в цене. лучают провайдеры от сетей Metro Ethernet? Высокоскоро-
Более того, интеллектуальность оборудования приводит стную опорную сеть, сегменты которой могут достигать 100
к повышению надежности сети, равно как и к расшире- км, а пропускная способность одного канала может дости-
нию спектра предоставляемых услуг. гать 10 Гб/с. Чем же привлекательна эта технология для

№7(20), июль 2004 85


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

Производители и оборудование Extreme Networks


Кто же является основным игроком на рынке Ethernet-реше- Созданная в 1995 году компания Extreme Networks с пер-
ний? Какие компании производят оборудование для MEN? вых дней своего существования задумывалась как конку-
Какие плюсы и минусы имеет каждый производитель друг рент Cisco Systems в области магистральных решений.
относительно друга? На эти вопросы мы постараемся дать Стоит отметить, что за восемь лет своего существования
ответ в следующих частях данной статьи. инженеры и менеджеры компании справились с этой зада-
Сейчас на рынке телекоммуникаций существует огром- чей, и получилось это у них весьма неплохо.
ное количество фирм, занимающихся производством сете- Об этом говорит тот факт, что на традиционно сильном
вого оборудования. Естественно, что их продукция различа- американском рынке, дающем большую часть дохода, по-
ется по качеству, по надежности, по уровню технической зиции основных конкурентов были значительно ослабле-
поддержки, по перечню обеспечиваемых сервисов и по мно- ны, и около 15% поставляемого в настоящее время обору-
гим другим показателям. Мы не станем рассматривать про- дования производится Extreme Networks. Такое развитие
дукцию фирм, занимающихся производством дешевых ре- событий имеет под собой две основные причины.
шений, предназначенных для построения небольших локаль- С одной стороны, компания-производитель четко опре-
ных сетей. Мы рассмотрим тех вендоров, которые работают делила круг своих интересов, а именно – магистральные
для рынка Metro Ethernet, производя высокотехнологичное сети и интеграция ЛВС-пользователей. С другой стороны,
оборудование с выдающимися рабочими характеристиками. в кратчайшие сроки были созданы три семейства оборудо-
После введения такого строгого фильтра в рассмотре- вания, полностью отвечающего этим требованиям. С точ-
нии останется не так уж много фирм, не больше десятка. К ки зрения функционала оборудование Extreme поддержи-
ним смело можно отнести таких гигантов, как: вает все протоколы и обеспечивает все интерфейсы, ис-
! Cisco Systems (www.cisco.com) пользующиеся в настоящее время как операторами, так и
! Extreme Networks (www.extremenetworks.com) потребителями телекоммуникационных услуг. Для унифи-
! Nortel Networks (www.nortelnetworks.com) кации программной компоненты все оборудование рабо-
! Riverstone Networks (www.riverstonenet.com) тает под управлением единой операционной системы
ExtremeWare, которая в свою очередь может администри-
Cisco Systems роваться средствами системы Epicenter.
Являясь одним из признанных лидеров на рынке телеком- Дополнительным бонусом этой системы является интег-
муникаций, Cisco Systems предлагает для магистральных рация с HP-OpenView. В продуктовой линейке Extreme в
Ethernet-сетей два класса устройств. Это в первую очередь настоящее время представлены три семейства оборудова-
магистральные маршрутизаторы (такие как Cisco 7600OSR, ния: Summit, Alpine и Black Diamond. Такое разделение по-
10000 и 12600) и высокопроизводительные коммутаторы зволяет обеспечить весь спектр решений как для конечно-
уровня ядра (семейство Cisco Catalyst 6500). Оборудова- го пользователя, так и для крупного регионального опера-
ние обоих классов может использоваться в любом из уз- тора связи. При этом капиталовложения будут соответство-
лов сети (даже в таких требовательных системах, как опор- вать решаемой задаче. Как говорилось ранее, основной
ные сети операторов) с той лишь разницей, что каждое приоритет Extreme – высокопроизводительные магистраль-
шасси поддерживает различные типы плат расширения. ные сети, построенные на базе стандарта Ethernet. Для этой
Òàáëèöà 1. Ñòàòèñòè÷åñêèå ïîêàçàòåëè Cisco технологии было создано оборудование, являющееся на
сегодняшний день наиболее производительным (с точки
зрения битовой коммутации) и оптимально расширяемым
(одно шасси поддерживает до 48/480/2304 физических пор-
тов 10 Гб/с, 1 Гб/с, 100 Мб/с соответственно, а при исполь-
зовании технологии CWDM число логических портов мо-
жет превышать число физических портов в 8 раз).
Помимо высокоскоростных портов Ethernet оборудова-
Характерными особенностями оборудования Cisco явля- ние Extreme имеет возможность для интеграции с опорны-
ются следующие черты: поддержка технологии MPLS, про- ми сетями SDH. В наличии имеются интерфейсы STM-1,
токолов маршрутизации (RIP, OSPF, BGP, IGRP, EIGRP, IS- STM-4, а также интерфейс АТМ 3,2 Гб/с. Наличие SDH-ин-
IS), высокая масштабируемость, поддержка высокопроизво- терфейсов позволят использовать устройства Black
дительных протоколов резервирования каналов передачи Diamond как для сопряжения с сетями SDH, так и для пре-
данных (протокол STP и его многочисленные модификации), доставления сервисов IPoSDH и SDHoIP.
наиболее высокая (до недавнего времени) плотность пор- Помимо распространенных протоколов обмена цифро-
тов, единая операционная система IOS, высокая производи- вой информацией коммутаторы Extreme позволяют стро-
тельность и надежность. Все это, а также агрессивная мар- ить «пакетные кольца».

86
сети
В отличие от тех случаев, когда резервирование обес- формации 10 Гб/с. Программное обеспечение коммутато-
печивается средствами протоколов из семейства STP (STP, ров обеспечивает как потоковую коммутацию (line-rate
RSTP, STP+), время восстановления маршрута для техно- switching), так и маршрутизацию трафика. Естественно,
логии «paket ring» не превышает 50 мс. Это позволяет го- поддерживаются протоколы Q-in-Q и MPLS.
ворить о гарантированном качестве, сравнимом с каче- Для всех устройств (как для коммутаторов серии XGS,
ством в сетях SDH. так и для маршрутизаторов серии RS) существует единая
графическая система управления, работающая под управ-
Nortel Networks лением унифицированной операционной системы Riverstone.
Компания Nortel, уже давно известная в мире как один из К недостаткам оборудования Riverstone нельзя не отне-
основных производителей оборудования телефонии, пос- сти следующее: высокопроизводительная серия только
ле слияния с Bay Networks стала активно осваивать новый анонсирована – даже на официальном сайте нет подроб-
для себя сегмент рынка. Наибольшим вниманием у Nortel ного описания данного оборудования. А маршрутизаторы
Networks пользуется направление Metro Ethernet. В рамках серии RS значительно уступают (по некоторым показате-
развития этой концепции было создано новое семейство лям на порядок) оборудованию других производителей. Так,
магистральных коммутаторов OPTERA Metro. По техноло- например, битовая коммутация происходит на скорости
гичности производимого оборудования Nortel во многом пре- всего лишь 170 Гб/с, в то время как Black Diamond 10800
восходит своих конкурентов, однако несмотря на это суще- (Extreme Networks) выполняет аналогичную процедуру на
ствует ряд объективных факторов, снижающих популярность скорости 1600 Гб/с. Помимо этого, маршрутизаторы серии
и распространенность оборудования OPTERA у операторов. RS поддерживают стандарт SDH только до 16-го уровня,
Как и все крупные производители, Nortel обеспечивает что не позволяет встраивать их в кольца магистралей STM-
своих потенциальных заказчиков всем необходимым. Обо- 64. Кроме этого, анонсированное семейство XGS вообще
рудование этого производителя предоставляет инструмен- осталось без модулей SDH.
ты для интеграции в высокоскоростные Ethernet-магистра- Возможно, по мере развития спроса и популярности
ли (1 Гб/с и 10 Гб/с), а также для сопряжения с магистраля- Riverstone пойдет на расширение своего модельного ряда
ми SDH, равно как и для подключения абонентов. Поддер- оборудованием для интеграции с сетями SDH. На сегод-
живается широчайший спектр существующих протоколов няшний же день доступное оборудование серии RS не мо-
обмена, реализованы «proprietary»-протоколы, примером жет в полной мере считаться аппаратурой операторского
которых может служить протокол «пакетного кольца», ана- класса. Для формирования центров обработки данных та-
логичный реализованному в оборудовании Extreme и обес- кие коммутаторы подойдут практически идеально (при вы-
печивающий восстановление канала в пределах 50 мс. сокой надежности, достаточной производительности и мас-
Создана единая операционная система, конфигурируемая штабируемости они имеют относительно низкую стоимость)
как в консольном, так и в графических режимах. либо для построения узлов доступа к сетям MAN/MEN, но
Оборудование добротно и перспективно. Но каждый па- для использования в качестве магистрального это обору-
раметр, по которому его можно оценить, имеет одно «но». дование еще не готово.
Унификация оборудования произведена, однако заставить
работать его в связке с оборудованием стороннего произ- Сравнение производителей
водителя не всегда просто. Любое оборудование, любая компания, его производящая,
Графическая система управления хороша, но в гете- имеют свои преимущества и недостатки. Если в разделе
рогенных сетях возникают затруднения в комбинирован- «Производители и оборудование» я постарался рассказать
ном управлении. Спектр предлагаемых интерфейсов ве- об оборудовании вообще, то в этой главе акценты будут по-
лик, но плотность портов оставляет желать лучшего (по ставлены несколько иначе. А именно: в чем преимущества
этому показателю коммутаторы Nortel Networks уступают не оборудования (здесь не может быть однозначного мне-
не только аналогам Extreme, но и большинству других зна- ния), а производителей, где их сильные и слабые стороны?
чимых производителей). Единственное, пожалуй, бесспор-
ное преимущество – это реализация таких сервисов Metro Cisco. Pro et Contra
Ethernet, как агрегация пользователей и обеспечение па- Несомненным преимуществом компании является гаран-
раметров трафика. тированное качество и сверхширокий ассортимент. На дан-
ном этапе не существует такой задачи, которую было бы
Riverstone Networks нельзя решить на оборудовании Cisco.
Руководство Riverstone позиционирует свое оборудование Вторым существенным плюсом, позволяющим компа-
как капиталосберегающее решение для перехода от сетей, нии удерживать ведущие позиции на рынке, является стра-
чувствительных к задержкам (приложения VoIP), к сетям, тегия работы с партнерами. Работая с крупными партнера-
требующим сверхвысокой пропускной способности (прило- ми, Cisco обращает внимание как на руководящий (как пра-
жения CRM и ERP). При этом компания не отказывается от вило, нетехнический) персонал, так и на инженеров, при-
поддержки приложений реального времени. Для воплоще- званных работать непосредственно с оборудованием. Для
ния этой стратегии было создано семейство магистральных руководителей компаний Cisco Systems представляется как
коммутаторов XGS. В общих чертах коммутаторы XGS – крупнейшее наукоемкое производство, заботящееся о сво-
это модульное оборудование, расширяемое по мере необ- их партнерах. В то же время для людей, обеспечивающих
ходимости и оптимизированное для работы с потоками ин- работоспособность сетей, построенных на оборудовании

№7(20), июль 2004 87


сети
Cisco, разработана система оценки уровня подготовленно- Помимо означенных выше преимуществ Extreme взяла
сти. Вот почему инженеры, прошедшие обучение и серти- на вооружение идеологию Cisco в общении с потенциаль-
фикацию в Cisco, предпочитают консольные решения Cisco, ными партнерами. Этот производитель развернул широко-
а не легко управляемое в среде Web оборудование, выпол- масштабную программу подготовки инженеров с последу-
ненное в духе открытых стандартов. ющей сертификацией.
Третьим сильным местом является широчайший ассор- С разработкой нового оборудования компания разви-
тимент, однако уже не с точки зрения покупателя, а с точ- вает не только аппаратные возможности, но и стремится к
ки зрения конкурентов. Ведь если рынок насыщен (порой усовершенствованию существующих протокольных воз-
до 50%) оборудованием одного производителя, то возни- можностей. Более того, ведущие инженеры компании уча-
кает вопрос совместимости вновь предлагаемого с уже ра- ствуют в технологических форумах. Это позволяет неза-
ботающим оборудованием. Фактически это целенаправлен- медлительно реализовывать все новейшие достижения.
ное выдавливание конкурентов с рынка. Четвертым плю- В отличие от большинства производителей Extreme
сом является производительность магистрального обору- Networks не стремится к получению сверхприбылей за счет
дования. Политика компании нацелена на то, чтобы сред- сверхвысоких цен. Возможно, это временное явление, свя-
невзвешенная производительность оборудования Cisco занное с необходимостью расширения рынков сбыта.
была бы максимальной в отрасли. Еще одним положительным моментом является нали-
Но не только плюсами обладает Cisco. К недостаткам чие мощного графического средства управления сетью.
компании нельзя не отнести высокие (а порой и сверхвы- Этот инструмент весьма универсален (во всяком случае
сокие) цены на оборудование. Это превышение колеблет- сравним по эффективности с Cisco Works), при этом значи-
ся в среднем от 15 до 50 % и распространяется как на обо- тельно менее ресурсоемок.
рудование, так и на сервис. В условиях партнерских согла- К слабым сторонам нельзя не отнести отсутствие инф-
шений цены естественно снижаются, но стоимость владе- раструктуры в Европе вообще и в России в частности. Фир-
ния по-прежнему остается на очень высоком уровне. ма только начинает делать первые шаги в этом направле-
Как уже упоминалось, оборудование Cisco очень доро- нии. Поэтому нет ни представительства, ни сертифициро-
го в эксплуатации, т.к. требуются дорогостоящее обучение ванных партнеров, ни технической поддержки.
персонала, высокие затраты на сервисные работы и на тех- Помимо отсутствия развитой структуры представи-
ническую поддержку. тельств и партнерских отношений настораживает сравни-
Иерархическая модель Cisco не только упрощает пост- тельная молодость производства вообще и продукции в ча-
роение сетей, но и требует более широкого спектра обору- стности. Если фирмы, созданные 20, 30 лет назад, уже оп-
дования. При этом от уровня к уровню возникают сложнос- ределили концепцию развития и обкатали стратегию со-
ти с совместимостью с третьими производителями. Это вершенствования аппаратно-программного обеспечения, то
приводит к тому, что, став однажды клиентом Cisco Systems, относительно молодые производства еще не до конца от-
потребитель становится заложником этой компании. ладили программную компоненту своей продукции, след-
Многие технологии Cisco не являются стандартными. Го- ствием чего является необходимость частого обновления
воря о лидировании в области стандартов, часто забыва- программного обеспечения. Хотя в случае с Extreme
ют о том, что многие из этих стандартов не являются при- Networks эта закономерность прослеживается не очень
знанными. Если подходить к вопросу более формально, ярко: обновления ПО выходят только при появлении ново-
стоит говорить о лидерстве в применении конкретной тех- го аппаратного обеспечения.
нологии, ее частной реализации.
Nortel Networks. Альтернативный выбор
Extreme Networks. За и против Унаследовав всю мощь этого гиганта, Nortel стал одним
Extreme Networks, основанная в 1995 году уступает по мас- из лидеров в сфере производства и разработки систем
штабам и именитости трем остальным компаниям. Одна- передачи данных.
ко в последние годы наметился бурный рост качества, а Касательно оборудования Nortel можно констатировать
вместе с ним и распространенности оборудования этого следующее: у него нет ярко выраженных недостатков, но
производителя. В пользу компании говорит уже тот факт, и с преимуществами тоже не все очевидно. Если бы это
что за 9 лет существования ее продукция отвоевала у ми- были автомобили, можно было бы сказать – «добротный
ровых гигантов 9 % рынка, доведя этот показатель по не- автомобиль». Это оборудование имеет весь необходимый
которым отраслям до 18 %. Характерен и тот факт, что перечень функций, которые могут понадобиться. Nortel ве-
оборудование Extreme Networks (а именно магистральные дет собственные разработки, реализует сторонние дос-
коммутаторы семейства Black Diamond) было использо- тижения, но не более того. Что касается архитектуры шас-
вано при построении вычислительной сети министерства си, то и здесь отношение к производителю можно опре-
обороны США. делить как «не хуже, чем у других». Но и не лучше. Это
Также в пользу этого вендора говорит и то, что в про- иллюстрируется ситуацией с плотностью и качеством пор-
граммном обеспечении коммутаторов реализованы все тов: при производстве задействованы самые современ-
стандартные протоколы. Более того, многие получившие ные технологии, управление отдельными узлами совер-
распространение, но не принятые в качестве стандарта шенно, но плотность портов из расчета на шасси хоть и
технологии нашли отражение в программном обеспечении велика, но уступает показателям Extreme и Cisco, а с точ-
Extreme Networks. ки зрения управляемости композиция добротных элемен-

88
сети
тов управления в результате все же не дотягивают до вы- оборудование разных производителей выравнивается по
сококлассной системы управления. качеству и по рабочим параметрам. Другим характерным
Что касается отношений с потенциальными заказчи- умозаключением является то, что, выходя на новые рынки
ками, то сертификация хотя и существует (сертификаци- (в нашем случае – на рынок сетей Metro Ethernet), они ока-
онные центры Nortel представлены не только за рубежом, зываются практически в равных условиях – всем приходит-
но и на территории России), но ведется недостаточно аг- ся начинать с нуля. Об этом стоит помнить при выборе обо-
рессивно. рудования и поставщика. Третьим интересным выводом яв-
Если обратить внимание на экономические показате- ляется то, что в новых сферах производства признанные
ли, то заметно, что при отсутствии деградации показате- лидеры теряют свои, казалось бы незыблемые, позиции.
лей развития какого-либо существенного прироста не на- Что может служить критерием оценки оборудования?
блюдается. Большая часть роста компании обусловлена По нашим представлениям – это, прежде всего, произво-
расширением рынка оборудования телефонии. дительность и стандартность, латентность коммутации,
совместимость с гетерогенными сетями, возможность
Riverstone Networks. работы по принципиально иным протоколам (в случае
Преимущества и недостатки Ethernet таким протоколом является SDH), перспективная
Как говорилось ранее, оборудование Riverstone предназ- поддержка стандартов будущего (таких как 100Gig
начено для миграции к более ресурсоемким приложени- Ethernet), насыщенность портами, маршрутная емкость,
ям. При этом во главу угла ставится экономичность пред- отказоустойчивость и надежность (время восстановления
лагаемых решений. Этот факт имеет двойственную оцен- канала передачи), обеспечение параметров качества об-
ку. С одной стороны, компания заботится о своих потре- служивания, стоимость внедрения, стоимость владения и
бителях, но, с другой стороны, – она нацелена не на ры- простота обслуживания (т.е. наличие сертификационных
нок операторов, а на рынок центров обработки данных, центров обучения).
крупных корпоративных пользователей и позиционирует- Также при выборе оборудования полезной может ока-
ся как средство для построения узлов доступа к магист- заться и следующая информация: спектр производимого
ральным сетям. оборудования, распространенность оборудования в мире,
Исходя из официальных материалов, предлагаемых на стоимость оборудования и стоимость владения.
сайте производителя, можно понять, что Riverstone нахо- Оценки этих, и ряда других, менее значимых парамет-
дится на расстоянии трех лет (что по меркам сверхбыст- ров, приведены в таблице.
ро развивающегося производства очень большой срок) Òàáëèöà 2. Îáîáù¸ííàÿ òàáëèöà õàðàêòåðèñòèê îáîðóäîâàíèÿ MEN
от конкурентов. Это предположение может быть обосно-
вано хотя бы тем, что серия маршрутизаторов Cisco 12000
была заявлена еще в 2001 году, а в дальнейшем происхо-
дило только ее совершенствование, в то время как появ-
ление конкурентоспособной серии XGS от Riverstone анон-
сировано только сейчас. При этом стоит помнить, что ли-
дирует по техническим показателям Black Diamond 10800
(Extreme Networks) – магистральный коммутатор, которо-
му уже больше полугода.
Возможно, в случае успешного продвижения на рынке
семейства XGS Riverstone сменит акценты и перейдёт к
производству магистрального оборудования для высоко-
производительных сетей с поддержкой широкого спектра
протоколов физического и логического уровней. Но сей-
час это не оборудование операторского класса. Слишком
много вопросов, связанных с политикой компании, возни-
кает у потенциальных потребителей.
Практически не существует программы сертификации
инженеров.
Партнерские программы развиты слабо: большая часть
стратегических партнеров Riverstone – американские ком-
пании. Все условные оценки являются позитивными, т.е. по-
Закрытость от потенциального потребителя, отсут- казатель тем лучше, чем выше его оценка.
ствие оборудования уровня доступа приводит к изолиро- Условные оценки выставляются по пятибалльной шка-
ванности и безвестности. Что в свою очередь приводит к ле, если не оговорено иного.
подсознательному недоверию. Как можно понять из результатов сравнения, имеется
некоторый паритет. Хотя, на наш взгляд, оборудование
Эпилог Extreme (как самое производительное и отказоустойчи-
Подводя итог сравнению оборудования разных фирм, мож- вое) и Cisco (как самое распространенное и сопровожда-
но сделать несколько выводов. Совершенно очевидно, что емое) имеют некоторое преимущество над конкурентами.

№7(20), июль 2004 89


образование

ВТОРОЕ НАЧАЛО ТЕРМОДИНАМИКИ –


ГАРАНТ УСПЕХА СИСТЕМ
С ОТКРЫТЫМ ИСХОДНЫМ КОДОМ
Мы вышли на развилку, нам некуда вперёд;
Идти назад нам не позволит наша честь.
Непонятно, что такие, как мы,
До сих пор делаем в таком отсталом месте, как здесь.

Борис Гребенщиков

Мы живём в очень интересное время.


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

АЛЕКСЕЙ МИЧУРИН
№7(20), июль 2004 91
образование
Почему термодинамика?
Обычно при обсуждении вопросов выбора между ПО с
закрытым и с открытым кодом в расчёт идут соображе-
ния экономического, этического характера, другие до-
воды. Но в этой статье я хотел бы взглянуть на пробле-
му выбора доктрины разработки ПО с необычной сто-
роны: не с точки зрения человека (производителя, по-
требителя...), а с точки зрения Природы (или правиль-
нее: с точки зрения современных представлений о При-
роде). Давайте посмотрим на проблему с точки зрения
термодинамики (ТД) – физической теории, описываю- В этом смысле действительно уместна аналогия с по-
щей поведение систем, состоящих из большого числа рядком и беспорядком. Если все спички лежат в одном
элементов. А именно, второго начала ТД – закона воз- месте, это полный порядок и нулевая энтропия. Если всё
растания энтропии. разбросано хаотично, в беспорядке, то энтропия макси-
На мой взгляд, термодинамический подход здесь бо- мальна. Но это только одна из точек зрения на смысл
лее чем уместен. Взгляните сами: ТД рассматривает си- энтропии.
стемы большого числа частиц. Частицы могут быть не- Я хочу подвести читателя к мысли, что энтропия по-
скольких сортов, но каждый сорт представлен большим казывает не столько беспорядок в бытовом смысле это-
числом частиц. Очень сходная ситуация наблюдается и го слова2, сколько число возможностей для реализации
в мире ПО. Существует некоторое количество программ- заданного макроскопического состояния (как это и гово-
ных продуктов, каждый из которых проинсталлирован рилось в определении).
множество раз. Невольно напрашивается мысль продол- Если рассмотреть больше коробков, то драматизм си-
жить аналогии и посмотреть, какие результаты дадут туации ещё более возрастает. Например, для четырёх
фундаментальные законы ТД, если их применить к миру коробков и восьми спичек конфигурация 1 + 1 + 1 + 5
ПО. Я обращусь ко второму началу ТД – фундаменталь- реализуется 336 способами, а ситуация 2 + 2 + 2 + 2 мо-
ному закону, определяющему направления развития жет реализоваться 2520 способами. Энтропия последне-
(эволюции) подобных систем1. го состояния, как вы понимаете, гораздо больше. Даже
Давайте сперва разберёмся, что такое энтропия, как минимальное отклонение от этого состояния в состоя-
применить это понятие к нашему вопросу и почему она ние типа 2 + 2 + 3 + 1 уменьшит количество возможных
возрастает. реализаций на треть (до значения 1680 шт.).
Надеюсь, теперь определение энтропии, данное в на-
Энтропия – мера возможностей чале этого пункта, уже никому не кажется странным или
Все знают магические слова: «энтропия – мера беспо- пугающим. Мы уже обжились на микро- и макроуровнях
рядка», но мало кто задумывается о том, что за беспо- рассмотрения систем и можем смело двигаться дальше.
рядок имеется в виду.
Строго говоря (по определению), энтропия данного Второе начало ТД
макросостояния системы – величина, пропорциональная Второе начало ТД, как известно, утверждает, что энтро-
логарифму числа микросостояний, которыми реализует- пия изолированной системы не убывает, то есть возрас-
ся данное макросостояние. Понятнее не стало? Давайте тает или остаётся постоянной.
разбираться. Теперь это утверждение становится более понятным.
Простой пример: у нас есть два спичечных коробка и Если мы предоставим спички из нашего примера самим
четыре спички. С нашей макроскопической точки зрения себе (по условию система должна быть изолированной,
спички неразличимы, одна ничем не хуже другой. Для нас т.е. наше вмешательство в систему категорически ис-
важно только, сколько в каком коробке находится спичек. ключено), то они, скорее всего, придут к состоянию, от-
Это макроописание системы. Однако, на микроуровне (на вечающему равному заполнению коробков и обладаю-
уровне спичек) они (спички) различимы и их можно, на- щему большей энтропией. Именно поэтому воздух в ва-
пример, пронумеровать и раскладывать в коробки разны- шей комнате заполняет каждый её уголок равномерно:
ми способами, получая одну и ту же макроконфигурацию. он просто распределился таким образом, чтобы энтро-
Сколькими способами мы можем реализовать макросос- пия стала максимальной.
тояние: в первой коробке – одна спичка, во второй – три
(обозначим это состояние 1 + 3)? Или иначе, сколькими Эволюция Живого
способами мы можем разложить четыре неодинаковые Я хотел бы немного отвлечься и взглянуть на эволюцию
спички по двум коробкам, получая заданное макрососто- Живого в Природе (слово «Жизнь» я буду писать с боль-
яние 1 + 3? Очевидно, таких способов четыре (см. рису- шой буквы, подчёркивая тем самым, что я имею в виду
нок). А сколькими способами можно реализовать состоя- не мою и не вашу жизнь, и даже не жизнь человечества,
ние 2 + 2? Шестью (тот же рисунок). Энтропия последнего а Жизнь как минимум на планете Земля). На мой взгляд,
состояния больше. Энтропия же состояния 0 + 4 равна здесь это будет вполне уместно по двум причинам. Во-
нулю, так как это состояние реализуется только одним первых, мир программ и вычислительных машин, услож-
способом (логарифм единицы – ноль). няясь и организуясь, приобретает всё больше черт, род-

92
образование
нящих его с живыми существами. Это видно даже из тер- Акт заимствования фрагмента кода из другой систе-
минологии, достаточно вспомнить термин «virus» или опе- мы в чём-то сродни актам создания новых комбинаций
ратор «die» (язык Perl), или команду «kill» (ОС UNIX). Во- генетического материала и тоже повышает устойчивость
вторых, любая эволюция подчиняется одним и тем же гло- всего информационного сообщества (конечно, не обхо-
бальным законам, но эволюция Живого гораздо старше дится и без ошибок, но «мутанты» не живут долго).
эволюции ПО и может преподать много поучительных Представьте себе Интернет, на всех серверах кото-
уроков. рого стоит один набор программ, скомпилированных од-
Что же демонстрирует эволюция Живого? Она крас- ним компилятором с одним набором параметров ком-
норечиво свидетельствует, что Живое всё время стре- пиляции, установленных с одного диска одним касани-
мится к разнообразию. ДНК – основной носитель на- ем клавиши Enter... Клоны, клоны, клоны... ни чем не
следственной информации – наращивается3 в ходе эво- отличающиеся друг от друга. В конце концов, появится
люции (эквивалентно увеличению числа коробков в на- вирус, который воспользуется общей уязвимостью и
ших захватывающих опытах со спичками). Таким обра- разрушит весь этот мир. Если же ядро ОС каждого сер-
зом, увеличивается число возможностей реализовать вера и программное обеспечение хотя бы просто пере-
Жизнь. То есть Природа остаётся верна себе, постоян- компилированы, то атаки, направленные, скажем, на пе-
но увеличивая энтропию. При этом увеличивается не реполнение буферов (наверное, наиболее опасные и
беспорядок в бытовом смысле, а скорее информацион- эффективные атаки4), затронут только тот soft, который
ная ёмкость. Возвращаясь к нашему определению энт- имеет строго определённый двоичный код. Остальной
ропии: возрастает количество микросостояний, доступ- soft будет неуязвим. Это простой пример, только один
ных системе. из многих.
Больше того, Жизнь «изобретает» способы, ускоря- Тут читатели меня спросят: «Как же всё произойдёт?
ющие процесс создания различных модификаций, ярчай- Что будет переломным моментом? Когда ждать предска-
ший пример – появление двух полов. Благодаря посто- зываемой мною победы OpenSource?»
янной рекомбинации (перекомбинированию) генетичес- К сожалению (или к счастью?), я не могу ответить на
кого материала каждый индивид даже одного вида ста- эти вопросы, как не могу ответить, почему именно эта
новится уникален. молекула воздуха оказалась именно здесь и когда здесь
Представьте на минуту горе-человечество, размно- окажется другая.
жающееся почкованием, где каждый человек несёт один Возможно, должны измениться экономика и мораль,
и тот же набор генов и обладает одним и тем же набо- прежде чем ПО с открытым исходным кодом займёт то
ром форм иммунного ответа (защитных реакций). Такое место, которое предназначено ему общеэволюционны-
человечество крайне нестабильно. Довольно быстро по- ми законами. Возможно, что и сами способы разработ-
явится вирус (например), который истребит всех. К сча- ки, лицензирования и распространения ПО изменятся до
стью, все люди разные, и человечество в целом продол- неузнаваемости. Трудно представить, что человечество
жает здравствовать и по сей день. не найдёт каких-то компромиссов и более совершенных
Подобная ситуация наблюдается и в любой другой решений. Я не знаю, когда это случится. Как не знаю,
эволюционирующей системе большого числа элементов. почему именно сочетание букв с-т-а-т-ь-я выражает то,
Эволюция общественного строя, эволюция инструментов что я сейчас пишу. Я только знаю, что языки становятся
труда, эволюция языков (в том числе и языков програм- всё выразительнее и богаче, и в них найдутся слова для
мирования), эволюция системы частиц газа в вашей ком- моих мыслей; что воздух по-прежнему равномерно за-
нате – все они ведут к увеличению числа возможностей полняет мою комнату и я не задохнусь; Жизнь ищет всё
реализации системы, то есть к увеличению энтропии. (В новые пути разнообразить себя; ПО с открытым исход-
обществе всё больше различных «вакансий» для чело- ным кодом непременно восторжествует, второе начало
века, инструменты труда предоставляют всё больше воз- ТД останется непоколебимым и Природа остаётся верна
можностей для достижения целей, языки предлагают всё своим законам.
больше вариантов выражения мыслей...)
Но мы уже рискуем увлечься, вернёмся теперь в мир Дополнение 1:
ПО. Несколько слов об изолированности
системы
Эволюция в мире ПО Я уже слышу возмущённые голоса читателей: «Уважа-
В мире ПО царят те же самые законы, и эволюция неми- емый автор совершенно верно сказал, что второе на-
нуемо пойдёт по единственному возможному пути. ПО с чало ТД справедливо только для изолированных сис-
закрытым исходным кодом, не допускающее модифика- тем, а сам применяет его к чему попало! Ведь всем ясно,
цию, обречено, как и гипотетическое почкующееся че- что наша планета не является термодинамически изо-
ловечество. Напротив, ПО с открытым кодом неминуе- лированной системой, получая тепло от Солнца. Тем
мо восторжествует, так как каждая «пересобранная» из более не являются изолированными подсистемы, упо-
исходных кодов система уже является новой модифика- мянутые автором: компьютеры подключены в сеть элек-
цией (не клоном, но новым индивидом того же вида), от- тропитания, программисты потребляют еду и напитки...
личающейся от других возможно даже частью функцио- Как же можно применять второе начало ТД ко всем этим
нальных возможностей. системам?».

№7(20), июль 2004 93


образование
Читатель абсолютно прав. Упомянутые системы не Вы видите, что невозможно в живом мире существо-
изолированы в термодинамическом смысле, но это не вание двух одинаковых организмов, даже если один из
должно нас смущать, ведь и энтропию мы рассматрива- них является клоном другого. Конечно, генетический ма-
ем не в термодинамическом смысле. Мы не рассматри- териал гораздо более подвержен изменениям, чем, ска-
ваем атомы и молекулы, как это делает термодинамика, жем, код программ. И, конечно, нельзя получить копию
мы выбрали другие микро- и макроуровни рассмотрения. живого организма так же, как копию файла. То есть
Давайте вернёмся к примеру со спичками. Если мы наша аналогия между эволюцией живого и эволюцией
нагреем нашу систему коробков-спичек, то термодина- ПО может показаться не вполне справедливой. Но при
мическая энтропия, конечно, возрастёт, но спички оста- внимательном рассмотрении легко заметить, что ука-
нутся на своих местах и наша энтропия не изменится. занные здесь несоответствия только добавляют весо-
Т.е. система вполне сохранила изолированность в нашем мости сделанным в статье выводам.
понимании. Действительно, даже несмотря на то, что гены ме-
Точно так же появление новой операционной систе- няются самопроизвольно, а точное копирование живо-
мы на компьютере практически не связано с количеством го невозможно, Природа была вынуждена изобрести
потреблённой им электроэнергии и ещё меньше связа- способы дополнительного ускорения создания новых и
но с количеством попавших на него солнечных лучей. новых комбинаций генов. И принудил её к этому всё тот
Термодинамическая изолированность или неизолирован- же закон возрастания энтропии.
ность здесь до известной степени ни при чём. Сможет ли эволюция ПО устоять перед этим фунда-
Однако все законы продолжают выполняться и в на- ментальным эволюционным законом? Сама Природа,
шем случае. Так, чтобы уменьшить энтропию, необхо- выбирая между неизменным и изменчивым, всегда от-
димо совершить работу. В нашем случае со спичками – даёт предпочтение последнему.
продумать, как их разместить, и выполнить необходи-
1
мые перестановки, переведя систему, скажем, из со- Первое начало ТД для нас будет малоинформатив-
стояния 2+2 в состояние 0+4. Это сродни той работе, но. Оно является фактически законом сохранения
которую вы затрачиваете на уборку, складывая равно- энергии, справедливым для любых систем, безотно-
мерно разбросанные вещи (два карандаша на столе, сительно числа их элементов. Второе же начало ТД
два – под столом) в одно место (все четыре – на столе, отражает статистические свойства системы.
2
ноль – под столом). Причём я имею в виду не просто Так и хочется закричать: «Как вообще можно гово-
механическую работу (тем более не теплоту в термоди- рить о беспорядке в Природе или в физике! Бога по-
намическом смысле), а усилия в самом общем смысле: бойтесь!»
3
сюда включены и поиски карандашей, и подбор наибо- Биологи, ознакомившись с черновиком этой статьи,
лее подходящего для них места... Опять же, неизоли- очень не одобрили это «дилетантское» слово, про-
рованность вашего стола и карандашей в термодина- шу меня извинить, если кого-то оно заденет.
4
мическом смысле (их возможность обмениваться теп- Детальному рассмотрению этого вопроса посвяще-
лом с другими телами) нисколько не повлияет на ход ны, в частности, статьи Криса Касперского, опубли-
вашей уборки, потому что ваши усилия иные, нежели кованные в недавних номерах «Системного админи-
теплообмен с системой. стратора».
5
Конечно, последовательный анализ изолированнос- Кстати, с накоплением таких ошибок и сбоев связан
ти указанных систем (в указанном, не термодинамичес- и процесс старения. И это ещё одно отличие, про-
ком, смысле) требует отдельной статьи, но я думаю, что грамма не стареет (устаревает, но не стареет физи-
приведённых доводов достаточно, чтобы развеять мно- чески).
гие опасения и сомнения.

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

94
подписка на II полугодие 2004
Российская Федерация ! Узбекистан – по каталогу «Davriy nashrlar» российские
! Подписной индекс: 81655 издания через агентство по распространению печати
Каталог агентства «Роспечать» «Davriy nashrlar» (7000029, Ташкент, пл.Мустакиллик,
! Подписной индекс: 87836 5/3, офис 33)
Объединенный каталог «Пресса России» ! Азербайджан – по объединенному каталогу российс-
Адресный каталог «Подписка за рабочим столом» ких изданий через предприятие по распространению
Адресный каталог «Библиотечный каталог» печати «Гасид» (370102, г. Баку, ул. Джавадхана, 21)
! Альтернативные подписные агентства: ! Армения – по списку номенклатуры «АРЗИ» через
Агентство «Интер-Почта» (095) 500-00-60, курьерская ГЗАО «Армпечать» (375005, г.Ереван, пл.Сасунци Да-
доставка по Москве вида, д.2) и ЗАО «Контакт-Мамул» (375002, г. Ереван,
Агентство «Вся Пресса» (095) 787-34-47 ул.Сарьяна, 22)
Агентство «Курьер-Прессервис» ! Грузия – по списку номенклатуры «АРЗИ» через АО
! Подписка On-line «Сакпресса» ( 380019, г.Тбилиси, ул.Хошараульская,
http://www.arzy.ru 29 ) и АО «Мацне» (380060, г.Тбилиси, пр-т Гамсахур-
http://www.gazety.ru дия, 42)
http://www.presscafe.ru ! Молдавия – по каталогу через ГП «Пошта Молдавей»
(МД-2012, г.Кишинев, бул.Штефан чел Маре, 134)
СНГ по списку через ГУП «Почта Приднестровья» (МD-3300,
В странах СНГ подписка принимается в почтовых отделе- г.Тирасполь, ул.Ленина, 17)
ниях по национальным каталогам или по списку номенк- по прайслисту через ООО Агентство «Editil Periodice»
латуры АРЗИ: (2012, г.Кишинев, бул. Штефан чел Маре, 134)
! Казахстан – по каталогу «Российская Пресса» через ! Подписка для Украины:
ОАО «Казпочта» и ЗАО «Евразия пресс» Киевский главпочтамп
! Беларусь – по каталогу изданий стран СНГ через РГО Подписное агентство «KSS»
«Белпочта» (220050, г.Минск, пр-т Ф.Скорины, 10) Телефон/факс (044)464-0220

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

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

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

№7(20), июль 2004 95


СИСТЕМНЫЙ АДМИНИСТРАТОР
№7(20), Июль, 2004 год

РЕДАКЦИЯ
ЧИТАЙТЕ
Исполнительный директор
Владимир Положевец
В СЛЕДУЮЩЕМ
Ответственный секретарь
Наталья Хвостова
sekretar@samag.ru
НОМЕРЕ:
Технический редактор
Владимир Лукин
Редактор Запуск в VMWare гостевой отметить относительное спокойствие. А
Андрей Бешков оси, установленной вот Windows XP действительно смог
на физическом диске привлечь пользователя, этот момент и
РЕКЛАМНАЯ СЛУЖБА В этой статье будет описана возмож- стоит считать началом действительно-
тел./факс: (095) 928-8253 ность запуска гостевой системы, уста- го интереса разработчиков к проблеме.
Константин Меделян новленной на компьютере при помощи Многие (да почти все) производители
reсlama@samag.ru VMWare самым обычным способом. включили поддержку NTFS в ядрах сво-
Для более рационального использова- их дистрибутивов. Проблем с доступом
Верстка и оформление ния времени и ресурсов необходимо к разделам NTFS не обнаружат пользо-
imposer@samag.ru одну из этих систем (в данном случае ватели Mandrake, SUSE, ALTLinux,
maker_up@samag.ru Windows) запускать либо на виртуаль- ASPLinux, Slackware, Debian и прочих
Дизайн обложки ной машине, либо на реальном компь- популярных дистрибутивов. Только ком-
Николай Петрочук ютере, чтобы при этом сохранялись все пания RedHat, очевидно руководству-
изменения, сделанные в системе во ясь лицензионной чистотой своего ди-
103045, г. Москва, время работы. Это необходимо на слу- стрибутива, не включила поддержку
Ананьевский переулок, дом 4/2 стр. 1 чай отсутствия администратора на ра- данной ФС. Поэтому пользователи
тел./факс: (095) 928-8253 боте. Про установку и запуск этой про- RedHat и Fedora увидят при попытке
Е-mail: info@samag.ru граммы можно прочитать на http:// монтирования раздела сообщение, вы-
Internet: www.samag.ru www.onix.opennet.ru, где выложены ста- веденное в заголовок.
тьи Андрея Бешкова. Но там не описан На данный момент имеются два сво-
РУКОВОДИТЕЛЬ ПРОЕКТА вопрос запуска уже установленной си- бодных проекта, по-своему решающие
Петр Положевец стемы, находящийся на физическом вопрос работы с разделами NTFS. Пер-
диске, который мы сегодня рассмотрим. вый – проект Linux-NTFS – предлагает
УЧРЕДИТЕЛИ традиционный подход, т.е. написание
Владимир Положевец Linux и NTFS драйвера, который позволит нормаль-
Александр Михалев До недавнего времени острой необхо- но работать с этой файловой системой.
димости в доступе к разделам с фай- Второй, проект Captive NTFS – пробует
ИЗДАТЕЛЬ ловой системой NTFS во общем-то и не решить все эмуляцией системы NT.
ЗАО «Издательский дом было. Ругать разработчиков ядра Linux
«Учительская газета» не за что, необходимые работы ведут- В яблочко!
ся уже давно и отнюдь не безуспешно. Данная статья – краткий обзор ОС
Отпечатано типографией Уже в 1995 году для ядер серии 2.0 был Darwin 7.0 на платформе x86 (она же
ГП «Московская Типография №13» доступен патч для работы с этой фай- Jaguar, она же Mac OS X 10.3).
Тираж 7000 экз. ловой системой, а с версии 2.2 (если Не прошло и полгода, как взоры ав-
быть точнее 2.1.74) подержка NTFS в тора вернулись к упомянутому в заго-
Журнал зарегистрирован ядро была включенна стандартно. Но ловке продукту. Что же может при-
в Министерстве РФ по делам печати, все равно разработки велись несколь- влечь помимо легендарного названия
телерадиовещания и средств мас- ко вяло. Причин несколько. Семейство фирмы Apple Computer? Наверное, са-
совых коммуникаций (свидетельство пользовательских операционных сис- мое главное – ориентирование данной
ПИ № 77-12542 от 24 апреля 2002г.) тем Windows до Me включительно под- операционной системы на открытость.
держивают только FAT, а NTFS исполь- Правда, можно долго дискутировать
За содержание статьи ответственность зовалась на ОС корпоративно-сервер- относительно открытости продуктов
несет автор. За содержание рекламно- ного уровня, где вряд ли кто-то доду- самой фирмы Apple, а нас в первую
го обьявления ответственность несет мается поставить одновременно две очередь должно волновать несколько
рекламодатель. Все права на опубли- операционные системы на одном ком- моментов: списки совместимости с обо-
кованные материалы защищены. Ре- пьютере. Появление же Windows 2000 рудованием (так называемые hardware
дакция оставляет за собой право изме- практически ничего не изменило, на compatibility list [1]); знание структуры
нять содержание следующих номеров. домашних компьютерах ее устанавли- *BSD-систем; потребность в использо-
вали довольно неохотно, и если посмот- вании данной ОС в обучающем про-
реть на форумах тех времен, то можно цессе/на производстве.

96