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