Академический Документы
Профессиональный Документы
Культура Документы
Восстановление данных
с лазерных дисков
Новые средства
ОС FreeBSD 5
Эффективная почтовая
система на базе Exim
NETFILTER
Пингвин
с одного пинка
NetBSD:
установка и настройка
Переполнение буфера
в Windows NT/2000/XP
оглавление
АДМИНИСТРИРОВАНИЕ СЕТИ
Плохое электропитание,
или «Грабли» с UPS
Павел Закляков
amdk7@mail.ru 52
WWW.SAMAG.RU
№8(9), август 2003 1
bugtraq
2
администрирование
ВОССТАНОВЛЕНИЕ ДАННЫХ
С ЛАЗЕРНЫХ ДИСКОВ
…Такой объем информации можно уничтожить в один
миг разве что динамитом, потому что существуют
дублирующие системы, и у скорости обработки есть предел.
Джон Варли
«Нажмите ENTER»
КРИС КАСПЕРСКИ
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. ная система:
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
администрирование
К содержимому полей 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 остается нетронутой и поз- ливать сколь-нибудь ценный диск на еще неизвестном вам
же может быть прочитана на секторном уровне (а это как приводе, попробуйте потренироваться на «кошках» – дис-
раз то, что нам нужно!). Сказать по чести, чрезмерное ке, не содержащем ничего интересного).
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 – данные о функционировании этого протокола (ко-
статус каждого порта личество пакетов получено и отправлено, количество
количество подключенных принтеров ошибок и их разновидности).
system.sysUpTime
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, то задаваемых вопросов. Сделать это можно, передав лю-
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, установленный по умолчанию в строке редактиро-
вания. После того как все необходимые данные введены чтобы данные счетчиков производительности (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
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-àäðåñ ìàøèíû, êîòîðîé íóæíî îòïðàâèòü çàïðîñ.
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.
ПИНГВИН
С ОДНОГО ПИНКА
СЕРГЕЙ ЯРЕМЧУК
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
boot: linux ks
redhat-config-kickstart
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
ПЕРВЫЕ ШАГИ
ДЕНИС НАЗАРОВ
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 –», система дополнительно каких вопросов по формату файла.
net.inet.ip.forwarding=1
или
net.inet6.ip.forwarding=1
# cat /etc/resolv.conf
lookup file bind
nameserver 127.0.0.1
nameserver 172.16.13.35
portmap=YES
в файле /etc/rc.conf.local.
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). Например:
Добавление пользователей
Я немного отвлекся, идем дальше. В OpenBSD имеются
команды user, useradd, userdel, userinfo, usermod, users для
работы с пользователями системы. Нас интересует коман-
да useradd, но разработчики решили не грузить админист-
раторов бесполезным заучиванием опций этой команды и
создали замечательный скрипт /usr/sbin/adduser, который
в интерактивном режиме задаст вам вопросы относитель-
но новых пользователей и добавит их без проблем. Типич-
ная сессия добавления пользователя:
ccdconfig –U
ccdconfig –C
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)
NetBSD:
УСТАНОВКА И НАСТРОЙКА
АНДРЕЙ БЕШКОВ
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
36
администрирование
го перегрузить машину, для меня лично довольно сомни-
тельна. Почему это нельзя сделать с помощью кнопки
«Reset» или, на крайний случай, «Power», мне было непо-
нятно. Впоследствии после консультаций со знающими
людьми было выяснено, для чего именно эта опция необ-
ходима. Оказалось, что нужна она для того, чтобы раз-
монтировать разделы, используемые во время обновле-
ния пакетов с программным обеспечением и добиться
корректного завершения установки.
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.
ЭФФЕКТИВНАЯ ПОЧТОВАЯ
СИСТЕМА НА БАЗЕ
Статья рассматривает создание почтовой системы с использованием 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. конфигурации.
Редактируем 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:
Конфигурируем 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 с подробным отче-
на расширение вложений. том (по каким критериям письмо засчитано спамом).
*@friends.ru postmaster@ourmail.duster.ru E
Authenticators section
Здесь задаются правила аутентификации, чтобы наш
SMTP-сервер могли использовать только по паролю. Не-
обходимость обычно существует только для систем бес-
платной почты и компаний, которые хотят, чтобы их со-
трудники могли использовать корпоративный SMTP-сер-
вер из любой точки планеты. Удачи всем постмастерам!
44
администрирование
НОВЫЕ СРЕДСТВА ОС
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. Наи- писи данных метаданные в памяти записываются на диск
более слабым местом любой ФС являются операции за- (т.е. записываются лишь однажды) в определенном по-
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) так и те, что выполняют
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.
пьютера-сервера без монитора. Менее емкие модели ме- Например, при пропадании сети возможен дозвон аль-
нее желательны, так как они не могут использоваться для тернативному провайдеру и сброс сообщения, однако это
подключения монитора. Их емкости хватит на несколько уже тема другой статьи.
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; }
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"
58
hardware
Òàáëèöà 1. Ðàçâîäêà è ñèãíàëû ïîñëåäîâàòåëüíîãî èíòåðôåéñà
(ÑÎM-ïîðòà).
Ðèñóíîê 9.
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.
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 – информация о вход-
ном и выходном интерфейсе.
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;
} Обнуляем структуры:
Приведенный код сохраним в файле 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-пакета:
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/
общественное мнение считает ее усилия шантажом.
Составил Александр Антипов
ПРОТОКОЛ 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 Кбит/с. Представим, что наш провайдер
подключен к телефонной станции по цифровой линии, а
мы – по аналоговой. В этом случае данные от провайдера
будут переданы на станцию без каких-либо преобразова-
ний – в цифровом виде. Затем по оптоволоконному кана-
лу они передаются нашей станции, которая выполняет
цифро-аналоговое преобразование. А если цифровая
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]------------------------
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;
$string =~ s|/bin|/local/bin|ig; "\", "|", "(", "{", "[", "*", "+", "$", "?", "."
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(<>){
# ýòî ïåðåáîð ñî ñðàâíåíèåì ñ òåêñòîì, ò.å. åñëè õîòÿ áû
@+ – массив, содержащий позицию последнего най- # îäèí ôðàãìåíò èç àëüòåðíàòèâû ñîâïàäåò ñ òåêñòîì,
денного совпадения. # òî âîçâðàùàåìîå çíà÷åíèå ïðèìåò èñòèíó, ò.å. â äàííîì
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;
Вот что получится: 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; }
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 байт из них.
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 бит, на-
самым восстанавливая наше кодовое слово в исходный вид. кладными расходами на контрольные биты можно полно-
А что если искажение затронет не информационный, стью пренебречь.
а контрольный бит? Проверка показывает, что позиция К сожалению, коды Хемминга способны исправлять
ошибки успешно обнаруживается и в этом случае, и кон- лишь одиночные ошибки, т.е. допускают искажение всего
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, â òî âðåìÿ êàê ìëàäøèå áèòû
может выглядеть так: êîäîâîãî ñëîâà ôàêòè÷åñêè îñòàþòñÿ íåçàäåéñòâîâàííûìè è "ïðà-
Что читать
Несмотря на то что данный цикл статей является вполне кошный сборник разнообразных руководств по кодам
самодостаточным и весь минимально необходимый мате- Рида-Соломона, наверное, лучший из всех, что я видел.
матический аппарат излагает самостоятельно без отсылок Включает в себя кратное описание основ теории полей
к сторонней литературе, желание углубить свои знания Галуа, базовые принципы построения кодеров/декодеров
вполне естественно и его можно только приветствовать. А Рида-Соломона и законченные примеры реализации са-
потому будет лучше, если вы не ограничитесь одной этой мих кодеров/декодеров на языке Си (правда, недостаточ-
статьей, а перевернете целые горы специализированной но добросовестно прокомментированные). Сей 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
подписка
81655
Единый
подписной
индекс:
81655
по каталогу 81655
агентства
«Роспечать»
Рады видеть
Вас нашими
читателями!
РЕДАКЦИЯ
ЧИТАЙТЕ
Исполнительный директор
Владимир Положевец
В СЛЕДУЮЩЕМ
Ответственный секретарь
Наталья Хвостова
НОМЕРЕ:
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