98
№11(24) ноябрь 2004 подписной индекс 81655 www.samag.ru Утилита nLite: формируем свой дистрибутив Windows XP/2000/2003 Мониторинг UNIX-серверов c помощью Nagios и SNMP Использование бездисковых Linux-станций с загрузкой по сети Пакетный фильтр OpenBSD Танцуем самбу Linare – настольный дистрибутив Linux Иммунная система для компьютера Пассивный перехват трафика Запись дисков CD-R/RW в Linux Создание и настройка сервера терминалов Утилита nLite: формируем свой дистрибутив Windows XP/2000/2003 Мониторинг UNIX-серверов c помощью Nagios и SNMP Использование бездисковых Linux-станций с загрузкой по сети Пакетный фильтр OpenBSD Танцуем самбу Linare – настольный дистрибутив Linux Иммунная система для компьютера Пассивный перехват трафика Запись дисков CD-R/RW в Linux Создание и настройка сервера терминалов №11(24) ноябрь 2004

024 Системный Администратор 11 2004

Embed Size (px)

DESCRIPTION

Пакетный фильтр OpenBSD Использование бездисковых Linux-станций с загрузкой по сети Использование бездисковых Linux-станций с загрузкой по сети Linare – настольный дистрибутив Linux Linare – настольный дистрибутив Linux Создание и настройка сервера терминалов Танцуем самбу

Citation preview

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

№11(24) ноябрь 2004подписной индекс 81655

www.samag.ru

Утилита nLite:формируем свой дистрибутивWindows XP/2000/2003

Мониторинг UNIX-серверовc помощью Nagios и SNMP

Использование бездисковыхLinux-станций с загрузкой по сети

Пакетный фильтр OpenBSD

Танцуем самбу

Linare – настольный дистрибутив Linux

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

Пассивный перехват трафика

Запись дисков CD-R/RW в Linux

Создание и настройкасервера терминалов

Утилита nLite:формируем свой дистрибутивWindows XP/2000/2003

Мониторинг UNIX-серверовc помощью Nagios и SNMP

Использование бездисковыхLinux-станций с загрузкой по сети

Пакетный фильтр OpenBSD

Танцуем самбу

Linare – настольный дистрибутив Linux

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

Пассивный перехват трафика

Запись дисков CD-R/RW в Linux

Создание и настройкасервера терминалов№

11(2

4) н

оябр

ь 20

04

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

1№11(24), ноябрь 2004

оглавление

Пакетный фильтр OpenBSD

Денис Назаров[email protected] 16

Виртуальные войныСравнительное тестирование VMWare Workstationи Cooperative Linux.

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

Обзор эмулятора mips64emul

Александр Байрак[email protected] 26

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

Мониторинг UNIX-серверовc помощью Nagios и SNMP

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

Использование бездисковыхLinux-станций с загрузкой по сети

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

БЕЗОПАСНОСТЬ

Пассивный перехват трафика

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

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

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

Создаем кроссплатформенноеприложение на основе FLTK

Антон Борисов[email protected] 64

Файловая система NTFS извне и изнутриЧасть 1

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

Class Server 3.0. – новое решениеMicrosoft в области образования

Андрей Филиппович[email protected]

Лейся песня,или Сервер потокового аудиосвоими руками

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

Запись дисков CD-R/RW в LinuxЧасть 1

Владимир Мешков[email protected] 56

ОБРАЗОВАНИЕ

Танцуем самбу

Роман Гребенников[email protected] 32

Заметки о Linare

Валентин Синицын[email protected] 39

СЕТИ

HARDWARE

ПРОГРАММИРОВАНИЕ

71

Использование программы nLite

Максим Костышин[email protected] 42

Разработка сценария регистрациипользователей в сетиЧасть 1

Иван Коробко[email protected] 78

Создание и настройка сервератерминалов

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

BUGTRAQ 63

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

4

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

В предыдущей статье этого цикла [1] мы говорили о том,как научить Nagios следить за Windows-серверами, пользу-ясь сведениями, предоставляемыми SNMP. Теперь пришлапора рассказать, как можно собирать данные о жизнедея-тельности серверов, работающих под управлением разныхдиалектов UNIX. Для этого мы будем снова использоватьSNMP. Если вас мучают вопросы, что такое этот преслову-тый SNMP, как он работает и для чего предназначен, то,наверное, стоит ознакомиться с RFC 1156, 1157, 1213, 1146,2571, 2574 и заодно прочитать предыдущую статью [1]. Пе-ред началом повествования следует сказать, что системамониторинга, на которой будут выполняться все действия,описанные ниже, у меня работает под управлениемFreeBSD. За время, прошедшее с момента публикации пре-дыдущей статьи, Nagios дорос до версии 1.2, также изме-нилась с 4.7 на 4.10 версия системы FreeBSD, используе-мой на моем сервере. Теперь уже нет необходимости ком-пилировать Nagios из исходников, все прекрасно ставитсяиз портов. Впрочем, стоит, как всегда, сделать традицион-ную оговорку: все, что я рассказывал в предыдущих стать-ях о Nagios и о чем буду говорить впредь, вполне надежноработает и под управлением других UNIX-подобных опера-ционных систем.

Вдобавок необходимо заметить, что пакет usd-snmp, ис-пользовавшийся нами для работы с SNMP прежде, теперьпревратился в net-snmp версии 5.1.1.

Перейдем к задаче на сегодня. Необходимо настроитьмониторинг серверов, работающих под управлениемFreeBSD 4.10 и ALT Linux 2.3. Соответственно, для приме-ра им даны имена reddaemon и penguin. Впрочем, стоитзаметить, что net-snmp успешно работает и на многих дру-гих UNIX-подобных системах:! HP-UX (9.0, 10.20, 11.0);! Ultrix (от 4.2 до 4.5);! OSF (3.2, 4.0);! Solaris (SPARC/ULTRA от 2.3 до 2.8) (Intel 2.9) SunOS

(4.1.4 и выше);! NetBSD (от 1.0 до 1.5 alpha);! FreeBSD (от 2.2 и выше);! Linux (ядра от 1.3 и выше);! BSDI (от 2.1 до 4.0.1);! AIX (3.2.5, 4.1.5);! OpenBSD (2.6, 2.8);! OS X (10.1.1, 10.1.2);! Irix (от 5.1 до 6.5);! QNX 6.2.1A;! Dynix/PTX 4.4.

На данный момент идут работы по портированию net-snmp на Windows. В результате уже сейчас можно сказать,

что программа работает на 90% при условии компиляции спомощью Visual C++ и cygwin32.

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

Первым делом на сервере мониторинга, работающемпод FreeBSD, устанавливаем самую новую версию пакетовnet-snmp и nagios-plugins.

Пакет net-snmp4, все еще присутствующий в дереве пор-тов, устанавливать не стоит из-за сильной устарелости.

На подопытных серверах также необходимо проинстал-лировать net-snmp. Для FreeBSD это делается вышеуказан-ным способом, но nagios-plugins ставить не следует. ДляALT Linux 2.3 требуется выполнить следующие команды.

На этом процедуру инсталляции можно считать завер-шенной. Для того чтобы система могла отвечать на SNMP-запросы, внутри нее должен работать демон snmpd. Ему,как и всем порядочным программам, для успешного функ-ционирования необходимо иметь конфигурационный файл.В качестве такового обычно выступает snmpd.conf. При ра-боте с Linux он, как правило, располагается в /etc/snmp/, адля FreeBSD соответственно актуальна директория /usr/local/etc/.

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

Думаю, что есть необходимость подробно объяснитьпроцедуру, с помощью которой рассчитывается содержи-мое переменной sysservices. Нужно выбрать из списка уро-вень и подставить его номер вместо L в формулу 2L-1.! 1 – physical (концентраторы);! 2 – datalink/subnetwork (мосты);! 3 – internet (IP-шлюзы);

МОНИТОРИНГ UNIX-СЕРВЕРОВC ПОМОЩЬЮ NAGIOS И SNMP

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

# cd /usr/ports/net-mgmt/net-snmp# make install clean# cd /usr/ports/net-mgmt/nagios-plugins# make install clean

# apt-get update# apt-get install net-snmp net-snmp-utils

# Ìåñòîíàõîæäåíèå ñèñòåìû â ðåàëüíîì ìèðåsyslocation Rostov-on-Don Kranoarmejskaya str. ↵↵↵↵↵

Building 1 testlab 407# Êîíòàêòû àäìèíèñòðàòîðàsyscontact Andrew Beshkov [email protected] tel. 390-34-89# Ñåðâèñû, ïðåäîñòàâëÿåìûå ñèñòåìîésysservices = 79

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

5№11(24), ноябрь 2004

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

! 4 – end-to-end (IP-хост);! 5 – OSI (протоколы OSI);! 6 – OSI (протоколы OSI);! 7 – applications (SMTP, POP3 и прочие сервисы).

К примеру, для маршрутизатора расчет будет выглядетьтак: 23-1=4. А для обычного хоста 24-1 + 27-1 = 72. Если выхотите мониторить все уровни, то лучше всего использо-вать цифру 79.

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

Следующим интересным моментом является безопас-ность. В традиционном SNMP для версий протокола 1 и 2сза нее отвечают строки сообществ (community strings). Ихстоит воспринимать как своеобразные аналоги паролей. Со-общества бывают двух видов – private и public. Отличаютсяони друг от друга лишь тем, что первое позволяет изме-нять данные внутри наблюдаемого устройства, а второедает возможность только просматривать их. Самым про-стым способом определить эти сообщества является вне-сение в конфигурационный файл следующих строк:

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

Итак, давайте посмотрим, что за сведения могут предо-ставить нам подопытные устройства. Для этого запускаемна них демон snmpd. Чтобы это сделать, кладем на Linux-машине файл snmpd.conf в /etc/snmp и затем выполняемследующую команду:

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

И обязательно убеждаемся в успешности выполненияпредыдущей команды с помощью:

Для FreeBSD файл с настройками должен находиться в/usr/local/etc/snmp/. Кроме этого, нужно включить запуск де-мона в скрипте /usr/local/etc/rc.d/snmpd.sh. Чтобы это сделать,ищем внутри него строку snmpd_enable= «NO» и вписыва-ем в нее слово «YES». Затем вручную запускаем демон.

Стоит отметить тот факт, что, кроме snmpd, в комплектnet-snmp входит демон snmptrapd, отвечающий за обработкуSNMP-ловушек. По умолчанию он выключен, стоит помнить,что в системе не должно работать ненужного программно-го обеспечения, поэтому без особой надобности не будемего включать. Говорить о том, как можно использовать этисамые ловушки, мы будем в следующей статье.

Теперь можно проверить, что за сведения предоставля-ют наши сервера. Сделать это можно как минимум двумяспособами. C помощью утилит командной строки snmpgetили snmpwalk.

Опция –m ALL указывает, что нужно показать все дере-во ниже выбранного OID, после -с располагается комьюни-ти string, затем идут версия snmp-протокола, имя машиныи OID запрашиваемой ветви. Стоит отметить, что OID мож-но записывать разными способами. В большинстве случа-ев префикс iso.org.dod.internet.mgmt.mib-2. можно не писать,так как он предполагается по умолчанию, соответственномы получим тот же самый результат, если напишем простоsystem. Для указания OID вместо длинных названий можноиспользовать цифровые идентификаторы. К примеру, этотже куст дерева можно адресовать следующей комбинаци-ей цифр .1.3.6.1.2.1.1. Если есть желание увидеть все MIB-дерево, то можно выполнить вышеуказанную команду, вов-се не указывая OID. Думаю, вы будете впечатлены разме-рами листингов, которые система выведет вам. Использо-вать командный интерфейс полезно, но, к сожалению, этоне всегда помогает получить правильное представление остроении MIB-дерева.

В этом нам помогут утилиты, называемые MIB-браузе-рами. Для Linux и FreeBSD лучше всего подойдет програм-ма mbrowse. Обычно она по умолчанию входит во многие

rocommunity InK12345rwcommunity 12r341289j

# service snmpd start

# chkconfig snmpd on

# /usr/local/etc/rc.d/snmpd.s

# snmpwalk �m ALL -c InK12345 -v1 penguin ↵↵↵↵↵.iso.org.dod.internet.mgmt.mib-2.system

SNMPv2-MIB::sysDescr.0 = STRING: Linux altlinux.unreal.net 2.4.27-std-up-alt1

#1 Sun Oct 17 22:42:45 MSD 2004 i686

SNMPv2-MIB::sysObjectID.0 = OID: NET-SNMP-MIB::netSnmpAgentOIDs.10

SNMPv2-MIB::sysUpTime.0 = Timeticks: (1751738) 4:51:57.38

SNMPv2-MIB::sysContact.0 = STRING: Andrew Beshkov <[email protected]>

SNMPv2-MIB::sysName.0 = STRING: penguin.example.com

SNMPv2-MIB::sysLocation.0 = STRING: Rostov-on-Don Kranoarmejskaya str.

Building 1 testlab 407

SNMPv2-MIB::sysServices.0 = INTEGER: 0

SNMPv2-MIB::sysORLastChange.0 = Timeticks: (3) 0:00:00.03

SNMPv2-MIB::sysORID.1 = OID: IF-MIB::ifMIB

SNMPv2-MIB::sysORID.2 = OID: SNMPv2-MIB::snmpMIB

SNMPv2-MIB::sysORID.3 = OID: TCP-MIB::tcpMIB

SNMPv2-MIB::sysORID.4 = OID: IP-MIB::ip

SNMPv2-MIB::sysORID.5 = OID: UDP-MIB::udpMIB

SNMPv2-MIB::sysORID.6 = OID: SNMP-VIEW-BASED-ACM-MIB::vacmBasicGroup

SNMPv2-MIB::sysORID.7 = OID:

SNMP-FRAMEWORK-MIB::snmpFrameworkMIBCompliance

SNMPv2-MIB::sysORID.8 = OID: SNMP-MPD-MIB::snmpMPDCompliance

SNMPv2-MIB::sysORID.9 = OID: SNMP-USER-BASED-SM-MIB::usmMIBCompliance

SNMPv2-MIB::sysORDescr.1 = STRING:

The MIB module to describe generic objects for network interface sub-layers

SNMPv2-MIB::sysORDescr.2 = STRING: The MIB module for SNMPv2 entities

SNMPv2-MIB::sysORDescr.3 = STRING:

The MIB module for managing TCP implementations

SNMPv2-MIB::sysORDescr.4 = STRING:

The MIB module for managing IP and ICMP implementations

SNMPv2-MIB::sysORDescr.5 = STRING:

The MIB module for managing UDP implementations

SNMPv2-MIB::sysORDescr.6 = STRING: View-based Access Control Model for SNMP.

SNMPv2-MIB::sysORDescr.7 = STRING: The SNMP Management Architecture MIB.

SNMPv2-MIB::sysORDescr.8 = STRING:

The MIB for Message Processing and Dispatching.

SNMPv2-MIB::sysORDescr.9 = STRING:

The management information definitions for the SNMP User-based Security Model.

# chkconfig snmpd --list

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

6

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

дистрибутивы. В действии эта программа выглядит следу-ющим образом.

Для систем Windows существует достаточно много по-добных утилит. О том, какую из них и почему стоит выб-рать, я подробно рассказывал в предыдущей статье [1].

Конечно, обилие доступных данных поражает, но всеже хотелось бы точно знать, как это использовать с наи-большей выгодой. Давайте вновь вернемся к предмету на-шего разговора. Кроме стандартных ветвей, net-snmp со-здает свою собственную ветвь .iso.org.dod.internet.private.enterprises.ucdavis, которая содержит в себе все необходи-мые данные. В цифровом формате адрес этой ветви выг-лядит так: .1.3.6.1.4.1.2021. Стоит отметить, что в некото-рых snmp-браузерах данная ветка может быть недоступначерез свое символьное обозначение, но в то же время зап-росы, выполняемые с помощью цифровых OID, будут впол-не работоспособны. Думаю, вы со мной согласитесь, чтоэто немного неудобно, поэтому, чтобы включить распозна-вание символьных имен, нам нужно будет скопировать MIB-базы из /usr/share/snmp/mibs/ в рабочую директорию исполь-зуемого браузера.

Как показывают тесты, все работает достаточно непло-хо, но, к сожалению, наша система сейчас отвечает наSNMP-запросы, приходящие с любого IP-адреса. К тому же,по умолчанию используется первая версия протокола SNMP,которая передает все данные в открытом виде. Необходи-мо это исправить и заодно поднять уровень безопасности.Для этого вносим в файл snmpd.conf следующие строкивместо rocommunity и rwcommunity:

Стоит отметить, что опции rocommunity и rwcommunity –всего лишь оболочки вокруг более мощного набора командVACM (Version-based Access Control Module), которым мывоспользовались ранее.

Таким образом, мы сказали, что система, подвергаемаямониторингу, может принимать SNMP-запросы лишь от ма-шины с адресом 10.10.21.55, которая является сервероммониторинга, и привязали этот адрес к внутреннему именисистемы безопасности «nagios». Затем разрешили этомуимени символизировать группу MyROGroup, а заодно зак-

репили за ним право передавать SNMP-команды только спомощью версии протокола 2с. Следующей строкой созда-ли вид на определенную область SNMP-дерева. В данномслучае с помощью запросов можно просматривать все, чтолежит ниже .1 или .iso. Пользуясь этой опцией, можно ог-раничить дерево, доступное запросу до одной ветки илидаже до единственного OID. И заключительной строкой ука-зываем настройки безопасности для нашей группыMyROGroup. После этого не забываем перезапустить де-мон SNMP и проверить, как все работает.

Обратите внимание на опцию –v2c. Если все прошлонормально, выполняем ту же команду с –v1 и убеждаемся,что она не возвращает никаких сведений. Как вы, навер-ное, уже догадались, мы полностью отключили возможностьвносить извне изменения в данные, находящиеся внутринаблюдаемого объекта. Выполняем проверку того, как ра-ботает модуль check_snmp, установленный на сервереNagios. К примеру, неплохо было бы посмотреть Uptimeсистемы:

По каким-то странным причинам автор забыл включитьв него возможность работы с протоколом версии 2с. Ошиб-ка, говорящая, что эта версия не поддерживается, – не со-всем то, что мы ожидали получить, поэтому давайте возьмемв руки большой напильник и самостоятельно поправим мо-дуль check_snmp. Для этого нужно отредактировать файл/usr/ports/net-mgmt/nagios-plugins/work/nagios-plugins-1.3.1/plugins/check_snmp.c. Ищем в нем следующую строку:

и заменяем ее на:

Затем, найдя условие такого вида:

Вставляем после него вот такие строки:

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

После этого команда с ключом -P 2c должна отработать

com2sec nagios 10.10.21.55/32 InK12345group MyROGroup v2c nagiosview all included .1 80access MyROGroup "" any noauth exact all ↵↵↵↵↵

none none

# snmpwalk �m ALL -c InK12345 -v2ñ penguin ↵↵↵↵↵.iso.org.dod.internet.mgmt.mib-2.system

# /usr/local/nagios/libexec/check_snmp -H penguin ↵↵↵↵↵-o .1.3.6.1.2.1.1.3.0 -C InK12345 -P 2c

Invalid SNMP version 2c

-P, --protocol=[1|3]\n\

-P, --protocol=[1|2c|3]\n\

if (proto == NULL || (strcmp(proto,DEFAULT_PROTOCOL) == ↵↵↵↵↵0) ) { /* default protocol version */

asprintf(&proto, DEFAULT_PROTOCOL);asprintf(&authpriv, "%s%s", "-c ", community);

}

else if ( strcmp (proto, "2c") == 0 ) { ↵↵↵↵↵/* snmpv2c args */

asprintf(&proto, "%s", "2c");asprintf(&authpriv, "%s%s", "-c ", community);

}

# make install

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

7№11(24), ноябрь 2004

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

нормально. Вписываем в файл checkcommands.cfg описа-ние команды check_snmp_oid, с помощью которой будемпроводить мониторинг и вызывать модуль check_snmp.

Затем в файле hosts.cfg рассказываем о наших серве-рах.

И, конечно же, не забываем причислить их к группе хо-стов onix-servers, внеся следующие строки в файл hostgroups.cfg

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

Данный сервис показывает время работы системы с мо-мента последней перезагрузки. Для этого используется OID.iso.org.dod.internet.mgmt.mib-2.system.sysUpTime.0. Почтитакого же эффекта можно добиться с помощью .iso.org.dod.internet.mgmt.mib-2.host.hrSystem.hrSystemUptime.0. Хотятут стоит сделать маленькое примечание: второй OID по-казывает не время, прошедшее с последнего перезапускасистемы, а момент последней инициализации SNMP.

Следующим интересным для нас моментом будет сово-купность сервисов, отображающих количество занятых бло-ков разделов /, home, и совокупный процент использован-ных блоков физической и своп-памяти. Для того чтобы по-нять, где находятся необходимые сведения, посмотрите вет-ку .iso.org.dod.internet.mgmt.mib-2.host.hrStorage.hrStorageTable. Принцип анализа ветви довольно прост. В hrStorageIndex содержится список уникальных идентификаторов, опи-сывающих каждое устройство. А hrStorageType в свою оче-редь хранит типы устройств. hrStorageDesc заполнен тек-стовыми описаниями объектов. Для моей системы это выг-лядит так:

В hrStorageAllocationUnits указан размер блока для каж-дого из устройств:

Ну а hrStorageSize указывает, сколько блоков в каждомустройстве.

И наконец, самое интересное. Как вы уже, наверное,догадались, hrStorageUsed содержит данные о том, сколь-ко блоков занято на каждом из устройств.

define command{command_name check_snmp_oidcommand_line $USER1$/check_snmp -H $HOSTADDRESS$ ↵↵↵↵↵

-o $ARG1$ -C $ARG2$ -w $ARG3$ -c $ARG4$ ↵↵↵↵↵-u $ARG5$ -l "" -P $ARG6$

}

# Îïèñûâàåì øàáëîí õîñòàdefine host{name generic-hostnotifications_enabled 1event_handler_enabled 1flap_detection_enabled 1process_perf_data 1retain_status_information 1retain_nonstatus_information 1max_check_attempts 10notification_interval 120notification_period 24x7notification_options d,u,rregister 0

}define host{use generic-hosthost_name Linuxalias Standard Linux Serveraddress penguincheck_command check-host-alive

}define host{use generic-hosthost_name FreeBSDalias Standart FreeBSD Serveraddress reddaemoncheck_command check-host-alive

}

define hostgroup{hostgroup_name onix-serversalias Onix Serverscontact_groups onix-adminsmembers Linux, FreeBSD

}

# Îïèñûâàåì øàáëîí ñåðâèñàdefine service{name generic-serviceactive_checks_enabled 1passive_checks_enabled 1parallelize_check 1obsess_over_service 1check_freshness 0notifications_enabled 1event_handler_enabled 1flap_detection_enabled 1process_perf_data 1retain_status_information 1retain_nonstatus_information 1notification_interval 120notification_period 24x7notification_options w,u,c,rmax_check_attempts 3

define service{use generic-servicehost_name Linuxservice_description System Uptimeis_volatile 0check_period 24x7check_command check_snmp_oid ↵↵↵↵↵

!.1.3.6.1.2.1.1.3.0!InK12345! ""! ""! ""!2c}

hrStorageDescr.2 = STRING: Real MemoryhrStorageDescr.3 = STRING: Swap SpacehrStorageDescr.4 = STRING: /hrStorageDescr.5 = STRING: /homehrStorageDescr.6 = STRING: /proc/bus/usb

hrStorageAllocationUnits.2 = INTEGER: 1024 ByteshrStorageAllocationUnits.3 = INTEGER: 1024 ByteshrStorageAllocationUnits.4 = INTEGER: 4096 ByteshrStorageAllocationUnits.5 = INTEGER: 4096 ByteshrStorageAllocationUnits.6 = INTEGER: 1024 Bytes

hrStorageSize.2 = INTEGER: 54156hrStorageSize.3 = INTEGER: 216836hrStorageSize.4 = INTEGER: 273087hrStorageSize.5 = INTEGER: 196780hrStorageSize.6 = INTEGER: 0

hrStorageUsed.2 = INTEGER: 52564hrStorageUsed.3 = INTEGER: 11220hrStorageUsed.4 = INTEGER: 235014hrStorageUsed.5 = INTEGER: 8755hrStorageUsed.6 = INTEGER: 0

normal_check_interval 1retry_check_interval 1contact_groups onix-adminsregister 0

}

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

8

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

Теперь дело за малым: высчитать, сколько блоков со-ответствуют заполнению устройств на 80% и 90%. И затемсоздать на основе этих данных правила проверки.

В качестве примера приведем описание сервиса, пока-зывающего, как обстоят дела с заполнением корневогораздела.

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

Таким образом, мы указываем, что хотим следить засвободным местом на разделах / и home еще одним спосо-бом. Вышеуказанные строки говорят демону snmp, что мыхотим установить флаг ошибки в случае, если на разделе /занято 180 Мб, а /home заполнен на 760 Мб. Впрочем, ни-чего страшного не случится, если ограничения не устанав-ливать вовсе. Кстати, стоит отметить, что ограничение мож-но описывать не только в килобайтах, но и в процентах.Теперь интересующие нас данные находятся внутри ветви.iso.org.dod.internet.private.enterprises.ucdavis.dskTable.dskEntry.Принцип построения таблицы стандартен. ИдентификаторdskPath содержит данные об именах разделов.

dskDevice устанавливает соответствие между раздела-ми и физическими устройствами диска.

В dskMinimum dskMinPercent содержатся пороговые зна-чения для поднятия флага ошибки. Соответственно, dskTotal,dskAvail, dskUsed отображают общее, доступное и задей-ствованное пространство дисков. Следующая ветвь, назы-ваемая dskPercent, для нас наиболее интересна, так каксодержит величину заполнения дисков в процентах.

Именно ее мы и будем контролировать. Конечно, можноконтролировать состояние ветвей dskErrorFlag и dskErrorMsg.

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

Думаю, создать сервисы, выполняющие проверку ос-тальных разделов, вы сможете сами. Идем дальше. Еслимы хотим следить за загрузкой процессора, добавляем вsnmpd.conf вот это:

Этой строкой мы говорим демону, что желаем видетьстатистику нагрузки на процессор за последнюю минуту,за пять и пятнадцать минут. К сожалению, интервалы жес-тко закодированы, и изменить их невозможно. И, как обыч-но, указываем необязательные пороговые ограничения в12%, 20% и 30%, при превышении которых snmpd будетустанавливать флаг ошибки. Смотрим ветку .iso.org.dod.internet.private.enterprises.ucdavis.laTable.laEntry и понима-ем, что нам наиболее интересны подветви laLoad, laLoadInt,laLoadFloat.

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

Следующей интересной для нас особенностью являет-ся возможность запускать сторонние скрипты при получе-нии того или иного SNMP-запроса. И опять добавляем вsnmpd.conf новые строки:

Затем создаем файлы count_users.sh count_mail.sh:, сих помощью мы будем считать количество пользователей,работающих на данный момент в системе, и размер почто-вой очереди postfix.

Содержимое файла count_users.sh:

Содержимое файла count_mail.sh:

define service{use generic-servicehost_name Linuxservice_description Space on /is_volatile 0check_period 24x7check_command check_snmp_oid ↵↵↵↵↵

!.1.3.6.1.2.1.25.2.3.1.6.4! ↵↵↵↵↵InK12345!218470!245778!blocks!2c

}

disk / 180000disk /home 760000

dskPath.1 = STRING: /dskPath.2 = STRING: /home

dskDevice.1 = STRING: /dev/sda1dskDevice.2 = STRING: /dev/sda6

dskPercent.1 = INTEGER: 86dskPercent.2 = INTEGER: 4

dskErrorFlag.1 = INTEGER: 1dskErrorFlag.2 = INTEGER: 0dskErrorMsg.1 = STRING: /: less than 80% free (= 86%)dskErrorMsg.2 = STRING:

define service{use generic-servicehost_name Linuxservice_description Space on / check 2is_volatile 0check_period 24x7check_command check_snmp_oid ↵↵↵↵↵

!.1.3.6.1.4.1.2021.9.1.9.1!InK12345!80!90!%}

load 12 20 30

define service{use generic-servicehost_name Linuxservice_description CPU Load 1 minis_volatile 0check_period 24x7check_command check_snmp_oid ↵↵↵↵↵

!.1.3.6.1.4.1.2021.10.1.5.1!InK12345!60!90!%}

who | wc -lexit 0

exec users /bin/sh /usr/bin/count_users.shexec mailqueue /bin/sh /usr/bin/count_mail.sh

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

9№11(24), ноябрь 2004

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

Теперь смотрим, что у нас находится внутри ветки.iso.org.dod.internet.private.enterprises.ucdavis.extTable.extEntry.

Нас интересует extOutput, в которой находится перваястрока из того, что скрипт выводит на экран, и extResult скодом возврата скрипта, переданным командой exit. Судяпо приведенному выше списку значений, у нас в системенаходится один пользователь, а в почтовой очереди естьдва письма. Сервисы для проверки результатов работыобоих скриптов будут выглядеть так:

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

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

И создать скрипт /tmp/mytest.sh следующего содержа-ния.

В результате осмотра ветви .1.3.6.1.4.1.2021.50 можноувидеть следующие данные:

Как видите, и такой функционал нам вполне доступен.Следующая возможность, на которую хотелось бы обратитьваше внимание, – функция проверки размера файла. Итак,добавляем в snmpd.conf вот такую надпись:

тем самым указывая, что файл не должен быть более 12 Кб.Затем смотрим, что хранит в себе ветка .iso.org.dod.internet.private.enterprises.ucdavis.fileTable.fileEntry:

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

Но есть и другой путь: можно опереться на появлениекода и сообщения об ошибке в fileErrorFlag и fileErrorMsg. Ивсе же мне кажется, что это не очень удобно.

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

Этими строками мы указываем snmpd, что в системе дол-жно быть от двух до четырех процессов httpd и только одинautomount. В то же время программа csserver вообще можетбыть не запущена, но если она все же работает, то процес-сов не должно быть более двух. Если же минимальный имаксимальный пороги не указаны, то процессов может бытьсколько угодно. Давайте посмотрим, что snmpd нам скажетв ответ на такие приказания. Для этого открываем ветвь.iso.org.dod.internet.private.enterprises.ucdavis.prTable.prEntry.

mailq | tail -n 1 | cut -f5 -d " "exit 0

extNames.1 = STRING: usersextNames.2 = STRING: mailqueueextCommand.1 = STRING: /bin/sh /usr/bin /count_users.shextCommand.2 = STRING: /bin/sh / usr/bin/count_mail.shextResult.1 = INTEGER: 0extResult.2 = INTEGER: 0extOutput.1 = STRING: 1extOutput.2 = STRING: 2extErrFix.1 = INTEGER: 0extErrFix.2 = INTEGER: 0extErrFixCmd.1 = STRING:extErrFixCmd.2 = STRING:

define service{use generic-servicehost_name Linuxservice_description Usersis_volatile 0check_period 24x7check_command check_snmp_oid ↵↵↵↵↵

!.1.3.6.1.4.1.2021.8.1.101.1!InK12345!20!30!users}define service{use generic-servicehost_name Linuxservice_description Mail queueis_volatile 0check_period 24x7check_command check_snmp_oid ↵↵↵↵↵

!.1.3.6.1.4.1.2021.8.1.101.2!InK12345!40!80!messages}

execfix mailqueue /bin/sh /usr/bin/repair_mailqueue.sh

exec .1.3.6.1.4.1.2021.50 multi_line_test /bin/sh ↵↵↵↵↵/tmp/mytest.sh

echo "first line"echo "second line"exit 5

.1.3.6.1.4.1.2021.50.1.1 = INTEGER: 1

.1.3.6.1.4.1.2021.50.2.1 = STRING: "multi_line_test"

.1.3.6.1.4.1.2021.50.3.1 = STRING: "/bin/sh /tmp/mytest.sh"

.1.3.6.1.4.1.2021.50.100.1 = INTEGER: 5

.1.3.6.1.4.1.2021.50.101.1 = STRING: "first line"

.1.3.6.1.4.1.2021.50.101.2 = STRING: "second line"

.1.3.6.1.4.1.2021.50.102.1 = INTEGER: 0

.1.3.6.1.4.1.2021.50.103.1 = ""

file /tmp/tinka.txt 12

fileIndex.1 = INTEGER: 1fileName.1 = STRING: /tmp/tinka.txtfileSize.1 = INTEGER: 15 kBfileMax.1 = INTEGER: 12 kBfileErrorFlag.1 = INTEGER: true(1)fileErrorMsg.1 = STRING: /tmp/tinka.txt: ↵↵↵↵↵

size exceeds 12kb (= 15kb)

define service{use generic-servicehost_name Linuxservice_description size of /tmp/tinka.txtis_volatile 0check_period 24x7check_command check_snmp_oid ↵↵↵↵↵

!.1.3.6.1.4.1.2021.15.1.3.1!InK12345!12!20!kbytes }

proc httpd 3 6proc automount 1 1proc csserver 2

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

10

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

Надеюсь, смысл приведенных данных всем ясен. Тут,как всегда, возможно два пути для слежения: самим конт-ролировать значения из подветви prCount, либо опиратьсяна код ошибки prErrorFlag и сообщение в prErrMessage. Поаналогии с execfix можно использовать ключевое словоprocfix для описания программы, запускаемой в случае, еслис тем или иным процессом стряслось что-то неладное. Ядумаю, что на основе примеров, приведенных выше, высможете легко самостоятельно написать определения нуж-ных сервисов. Следующей интересной для нас веткой яв-ляется .iso.org.dod.internet.private.enterprises.ucdavis.memory.В ней хранятся подробные данные о состоянии оператив-ной памяти. Для моей машины эта ветвь выглядит так:

Наибольший интерес вызывают OID memTotalSwap memAvailSwap, означающие общий размер свопа и его свобод-ную часть. Затем стоит обратить внимание на memTotalRealи memAvailReal, указывающие на размер физической па-мяти. Перспективнее всего следить за memAvailReal иmemAvailSwap. Но тут есть определенные проблемы. Делов том, что исчерпание физической памяти еще не означаетдля системы каких-то ужасных последствий, все ненужноев данный момент будет складироваться в своп. Поэтому вы-водить предупреждения по поводу того, что физическая па-мять закончилась, не стоит. Сервис, следящей за этим ком-понентом системы, должен выглядеть так:

И соответственно мониторинг заполнения свопа можнореализовать так же. Но это решение, на мой взгляд, не оченьизящно. Можно сделать гораздо лучше. Давайте будем сле-дить за показателем memTotalFree, который показывает об-щее количество свободной памяти системы. Это весьма удоб-но, так как он равен сумме memAvailReal и memAvailSwap.Тут возникает некоторая проблема с нетривиальностью про-верки. Обычно ситуация обстоит так, что чем больше про-веряемая величина, тем ближе мы к критическому порогу,но сейчас все наоборот. Необходимо сказать модулю, что,чем больше памяти нам доступно, тем лучше. Поэтому сер-вис будет выглядеть так:

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

Также неплохо было бы следить за сетевыми интерфей-сами с помощью ветки .iso.org.dod.internet.mgmt.mib-2.interfaces.ifTable.ifEntry. Думаю, что примеров, приведенныхв статье, достаточно, чтобы сделать это самостоятельно.

Разобравшись с проверками сервисов, работающих че-рез snmp 2c, давайте посмотрим, как выполнить все то жесамое с помощью третьей версии протокола. Зачем нам этонужно? Все очень просто: с точки зрения безопасности snmp2с существенно лучше, чем версия 1, но, несмотря на это,в ней все же есть недостатки. Дело в том, что при ее ис-пользовании строки сообществ передаются по сети в от-крытом виде. Думаю, это не то, что нам хотелось бы полу-чить. Изумленный читатель может сказать: «Давайте со-всем откажемся от использования 2с». К сожалению, та-кой идеалистический подход не всегда возможно воплотитьв жизнь. Иногда приходится использовать именно 2с, пото-му что не во всем имеющемся оборудовании есть поддер-жка третьей версии. К тому же, настройка snmpd для рабо-ты с третьей версией snmp – дело весьма нетривиальное.Ниже я расскажу как этого добиться «малой кровью».

Итак, приступим. В основе идеологии безопасности длятретьей версии лежит понятие модуля безопасности пользо-вателей USM (User-based Security Module). Он отвечает захранение списка пользователей и их атрибутов. Соответ-ственно каждый пользователь обозначается уникальнымименем в терминах snmp, оно называется securityName. Кнему привязываются протокол аутентификации и ключ аутен-тификации, соответственно, authProtocol и authKey. Вдоба-вок к этому существует протокол шифрования privProtocolи ключ шифрования privKey. Стоит отметить, что authKey и

memIndex.0 = INTEGER: 0memErrorName.0 = STRING: swapmemTotalSwap.0 = INTEGER: 216836memAvailSwap.0 = INTEGER: 209784memTotalReal.0 = INTEGER: 54156memAvailReal.0 = INTEGER: 9320memTotalFree.0 = INTEGER: 219104memMinimumSwap.0 = INTEGER: 16000memShared.0 = INTEGER: 0memBuffer.0 = INTEGER: 5728memCached.0 = INTEGER: 13832memSwapError.0 = INTEGER: 0memSwapErrorMsg.0 = STRING:

define service{use generic-servicehost_name Linuxservice_description Physical memory Free

define service{use generic-servicehost_name Linuxservice_description Total memory Freeis_volatile 0check_period 24x7check_command check_snmp_oid ↵↵↵↵↵

!.1.3.6.1.4.1.2021.4.11.0!InK12345!20000:10000 ↵↵↵↵↵!9999:0!kbytes!2c

}

prIndex.1 = INTEGER: 1prIndex.2 = INTEGER: 2prIndex.3 = INTEGER: 3prNames.1 = STRING: httpdprNames.2 = STRING: automountprNames.3 = STRING: csserverprMin.1 = INTEGER: 3prMin.2 = INTEGER: 1prMin.3 = INTEGER: 0prMax.1 = INTEGER: 6prMax.2 = INTEGER: 1prMax.3 = INTEGER: 3prCount.1 = INTEGER: 1prCount.2 = INTEGER: 1prCount.3 = INTEGER: 0prErrorFlag.1 = INTEGER: 1prErrorFlag.2 = INTEGER: 0prErrorFlag.3 = INTEGER: 0prErrMessage.1 = STRING: Too few httpd running (# = 1)prErrMessage.2 = STRING:prErrMessage.3 = STRING:prErrFix.1 = INTEGER: 0prErrFix.2 = INTEGER: 0prErrFix.3 = INTEGER: 0prErrFixCmd.1 = STRING:prErrFixCmd.2 = STRING:prErrFixCmd.3 = STRING:

is_volatile 0check_period 24x7check_command check_snmp_oid ↵↵↵↵↵

!.1.3.6.1.4.1.2021.4.6.0!InK12345!""!""!kbytes!2c}

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

11№11(24), ноябрь 2004

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

privKey генерируются на основе пароля, переданного поль-зователем. Пароль должен содержать не менее восьми сим-волов.

Стандарт snmp версии 3 описывает три вида пакетов.Первый не подписывается и не шифруется. Второй: отправ-ляющая сторона подписывает пакет ключем authKey с по-мощью протокола authProtocol. В качестве протокола гене-рации подписи на данный момент могут выступать алго-ритмы MD5 или SHA. Третий: подписывает и плюс к этомуданные пакета могут шифроваться с помощью протоколаprivProtocol и ключа privKey. В качестве протокола шифро-вания пока можно использовать только DES.

Ознакомиться подробнее с идеями, лежащими в осно-ве USM, можно в RFC 2574.

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

Несколько раз перечитав man snmpusm, понимаем, чтосозданием легендарного первопользователя должен зани-маться демон snmpd. Ничего не скажешь, весьма сильныйход и главное – какой нечеловеческой логикой это продик-товано.

Итак, нам нужно внести в snmp такие строки:

Или их аналог с расширенным описанием VACM:

Затем перезапускаем snmpd. Пользователь initial будетсоздан автоматически. В качестве пароля ему указаноt2inKES10er, алгоритмом подписи пакетов назначаем MD5,а для шифрования данных используется DES. Создав пер-вого пользователя, мы могли бы на этом остановиться. Ноделать этого все же не стоит из соображений безопаснос-ти. Поэтому с помощью клонирования создаем новогопользователя по имени nagios.

Так как он унаследовал все настройки от initial, сразуже меняем ему пароль на что-нибудь труднозапоминаемоевроде R18nm12KDM.

Затем удаляем из snmpd.conf все упоминания о пользо-вателей initial, а также все строки с MyRWGroup и rwuser.Тем самым мы лишили пользователя initial всех прав и ото-брали у пользователя nagios возможность внесения изме-нений в данные snmp. Не забываем перезапустить демонаsnmpd, чтобы новые настройки вступили в силу. На серве-ре мониторинга для проверки выполняем команду:

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

Теперь осталось создать описание своей командыcheck_snmp_oid_v3 в файле checkcommands.cfg. С помо-щью нее мы будем проводить мониторинг и вызывать мо-дуль check_snmp.

Теперь давайте создадим сервис Total Memory Free v3для демонстрации того, как нужно использовать командуcheck_snmp_oid_v3. Записываем в services.cfg следующиестроки:

Теперь данные будут доставляться к нам в шифрован-ном виде. Напоследок стоит сказать, что все описания сер-висов, предназначенные для сервера Linux, можно скопи-ровать и, изменив имя машины, следить за FreeBSD.

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

Литература:1. Бешков А. Мониторинг Windows-серверов с помощью

Nagios. Часть 2. – Журнал «Системный администратор»,№8, август 2003 г. или http://onix.opennet.ru/monitoring/nagios_win_2.html

rwuser initialrwuser nagiosrouser nagioscreateUser initial MD5 t2inKES10er DES

group MyRWGroup usm nagiosgroup MyROGroup usm nagiosgroup MyRWGroup usm initialaccess MyRWGroup "" any noauth exact all all nonecreateUser initial MD5 t2inKES10er DES

# snmpusm -v3 -u initial -n "" -l authNoPriv -a MD5 ↵↵↵↵↵-A t2inKES10er localhost create nagios initial

# snmpusm -v3 -u nagios_user -n "" -l authNoPriv -a MD5 ↵↵↵↵↵-A t2inKES10er localhost passwd t2inKES10er R18nm12KDM

$ snmpget -v3 -u nagios -n "" -a MD5 -A R18nm12KDM ↵↵↵↵↵-x DES 10.10.21.75 sysUpTime.0

system.sysUpTime.0 = Timeticks: (71318) 0:11:53.18

$ /usr/local/nagios/libexec/check_snmp -H 10.10.21.75 ↵↵↵↵↵-o sysUpTime.0 -L authPriv -U nagios_user1 -a MD5 ↵↵↵↵↵-A R18nm12KDM -X R18nm12KDM -P 3

system.sysUpTime.0 = Timeticks: (71352) 0:11:54.10

define command{command_name check_snmp_oid_v3command_line $USER1$/check_snmp -H $HOSTADDRESS$ ↵↵↵↵↵

-o $ARG1$ -w $ARG2$ -c $ARG3$ -L $ARG4$ ↵↵↵↵↵-U $ARG5$ -a $ARG6$ -A $ARG7$ -X $ARG8$ ↵↵↵↵↵-u $ARG9$ -l "" -P $ARG10$

}

define service{use generic-servicehost_name Linuxservice_description Total memory Free v3is_volatile 0check_period 24x7check_command check_snmp_oid_v3! ↵↵↵↵↵

.1.3.6.1.4.1.2021.4.11.0!20000:10000!9000:0! ↵↵↵↵↵authPriv!nagios!MD5!R18nm12KDM!R18nm12KDM!kbytes!3

}

User successfully created.

SNMPv3 Key(s) successfully changed.

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

12

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

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

Итак, перед отделом автоматизации была поставленазадача в короткие сроки ввести в строй два новых удален-ных офиса, каждый численностью в пять-десять человек. Обаофиса и «голову» связали посредством технологий VPN водну сеть. Минимальная ширина канала между тремя точка-ми составила 256 Кбит, что вполне удовлетворило наши по-требности. В каждом из офисов был развернут дополнитель-ный контроллер домена Windows 2000, а для минимизациитрафика домен разделили на несколько сайтов. Все выше-описанное является стандартным решением, и здесь я неожидал никаких сюрпризов. Главным вопросом для нас было,как поведет себя основной инструмент работы сотрудниковорганизации – комплексная система автоматизации, приработе с которой и в пределах одной площадки хватало про-блем. Изначально ориентированная на Novell/BTRIVE 6.15после миграции сети на Windows, она работала под Windows/Pervasive.SQL 7.

После недели тестирования этого основного бизнес-при-ложения организации, оказалось, что разработчик и вовсене оставил нам выбора, так как использование встроенноготерминального режима автоматизированной системы поряду причин нас не устроило. Опять же, из-за особенностейфункционирования в качестве терминального сервера былавыбрана платформа Microsoft Windows Server. Тестированиеже решений компании Citrix мы не проводили, так как рабо-та с «родными» терминальными службами Windows нас впол-не удовлетворила, а использование надстроек только уве-личивает стоимость всей системы.

Когда с серверной частью все определилось, встал воп-рос по клиентской составляющей системы. В первую оче-редь хотелось бы снизить необходимость в администриро-вании пользовательских машин, так как постоянное присут-ствие системного администратора на удаленных площадкахне планировалось. Кроме того, желательным представлялосьуменьшить стоимость решения, которая возросла из-за необ-ходимости покупки терминальных лицензий. Также необхо-димо было учесть намерение разместить в офисах устарев-шие компьютеры класса Celeron-400 с ОЗУ от 32 до 64 Мб.

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

В роли ОС, которая будет по сети загружаться на рабо-чие станции, я выбрал Linux – что обеспечивает лицензи-онную чистоту решения (по крайней мере на сегодняшниймомент). Доступ к рабочему столу Windows 2003 долженбыл осуществляться при помощи разработки проектаwww.rdesktop.org, который стал стандартом для решенияданной задачи. В качестве же необходимых для такой заг-рузки серверов DHCP и TFTP логично было бы использо-вать уже имеющиеся в каждом сайте дополнительные кон-троллеры домена Windows 2000. Благо существуют как бес-платные реализации DHCP/TFTP под эту операционнуюсистему, так и встроенные сервера. При этом TFTP нали-чествует в рамках службы Remote Installation Services (RIS).

Сетевые карты клиентских машин, естественно, долж-ны поддерживать возможность загрузки по Etherboot/PXE.В отдельных случаях из-за несовместимости оборудованияя допускал использование загрузчика, расположенного надискете.

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

ИСПОЛЬЗОВАНИЕБЕЗДИСКОВЫХ LINUX-СТАНЦИЙС ЗАГРУЗКОЙ ПО СЕТИ

ИСПОЛЬЗОВАНИЕБЕЗДИСКОВЫХ LINUX-СТАНЦИЙС ЗАГРУЗКОЙ ПО СЕТИ

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

13№11(24), ноябрь 2004

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

Выбор реализации LinuxПри выборе варианта ОС Linux с возможностью загрузки посети в первую очередь я обратил внимание на уже готовыедистрибутивы подобной направленности со встроенным па-кетом rdesktop. Наиболее известный из них – NetStation(netstation.sourceforge.net), который застыл в виде бета-вер-сии с конца 2002 года, и его наследники: PXES (pxes.sourceforge.net), Thinstation (thinstation.sourceforge.net), и DIET-PC(diet-pc.sourceforge.net). При этом DIET-PC предназначен дляпользователей, хорошо знакомых с ОС Linux, что сразу ис-ключает его из области рассмотрения. Поскольку процеду-ра его настройки весьма кропотлива, и в DIET-PC присут-ствует достаточно много настроек, которые простому смер-тному, не Linux-гуру, никогда не пригодятся. PXES являетсянаиболее «продвинутым» с большим числом дополнитель-ных возможностей, включая собственную графическую сре-ду, что также лишнее в моем случае. В моей конфигурацииклиент, минуя промежуточные меню, должен был сразу заг-ружать удаленный рабочий стол и выходить на окно вводапароля Windows 2003 Server. Таким образом, я обратил вни-мание на оставшийся дистрибутив – Thinstation.

Кратко рассмотрим его возможности:! поддержка протоколов X, RDP, VNC, SSH, Telnet, ICA и

Tarantella;! возможность использовать браузер Firefox;! загрузка по сети при помощи Etherboot, PXE (при помо-

щи Etherboot-загрузчика или PXELinux), HDD, CD илиfloppy-диска. К сожалению, отсутствует поддержка USB-flash;

! работа на ПК класса x86-100 МГц c ОЗУ 16 Мб;! наличие pre-build образа, и возможность самостоятель-

ной сборки через веб-интерфейс;! поддержка локальных дисков, USB- и LPT-принтеров.

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

Установка и первоначальная настройкаНачнем с того, что скачаем со странички http://struktur.kemi.dtu.dk/thinstation/download, доступной по ссылке с офи-циального сайта, последний из архивов, в моем случае – этобыл Thinstation-2.0.2-prebuilt-NetBoot.zip. Архив содержит всебе все, что необходимо, включая TFTP/DHCP-серверTftpd32, который удобен при первоначальной настройке иконфигурировании. Если вы будете его использовать, то ябы порекомендовал сразу же обновить его с домашней стра-нички, где имеется более свежая версия. Кстати, Tftpd32(http://tftpd32.jounin.net) – сама по себе отличная програм-ма. Причем настолько, что даже рекомендуется Cisco длянекоторых потребностей клиентов компании.

Развернув архив, мы получаем пять директорий:! BootDisk – образ дискеты с Etherboot-загрузчиком, для

ПК, с неподдерживаемыми сетевыми картами;! BootPXE – загрузчик через PXE для эмуляции Etherboot;! BuildFiles – примеры конфигурационных файлов;! TFtp – сервер Tftpd32;! TftpdRoot – корневая директория TFTP-сервера.

Итак, первым делом запускаем самораспаковывающий-ся архив thinstation.nbi (autoextract).exe, содержащий один-единственный файл thinstation.nbi, архив сделан для того,чтобы у вас была возможность ознакомиться с «CITRIX(R)LICENSE AGREEMENT».

Теперь копируем TFtp и TftpdRoot на Windows-сервер внашем сегменте сети. В качестве такого сервера при ис-пользовании Tftpd32 может выступать любая Windows-ма-шина со статическим IP-адресом.

Допустим, мы скопировали обе директории на диск C:\.Запускаем на исполнение C:\TFtp\Tftpd32.exe. Внешний видокна программы представлен на рис. 1. Необходимо задатьпараметры сервера. Нажимаем кнопку «Settings» и пропи-сываем в качестве «Base directory» значение «C:\TftpdRoot».Далее идем на вкладку «DHCP server». Там необходимо ука-зать начальный IP-адрес, выделяемый DHCP-сервером («IPpool starting address»), размер пула адресов («Size of pool»),маску подсети («Mask»), имя файла с Etherboot-загрузчиком(«Boot file»), в нашем случае это thinstation.nbi.zpxe. Нажимаем кнопку «Save» для сохранения настро-ек и сворачиваем приложение.

Все готово для работы. Вы можете попробовать вклю-чить одну из машин с сетевой картой, поддерживающейзагрузку по протоколу PXE, не забыв выставить порядокзагрузки в BIOS станции. При включении машина должнаполучить IP-адрес из выделенного диапазона и загрузитьпо протоколу TFTP файл thinstation.nbi.zpxe. Он содержитзагрузчик, эмулирующий работу сетевой карты с поддерж-кой Etherboot. Затем управление передается загрузчику,который в свою очередь еще раз запрашивает по DHCPадрес, и загружает файл с именем, совпадающим с назва-нием файла самого загрузчика минус расширение zpxe, тоесть thinstation.nbi. Данный файл и есть образ Thinstation.Когда образ загружен, Thinstation пытается загрузить изкорневой директории TFTP-сервера конфигурационныйфайл thinstation.conf-<MAC-адрес клиента>, затем thinstation.conf-<IP-адрес клиента>. Если такие файлы найде-ны, то Thinstation объединяет их содержимое с общим кон-фигурационным файлом thinstation.conf.network, который вотличие от двух вышеперечисленных обязан присутство-вать на TFTP-сервере.

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

Ðèñóíîê 1. TFTP/DHCP-ñåðâåð Tftpd32, êîòîðûé óäîáåí ïðèïåðâîíà÷àëüíîé íàñòðîéêå

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

14

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

ной станции. Кроме того, можно объединять одним конфи-гурационным файлом целые группы IP- и MAC-адресов. Этоделается при помощи файла thinstation.hosts, имеющегоследующий формат:

В данном примере предполагается, что имеются двафайла thinstation.conf.group-hi_res и thinstation.conf.group-ssh_en.

Настройки, прописанные в первом файле, применяют-ся ко всем трем станциям, а настройки из второго – толькок компьютеру ws-oper3.

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

Клиенты с именами вида ts_<MAC-адрес> – это как разклиентские терминалы, работающие под управлениемThinstation. Клиенты с именами вида P<IP-адрес> работа-ют под управлением дистрибутива PXES, рассмотрениекоторого выходит за рамки данной статьи.

Далее я приведу простой, но вполне работоспособныйвариант конфигурационного файла с комментариями.

# HOST MAC GROUPS COMMENTSws-oper1 0002B3655065 hi_res # Îïåðàöèîíèñò ¹1ws-oper2 0002B3651075 hi_res # Îïåðàöèîíèñò ¹2ws-oper3 0002B365A021 hi_res ssh_en # Îïåðàöèîíèñò ¹3

Ðèñóíîê 2. Ñåññèè òîíêèõ êëèåíòîâ â îñíàñòêå äèñïåò÷åðàòåðìèíàëüíûõ ñëóæá

# Îïöèè ñåññèé## Ïåðâàÿ ñåññèÿ äîëæíà îáÿçàòåëüíî íà÷èíàòüñÿ ñ íîìåðà 0.# Ïðè îòñóòñòâèè íåîáõîäèìîñòè âûáîðà ñåññèè, íàïðèìåð,# êîãäà âû èñïîëüçóåòå òîëüêî rdesktop, ìîæíî ñíÿòü# êîììåíòàðèé ñî ñëåäóþùåãî ïàðàìåòðà, è èñêëþ÷èòü ìåíþ# âûáîðà ñåññèé.#AUTOSTART=OnSESSION_0_TITLE="Windows 2003 terminal server ↵↵↵↵↵

В заключение статьи, хочу сказать, что после отладкиработы с терминальными клиентами, лучше всего передатьфункции TFTP- и DHCP-серверов программному обеспече-нию, способному работать в режиме службы на WindowsNT/2000/2003/XP, например, как я уже говорил, «родным»службам Windows, либо воспользоваться соответствующи-ми сервисами любой другой операционной системы.

Кроме того, на сайте проекта thinstation.sourceforge.netпри помощи веб-интерфейса вы можете самостоятельноперекомпилировать образ Thinstation без загрузки исход-ных кодов, включив какие-либо отсутствующие в prebuildобразе функции, например браузер, или исключив ненуж-ные модули.

(16 bit color depth)"SESSION_0_TYPE=rdesktopSESSION_0_RDESKTOP_SERVER=192.168.0.1SESSION_0_RDESKTOP_OPTIONS="-u Administrator ↵↵↵↵↵

-p password -a 16"SESSION_1_TITLE="VNC server"SESSION_1_TYPE=vncviewerSESSION_1_VNCVIEWER_SERVER=192.168.0.2SESSION_2_TITLE="Telnet server"SESSION_2_TYPE=telnetSESSION_2_TELNET_SERVER=192.168.0.3SESSION_3_TITLE="SSH server"SESSION_3_TYPE=sshSESSION_3_SSH_SERVER=192.168.0.4# Îáùèå îïöèè## Ðàñêëàäêà êëàâèàòóðû.  ñëó÷àå ðàáîòû ñ rdesktop îíà# ðîëè íå èãðàåòKEYBOARD_MAP=en_us# Îïöèè XServer#SCREEN_RESOLUTION="1024x768"SCREEN_COLOR_DEPTH="16"SCREEN_HORIZSYNC="30-64"SCREEN_VERTREFRESH="56-87"MOUSE_RESOLUTION=100# Îïöèè ïå÷àòè#PRINTER_0_NAME=usbPRINTER_0_DEVICE=/dev/usb/lp0PRINTER_2_TYPE=U

Ðèñóíîê 3. Ìåíþ Thincstation

Ðèñóíîê 4. Ñàìîñòîÿòåëüíîå ïîñòðîåíèå îáðàçà ÷åðåç âåá-èíòåðôåéñ TS-O-Matic

Page 17: 024 Системный Администратор 11 2004
Page 18: 024 Системный Администратор 11 2004

16

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

резервированные слова (pass, block, in, out и т. д.). Привы-кайте сразу использовать макросы, это хороший стиль.Следование ему в дальнейшем позволит избежать многихпроблем с пониманием работы и настройки фильтра.

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

Таблицы также могут использоваться совместно с scrub(нормализация трафика), rdr (перенаправление пакетов), nat(трансляция адресов). И могут быть определены следую-щими способами:! Вручную. Постоянные таблицы могут быть созданы ко-

мандой add или replace утилиты pfctl до или после заг-рузки набора правил.

! pf.conf – для описания таблиц в файле используется ди-ректива table. Таблица, инициализированная с пустымлистом { }, будет очищена при загрузке.

Таблицы бывают двух видов:! persist – этот флаг заставляет ядро хранить содержа-

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

! const – этот флаг запрещает изменять содержание таб-лицы после того, как она была создана.

Например:

Данный фрагмент конфигурационного файла создаст2 таблицы. В первой, <localz>, будут содержаться адресанаших внутренних сетей, а <badhosts> будет пустой. Таб-лица <localz> не может быть изменена или дополнена, т.кпри создании использовался флаг const.

Правила фильтрации отбрасывают любые пакеты, при-ходящие на внешний интерфейс ($ext_if) от хостов из таб-лицы <badhosts>, и пропускающие любые пакеты на внут-реннем интерфейсе ($int_if), приходящие от хостов из таб-лицы <localz>.

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

Зачем вообще нужны пакетные фильтры? Любой из вас,наверное, знает о неприятностях, существующих в просто-рах сети, и не раз сталкивался с ними. Читая «HackingExposed 3th edition», я наткнулся на фразу: «2.13 AM, Doyou know who is on your network?». Да, именно так, ведь вы,будучи администратором сети, не можете постоянно сле-дить за тем, как и что проходит через вашу сеть. Однако выможете контролировать данный процесс, используя пакет-ные фильтры. Итак, прошу любить и жаловать – OpenBSD’sPacket Filter (PF).

Конфигурация находится в файле /etc/pf.conf. Однакофильтр отключен по умолчанию в только что установлен-ном дистрибутиве, и существует 2 способа включить его:! Отредактировать файл /etc/rc.conf, изменив значение

pf=NO на pf=YES, также стоит сразу проверить путь кконфигурационному файлу в директиве pf_rules=/etc/pf.conf и перезагрузить систему.

! Дать команду pfctl –e, которая заставит ядро включитьфильтр с пустыми настройками и без перезагрузки сис-темы.

Приступаем к конфигурации фильтра. Что же он уме-ет? Практически все. PF является очень серьезной альтер-нативой таким монстрам, как Checkpoint Firewall и SunScreen, однако полностью бесплатен.

Итак, PF имеет следующие возможности.

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

Например, определение макросов:

И их использование:

В качестве имени макроса не могут использоваться за-

ПАКЕТНЫЙ ФИЛЬТР OpenBSD

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

ext_if = �fxp0�external_addr = �{ 192.168.0.13/32, 192.168.0.113/32 }�

pass in on $ext_if from any to $external_addr keep statepass out on $ext_if from $external_addr to any port 1337 ↵↵↵↵↵

keep state

table <localz> const �{ 192.168.0.0/24, 192.186.13.0/24 }�table <badhosts> persistblock in quick log on $ext_if from <badhosts> to anypass in on $int_if from <localz> to $internal_addr keep state

1 Предыдущие статьи автора: «Введение в OpenBSD», №6, 2003 г., «OpenBSD. Первые шаги», №8, 2003 г.

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

17№11(24), ноябрь 2004

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

Теперь добавим в таблицу <badhosts> хост с адресом81.146.13.16, и все пакеты от данного хоста будут отверг-нуты. Таблицу <badhosts> лучше иметь всегда, т.к. в слу-чае чего – это очень быстрый способ отвергнуть то, чтоможет причинить боль вашей сети.

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

Файлы /etc/pf/spam и /etc/pf/openrelay содержат списокIP-адресов в формате:

Допускается использование FQDN вместо IP-адреса. Пе-ред занесением в таблицу имя будет переведено в IP-ад-рес с помощью функции gethostbyname().

Stateful InspectionПрошу внимательно прочитать данный параграф, в нем япопытаюсь дать базовые понятия о Stateful Inspection – за-чем это надо и почему полезно.

State – «состояние, положение» в переводе с английс-кого. PF Stateful – пакетный фильтр, а это означает, что онотслеживает состояние соединения. Вместо того чтобы про-пускать весь трафик, например, на порт 25 через все ин-станции (читай фильтрацию) легче пропустить первый па-кет и затем просто следить за соединением. Фильтр не сор-тирует трафик – он уже предупрежден об этом соединениии значит, просто следит за его состоянием.

Если пакет попадает под pass … keep state, фильтр со-здает state для этого соединения и автоматически пропус-кает весь трафик, принадлежащий данному соединению.

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

Это дает некоторые преимущества. Сравнение пакетас таблицей states подразумевает проверку его sequence но-мера. Если номер вне диапазона ограниченного окна – па-кет будет отброшен. Это позволяет избежать атак с подме-ной адреса (spoofed attacks).

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

Использовать Stateful Inspection, еще раз напомню, по-зволяет директива keep state.

Например:

Это основные понятия о Statetul Inspection.Теперь давайте рассмотрим дополнительные настрой-

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

set timeout <option>, где <option>:! interval – интервал перед удалением истекших (expired)

state и фрагментов.! frag – секунды перед тем, как неассемблированный па-

кет будет помечен как истекший.! sc.track – время, в течение которого адрес отправителя

будет продолжать отслеживаться, даже после того какпоследнее «состояние» для этого адреса будет оконче-но.

! tcp.first – «состояние» после первого пакета.! tcp.opening – «состояние» перед тем, как удаленный хост

пошлет первый пакет.! tcp.estabished – «состояние» для TCP Three Way Hand

shake (установленного соединения).! tcp.finwait – «состояние» после того, как оба хоста об-

менялись пакетами с установлеными FIN-флагами исоединение считается закрытым.

! tcp.closed – «состояние» после того, как один из хостовпосылает пакет с флагом RST.

Протоколы ICMP и UDP настраиваются так же, как и TCP,только с гораздо меньшим набором states.! udp.first – «состояние» после первого пришедшего па-

кета.! udp.single – «состояние», если удаленный хост послал

больше чем один пакет, а хост назначения не послал вответ ни одного.

! udp.multiple – «состояние» после того, как оба хоста по-слали пакеты.

! icmp.first – «состояние» после первого пришедшего па-кета.

! icmp.error – state на любое сообщение об ошибке, воз-вращенное ICMP-прокотолом.

Любые другие протоколы могут настраиваться так же,но используя:! other.first;! other.sigle;! other.multiple.

Время timeout может изменяться в зависимости от коли-чества state в той или иной группе, а также от нагрузки насеть, за это отвечают параметры adaptive.start и adaptive.end.! adaptive.start – когда количество «состояний» достига-

ет данного порога, все timeout начинают изменять своизначения по формуле:

! adaptive.end – когда количество «состояний» достигаетданного порога, все timeout-значения обнуляются и уда-ляют за собой все «состояния».

table <spam> persts file �/etc/pf/spam� file �/etc/pf/openrelays�block from <spam> to any port 25

/etc/pf/spam204.168.0.13213.145.168.2/etc/openrelay213.146.16.0/24166.15.13.5/28

block allpass out proto tcp from any to any flags S/SA keep statepass in proto tcp from any to any port 25 flags S/SA keep state

(adaptive.end � number of states) /(adaptive.end � adaprive.start)

# pfctl �t badhosts �T add 81.146.13.16

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

18

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

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

Например:

Как только таблица будет содержать 9000 state, значе-ния timeout снизятся до 50% (tcp.first 60, tcp.established43200).

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

set loginterface – опция, которая позволяет указать, длякакого интерфейса вы будете получать статистику по ко-манде.

Например, у меня статистика выглядит так:

Идем дальше:set limit – позволяет установить жесткое ограничение на

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

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

устанавливает максимальное значение для количества эле-ментов, используемых для «fragment reassembly», генери-руется при помощи scrub.

число IP-адресов, для которых будут создаваться «состоя-ния». Используется опять же для тонкой настройки фильт-ра, генерируется sticky-address и source-track опциями вправилах.

Наконец, все это можно обьединить в одну строчку:

set optimization – опция, которая позволяет оптимизиро-вать работу вашего фильтра для сетей следующего типа:! normal – обычная сеть, подходит для большинства се-

тей.! high-latency – соединение с большими обьемами трафи-

ка (например, спутниковое).! satellite – синоним для high-latency.! aggressive – аргессивный режим, позволяет очень силь-

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

! conservative – обратное от aggressive. Соотвественногрузим больше – живем дольше.

Я предпочитаю использовать на всех довольно загру-женных серверах (порядка 150 Гб трафика в день на каж-дом) режим aggressive, в то время как в обычных сетях, ко-нечно же, я использую normal.

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

set block-policy – определить, каким же будет ответ филь-тра для действия block в правилах.! drop – пакет просто отбрасывается.! return – фильтр ответит пакетом с флагом RST для TCP

или же пакетом ICMP UNREACHEBLE для UDP, и всеостальные пакеты будут просто отброшены.

set require-order – определить порядок обслуживания.По умолчанию фильтр пропускает пакет по следующей це-почке: Options →→→→→ Normalization →→→→→ Queueing →→→→→ Translation →→→→→Filtering. То есть сначала применяются настройки для филь-тра, потом нормализация трафика, затем распределениепо очередям, дальше трансляция адреса и, наконец, самафильтрация.

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

set fingerprints – указать системе, где находится файл сопределениями отпечатков (fingerprints) для различных опе-рационных систем. Ну где вы еще видели пакетный фильтр,который умеет пропускать наружу или внутрь пакеты, при-ходящие от Linux, а от Windows 2003 отбрасывать? Мелочь,а очень приятно. Например:

set limit states 20000

set limit frags 20000

set limit scr-nodes 2000

set limit { states 20000, frags 20000, src-nodes 2000 }set timeout tcp.first 120set timeout tcp.established 86400set timeout { adaptive.start 6000, adaptive.end 12000 }set limit states 10000

# pfctl -s i

Status: Enabled for 0 days 04:16:28 Debug: Urgent

Hostid: 0xd5f48ad7

Interface Stats for em1 IPv4 IPv6

Bytes In 219620287 72

Bytes Out 62229416 352

Packets In

Passed 759343 0

Blocked 1273 1

Packets Out

Passed 807867 2

Blocked 3 3

State Table Total Rate

current entries 344

searches 3286659 213.6/s

inserts 37555 2.4/s

removals 37211 2.4/s

Counters

match 182069 11.8/s

bad-offset 0 0.0/s

fragment 0 0.0/s

short 0 0.0/s

normalize 0 0.0/s

memory 0 0.0/s

bad-timestamp 0 0.0/s

set fingerprints "/etc/pf.os.devel"

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

19№11(24), ноябрь 2004

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

set debug – уровень дебага для фильтра.Опции:

! none – никаких сообщений;! urgent – сообщения только для серьезных ошибок;! misc – для различных ошибок;! loud – для всего подряд.

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

scrub – директива, отвечающая за нормализацию тра-фика.

Дополнительные параметры:! no-df – убирает флаг «Don’t fragment» из заголовка па-

кета. Позволяет избавить вашу сеть от проблем со спе-циально засланными пакетами огромного размера.

! min-ttl <number> – меняет минимальное значение TTLдля IP-пакета.

! max-mss <number> – меняет максимальное значениеMSS для TCP-пакета.

! random-id – меняет IP identification-поле в заголовке па-кета для защиты TCP-соединения от вторжения мето-дом подбора значения, передаваемого в данном поле,применяется только к исходящим соединениям.

! fragment reassemble – позволяет держать в памяти фраг-менты пакетов до того момента, пока пакет не будет пол-ностью составлен. Гарантирует вам отсутствие лишне-го трафика и нагрузки на сеть.

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

! fragment drop-ovl – то же самое, что и предыдущее, раз-ница лишь в том, что одинаковые фрагменты, пришед-ние по какой-либо ошибке, будут отброшены фильтром.

! reassemble tcp – нормализация TCP-соединений. Допол-нительные возможности – ttl, timeout modulation, extendedPAWS checks. Данные темы я рассмотрю в следующихстатьях, т.к это относится непосредственно к протоко-лу, а не к пакетному фильтру.

Например:

и все, фильтр сам подберет оптимальные параметры и раз-берется со всеми потенциально опасными пакетами.

Распределение по очередямВ этой статье я не буду описывать возможности PF при ра-боте с контролем полосы пропускания, об этом в следую-щих статьях. Скажу только, что в фильтр встроен ALTQ имеханизмы cbq, priq, hfsc.

NAT – Network Address Translation – трансляция адре-сов. Определяет, как адреса будут транслироваться илиперенаправляться относительно других адресов.

Фильтр позволяет осуществить:

! binat – полную двухстороннюю замену между внутрен-ним и внешним IP-блоком;

! nat – обычную трансляцию;! rdr – пакет перенаправляется на любой порт и любой

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

Пример:

Фильтрация пакетовФильтрация протекает стандартно – создаются правила.

Правила могут иметь 2 результата:! block – пакет будет отброшен, используя следующие спо-

собы:! drop – пакет просто удаляется и никаких данных в

ответ не посылается.! return-rst – только для TCP-пакетов, отсылается пакет

с флагом RST, который прекращает соединение не-медленно.

! return-icmp (return-icmp6) – возвращается сообщениеICMP UNREACHABLE, однако данное значение мож-но переопределить любым кодом ошибки ICMP-про-токола.

! return – автоматически TCP RST будет возвращен дляTCP-пакетов и ICMP UNREACHABLE для UDP- и дру-гих протоколов.

! pass – пакет будет пропущен фильтром.

Если ни одно правило не подходит, то пакет будет про-пущен.

Итак, параметры фильтрации:! in или out – пакет идет к нам или от нас соотвественно.

Если не определено, то считается, что направление двух-стороннее.

! log – записывать информацию о пакетах, однако будутзаписаны только пакеты, которые попадают в «состоя-ния».

! log-all – записывать информацию о всех приходящих па-кетах, независимо от того, попал он в state или нет.

! quick – если пакет попадает под это правило, то даль-нейшие правила не применяются. Полезно, например,использовать с таблицей <badhosts>.

! on <interface> – правила применяются только в случае,если пакет идет с указанного интерфейса.

! proto <protocol> – правила применяются только к паке-там данного протокола. Например, ICMP, TCP, UDP. Пол-ный список протоколов находится в /etc/protocols.

Примерно понятно? Откуда, с какого порта, куда, накакой порт.

Опции следующие:! any – любой адрес.

scrub in all

rdr on em1 inet proto tcp to port 80 -> $web_server port 80

from <source> port <sourceport> to <dest> port <destport>

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

20

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

! no route – адреса, которые вне таблицы роутинга.! <table> – адреса из таблицы «table».

Порты могут указываться с использованием стандарт-ных операторов (=, !=, <, <=, >, >=, :, ><, <>).

! flags <a>/<b> | <b> – данные правила применяются толь-ко для пакетов с установленными флагами <a> передфлагами <b>. Флаги F(IN), S(YN), R(ST), P(USH), A(CK),(U)RG, E(CE), C(W)R.

Комбинировать флаги можно по-разному, однако опытпоказывает, что оптимальным является сочетание flags S/SA. Это значит, что перед тем как отправлять пакеты с фла-гами SYN+ACK (соединение установлено), хост обязан от-править пакет с флагом SYN. Данный набор идеален дляобычных TCP/IP-сетей, где не проводят никаких сетевых эк-спериментов, а просто потихонечку выкачивают весь Ин-тернет к себе на жесткие диски.

Утилита управленияпакетным фильтром pfctlPfctl – довольно мощное средство, предоставляемое вамдля управления фильтром. И, кстати, единственное.

Используется для выполнения следующих операций:! -e – включить фильтр.! -d – выключить фильтр (статистика по pfctl –s i обнуля-

ется).! -F modifier – обнулить значения для:

! nat – таблицы трансляций;! queue – очередей;! rules – правил фильтрации;! state – «состояний»;! Sources – таблицы отслеживания адресов отправи-

телей;! info – статистики;! Tables – таблиц;! osfp – отпечатков операционных систем;! all – очистить все вышеперечисленное.

! -f file – путь к конфигурационному файлу.! -i interface – правила будут применены только к указан-

ному интерфейсу.! -o – включить «оптимизатор» для правил. Новая воз-

можность фильтра позволяет:! удалить повторяющиеся правила;! удалить правила, которые являются частью другого

правила;! скомбинировать разные правила в таблицу с общи-

ми частями;! переопределить порядок правил для улучшения

фильтрации.! -s modifier – то же самое, что и -F, только не обнуляет, а

показывает информацию, modifiers – все то же.! -T command – используется для управления таблица-

ми:! kill – удалить таблицу;! flush – очистить таблицу;! add – добавить один или несколько хостов в таблицу;! replace – заменить адрес;

! show – показать хосты в таблице;! test – проверить, попадает ли данный адрес в таблицу;! zero – обнулить статистику таблицы;! load – загрузить таблицы только из файла конфигу-

рации. Обычно используется так:

! -t указывает имя таблицы, в которой обрабатываютсякоманды для -T.

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

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

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

# pfctl �T load �f /etc/pf.conf

ext_if="{ rl0 }"external_addr="{ 192.168.0.13/32, 192.168.0.113/32 }"allowed_tcps = "{ 22, 25, 80 }"allowed_udps="53"insecure_tcps="{ 21, 53, 110 }"#insecure_udps=insecure_tcp_hosts = "{ 192.168.9.13/32, 192.168.13.13/32 }"#insecure_udp_hostsset timeout { interval 30, frag 10 }set timeout { tcp.first 120, tcp.opening 30, ↵↵↵↵↵

tcp.established 86400 }set timeout { tcp.closing 900, tcp.finwait 45, ↵↵↵↵↵

tcp.closed 90 }set timeout { udp.first 60, udp.single 30, udp.multiple 60 }set timeout { icmp.first 20, icmp.error 10 }set timeout { other.first 60, other.single 30, ↵↵↵↵↵

other.multiple 60 }set limit { states 10000, frags 5000 }set loginterface rl0set optimization normalset block-policy dropset require-order yesscrub in alltable <spamd> persisttable <spamd-white> persistrdr pass inet proto tcp from <spamd> to ↵↵↵↵↵

any port smtp -> 127.0.0.1 port 8025rdr pass inet proto tcp from !<spamd-white> to ↵↵↵↵↵

any port smtp -> 127.0.0.1 port 8025block in log allpass out proto { tcp, udp, icmp } all keep statepass in on lo0 allpass out on lo0 allpass in inet proto icmp all icmp-type echoreq keep statepass in on $ext_if proto tcp from any to ↵↵↵↵↵

$ext_if port $allowed_tcps flags S/SA keep statepass in on $ext_if proto udp from any to ↵↵↵↵↵

$ext_if port $allowed_udps keep statepass in on $ext_if proto tcp from $insecure_tcp_hosts to ↵↵↵↵↵

$ext_if port $insecure_tcps flags S/SA keep statepass in on $ext_if proto tcp from any to ↵↵↵↵↵

any port > 49151 keep state

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

21№11(24), ноябрь 2004

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

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

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

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

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

туальных машин, было принято решение использовать ужесуществующие и «проверенные» тестовые пакеты. В каче-стве основы для методики проведения тестов использова-лись Linux Benchmarking Toolkit (LBT) и Scalable Test Platform(STP), которые по необходимости дополнялись специфич-ными тестами.

В итоге тестируемые системы были изучены при помо-щи следующих тестовых пакетов:! Компиляция ядра Linux 2.4.27 (стандартная конфигура-

ция).! lm_bench 3.0_alpha3.! nbench 2.2.1.! ttcp 1.12.! tiobench-0.3.3-r1.! bonnie++ 1.93c.

Этот набор включает как синтетические тесты, измеря-ющие производительность основных подсистем (целочис-ленная и плавающая арифметика, производительность под-системы памяти и жесткого диска, операции ввода-выводаи т. д.), так и тесты приложений (компиляция ядра). Болееподробно с методикой тестирования в рамках LBT можноознакомиться на странице http://www.tldp.org/HOWTO/Benchmarking-HOWTO-3.html.

Тесты выполнялись на компьютере следующей конфи-гурации:! Процессор – AMD Duron XP 1800 МГц.! Материнская плата – ECS K7S6A (SIS 745).! ОЗУ – DDR SDRAM 512 Мб.! Память, выделяемая гостевой ОС – 128 Мб.! Жесткий диск Samsung SP0802Т (для основной ОС).! Жесткий диск Samsung SV0411N (для тестируемых си-

стем).! Сетевая плата Intel PRO 100VE.

ВИРТУАЛЬНЫЕ ВОЙНЫСравнительное тестированиеVMWare Workstation и Cooperative Linux

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

There are three kinds of lies:lies, damned lies and benchmarks1

1 «В компьютерном мире есть три вида лжи: ложь, наглая ложь и тесты производительности». (c) Бенжамин Дизраэли, Марк Твен и

компьютерное сообщество.

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

22

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

Следует отметить, что ввиду архитектурных особенно-стей при тестах coLinux использовалось ядро Linux, моди-фицированное патчами coLinux (описание архитектурыcoLinux можно найти в статье [1]). Для VMWare и «чистой»системы использовалось ядро 2.4.27, собранное в конфи-гурации по умолчанию.

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

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

Итак:! VMWare Workstation – коммерческий продукт представ-

ляет собой типичную виртуальную машину. Для «госте-вой» ОС VMWare предоставляет «известный» аппарат-ный интерфейс (chipset – Intel 440BX, LAN – AMD PCnet32и т. д.). Это позволяет запускать в виртуальной машинепрактически все известные ОС, работающие на эмули-руемом оборудовании. (DOS, Windows, Linux, Solaris,FreeBSD, NetWare).

! Cooperative Linux – Open Source продукт, распространя-емый по лицензии GPL. В его состав входит патч Linux-ядра, позволяющий запустить ядро ОС Linux из Windows.В качестве гостевой ОС может выступать только Linux,причем ядро должно быть соответствующим образом«пропатчено». Так, используемое в coLinux ядро не ра-ботает с оборудованием в привычном для нас понима-нии: оно не поддерживает Plug&Play, ACPI, PCI, видео извуковые карты, жесткие диски, USB и т. д. Работа совсем жизненно важным оборудованием производитсячерез специальные драйверы (Cooperative PIC, CoLinuxBlock Device, WinPCAP, TAP), работающие с оборудова-нием через драйверы Windows.

У каждого из этих подходов есть свои «за» и «против».Так, для того чтобы запустить ОС в VMWare, не требуетсяприкладывать практически никаких усилий. С другой сто-роны, для запуска существующего Linux из coLinux, при про-чих равных, придется как минимум пересобрать ядро с пат-чами coLinux. Кроме того, coLinux не поддерживает такихвещей, как «прямая работа с USB-устройствами», видео-карты и оборудование вообще. И если с USB-устройства-ми все-таки можно работать (через интерфейс блочныхустройств), то о запуске X-сервера непосредственно наcoLinux можно забыть. Конечно, в качестве X-cервера мож-но использовать какой-нибудь Cygwin/X, XWin-PRO, Mi-Xили HumningBird Exceed, установленный на Windows. Од-нако мой опыт работы с Windows X-серверами показал, чтотакое решение на данный момент слабо пригодно для ежед-невного использования – уж очень низка производитель-ность X-приложений. Справедливости ради нужно сказать,что субъективная скорость работы X-сервера в VMWareтоже далека от совершенства. Однако, безусловно, этотвопрос требует дальнейшего изучения, которое выходит зарамки данной статьи.

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

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

Производительность процессораМногие пользователи Linux-систем для определения про-изводительности процессора используют BogoMIPS – внут-реннюю переменную ядра, косвенно отражающую скоростьработы процессора. Сами разработчики ядра утверждают,что BogoMIPS не является показателем производительно-сти процессора и относиться к нему как тесту сколь-нибудьсерьезно нельзя. Тесты рассматриваемых сегодня системэто только подтверждают: на всех виртуальных машинахчисло BogoMIPS абсолютно одинаково – 3696. Ну что же,давайте посмотрим, что скажут тестовые пакеты.

nbench – данный пакет измеряет, во сколько раз пока-затели производительности данной системы превосходятэталонную (Pentium-90 и K6-233). Результатом его работыявляется набор индексов производительности подсистемыпамяти, целочисленных операций и операций с плавающейточкой. Тест запускался с параметрами по умолчанию.

В целях экономии места приведены данные относитель-но эталона K6-233 (для Pentium-90 ситуация выглядит ана-логично) (см. рис. 1).

Что же, процессор, он и есть процессор. Все три рас-сматриваемые системы идут практически вровень.

Ðèñóíîê 1

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

23№11(24), ноябрь 2004

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

Подсистема памятиДля измерения производительности подсистемы памяти ис-пользовался низкоуровневый пакет синтетических тестовlm_bench. В состав данного пакета входит несколько ути-лит, измеряющих производительность базовых операций(чтение, запись, копирование, произвольное чтение и т. д.)применительно к различным компонентам ОС (подсистемапамяти, tcp, pipes, sockets и т. д.).

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

Для каждой машины измерялась скорость чтения (rd),записи (wr) и копирования (cp). Для тестирования в услови-ях многопоточности тест на каждой машине запускался длятрех параметров P – 1, 10 и 50. (Так как расхождение резуль-татов для 1 и 50 потоков составило менее 1%, на диаграммеприводится усредненное значение всех трех экспериментов).

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

Дисковая подсистемаДля тестирования дисковой подсистемы использовался вто-рой жесткий диск, разбитый на два раздела. Первый раз-дел был отформатирован в файловую систему ext2 (3 Гб),на которую был записан Gentoo-Linux из образа, взятого ссайта coLinux. Этот раздел использовался при тестирова-нии Linux, VMWare и coLinux (в тестах обозначена как«*_part»). Второй раздел был отформатирован в ntfs (10 Гб)и использовался для измерения производительности дис-ковой подсистемы coLinux и VMWare в случае, если образфайловой системы хранится в виде файла. При проведе-нии тестов в Linux добавлялась поддержка чипсета SIS5513,в VMWare – чипсета PIIX. В обоих случаях при тестирова-нии были включены режим DMA и 32-битный режим рабо-ты с диском. Виртуальный диск в файл-образе в тесте сVMWare подключался к интерфейсу IDE.

В организации дисковых подсистем наших подопытныхесть некоторые отличия. Как было отмечено выше, VMWare –типичный представитель виртуальных машин, и дисковаяподсистема в ней реализована соответствующим образом,

а именно эмуляцией контроллера IDE чипсета Intel i440BX.С coLinux же ситуация обстоит несколько иначе: он не ра-ботает с устройствами напрямую (ядро собирается без под-держки шины PCI и соответственно без контроллера IDE).Диск эмулируется специальным драйвером блочных уст-ройств, работающих с Windows-демоном coLinux. По этойпричине было принято решение в пользу измерения произ-водительности диска не низкоуровневыми утилитами (на-пример, hdparm), а измерением скорости работы с файло-вой системой. Однако для того, чтобы уменьшить влияниефайловой системы на результаты тестов, использоваласьнежурналируемая (и соответственно более быстрая) фай-ловая система ext2fs.

При построении «виртуальной» системы можно исполь-зовать два основных подхода:! создать образ root-файловой системы в файле на су-

ществующем ntfs- или fat-разделе;! создать (или использовать уже существующий) ext2-

раздел и работать с ним напрямую.

В первом случае на производительность дисковых опе-раций в Linux накладывается дополнительное влияние фай-ловой системы (скорость доступа, фрагментация и т. д.) иее драйвера. Второй случай этих проблем лишен, поэтомупроизводительность «виртуальных» систем на отдельномразделе должна быть выше. Итак, перейдем к первому те-сту – последовательное чтение блока данных. В данном те-сте с диска последовательно считывается файл размером256 Мб (блоками по 4 Кб). Для имитирования ситуации мно-гозадачности тест проводится для 1, 2, 4 и 8 потоков.

Быстрее всех с диском работает «чистый» Linux, затемидут VMWare и coLinux, работающие с выделенным разде-лом. В случае одного потока производительность vmwareвыше coLinux, однако с увеличением количества потоковcoLinux несколько вырывается вперед. Медленнее всего ра-ботают VMWare и coLinux, использующие образ root-фай-ловой системы на существующем разделе, хотя VMWareвсе же показывает чуть более высокую производительность(см. рис .4).

При произвольном чтении ситуация несколько меняет-ся. Явно лидирует «чистый» Linux, все виртуальные маши-ны показывают примерно одинаковую и достаточно низкуюскорость.

# bw_mem -P 1 -W 1 1024K rd|wr|cp

Ðèñóíîê 2

Ðèñóíîê 3

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

24

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

В следующем тесте измеряется скорость последова-тельной записи на диск.

«Чистый» Linux, как всегда, впереди. За ним идут coLinuxи VMWare в различных конфигурациях дисковой подсисте-мы. С увеличением количества потоков производительностьвсех систем сравнивается.

Тест произвольной записи:

А вот и первая неожиданность: скорость записи у coLinuxи VMWare оказалась больше, чем у «чистого» Linux. Причи-ной этому, скорее всего, является кэширование обращенийк диску, производимое ОС Windows. Для проверки этой ги-потезы проведем тест с помощью другой утилиты – bonnie++(sequential output, per block, size 300 Мб) (см. рис. 7).

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

Производительность TCP/IPКак VMWare, так и coLinux поддерживают различные типыорганизации взаимодействия между реальной и виртуаль-ной машинами. Основными являются bridged и NAT (болееподробное описание можно найти в статье [1]). Для получе-ния более полного представления об обоих исследуемыхвиртуальных системах тестирование каждой их них прово-дилось как в режиме bridged, так и NAT.

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

Причем крайне желательно, чтобы такой партнер былзаведомо быстрее, при этом он не будет являться узкимместом и его производительность не окажет существенно-го влияния на производительность измеряемой системы. Вроли такого партнера в данном тесте использовался заве-домо более быстрый компьютер – Pentium-4 – 2.4 ГГц (се-тевой интерфейс Intel PRO 100), также работающий под уп-равлением Linux (дистрибутив Gentoo).

В тестах использовался пакет ttcp, измеряющий произ-водительность TCP- и UDP-передач. Тест запускался 5 раз,в качестве результата приводится среднее значение.

Первыми в данном тесте пришли Linux и VMWare в ре-жиме bridged. Их скорость (91 Мбит/с) оказалась близка кмаксимальной теоретически достижимой. На третьем мес-те оказался coLinux в режиме NAT (скорость составила око-ло 42 Мбит/с). Самыми медленными оказались coLinux врежиме bridged и VMWare в режиме NAT.

Ðèñóíîê 4

Ðèñóíîê 5

Ðèñóíîê 6

Ðèñóíîê 7

Ðèñóíîê 8

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

25№11(24), ноябрь 2004

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

Быстрее всех с задачей справился «чистый» Linux – 6минут и 5 секунд. Вторым финишировал coLinux – 6 минут32 секунды. На последнем месте (с достаточно большим от-рывом) оказалась VMWare Workstation– 9 минут 13 секунд.

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

Ethernet. Если же вам необходим полноценный 100 Мбитсетевой интерфейс в виртуальном Linux, то следует обра-тить внимание на VMWare Workstation. Разработчики bridged-драйвера VMWare действительно поработали на славу, обес-печив производительность, практически не уступающую «чи-стой» Linux-системе. Производительность сетевой подсис-темы coLinux можно назвать приемлемой только в режимеNAT. В режимах coLinux-bridged и VMWare-NAT «серьезно»использовать сеть, скорее всего, не получится – уж больнонизка производительность.

И напоследок позвольте сказать еще несколько слов.Решение о том, использовать ту или иную систему или нет,всегда должно приниматься с учетом условий и реалий ре-шаемой задачи, главное при этом не забывать, что «Thereare three kinds of lies: lies, damned lies and benchmarks».

Литература, ссылки:1. Платов М. Знакомство с Cooperative Linux. – Журнал

«Системный администратор», №10, октябрь 2004 г.2. LBT: http://www.tldp.org/HOWTO/Benchmarking-HOWTO-

3.html.3. STP: http://www.osdl.org/lab_activities/kernel_testing/stp.4. VMWare Worksatation: http://www.vmware.com/products/

desktop/ws_features.html.5. Cooperative Linux: http://www.colinux.org.6. lmbench: http://www.bitmover.com/lmbench.7. ttcp: http://www.pcausa.com/Utilities/pcattcp.htm.8. netperf: http://www.netperf.org/netperf/NetperfPage.html.9. tiobench: http://sourceforge.net/projects/tiobench.

10. bonnie++, http://www.coker.com.au/bonnie++.

Производительность каналов (pipes)Канал (Pipe) – способ межпроцессного взаимодействия,реализованный во всех популярных системах (Windows,Linux и др.), активно используемый многими приложения-ми. Для тестирования производительности каналов исполь-зовался тест bw_pipe, входящий в пакет lmbench. Данныйтест создавал канал между двумя процессами и блоками64 Кб передавал по нему 32 Мб данных:

Результаты теста отражены в таблице:

Linux, как ему и положено, держится впереди. coLinux вданном тесте опережает VMWare более чем в 2 раза.

Компиляция ядраДля оценки общей производительности системы выполня-лась привычная многим операция – компиляция ядра Linux.Этот тест ценен не только достаточно показательным прак-тическим результатом (в процессе компиляции активно ис-пользуются процессор, память и дисковая подсистема), нои тем, что практически все люди, активно работающие сLinux, время от времени пересобирают ядро. В качестве «по-допытного» использовалось ядро версии 2.4.27 со стандар-тными опциями конфигурации ядра (make oldconfig).

При тестировании в VMWare и coLinux root-файловая си-стема находилась на ext2-разделе второго жесткого диска.Время компиляции ядра измерялось с помощью утилитыtime (время выполнения make dep не учитывалось):

Тест в каждой системе выполнялся 3 раза, на диаграм-ме приводится усредненное время компиляции (чем мень-ше, тем лучше):

# bw_pipe -P 1 -W1 -M 32768K

Ðèñóíîê 9

Ðèñóíîê 10

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

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

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

Доставка почтой БЕСПЛАТНО в любую точку России

# time make vmlinux

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

26

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

В этой статье я хотел бы вам рассказать об одном оченьинтересном эмуляторе – mips64emul. В последнее времяменя заинтересовала тема эмуляции во всех ее проявле-ниях. Начиная от эмулирования системных вызовов какой-либо ОС, заканчивая полноценными виртуальными маши-нами. В конечном итоге виртуальная машина – это тот жесамый эмулятор, отличие лишь в том, что эмулируется веськомпьютер целиком. Самые известные представители рядавиртуальных машин – VMWare, Bochs, Virtual PC. И вот тутмы подходим к самому интересному, все вышеперечислен-ные программы эмулируют архитектуру x86. Соответствен-но под ними у нас есть возможность запустить ОС, создан-ные для этой архитектуры. Но ведь есть и другие архитек-туры – PPC, m68k, SPARC, MIPS, и т. д. Потратив некото-рое время на поиски программ, способных эмулироватьпроцессоры, отличные от x86, я нашел много чего интерес-ного. Изыскания относительно одной из находок передвами.

Официальный сайт проекта mips64emul – www.mdstud.chalmers.se/~md1gavan/mips64emul. Как ясно из названия,он эмулирует процессоры MIPS. Данная программа способ-на эмулировать как 64-, так и 32-битные процессоры MIPS.MIPS в настоящее время используются достаточно широ-ко: 90% всех компьютеров от Silicon Graphics используютэти процессоры, также они используются в игровой пристав-ке Sony Play Station 2 и во многих других устройствах.

Перейдем от теории к практике. Все свои эксперимен-ты я проводил на P3-550 МГц/320 Мб RAM под управлени-ем ОС FreeBSD 4.10. Также ее можно использовать под уп-равлением другой BSD-системы или Linux.

Берем с сайта разработчика последнюю версию про-

граммы. Я использовал версию 0.2. Процесс установкиmips64emul очень прост и каких-либо затруднений не выз-вал:

Внимательно читаем, может быть, вам понадобится длясвоих нужд добавить какие-либо опции.

mips64emul поддерживает эмуляция достаточно боль-шого количества компьютеров с mips-процессорами:! DEC Station: PMAX(3100), 3MAX(5000), 3MIN(5000),

3MAX+(5000,5900), 5800, 5400, MAXINE(5000), 5500,5100(MIPSMATE).

! ARC: NEC-RD94, PICA-61, NEC-R94, Deskstation Tyne.! Sony Playstation 2 (CPU R5900).! Cobalt (CPU RM5200).! Различные машины от SGI (IPxx ).! Некоторые карманные компьютеры с MIPS-процессора-

ми.

Поддерживаемые типы процессоров:! R2000, R2000A, R3000, R3000A, R4000.! R4300, R4400, R4600, R4700, R5000.! RM5200, R5900, VR5432, R6000, RM 7000.! R8000, R10000, R12000, R14000, 5K.

Далее, для каждого компьютера нужна ОС. На сайте раз-

ОБЗОР ЭМУЛЯТОРА mips64emul

АЛЕКСАНДР БАЙРАКАЛЕКСАНДР БАЙРАК

./configure � help

./configuregmakegmake install

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

27№11(24), ноябрь 2004

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

После чего запустить mips64emul:

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

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

Все опции запуска нам уже знакомы, за исключением –M. Это опция служит для задания количества оперативнойпамяти, т.е. в данном случае я указал, что на эмулируемомкомпьютере установлено 64 Мб памяти.

Система загружается порядка 5 минут. Я никогда неработал на настоящей DEC Station 5000/200, но думаю, чтона ней загрузка системы ничуть не быстрее, потому кактактовая частота процессора всего 25 МГц. После запуска,без дополнительной настройки мы можем запустить X-windows, выполнив команду startx. В качестве windowmanager используется стандартный twm. Более подробно онастройке NetBSD вы можете прочитать в моей статье [2].

Исходя из документации к mips64emul, помимо вышеука-занных ОС, можно запустить другие системы, созданные дляпроцессоров MIPS. Например, NetBSD/sgimips, NetBSD/arc,NetBSD/cobalt, NetBSD/playstation2 (www.netbsd.org), Linux/SGI (http://www.linux-mips.org). И некоторые другие малоиз-вестные реализации Linux для MIPS-процессоров. Радисправедливости нужно заметить, что поддержка всего вы-шеперечисленного пока находится в экспериментальном ре-жиме. Но судя по тому, как динамично развивается проект(а ему меньше двух лет), можно предположить, что все этиОС в скором времени можно будет запускать абсолютноспокойно.

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

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

Литература:1. Бешков А. NetBSD: установка и настройка. – Журнал

«Системный администратор», №9, август 2003г., такжедоступна электронная версия – http://onix.opennet.ru/netbsd/netbsd.html.

2. Байрак А. Первые шаги в NetBSD. Часть 1. – Журнал«Системный администратор», №6, июнь 2004 г.

работчика я прочитал, что на данный момент под эмулято-ром можно свободно запустить следующие ОС:! NetBSD/pmax;! OpenBSD/pmax;! Ultrix/RISC;! Sprite.

С последними двумя я, к сожалению, не работал, и, какследствие, дистрибутивов этих ОС у меня нет. Если при-нять во внимание, что это коммерческие ОС, уже офици-ально не поддерживаемые производителем, я не стал тра-тить время на поиск дистрибутивов и для дальнейших экс-периментов выбрал NetBSD. Во-первых, с ней я рабо-таю чаще, нежели с OpenBSD, во-вторых, поддержка архи-тектуры pmax в OpenBSD была закончена в версии 2.9 (онавышла 1 июня 2001 года). А последняя версия NetBSD (намомент написания – 1.6.2) отлично поддерживает pmax ипо сей день.

Не буду подробно останавливаться на процессе уста-новки NetBSD, потому как есть замечательная статья Анд-рея Бешкова [1].

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

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

Далее нам нужно определиться с методом установки:NetBSD можно поставить непосредственно с boot CD-дис-ка либо по сети, перед этим загрузившись с помощью ус-тановочной дискеты. Я выбрал первый вариант. Берем сftp://ftp.netbsd.org/pub/NetBSD/iso/1.6.2/pmaxcd.iso.

Его размер около 75 Мб. Далее запускаем наш эмуля-тор, указав ему грузиться с диска:

Давайте разберемся с опциями, которые мы указыва-ем:! -X – использовать X11.! -D2 – эмулировать DEC Station 5000/200.! -d disk.img – указываем файл, который является нашим

виртуальным диском.! -d bc:pmaxcd.iso – указываем загрузочный диск.

! b – boot;! c – CD-ROM.

! -j – указываем имя ядра.

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

Сначала нужно списать образ загрузочной дискеты cftp://ftp.netbsd.org/pub/NetBSD/NetBSD-1.6.2/pmax/binary/kernel/netbsd-INSTALL.gz. Далее нужно распаковать полу-ченный архив:

dd if=/dev/zero of=/disk.img bs=1 count=512 seek=1100000000

mips64emul �X �D2 �d disk.img �d bc:pmaxcd.iso �j netbsd.pmax

gunzip netbsd-INSTALL.gz

mips64emul �X �D2 �d disk.img netbsd-INSTALL

mips64emul �X �M64 �D2 �d disk.img

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

28

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

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

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

В настоящее время существует достаточно большое ко-личество приложений, позволяющих организовать такуютрансляцию. Написаны они на разных языках программи-рования, работающих под управлением разных операци-онных систем, отличающихся лицензией, поддерживаемы-ми форматами и прочими характеристиками. Самый боль-шой список, который мне удалось найти, размещен на стра-нице http://sound.condorow.net/netaudio.html. Наиболее из-вестным решением является использование веб-сервераApache, модуль и необходимую информацию о настройкахкоторого можно найти по адресам: http://www.tangent.org/mod_mp3 и http://sander.vanzoest.com/apachecon/2001. Дру-гим не менее популярным решением является SHOUTcastот компании Nullsoft, подарившей миру WinAMP. Есть тяже-ловес jetCast Server (http://jetaudio.com/download/jetcast.html),поддерживающий большое количество форматов, или про-стой в настройке и совместимый практически со всеми по-добными серверами – AnaloxX SimpleServer:Shout (http://analox.com). Как видите, выбор есть.

В статье мы познакомимся с наиболее популярным OpenSource-решением – Icecast (http://www.icecast.org). На дан-ный момент Icecast поддерживает форматы Ogg Vorbis иMP3, при особой необходимости любой другой формат мо-жет быть добавлен без проблем, работает под управлени-ем как Windows, так и UNIX-подобных систем, гибок и ле-гок в настройке, имеет толковую документацию, распрост-раняется в исходных кодах.

Кто есть ктоМеханизм трансляции аудиопотоков имеет свои особенно-сти, поэтому сначала разберемся, как это работает, и оп-

ределимся с терминами. Любой сервер аудиопотоков, будьто Icecast или SHOUTcast, предназначен только для транс-ляции и работы с клиентами, которые подсоединяются, что-бы послушать музыку. Сервер не занимается поиском ин-формации на жестком диске, кодированием и прочим, какэто происходит с серверами, занимающимися трансляци-ей видео. Необходимую информацию ему нужно сначалапереслать. Причем есть два варианта. Первый – использо-вать аналогичный сервер (впрочем, не все серверы на 100%совместимы между собой) в качестве источника информа-ции. Такой сервер называется master relay. Можно забратьвесь поток с сервера и перетранслировать его полностьюили забрать только часть точек монтирования. Последнийвариант также может понадобиться при неполной совмес-тимости серверов. Например, если в качестве мастер-сер-вера для icecast будет выступать SHOUTcast, то весь потокзабрать не получится, необходимо указывать отдельныеточки монтирования. Да, что такое точка монтирования?Точка монтирования – это ресурс на сервере, который пред-ставляет один поток трансляции. Например, клиент хочетпослушать музыку, запустив XMMS, нажимает <Ctrl + L>,вводит http://cal.icecast.net:8630/prog1.ogg (ссылка рабочая)и слушает себе музыку. Параметр cal.icecast.net указываетна сервер, 8630 – на порт, используемый для трансляции(по умолчанию на большинстве серверов – 8000), аprog1.ogg на источник информации, это и есть точка мон-тирования. Причем если для mp3-потока указывать расши-рение не обязательно, то для ogg это требуется. Конечноже и наш сервер также может быть источником информа-ции для других slave relay серверов. Такая схема принятапо нескольким причинам, чтобы равномерно распределитьклиентов, избежать дублирования информации на жесткихдисках, не перегружать каналы, ведь проще забрать потоки перетранслировать его самому, чем позволить всемпользователям тащить это в одиночку. Другим источникоминформации для сервера могут быть так называемые sourceclient или broadcasting tools. Но о них позже.

Установка IcecastДля установки понадобятся: libxml2 (http://xmlsoft.org/downloads.html), libxslt (http://xmlsoft.org/XSLT/downloads.html),опционально curl (http://curl.haxx.se/download.html) и для ра-боты с OggVorbis библиотеки с http://www.vorbis.com. Но неспешите скачивать, скорее всего, это уже есть в дистрибу-тиве. После скачиваем архив с icecast (670 Кб), распаковы-ваем: ./configure, make, make install. После чего в каталоге/usr/local/bin/ появится исполняемый файл icecast, конфи-

ЛЕЙСЯ ПЕСНЯ,ИЛИСЕРВЕР ПОТОКОВОГО АУДИОСВОИМИ РУКАМИ

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

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

29№11(24), ноябрь 2004

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

гурационный файл icecast.xml в /usr/local/etc/, докумен-тация и файлы для администрирования будут положеныв /usr/local/share/icecast/.

Конфигурируем IcecastЕдинственный конфигурационный файл icecast.xml имеетодинаковую структуру как для Linux, так и для Windows. Со-стоит из нескольких секций, в которых сгруппированы па-раметры, схожие по назначению. Значения всех парамет-ров описывать вряд ли целесообразно, т.к. название гово-рит само за себя, остановлюсь лишь на краткой характери-стике и тех параметрах, на которые следует обратить вни-мание. Первая секция файла называется limits, в ней опи-сываются параметры подключения клиентов, таких какмаксимальное их число, тайм-аут, после которого клиентотключается, если связь с ним прервалась, размер очере-ди, и пр. Изменять их стоит только при большом количе-стве пользователей и плохих каналах (в перегруженныхсетях). Следующая секция authentication содержит паролии пользователей, имеющих доступ к серверу для тех илииных целей. В поле source-password прописывается неза-шифрованный пароль для source client, имя пользователя,используемое источниками «source», поле relay-passwordна данный момент не используется, поля admin-user и admin-password содержат имя пользователя и пароль для адми-нистрирования сервера.

Далее описываются параметры подключения источни-ков информации (source client). Так, если на компьютере однасетевая плата, то для работы достаточно в параметреhostname указать имя компьютера (или localhost, если ис-точник находится на том же компьютере), в ином случаедирективой bind-address указываем на сетевой интерфейс,параметр port при этом укажет на IP-порт (по умолчанию8000), который будет открыт для подключения источников.Обратите внимание, что возможно задание нескольких пор-тов директивой listen-socket. Директивами master-server,master-server-port, master-update-interval и master-passwordустанавливаются параметры master relay сервера, с кото-рого будет получаться весь аудиопоток, транслируемый сер-вером, если нет такого сервера, то оставляем как есть, т.е.закомментированными. Если нет необходимости в получе-нии всего аудиопотока с мастер-сервера для использова-ния отдельных точек монтирования, используется секцияrelay, в которой параметры server и port указывают на мас-тер-сервер, mount и local-mount указывают соответственнона экспортируемую и локальную точку монтирования. Приработе с сервером SHOUTcast, для того чтобы передавать иметаданные в опции relay-shoutcast-metadata установите 1.В секциях mount, устанавливаются специфические парамет-ры для точки монтирования, указанной в mount-name. Эти-ми параметрами могут быть имя пользователя и пароль(username и password), которым позволено соединяться,максимальное количество пользователей (max-listeners),необязательный параметр dump-file устанавливает файл,куда будет записываться поток, а в случае если с точкоймонтирования что-то произойдет, то клиенты могут бытьавтоматически переброшены на другую точку, указаннуюв параметре fallback-mount. В секциях paths и logging ука-зываются файлы и каталоги, необходимые для работы сер-

вера, трогать их не стоит, но проверьте наличие всех ката-логов на пути к файлам. Единственно интересным пара-метром является «alias source», позволяющий создать не-сколько разных точек монтирования из одной. И в securityустанавливаются параметры, позволяющие повысить защи-щенность системы, так, chroot позволит выполняться Icecastв ограниченной среде и в случае взлома злоумышленникдальше указанного каталога не пойдет, а в changeownerнужно указать имя пользователя и группу, от имени кото-рых будет работать процесс сервера.

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

Список (далеко не полный) совместимых клиентов и про-игрывателей для прослушивания потоков можно найти настранице http://www.icecast.org/3rdparty.php.

Родным source-клиентом для Icecast является IceS (http://www.icecast.org/ices.php), недавно появилась версия 2.0,работает только под UNIX (точнее, под Linux, FreeBSD,OpenBSD, Solaris) системами. Среди других, с которыми уда-лось немного поэкспериментировать, понравился Darkice(http://darkice.sourceforge.net), работающий также только подUNIX, но умеющий поставлять информацию для Iceсast вер-сий 1 и 2 и SHOUTcast или iceplay (http://icecast.linuxpower.org),работающий только с mp2-файлами. Для пользователейWindows пригодится SAM2 (http://www.spacialaudio.com) илиezstream (http://www.icecast.org/ezstream.php), который рабо-тает также и в UNIX-системах. Есть утилита, написанная идля Mac OSX – Nicecast (http://www.rogueamoeba.com/nicecast).Как видите, выбирать есть из чего.

Кстати, источник информации не обязательно долженнаходиться на одном и том же компьютере. Для примеразаймемся настройкой IceS. На данный момент имеются двеверсии IceS. Версия 0.3, развитие которой приостановле-но, предназначена для создания mp3-потоков, и версия 2.0,умеющая транслировать только OggVorbis, по причине ма-лого спроса поддержка mp3 была убрана. Если есть необ-ходимость работы как с mp3, так и OggVorbis, то возможноиспользование этих двух программ параллельно.

Другой вариант, взять ezstream, поддерживающий дваформата (как понимаете, один источник – одна точка мон-тирования) и к тому же очень простой в настройках. Дляустановки, помимо вышеперечисленных библиотек, пона-добится libshout 2.0, ссылку на которую найдете на сайтеIceCast. Далее устанавливаем библиотеку и IceS обычнымобразом, никаких особенностей здесь нет. Источником дан-ных для IceS может служить компакт-диск, файлы на жест-ком диске и любое устройство, с которого можно снять ин-формацию.

Здесь стоит отметить, что почти все source clients по-зволяют взять информацию со своего стандартного входа,обработать и выдать на стримсервер. Для настройки пара-метров IceS используется файл в формате XML, образцыкоторого после установки вы найдете в /usr/local/share/ices.Здесь их два: ices-live.xml содержит базовые настройки дляLive-трансляции (микрофон, СD-ROM и пр.), а в ices-

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

30

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

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

Для запуска в качестве демона устанавливаем background в 1.

Далее описываются параметры вывода логов, при пер-воначальной отладке установите consolelog в 1, при этомвсе ошибки будут выводиться на консоль.

Секция stream описывает передаваемый поток.

Модуль input задает параметры, откуда брать инфор-мацию.

Ниже пример для плейлиста, обратите внимание: режимзадается тегом module – playlist.

Тип плейлиста может быть basic (простой текстовыйASCII-файл, содержащий список Ogg Vorbis) или script, приэтом указанная программа генерирует его динамически.

Это для статического плейлиста, при динамической ге-нерации списка песен используется конструкция:

Далее следуют параметры random (перемешиваниесписка), restart-after-reread (перезапускает программу дляпересчитывания списка) и once (при 1 проигрывает списоктолько один раз, и работа заканчивается).

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

module может быть также alsa (device обычно plughw:0,0),stdinpcm (при считывании со стандартного входа, секцииdevice не надо) и sun при работе Sun Solaris DSP.

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

Ниже определяем имя узла, порт и пароль, последнийдолжен совпадать со значением в секциях source-passwordфайла icecast.xml.

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

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

Параметр буферизации потока (лучше не трогать).

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

Вот и все. Теперь собираем файлы в плейлист.

В результате файл должен состоять из списка вида:

Теперь запускаем IceCast.

И подаем информацию.

<background>1</background>

<consolelog>1</consolelog>

<stream><metadata>

<name> Çäåñü âïèøèòå íàçâàíèå ïîòîêà, îíî áóäåòâèäíî â ïðîèãðûâàòåëå </name>

<genre> Æàíð ìåëîäèé </genre><description> Êðàòêîå îïèñàíèå ïîòîêà </description>

</metadata>

<input><module>playlist</module><param name="type">basic</param>

<param name="file">playlist.txt</param>

<param name='program'></param>

</input>

<input><module>oss</module>

<param name="rate">44100</param><param name="channels">2</param><param name="device">/dev/dsp</param><param name="metadata">1</param><param name="metadatafilename">test</param>

</input>

<instance>

<hostname> Çäåñü ïèøåì àäðåñ èëè èìÿ, êóäà îòïðàâëÿåìïîòîê </hostname>

<port>8000</port><password>passwd</password><mount>/example.ogg</mount>

<reconnectdelay>2</reconnectdelay><reconnectattempts>5</reconnectattempts>

<maxqueuelength>80</maxqueuelength>

<encode><nominal-bitrate>64000</nominal-bitrate><samplerate>44100</samplerate><channels>2</channels>

</encode></instance>

#find /home/sound -name *.ogg > ↵↵↵↵↵/usr/local/share/ices/playlist.txt

/home/sound/Song.ogg

# /usr/local/bin/icecast -b -c /usr/local/etc/icecast.xml

Changed groupid to 65534.

Changed userid to 65534.

# ices /usr/share/ices/ices-playlist.xml

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

31№11(24), ноябрь 2004

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

Теперь, набрав в строке любимого проигрывателя:

должны услышать музыку. На эту роль подходят как XMMSи WinAMP, так и консольные ogg123 и mpg123.

И пару слов об ошибках, с которыми удалось столкнуть-ся. Например, при запуске IceCast из-под root программавыдала такую информацию.

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

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

Если проверить командой:

то может выясниться, что такого каталога не существует,создайте его командой:

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

А при загрузке OggVorbis-файла все нормально.

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

Успехов.

# /usr/local/bin/icecast -c /usr/local/etc/icecast.xml

WARNING: You should not run icecast2 as root

Use the changeowner directive in the config file

unable to open log /var/log/ices/ices.log

ls /var/log/ices/

mkdir /var/log/iceshttp://èìÿ_óçëà:8000/example.ogg

[2004-06-21 14:48:19] INFO playlist-builtin/playlist_read

Currently playing "/usr/share/ices/music/alisa/lodka.ìð3"

[2004-06-21 14:48:19] WARN playlist-builtin/playlist_read

Corrupt or missing data in file (usr/share/ices/music/alisa/lodka.ìð3)

[2004-06-21 14:49:11] INFO playlist-builtin/playlist_read

Currently playing "/usr/share/ices/rammstein/Sonne.ogg"

[2004-06-21 14:49:11] INFO stream/ices_instance_stream

Connected to server: 127.0.0.1:8000/example.ogg

[2004-06-21 14:49:12] DBUG reencode/reencode_page

Reinitialising reencoder for new logical stream

[2004-06-21 14:49:12] INFO encode/encode_initialise

Encoder initialising in VBR mode: 2 channels, 44100 Hz, nominal 64000

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

32

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

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

Среди людей, вращающихся в IT-сфере, уже много летидет религиозная война между сторонниками UNIX-подоб-ных и Windows-систем. Это является неотъемлемой чертойчеловеческой натуры, которая выражается в бесконечномпоиске идеала. Если же этот идеал вдруг находится, то зак-рываются глаза на все его отрицательные качества – ведьсовершенству не положено их иметь.

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

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

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

Для этого, если верить статистике, чаще всего исполь-зуются программные решения компании Microsoft. Понятие«домен» в последнее время стало неразрывно связано ссетями под управлением Windows.

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

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

Но если вдруг неожиданно потребуется открыть доступна данный сервер доменным пользователям, то сразу жевозникнет масса проблем, которые быстро решить не уда-ется:! Заводить для каждого нового пользователя отдельную

учетную запись неудобно.! Среднестатистический пользователь не в состоянии за-

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

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

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

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

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

ТАНЦУЕМ САМБУТАНЦУЕМ САМБУ

РОМАН ГРЕБЕННИКОВ

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

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

33№11(24), ноябрь 2004

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

шом количестве *nix-систем и конфигурируются одинаковона разных платформах.

Однако, как бы я ни старался сделать статью универсаль-ной, хочу сразу заметить, что существовала базовая плат-форма, на которой проводилось все тестирование передпересадкой на боевую конфигурацию: Gentoo Linux 2004.2,и вся статья основана именно на ней.

Чтобы убедиться в том, что на вашей системе предло-женное решение будет работать, требуется удостовериться,что она поддерживает работу со следующими пакетами:! Samba 3;! Kerberos 5;! Библиотеки PAM.

Если эти программные пакеты работают, то с большойвероятностью можно сказать, что и предложенная связказаработает, все зависит только от вас.

Алгоритм KerberosИнформация, которую UNIX-машина получает от контрол-лера домена, не должна ходить по сети в открытом виде,так как она представляет большую ценность как для полу-чателя, так и для возможных злоумышленников, поэтомудля поддержания должного уровня безопасности системыв любом случае нужно использовать какую-либо криптог-рафическую схему. В среде Windows ею является Kerberos5.

В реальной жизни два человека могут быть уверены вличности друг друга при наличии паспортов у обоих. В дан-ной ситуации человек доверяет не собеседнику, а паспорт-ному столу, выдавшему документ. Это позволяет ему удос-товериться в том, что он говорит именно с тем, кем являет-ся собеседник на самом деле. В Kerberos используется та-кая же схема: между сервером и клиентом есть посредникпод названием Центр распределения ключей (KDC, KeyDistribution Center), которому доверяют оба компьютера.KDC также известны их секретные ключи. Криптографичес-кий алгоритм, в котором они используются, является сим-метричным, т.е. один и тот же ключ может быть использо-ван как для кодирования, так и для декодирования сооб-щения.

Для начала KDC и клиент должны удостовериться в лич-ности друг друга:! Клиент шлет KDC сообщение, в котором указывает свое

имя открытым текстом и зашифрованный секретнымключом блок данных (аутентификатор) с двумя полями:именем и текущим временем.

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

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

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

Далее, если клиент хочет обратиться к серверу:! Клиент отправляет запрос на подключение к серверу.

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

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

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

Для того чтобы клиент постоянно не использовал свойсекретный ключ для связи с Центром распределения клю-

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

34

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

чей, KDC выдает ему мандат на выдачу мандатов (ticketgranting ticket, TGT):! Клиент посылает запрос KDC.! KDC отвечает специальным мандатом на самого себя,

в составе которого, как и в случае обычного сеансовогомандата, находятся две копии сеансового ключа, однаиз них зашифрована секретным ключом клиента, вто-рая – KDC.

! Клиент расшифровывает сеансовый ключ, после чегодля связи между ним и KDC используется именно он, асекретный ключ клиента удаляется из памяти.

Теперь система связи между клиентом и сервером выг-лядит так:! Клиент извлекает из TGT сеансовый ключ для связи с

KDC и отправляет запрос на сеансовый мандат для свя-зи с сервером и зашифрованные им TGT с собствен-ным аутентификатором.

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

Как видите, для нормальной работы этой системы аутен-тификации обязательно требуется синхронизация време-ни на всех ее элементах. В журнале «Системный админис-тратор» №4 за 2004 год была подробная статья МихаилаПлатова о настройке сервера времени «NTP – атомные часына каждом столе».

Настройка KerberosДля UNIX-систем существует две реализации kerberos5,совместимых со стандартом: Heimdal и MIT. В настройкеони отличаются не очень сильно, но второй гораздо болеепопулярен, поэтому будем рассматривать именно его. Уч-тите, что на старых версиях MIT Kerberos (меньших или рав-ных 1.3.1) возникали проблемы с Windows Kerberos Serviceна Win2003, поэтому рекомендую использовать последнююдоступную на данный момент версию.

В качестве открыто указанного имени клиента в описы-ваемой связке Kerberos+Samba+AD используется доменноеимя машины. Но зачастую бывает так, что ее реальное DNS-имя не соответствует тому, кем она себя считает. Предпо-ложим, что nslookup говорит нам следующее:

Тогда в переменной окружения HOSTNAME UNIX-маши-ны должна находиться строчка «nix». В моем случае этопотребовало исправления файла /etc/hostname.

Не забудьте проверить, видят ли машины DNS-именадруг друга и нет ли проблем с firewall.

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

либо информацию, объединенную в структуру с определен-ным именем:

Пример файла:

C:\>nslookup 192.168.1.14

Server: dns.domain.ru

Address: 192.168.1.10

Name: nix.domain.ru

Address: 192.168.1.14

[section]key = valueboolean1 = trueboolean2 = false

[section]struct = {

key1 = value1key2 = value2...

}

[logging]default = FILE:/var/log/krb5libs.logkdc = FILE:/var/log/krb5kdc.logadmin_server = FILE:/var/log/kadmind.log

[libdefaults]default_realm = DOMAIN.RUdns_lookup_kdc = falsedns_lookup_realm = false

[realms]DOMAIN.RU = {

kdc = controller.domain.ru

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

35№11(24), ноябрь 2004

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

Следующим шагом создадим пользователя в ActiveDirectory, имя которого UNIX-машина будет использоватьдля Kerberos-аутентификации себя. Для этого на контрол-лере домена в меню «Пуск» откройте «Administrative Tools →→→→→Active directory Users and Computers», выберите нужный кон-тейнер и создайте там пользователя. В качестве парамет-ров можно запретить ему менять пароль (галочка «Usercannot change password») и убрать необходимость его ме-нять со временем (галочка «Password never expires»). До-пустим, что вы создали пользователя с именем unixuser ипаролем SuperPass667.

Далее создаем файл, в который экспортируем секрет-ный ключ: для этого в консоли cmd.exe на контроллере до-мена требуется выполнить команду:

где:! host/[email protected] – строка, обозначающая имя ма-

шины в терминологии kerberos. Знак доллара являетсяпризнаком машинного аккаунта в Active Directory, и егозабывать не следует. DOMAIN.RU – домен, на контрол-лере которого вы сейчас работаете;

! unixuser – имя создаваемой учетной записи;! SuperPass667 – соответственно его пароль;! nix.keytab – имя файла, в который производится экспорт.

Теперь требуется переместить полученный файл наUNIX-машину любым возможным способом. Это можно сде-лать через ftp/sftp или забросить через веб-сервер, как вамбольше нравится. В консоли UNIX запустите программу ktutilи в ее командной строке импортируйте keytab-файл:

где /root/nix.keytab – путь к импортируемому файлу, а /etc/krb5.keytab – файл со всеми секретными ключами для дан-ного клиента.

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

где DomainUser – имя любого доменного пользователя. Еслипосле этого не появилось сообщений об ошибках, значит,библиотека функционирует исправно. Однако помните, чтоэта команда не использует секретный ключ из /etc/krb5.keytab,а генерирует свой на основе введенного вами пароля, такчто если на этом этапе ошибок не появилось, то это еще неозначает, что они не возникнут в дальнейшем.

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

После установки следует создать конфигурационныйфайл для самбы по адресу /etc/samba/smb.conf. Его струк-тура содержит два блока:! описание глобальных настроек сервера;! параметры для отдельных shares.

Сами настройки рассмотрим на примере:

C:\>ktpass -princ host/[email protected] -mapuser unixuser ↵↵↵↵↵-pass SuperPass667 -out nix.keytab

# ktutil

> rkt /root/nix.keytab

> list

slot KVNO Principal

---- ---- -------------------------------------

1 3 host/[email protected]

> wkt /etc/krb5.keytab

> quit

# kinit DomainUser

admin_server = controller.domain.rudefault_domain = domain.ru

}[domain_realm]

.domain.ru = DOMAIN.RUdomain.ru = DOMAIN.RUdomain = DOMAIN.RUDOMAIN = DOMAIN.RU

# Èìÿ äîìåíà, ñ êîòîðûì òðåáóåòñÿ ðàáîòàòüworkgroup = DOMAIN# Äîìåííîå èìÿ ìàøèíû, êîòîðîå äîëæíî ñîâïàäàòü ñ dns-èìåíåì# è ïåðåìåííîé ñðåäû HOSTNAMEnetbios name = NIX

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

36

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

На следующем шаге потребуется проверить, не оста-лось ли в Active Directory записей для подопытной машины.Для этого просмотрите ветку Computers.

После этого включаем UNIX-машину в домен, исполнивна ней команду:

Если в результате исполнения этой команды вы увиди-те строчку «Joined domain DOMAIN.», то появился поводоткрывать шампанское. Но в большинстве случаев на этомшаге всплывают все ошибки, допущенные на предыдущихэтапах.

Вот несколько советов:! Проверьте, нет ли сильного расхождения во времени у

UNIX-машины и контроллера домена.! Правильно ли был создан keytab-файл (тот ли пароль,

совпадает ли имя машины, нет ли различий между зна-чением переменной HOSTNAME и доменным именем).

! Нет ли в Active Directory уже существующего машинно-го аккаунта для подопытной UNIX-машины.

! Что остается в файлах протоколов самбы и системныхлогах контроллера домена.

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

# Îïèñàíèå ñåðâåðà, âèäèìîå â «Ñåòåâîì îêðóæåíèè»server string = Unix Server# Ðàçäåëèòåëü íàçâàíèÿ äîìåíà è ó÷åòíîé çàïèñè.  Windows# ýòî çíàê «\», íî â ýòîì ñëó÷àå îí ìîæåò âûçâàòü ïðîáëåìû# êàê ñèìâîë íà÷àëà escape-ïîñëåäîâàòåëüíîñòè, ïîýòîìó# åãî ïîòðåáóåòñÿ çàìåíèòü. Ïî óìîë÷àíèþ èäåò çíàê «+»,# íî «/» ïðèâû÷íååwinbind separator = /# Èñïîëüçîâàòü äîìåí ïî óìîë÷àíèþ. Âíåøíå áóäåò ïðîÿâëÿòüñÿ# îòñóòñòâèåì äîìåííîãî ïðåôèêñà ïåðåä ó÷åòíîé çàïèñüþwinbind use default domain = yes# Îáëàñòü èäåíòèôèêàòîðîâ ïîëüçîâàòåëåé, íà êîòîðóþ áóäóò# îòîáðàæàòüñÿ äîìåííûå àêêàóíòûidmap uid = 7000-10000# Îáëàñòü èäåíòèôèêàòîðîâ ãðóïï, íà êîòîðóþ áóäóò# îòîáðàæàòüñÿ äîìåííûå ãðóïïûidmap gid = 7000-10000# Àâòîìàòè÷åñêè íóìåðîâàòü ïîëüçîâàòåëåé è ãðóïïûwinbind enum users = yeswinbind enum groups = yes# Øàáëîí äîìàøíåãî êàòàëîãà äëÿ äîìåííûõ ïîëüçîâàòåëåé.# Âïîñëåäñòâèè áóäåò ñîçäàâàòüñÿ àâòîìàòè÷åñêètemplate homedir = /home/DOMAIN/%U# Øàáëîí êîìàíäíîãî èíòåðïðåòàòîðà äëÿ äîìåííûõ ïîëüçîâàòåëåétemplate shell = /bin/bash# Ðåæèì áåçîïàñíîñòè.  ðåæèìå ads äëÿ àóòåíòèôèêàöèè# samba èñïîëüçóåò èñêëþ÷èòåëüíî Active Directory,# íå îáðàùàÿ âíèìàíèÿ íà ëîêàëüíûå àêêàóíòûsecurity = ads# Øèôðîâàòü ëè ïàðîëè. Ïî óìîë÷àíèþ êîíòðîëëåð äîìåíà# íå ðàáîòàåò ñ îòêðûòûìè ïàðîëÿìè.encrypt passwords = yes# Ðåàëì Kerberos, èñïîëüçóåìûé äëÿ àóòåíòèôèêàöèèrealm = DOMAIN.RU# Ïàðàìåòð, âêëþ÷àþùèé ïîääåðæêó âûáîðà àëãîðèòìîâ øèôðàöèè# â ïðîöåññå ðàáîòû. Íåîáõîäèìîñòü èñïîëüçîâàíèÿ çàâèñèò# îò íàñòðîåê êîíòðîëëåðà äîìåíà. Íà Win2003 âêëþ÷åí# ïî óìîë÷àíèþclient use spnego = yes# Àäðåñ êîíòðîëëåðà äîìåíàpassword server = controller.domain.ru# Øàáëîí èìåí ôàéëîâ ëîãîâ, ãäå %m � èìÿ ìàøèíûlog file = /var/log/samba3/%m.log# Óðîâåíü ïîäðîáíîñòè ëîãîâ. Íà ïåðâûõ ïîðàõ æåëàòåëüíî# ïîäíÿòü ýòî çíà÷åíèå äî 4, ÷òî ïîçâîëèò äîñòàòî÷íî òî÷íî# äèàãíîñòèðîâàòü ïðîáëåìó.log level = 2# Ìàêñèìàëüíûé ðàçìåð ëîã-ôàéëîâ. 0 � íåîãðàíè÷åíî.max log size = 0# Ñïèñîê ñåòåâûõ èíòåðôåéñîâ, ñ êîòîðûìè áóäåò ðàáîòàòü# äåìîíinterfaces = 192.168.1.14# Íå òðîãàòü îñòàëüíûå ñåòåâûå èíòåðôåéñûbind interfaces only = yes# Ïðèìåð ïàïêè# Íàçâàíèå[html]# Ñïèñîê ïîëüçîâàòåëåé, ó êîòîðûõ åñòü ïðàâî èñïîëüçîâàòü# ýòó ïàïêó.  äàííîì ñëó÷àå ýòî âñå äîìåííûå ïîëüçîâàòåëè.# Çíàê @ îáîçíà÷àåò ãðóïïó.

valid users = @"DOMAIN/Domain Users"# Ïóòü, íà êîòîðûé ññûëàåòñÿ ñàìà ïàïêà

path = /var/www/htdocs# ×óâñòâèòåëüíà ëè ïàïêà ê ðåãèñòðó áóêâ

case sensitive = no# Áóäåò ëè âèäíà ïàïêà â «Ñåòåâîì îêðóæåíèè»

browseable = yes

# Âëàäåëåö ôàéëà ïðè çàïèñè â ïàïêóforce user = root

# Ãðóïïà, íàçíà÷àåìàÿ ôàéëó ïðè çàïèñèforce group = apache

# Ìîæíî ëè çàéòè íà ïàïêó áåç ïàðîëÿpublic = no

# Ìîæíî ëè â íåå ïèñàòüwritable = yes

# ßâëÿåòñÿ ëè ïàïêà ïðèíòåðîìprintable = no

# Ìàñêà ñîçäàâàåìûõ ôàéëîâcreate mask = 0640

# Ïîëüçîâàòåëè, èìåþùèå ïîëíûé êîíòðîëü íàä ïàïêîéadmin users = @"DOMAIN/Domain Admins"

# net ads join -U DomainAdministrator

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

37№11(24), ноябрь 2004

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

этого использовать стартовые скрипты системы в /etc/init.d,чтобы не изобретать велосипед при загрузке.

Для корректной работы всей системы должны старто-вать следующие демоны:! smbd! nmbd! winbindd

Настройка запуска именно трех демонов вместо обыч-ных двух (smbd и nmbd) зависит от дистрибутива, в Gentooдля этого следует отредактировать файл /etc/conf.d/samba,руководствуясь находящимися в нем комментариями. Так-же можно включить режим отладки, добавив в опции за-пуска всех трех демонов ключ -D с параметром, которыйопределяет количество отладочной информации, записы-ваемой в логи. Больше 4 его делать не стоит, так как впротивном случае логи станут очень быстро разрастать-ся. В случае, если что-то не запустилось, то читаем логснова, исправляем выявленные ошибки, и запускаем –этот цикл придется повторять до тех пор, пока все не прой-дет успешно.

Теперь можно проверить, нормально ли работают рас-шаренные папки, зайдя по адресу file://nix.domain.ru с лю-бой Windows-машины, являющейся членом домена.

Аутентификация в системеНа данный момент с аутентификацией в Active Directoryполноценно работает только самба, остальные сервисы наподопытной UNIX-машине о ней не ведают.

Проблема управления большим количеством аккаунтоввозникла значительно раньше появления AD, да и, пожа-луй, появления Windows-систем в целом. Во времена рас-света UNIX возникла идея централизованного храненияинформации о пользователях, чтобы избежать ее дубли-рования на разных компьютерах. Как решение возникшейпроблемы была создана система NIS/NIS+ – NetworkInformation Service, позволявшая компьютеру-клиенту про-водить аутентификацию пользователей, с помощью инфор-мации, хранящейся на центральном сервере. В Linux самареализация NIS/NIS+ уходит глубоко в системные библио-теки glibc, поэтому для приложений, работающих на клиен-те, нет никакой разницы, с каким пользователем они име-ют дело: локальным или удаленным. К тому же реализациябыла сделана по модульному принципу, что много лет спу-стя и было использовано разработчиками samba.

В дистрибутиве самбы есть модуль libnss_winbind.so,при помощи которого подопытная машина научится пре-образовывать абстрактные идентификаторы пользовате-лей, раздаваемые сервером winbindd, в привычные имена.Подключить этот модуль можно в файле /etc/nsswitch.conf.Интересующий нас фрагмент выглядит следующим обра-зом:

Каждая строчка файла отвечает за элемент системыаутентификации – разрешение числовых идентификаторовв привычные имена. Для того чтобы добавить возможность

работы с доменными аккаунтами, следует привести этотфайл к следующему виду:

Теперь пора проверить работоспособность всей настра-иваемой системы – умеет ли подопытная машина полно-ценно работать с доменными аккаунтами (перед выполне-нием следующей команды не помешает на всякий случайперезапустить samba):

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

Дело в том, что на многих UNIX-системах для аутенти-фикации пользователей и назначения им идентификаторовиспользуется библиотека PAM (Pluggable AuthenticationModules). По умолчанию она настроена так, что проходитьаутентификацию имеют право только локальные пользова-тели, да и то не все и не везде. Как видно из названия,библиотека построена по модульному принципу, причем закаждым сервисом, требующим аутентификации, можно зак-реплять свой список используемых модулей.

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

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

Все параметры системы PAM указаны в несколькихфайлах, находящихся в каталоге /etc/pam.d, так что передвнесением каких-либо изменений в конфигурацию стоитсделать ее резервную копию. Название файла – это имяпрограммы, к которой следует применять находящиеся внем настройки.

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

passwd: filesgroup: filesshadow: files

passwd: files winbindgroup: files winbindshadow: files

# getent passwd

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

38

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

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

Если ваша система PAM изначально была настроена сиспользованием одного общего файла конфигурацииsystem-auth и ссылками на него из соседних, то стоит пра-вить только его, чтобы доменные пользователи смогли вхо-дить в систему наряду с локальными. В противном случаепридется редактировать все файлы конфигурации для не-обходимых сервисов.

Структура самого файла состоит из построчного спис-ка модулей. Формат строки каждого модуля следующий:

где:

Рассмотрим следующий пример:

В дистрибутиве самбы есть PAM-модуль pam_winbind.so,который нам потребуется для дальнейшей работы. Стоитпроверить, был ли он скопирован при установке в каталог/lib/security, и если его там нет, то поместить его туда рука-ми.

Основываясь на предыдущем примере, фрагмент кон-фигурации, позволяющий проводить аутентификацию припомощи samba, будет выглядеть следующим образом:

Параметр use_first_pass требуется для того, чтобыpam_winbind.so не переспрашивал у пользователя пароль,а использовал тот, который был введен для pam_unix.so.

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

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

Не переусердствуйте с длиной названия группы, так какglibc иногда не очень адекватно реагирует на длинные имена(более 8 символов).

Пользователи из домена изначально не имеют домаш-него каталога. О нем есть лишь небольшое упоминание вего атрибутах, и для того чтобы доменные пользователи нечувствовали себя обделенными, нужно автоматизирован-но создавать эти каталоги. Для этого существует модульpam_mkhomedir.so, который берет шаблон домашнего ка-талога (по умолчанию /etc/skel), копирует его в надлежа-щее для него место и выставляет необходимые права:

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

# ñðàçó çàãðóæàåì âñå ïîëüçîâàòåëüñêèå ïåðåìåííûå îêðóæåíèÿ# (ìîäóëü âñåãäà âîçâðàùàåò ïîëîæèòåëüíûé ðåçóëüòàò)auth required /lib/security/pam_env.so# Åñëè ïîëüçîâàòåëü åñòü â ëîêàëüíîé áàçå, òî ïóñêàåì åãî# (ýòî óñëîâèå äîñòàòî÷íî äëÿ âõîäà â ñèñòåìó)auth sufficient /lib/security/pam_unix.so ↵↵↵↵↵

likeauth nullok# Åñëè ïðåäûäóùèé ïóíêò íå ñðàáîòàë, òî çàïðåòèòü âõîä# (ìîäóëü âñåãäà âîçâðàùàåò îòðèöàòåëüíûé ðåçóëüòàò)auth required /lib/security/pam_deny.so

auth required /lib/security/pam_env.so# Åñëè ïîëüçîâàòåëü åñòü â ëîêàëüíîé áàçå, òî ïóñêàåì åãî# (ýòî óñëîâèå äîñòàòî÷íî äëÿ âõîäà â ñèñòåìó)

session required /lib/security/pam_mkhomedir.so ↵↵↵↵↵umask=0077

[òèï] [âëèÿíèå] [íàçâàíèå ìîäóëÿ] [ïàðàìåòðû]

auth sufficient /lib/security/pam_unix.so ↵↵↵↵↵likeauth nullok

# Åñëè àóòåíòèôèêàöèÿ â AD ñðàáîòàëà, òî ðàçðåøàåì äîñòóï# (ýòî óñëîâèå äîñòàòî÷íî äëÿ âõîäà â ñèñòåìó)auth sufficient /lib/security/pam_winbind.so ↵↵↵↵↵

use_first_pass# Åñëè ïðåäûäóùèé ïóíêò íå ñðàáîòàë, òî çàïðåòèòü âõîä# (ìîäóëü âñåãäà âîçâðàùàåò îòðèöàòåëüíûé ðåçóëüòàò)auth required /lib/security/pam_deny.so

account required /lib/security/pam_require.so ↵↵↵↵↵root @unixoids

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

39№11(24), ноябрь 2004

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

«Заметки о Linare» открывают цикл статей, посвященныхнастольным дистрибутивам Linux. Вопрос об использова-нии Linux на клиентских местах обсуждается сейчас оченьшироко – создается такое впечатление, что каждое уважа-ющее себя аналитическое агентство считает своим долгомподготовить исследование, дающее исчерпывающий ответна вопрос, когда Windows окончательно сдаст свои пози-ции, сколько это будет стоить и случится ли вообще. Неотстают и гиганты индустрии: «тяжеловесы» вроде Novell иSun Microsystems выпускают собственные разработки собязательной приставкой «Desktop». Мы же в свою очередьпопробуем рассмотреть этот феномен с позиций конечно-го пользователя. Чем настольный Linux отличается от сво-их «ненастольных» аналогов? Как ведет себя в работе тотили иной дистрибутив, можно ли использовать его для ре-шения определенного круга задач? Вот те вопросы, на ко-торые мы попытаемся дать ответ.

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

люди, использующие компьютер не ради удовольствия, акак инструмент для эффективного решения возникающихперед ними проблем. Немаловажным является также на-личие прочных контактов с OEM-поставщиками, посколь-ку, во-первых, внимание сторонней организации являетсялишним подтверждением качества программного продук-та (ни один производитель не станет продавать компьюте-ры, о которых покупатели скажут: «Куда мышкой ни щелк-ни – ничего не работает»), а во-вторых, несмотря на после-дние исследования в данной области, кое-кто из пользова-телей предпочтет оставить на компьютере ту систему, ко-торая была на нем в момент приобретения. И наоборот,многие побоятся менять уже имеющуюся ОС на другую,пусть даже самую распрекрасную.

На современном Linux-рынке систем, удовлетворяющихэтим требованиям, насчитывается четыре штуки: это LinareLinux (http://www.linare.com), Linspire (http://www.linspire.com),ранее известная как LindowsOS, Lycoris Desktop/LX (http://www.lycoris.com) и Xandros Desktop OS (http://www.xand-ros.com). К ним вплотную примыкают SUSE Linux (http://www.suse.com) от компании Novell, Mandrakelinux (http://www.linuxmandrake.com) от фирмы Mandrakesoft и ряд дру-гих разработок. Несколько особняком стоят корпоративныерешения типа Java Desktop System от Sun Microsystems инаходящийся в стадии бета-тестирования Novell LinuxDesktop. Эти продукты предназначены в первую очередь

ЗАМЕТКИ О LINAREЗАМЕТКИ О LINARE

ВАЛЕНТИН СИНИЦЫН

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

40

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

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

Знакомьтесь: LinareКорпорация Linare Corporation (http://www.linare.com), заре-гистрированная в США, штат Вашингтон, впервые заявилао себе в сентябре прошлого года. Именно тогда был анон-сирован выход дистрибутива Linare Linux. Месяц спустяLinare открыла портал Linux.net, не так давно переимено-ванный в LinuxTimes.net. Последняя версия системы, LinareLinux 2.0 Professional Edition, базируется на Fedora Core ибыла выпущена в минувшем августе.

Политика компании в отношении распространения LinareLinux вызывает некоторую растерянность. Его первая вер-сия продавалась как отдельно (по цене приблизительно 20долларов за копию), так и в составе бюджетных PC в рядекрупных интернет-магазинов. После выхода Linare Linux 2.0была объявлена рекламная акция – коробку (DVD-бокс) сдистрибутивом можно было заказать по почте, оплативтолько стоимость доставки. Вскоре после ее окончанияLinare, не сказав никому ни слова, опубликовала ISO-об-раз диска на сайте Ibiblio (ftp://ftp.ibiblio.org), и в настоящиймомент его может загрузить любой желающий. Создаетсявпечатление, что компания до сих пор не определилась, чтобудет ее основным источником дохода – прямые продажиили OEM-контракты.

Перейдем собственно к продукту. Как и все настольныедистрибутивы, Linare Linux распространяется на одном ком-пакт-диске, загрузившись с которого можно приступить не-посредственно к установке системы. Некоторые произво-дители считают удобным поместить на инсталляционныйдиск небольшую программу автозапуска (autorun) дляMicrosoft Windows, которая попросит пользователя сохра-нить все важные данные и перезагрузить компьютер дляначала установки новой системы. На диске с Linare LinuxProfessional я ничего подобного не обнаружил. Видимо, про-изводитель полагает, что пользователь, отважившийся наперестановку системы, должен сам неплохо представлять,как это делается.

В качестве программы-инсталлятора Linare Linux исполь-зует Anaconda, что совсем неудивительно, особенно еслипринять во внимание его «наследственность». Установщикпредельно прост в использовании и задает минимум воп-росов, однако перевести его в экспертный режим (т.е. ока-зать сколько-нибудь существенное влияние на процесс) нетникакой возможности. Исключение составляет процедураразбиения жесткого диска, которую пользователь можетдоверить компьютеру или провести самостоятельно с по-мощью графической утилиты Disk Druid.

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

ся словами: «Press OK to reboot». Излишне говорить, чтоникаких других кнопок, кроме «OK», в этом диалоге не было.Запустив повторную инсталляцию, я осуществил разбие-ние диска вручную. На этот раз все прошло гладко, если несчитать того, что Linare предложил мне на выбор всего трифайловые системы: ext2, ext3 и vfat. На фоне обилия раз-личных решений для организации данных, поддерживае-мых ядром Linux напрямую (это и ReiserFS, и XFS компа-нии Silicon Graphics, и JFS корпорации IBM), этот переченьсмотрится несколько бледно.

После указания часового пояса (здесь было достаточ-но просто щелкнуть мышью в нужной точке на карте мира)мне предложили ввести пароль для root. Желая проверить«интеллектуальные способности» инсталлятора, я набрал:«123456». К моему изумлению, этот канонически слабыйпароль был принят системой безоговорочно. Это тем бо-лее странно, поскольку, в отличие от других дистрибути-вов, Linare не предлагает создать непривилегированнуюучетную запись для повседневной работы, вынуждаяпользователя, не слишком хорошо знакомого с Linux (а та-ких среди потенциальных клиентов Linare подавляющеебольшинство), всегда регистрироваться в системе как root,что весьма негативно сказывается на безопасности.

Сразу же после ввода пароля инсталлятор переходитнепосредственно к копированию пакетов на жесткий диск.Никаких специальных мер по их отбору не предусмотрено,однако это можно считать скорее плюсом, чем минусом: всостав Linare Linux входит вполне удачный комплект при-ложений для типичной SOHO-конфигурации, а все необхо-димое можно добавить в процессе использования системыс помощью утилиты Synaptic. Финальной фазой инсталля-ции является установка загрузчика (GRUB). К сожалению,инсталлятор не только не спросил меня, где я хотел бы егоразместить (возможно, это было сделано для того, чтобыне травмировать неспециалиста терминами вроде MBR), нои переписал существующую загрузочную запись Mandrake-linux, не добавив эту ОС в свое меню. Подобная ситуация,на мой взгляд, является совершенно недопустимой для по-тенциальных пользователей Linare, многие из которых мо-гут захотеть установить его рядом с Windows. С другой сто-роны, такое поведение не вызывает проблем при установ-ке Linare Linux на «чистый» компьютер, например, на стен-де OEM-производителя.

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

Впечатления от работыКодовое имя Linare Linux 2.0 Professional Edition – Shrek.Видимо, в честь всемирно известного огра интерфейс сис-темы выдержан в зеленых тонах (см. рис. 1). Linare Linux2.0 построен на базе ядра 2.6.5 и включает в себя: рабочийстол KDE 3.2.2, офисный пакет OpenOffice.org 1.1.0, персо-нальный органайзер Ximian Evolution 1.4.6, пакет Mozilla 1.6,графический редактор GIMP 2, проигрыватели XMMS и

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

41№11(24), ноябрь 2004

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

MPlayer, а также ряд несвободных приложений, напримерсреду выполнения Java, RealPlayer 8 и Macromedia Flash. Вотличие от других настольных дистрибутивов для просмот-ра документов в формате PDF Linare Linux предлагает неAdobe Acrobat Reader, использующий библиотеку Motif, апосему имеющий достаточно специфический интерфейс,характерный для старых UNIX-приложений, а достаточносвежую разработку KPDF, являющуюся частью KDE. Рабо-чий стол создает ощущение монолитности – дизайнерыкорпорации Linare постарались на славу.

Приложения Qt и GTK выглядят практически одинако-во. Из общей картины выбиваются лишь Mozilla, использу-ющая синюю тему «Modern», и OpenOffice.org, поддержи-вающий собственную библиотеку GUI (справедливости радинадо отметить, что уже существуют версии OpenOffice.org,элементы управления которых имитируют внешний вид вид-жетов KDE и GNOME. «KDE-фицированный» OpenOffice.orgвходит, например, в SUSE Linux и Yoper). В качестве front-end к MPlayer также используется GMPlayer (gtk+), хотя ряддругих поставщиков Linux уже включил в свои дистрибути-вы KPlayer, базирующийся на Qt/KDE. Иными словами, сте-пень интегрированности рабочего стола в Linare Linux весь-ма высокая, но не идеальная.

Система меню «Пуск» (в Linare оно называется «Explore»)и пиктограммы по возможности повторяют Windows XP.Приложения Linux, такие как KEdit, KPaint и LinNeighborhood,получили привычные пользователям Windows названия –Notepad, Paint и Network Neighborhood. То же самое можносказать и о иконках рабочего стола. Здесь можно встре-тить «My Linare PC» и «Connect to Internet», навевающиемысли о «Моем компьютере» и «Мастере подключения кИнтернету». Однако не стоит обольщаться – первая пик-тограмма является просто ссылкой на домашний каталогпользователя, который будет открыт в Konqueror, а щелчокпо второй запустит утилиту KPPP, которая окажет неоце-нимую помощь в настройке dial-up соединения, но будет бес-полезна, если вам необходимо создать подключение по ло-кальной или беспроводной сети.

Немаловажной частью настольной системы являетсятакже совместимость с Windows-машинами и приложения-ми. Здесь у Linare имеются определенные проблемы. Lin-

Ðèñóíîê 2. Ñîáñòâåííûõ ñðåäñòâ íàñòðîéêè â Linare Linuxíåò, îäíàêî óòèëèòû Red Hat è Öåíòð óïðàâëåíèÿ KDE ïîçâî-ëÿþò äîáèòüñÿ ìíîãîãî (íà ýêðàíå � ìàñòåð óñòàíîâêè íîâîãîïðèíòåðà)

Ðèñóíîê 1. Öâåòîâàÿ ãàììà ðàáî÷åãî ñòîëà � æåëòî-çåëåíàÿ,à èêîíêè è íàçâàíèÿ ïðèëîæåíèé ïîäîáðàíû òàê, ÷òîáû ìàêñè-ìàëüíî ñîîòâåòñòâîâàòü Windows XP

Neighborhood, входящий в состав дистрибутива, позволяетпросматривать разделяемые ресурсы Windows, а стандар-тные средства KDE облегчают установку сетевого принте-ра. Однако ни WINE, ни CrossOver Office в Linare Linux нет,что делает запуск Windows-приложений невозможным.Опять же, WINE можно попробовать доустановить с помо-щью Synaptic, однако отсутствие средств совместимости сWindows выглядит для настольного дистрибутива несколь-ко странно. Помимо этого, в Linare Linux не входит GCC, азначит, добавлять в систему можно только бинарные паке-ты. К счастью, насколько можно судить, Linare Linux 2.0 со-храняет совместимость с Fedora Core 2.

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

Подведем итог. Linare Linux 2.0 Professional Edition пред-ставляет собой достаточно простой дистрибутив, по-види-мому, ориентированный на OEM-поставки в англоязычныестраны. В техническом смысле он ненамного дружествен-нее пользователю, чем оригинальная Fedora Core, если несчитать более «молчаливого» инсталлятора. Linare не пре-доставляет собственных средств настройки, за исключени-ем стандартного набора апплетов Red Hat. При всем этомпакеты, общий объем которых в распакованном состояниисоставляет всего 2 Гб (не так уж много, по современныммеркам), подобраны весьма удачно, видна работа дизай-неров и специалистов в области удобства использования(usability). Думается, что после включения хотя бы мини-мальной поддержки русского и других языков Linare Linuxзаймет достойное место в ряду дружественных пользова-телю операционных систем.

В следующем номере мы рассмотрим самый старый и,пожалуй, самый известный широкой публике настольныйдистрибутив – Linspire/LindowsOS.

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

42

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

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

Утилита nLite предназначена для формирования поль-зовательских дистрибутивов операционных систем MicrosoftWindows версий 2000, XP, 2003 и решает следующие зада-чи:! Оптимизация временных затрат при установке опера-

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

танавливаемых компонентов;! определения значений стандартных настроек, кото-

рые запрашиваются в процессе установки.! Снижение загрузки оперативной памяти компьютеров

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

! Повышение уровня безопасности устанавливаемой си-стемы при помощи интеграции в инсталляцию после-днего Service Pack, а также исключение из дистрибути-ва и, таким образом, уменьшения количества приложе-ний Microsoft, которые могут потенциально содержатькритические ошибки (например, Outlook Express, игры)и не понадобятся для работы конечному пользователю.

Дополнительно программа предоставляет возможностьизбавиться от установки на пользовательские компьютерыInternet Explorer (с определенными оговорками, так как раз-работчики Windows настолько интегрировали IE в опера-ционную систему и ее часть – Проводник, что полное из-бавление от всех следов IE, к сожалению, невозможно).

При подготовке статьи была использована программаnLite версии 0.98 beta 2 (утилита является некоммерческим

продуктом и может быть скачана по адресу: http://www.taekwondo-knin.hr/files/nlite-0.98.7b2i.exe, сайт произво-дителя – http://nuhi.msfn.org). Дополнительно для работынебходимо, чтобы в системе было установлено приложе-ние Microsoft .Net Framework (http://download.microsoft.com/download/a/a/c/aac39226-8825-44ce-90e3-bf8203e74006/dotnetfx.exe).

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

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

Так как одной из задач, которые решались с использо-ванием nLite, было создание оптимальной инсталляцион-ной версии операционной системы W2K, сохраняющейсвои основные характеристики, имеющей минимальныеразмеры дистрибутива и ограниченные требования к ап-паратным ресурсам компьютера, на котором должна про-изводиться установка, то для тестирования была выбра-на Microsoft Windows 2000 Professional сборки 5.00.2195 синтегрированным Service Pack 4. При этом объем занима-емого на диске места после установки с применением ми-нимально возможной пользовательской инсталляции со-ставил – 257 Мб (в стандартной установке – около 600 Мб,в расчет не брался размер файла подкачки – pagefile.sys),объем выделенной оперативной памяти – 32 Мб (в стан-дартной установке – 46 Мб). Сам дистрибутив занимает178 Мб (в стандартной установке – 330 Мб).

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

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

ИСПОЛЬЗОВАНИЕ ПРОГРАММЫ nLite

МАКСИМ КОСТЫШИН

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

43№11(24), ноябрь 2004

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

лучения в выбранном месте итоговой версии инсталляции(нельзя выбрать каталог, размещенный на CD-ROM).

При этом автоматически детектируется наличие в выб-ранном каталоге подкаталога с названием «I386». Пользо-вателю дополнительно предоставляется информация о том,установка какой операционной системы выбрана, номервнедренного Service Pack (SP) и размер инсталляционногопакета.

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

Кнопка «Make ISO» позволяет сформировать образ заг-рузочного диска без удаления каких-либо компонентов изинсталляционного пакета.

Об интеграции Service Packв инсталляционный пакетОтметим, что при желании обладатель инсталляции W2K ипоследнего Service Pack может сформировать версию дис-

трибутива с интегрированным SP и без использования nLite(что бывает весьма выгодно администраторам, для кото-рых уменьшение времени, потраченного на переустановкусистемы, – весьма актуальная задача). Для этого достаточ-но выполнить три последовательных шага:! Скопировать на жесткий диск каталог «I386» из исход-

ного инсталляционного пакета Windows;! Распаковать обновление в подходящий каталог, исполь-

зуя команду в указанном ниже формате:

! Из подкаталога Update обновления выполнить програм-му:

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

Опытные специалисты, которые умеют работать с ISO-образами дисков, обладающие знанием и практическиминавыками, могут сформировать загрузочный диск на осно-ве исходного инсталляционного диска W2K с использова-нием таких широко распространенных программных про-дуктов как Nero, UltraISO, CDRWin и т. п. Вообще говоря,тема создания указанного типа дисков достаточно обшир-на и может быть рассмотрена в рамках отдельной статьи.

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

Для полноты изложения вопроса создания загрузочно-го диска Windows 2000 Professional в рамках основной темыстатьи отметим, что в корне установочного пакета должныприсутствовать следующие файлы:! BOOTFONT.BIN (локализация русской версии);! cdromsp4.tst (указывает на то, что используется версия

с Service Pack 4);! cdrom_ip.5 (указывает на то, что используется версия

Windows 2000 Professional);! cdrom_nt.5 (для всех версий W2K).

Причем само содержимое всех файлов, кроме первого,не имеет никакого значения. Файл BOOTFONT.BIN можетбыть найден в каталоге «I386» установки операционной си-стемы.

Ðèñóíîê 1

Ðèñóíîê 2

W2KSP4_rus.exe /u /x:íàçâàíèå_âðåìåííîãî_êàòàëîãà

update.exe /s:èìÿ_êàòàëîãà_äèñòðèáóòèâà

Ðèñóíîê 3

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

44

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

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

Основную часть окна (Components Removal) занимаетперечень разделов с компонентами дистрибутива. Приве-дем полный список разделов с указанием некоторых вклю-чающихся в состав компонентов:! Application (Игры, WordPad, Калькулятор, ...);! Drivers (Display Adapter, Ethernet (LAN), Modems, Printers,

Sound Controllers, ...);! Internet Utilities (Communication tools, Internet Explorer,

Java Virtual Machine, Outlook Express, Network Monitor,Netmeeting, ...);

! Language Support (Cyrillic, Multilanguage Support (LANGdir), ...);

! Multimedia (Pant, Windows Media Player, Mouse Cursors,Windows Sounds, ...);

! Operating System Options (DR Watson, Disk Cleanup, Help,Task Scheduler, Web View, ...);

! Service (Fax Service, Telnet Service, Autoupdate, Messenger, ...);

! Directories (в раздел вносится перечень каталогов, ко-торые содержатся в каталоге дистрибутива, за исклю-чением I386).

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

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

! Custom (Пользовательский);! Last Session (Последняя сессия – данные о последних

выбранных пользователем для удаления компонентахзапоминаются в каталоге установки nLite в разделеComponents файла settings.ini при успешном формиро-вании дистрибутива);

! Safe (Безопасный);! Lite (Маленький);! Select All (Выбрать все);! Clear (Очистить).

Фиксация отметки Experimental позволяет расширитьсписок, из которого выбираются удаляемые компоненты,одноименным разделом (включает компоненты – Applicationcompatibility path, Com+, Extra Fonts, Managеment Instrumen-tation, MDAC, Modem Support, Windows Picture and Fax Viewer).

Заметим, что в программе имеются проблемы с орга-низацией сохранения настроек параметров разделаExperimental. В связи с чем компоненты данного разделанеобходимо при очередном сеансе работы с nLite повторнокорректировать.

Из раздела компонентов драйверов (Drivers) предлага-ется выбирать только те устройства, которые вам явно непонадобятся при использовании создаваемого пакета дис-трибутива. В разделе поддержки языков (Language Support)рекомендуем оставить только поддержку русского языка имногоязычности, а в разделе Operation System Options –Printer Support.

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

Здесь можно добавить в перечень удаляемых файловтакие категории редко используемых неспециалистамифайлов как:! утилиты работы с командной строкой – append.exe,

attrib.exe, xcopy.exe, fc.exe, find.exe, findstr.exe, edlin.exeи т. п.;

! средства диагностики и отладки:! dxdiag.exe – средство диагностики DirectX;! perfmon.exe – средство оценки производительности;! wbemtest.exe – тестер инструментария управления

Windows;

Ðèñóíîê 4

Ðèñóíîê 5

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

45№11(24), ноябрь 2004

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

! winver.exe – вывод информации об установленнойверсии Windows;

! ipsecmon.exe – монитор IP-безопасности;! discover.exe – программа, предназначенная для зна-

комства с Windows;! файлы данных;! %WinDir%\security\templates\*.inf – шаблоны конфигура-

ции безопасности для Security Configuration Editor;! %WinDir%\*.bmp – образцы рисунков для рабочего сто-

ла.

К слову сказать, после установки операционной сис-темы с применением минимального возможного вариан-та пользовательского дистрибутива в системном катало-ге и System32 размещалось свыше 300 исполняемых фай-лов, не говоря уже о dll-файлах. Вряд ли большинство изних будут востребованы пользователем и системой дляработы.

Информация о выбранных пользователем для удалениякомпонентах, исключаемых и оставляемых в инсталляциифайлах, параметрах формирования ISO-образа пользова-тельской установки сохраняется в settings.ini, размещаю-щемся в каталоге установки nLite.

Настройки параметров инсталляцииСледующее окно настроек (Unattended setup) позволяет вамзаранее определить значения по умолчанию для некоторыхпараметров инсталляции.

Первая закладка (Info) предоставляет пояснения и воз-можность использовать или отказаться от представленно-го расширенного перечня настроек.

Внося информацию в параметры второй закладки(General) можно определить данные, которые предлагают-ся для выбора в процессе установки, такие как:! регистрационный номер для инсталляции;! название каталога для установки;! выбор процесса сопровождения процесса установки

(UnAttended Mode);! возможность определения автоматической регистрации

администратора при входе в Windows.

Выбор UnAttended Mode может быть сделан из пяти пре-допределенных режимов. Поясню некоторые из них:

! DefaultHide – предоставляет возможность при установ-ке провести операции с разделами, задать диск, на ко-торый будет производиться установка, а также опреде-лить параметры в окне «Язык и стандарты» (рекомен-дуется автором статьи для проведения максимальнобыстрого процесса инсталляции);

! GuiAttended – не использует никаких предварительныхнастроек;

! ProvideDefault – обычный вариант установки с предус-тановленными значениями.

С помощью последней закладки (Personal) определяются:! временная зона (часовой пояс);! значение пароля администратора;! язык;! имя компьютера;! полное имя;! название организации;! имя рабочей группы для настройки работы в сети.

Заметим, что вся информация с настройками парамет-ров инсталляции сохраняется в файле unattended.ini, раз-мещающемся в каталоге установки программы nLite.

Завершающий этапПоследнее окно определения параметров дистрибутива (Setup options) в закладках Options и Tweaks позволяет допол-нительно задать некоторые завершающие настройки:! отключить возможность использования системы защи-

ты системных файлов (SFC) при работе операционнойсистемы, которая предполагает резервное хранение кэшазащищаемых файлов и автоматическое сканирование це-лостности системных файлов при перезапуске системы;

! удалить раскладки клавиатуры для исключенных из ин-сталляции поддержки иностранных языков, которые небудут использованы при работе;

! определить максимальное сжатие драйверов при фор-мировании инсталляции;

! исключить возможность загрузки с формируемого об-раза;

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

Ðèñóíîê 6

Ðèñóíîê 7

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

46

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

Нажатие кнопки в окне (Set up options) позволяет на-чать процесс формирования пользовательского инсталля-ционного пакета и внесения изменений в исходный каталогс файлами дистрибутива. Последовательность и ход про-цесса можно наблюдать в очередном окне (Processing). Призавершении формирования инсталляции с заданными па-раметрами внизу окна программы в статусной строке вы-водится информация о размере сформированного дистри-бутива, данные о том, насколько он был уменьшен по срав-нению с исходным.

Предпоследнее окно nLite (Make bootable image) предо-ставляет возможность дополнительно сформировать ISO-образ дистрибутива для тестирования или записи на CD-ROM. Перед этим можно произвести необходимые опера-ции с итоговым дистрибутивом, которые не были предус-мотрены в ходе работы с программой nLite (добавить фай-лы, скорректировать содержимое), а также внести правкидля устранения неточностей, выявленных в процессе рабо-ты с программой (рис. 10).

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

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

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

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

В состав прочих команд пакетного файла nLite.cmd, за-пускающегося при первой загрузке Windows, входит ути-лита Registry Console Tool For Windows 2000 (Reg.exe), ко-торая присутствует, например, в Microsoft Windows 2000Support Tools (входит в состав Windows 2000 Server) иWindows XP, однако отсутствует в стандартной поставкеWindows 2000 Professional.

Применение nLite не позволяет полностью удалитьInternet Explorer (для эксперимента можно попробовать вы-полнить в урезанном варианте «Пуск» – «Найти» – «В Ин-тернете…»).

Некоторые тонкости использования nLiteКак уже указывалось, авторы программы предусмотрели,что при использовании дистрибутива, изготовленного с ис-пользованием утилиты, после завершения инсталляции вы-полняется запуск командного файла nLite.cmd (необходи-мая информация для этого вносится в файл HIVEDEF.INF).Формирование командного файла напрямую зависит от на-строек заданных пользователем в процессе определенияпараметров установки в nLite. В связи с этим разработчикивнедрили информацию, на основе которой корректируетсясодержание файла nLite.cmd в код самой программы. Ин-формация дописывается в cmd-файл в процессе формиро-вания дистрибутива.

Ниже для примера приводится минимальный вариантсодержимого файла nLite.cmd.

С использованием коррекции содержимого командногофайла nLite.cmd можно решить некоторые дополнительныевопросы оптимизации процесса инсталляции Windows.

Ðèñóíîê 8

Ðèñóíîê 9

Ðèñóíîê 10

@ECHO OFFTITLE nLite post cleanup - Please Wait...reg delete HKEY_USERS\.DEFAULT\Software\Microsoft\ ↵↵↵↵↵

Windows\CurrentVersion\RunOnce /v nlite /fdel /f /q %SystemRoot%\inf\nlite.cmd

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

47№11(24), ноябрь 2004

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

Следующие строки, включенные в nLite.cmd, позволяютскорректировать используемые по умолчанию параметрыраскладки клавиатуры при регистрации в системе и при ра-боте в Windows (Английская (США) – основная, Русская –дополнительная, переключение Ctrl+Shift).

Для того чтобы воспользоваться заложенной в nLite.cmdвозможностью применения утилиты Registry Console ToolFor Windows 2000 (Reg.exe), для Windows 2000 Professionalнеобходимо:! найти и дополнить выбранный каталог «I386» для поль-

зовательской инсталляции файлом Reg.exe;! внести в файл TXTSETUP.SIF в раздел [SourceDisksFiles]

строку следующего содержания:

где Ш – номер каталога, назначение которого приведе-но в размещенном выше разделе [WinntDirectories] (на-пример, цифра 2 означает размещение файла в ката-логе %WinDir%\system32).

Используя в своих интересах нюансы механизмов ра-боты инсталляции Microsoft Windows, можно, варьируя со-держимое файлов, изменять значение переменных средыпользователя (например, TEMP и TMP), определять запускпри первом входе в Windows дополнительных программ, на-значенных при подготовке дистрибутива, и т. п.

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

Значения параметров, указываемых пользователем впроцессе инсталляции, которые определяются во время ра-боты с программой nLite, сохраняются в файле WinNT.sif.Использование sif-файла заложено Microsoft в механизмпроведения стандартной установки операционной системыWindows для получения параметров проведения инсталля-ции (дополнительную информацию можно получить из со-

держимого файла UnAttend.txt, размещаемого в каталоге«I386»). В связи с этим грамотное использование содержи-мого файла WinNT.sif может позволить определить при ус-тановке максимально быстрый (UnattendMode = DefaultHide)режим инсталляции, предполагающий до 3 (в стандартномрежиме – свыше 10) диалоговых экранов, требующих вме-шательства оператора для продолжения процесса (эта осо-бенность может быть использована в стандартных дистри-бутивах Microsoft Windows 2000 и XP).

Продолжение следует?В статье был рассмотрен один из вариантов, позволяющийформировать на компьютере пользователя операционнуюсистему Windows 2000, занимающую минимальные разме-ры как на жестком диске, так и при запуске – в оператив-ной памяти. Следует отметить, что для решения поставлен-ной задачи могут быть использованы различные подходы,так, если в программе nLite используется вариант подго-товки пользовательской инсталляции минимального вари-анта, то утилита 2000Lite Professional (коммерческий про-дукт LitePC Technologies Pty Ltd, сайт компании – http://www.litepc.com) позволяет удалить лишние компоненты изуже установленной системы. C использованием 2000LiteProfessional можно уменьшить размер занимаемого диско-вого пространства до 200 Мб (nLite – 257 Мб), размер ис-пользуемой оперативной памяти может быть уменьшен до42 Мб (nLite – 32 Мб).

Возможность создания оптимизированной инсталляциисуществует и для других программных продуктов Microsoft,таких, например, как Microsoft Office. Для этого могут бытьприменены стандартные средства Microsoft, к примеру Office2000 Resource Kit, Office XP Resource Kit.

К моменту верстки статьи в Интернете появилась ин-формация о выходе новой версии nLite – 0.99 beta, в кото-рой возможности программы существенно расширены:! добавлена поддержка интеграции hotfixes;! включения в дистрибутив драйверов поддержки допол-

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

кета компонентов (NWLink IPX/SPX/NetBIOS Protocol,Client for Netware Networks, SNMP Service, Command-Linetools (experimental), Event Log Service (experimental) и пр.);

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

rem Êîððåêöèÿ ÿçûêà ïî óìîë÷àíèþ è ïåðåêëþ÷åíèÿ êëàâèàòóðûreg add "HKEY_CURRENT_USER\Keyboard Layout\Preload" ↵↵↵↵↵

/v "1" /t REG_SZ /d "00000409" /freg add "HKEY_CURRENT_USER\Keyboard Layout\Preload" ↵↵↵↵↵

/v "2" /t REG_SZ /d "00000419" /freg add "HKEY_CURRENT_USER\Keyboard Layout\Toggle" ↵↵↵↵↵

/v "Hotkey" /t REG_SZ /d "2" /freg add "HKEY_USERS\.DEFAULT\Keyboard Layout\Preload" ↵↵↵↵↵

/v "1" /t REG_SZ /d "00000409" /freg add "HKEY_USERS\.DEFAULT\Keyboard Layout\Preload" ↵↵↵↵↵

/v "2" /t REG_SZ /d "00000419" /freg add "HKEY_USERS\.DEFAULT\Keyboard Layout\Toggle" ↵↵↵↵↵

/v "Hotkey" /t REG_SZ /d "2" /f

reg.exe = 2,,,,,,_x,Ø,0,0

�[AddReg]HKCU,"SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce", ↵↵↵↵↵

"nLite",0x00020000,"%%systemroot%%\inf\nlite.cmd"�HKCU,"Environment","TEMP",0x00020000,"%TEMP_DIR%"HKCU,"Environment","TMP",0x00020000,"%TEMP_DIR%"�[Strings]TEMP_DIR="%USERPROFILE%\Local Settings\Temp"�

Ðèñóíîê 11

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

48

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

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

Если посмотреть на сегодняшние решения по защитекомпьютерных систем, их можно сравнить с превентивнымимерами по недопущению заболевания, вроде правил общейгигиены, либо с лекарствами, помогающими укрепить орга-низм, как правило, только от определенной болезни. Но при-рода дала человеку более совершенное средство, помогаю-щее справиться с неизвестными болезнями – иммунитет.Именно это свойство пытаются сейчас выработать у компь-ютерных систем специалисты. Такие системы, заимствую-щие у природы принцип иммунитета, называют искусствен-ными иммунными системами (AIS – Artificial Immune System).

Для понимания общего принципа работы такой системынеобходимо вкратце напомнить, как работает естественнаяиммунная система, предохраняющая человека от опасныхинородных тел. Их роль в организме аналогична таковой вкомпьютерных системах. Хотя имеется достаточно многоразличий между живыми организмами и компьютернымисистемами, но цель – обозначить подобия, переносимые вкомпьютерную защиту. Защита организма многослойна,здесь и кожа, второй барьер – pH, температура, делающаяневозможной существование инородных организмов и, на-

конец, наиболее сложная из них, иммунная система челове-ка. Иммунологи описывают проблему определения заразывнутри организма как сравнение неких шаблонов с попада-ющими внутрь организма телами (или антигенами) и выяв-ления между ними различий. В роли шаблонов выступаютлимфоциты, которые вырабатываются В- и Т-клетками спин-ного мозга и тимуса. Причем генные библиотеки эволюцио-нируют постоянно, поэтому изменяется и содержащаяся вних информация. В этом процессе имеется несколько инте-ресных моментов. Так, лимфоциты обнаруживают только не-которое ограниченное подмножество патологий, и поэтомудля гарантированного обнаружения всех возможных вари-антов во всем организме их должно быть достаточное коли-чество (не говоря уже о том, что около 100 миллионов заме-щаются каждые 2-3 дня в процессе, называемом apoptosis).

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

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

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

ИММУННАЯ СИСТЕМА ДЛЯ КОМПЬЮТЕРА

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

49№11(24), ноябрь 2004

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

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

Итак, иммунная система человека обладает некоторы-ми свойствами:! индивидуальный подход к уникальным событиям;! система является распределенной;! без централизованного контроля;! самообучаемая, обладающая памятью, ошибкоустойчи-

вая и самотестирующаяся;! относительно проста и легковесна.

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

Даже такую упрощенную систему очень трудно полнос-тью перенести в компьютерный мир, да и заниматься этим,очевидно, никто не будет, слишком большие различия. Ком-пьютерные системы, моделирующие T-ячейки, используют-ся для детектирования аномалий, например, при обнаруже-нии компьютерных вирусов, в то время как системы, моде-лирующие поведение B-ячеек, ориентируются главным об-разом на проблемы распознавания образов и оптимизации.Отличий компьютерной реализации от биологической до-вольно много. Так, вместо многих видов датчиков, отвечаю-щих за свой участок и обнаружение своего антигена, исполь-зуется, как правило, один тип, совмещающий в себе сразунесколько функций. AIS строится, как правило, только на двухцентральных положениях: антиген – антитело. Исходя из осо-бенностей сервиса или протокола, выбираются исходныеданные для формирования генной библиотеки, которая за-тем пополняется в процессе обнаружения аномальной ак-тивности (т.е. эволюции генной библиотеки). Кроме того,механизмы негативной селекции оперируют вероятностны-ми характеристиками и вместо полного соответствия пара-метров довольствуются частичным. Изменение коэффици-ента соответствия изменяет количество ложных срабатыва-ний системы. В качестве замены белку антигенов выступа-ют системные вызовы или сетевые пакеты. Для уменьшенияколичества антител детекторы конкурируют между собой,подобно тому, как лимфоциты конкурируют при связыванииинородного антигена, и такая система оставляет соответству-ющие только наиболее часто проявляющимся явлениям.Кроме того, такая система имитирует механизм негативнойселекции, в результате которой генерируются ранее неизве-стные сигнатуры, которые в свою очередь сравниваются снормальным профилем. В итоге всего такая система созда-ет минимально возможный набор детекторов, способныхобнаруживать максимальное число аномалий. Один из ком-пьютеров может играть роль тимуса, и при наличии вторич-ных IDS весь набор рассылается и на остальные узлы. Хотяв принципе такая централизация необязательна и лимфо-циты при обнаружении аномалии могут самостоятельно ко-пироваться на остальные узлы. При обнаружении проблем

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

После прочтения всего вышеизложенного у многих мо-жет возникнуть вопрос, в чем же отличие и преимуществоискусственных иммунных систем от искусственных нейрон-ных сетей. Работы по изучению искусственных нейронныхсетей (Artificial Neural Networks – ANN) ведутся сравнительнодавно и отнюдь небезуспешно, основной пик работ прихо-дится где-то на семидесятые-восьмидесятые. В результатеразработано множество теорий и алгоритмов, теория Дар-винизма привела к появлению эволюционных алгоритмов(evolutionary algorithms – EA). Обе эти сети способны обучать-ся, ведя наблюдение за изменением параметров системы, икак результат достигать максимально возможной эффектив-ности, имеют ассоциативную память, но в любом случае не-обходима первоначальная настройка и подгонка параметров.Однако отличие нервной и иммунной систем человека на-кладывает и свои отпечатки на алгоритмы работы. Для AISхарактерны самоорганизация и эволюция, для ANN поведе-ние во многом зависит от алгоритма. Количество ячеек AISне является строго фиксированным, их положение изменя-ется динамически, происходит постоянное производство иотмирание ячеек, нейроны же имеют конкретное местопо-ложение, и количество их фиксировано. Более того, для пер-вой не характерно длительное взаимодействие между эле-

Ðèñóíîê 1

Создание случайного набора антител10001000111010….1000100111

Первичный (сырой)

набор антител

Проверка на соответствие

Зрелый набор

Активация

Память

Отмирание

Изменение

Случайное отмирание

детекторов

Превышение

порога активации

Без изменений

Наблюдение

Наблюдение

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

50

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

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

Более подробно этот вопрос освещен в документах«Immune and Neural Network Models:! Theoretical and Empirical Comparisons»: ftp://ftp.dca.fee.

unicamp.br/pub/docs/vonzuben/lnunes/ijcia.pdf.! «Comparing Immune and Neural Networks»: ftp://ftp.dca.fee.

unicamp.br/pub/docs/vonzuben/lnunes/sbrn2002.pdf.

Первые разработки по иммунным системам были изве-стны еще в середине 70-х, но все же масштабные исследо-вания начались совсем недавно, в конце 90-х годов. Поэто-му стоит отметить, что практических реализаций в боль-ших количествах ждать пока не приходится. Но алгоритмыAIS уже находят применение при распознавании образов,в некоторых оптимизационных задачах, поиске и устране-нии неисправностей, в том числе и аппаратных (http://www.osp.ru/cw/2001/47/000_35.htm), обнаружении вирусов,биоинформатике и многих других задачах. Поиск инфор-мации о применении AIS в системах защиты при помощипоисковиков несколько затруднен, так как по запросам вы-водится большое количество ссылок, не всегда соответству-ющих искомому. Большая часть проектов сегодня предос-тавляет только теоретическую информацию, которая будетинтересна в первую очередь математикам и программис-там. В любом случае свои исследования стоит начинать ссайта проекта ARTIST – ARTificial Immune SysTems (http://www.artificial-immune-systems.org), где вы найдете ссылкина проводимые конференции, новости и некоторую другуюинформацию. Задачей проекта ISYS (http://www.aber.ac.uk/~dcswww/ISYS) является разработка теории AIS, исследо-вание возможности ее применения в конкретных областяхи предоставление инструмента, позволяющего самому со-брать и испытать такую систему. Самая большая коллек-ция ссылок по теме AIS расположена по адресу: http://www.dca.fee.unicamp.br/~lnunes/immune.html, плюс здесь вынайдете руководство, и несколько алгоритмов, демонстри-рующих работу AIS в Matlab.

Единственным русскоязычным материалом по защитекомпьютеров при помощи AIS, является статья АлексеяГвозденко «Искусственные иммунные системы как средствосетевой самозащиты» (http://itc.ua/article.phtml?ID=4270).

Computer Immune Systems (http://www.cs.unm.edu/~immsec) – единственный найденный проект по примене-нию AIS для защиты компьютеров. Интересен он еще и по-тому, что предоставляет не только теоретические наработ-ки, но и код.

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

Сетевая система обнаружения атак Lisys для обнаруже-

ния сетевых аномалий контролирует проходящие TCP SYN-пакеты. В случае обнаружения необычных TCP-связей, про-грамма посылает предупреждение по e-mail. Далее реше-ние принимает администратор. Если администратор ничегоне предпринимает, то детектор, пометивший подключениекак аномальное, исчезнет и не будет больше беспокоить.Если аномалия подтверждена, то детектор станет частьюнабора и будет предупреждать пользователя всякий раз приобнаружении подобного подключения. Состоит Lisys из рас-пределенных детекторов размером 49 байт, контролирую-щих «data-path triple», т.е. IP-адресов источника и назначе-ния, а также порт. Сначала детекторы генерируются случай-но и в процессе работы соответствующие нормальному тра-фику постепенно убираются, кроме того, детекторы имеютвремя жизни, и в итоге весь набор, кроме записанных в па-мять, через некоторое время регенерируется. При таком под-ходе возможно появление незаполненных мест в наборе,которое устраняется использованием масок перестановки,позволяющих повторно отобразить «data-path triple», заме-ченное различными детекторами. Для уменьшения количе-ства ложных тревог используется порог активации, превы-шение которого приводит к срабатыванию датчика. Этотпорог активации, как говорилось выше, общий на всю сеть.

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

STIDE (Sequence Time-Delay Embedding) – также былпризван помочь в обнаружении внедрений, распознаваянеобычные эпизоды системных вызовов. В процессе обу-чения stide формирует базу данных из всех уникальных,непрерывных системных вызовов и затем делит их на час-ти предопределенной фиксированной длины. Во время ра-боты stide сравнивает эпизоды, полученные при новых трас-

Ðèñóíîê 2

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

51№11(24), ноябрь 2004

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

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

RISE (Randomized Instruction Set Emulation Building) – этаразработка, основанная на документе «Diverse ComputerSystems» (http://www.cs.unm.edu/~immsec/publications/hotos-97.pdf) являет собой попытку решения еще одной из про-блем – однородности компьютерных систем. Как и в приро-де, если какой-то вид становится доминирующим, то он ста-новится подвержен болезням, заражению и пр. В компью-терном мире ситуация аналогична. Сегодня стараются де-лать компьютерные системы более совместимыми и болеелегкими для использования, и как результат, сейчас можновстретить в одной сети несколько сотен компьютеров прак-тически одинаковой конфигурации, и когда уязвимость най-дена, получается весьма благодатная почва для размноже-ния компьютерных вирусов и для вторжения. Эффекта ран-домизации можно достигнуть, изменяя исходные коды про-граммы, при трансляции, в момент загрузки, комбинируя этии другие способы. Все они имеют как положительные, так иотрицательные стороны. В RISE рандомизируются некото-рые инструкции исполняемого двоичного файла в моментзагрузки, для этого они складываются XOR с неким случай-ным числом. Этот способ имеет ряд преимуществ, так, ненадо хранить измененные программы, возможно использо-вание нового ключа при каждом исполнении, не требуетсяисходный код, не требуется настройка. Такой компьютер с«индивидуализированной» системой команд будет иметьбольшую устойчивость к уязвимостям, вроде переполнениябуфера. Так как изменить системы команд процессора до-

вольно проблематично, то для реализации этой идеи исполь-зуется x86 эмулятор Valgrind (http://valgrind.kde.org), перво-начально предназначенный для отладки памяти. На нынеш-нем этапе RISE представляет собой скорее концепцию, таккак Valgrind сильно замедляет процесс, и для нормальнойработы эмулятору требуется большая оптимизация. Работа-ет RISE (как и остальные утилиты, кроме lisys ) пока только сядрами 2.2 и 2.4, поэтому при попытке собрать с ядром се-рии 2.6, скорее всего, получите такое сообщение.

Еще один проект Computational Immunology for FraudDetection (CIFD) (http://www.icsa.ac.uk/CIFD) занимается раз-работкой системы защиты на базе технологии AIS, кото-рую затем планируется использовать в почтовой службеАнглии, но на момент написания статьи проект предостав-лял только общую информацию о разработках.

AIS – относительно новая область исследований. Изучаяи подражая механизмам естественной иммунной системы,можно получить довольно эффективные решения. Так, но-вый подход к обнаружению атак, примененный в компонен-тах Computer Immune Systems, позволяет выявить и остано-вить широкое разнообразие атак, при этом такие системыне требуют модификаций и минимальной администрации, таккак способны самостоятельно адаптироваться к новым уг-розам, при этом потребляют незначительное количество си-стемных ресурсов. Остается надеяться, что подобные раз-работки в скором времени выберутся из концептуальногосостояния и станут доступны для широкого использования.

checking for the kernel version... unsupported (2.6.4-52-default)

configure: error: Valgrind works on kernels 2.2 and 2.4

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

52

сети

Перехват сетевого трафика может использоваться по раз-ным причинам, но цель у него одна – отслеживать всё про-исходящее на определённом участке в сети. Это может бытькак мониторинг сети с целью выявления тех или иных ню-ансов в штатном режиме работы, так и обнаружение сете-вых атак или выявление нежелательного трафика. Я думаю,читатель cталкивался не с одной задачей, где без перехва-та трафика не обойтись. Реализация перехвата может бытьосуществлена несколькими способами:1. Программная реализация на одном из штатно исполь-

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

2. Использование отдельного компьютера для перехвататрафика совместно с коммутаторами, имеющими портдля мониторинга или концентраторами [4]. В разрыв ис-следуемого участка сети ставится коммутатор или кон-центратор, а уже к нему подключается отдельный ком-пьютер, занимающийся анализом прошедшего трафи-ка. Данный способ не зависит от других компьютеров всети и используемого ими программного обеспечения.

3. Использование отдельного компьютера в мостовомвключении на исследуемом участке. Этот способ не-сколько лучше предыдущего тем, что при желании мож-но организовать не только пассивный просмотр трафи-ка, но и фильтрацию и подмену, т.е. влиять на проходя-щий трафик. Отличие от первого способа состоит в том,что работа с трафиком ведётся на более низком уровне(на канальном, против сетевого в случае шлюза). Какследствие, стандартными средствами вроде tracerouteудалённо обнаружить факт подключения (прослушива-ния и фильтрации) невозможно.

ПАССИВНЫЙ ПЕРЕХВАТ ТРАФИКА

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

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

Ðèñóíîê 1. Ïåðåõâàò òðàôèêà íà áàçå øëþçà ïîä óïðàâëåíèåìÎÑ Linux

Ðèñóíîê 2. Ïåðåõâàò òðàôèêà íà áàçå êîììóòàòîðà ñ ïîðòîììîíèòîðèíãà

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

53№11(24), ноябрь 2004

сети

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

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

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

рудования. Оборудование «посередине» может зависнуть.В случае использования разных по скорости сетевых картили разных режимов работы может оказаться, что одна кар-та работает в режиме 100 Мбит/c в полном дуплексе, а со-ставляющая ей пару на другом конце провода умудряетсяработать со скоростью 10 Мбит/c без дуплекса. Отключивкабель с одной стороны, можно долго удивляться тому, какна другой стороне индикатор «link» почему-то светится и негаснет, и наоборот. Подозрение сразу перейдёт на кабель, апростое подёргивание его с любой стороны от загадочногоместа внутри стены рано или поздно приведёт к «секретнойкомнате» и перехват будет обнаружен. Если всё же исклю-чить ситуации, описанные выше, а вероятность зависанияоборудования «посередине» сделать очень низкой, исполь-зовав различные схемы контроля и перезапуска, то от за-держек при передаче пакетов избавиться не получится. Лю-бое активное оборудование вносит задержки в распростра-нение пакетов [1, стр. 320], задержки малы, но их можно из-мерить и также заподозрить неладное.

Четвёртый способ пассивного перехвата при правиль-ной реализации обнаружить довольно сложно, если не ска-зать что невозможно при здравом уме и ограниченных фи-нансах. Именно подобным образом я и предлагаю физи-чески скрыть подключение1.

Далее предлагаю на этом пункте не останавливаться, аперейти к технической реализации задуманного.

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

менять пары местами);

1 Мой школьный классный руководитель (Чеботарёв А.А.) – умный человек, великолепный педагог и изобретатель, любящий дурачить

людей. Именно у него я и позаимствовал нижеследующую логическую схему рассуждений. Так как кабинету физики городской телефон

не полагался, а звонить удобнее из своего кабинета, не бегая этажом ниже, Александр Андреевич протащил свой провод и подключился

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

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

Чтобы этого не происходило, было решено поставить реле, дистанционно отключающее сигнал, идущий в учительскую на тот момент,

пока телефоном пользовались из кабинета физики. При этом был решён непростой вопрос: «куда деть реле?». Логика рассуждений была

такова. Если телефон в учительской периодически не будет работать, то рано или поздно вызовут телефониста, и первым делом он

пойдёт к распределительной коробке, проверять, есть ли там «гудок» от АТС или нет. Убедившись, что сигнал в здание приходит, он

пойдёт проверять телефонную розетку в учительской. Подёргав её, обнаружит, что телефон вдруг заработал. Если же, когда он будет

проверять розетку, телефон ещё не будет работать (так как его ещё не успеют включить в кабинете физики), то дело может дойти до

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

где-то расположить самопальную схему с реле, то её найдут. Значит, реле и подключение к линии надо где-то спрятать. Лучше всего

спрятать реле в трубу, идущую с этажа на этаж. А подключение сделать «на весу». (Так и было сделано и работает по сей день.) При этом

произойдёт следующее: стену долбить не будут, а с этажа на этаж провод проходит нормально. Снизу потянули – вверху провод тянется,

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

чится. Телефонист подумает, что где-то был неконтакт, и уйдёт довольный, думая, что починил телефон. Хотя на самом деле он ничего не

сделает, кроме как зря потратит своё время на пустые хождения.

Ðèñóíîê 5. Ñîêðûòèå ìåñòà ïîäêëþ÷åíèÿ â ñòåíå

Ðèñóíîê 3. Ïåðåõâàò òðàôèêà íà áàçå ìîñòà ïîä óïðàâëåíèåìÎÑ Linux

Ðèñóíîê 4. Ïåðåõâàò òðàôèêà íà áàçå ôèçè÷åñêîãî ïîäêëþ÷åíèÿ

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

54

сети

! кусачки;! паяльник;! изолирующие материалы.

Вначале аккуратно счищаем изоляцию с подключаемо-го кабеля.

Далее зачищаем места для подпайки отводов на бело-зелёной и бело-оранжевой парах и облуживаем их.

Далее разрезаем кросскорд. Зачищаем у него соответ-ствующие по цвету провода и подпаиваемся к основному ка-белю так, чтобы цвета совпали и оранжевая пара пошла наразводку EIA/TIA T568A, а зелёная – на T568B. В результатеподпаиваемые концы в обоих случаях должны приходить на3-й и 6-й контакты разъёмов.

Далее изолируем место пайки. На стенде это сделано спомощью изоленты, но если есть возможность сделать этоболее основательно (заранее), то можно использовать тер-моусаживающиеся кембрики. А вместо отвода использо-вать одну витую пару, сделав её расчленение на два разъё-ма уже на конце, затем, чтобы место подключения по воз-можности сильно не утолщалось.

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

Но если всё же непонятно, то наглядно и подробно этоописано в [2].

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

Если взять техническую спецификацию организациисети, то можно узнать, что для передачи данных использу-ются только две пары, к которым мы подключились, приэтом назначение части контактов на разъёмах сетевых картследующее.Ðèñóíîê 8. Ïîäïàÿííûå îòâîäû äëÿ ñíÿòèÿ ñèãíàëà

Ðèñóíîê 9. Ïîäïàÿííûå îòâîäû(ìåñòî ïàéêè óâåëè÷åíî)

Ðèñóíîê 10.Çàèçîëèðîâàííîå ìåñòî ïîäêëþ÷åíèÿ

Ðèñóíîê 6. Êóñîê êàáåëÿ ñî ñíÿòîé îáùåé èçîëÿöèåé

Ðèñóíîê 7. Çà÷èùåííûå è îáëóæåííûå ìåñòà äëÿ ïîäïàéêè

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

55№11(24), ноябрь 2004

сети

! 1 – передача +! 2 – передача -! 3 – приём +! 6 – приём -

То есть по четырём проводам (две пары) идут данные впрямом и обратном направлениях. К этим проводам можноподсоединить отводы. Один отвод будет снимать сигналы,идущие в одном направлении, другой – в обратном. Пере-вести обратно в «электронную форму» грубо снятый физи-ческий сигнал можно с помощью тех же сетевых плат, ис-пользовав только схему их приёмной части, подключив кней отводы. При этом если сетевые карты перевести в ре-жим прослушивания (promiscuous mode), то можно будетперехватывать проходящий сетевой трафик. Так как входысетевых карт высокоомные, то подключение на передачуданных влиять не должно. Предполагаю, что если подклю-чение сделать аккуратно, то волновых эффектов вроде от-ражённых и стоячих волн (что частенько встречались в ко-аксиальном Ethernet без терминаторов) можно избежать.На длинных (около 100 м) кусках кабеля подключаться я непробовал. Выходы (сетевых карт, осуществляющих прослу-шивание), работающие на передачу, «висят в воздухе»,

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

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

Для объединения трафика «из двух в один» я предла-гаю использовать технологию Linux bonding, описаннуюмной в [3]. После чего нет ничего проще запустить tcpdump,snort или любую другую программу стандартным способом:на интерфейсе bond0 и наслаждаться их работой.

Замечание. В принципе, если не прибегать к Linux bonding,можно попытаться объединить снятые данные с помощьювсё того же коммутатора с функцией мониторинга портов.Тогда он будет объединять данные с двух портов. Всё быхорошо, но для данной реализации придётся поменять раз-водку А и B местами, так как в коммутаторах она обратная(контакты 1 и 2 работают на приём). Надо найти коммута-тор с описанной выше функцией. Обычный не факт, чтозахочет работать. А самое главное, следует понимать, чтосплошной поток в 200 Мбит передать в 100 Мбит никак неполучится, поэтому при достаточной нагрузке это дело ра-ботать не будет, а использование концентраторов вообщеневозможно по причине большой вероятности коллизий.Что и греха таить, больше половины хороших программи-стов вообще далеки от понимания сути происходящих про-цессов на физическом уровне. А каждая вторая книжкапо безопасности, взять ту же [4], предлагает подключатьсенсоры систем обнаружения атак, как показано на рис. 2.Естественно, при возрастании загрузки в сети за 50%часть атак уже принципиально не может быть обнаруже-на, даже если для всех атак будут записи в сигнатурнойбазе данных. Данные ведь передаются по обоим парамодновременно, а собирать их пытаются каналом вдвое мень-шим. Только недавно стали широко доступны коммутато-ры с портами на 1 Гбит. Да, по такому порту можно сниматьданные со 100-мегабитной сети без потерь, но где гаран-тия что сеть тоже не будет работать на такой же скорости итогда ситуация повторится. Половины пропускной способ-ности в нужный момент не хватит. Вот и получается, что сфинансовой точки зрения проще установить вторую про-стенькую сетевую карту и настроить Linux bonding. Дёше-во и сердито.

Литература, ссылки:1. Олифер В.Г., Олифер Н.А. Компьютерные сети. Прин-

ципы, технологии, протоколы. – СПб: Питер, 2001 г.2. Construction and Use of a Passive Ethernet Tap: http://

www.snort.org/docs/tap.3. Закляков П. На пути повышения надёжности и скорос-

ти: Linux bonding. – Журнал «Системный администра-тор», №10, октябрь 2004 г. – 54-58 c.

4. Лукацкий А.В. Обнаружение атак. – СПб: БХВ-Петер-бург, 2001 г., 432-437 c.

Ðèñóíîê 11. Ñõåìà ðàçâîäêè äëÿ ÷åòûð¸õ ðîçåòîê è ôîòîîäíîé ðîçåòêè

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

56

hardware

В данной статье рассматриваются примеры использованиямультимедийных команд стандарта SCSI (SCSI MultimediaCommands–4, MMC-4) для записи на лазерные диски CD-R/RW различной информации – музыкальных треков и данных.

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

Работоспособность всех примеров программ была про-верена для ОС Linux, ядро 2.4.27. Модель привода для чте-ния и записи компакт-дисков – TEAC CD-W524E Rev 1.0E.Привод подключен как Secondary Master, в ядре включеныподдержка SCSI Generic-драйвера и режим SCSI-эмуляциидля ATAPI-устройств (SCSI host adapter emulation for IDEATAPI devices).

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

Малый кадр содержит:! 3 байта кода синхронизации;! 1 байт данных субканала;! 24 байта данных основного канала (две группы по 12

байт);! 8 байт помехоустойчивого корректирующего кода CIRC,

Cross Interleaved Read-Solomon Code (две группы по 4байта).

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

ного канала и CIRC кодируются 14-разрядными EFM-кодом(Eight to Fourteen Modulation). Дополнительно к каждомуполю добавляются три связывающих бита. Итоговый раз-мер малого кадра, записанного на компакт-диск, равен 588бит (рис.1). 98 последовательно расположенных малых кад-ров образуют кадр (Frame), или сектор, минимально адре-суемую единицу данных на компакт-диске. Один кадр со-держит 24 x 98 = 2352 байт данных основного канала и 98байт субканала. Эти 98 байт в свою очередь делятся на 2байта синхронизации и 96 байт данных. Каждый байт дан-

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

В одном кадре для каждого из этих субканалов содер-жится по 96 бит (12 байт) информации.

Из всех имеющихся в наличии субканалов основнуюинформационную нагрузку несет Q-субканал. В нем содер-жится адресная информация кадра, информация о логичес-кой структуре компакт-диска, идентификационная инфор-мация диска или музыкального трека. Рассмотрим форматданных Q-субканала. Q-субканал содержит:! 2 бита синхронизации (S0, S1);! 4 бита поля управления (Control Field);! 4 бита идентификатора режима данных Q-субканала

(ADR);! 72 бита (9 байт) данных (DATA-Q);! 16 контрольной суммы полей управления, режима дан-

ных и поля данных (CRC).

Поле Control Field определяет тип информации, котораянаходится в основном канале кадра. Это поле может при-нимать следующие значения:! 00x0b – 2 аудиоканала без предыскажения;! 00x1b – 2 аудиоканала, предыскажения 50/15 мкс;! 10x0b – 4 аудиоканала без предыскажений;! 10x1b – 4 аудиоканала, предыскажения 50/15 мкс;! 01x0b – трек данных, непрерывный режим записи (Disk-

at-once, DAO);! 01x1b – трек данных, инкрементный режим записи

(Track-at-once (TAO), Session-at-once (SAO));! 11xxb – зарезервировано.

Поле режима данных Q-субканала ADR определяетформат данных Q-субканала. Подробное описание форма-тов данных Q-субканала находится в спецификации SCSIMMC-4 ([1]), п. 4.2.4.4 «Q Sub-channel».

Блок данных основного канала предназначен для хра-нения информации – аудио или данных. У компакт-дисков,используемых для хранения аудио-информации, все 2352байт блока основного канала заняты аудиоданными. Дляхранения данных используется 6 основных форматов бло-ка основного канала. Наиболее широкое применение полу-чили три формата:! режим данных 1, Yellow Book Mode 1;! форма 1 режима данных 2, CD-ROM XA Mode 2 Form 1;

ЗАПИСЬ ДИСКОВ CD-R/RW В LINUXЧАСТЬ 1

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

Ðèñóíîê 1. Ôîðìàò ìàëîãî êàäðà

Ðèñóíîê 2. Ôîðìàò áàéòà äàííûõ ñóáêàíàëà

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

57№11(24), ноябрь 2004

hardware

! форма 2 режима данных 2, CD-ROM XA Mode 2 Form 2.

Блок основного канала, содержащий данные, начина-ется с поля синхронизации Data Block Sync Pattern длиной12 байт (рис. 3). За полем синхронизации находится заго-ловок блока Header данных длиной 4 байт. Заголовок бло-ка содержит координаты блока данных в формате MSF(Minute/Second/Frame) и байт формата записи данных DataMode. Значение формата блока содержат биты 0-1 байтаData Mode.

Формат данных Mode 1 представлен в таблице 1, форма-ты данных Mode 2 Form 1 и Mode 2 Form 2 – в таблицах 2 и 3.

Пространство CD-ROM делится на три области (рис. 4):! Lead-In Area, входная область диска.! User Data Area, область данных пользователя, или об-

ласть программ.! Lead-Out Area, выходная область диска.

Lead-In-область предназначена для хранения информа-ции об организации данных на компакт-диске. Q-субканалLead-In-области содержит таблицу содержания диска, TableOf Contents (TOC). В TOC хранится информация о сессияхи стартовых адресах треков. Пример чтения и описания фор-мата Q-субканала Lead-In-области (TOC) приведен в [5].

В User Data Area находятся треки с данными пользова-теля. Минимальное число треков, которое может быть запи-сано на компакт-диск, равно 1. Максимальное число трековна диске равно 99. Треки нумеруются начиная с единицы.

Совокупность всех трех областей – Lead-In, User Data,Lead-Out – называется сессией. Любой CD-ROM, содержа-щий информацию, имеет минимум одну сессию. Максималь-ное число сессий зависит от используемого типа компакт-диска. Нумерация сессий начинается с единицы.

Lead-In-область первой сессии является Lead-In-облас-тью всего диска. Lead-Out-область последней сессии явля-ется Lead-Out-областью диска. В User Data-области любойсессии находятся треки с данными.

Диски CD-R и CD-RW содержат две дополнительныеобласти перед первой Lead-In-областью компакт-диска –Power Calibration Area (PCA) и Program Memory Area (PMA).

The Power Calibration Area, PCA – область калибровкимощности пишущего лазера. Область присутствует толькона CD-R и CD-RW дисках. В свою очередь, PCA делится надве области – тестовую область (test area) и область счет-чика (count area).

Тестовая область содержит 100 калибровочных участ-ков. Область счетчика используется для учета количестваиспользованных калибровочных участков. Для калибровкимощности пишущего лазера используется последователь-ность команд READ DISK INFORMATION/SEND OPCINFORMATION (см. [1]).

The Program Memory Area, PMA – область памяти про-грамм. Область присутствует только на CD-R и CD-RW дис-ках и предназначена для учета использования User Data-области носителя. Q-субканал области PMA используетсяв качестве временной TOC при записи треков в инкремен-тном режиме – Track-at-once (TAO), Session-at-once (SAO).При записи диска в режиме Disk-at-once (DAO) данные вPMA не записываются.

SCSI Generic-драйвер. Общие сведенияSCSI Generic-драйвер (далее sg-драйвер) входит в составядра Linux и позволяет приложению пользователя посылатьSCSI-команды устройству при условии, что устройство этикоманды понимает. Доступ к sg-драйверу выполняется че-рез специальные файлы устройства, которые находятся вкаталоге /dev. Список некоторых файлов можно получитьпри помощи команды:

Каждый файл соответствует одному подключенномуSCSI-устройству.

Ðèñóíîê 3. Ñòðóêòóðà ïîëÿ ñèíõðîíèçàöèè Data Block Sync Pattern

Òàáëèöà 1. Mode 1 data format

Òàáëèöà 2. Mode 2 Form 1 data format

Òàáëèöà 3. Mode 2 Form 2 data format

Ðèñóíîê 4. Îáùàÿ ñòðóêòóðà CD-ROM

Ðèñóíîê 5. Îáùàÿ ñòðóêòóðà ìíîãîñåññèîííîãî êîìïàêò-äèñêà

Ðèñóíîê 6. Ñòðóêòóðà CD-R è CD-RW äèñêà

# ls -l /dev/sg[01]

crw------- 1 root root 21, 0 Apr 13 /dev/sg0

crw------- 1 root root 21, 1 Apr 13 /dev/sg1

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

58

hardware

Обращение к SCSI-устройству через sg-драйвер выпол-няется при помощи системного вызова ioctl следующимобразом:

Первый параметр sg_fd – это дескриптор файла sg-уст-ройства /dev/sg*, открытого при помощи системного вызо-ва open( ). Третий параметр – структура следующего типа:

Данная структура определена в файле <scsi/sg.h>. На-значение основных полей структуры:! interface_id – это поле должно содержать литеру «S»;! dxfer_direction – направление передачи данных. Поле мо-

жет принимать следующие значения (см. <scsi/sg.h>):! #define SG_DXFER_NONE (-1) – нет обмена данны-

ми;! #define SG_DXFER_TO_DEV (-2) – передача данных

устройству;! #define SG_DXFER_FROM_DEV (-3) – прием данных

от устройства.! cmdp – указатель на командный пакет, посылаемый ус-

тройству;! cmd_len – размер командного пакета. Если для ATAPI-

устройств размер командного пакета фиксирован и ра-вен 12 байт, то для SCSI-устройств размер пакета мо-жет принимать значения 6, 10, 12 и 16 байт;

! sbp – указатель на буфер SENSE DATA (данные о со-стоянии устройства после выполнения команды, [1, 5]);

! mx_sb_len – максимальный размер буфера SENSE DATA;! sb_len_wr – реальный размер данных, сохраненных в бу-

фере SENSE DATA;! dxferp – указатель на буфер для данных, принимаемых

от устройства или передаваемых устройству;! dxfer_len – размер передаваемых/принимаемых данных;

! iovec_count – если это поле равно 0, то буфер для дан-ных представляет собой простой линейный массив байт,и поле dxferp – указатель на этот массив. В противномслучае dxferp указывает на массив структур типа:

а поле iovec_count – число структур в этом массиве.

Подробная информация о sg-драйвере приведена вSCSI-Generic-HOWTO [4].

Рассмотрим порядок использования sg-драйвера напримере чтения PMA (Program Memory Area) CD-R/RW дис-ка. Для чтения PMA устройству необходимо послать коман-ду READ TOC/PMA/ATIP. Формат этой команды описан в[1], пример использования был рассмотрен в [5]. Для чте-ния PMA поле Format должно содержать значение 0011b. Вответ на команду READ TOC/PMA/ATIP устройство вернетблок данных следующего формата:

Поле PMA Data Length содержит размер данных PMA,при этом длина самого поля (2 байта) не учитывается. На-значение каждого байта дескриптора PMA определяетсязначением поля ADR:

Заголовочные файлы:

Ðèñóíîê 7. Ôîðìàò äàííûõ PMA, Format Field = 0011b

Òàáëèöà 4

#include <stdio.h>#include <fcntl.h>#include <errno.h>#include <scsi/scsi.h>#include <scsi/sg.h>#include <linux/types.h>#include <linux/byteorder/swab.h>

ioctl(sg_fd, SG_IO, struct sg_io_hdr *)

typedef struct sg_io_hdr{

int interface_id; /*'S' for SCSI generic (required) */int dxfer_direction; /* data transfer direction */unsigned char cmd_len; /* SCSI command length ↵↵↵↵↵

( <= 16 bytes) */unsigned char mx_sb_len; /* max length to write to sbp */unsigned short iovec_count; /* 0 implies no scatter ↵↵↵↵↵

gather */unsigned int dxfer_len; /* byte count of data transfer */void * dxferp; /* points to data transfer memory ↵↵↵↵↵

or scatter gather list */unsigned char * cmdp; /* points to command to perform */unsigned char * sbp; /* points to sense_buffer memory */unsigned int timeout; /* MAX_UINT->no timeout ↵↵↵↵↵

(unit: millisec) */unsigned int flags; /* 0 -> default, see SG_FLAG... */int pack_id; /* unused internally (normally) */void * usr_ptr; /* unused internally */unsigned char status; /* scsi status */unsigned char masked_status; /* shifted, masked scsi ↵↵↵↵↵

status */unsigned char msg_status; /* messaging level data ↵↵↵↵↵

(optional) */unsigned char sb_len_wr; /* byte count actually ↵↵↵↵↵

written to sbp */unsigned short host_status; /* errors from host adapter */unsigned short driver_status; /* errors from ↵↵↵↵↵

software driver */int resid; /* dxfer_len - actual_transferred */unsigned int duration; /* time taken by cmd ↵↵↵↵↵

(unit: millisec) */unsigned int info; /* auxiliary information */

} sg_io_hdr_t; /* 64 bytes long (on i386) */

typedef struct sg_iovec {void * iov_base; /* starting address */size_t iov_len; /* length in bytes */

} sg_iovec_t,

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

59№11(24), ноябрь 2004

hardware

Следующая структура описывает формат данных PMA,представленный на рис. 7:

Обмен данными с sg-драйвером выполняет функцияsend_cmd(). Параметры функции:! cmd – указатель на командный пакет;! cmdlen – длина командного пакета;! direction – направление передачи данных;! data – указатель на блок памяти для данных, передава-

емых устройству или принимаемых от устройства. Еслиобмен данными не предусмотрен, этот параметр содер-жит значение NULL;

! datalen – размер блока данных, на который указываетdata. Если data == NULL, то datalen == 0

! timeout – значения time-out.

Проверку готовности устройства к приему команды вы-полняет функция test_unit_ready():

Чтение PMA выполняет функция read_pma():

int send_cmd(__u8 *cmd, __u8 cmdlen, unsigned int direction, ↵↵↵↵↵__u8 *data, __u32 datalen, unsigned int timeout)

{int k = 0;sg_io_hdr_t io_hdr;

/* Â sense_buffer áóäåò ñîõðàíåíà èíôîðìàöèÿ î ñîñòîÿíèè* óñòðîéñòâà ïîñëå âûïîëíåíèÿ êîìàíäû

*/__u8 sense_buffer[32];

/* Ôîðìèðóåì çàïðîñ ê sg-äðàéâåðó � çàïîëíÿåì ïîëÿ* ñòðóêòóðû sg_io_hdr_t íåîáõîäèìûìè çíà÷åíèÿìè

*/memset(&io_hdr, 0, sizeof(sg_io_hdr_t));io_hdr.interface_id = 'S';io_hdr.cmd_len = cmdlen; // äëèíà êîìàíäûio_hdr.mx_sb_len = sizeof(sense_buffer);io_hdr.dxfer_direction = direction; // íàïðàâëåíèå ↵↵↵↵↵

ïåðåäà÷è äàííûõio_hdr.dxfer_len = datalen; // ðàçìåð äàííûõio_hdr.dxferp = data; // óêàçàòåëü íà áëîê äàííûõio_hdr.cmdp = cmd; // óêàçàòåëü íà êîìàíäíûé ïàêåòio_hdr.sbp = sense_buffer;io_hdr.timeout = timeout;

/* Ïîñûëàåì óñòðîéñòâó êîìàíäó */if(ioctl(sg_fd, SG_IO, &io_hdr) < 0) {

perror("SG_IO ioctl");return -1;

}/* Îòîáðàçèì ñîäåðæèìîå sense_buffer, åñëè ïðè âûïîëíåíèè* êîìàíäû ïðîèçîøëà îøèáêà. Ýòî ïîçâîëèò óñòàíîâèòü* ïðè÷èíó îøèáêè

*/if((io_hdr.info & SG_INFO_OK_MASK) != SG_INFO_OK) {

if (io_hdr.sb_len_wr > 0) {printf("Sense data: ");for (k = 0; k < io_hdr.sb_len_wr; ++k) {

if ((k > 0) && (0 == (k % 10))) printf("\n ");printf("0x%02x ", sense_buffer[k]);

}printf("\n");

}if(io_hdr.masked_status)

printf("SCSI status=0x%x\n", io_hdr.status);

int read_pma(){

int i, k;__u8 read_pma_cmd[10];__u8 *pma_data_buff; // çäåñü áóäóò ñîõðàíåíû ↵↵↵↵↵

ðåçóëüòàòû ÷òåíèÿ PMA__u16 buff_size = 0xFFFF; // ðàçìåð áëîêà ïàìÿòè ↵↵↵↵↵

äëÿ õðàíåíèÿ ñ÷èòûâàåìûõ äàííûõ__u16 pma_data_length = 0; // ðåàëüíàÿ äëèíà çàïèñåé PMA__u32 lba;int pma_entries = 0; // ÷èñëî çàïèñåé PMApma_t *pma;

/* Ïðîâåðÿåì ãîòîâíîñòü óñòðîéñòâà ê ïðèåìó êîìàíäû */if(test_unit_ready() < 0) exit(-1);pma_data_buff = (__u8 *)malloc(buff_size);memset(pma_data_buff, 0, buff_size);

/* Ôîðìèðóåì êîìàíäíûé ïàêåò */memset(read_pma_cmd, 0, 10);read_pma_cmd[0] = 0x43; // êîä êîìàíäû READ_TOC/PMA/ATIPread_pma_cmd[2] = 3; // ïîëå Format Field = 011b, ↵↵↵↵↵

÷èòàåì PMAread_pma_cmd[7] = 0xFF;read_pma_cmd[8] = 0xFF;

/* Ïîñûëàåì óñòðîéñòâó êîìàíäó */if(send_cmd(read_pma_cmd, 10, SG_DXFER_FROM_DEV, ↵↵↵↵↵

pma_data_buff, buff_size, 20000) < 0) return -1;/* Ñ÷èòûâàåì äëèíó çàïèñåé PMA. Ðàçìåð ïîëÿ PMA Data Length* (2 áàéòà) íå ó÷èòûâàåòñÿ*/

memcpy(&pma_data_length, pma_data_buff, 2);pma_data_length = __swab16(pma_data_length);printf("PMA data length - %d\n", pma_data_length);

/* Îïðåäåëÿåì ÷èñëî çàïèñåé PMA */pma_entries = (pma_data_length - 2)/11;printf("PMA entries - %d\n", pma_entries);

/* Ðàçìåð äàííûõ PMA òî÷íî èçâåñòåí è ðàâåí pma_data_length.* Âûäåëÿåì áëîê ïàìÿòè äëÿ äàííûõ PMA è êîïèðóåì èõ òóäà* èç pma_data_buff. Ïîñëå ýòîãî ìîæíî îñâîáîäèòü áëîê* ïàìÿòè, íà êîòîðûé óêàçûâàåò pma_data_buff

*/pma = (pma_t *)malloc(pma_data_length);memset((void *)pma, 0, pma_data_length);memcpy((void *)pma, pma_data_buff + 4, pma_data_length);free(pma_data_buff);

/* Îòîáðàæàåì äàííûå PMA */printf("Entry\tADR\tCTRL\tPoint\tZero\tMin\tSec\ ↵↵↵↵↵

tFrame\tPMin\tPsec\tPFrame\tLBA\n");for(i = 0; i < pma_entries; i++) {

printf("%d\t", i);printf("%X\t", (pma + i)->adr);printf("%X\t", (pma + i)->ctrl);printf("%X\t", (pma + i)->point);printf("%d\t", (pma + i)->zero);printf("%d\t", (pma + i)->min);printf("%d\t", (pma + i)->sec);

#define SG_DEV "/dev/sg0" // èìÿ ôàéëà óñòðîéñòâà// Ìàêðîñ äëÿ ïåðåñ÷åòà êîîðäèíàò ñåêòîðà èç MSF ôîðìàòà â LBA#define MSF2LBA(Min, Sec, Frame) (((Min * 60 + Sec) * ↵↵↵↵↵

75 + Frame) - 150)int sg_fd; // ôàéëîâûé äåñêðèïòîð

typedef struct { __u8 rez; // reserved __u8 ctrl :4; // Control __u8 adr :4; // ADR __u8 tno; // TNO (always 0) __u8 point; // POINT __u8 min; // AMIN __u8 sec; // ASEC __u8 frame; // AFRAME __u8 zero; // 0 __u8 pmin; // PMIN __u8 psec; // PSEC __u8 pframe; // PFRAME} __attribute__ ((packed)) pma_t;

if(io_hdr.host_status)printf("Host_status=0x%x\n", ↵↵↵↵↵

io_hdr.host_status);if(io_hdr.driver_status)

printf("Driver_status=0x%x\n", ↵↵↵↵↵io_hdr.driver_status);

return -1;}return 0;

}

int test_unit_ready(){

__u8 testCmdBlk[6];/* Prepare TEST UNIT command */memset(testCmdBlk, 0, 6);if(send_cmd(testCmdBlk, 6, SG_DXFER_NONE, NULL, ↵↵↵↵↵

0, 20000) < 0) {printf("Unit not ready\n");return -1;

}return 0;

}

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

60

hardware

Вызов функции read_pma() для чтения данных PMA вы-полняется из главной функции:

Открываем файл устройства. Обратите внимание на ре-жим открытия – чтение/запись. Если устройство открыто врежиме «Только чтение» (O_RDONLY), то оно воспринима-ет команды (см. [4]):! INQUIRY! TEST UNIT READY! REQUEST SENSE! READ CAPACITY! READ BUFFER! READ(6) (10) and (12)! MODE SENSE(6) and (10)

Полный текст данной программы находится в файле SG/read_pma.c.

Устанавливаем в устройство диск CD-RW, на которомзаписано 3 аудиотрека, и запускаем программу на выпол-нение. Результаты работы программы:

Для анализа полученных результатов воспользуемсятаблицей 4.

Свойства, профили и страницырежимов устройства

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

Одно устройство может поддерживать несколько свойств.Базовый набор свойств устройства называется профилем(Profile). Перечень всех существующих свойств и профилейприведен в спецификации SCSI MMC-4, п. 5 «Features andProfiles for Multi-Media Device».

Для того чтобы выяснить, обладает ли устройство темили иным свойством, ему необходимо послать команду GETCONFIGURATION. Данная команда определена в специфи-кации [1] и позволяет получить полный список свойств, под-держиваемых устройством и текущий профиль устройства.Текущий профиль определяет, какие именно свойства дос-тупны на данный момент. По команде GET CONFIGURATIONустройство вернет блок данных, состоящий из заголовкасвойства (Feature Header) и списка дескрипторов свойств(Feature Descriptors):

Поле Data Length содержит размер считанных данных,следующих за эти полем, в поле Current Profile находитсязначение текущего профиля устройства. Если свойство неподдерживается устройством, то команда GET CONFIGU-RATION вернет только заголовок свойства, и поле DataLength будет содержать значение 4 (2 поля Reserved по од-ному байту каждое + 2 байта поля Current Profile).

Назначение полей дескриптора свойства:! Feature Code – код свойства. Каждое свойство имеет

свой уникальный код. Список всех кодов приведен в спе-цификации [1], п. 5.3 «Feature Definitions».

! Persistent – если этот бит установлен в 0, то данное свой-ство может менять текущий статус. Если бит равен 1,то свойство всегда активно.

! Current – если бит установлен в 1, то данное свойствоактивно, т.е. устройство поддерживает набор команд,определенный этим свойством.

! Feature Dependent Data – данные, специфичные для ука-занного свойства.

Назначение полей командного пакета:! RT – определяет тип данных, возвращаемых устрой-

ством. Поле может принимать следующие значения:

int main(){

if((sg_fd = open(SG_DEV, O_RDWR)) < 0) {perror("open");return -1;

}/* Ñ÷èòûâàåì PMA */

if(read_pma() < 0) printf("Cannot read PMA\n");close(sg_fd);return 0;

}

PMA data length - 46

PMA entries - 4

Entry ADR CTRL Point Zero Min Sec Frame PMin Psec PFrame LBA

0 2 0 0 0 54 88 82 0 0 0 ---

1 1 0 1 0 5 3 16 0 2 0 0

2 1 0 2 0 8 28 58 5 5 16 22741

3 1 0 3 0 12 30 21 8 30 58 38158

Ðèñóíîê 8. Ôîðìàò áëîêà äàííûõ, âîçâðàùàåìîãî ïî êîìàíäåGET CONFIGURATION

Ðèñóíîê 9. Ôîðìàò çàãîëîâêà ñâîéñòâà

Ðèñóíîê 10. Îáùèé ôîðìàò äåñêðèïòîðà ñâîéñòâà

printf("%d\t", (pma + i)->frame);printf("%d\t", (pma + i)->pmin);printf("%d\t", (pma + i)->psec);printf("%d\t", (pma + i)->pframe);lba = MSF2LBA((pma + i)->pmin, (pma + i)->psec, ↵↵↵↵↵

(pma + i)->pframe);if((pma + i)->adr != 1) printf("---\n");else printf("%u\n", lba);

}free(pma);return 0;

}

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

61№11(24), ноябрь 2004

hardware

! 00b – устройство возвращает заголовок свойства идескрипторы всех свойств, поддерживаемых устрой-ством, даже если свойство не является активным.

! 01b – устройство возвращает заголовок свойства идескрипторы активных свойств устройства (у кото-рых бит Current установлен в единицу).

! 10b – устройство возвращает заголовок и дескрип-тор свойства, номер которого задан в поле StartingFeature Number. Если запрашиваемое свойство неподдерживается устройством, возвращается толькозаголовок свойства Feature Header (рис. 9).

! 11b – зарезервировано.! Allocation Length – размер памяти, выделенной для дан-

ных.

Рассмотрим пример. Необходимо выяснить, может лиустройство выполнить запись треков на компакт-диск в ре-жиме TAO. Для этого надо установить, обладает ли устрой-ство свойством «СD Track at Once». Код этого свойстваравен 0x002D (см. [1]).

Устройство способно выполнить запись трека на ком-пакт-диск в режиме TAO в том случае, если бит CD-RW ус-тановлен в единицу.

Рассмотрим функцию, выполняющую проверку наличияу устройства свойства «СD Track at Once» и значение битаCD-RW. Функция принимает один параметр – код свойства.Полный текст программы приведен в файле SG/get_conf.c.

Устанавливаем в привод CD-RW диск и запускаем про-грамму на выполнение. Результаты работы:

Текущий профиль устройства – CD-RW, см. п. 5.4.10«Profile 000Ah: CD-RW» спецификации SCSI MMC-4 ([1]).Список свойств, соответствующих данному профилю, при-веден в этом же пункте, в таблице 192 «Mandatory Featurefor CD-RW». Свойство «CD Track at Once» входит в их число.

Теперь установим в привод диск CD-ROM и опять запу-стим программу на выполнение. Результаты работы про-граммы:

Свойство «CD Track at Once» приводом поддерживается,но текущий профиль – 0x0008, CD-ROM – не позволяет этосвойство применять. Список свойств, соответствующих про-филю «CD-ROM», приведен в таблице 188 «Mandatory Featurefor CD-ROM», п. 5.4.8 спецификации SCSI MMC-4 ([1]).

Страницы режимовДля установки или определения параметров работы устрой-ства используются страницы режимов (Mode Page). Каждаястраница режима характеризуется кодовым номером, дли-ной и набором параметров. В таблице 5 приведен списоккодов некоторых страниц режимов. Полный перечень нахо-дится в спецификации SCSI MMC-4, п. 7.1.3 «Mode Pages».

Ðèñóíîê 12. Ôîðìàò äåñêðèïòîðà ñâîéñòâà «ÑD Track at Once»

int get_conf(__u16 f_num){

__u8 get_conf_cmd[10];__u8 data_buff[16]; // ðåçóëüòàòû ÷òåíèÿ__u32 data_length = 0; // ðåàëüíàÿ äëèíà äàííûõ__u16 current_prof = 0; // çíà÷åíèå òåêóùåãî ïðîôèëÿ__u16 f_code = 0; // êîä ñâîéñòâà

/* Æäåì ãîòîâíîñòü óñòðîéñòâà */if(test_unit_ready() < 0) exit(-1);

/* Ôîðìèðóåì êîìàíäíûé ïàêåò */memset(data_buff, 0, 16);memset(get_conf_cmd, 0, 10);get_conf_cmd[0] = 0x46; // êîä êîìàíäû GET CONFIGURATIONget_conf_cmd[1] = 2; // RT= 10bget_conf_cmd[8] = 16;

/* Â ïîëå Starting Feature Number çàíîñèì êîä ñâîéñòâà */f_num = __swab16(f_num);memcpy((get_conf_cmd + 2), (void *)&f_num, 2);

/* Ïîñûëàåì óñòðîéñòâó êîìàíäó */if(send_cmd(get_conf_cmd, 10, SG_DXFER_FROM_DEV, ↵↵↵↵↵

data_buff, 16, 20000) < 0) return -1;/* Îïðåäåëÿåì äëèíó ñ÷èòàííûõ äàííûõ */

memcpy((void *)&data_length, data_buff, 4);data_length = __swab32(data_length);printf("\nFeature data length - %u\n", data_length);

/* Åñëè äëèíà ñ÷èòàííûõ äàííûõ ðàâíà 4, òî çàïðàøèâàåìîå* ñâîéñòâî íå ïîääåðæèâàåòñÿ*/

if(data_length == 4) return -1;/* Îïðåäåëÿåì çíà÷åíèå òåêóùåãî ïðîôèëÿ */

memcpy((void *)&current_prof, data_buff + 6, 2);current_prof = __swab16(current_prof);printf("Current profile - 0x%.4X\n", current_prof);

/* Êîä ñâîéñòâà, çíà÷åíèå äîëæíî ñîâïàäàòü* ñ ïàðàìåòðîì f_num*/

memcpy((void *)&f_code, (data_buff + 8), 2);f_code = __swab16(f_code);printf("Feature Code - 0x%.4X\n", f_code);printf("Byte 4: 0x%X\n", data_buff[12]);

/* Ïðîâåðÿåì çíà÷åíèå áèòà CD-RW. Åñëè áèò óñòàíîâëåí* â åäèíèöó � çàïðàøèâàåìîå ñâîéñòâî óñòðîéñòâîì* ïîääåðæèâàåòñÿ

*/if(data_buff[12] & 0x02) ↵↵↵↵↵

printf("Feature CD TAO support\n\n");else return -1;return 0;

}

Feature data length - 12

Current profile - 0x000A

Feature Code - 0x002D

Byte 4: 0x6

Feature CD TAO support

Feature data length - 12

Current profile - 0x0008

Feature Code - 0x002D

Byte 4: 0x6

Feature CD TAO support

Òàáëèöà 5

Ðèñóíîê 11. Ôîðìàò êîìàíäû GET CONFIGURATION

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

62

hardware

Прием и передача страниц осуществляется при помощисписка параметров режима Mode Parameter List. Список стра-ниц начинается с заголовка (Mode Parameter Header), за ко-торым могут следовать одна или несколько страниц режи-мов (рис. 13).

Поле Mode Data Length содержит размер блока данных,следующего сразу за этим полем, т.е. 6 оставшихся байтзаголовка плюс длину запрашиваемой страницы. Если стра-ница передается устройству, то значение поля Mode DataLength не используется (зарезервировано).

Страница параметров режима записиРассмотрим подробнее, что из себя представляет страни-ца режима, на примере страницы параметров режима за-писи, Write Parameters Mode Page.

Назначение полей:! Page Code – код страницы, содержит значение 0x05.

! Page Length – размер страницы в байтах.! Write Type – используемый режим записи:

! 01 – Track-at-once (TAO);! 02 – Session-at-once (SAO);! 03 – RAW.

! Test Write – режим имитации записи данных на носи-тель. Бит имеет значение только для режимов TAO иSAO.

! Track Mode – содержит значение поля управления ControlField Q-субканала при ADR = 1 (см. «Физический фор-мат данных на компакт-диске»). В данной статье будетиспользовано только два значения этого поля:! 0 – аудио-трек;! 4 – трек данных.

! Multi-session – показывает, как закрытие текущей сес-сии влияет на открытие следующей:! 00b – указатель B0 отсутствует в TOC, открытие но-

вой сессии запрещено ([3, 5]);! 01b – указатель B0 содержит значение FF:FF:FF, от-

крытие новой сессии запрещено;! 11b – открытие новой сессии разрешено. Указатель

B0 содержит координаты начала следующей облас-ти программ.

! Data Block Type – определяет тип блока данных и егоразмер. Перечень всех значений этого поля находитсяв таблице 619 «Data Block Type Codes» спецификацииMMC-4. В данной статье будет использовано только двазначения:! 0 – блок «сырых» данных размером 2352 байт (блок

аудиоданных);! 8 – блок данных размером 2048 байт, формат блока

данных Mode 1.! Session Format – формат сессии. Это значение записы-

вается в поле PSEC указателя A0 таблицы содержаниядиска TOC. Поле может принимать следующие значе-ния:! 00h – диск CD-DA или CD-ROM! 01h – диск CD-I! 20h – диск CD-ROM XA

В поле Sub-Header устройству передается информациядля заполнения подзаголовка сектора при записи на дискданных в формате Mode 2 Form 1/2 (см. табл. 2 и 3).

Во второй части статьи будут рассмотрены примерыпрограмм, выполняющих запись на компакт-диск CD-R/RWразличной информации, музыкальных треков и данных.

Литература, ссылки:1. Спецификация SCSI Multimedia Commands-4 (SCSI

MMC-4), http://www.t10.org/ftp/t10/drafts/mmc4/mmc4r03d.pdf2. Спецификация SCSI-3 Multimedia Commands, http://

www.t10.org/ftp/t10/drafts/mmc/mmc-r10a.pdf3. Specification for ATAPI DVD Devices, ftp.seagate.com/sff/

INF-8090.pdf4. SCSI-Generic-HOWTO, http://www.linux.org/docs/ldp/

howto/SCSI-Generic-HOWTO/index.html5. Мешков В. Пакетные команды интерфейса ATAPI. – Жур-

нал «Системный администратор», № 9(22), сентябрь2004 г. – 70-84 с.

Ðèñóíîê 14. Ôîðìàò çàãîëîâêà ñïèñêà ñòðàíèö (Mode ParameterHeader)

Ðèñóíîê 15. Ôîðìàò ñòðàíèöû ïàðàìåòðîâ ðåæèìà çàïèñè

Ðèñóíîê 13. Ôîðìàò ñïèñêà Mode Parameter List

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

Уязвимость протокола DHCPв оборудовании CiscoПрограмма: 12.2(18)EW, 12.2(18)EWA, 12.2(18)S, 12.2(18)SE,12.2(18)SV, 12.2(18)SW,12.2(14)SZ.Опасность: Высокая.Описание: 11 ноября 2004 опубликован бюллетень CERT,сообщающий о наличии уязвимости в различных версияхCisco IOS, используемых в маршрутизаторах, коммутато-рах и линейных интерфейсах.

Проблема связана со способом обработки пакетовDHCP в системах Cisco IOS. Используя уязвимость реали-зации протокола, можно организовать атаку на службы(DoS). Обработка пакетов DHCP по умолчанию включена,что повышает уровень опасности.

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

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

Отказ в обслуживаниив Kerio Personal FirewallПрограмма: Kerio Personal Firewall версии до 4.1.2.Опасность: Высокая.Описание: Удаленный атакующий может вызвать отказ вобслуживании системы. Уязвимость существует при обра-ботке определенных пакетов. Удаленный атакующий можетпослать специально сформированный пакет и заставитьслужбу потреблять все доступные ресурсы на системе.URL производителя: www.kerio.com/kpf_home.htmlРешение: Установите обновление: http://www.kerio.com/kpf_download.html.

DoS-атака в ApacheПрограмма: Apache 2.0.52 и более ранние версии 2.0.x.Опасность: Высокая.Описание: Удаленный атакующий может заставить служ-бу потребить все доступные ресурсы на системе.

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

Пример:

URL производителя: httpd.apache.org.Решение: Установите последнюю версию.

GET / HTTP/1.0\n[space] x 8000\n[space] x 8000\n[space] x 8000\n8000 ðàç

Отказ в обслуживаниив Sun Java System Application ServerПрограмма: Sun Java System Application Server 7 StandardEdition Update 4 и более ранние версии, 7 Platform EditionUpdate 4 и более ранние версии, 7 2004Q2.Опасность: Высокая.Описание: Удаленный атакующий может аварийно завер-шить работу службы. Уязвимость существует при обработ-ке сертификатов в Sun Java System Application Server. Уда-ленный атакующий может специальным образом создатьсертификат, который при проверке уязвимым серверомприведет к отказу в обслуживании. Также сообщается омножественных ошибках при обработке ASN.1.URL производителя: www.sun.com.Решение: Установите обновление.

Неавторизованный доступк сетевым ресурсам в Cisco ACSПрограмма: Cisco Secure ACS for Windows и Cisco SecureACS Solution Engine версии 3.3.1.Опасность: Высокая.Описание: Уязвимость существует при обработке серти-фикатов в Cisco Secure Access Control Server при использо-вании EAP-TLS (Extensible Authentication Protocol-TransportLayer Security) для авторизации пользователей. Удаленныйатакующий может создать криптографически корректныйсертификат (сертификат соответствующего формата с ва-лидными полями, не зависимо от его срока жизни и от того,выдан ли он доверенным CA) и пройти авторизацию на CiscoACS.URL производителя: www.cisco.com.Решение: Установите обновление: http://www.cisco.com/pcgi-bin/tablebuild.pl/cs-acs-win.

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

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

Как было отмечено выше, сервис DHCP по умолчаниювключен в IOS. Для запрета DHCP требуется явное вклю-чение команды no service dhcp в конфигурационный файлустройства. Отсутствие в конфигурационном файле устрой-ства команды service dhcp не означает, что сервис не под-держивается устройством, его нужно явно отключить с по-мощью приведенной выше команды. Таким образом, уяз-вимость устройств сохраняется независимо от того, исполь-зуются ли они в качестве серверов или трансляторов DHCP.

Передавая специально сформированные пакеты DHCPатакуемому устройству, злоумышленник может полностьюблокировать обработку этим устройством входящего тра-фика и для восстановления работоспособности устройствапотребуется его перезагрузка.URL производителя: www.cisco.com.Решение: Обновление версии IOS.

bugtraq

63№11(24), ноябрь 2004

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

64

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

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

Однако не буду концентрировать ваше внимание на не-правильном подходе к организации IT-работы на предпри-

ятии. Замечу, что ситуации, когда необходимо обработатьинформацию и сформировать из нее новые данные, не яв-ляются единичными как для системных инженеров, адми-нистраторов, так и для программистов. Сооружать некийайсберг ради кратковременной и нетребовательной зада-чи я считаю нерациональным решением. Использовать го-товые шаблоны также не всегда удобно (затрачивается вре-мя на изучение требований к этим шаблонам и т. п.). Кро-ме того, полученный код хотелось бы использовать на не-скольких ОС. Поэтому я остановил свой выбор на продук-те, предназначенном для создания кроссплатформенныхприложений FLTK (Fast Light ToolKit). Почему он называет-ся именно так, и чем интересен, вы узнаете, ознакомив-шись с данным материалом.

СОЗДАЕМ КРОССПЛАТФОРМЕННОЕ ПРИЛОЖЕНИЕНА ОСНОВЕ FLTK

АНТОН БОРИСОВ

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

65№11(24), ноябрь 2004

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

Краткая предысторияИзначально пакет разрабатывал Bill Spitzak как удобную ибыструю альтернативу существовавшим тогда монстрам.Во время работы в Sun Microsystems и Digital Domain кон-цепция FLTK неоднократно перерабатывалась и дополня-лась. Некоторые идеи были заимствованы из NeXT, NeWS,Forms. Само название несколько раз трансформировалось,была даже попытка назвать продукт как FL, но из-за того,что в поисковых машинах слово FL в первую очередь ин-терпретировалось как обозначение штата Флорида (FL),было решено придумать другое название. В итоге получи-лось то, что известно под акронимом FLTK (Full-Tick).

Для сегодняшнего обзора необходимо вооружиться сле-дующим инструментарием – самим пакетом FLTK, компи-лятором gcc, интегрированной средой разработки Eclipse,продуктом для Win32 платформы Microsoft Visual Studio 6.0и симпатичной кроссплатформенной библиотекой для ра-боты с PNG-графикой – pngwriter. Будем использовать вер-сию 1.1.5 (последняя стабильная ветка) [1].

Что касается компилятора, то надеюсь, что инструмен-тарий разработчика вы уже поставили. Если нет, то следу-ет поставить пакеты gcc и g++. А также пригодится make.

Следует сказать огромное спасибо фирме IBM за ин-тегрированную среду разработки Eclipse. Мало того, чтокомпания предоставляет исходники продукта на всеобщееобозрение, так он еще и предназначен для работы на не-скольких аппаратных и программных платформах. Срединих: Windows 98/ME/2000/XP, Linux (x86/Motif, GTK 2), Linux(AMD 64/GTK 2), Solaris 8 (SPARC/Motif), AIX (PPC/Motif), HP-UX (HP9000/Motif), Mac OSX (Mac/Carbon).

Данное ПО основано на Java, поэтому убедитесь, что ввашей системе установлена версия JRE не ниже 1.4. Сре-ди недостатков решений, основанных на Java, стоит отме-тить жадность к ресурсам и не блещущее быстродействие.

Я использовал при работе Eclipse версии 2.1.3. На мо-мент написания статьи выпущена версия 3.0.1, но для на-ших ознакомительных целей вполне подойдет и вторая вер-сия. Информация о том, с каких сайтов можно загрузить дан-ное ПО, есть по адресу: http://download.eclipse.org/downloads,ht tp://download.ecl ipse.org/downloads/drops/R-2.1.3-200403101828/eclipse-SDK-2.1.3-linux-gtk.zip (65 Мб).

Это только основное ядро. Теперь заберем дополнитель-ный пакет для C/C++ разработки. Он называется CDT (C/C++Development Tool): http://www.eclipse.org/tools/downloads.html,http://download.eclipse.org/tools/cdt/updates/release/dist/cdt-full-1.2-linux-gtk.zip (3 Мб).

Также для второй версии Eclipse существует пакет ру-сификации. Насколько хорошо он переведен, не берусьсудить, т.к. причин опробовать его пока не возникало. Поумолчанию в Eclipse не используется CDT. Его нужно ус-танавливать дополнительно. То есть распаковать архивcdt-full-1.2-linux-gtk.zip и положить содержимое из катало-гов «plugins» и «features» в установленную директорию сEclipse. В главной директории Eclipse уже существуют та-кие каталоги – в них и нужно положить распакованныефайлы.

Однако вышел вот какой казус – Eclipse не распозналдобавленных расширений по неизвестной для меня причи-не. Поэтому я поступил следующим образом. Создал сим-

волические ссылки на файлы CDT, и вот что получилось вдиректории features:

Аналогичным образом следует поступить и для дирек-тории plugins. При таком варианте уже возможно созданиепроекта на C/C++.

Что касается графики, то я решил выбрать pngwriter последующим причинам: отсутствует проблема с лицензиро-ванием, формат PNG на сегодняшний день широко распро-странен, и понравились функции для работы с графикой вданном пакете.

Документация, идущая с pngwriter [2], достаточно ши-роко освещает аспекты сборки как под Linux, так и подWin32. С другими ОС проблем не будет, если в системе естькомпилятор: http://heanet.dl.sourceforge.net/sourceforge/pngwriter/pngwriter-0.5.0.tgz (640 Кб).

Также, надеюсь, у вас не возникнет проблем с MicrosoftVisual Studio 6.0.

Теперь главный герой сегодняшнего эпоса – FLTK.

Если мультипоточность в FLTK не нужна, то можно неиспользовать опцию «--enable-threads». То же самое каса-ется и улучшенной поддержки шрифтов (антиалиасинг) –опция «--enable-xft».

В итоге получились следующие библиотеки в директо-рии /usr/local/fltk-1.1.5/lib:

Сборка pngwriter еще проще.

tar xzvf fltk-1.1.5-source.tar.bz2cd fltk-1.1.5./configure --prefix=/usr/local/fltk-1.1.5 --enable-xft ↵↵↵↵↵

--enable-threads

make && make install

drwxr-xr-x org.eclipse.cdt_1.2.1

lrwxrwxrwx org.eclipse.cdt_2.1.3 -> org.eclipse.cdt_1.2.1

drwxr-xr-x org.eclipse.cdt.linux.gtk_1.2.1

lrwxrwxrwx org.eclipse.cdt.linux.gtk_2.1.3 -> org.eclipse.cdt.linux.gtk_1.2.1

drwxr-xr-x org.eclipse.cdt.linux.motif_1.2.1

lrwxrwxrwx org.eclipse.cdt.linux.motif_2.1.3 -> org.eclipse.cdt.linux.motif_1.2.1

drwxr-xr-x org.eclipse.cdt.make_1.2.1

lrwxrwxrwx org.eclipse.cdt.make_2.1.3 -> org.eclipse.cdt.make_1.2.1

drwxr-xr-x org.eclipse.cdt.managedbuilder_1.2.1

lrwxrwxrwx org.eclipse.cdt.managedbuilder_2.1.3 -> org.eclipse.cdt.managedbuilder_1.2.1

drwxr-xr-x org.eclipse.cdt.qnx.photon_1.2.1

lrwxrwxrwx org.eclipse.cdt.qnx.photon_2.1.3 -> org.eclipse.cdt.qnx.photon_1.2.1

drwxr-xr-x org.eclipse.cdt.solaris.motif_1.2.1

lrwxrwxrwx org.eclipse.cdt.solaris.motif_2.1.3 -> org.eclipse.cdt.solaris.motif_1.2.1

drwxr-xr-x org.eclipse.cdt.source_1.2.1

lrwxrwxrwx org.eclipse.cdt.source_2.1.3 -> org.eclipse.cdt.source_1.2.1

drwxr-xr-x org.eclipse.cdt.win32_1.2.1

lrwxrwxrwx org.eclipse.cdt.win32_2.1.3 -> org.eclipse.cdt.win32_1.2.1

drwxrwxr-x org.eclipse.jdt_2.1.3

drwxrwxr-x org.eclipse.jdt.source_2.1.3

drwxrwxr-x org.eclipse.pde_2.1.3

drwxrwxr-x org.eclipse.platform_2.1.3

drwxrwxr-x org.eclipse.platform.linux.gtk_2.1.3

drwxrwxr-x org.eclipse.platform.linux.gtk.source_2.1.3

drwxrwxr-x org.eclipse.platform.source_2.1.3

drwxrwxr-x org.eclipse.sdk.linux.gtk_2.1.3

-rw-r--r-- libfltk.a

-rw-r--r-- libfltk_forms.a

lrwxrwxrwx libfltk_forms.so -> libfltk_forms.so.1.1

-rwxr-xr-x libfltk_forms.so.1.1

-rw-r--r-- libfltk_gl.a

lrwxrwxrwx libfltk_gl.so -> libfltk_gl.so.1.1

-rwxr-xr-x libfltk_gl.so.1.1

-rw-r--r-- libfltk_images.a

lrwxrwxrwx libfltk_images.so -> libfltk_images.so.1.1

-rwxr-xr-x libfltk_images.so.1.1

lrwxrwxrwx libfltk.so -> libfltk.so.1.1

-rwxr-xr-x libfltk.so.1.1

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

66

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

Пакет устанавливается в /usr/local/lib/ и в /usr/local/include. Для более подробной информации обращайтесь кфайлу README из этого пакета.

Теперь немного забежим вперед и создадим наше пер-вое приложение на FLTK. В первую очередь следует обра-щаться к демо-программам, которые скомпилировалисьвместе с самим пакетом FLTK. Их можно найти в директо-рии fltk-1.1.5/test. Написано доступно и просто. Тем, кто стал-кивался с программированием на MFC или на QT/GTK, бу-дет понятна идеология callback (т.е. реакция на события). Вчастности, в QT используется аналог системы callback –пара сигнал/слот. Фактически это более гибкое решение(нежели реальные callback-функции), которое позволяетлюбому объекту присвоить свойство реагировать на сиг-нал. В GTK также используется система callback, так назы-ваемая пара signal/callback. Более полную информациюможно почерпнуть из [7-10].

Если нужен справочник классов и методов, то fltk-1.1.5/documentation – хороший источник получения информации.В принципе на самом сайте FLTK можно забрать справоч-ник в PDF-формате.

Рассмотрим самый простой файл на FLTK.

Кто есть кто в данном примере? Подключаются тольконеобходимые файлы из комплекта FLTK. В нашем случае –это Fl.H, Fl_Window.H, Fl_Menu_Bar, Fl_File_Chooser.H. Пер-вый файл необходимо включать при создании любого при-ложения на FLTK, второй отвечает за создание объектаFl_Window *window. Понятно, что для создания объектаFl_Menu_Bar *m мы подключили FL_Menu_Bar. Идеологиядостаточно понятна на данном этапе.

Далее мы объявляем глобальные переменные m, fc –доступ к классам этих объектов будет производиться нетолько из функции main().

Следующим шагом идет объявление callback-функций.Они отвечают за реакцию на события. В нашем примереfc_callback(), open_cb() участвуют в процессе открытия фай-лового диалога, а функция quit_cb() отвечает за заверше-ние всего приложения.

Далее мы заполняем структуру меню.

В частности данный элемент означает следующее – со-здается пункт в меню под названием «File». При этом быс-трый вызов осуществляется по клавише <Alt+F> (на что ука-зывает знак амперсанда – «&File»). В состав пункта «File»входят следующие подпункты – «Open», «Save», «Exit».Горячая клавиша указывается в шаблоне вида FL_CTRL +«X», где «X» – название клавиши.

В данном случае при нажатии на клавишу <Ctrl+O> бу-дет вызвана callback-фунция open_cb(). Если на местеcallback-функции «0», то никакая функция не привязана кданному событию.

Переходим к функции main(). В её теле мы создаем объектокна Fl_Window *window. Инициализируем его с парамет-рами (300, 300, «Sample») – соответственно ширина, высо-та, заголовок окна. Также создается и инициализируется

tar xzvf pngwriter-0.5.0.tgzcd pngwritermake && make install

My_CPP_Test.cpp// HEADERS#include <FL/Fl.H>#include <FL/Fl_Window.H>#include <FL/Fl_Menu_Bar.H>#include <FL/Fl_File_Chooser.H>// GLOBALSFl_Menu_Bar *m;Fl_File_Chooser *fc;#define FONT_SIZE 14void fc_callback(Fl_File_Chooser *fc, void *data){

if(fc->value()){

printf( "Chosen file: \"%s\"\n", fc->value() );}

return;}void open_cb(Fl_Widget*, void*){

fc->callback(fc_callback);fc->show();while(fc->shown())

Fl::wait();if( fc->count() == 1 ){

printf("File was selected\n");}

}void quit_cb(Fl_Widget*, void*){

exit(0);}Fl_Menu_Item MenuEng[] = {

{ "&File", 0, 0, 0, FL_SUBMENU },{ "&Open", FL_CTRL + 'o', (Fl_Callback *)open_cb },{ "&Save", FL_CTRL + 's', 0 },

{ "E&xit", FL_CTRL + 'q', (Fl_Callback *)quit_cb, 0 },{ 0 },

{ "&Help", 0, 0, 0, FL_SUBMENU },{ "&About", FL_CTRL + 'a' , 0 },{ 0 },

{ 0 }};int main(int argc, char **argv) {

Fl_Window *window = new Fl_Window(300, 300, "Sample");window->color(FL_WHITE);m = new Fl_Menu_Bar(0, 0, 640, 25);m->copy(MenuEng);m->box(FL_UP_BOX);m->textcolor(FL_BLUE);m->textfont(FL_TIMES);m->textsize(FONT_SIZE);fc = new Fl_File_Chooser(".", "*.{txt,cpp}", ↵↵↵↵↵

Fl_File_Chooser::SINGLE, "File_Chooser_Dialog");window->show();window->callback( (Fl_Callback *)quit_cb, window );return Fl::run();

}

{"&File", 0, 0, 0, FL_SUBMENU },{ "&Open", FL_CTRL + 'o', (Fl_Callback *)open_cb },{ "&Save", FL_CTRL + 's', 0 },{ "E&xit", FL_CTRL + 'q', (Fl_Callback *)quit_cb, 0 },{ 0 },

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

67№11(24), ноябрь 2004

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

объект типа меню. В этом объекте изменяются тип шрифтаи его размер. Инициализируем объект Fl_File_Chooser.

Показываем созданное творение – window →→→→→ show().Привязываем callback-фунцию quit_cb() на закрытие при-ложения. И наконец вызываем обработчик событий длявсего созданного приложения – return Fl::run().

Если некоторые параметры остались для вас непонят-ными – обращайтесь к документации. Вполне возможно,что в версии, которую вы будете использовать, будут изме-нены некоторые параметры (это характерно для следую-щей версии FLTK 2.0).

Оформим данный файл как My_CPP_Test.cpp. И созда-дим make-файл для компиляции программы.

Теперь, запустив команду make, вы скомпилируете этотестовое приложение. У меня оно получилось размером при-мерно в 400 Кб. Посмотрим на него чуточку внимательнее.

Уберем лишнюю отладочную информацию и посмотрим,от каких библиотек зависит наше новое приложение.

В итоге приложение теперь «похудело» до 240 Кб.

Достаточно симпатично, на мой взгляд. Вполне вероят-но, что удастся запустить даже на дистрибутивах Linux, ос-нованных на ядре 2.0.X, не говоря про современные.

Что и было протестировано на дистрибутиве SUSE Linuxс ядром версии 2.2.18 и сопутствующими библиотеками(libc-2.1.3, ld-2.1.3). Радужные ожидания растаяли при за-пуске программы ldd:

Как видите, некоторые символы дистрибутива того вре-мени (4 года назад) не были определены, поэтому я вижу 2варианта решения проблемы: собирать программу полнос-тью со статическими библиотеками либо собирать FLTK наоснове старого дистрибутива и там же компилировать. На-сколько это удобно в каждом конкретном случае, решатьвсё-таки разработчику.

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

Для создания проекта на C или C++ следует поступитьследующим образом – выбрать меню «Window →→→→→ OpenPerspective →→→→→ C/C++ Development».

Тем самым мы настраиваем в Eclipse подсветку синтак-сиса, характерную для языковых конструкций С/С++.

Создадим пробный проект. «File →→→→→ New →→→→→ Project».

Выбираем создание проекта на C++ категории ManagedMake C++ Project (см. рис. 3).

Выбираем имя для проекта «My_Test» (см. рис. 4).А затем придумываем имя для главного файла проекта

(см. рис. 5).Проект сконструирован, файл My_CPP_Test.cpp создан,

но он пуст и находится в следующей директории ~/eclipse/workspace.

MakefileFLTK=/usr/local/fltk/bin/fltk-configOPTIONS=--compileMy_CPP_Test:

$(FLTK) $(OPTIONS) My_CPP_Test.cppclean:

rm My_CPP_Testrebuild:

make clean; make My_CPP_Test

bash-2.05b$ file My_CPP_Test

My_CPP_Test: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV),

dynamically linked (uses shared libs), not stripped

bash-2.05b$ strip My_CPP_Test

bash-2.05b$ ldd My_CPP_Test

libm.so.6 => /lib/libm.so.6 (0x40025000)

libXext.so.6 => /usr/X11R6/lib/libXext.so.6 (0x40049000)

libX11.so.6 => /usr/X11R6/lib/libX11.so.6 (0x40057000)

libc.so.6 => /lib/libc.so.6 (0x4011e000)

libdl.so.2 => /lib/libdl.so.2 (0x40254000)

/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

Ðèñóíîê 1. Îáùèé âèä Eclipse

Ðèñóíîê 2

bash-2.05b$ ldd -vr My_CPP_Test

libm.so.6 => /lib/libm.so.6 (0x40016000)

libXext.so.6 => /usr/X11R6/lib/libXext.so.6 (0x40033000)

libX11.so.6 => /usr/X11R6/lib/libX11.so.6 (0x4003f000)

libc.so.6 => /lib/libc.so.6 (0x400e0000)

/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

My_CPP_Test: /lib/libc.so.6: version `GLIBC_2.2.4' not found

(required by My_CPP_Test)

My_CPP_Test: /lib/libc.so.6: version `GLIBC_2.3' not found

(required by My_CPP_Test)

symbol __ctype_tolower_loc, version GLIBC_2.3 not defined in file

libc.so.6 with link time reference (My_CPP_Test)

symbol dl_iterate_phdr, version GLIBC_2.2.4 not defined in file

libc.so.6 with link time reference (My_CPP_Test)

symbol __ctype_b_loc, version GLIBC_2.3 not defined in file

libc.so.6 with link time reference (My_CPP_Test)

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

68

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

Файл My_CPP_Test.cpp создался пустым, поэтому либоскопируем в буфер содержимое нашего примера и вста-вим из буфера в этот файл. Либо перенесем файл приме-ра в директорию нашего проекта. Eclipse высветит предуп-реждение о том, что содержимое файла изменилось.

Отлично, теперь в настройках проекта нам следует ука-зать, где искать заголовочные файлы (в частности, где рас-положены заголовочные файлы для FLTK).

Заходим «Project →→→→→ Properties». Заполняем поля, ука-занные на рис. 6 и 7.

Спрашивается, откуда автор знает, какие именно биб-лиотеки следует использовать. Очень просто. Необходимозапустить программу из комплекта FLTK под названиемfltk-config со следующими флагами: «--cflags», «--ldflags»(«--ldstaticflags»). В итоге при сборке проекта («Project →→→→→Rebuild All») вы должны увидеть показанное на рис. 8.

Для того чтобы запустить новое приложение из интег-рированной среды, необходимо настроить пункт в меню«Run» (см. рис. 9). В поле «C/C++ Application» указать ис-полняемый файл (см. рис. 10).

Так как сборка производится не со статической библио-текой, а с динамической, то надо указать путь к библиоте-ке libfltk.so (см. рис. 11). В итоге сборка и дальнейшая раз-работка вашего продукта приобретает более удобные очер-тания.

Теперь добавим поддержку для pngwriter.Добавим в My_CPP_Test.cpp следующие строки:

Ðèñóíîê 3

Ðèñóíîê 4

Ðèñóíîê 5

Ðèñóíîê 6

Ðèñóíîê 7

#include <pngwriter.h>

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

69№11(24), ноябрь 2004

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

Потребуется для объявления функций библиотекиpngwriter. Файл фактически находится в /usr/local/include/,поэтому в Makefile надо будет добавить следующую конст-рукцию:

Добавляем новую процедуру сохранения файла PNG-формата. И меняем структуру меню.

Теперь осталось изменить Makefile, т.к. pngwriter исполь-зует C++ синтаксис. Новый Makefile выглядит следующимобразом.

Библиотека freetype потребовалась из-за того, что самFLTK собрался с данной поддержкой. На вашей машинеможет быть по-другому.

Предлагаю переключить внимание на Windows и собратьпакет FLTK с использованием компилятора от Microsoft. Смыс-ла компилировать с помощью Microsoft Visual Studio .NET я неувидел и решил воспользоваться предыдущей версией 6.0.

Приступим. С помощью WinRAR распакуем архив. За-пускаем файл проектов fltk.dsw (он находится в каталогеfltk-1.1.5/visualc) в Microsoft Visual Studio. Выбираем длясборки нужный проект fltk (см. рис. 12).

Ðèñóíîê 8

Ðèñóíîê 9

void save_cb(Fl_Widget*, void*){

pngwriter iris(300,300,0,"iris.png");for(int a = 1; a < 301; a++)for(int b = 1; b < 301; b++)

iris.plotHSV( a, b, double(a)/500.0, double(b)/500.0, 1.0);iris.setgamma(0.7);iris.close();

}

-I/usr/local/include -L/usr/local/lib

{ "&Save", FL_CTRL + 's', (Fl_Callback *)save_cb },

FLTK=/usr/local/fltk/bin/fltk-configINCLUDE=`$(FLTK) �cflags`INCLUDE2=-I/usr/local/include -L/usr/local/libLIBS=`$(FLTK) --ldstaticflags`LIBS2=-lm -lXext -lX11 -lsupc++ -lpng -lpngwriter -lz ↵↵↵↵↵

�lfreetypeFLAGS=-O3 -Wall -Wno-deprecatedFLAGS2=-lsupc++CC=g++My_CPP_Test:

$(CC) $(INCLUDE) $(INCLUDE2) ↵↵↵↵↵-o My_CPP_Test My_CPP_Test.cpp $(LIBS) $(LIBS2)

clean:#rm My_CPP_Test

rebuild:make clean; make My_CPP_Test

Ðèñóíîê 11

Ðèñóíîê 10

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

70

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

Если мы хотим создать DLL-библиотеку, то следует выб-рать проект fltkdll. В этом случае программа после компи-ляции будет меньше, но при этом потребуется внешняя DLL-библиотека fltkdll.dll. Можно поступить другим образом –собрать LIB-библиотеку. При этом необходимый код будетвключен в вашу программу при компиляции. И соответ-ственно программа будет состоять фактически из одногоEXE-файла. Следующим шагом нужно определить, какойтип библиотеки необходим – с отладочными символами(«Debug») или без отладочных символов («Release»). До-пустим, мы хотим собрать без отладочных символов, по-этому выбираем тип библиотеки «Release»:

Запускаем процесс сборки. Конечный результат в видефайла fltk.lib смотрите в каталоге fltk-1.1.5/lib:

Компилировать библиотеку следует как статическую(расширение файла – .LIB). Полученный итог – файлыpngwriter.lib, zlib.lib, png.lib.

Полученные библиотеки необходимо положить вProgram Files\Microsoft Visual Studio\VC98\Lib, а заголовоч-ные файлы от FLTK следует положить в Program Files\Microsoft Visual Studio\VC98\Include (предварительно создавтам директорию FL).

В общем-то, среда готова для написания программ.Как именно вы организуете представление графичес-

кой информации – дело вашего вкуса.Импорт графических файлов с помощью FLTK возмо-

жен для файлов JPEG, PNG, BMP, XPM. Экспортировать вформате PNG можно в том случае, если вы подключитебиблиотеку libpngwriter.

На основе FLTK развилось несколько проектов. Это ирасширение FLTK – проект EFLTK, который умеет работатьс базами данных MySQL. Это и SPTK, разрабатываемый,кстати сказать, нашим соотечественником Алексеем Пар-шиным [5]. С помощью SPTK вы получаете доступ к дан-ным как в Excel-, Access-форме, так и к MySQL-данным.FLU, обладающий некоторыми расширенными опциями дляпостроения виджетов [6].

Среди достоинств FLTK хочу подчеркнуть особенностьясного и понятного построения кода программ. За счет про-стоты достигаются скорость составления каркаса програм-мы и дальнейшая скорость её выполнения. В некоторойстепени программы на основе FLTK являются «мобильны-ми», т.к. вы четко представляете, от каких системных биб-лиотек зависит FLTK. Поэтому разобраться, что требуетсядля запуска программы в новых условиях, получается на-много быстрее, нежели, например, на основе QT.

Характерный минус разработки на основе FLTK заклю-чается в его же простоте – некоторых конструкций, кото-рые есть в других средствах разработки, просто нет. Илиже они находятся на такой стадии разработки, когда про-дукт называется unstable (в частности, поддержка UTF8 всёеще находится на стадии разработки).

В целом FLTK можно предлагать как продукт для получе-ния начального опыта программирования GUI-приложений.В частности, примеры, расположенные по адресам [11], [12],[13], помогут разобраться в составлении программ на FLTK.

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

Ссылки:1. http://www.fltk.org/software.php?SOFTWARE=v1_12. http://pngwriter.sourceforge.net3. http://pngwriter.sourceforge.net/howto_msvc.php4. http://yaroslav-v.chat.ru5. http://sptk.tts-sf.com/index.php6. http://www.osc.edu/~jbryan/FLU/7. http://www.cs.wisc.edu/~cs559-1/tutorials/tutorial4.html8. http://ib.cnea.gov.ar/~poo/gtkmm-devel-1.2.10/docs/tutorial/

gtkmm-tut-html/tutorial-2.html9. http://inti.sourceforge.net/tutorial/libinti/advanced eventand

signalhandling.html10. http://www.jtz.org.pl/Inne/QT-Tutorial/signalsandslots.html11. http://www.cs.virginia.edu/~gfx/Courses/2004/Intro.

Spring.04/ProgrammingAssignments/Exercise112. http://www.soe.ucsc.edu/classes/cmps160/Spring0413. http://www.cs.wisc.edu/~cs559-1

Ðèñóíîê 12

Ðèñóíîê 13

Ðèñóíîê 14

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

71№11(24), ноябрь 2004

образование

28 октября 2004 г. на презентации в офисе Microsoft былообъявлено о выходе русскоязычной версии нового продук-та Class Server 3.0. Microsoft позиционирует продукт какновую активно развивающуюся платформу для управленияучебным процессом, которая направлена на организациюуправления учебными материалами и планами (включая иххранение и распространение), проведение тестированияучащихся, сбор данных об успеваемости и взаимодействиевсех участников учебного процесса через Интернет.

Несмотря на то что доклад Дмитрия Старостина (кон-сультанта Microsoft Consulting Services) был практическиполностью построен на иллюстрации возможностей исполь-зования продукта в рамках школьного обучения, Роман Куз-нецов (менеджер по работе с образовательными и прави-тельственными организациями) особо подчеркнул возмож-ность использования Class Server в высшем образовании,в корпорациях и органах управления образованием.

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

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

Class Server на данный момент времени нельзя отнестик классу автоматизированных систем управления учебным

заведением (АСУ вуз, АСУ колледж, АСУ школа и т. д.) илисчитать перспективной платформой для их построения, од-нако новый продукт Microsoft сочетает в себе черты системдистанционного образования, электронного обучения (e-learning) и построения портальных решений.

Системы дистанционного и электронного обучения до-статочно широко представлены на российском рынке про-граммных продуктов и по возможностям сильно превосхо-дят решение Microsoft. Однако ни одно из них не может вы-ступать в качестве платформы, интегрированной с множе-ством средств разработки. Class Server входит в составплатформы Microsoft.Net и предоставляет все ее возможно-сти, имеет широкий набор XML веб-сервисов и совместим стакими международными стандартами, как SIF (SchoolsInteroperability Framework), SCORM (Sharable Content ObjectReference Model), IMS (Instructional Management Standards).

Другим важным преимуществом Class Server являетсяего непосредственная связь с Microsoft Learning Gateway –порталом, выступающим в качестве базовой структуры дляобъединения через Интернет разнообразных решений в об-ласти образования в единую, полностью управляемую сре-ду, содержащую до 1 млн. пользователей.

Портал построен на основе платформ Microsoft OfficeSharePoint Portal Server 2003 и SharePoint Services, предос-тавляет необходимые сведения и услуги в соответствии снастроенными пользовательскими ролями. Для организа-ции обмена сообщениями электронной почты, управленияличной информацией, включая календарь и список задач,а также предоставления других услуг в области обменаданными используется Microsoft Exchange Server 2003.Microsoft Live Communications Server обеспечивает взаимо-действие в режиме реального времени с помощью немед-ленных сообщений.

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

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

Более подробную информацию о продукте можно узнатьпо адресу: http://www.microsoft.com/rus/education/ClassServer.

CLASS SERVER 3.0 – НОВОЕ РЕШЕНИЕ MICROSOFTВ ОБЛАСТИ ОБРАЗОВАНИЯ

АНДРЕЙ ФИЛИППОВИЧ

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

72

образование

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

К счастью, никто не требует от нас написания полно-ценного NTFS-драйвера! Наша задача значительно скром-нее – вернуть разрушенный том в состояние, пригодное длявосприятия операционной системой (задача-максимум) илиизвлечь из него все ценные файлы (задача-минимум). Вни-кать в структуру журналов транзакций, дескрипторов бе-зопасности, двоичных деревьев индексаций для этого со-вершенно необязательно! Реально нам потребуется ра-зобраться лишь с устройством главной файловой записи –MFT и нескольких дочерних подструктур.

Обзор NTFS с высоты птичьего полетаОсновным структурным элементом всякой файловой сис-темы является том (volume), в случае с FAT совпадающий сразделом (partition), о котором мы говорили в прошлой ста-

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

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

ФАЙЛОВАЯ СИСТЕМА NTFS ИЗВНЕ И ИЗНУТРИ

КРИС КАСПЕРСКИ

Покажи мне свои структуры данных, и я скажу, кто ты!

Народная программистская мудрость

В этой статье мы рассмотрим основные структуры данных файловой системы NTFS, определяющиеее суть – главную файловую запись MFT, файловые записи FILE Record и последовательностиобновления (update sequence или fix-ups), без знания которых осмысленная работа с редакторомдиска и ручное/полуавтоматическое восстановление данных просто невозможны!

Ðèñóíîê 1. Îáû÷íûé (ñëåâà) è ðàçðÿæåííûé (ñïðàâà) òîìà

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

73№11(24), ноябрь 2004

образование

Самым главным служебным файлом является $MFT –Master File Table (главная файловая таблица) – своеобраз-ная база данных, хранящая информацию обо всех файлахтома – их именах, атрибутах, способе и порядке размеще-ния на диске (каталог также является файлом особого типа,со списком принадлежащих ему файлов и подкаталоговвнутри). Важно подчеркнуть, что в MFT присутствуют всефайлы, находящиеся во всех подкаталогах тома, поэтомудля восстановления диска наличия $MTF-файла будет впол-не достаточно.

Остальные служебные файлы (кстати говоря, называе-мые метафайлами или метаданными – metafile/metadataсоответственно и всегда предваряются знаком доллара «$»)носят сугубо вспомогательный характер, интересный толь-ко самой файловой системе. К ним в первую очередь отно-сятся: $LogFile – файл транзакций, $Bitmap – карта свобод-ного/занятого пространства, $BadClust – перечень плохихкластеров и т. д. (Подробнее о назначении каждого из фай-лов будет рассказано в следующей статье). Текущие вер-сии Windows блокируют доступ к служебным файлам с при-кладного уровня (даже с правами администратора!), и вся-кая попытка открытия/создания такого файла в корневомкаталоге обречена на неуспех.

Классическое определение, данное в учебниках инфор-матики, отождествляет файл с именованной записью надиске. Большинство файловых систем добавляет к этомупонятие атрибута (attribute) – некоторой вспомогательнойхарактеристики, описывающей время создания, права до-ступа и т. д. В NTFS имя файла, данные файла и его атри-буты полностью уравнены в правах. Можно сказать, чтовсякий NTFS-файл представляет собой совокупность ат-рибутов, каждый из которых хранится как отдельный по-ток (streams) байтов, поэтому во избежание путаницы ат-рибуты, хранящие данные файла, часто называют пото-ками.

Каждый атрибут состоит из тела (body) и заголовка(header). Атрибуты делятся на резидентные (resident) и не-резидентные (non-resident). Резидентные атрибуты хранят-ся непосредственно в $MTF, что существенно уменьшаетгрануляцию дискового пространства и сокращает времядоступа. Нерезидентные – хранят в $MTF лишь свой заго-ловок, описывающий порядок размещения атрибута надиске.

Назначение атрибута определяется его типом (type) –четырехбайтовым шестнадцатеричным значением. Прижелании атрибуту можно дать еще и имя (name), состоя-щее из символов, входящих в соответствующее простран-ство имен. Подавляющее большинство файлов имеет поменьшей мере три атрибута: стандартная информация офайле (время создания, модификации последнего досту-па, права доступа и т. д.) хранится в атрибуте типа 10h, ус-

ловно обозначаемом $STANDARD_INFORMATION. Ранниеверсии Windows NT позволяли обращаться к атрибутам поих условным обозначениям, однако Windows 2000 иWindows XP лишены этой возможности. Полное имя фай-ла (не путать с путем!) хранится в атрибуте типа 30h($FILE_NAME). Если у файла есть одно или более альтер-нативных имен (например, MS-DOS-имя), таких атрибутовможет быть несколько. Здесь же хранится ссылка (filereference) на материнский каталог, позволяющая разобрать-ся, к какому каталогу данный файл/подкаталог принадле-жит. Данные файла по умолчанию хранятся в безымянноматрибуте типа 80h ($DATA), однако при желании приклад-ные приложения могут создавать дополнительные потокиданных, отделяя имя атрибута от имени файла знаком дво-еточия, например:

Изначально в NTFS была заложена способность индек-сации любых атрибутов, значительно сокращающая времяпоиска файла по заданному списку критериев (например,времени последнего доступа). Внутренние индексы хранят-ся в виде двоичных деревьев, поэтому среднее время вы-полнения запроса оценивается как O(lg n). Однако в теку-щих NTFS-драйверах реализована индексация лишь поодному атрибуту – имени файла. Как уже говорилось выше,каталог представляет собой особенный файл – файл ин-дексов (INDEX). В отличие от FAT, где файл каталога пред-ставляет единственный источник данных об организациифайлов, в NTFS он используется лишь для ускорения дос-тупа к содержимому директории и не является обязатель-ным, поскольку ссылка на материнский каталог всякогофайла в обязательном порядке присутствует в атрибуте егоимени ($FILE_NAME).

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

Главная файловая запись(master file table)В процессе форматирования логического раздела, в егоначале создается так называемая MTF-зона (MFT-zone), поумолчанию занимающая 12,5% от емкости тома (а вовсене 12%, как утверждается во многих публикациях), хотя взависимости от значения параметра NtfsMftZoneReservationона может составлять 25%, 37% или 50%.

В этой области расположен $MFT-файл, изначальнозанимающий порядка 64 секторов и растущий от начала

ECHO xxx > file:attr1; ECHO yyy > file:attr2; ↵↵↵↵↵more < file:attr1; more  < file:attr2

Версии NTFSСлужебные структуры файловой системы NTFS не остают-ся постоянными, а слегка меняются от одной версииWindows NT к другой (см. таблицу 1). Этот факт следуетпринять во внимание при использовании автоматизирован-ных «докторов». Попав на более свежую версию NTFS,«доктор», не оснащенный мощным AI, может запутаться в

Òàáëèöà 1. Îïðåäåëåíèå âåðñèè NTFS ïî îïåðàöèîííîé ñèñòåìåизмененных структурах и разрушить вполне здоровый том.

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

74

образование

MFT-зоны к ее концу по мере создания новых пользова-тельских файлов/подкаталогов. Таким образом, чем боль-ше файлов содержится на дисковом томе, тем больше раз-мер MFT. Приблизительный размер $MFT-файла можнооценить по следующей формуле: sizeof(FILE Record) N Files,где sizeof(FILE Record) обычно равен 1 Кб, а N Files – пол-ное количество файлов/подканалов раздела, включая не-давно удаленные.

Для предотвращения фрагментации $MFT-файла MFT-зона удержится зарезервированной вплоть до полного ис-черпания свободного пространства тома, затем незадей-ствованный «хвост» MFT-зоны усекается в два раза, осво-бождая место для пользовательских файлов. Этот процессможет повторяться многократно, вплоть до полной отдачивсего зарезервированного пространства. Решение краси-вое, хотя и не новое. Многие из файловых систем восьми-десятых позволяли резервировать заданное дисковое про-странство в хвосте активных файлов, тем самым сокращаяих фрагментацию (причем любых файлов, а не только слу-жебных). В частности, такая способность была у DOS 3.0,разработанной для персональных компьютеров типа Агат.Может, кто помнит такую машину?

Когда $MFT-файл достигает границ MFT-зоны, в ходесвоего последующего роста он неизбежно фрагментирует-ся, вызывая обвальное падение производительности фай-ловой системы, причем подавляющее большинство деф-рагментаторов $MFT-файл не обрабатывают! А ведь APIдефрагментации, встроенное в штатный NTFS-драйвер, этов принципе позволяет! Подробности (вместе с самой ути-литой дефрагментации) можно найти на сайте Марка Рус-синовича. Но, как бы то ни было, заполнять дисковый томболее чем на 88% его емкости категорически не рекомен-дуется!

При необходимости $MFT-файл может быть перемещенв любую часть диска, и тогда в начале тома его уже не ока-жется. Стартовый адрес $MFT-файла хранится в Boot-сек-торе по смещению 30h байт от его начала (см. «boot-сек-тор», описанный в предыдущей статье данного цикла) и вподавляющем большинстве случаев этот адрес ссылаетсяна 4-й кластер.

$MFT-файл представляет собой массив записей типаFILE Record (или в терминологии UNIX – inodes), каждая изкоторых описывает соответствующий ей файл или подка-талог (подробнее см. раздел «Файловые записи»).

В подавляющем большинстве случаев файл/подкаталогполностью описывается одной-единственной записью FILE

Record, хотя теоретически этих записей может потребовать-ся и несколько.

Для ссылки на одну файловую запись из другой исполь-зуется ее порядковый номер (он же индекс) в $MFT-файле,отсчитываемый от нуля. Файловая ссылка (file reference) со-стоит из двух частей (см. таблицу 2) – 48-битного индекса и16-битного номера последовательности (sequence number).

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

Первые 12 записей в MFT всегда занимают служебныеметафайлы: $MFT (собственно, сам $MFT), $MFTMirr (зер-кало $MFT), $LogFile (файл транзакций), $Volume (сведе-ния о дисковом томе), $AttrDef (определенные атрибуты),«.» (корневой каталог), $Bitmap (карта свободного простран-ства), $Boot (системный загрузчик), $BadClus (переченьплохих кластеров) и т. д.

Первые четыре записи настолько важны, что продубли-рованы в специальном $MFTMirr-файле, находящемся при-близительно посередине диска (точное расположение хра-нится в boot-секторе по смещению 38h байт от его начала).Вопреки своему названию, $MFTMirr – это отнюдь не зер-кало всего $MFT-файла, это всего лишь копия первых че-тырех элементов.

Записи с 12 по 15 помечены как используемые, но вдействительности же они пусты (как нетрудно догадаться,это задел на будущее). Записи с 16 по 23 не задействова-ны и честно помечены как неиспользуемые.

Начиная с 24-й записи располагаются пользовательс-кие файлы и каталоги. Четыре метафайла, появившихся вW2K – $ObjId, $Quota, $Reparse и $UsnJrnl, могут распола-гаться в любой записи, номер которой равен 24 или боль-ше (как мы помним, номера файловых записей отсчитыва-ются начиная с нуля).

Для знакомства с MFT запустим DiskExplorer от RuntimeSoftware, не забывая о том, что он требует прав админист-ратора, в меню «File» найдем пункт «Drive» и в открывшем-ся диалоговом окне выберем логический диск, который мыхотим редактировать. Затем в меню «Goto» выберем пункт«Mft», заставляя DiskExplorer перейти к MFT, автоматичес-

Полезный советКак быстро узнать тип текущего раздела – FAT или NTFS? Да очень просто – достаточно попробовать создать в егокорневом каталоге файл $mft – если он будет создан успешно, то это FAT и соответственно наоборот. Если файл $Extendбудет создан успешно, то версия файловой системы 3.0 или выше.

Ðèñóíîê 2. Ñòðóêòóðà äèñêîâîãî òîìà ïîä NTFS

Òàáëèöà 2. Ñòðóêòóðà ôàéëîâîé ññûëêè (file reference)

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

75№11(24), ноябрь 2004

образование

ки меняя режим отображения на наиболее естественный(см. рис. 3).

Как вариант можно нажать <F6> (View as File Entry) и про-мотать несколько первых секторов клавишей <Page Down>.

Для каждого из файлов DiskExplorer сообщает:! номер сектора, к которому данная файловая запись при-

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

! основное имя файла/каталога (т.е. имя файла из заго-ловка файловой записи, некоторые файлы имеют не-сколько альтернативных имен). Если имя файла/ката-лога зачеркнуто, значит, он был удален, но соответству-ющая ему файловая запись все еще цела. Чтобы из-влечь файл с диска (не важно, удаленный или нет) под-ведите к нему курсор и нажмите <Ctrl-T> для просмотраего содержимого в шестнадцатеричном виде или <Ctrl-S> для сохранения файла на диск. То же самое можносделать и через контекстное меню (раздел «recovery»).При нажатии на <Ctrl-C> в буфер обмена копируетсяпоследовательность кластеров, занятых файлом (напри-мер, «DISKEXPL:K:1034240-1034240»).

! тип файловой записи – файл это или каталог?! атрибуты файла/каталога – a = архивный файл, r = толь-

ко на чтение, h = скрытый, s = системный, l = метка тома,d = каталог, c = сжатый файл;

! размер файла в байтах в десятичной системе исчисле-ния (не для каталогов!);

! дату и время модификации файла/каталога;! номер первого кластера файла/каталога (или «resident»

для полностью резидентных файлов/каталогов);! перечень типов NTFS-атрибутов, имеющихся у файла/

каталога, записанных в шестнадцатеричной нотации(обычно эта строка имеет вид 10 30 80 – атрибут стан-дартной информации, атрибут имени и атрибут данныхфайла);

! индекс файловой записи в MFT, выраженный в шест-надцатеричной и десятичной системах исчисления и сле-дующий за словом «No:» (сокращение от Number – но-мер);

! индекс файловой записи материнского каталога, выра-женный в шестнадцатеричной и десятичной системахисчисления (5h – если файл принадлежит к корневомукаталогу). Для быстрого перемещения по файловым за-писям выберите в меню «Goto» пункт «Mft no» и введи-те требуемый индекс в шестнадцатеричной или деся-тичной форме;

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

Прежде чем продолжать чтение статьи, попробуйте по-экспериментировать с $MFT-файлами (особенно фрагмен-тированными). Посмотрите, как создаются и удаляются за-

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

Файловые записи (FILE Record)Благодаря наличию Disk Explorer от Runtime Software с фай-ловыми записями практически никогда не приходится ра-ботать вручную, тем не менее знание их структуры нам непомешает.

Структурно файловая запись состоит из заголовка(header) и одного или нескольких атрибутов (attribute) про-извольной длины, завершаемых маркером конца (endmarker) – четырехбайтовым шестнадцатеричным значени-ем FFFFFFFFh (см. листинг 1). Несмотря на то что количе-ство и длина атрибутов меняется от одной файловой запи-си к другой, размер самой структуры FILE Record строгофиксирован и в большинстве случаев равен 1 Кбайту (этозначение хранится в $boot-файле, не путать с boot-секто-ром!). Причем первый байт файловой записи всегда совпа-дает с началом сектора.

Если реальная длина атрибутов меньше размеров фай-ловой записи, ее хвост просто не используется. Если жеатрибуты не вмещаются в отведенное им пространство,создается дополнительная файловая запись (extra FILERecord), ссылающаяся на свою предшественницу.

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

Ðèñóíîê 3. DiskExplorer îòîáðàæàåò ãëàâíóþ ôàéëîâóþ çàïèñüâ åñòåñòâåííîì âèäå

Ëèñòèíã 1. Ñòðóêòóðà ôàéëîâîé çàïèñèFILE Record

Header ; çàãîëîâîêAttribute 1 ; àòðèáóò 1Attribute 2 ; àòðèáóò 2... ; �Attribute N ; àòðèáóò N

End Marker (FFFFFFFFh) ; ìàðêåð êîíöà

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

76

образование

щие MFT, от всех остальных. Следом за сигнатурой идет16-разрядный указатель, содержащий смещение последо-вательности обновления (update sequence, см. раздел«Последовательности обновления»). Под «указателем»здесь и до конца раздела подразумевается смещение отначала сектора, отсчитываемое от нуля и выраженное вбайтах. В NT и W2K это поле всегда равно 002Ah, поэтомудля поиска файловых записей можно использовать сиг-натуру «FILE*\x00», что уменьшает вероятность ложныхсрабатываний. Правда, в XP и более старших системахпоследовательность обновления хранится по смещению002Dh, и поэтому сигнатура приобретает следующий вид«FILE-\x00».

Размер заголовка (кстати сказать, варьирующийся отодной операционной системы к другой) в явном виде нигдене хранится, вместо этого в заголовке присутствует указа-тель на первый атрибут, содержащий его смещение в бай-тах относительно начала FILE Record, расположенный посмещению 14h байт от начала сектора. Смещения после-дующих атрибутов (если они есть) определяются путем сло-жения размеров всех предыдущих атрибутов (размер каж-дого из атрибутов содержится в его заголовке) со смеще-нием первого атрибута. За концом последнего атрибутанаходится маркер конца – FFFFFFFFh.

В добавок к этому длина файловой записи хранится вдвух полях – 32-разрядное поле реального размера (realsize), находящееся по смещению 18h байт от начала секто-ра, содержит совокупный размер заголовка, всех его атри-бутов и маркера конца, округленный по 8-байтной границе.32-разрядное поле выделенного размера (allocated size),находящееся по смещению 1Сh байт от начала сектора,содержит действительный размер файловой записи в бай-тах, округленный по размеру сектора. Документация Linux-NTFS Project (версия 0.4) утверждает, что allocated size дол-жен быть кратен размеру кластера, однако в действитель-ности это не так. В частности, на моей машине allocatedsize равен четвертинке кластера.

16-разрядное поле флагов, находящееся по смещению16h байт от начала сектора, в подавляющем большинствеслучаев принимает одно из трех следующих значений: 00h –данная файловая запись не используется или ассоцииро-ванный с ней файл/каталог удален, 01h – файловая записьиспользуется и описывает файл, 02h – файловая записьиспользуется и описывает каталог.

64-разрядное поле, находящееся по смещению 20h байтот начала сектора, содержит индекс базовой файловой за-писи. Для первой файловой записи это поле всегда равнонулю, а для всех последующих, расширенных (extra) запи-сей – индексу первой файловой записи. Расширенные фай-ловые записи могут находиться в любых частях MFT, необязательно рядом с основной записью. А раз так, необхо-дим какой-то механизм, обеспечивающий быстрый поискрасширенных файловых записей, принадлежащих данно-му файлу (просматривать весь MFT целиком не предлагать).И этот механизм основан на ведении списков атрибутов$ATTRIBUTE_LIST.

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

Остальные поля заголовка файловой записи не стольважны и поэтому здесь не рассматриваются. При необхо-димости обращайтесь к документации «Linux-NTFS Project».

Последовательности обновления(update sequence)Будучи очень важными компонентами файловой системы,$MFT, INDEX и $LogFile нуждаются в механизме контроляцелостности своего содержимого. Традиционно для этогоиспользуются ECC/EDC-коды, однако во времена проекти-рования NTFS процессоры были не настолько быстрыми,как теперь, и расчет корректирующих кодов занимал зна-чительное время, существенно снижающее производитель-ность файловой системы. Поэтому от них пришлось отка-заться. Вместо этого разработчики NTFS применили такназываемые последовательности обновления (updatesequence), так же называемые fix-up.

В конец каждого из секторов, слагающих файловуюзапись (INDEX Record, RCRD Record или RSTR Record) за-писывается специальный 16-байтовый номер последова-тельности обновления (update sequence number), дублиру-емый в заголовке файловой записи. При каждой операциичтения два последних байта сектора сверяется с соответ-ствующим полем заголовка, и если NTFS-драйвер обнару-живает расхождение, данная файловая запись считаетсянедействительной.

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

Òàáëèöà 3. Ñòðóêòóðà çàãîëîâêà ôàéëîâîé çàïèñè (FILE Record)

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

77№11(24), ноябрь 2004

образование

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

Оригинальное содержимое, расположенное «под» пос-ледовательностью обновления, хранится в специальном мас-сиве обновления (update sequence array), находящимися взаголовке файловой записи непосредственно за концомupdate sequence number. Для восстановления файловой за-писи в исходный вид мы должны извлечь из заголовка ука-затель на update sequence number (он хранится по смеще-нию 04h байт от начала заголовка) и сверить лежащее поэтому адресу 16-байтное значение с последним словом каж-дого из секторов, слагающих файловую запись (INDEXRecord, RCRD Record или RSTR Record). Если они не совпа-дут, значит соответствующая структура данных поврежденаи использовать ее следует с очень большой осторожностью(а на первых порах лучше не использовать вообще).

По смещению 006h от начала сектора находится 16-разрядное поле, хранящее совокупный размер номерапоследовательности обновления вместе с массивом пос-ледовательности обновления:

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

Соответственно смещение массива оригинального со-держимого равно:

В NT и W2K update sequence number всегда располага-ется по смещению 2Ah от начала FILE Record Header/INDEX Header, а update sequence array – по смещению 2Сh.В XP же и более старших системах – по смещениям 2Dh и2Fh соответственно.

Первое слово массива последовательности обновлениясоответствует последнему слову первого сектораFILE Record/INDEX. Второе – последнему слову второгосектора и т. д. Для восстановления сектора в исходный видмы должны вернуть все элементы массива последователь-ности обновления на их законные места (естественно, мо-дифицируется не сам сектор, а его копия в памяти).

Продемонстрируем это на следующем примере:

Сигнатура «FILE» указывает на начало файловой запи-си. А раз так, по смещению 04h байт будет расположен 16-разрядный указатель на номер последовательности обнов-ления. В данном случае он равен 002Ah. ОК! Переходим посмещению 002Ah и видим, что здесь лежит слово 0006h.Перемещаемся в конец сектора и сверяем его с последни-ми двумя байтами. Как и предполагалось, они совпадают.Повторяем ту же самую операцию со следующим сектором.Собственно говоря, количество секторов может и не рав-няться двум. Чтобы не гадать на кофейной гуще, необходи-мо извлечь 16-разрядное значение, расположенное по сме-щению 06h от начала файловой записи (в данном случаеоно равно 0003h) и вычесть из него единицу. Действитель-но, получается два (сектора).

Теперь нам необходимо найти массив последователь-ности обновления, хранящий оригинальное значение пос-леднего слова каждого из секторов. Смещение массиваобновления рассчитывается по следующей формуле: offsetof (update sequense number) + 2, т.е. в данном случае002Ah + 02h == 002Ch. Извлекаем первое слово (в данномслучае равное 00h 00h) и записываем его в конец первогосектора, затем делаем то же самое со вторым.

В результате чего восстановленный сектор будет выг-лядеть так:

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

Литература:1. Касперски К. Востановление данных на NTFS-разделах. –

Журнал «Системный администратор», №9, сентябрь2004г.

2. Касперски К. Востановление данных на NTFS-разделах.Часть 2. – Журнал «Системный администратор», №10,октябрь 2004г.

(sizeof(update sequence number) + sizeif(update sequence array))

(update sequence number & update sequence array - 1)*2

(offset to update sequence number) + 2

Ëèñòèíã 3. Âîññòàíîâëåííàÿ ôàéëîâàÿ çàïèñü

Ëèñòèíã 2. Îðèãèíàëüíàÿ ôàéëîâàÿ çàïèñü äî âîññòàíîâëåíèÿ

Внимание!FILE Record, INDEX Record, RCRD Record или RSTR Record искажены последовательностями обновления и в обязатель-ном порядке должны быть восстановлены перед их использованием, в противном случае вместо актуальных данных выполучите мусор!

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

78

образование

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

Назовем основные из них:! Инвентаризация. Включает в себя сбор информации о

регистрирующемся в сети пользователе, рабочей стан-ции и формирование файла отчета.

! Автоматическое подключение сетевых ресурсов: прин-теров и дисков.

! Автоматическое конфигурирование рабочих станций.! Обеспечение интерактивности работы скрипта. В ходе

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

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

KIXTartДля создания сценариев регистрации пользователей суще-ствует множество языков, однако остановим свой выборна языке KIXTart. Он является стандартным языком програм-мирования сценариев компании Microsoft. Его дистрибутивможно найти в Microsoft Resource Kit или бесплатно загру-зить последнюю версию из сети Интернет (http://kixtart.org).

Замечание. Сценарии, созданные вами ранее на VBScript,Jscript могут быть легко переписаны под KIXtart. Все при-меры в этой статье написаны на языке KIXTart.

Думаю, что нет необходимости описывать преимуще-ства этого языка перед VBScript или каким-нибудь другимязыком. Стоит лишь отметить, что KIXtart разрабатывалсяисключительно для создания сценариев, с помощью кото-рых пользователи регистрировались бы в сети. KIXTart вер-сии 4.21 поддерживает около 100 функций, столько же мак-росов-функций и обладает следующими возможностями:

! вывод информации в виде диалоговых сообщений;! подключение сетевых ресурсов;! чтение информации из входного потока;! расширенная поддержка редактирования реестра (ра-

бота с локальным и удаленным реестром, поддержкаопераций с кустами (hives));

! поддержка INI-файлов;! расширенная поддержка операций со строками и мас-

сивами (поддержка статических и динамических, мно-гомерных массивов);

! сбор информации о пользователе и рабочей станции;! поддержка OLE-объектов;! операции с файлами и каталогами;! создание ярлыков Windows.

Решение задачи инвентаризации

ВведениеРешение этой задачи состоит из нескольких частей – сбора,записи на носитель в определенном формате и обработкиинформации. Две первые подзадачи можно реализовать спомощью сценария загрузки, третья реализуется с помощьюдополнительного программного обеспечения. Собираемаяинформация касается программного и аппаратного обеспе-чения, характеристик учетной записи пользователя, регист-рирующегося в сети. Собираемые данные можно условноразделить на две части. К первой части относится информа-ция об аппаратном и программном обеспечении. Данные обаппаратном обеспечении черпаются из WMI, а о программ-ном – из реестра либо с помощью WMI, либо с помощьюKIXTart1. Вторая часть – информация, характеризующая по-ложение рабочей станции в сети. К ней также относятся свой-ства учетной записи текущего пользователя. Эта половинареализуется с помощью макросов, встроенных в KIXTart, ичтения полей Active Directory. Для решения задачи инвента-ризации нам необходимо осветить следующие темы.! чтение разделов WMI;! управление реестром с помощью KIXTart;! использование макросов KIXTart;! чтение полей из Active Directory;! формирование файла отчета.

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

РАЗРАБОТКА СЦЕНАРИЯ РЕГИСТРАЦИИПОЛЬЗОВАТЕЛЕЙ В СЕТИЧАСТЬ1

ИВАН КОРОБКО

1 Рекомендуется использовать встроенные функции KIXTart, поскольку нет смысла искусственно усложнять и увеличивать листинг скрипта.

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

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

79№11(24), ноябрь 2004

образование

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

Как и HTML, XML является независимым от платформыстандартом. С полным вариантом спецификации XML мож-но ознакомиться на http://www.w3c.org/xml. Внешне XML-до-кумент очень похож на HTML-документ, т.к. XML-элементытакже описываются с помощью ключевых слов – тегов. Од-нако, в отличие от HTML, в XML пользователь может созда-вать собственные элементы. Теги XML определяют структу-рированную информацию. Синтаксис элементов (тегов), со-ставляющих структуру XML-файла, в общем виде можнопредставить следующим образом:

Приведем несколько основных правил, которыми необ-ходимо руководствоваться при создании XML-документов:! Документ состоит из элементов разметки (markup) и не-

посредственно данных (content).! Все элементы описываются с помощью тегов.! В заголовке документа должны быть идентификацион-

ные данные: используемый язык разметки, его версия,кодировка страницы и т. д. Заголовок описывается с по-мощью тега <%..... %>.

! В XML учитывается регистр символов.! Все значения атрибутов должны быть заключены в ка-

вычки.

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

Пример XML-файла, соответствующего приведенномушаблону, смотрите на http://www.samag.ru/source.

Замечание. Этот шаблон включает в себя только инфор-мацию, необходимую для успешной обработки файла отче-та. Он не содержит упоминания о стилях, о возможностивставки в XML-файл программного кода. Полную версиюшаблону можете найти на сайте http://www.w3c.org/xml.

Формирование файла отчета. ПрактикаПроцесс формирования отчета состоит из двух частей: на-копления данных в переменную и запись значения пере-менной в XML-файл.

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

Замечание. Чтобы при просмотре записанного в любомиз тестовых редакторов (например, NOTEPAD.EXE) файладанные были поделены на строки, добавьте в конце строкиследующий код:

В теоретической части была приведена структура XML-файла. Приведем листинг, позволяющий сформироватьфайл в формате XML (пример смотрите далее по тексту).Напомню, что в названии файла и главного тега должнобыть использовано имя рабочей станции, а не учетной за-писи пользователя. Это связано с тем, что с одной рабочейстанции в сети может зарегистрироваться только одинпользователь, в то время как один и тот же пользователь спомощью своей учетной записи может зарегистрироватьсяна нескольких рабочих станциях. Таким образом, чтобы си-стемный администратор получил исчерпывающую инфор-мацию о каждой из рабочих станций, зарегистрированныхв сети, о свойствах учетных записей пользователей и др., вимени файла и главного тега рекомендуется использоватьимя рабочей станции, которое возвращает макрос @wksta.В синтаксисе XML-файла есть одно ограничение – тег неможет начинаться с цифр, поэтому, если в вашей сети ра-бочие станции имеют цифровые имена, например, 1130pc,2310nb (pc – Personal Computer, nb - Notebook), то главныйтег рекомендуется предварять каким-нибудь символом,например символом подчеркивания – «_». Необходимо на-помнить еще об одном важном правиле: в названии теговнеобходимо учитывать регистр.

Теперь, когда рассмотрены все теоретические аспекты,приведем пример:

<Element>[attr1=�val1� [attr2=�val2��]]</Element>

<?xml version=�1.0� encoding=�windows-1251� ?><main_element><Element1>[attr1=�val1� [attr2=�val2��]]</Element1><Element2>[attr1=�val1� [attr2=�val2��]]</Element2>����������.</main_element>

$en=chr(13)+chr(10) � ïåðåõîä íà íîâóþ ñòðîêó; íàêîïëåíèå ïåðåìåííîé$t=�<?xml version=��1.0�� encoding=��windows-1251�� ?>�$t=$t+"<_@wksta>"+$en$t=$t+"�<Parameter1> @ProductType </ Parameter1>"+$en$t=$t+"< Parameter2> �+var1+ �</ Parameter2>"+$en��$t=$t+"</_@wksta>"; ôîðìèðîâàíèå XML-ôàéëà$filename=@wksta+".xml"$fso = CreateObject("Scripting.FileSystemObject")

$MyFile = $fso.CreateTextFile($filename, True, TRUE)$MyFile.WriteLine($t)$MyFile.Close

"chr(13)+chr(10)"

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

80

образование

WMI. Теория

Основы WMIЧтение информации об аппаратной конфигурации рабочейстанции рекомендуется обеспечивать стандартными сред-ствами Microsoft Windows. Одним из таких средств являет-ся Microsoft Windows Management Instrument (WMI).

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

Исполняемым файлом, обеспечивающим функциониро-вание WMI, является файл winmgmt.exe, находящийся вкаталоге c:\WINNT\system32\wbem\ Microsoft Windows 200x.Механизм работы WMI следующий:! На первом этапе происходит подключение к службе WMI

локального или удаленного компьютера: при обраще-нии приложения к WMI запросы приложения пересыла-ются диспетчеру CIMOM (Common Information ModelObject Manager), который обеспечивает первоначальноесоздание объектов и однообразный способ доступа куправляемым объектам. Наиболее простым способомподключения к удаленному компьютеру является вызовфункции языка VBScript GetObject(). Подключение к уда-ленному компьютеру происходит с помощью протоколаwinmgmts.

! На втором этапе происходит проверка хранилища объек-тов. Затем запрос передается поставщику объекта.Поставщик (provider) – это интерфейс между управляе-мым устройством и диспетчером CIMOM. Поставщиксобирает информацию об устройствах и делает ее дос-тупной для диспетчера.

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

Способы доступа к объектам WMIНа практике доступ к объектам WMI получают одним изспособов, проиллюстрированных в следующих шаблонах:

В приведенных примерах значением переменной $strComputer является имя удаленного компьютера. Если ком-пьютер локальный, то вместо имени указывается символ«.» (точка):

Переменная $strNameSpace содержит пространствоимен. $strClass – переменная, включающая в себя назва-ние класса. Например, для Win32 Provider одним из клас-сов является Win32_BIOS, соответственно переменная$strName Space принимает значение Root\Cimv2. Инструк-ция {ImpersonationLevel=Impersonate}! заставляет выполнитьсценарий с привилегиями пользователя, вызывающего сце-нарий, а не с привилегиями пользователя, который в на-стоящий момент зарегистрирован на рабочей станции. Та-ким образом, осуществляется подстановка, которая полез-на при выполнении сценариев удаленного доступа на та-ких ОС, как Microsoft Windows 200x, где эта инструкция яв-ляется выражением подстановки по умолчанию, поэтомудля этого семейства ее можно опустить.

Варианты доступа A и Б к объектной модели WMI отли-чаются лишь формой записи. В варианте B обращение кклассу строится с помощью SQL-запроса, что позволяетэкономить трафик. В общем случае запрос SQL выглядитследующим образом:

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

В зависимости от способа доступа к хранилищу размерпересылаемых данных разный.

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

WMI. ПрактикаДля сбора информации различного характера необходимоиспользовать Win32 Provider, которому соответствует про-странство имен Root\Cimv2. Win32 Provider соответствует

A)$strComputer=��$strNameSpace=��$strClass=��$objElements = GetObject( "winmgmts: ↵↵↵↵↵

{ImpersonationLevel=Impersonate}!//" & $strComputer ↵↵↵↵↵& �/ � &$strNameSpace & �: � & $strClass)For each $Element in $objElements$Temp=$Element.ValueNext

Á)$strComputer=��$strNameSpace=��$strClass=��$objWMIService = GetObject( "winmgmts: ↵↵↵↵↵

{ImpersonationLevel=Impersonate}!//" & $strComputer ↵↵↵↵↵& �/ � & $strNameSpace)$colItems = $objWMIService.InstancesOf($strClass )

For Each $Element in $colItems$Temp=$Element.Value

NextÂ)$strComputer=��

SELECT ïîëå_1, ïîëå_2, �, ïîëå_n FROM strClass

Òàáëèöà 1

$strNameSpace=��$strClass=��$objWMIService = GetObject("winmgmts: ↵↵↵↵↵

{ImpersonationLevel=Impersonate }!// " & $strComputer ↵↵↵↵↵& �/ � & $strNameSpace)

$colItems = objWMIService.ExecQuery(�SELECT ïîëå_1, ↵↵↵↵↵ïîëå_2, �, ïîëå_n FROM� & $strClass )For Each $Element in$colItems$Temp=$Element.ValueNext

$strComputer=�.�

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

81№11(24), ноябрь 2004

образование

массив, состоящий из двух частей: идентификатора и на-звания ресурса, которые разделены знаком подчеркивания.Идентификатором всегда является «WIN32».

С объектной моделью WMI можно ознакомиться с по-мощью утилиты WMI Object Browser (см. рис. 2), входящейв пакет WMI Tools. Набор утилит WMI Tools можно найти насайте компании Microsoft: http://msdn.microsoft.com/developer/sdk/wmisdk/default.asp.

На практике для доступа к WMI-объектам рекомендует-ся использовать нечто среднее между шаблонами, приве-денными в теоретической части:

Приведем пример чтения информации BIOS материнс-кой платы с помощью WMI на Kixtart на основе обобщенно-го варианта 3 рабочей станции ComputerName. Массив дан-ных, в котором содержится информация о материнской пла-те, называется WIN32_BIOS:

Необходимо отметить, что все переменные, которыеиспользованы в данном примере, – строковые (см. рис. 2).Если переменная является числом, то ее необходимо пре-образовать в строковую переменную с помощью функцииСstr(). Если переменная представляет собой массив, то не-обходимо прочитать элементы массива и преобразовать ихв строки в том случае, если элементы массива не являютсястроковыми переменными. Результатом выполнения дан-ной программы будет сообщение вида:

Ðèñóíîê 2

$strComputer=��$strNameSpace=� Root\Cimv2�$strClass=�Win32_Value�$objWMIService = GetObject( " winmgmts: // " ↵↵↵↵↵

& $strComputer & �/ � & $strNameSpace)$colItems = objWMIService.ExecQuery(�SELECT ïîëå_1, ↵↵↵↵↵

ïîëå_2, �, ïîëå_n FROM� & $strClass )For Each $Element in $colItems$Temp=$Element.ValueNext

$PC = @WKSTA$en=chr(10)$objWMIService = GetObject( "winmgmts://" + $pc+"/Root/Cimv2")$colItems = $objWMIService.ExecQuery( "Select * ↵↵↵↵↵

from Win32_BIOS")For Each $objItem in $colItems

? " BIOS Name : " + $objItem.Name? " Version : " + $objItem.Version? " Manufacturer : " + $objItem.Manufacturer? " SMBIOS Version : " + $objItem.SMBIOSBIOSVersion

Next

Ðèñóíîê 1

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

82

образование

Поскольку вышеприведенный механизм используетсямногократно, то рекомендуется оптимизировать программ-ный код, сформировав из имен классов массив:

Реестр. Теория2

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

В Microsoft Windows 3.x все настройки программного обес-печения располагались в конфигурационных файлах, имею-щих расширение INI. Настройки программного обеспеченияи операционной системы располагались в двух файлах:

SYSTEM.INI и WIN.INI. Однако размер INI-файлов не мог пре-вышать 64 Кб, поэтому, чтобы обойти это ограничение, длякаждой программы создавался свой INI-файл. Со време-нем из-за большого количества конфигурационных файловпроизводительность операционной системы значительнопонизилась. В 1993 году была создана операционная сис-тема Microsoft Windows NT, в которой множество INI-фай-лов было заменено единой базой данных – реестром.

С точки зрения файловой системы реестр представляетсобой файл с расширением DAT. Для Windows NT/200x ре-естр хранится в файле NTUSER.DAT, который находится вкаталоге %Windir%\Profiles3. В Windows 9x реестр состоит издвух файлов: USER.DAT и SYSTEM.DAT, которые хранятся вкаталоге %Windir%. USER.DAT содержит настройки индиви-дуального пользователя, а SYSTEM.DAT – настройки компь-ютера. Реестры Windows 9x, NT, 2000 несовместимы друг сдругом, однако идея построения реестров едина.

Ветви реестраРеестр состоит из разделов верхнего уровня, называемыхкустами (или ульями, в оригинале hives):! HKEY_CLASSES_ROOT (HKCR);! HKEY_CURRENT_USER (HKCU);! HKEY_LOCAL_MACHINE (HKLM);! HKEY_USER (HKU);! HKEY_CURRENT_CONFIG (HKCC).

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

В разделе HKLM находится информация об аппаратном,программном обеспечении, а также сведения о системе бе-зопасности. Раздел HKCR представляет собой виртуальнуюссылку на раздел HKLM\Software\Classes и является однимиз самых больших разделов реестра. В нем находится ин-формация обо всех расширениях файлов, определениях ти-пов, ярлыках, привязке, классах идентификаторов и т. д.

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

Изменения в разделах HKU и HKLM можно сделать с по-мощью утилиты REGEDT32.EXE в том случае, если у вас ОСWindows 2000, и REGEDIT.EXE – если Windows XP. Пользо-ватель, от имени которого запускаются эти утилиты, долженобладать правами администратора.

Раздел HKCU содержит сведения о текущем пользова-теле и имеет название, соответствующее значению иден-тификатора безопасности (SID) данного пользователя. Каж-дый раз при перезагрузке компьютера этот раздел созда-ется заново.

$wmi_array="Win32_BIOS","Win32_Processor",��"$æ=�

for $a=0 to $æ$objWMIService = GetObject( "winmgmts://@wksta/root/cimv2" )$colItems = $objWMIService.ExecQuery( "Select * from ↵↵↵↵↵

"+ $wmi_array[$æ])For Each $objItem in $colItems

selectcase $a=0

$mb1=$objItem.Name$mb2=$objItem.Manufacturer$mb3=$objItem.SMBIOSBIOSVersion$mb4=$objItem.Version$lx1="<mb> <bios> $mb1 </bios>"$lx2="<manufacture> $mb2 </manufacture>"$lx3="<version> $mb3 </version> "$lx4="<data_release> $mb4 </data_release> </mb> "$t="$t $lx220 $en $lx222 $en $lx224 $en $lx226 $en"

case $a=1$cpu_arhitect="x86","MIPS","ALPHA", "Power PC"$cpu_socket="","Other","Unknown","Daughter Board", ↵↵↵↵↵

"ZIF Socket","Replacement/Piggy Back","None", ↵↵↵↵↵"LIF Socket","Slot 1", "Slot 2", "370 Pin Socket", ↵↵↵↵↵"Slot A", "Slot M","","","Socket 478"

$i=$objItem.Architecture$ii=$cpu_arhitect[$i]$cpu1=$objItem.Name + ", " + $objItem.MaxClockSpeed + " Mhz"$cpu2=$objItem.Version + ", Level " + $objItem.Level$i=$objItem.UpgradeMethod$ii=$cpu_socket[$i]$cp1=$objItem.ExtClock+"Mhz"$cp2=$objItem.L2CacheSize+"Kb"$lx5="<cpu> <processor> $cpu1 </processor>"$lx6="<version> $cpu2 </version> "$lx7="<socket> $ii </socket>"$lx8="<external_clock> $cp1 </external_clock>"$lx9="<l2_cache> $cp2 </l2_cache> </cpu> "$t="$t $lx230 $en $lx232 $en $lx234 $en $lx236 $en $lx238 $en"

case $a=2����������End SelectNext

2 Информация, приведенная в этом разделе, также является теоретической частью для разделов, в которых описываются автоматизиро-

ванное подключение сетевых принтеров и процесс автоматизации конфигурирования рабочих станций.3 В Microsoft Windows принято использовать переменные среды. %WinDir% содержит полный путь к каталогу, в котором установлена ОС,

например, C:\Windows.

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

83№11(24), ноябрь 2004

образование

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

Раздел HKDD (HKEY_DYN_DATA) не хранится в реест-ре, а динамически создается при загрузке операционнойсистемы. В нем содержатся сведения о самонастраиваю-щихся устройствах (Plug-and-Play).

Как и любая база данных, реестр поддерживает несколь-ко типов данных, которые перечислены в таблице:

Реестр. ПрактикаОтображаемый в «Add and Remove Programs» cписок уста-новленных программ на рабочей станции формируется наоснове информации из ветви реестра HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall. Рассмотрим подробнее структуру, содержащую-ся в папке Uninstall. При установке любой программы нажесткий диск компьютера в Windows 2000 или Windows XPв ней создается подпапка. Ее имя совпадает либо с GUID4,либо с названием программы. Внутри этой папки создает-ся ряд записей, содержащих информацию об установлен-ном продукте (см. рис. 4).

Необходимо отметить, что в подразделе «Add and RemovePrograms» панели «Control Panel» список установленногопрограммного обеспечения формируется на основе значе-ний, содержащихся в переменной «DisplayName» для каж-дого приложения. При выборе кнопки «Remove» операци-онная система выполняет команду, являющуюся значени-ем переменной «UninstallString». В том случае, если значе-ние этого параметра неверно, вы никогда не сможете уда-лить это приложение через «Control Panel».

Однако вернемся к папкам. Для того чтобы считать изреестра названия установленных программ, сначала необ-ходимо получить доступ к подпапкам – узнать их названия,которые содержатся в папке «Uninstall». Для этого следуетиспользовать функцию EnumKey():

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

значения параметра «DisplayName».Следует отметить, что не все установленные приложе-

ния содержат этот параметр в соответствующей папке, по-этому в «Control Panel» отображаются не все установлен-ные программы.

Для обеспечения полноты предоставляемой информа-ции в том случае, если запись «DisplayName» отсутствует,будет считываться название папки. В приведенном приме-ре в переменную t будут записываться данные, предназна-ченные для XML-файла:

Active Directory.Теория

Active DirectoryActive Directory (AD) – это служба каталогов, которая явля-ется иерархической базой данных, обеспечивающей цент-рализованное управление сетью. Active Directory хранит всебе информацию об объектах сети и обеспечивает доступк этой информации пользователям, компьютерам и прило-жениям.

Active Directory обладает следующими особенностями:! Масштабируемость. В отличие от большинства других

баз данных (БД), которые являются реляционными,Active Directory является иерархической базой. В БД вза-имосвязи между записями определяются при помощиключей, которые хранятся совместно с данными. Виерархической базе данных взаимосвязи между запи-сями имеют характер «родитель-потомок»: каждая за-пись, за исключением корневой, имеет родительскуюзапись (родителя). У каждой родительской записи мо-жет быть один или несколько потомков. Иерархическаябаза данных позволяет хранить большое количествообъектов, при этом быстро получать доступ к необходи-мым объектам.

4 GUID (globally unique identificator, глобальный уникальный идентификатор) – 128-разрядный номер, служащий идентификатором. Присва-

ивается объекту в момент его создания и не может быть изменен.

Òàáëèöà 2

$path="HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\ ↵↵↵↵↵CurrentVersion\Uninstall"

do$loop = ENUMKEY($path, $Index)? $loopuntil $loop=""

$en=chr(10)+chr(13)$t=$t+" <Installed_Programs> "$i=1$path="HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\ ↵↵↵↵↵

CurrentVersion\Uninstall"do$loop = ENUMKEY($path, $Index)$name=readvalue($path+" \"+$loop,"DisplayName")if $name<>""$t=$t+" <Program"+$I +"> " +$name+ " </Program"+$I +"> "$en? " <Program"+$i +"> " +$name+ " </Program"+$I +"> "Elseif $loop<>""$t=$t+" <Program"+$I +"> " +$loop + " </Program"+$I +"> "$en? " <Program"+$I +"> " +$loop + " </Program"+$I +"> "endifendif$Index = $Index + 1$i=$Index+1until $loop=""$t=$t+" </Installed_Programs> "MessageBox($t, "",0,0)

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

84

образование

! Active Directory объединяет в себе концепцию простран-ства имен Интернета со службой каталогов Windows NT,что позволяет объединить и управлять различными про-странствами имен в разноразрядных аппаратных и про-граммных средах. Для управления пространством именActive Directory используется библиотека интерфейсаслужбы активного каталога (Active Directory ServiceInterface – ADSI).

! Поддержка стандартных форматов имен. Active Directoryподдерживает несколько общих форматов имен. Этотфакт позволяет приложениям и пользователям получатьдоступ к каталогу, применяя наиболее удобный для нихформат: UPN (RFC 882), LDAP URL (RFC 1779, 2247),UNC(RFC 1123).

Объектная модель ADSIНаглядная схема объектной модели ADSI приведена нарис. 3.

Схема условно поделена на три части. Используя кли-ента – язык программирования, скрипт получает доступ кCOM-объектам. Объекты могут быть двух видов – класса-ми и подклассами. Обращение к подклассам осуществля-ется через классы, однако на схеме этого не показано, что-бы не загромождать рисунок. С помощью COM-объекта че-рез протокол LDAP или WinNT сценарий загрузки получаетдоступ к выбранному элементу объектной модели. Про-странство имен условно обозначено треугольником; квад-

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

Провайдеры ADSIИнтерфейс ADSI поддерживает следующие провайдеры, спомощью которых осуществляется программное админис-трирование (см. таблицу 4).

Для определения всех доступных в сети провайдеровнеобходимо использовать службу ADS:

Ðèñóíîê 4

$obj=GetObject("Protocol://ClassName")For each $SubClass in $ClassName

? $SubClass.PropertyNext

Ðèñóíîê 3

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

85№11(24), ноябрь 2004

образование

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

Провайдер ADSI LDAP выполняется на клиенте ADSI иобеспечивает доступ к Active Directory. Кроме служб ката-логов Active Directory Windows 2000, LDAP-провайдер обес-печивает доступ к:! Netscape Directory Server;! Microsoft Exchange Server 5.x и выше;! Microsoft Commercial Internet System (MCIS) Address Book

Server.

Для реализации программного управления Active Directoryчасто используется именно этот провайдер. Запрос провай-деру LDAP составляется в формате LDAP URL (см. RFC1779, RFC 2247):

Провайдер WinNT ADSI поддерживает доступ к катало-гам Microsoft Window 4.0/3.x, обеспечивает связь с PDC иBDC. Провайдер WinNT в основном используется для ра-

боты с принтерами. Причина проста: в отличие от провай-дера LDAP, провайдер WinNT рассматривает принтер не каксетевое, а как локальное устройство. Только с помощьюпровайдера WinNT можно управлять состоянием и очере-дями принтеров. Совместное использование обоих провай-деров позволит осуществлять мониторинг и управлениесетевыми принтерами домена [2]. Порядок построения зап-роса для провайдера WinNT в формате UNC следующий:

Объектная модель провайдера LDAPДля программного управления Active Directory с помощьюпровайдера LDAP необходимо использовать его объектнуюмодель. Объектная модель представляет собой совокупностьобъектов, которые взаимосвязаны друг с другом и образу-ют между собой иерархическую структуру. Каждый из этихобъектов имеет набор свойств, характерный исключитель-но для объектов данного типа. Существует несколько ви-дов (идентификаторов) объектов: CN, DС, OU. Расшифров-ка и назначение каждого объекта смотрите в таблице.

Имена LDAP URL (см. RFC 1779, RFC 2247) построены наоснове протокола X.500 и используются для связывания собъектами.

Идентификаторы объектов DC, OU, CN образуют полноесоставное имя (Distinguished Name, DN), а имя самого объек-та – относительное составное имя (Relative DistinguishedName, RDN).

Полное составное имя объекта включает в себя имяобъекта и всех его родителей, начиная с корня домена.

Ðèñóíîê 5

Òàáëèöà 3

LDAP://HostName[:PortNumber][/DistinguishedName]

WinNT:[//DomainName[/ComputerName[/ObjectName[,className]]]]

Òàáëèöà 4

$obj=GetObject("ADs:")For Each $provider IN $obj$t=$t + $provider.name + chr(13)Next

MessageBox($t, "",0,0)

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

86

образование

Существует две формы доступа к ADSI: развернутая исокращенная. Рассмотрим принципы построения путей кресурсу обоими способами на примере домена domain.com(см. рис. 3).! Развернутая форма. При использовании этого вида

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

где DC=Domain_name1/DC=Domain_name2/DC=Domain_name3 образуют полное имя контроллера домена, эле-менты OU=OU_Name_Level1/OU=OU_Name_Level2…/OU=OU_ Name_Level представляют собой вложенныедруг в друга элементы. В развернутой форме доступаобъект CN является «дном колодца» в иерархии.Пример: запрос к объекту CN=User3 выглядит следую-щим образом (см. рис. 3):

! Сокращенная форма. Характеризуется тем, что строказапроса строится в соответствии с обратной иерархиейструктуры организации. Шаблон выглядит следующимобразом:

Соответственно запрос к объекту CN=User3 с помощьюсокращенной формы доступа выглядит следующим об-разом:

Active Directory. Практика

Объектная модель ADУправление объектами Active Directory невозможно без зна-ния объектной модели. Существует несколько программ,предназначенных для нее. Рассмотрим лишь две из них:

Active Directory Viewer (Microsoft) и LDAP Browser 2.5.3(Softerra).

Active Directory Viewer (ADV) является графической ути-литой, позволяющей выполнять операции чтения, моди-фицирования, осуществлять поиск в любых совместимыхкаталогах, таких как Active Directory, Exchange Server,Netscape Directory, Netware Directory. Active Directory Viewerвходит в состав SDK для Active Directory Services Interface,который можно бесплатно загрузить с сайта Microsoft: http://www.microsoft.com/ntserver/nts/downloads/other/adsi25.

После установки SDK for ADSI утилита Active DirectoryViewer (AdsVw.exe) будет находиться в c:\Program Files\Microsoft\ADSI Resource Kit, Samples and Utilities\ADsVw.

Программа работает в двух режимах: ObjectViewer иQuery.

Для просмотра объектной модели провайдера необхо-димо использовать режим ObjectViewer. Режим Query ис-пользуется для осуществления поиска объектов в выбран-ной объектной модели. В данной статье режим Query рас-сматриваться не будет. Просмотр и редактирование объек-тной модели программой ADV в режиме ObjectViewer. Пос-ле выбора режима ObjectViewer появится диалоговое окно.

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

Обратите внимание на две особенности шаблона, в немне должно быть пробелов, «слэши» должны быть прямы-ми – «/». Невыполнение хотя бы одного из перечисленныхусловий приведет к ошибке в соединении с каталогом. Длядоступа к серверу server домена domain.ru с помощью про-токола LDAP используется следующий запрос:

Ðèñóíîê 6

$obj = GetObject ("LDAP://DC=Domain_name1 ↵↵↵↵↵/DC=Domain_name2/DC=Domain_name3/ ↵↵↵↵↵OU=OU_Name_Level1/OU=OU_Name_Level2�/ ↵↵↵↵↵OU=OU_Name_Level/CN=CN_Name")

$obj = GetObject ("LDAP://DC=RU/DC=Domain1/ ↵↵↵↵↵OU=Group1/OU=Group4/CN=User3")

$obj=GetObject("LDAP://CN=CN_Name,OU=OU_Name_Level�, ↵↵↵↵↵OU=OU_Name_Level2 ,OU=OU_Name_Level1/DC=�")

$obj=GetObject("LDAP://CN=User3,OU=Group4,OU=Group3, ↵↵↵↵↵DC=Domain1, dc=RU") <Provider_Name:>//<Server_Name>/<Full_Domain_Name>

Ðèñóíîê 8

Ðèñóíîê 7

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

87№11(24), ноябрь 2004

образование

После соединения с каталогом на экране будет отобра-жена его иерархическая структура.

В левой части экрана отображается иерархическаяструктура каталога. В правой части – характеристики объек-та, на котором установлен курсор. Список свойств объектаи соответствующих им значений приведен в «Properties» и«Property Value».

LDAP Browser 2.5.3 является бесплатной программой(http://www.ldapadministrator.com).

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

Причины использования провайдера LDAP! Провайдер LDAP (Lightweight Directory Access Protocol)

рассматривает принтер как сетевое устройство5, в товремя как провайдер WinNT рассматривает принтер ис-ключительно как локальное устройство.

! Вторым принципиальным отличием провайдеров являют-ся расширенные возможности поиска провайдера LDAP.Используя провайдер WinNT, можно было осуществлятьпоиск, применяя различные фильтры, которые позволя-ют осуществлять поиск всех объектов, принадлежащих кодному из классов – computer, user, service и др. С помо-щью LDAP можно найти конкретный объект, напримерпользователя, и прочитать его свойства.

Поиск объектов осуществляется с помощью OLEDistributed Query (DB) интерфейса, который вызывается пря-мо из службы активного каталога (Active Directory ServiceInterface – ADSI). Он осуществляется на основании запросаи его параметров. В качестве его параметров могут быть:уровень поиска, диапазон поиска, ограничение по разме-ру, сортировка и т. д. Форма запроса (Distributed Query) за-имствована из Microsoft SQL Server.

Запрос строится по следующему шаблону:

где «путь» – путь к интересующему объекту AD в форматеLDAP URL.

На практике поиск объектов осуществляется следую-щим образом:

В приведенном примере осуществляется поиск всехзарегистрированных в AD принтеров. У найденных принте-ров происходит чтение двух полей: название принтера и сер-вера печати.

Поиск объектов с помощью провайдера LDAP осуще-ствляется по следующему шаблону:! устанавливается соединение с Active Directory Provider

через ADODB;! составляется запрос;! осуществляется поиск по заданным критериям.

В том случае если искомые объекты найдены, происхо-дит чтение указанных в запросе полей. Результат выводит-ся на экран. Объектами могут быть строки и массивы.

Следует отметить, что вместо названия свойства, кото-рое необходимо прочитать, можно указать порядковый но-мер поля, под которым оно обозначено в запросе. Нумера-ция полей начинается с 0. Таким образом, основываясь наприведенном примере, вместо $objRecordSet.Fields(«serverName»).Value можно записать $objRecordSet.Fields(1).Value.

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

5 В одном скрипте желательно использовать один провайдер, чтобы не загромождать листинг. Управление принтерами может быть реали-

зовано только с помощью провайдера LDAP.

SELECT ïîëå 11,ïîëå 21...ïîëå n1 FROM ïóòü ↵↵↵↵↵WHERE objectClass="òèï_îáúåêòà"

Ðèñóíîê 9

$DomainName=�Domain�$objConnection = CreateObject("ADODB.Connection")$objCommand = CreateObject("ADODB.Command")$objConnection.Provider = "ADsDSOObject"$objConnection.Open "Active Directory Provider"$objCommand.ActiveConnection = $objConnection$objCommand.CommandText = "SELECT printerName, serverName ↵↵↵↵↵

FROM " _ & " 'LDAP://"& $DomainName & "' ↵↵↵↵↵WHERE objectClass='printQueue'"

$objCommand.Properties("Cache Results") = False$objRecordSet = $objCommand.Execute$objRecordSet.MoveFirstDo Until $objRecordSet.EOF

$temp=$temp & "Printer Name: " ↵↵↵↵↵& $objRecordSet.Fields("printerName").Value & " ↵↵↵↵↵Server Name: " & $objRecordSet.Fields ↵↵↵↵↵("serverName").Value & chr(13)

$objRecordSet.MoveNextLoopMessagebox($tem,��,0,0)

LDAP://server/DC=domain,DC=ru

$objRoot = GetObject("LDAP://RootDSE")$strDefaultDomainNC = $objRoot.Get("DefaultNamingContext")$strGetArg=@userid ; îïðåäåëåíèå èìåíè ïîëüçîâàòåëÿ.$strADSQuery = "SELECT department, ↵↵↵↵↵

physicaldeliveryofficename, telephonenumber, ↵↵↵↵↵title FROM 'LDAP:// " + $strDefaultDomainNC + "' ↵↵↵↵↵

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

88

образование

Как видно из примера, имя пользователя определяетсяс помощью встроенного в KIXTart макроса @userid. Опре-деление значения необходимых полей осуществляется спомощью процедуры поиска объекта, в данном случае учет-ной записи, и чтения необходимых свойств.

Стоит отметить, что этой проблемы быть не должно, по-скольку Windows по умолчанию использует кодировкуcp1251. Однако при взаимодействии KIXTart с Windows ко-дировка «съезжает». С решением этой проблемы, пусть несамым изящным, но эффективным, читатель только что оз-накомился.

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

На первом этапе данные из AD записываются в INI-фай-лы с помощью функции WriteProfileString(). Затем осуще-ствляется считывание этих данных из INI-файлов и их за-пись в накапливаемую переменную, содержание которойпредставляет собой записываемую информацию в XML-файл.

Таким образом, осуществляется смена кодировки, в ко-торой записывается информация:

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

Литература:1. Коробко И. Автоматизация процессов в сети. – Журнал

«Системный администратор», N8, август 2004 г.2. Коробко И. Управление сетевыми принтерами. – Жур-

нал «Системный администратор», №10, октябрь 2003 г.

Ðèñóíîê 10

$ini_file="@wksta.ini"$user_name="user"$user1=writeprofilestring("$ini_file", ↵↵↵↵↵

$user_name,"department",$objRoot_m1)$user2=writeprofilestring("$ini_file", ↵↵↵↵↵

$user_name,"location",$objRoot_m2)$user3=writeprofilestring("$ini_file", ↵↵↵↵↵

$user_name,"telephone",$objRoot_m3)$user4=writeprofilestring("$ini_file", ↵↵↵↵↵

$user_name,"title",$objRoot_m4)$user5=writeprofilestring("$ini_file", ↵↵↵↵↵

$user_name,"User ID","@userID")$user6=writeprofilestring("$ini_file", ↵↵↵↵↵

$user_name,"Full Name","@fullname")$objRoot1=readprofilestring("$ini_file", ↵↵↵↵↵

$user_name,"department")$objRoot2=readprofilestring("$ini_file", ↵↵↵↵↵

$user_name,"location")$objRoot3=readprofilestring("$ini_file", ↵↵↵↵↵

$user_name,"telephone")$objRoot4=readprofilestring("$ini_file", ↵↵↵↵↵

$user_name,"title")$t=$t+"<department> $objRoot1 </department>"$t=$t+"<Locations> $objRoot2 </Locations>"$t=$t+"<Telephone> $objRoot3 </Telephone>"$t=$t+"<Title> $objRoot4 </Title> </information>"��del "$ini_file"

WHERE samAccountName = '" + $strGetArg + "'"$objADOConn = createObject("ADODB.Connection")$objADOConn.Provider = "ADsDSOObject"$objADoConn.Open ("Active Directory Provider")$objADOCommand = CreateObject("ADODB.Command")$objADOCommand.ActiveConnection = $objADOConn$objADOCommand.CommandText = $strADSQuery$objQueryResultSet = $objADOCommand.Execute$objRoot_m1=$objQueryResultSet.Fields("department")$objRoot_m2=$objQueryResultSet.Fields("physicaldeliveryofficename")$objRoot_m3=$objQueryResultSet.Fields("telephonenumber")$objRoot_m4=$objQueryResultSet.Fields("title")

Page 91: 024 Системный Администратор 11 2004
Page 92: 024 Системный Администратор 11 2004

90

образование

В предыдущем номере журнала [1] была опубликована де-тальная инструкция по установке и настройке Windows 2000Server и повышении его роли до контроллера домена. В этойстатье мы продолжим развитие темы и подробно опишемустановку и настройку на нашем сервере сервера терми-налов с расширением до Citrix Metaframe Presentation ServerXP. Если в процессе установки Windows 2000 Server мыдобавили в устанавливаемые компоненты «Лицензирова-ние служб терминалов» и «Службы терминалов», то про-пускаем этот шаг и переходим к п. 2. Иначе:! Заходим в «Панель управления →→→→→ Установка и удале-

ние программ →→→→→ Добавление и удаление компонентовWindows» и устанавливаем эти компоненты. Описаниенастройки режима работы описано в 1 части статьи [1].Перезагружаемся. Если вы добавили их только сейчас– рекомендуется переустановить Service Pack и пакетыкритических обновлений. Опять перезагружаемся.

! «Пуск →→→→→ Программы →→→→→ Администрирование →→→→→ Лицен-зирование служб терминалов». Выделяем наш сервер.Правой клавишей – «Активировать сервер». Жмем «Да-лее». Выбираем метод подключения «Веб». Далее сле-дуем инструкции на экране. Идем на сайт https://activate.microsoft.com, выбираем русский язык. Далее отмеча-ем пункт «Активация сервера лицензий» и жмем «Да-лее». Вводим выданный нам в окне активации код про-дукта. Заполняем обязательные (отмеченные звездоч-кой) поля – «Фамилия», «Имя», «Организация», «Стра-на». Остальные заполнять необязательно. Жмем «Да-лее». Внимательно запоминаем, как мы заполнили этиполя, так как это еще может понадобиться (лучше всегостраницу подтверждения распечатать). Проверяем кор-ректность данных и опять жмем «Далее». Нам выдаюткод активации сервера. Распечатываем страницу (иливнимательно записываем). Оставляем веб-страницу зап-роса кодов открытой. Переходим к мастеру активации.Вводим полученный код в нашем окне активации и жмем«Далее». Если все ввели правильно, сервер лицензийсообщит об успешной активации. Этот процесс абсо-лютно бесплатен. Затем будет предложено активироватьклиентские лицензии (галочка «Установить лицензиисейчас»). Выставляем ее и жмем «Далее». Для актива-ции этих лицензий вам необходимо приобрести пакетлицензий «Windows Terminal Svr CAL». Скорее всего, выприобрели пакет лицензий типа OLP или специальныйпакет лицензий в виде номера соглашения о покупке.Рассмотрим второй вариант.

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

Если мы активируем только клиентские лицензии, товходим на https://activate.microsoft.com и выбираем русскийязык, ставим галочку «Установка маркеров лицензий CAL»и нажимаем «Далее». Вручную заполняем наши данные.Поля «Фамилия», «Имя», «Организация» и «Страна» дол-жны быть заполнены в точности, как при активации серве-ра лицензий.

Нажимаем «Далее». Выбираем «Тип продукта». Обра-тите внимание на указанный здесь тип. Нам необходим«Windows 2000 Server Terminal Services Client Access License(TS CAL) (на устройство)» в случае, если мы используемWindows 2000, или «Windows Server 2003 Terminal ServerPer Device Client Access License» для Windows Server 2003.Затем вводим количество приобретенных нами лицензий иномер соглашения.

Нажимаем «Далее» и проверяем корректность введен-ных данных. Опять нажимаем «Далее». Если все сделаноправильно, то мы получим очередной код активации, кото-рый распечатываем (записываем) и вводим в мастер акти-вации клиентских лицензий. При корректной настройке бу-дет выдано сообщение об успешном добавлении пакетаклиентских лицензий. Закрываем окно «Лицензированиеслужб терминалов».

Установка и настройкаCitrix Metaframe XPНаша система готова к установке пакета Citrix Metaframe XP.Проверьте, установлен ли у вас Windows 2000 Service Packне ниже 3-го (в него входит необходимый для установки CitrixMF XP пакет Windows Installer 2.0 и другие важные обнов-ления системы).

Сам Citrix Metaframe Presentation Server XP поставляет-ся либо на дистрибутивных дисках, либо скачивается софициального FTP-ресурса ftp.citrix.com

Прямые ссылки на продукты:! ftp://ftp.citrix.com/metaXP/W2K/SP3/FR3CD_MFXP10_

W2K.exe – для Windows 2000 Server.! f tp://f tp.citrix.com/metaXP/W2K3/FR3CD_MFXP10_

WS2K3.exe – для Windows Server 2003.

СОЗДАНИЕ И НАСТРОЙКАСЕРВЕРА ТЕРМИНАЛОВ

РОМАН МАРКОВ

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

91№11(24), ноябрь 2004

образование

Это самораспаковывающиеся архивы оригинальныхдистрибутивов. Распаковываем их в нужное место.

Помните, что в режиме терминального сервера все при-ложения должны устанавливаться только через меню «Уста-новка и удаление программ →→→→→ Установка новой программы».Для справки: есть возможность переключать режим и из ко-мандной строки. Переключение между режимами установ-ки и выполнения программ осуществляется командамиchange user /install и change user /execute соответственно.

Итак, переходим в указанное меню. Выбираем «CD илидискеты». Нажимаем «Далее». При помощи кнопки «Обзор»меняем тип файлов на «Программы» и выбираем файлAutorun.exe. Нажимаем «Далее». Ждем запуска программы.Ни в коем случае не трогаем появившееся окно «После ус-тановки нажмите кнопку Далее» – ее необходимо нажимать,когда установка полностью завершена. В появившемся менювыбираем «Install or Update Metaframe XP Server», затем«Metaframe XP Feature Release 3». Нажимаем «Next», прини-маем лицензионное соглашение. Затем выбираем ту конфи-гурацию, которую хотим установить – Metaframe XPa,Metaframe XPe или Metaframe XPs. Для обычных задач дос-таточно версии XPs. Она включает в себя сам сервер CitrixMetaframe XP и веб-интерфейс к нему. Версия XPa имеетсредства для балансировки нагрузки при создании системиз нескольких серверов Citrix MF. Версия XPe также включа-ет дополнительные средства управления и установки.

Мы рассмотрим вариант установки версии XPs.Итак, выбираем Metaframe XPs и нажимаем Next. Вер-

сию оставляем Retail. В окне компонентов по умолчаниювыбраны Web-interface, Management Console и ProgramNeighborhood. Оставляем как есть. Тут же можно задатьпуть для установки, можно оставить по умолчанию. Жмем«Next», на вопрос о сквозной аутентификации (Pass-Through) отвечаем «Yes». Дальше «Create a New Farm →→→→→Next →→→→→ Farm Name» – вводим понятное нам имя, например,Firma, оставляем галку «Use a local database on this server»,Use default Zone Name (там будет наш диапазон адресовтипа 192.168.0.0) и жмем «Next». Проверяем, входит липредложенное имя пользователя в группу Domain Admins(скорее всего да, так как автоматически будет подставле-на ваша учетная запись), и жмем «Next». Оставляем галку«Allow shadowing session on this server». Расположенныениже галочки не устанавливаем! Порт для TCP/IP-соедине-ний с сервером IIS оставляем по умолчанию (Default).«Next». Соглашаемся сделать стартовую страницу веб-сер-вера такой, как предлагает мастер.

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

Скачиваем все последние хотфиксы и скрипт для ихавтоматической установки отсюда: http://www.citrix4ge.de/tipps/fr3fix.htm.

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

Приступим к лицензированию Citrix MF XP. После уста-новки у нас появилась панель «ICA Administration Toolbar».Если этого не произошло, то можно вручную вставить ее вавтозагрузку из меню «Пуск →→→→→ Программы →→→→→ Citrix →→→→→Metaframe XP». Хотя это необязательно. Все действия поадминистрированию Citrix MF производятся из консолиManagement Console. Если ICA Administration Toolbar при-сутствует на экране, то это самая нижняя кнопочка в ней.Иначе – через меню «Пуск →→→→→ Citrix →→→→→ Management Console».Запускаем. Нам предложат сквозную (Pass Through) аутен-тификацию. Ставим галочку на «Enable Pass Throughauthentication» и «Connect to this server». Жмем «ОК». От-кроется консоль администрирования Citrix. Переходим назакладку Licenses и начинаем добавлять необходимые ли-цензии. Все лицензии добавляются путем щелчка правойклавишей мыши по закладке Licenses и выбора «Addlicense». Программа запрашивает серийный номер лицен-зии. Для полной функциональности нам необходимо при-обрести следующие лицензии (напоминаю, мы установиливерсию XPs с Feature Release 3):! MetaFrame XPs 1.0 for Windows – базовая лицензия.! MetaFrame XPs 1.0 Connection Pack – лицензия на под-

ключения.! Citrix User License Pack – лицензия на подключения.! MetaFrame XP 1.0 for Windows, Feature Release 3 – ли-

цензия на сам Feature Release.! MetaFrame XP 1.0, Feature Release 3 Connection Pack –

лицензия на подключения к Feature Release.

Некоторые лицензии требуют активации. Тогда при до-бавлении лицензии вам предложат ее активировать, введякод активации. Активация лицензий доступна, например, навеб-ресурсе www.citrix.com/activate. Добавляя лицензии, необращайте внимания на возможные сообщения о том, чтонабор лицензий неполный, даже после добавления и акти-вации последней. Процесс регистрации лицензий может за-нимать некоторое время. Добавив и активировав все опи-санные лицензии, закройте Management Console и подожди-те 5 минут. Затем заново откройте Management Console,перейдите на закладку Licenses и нажмите <F5> (обновить).Если сообщение о недостаточности лицензий снова появ-ляется, попробуйте перезагрузить компьютер. Если оно бу-дет появляться и после перезагрузки – какая-то из лицен-зий добавлена некорректно или не активирована. Проверьтееще раз. Если не получается – удалите все лицензии в зак-ладке Licenses – License Numbers и попробуйте установитьзаново. При написании этой статьи автор для проверки про-делал все описанные действия – все работало.

Теперь приступим к опубликованию приложений. Дляпримера возьмем самый часто используемый вариант при-менения сервера терминалов в России: программы семей-ства 1С:Предприятие 7.7.

Итак, устанавливаем 1С:Предприятие в режиме «Ло-кальная установка». Помните, что когда сервер находит-ся в режиме сервера приложений, установка программпроизводится только через меню «Установка и удалениепрограмм →→→→→ Установка новой программы». Затем уста-навливаем менеджер лицензий ключа защиты (сервер за-щиты).

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

92

образование

Внимание! Менеджер лицензий необходимо устанавли-вать в режиме системной службы. Входящий в состав по-ставки «Сервер защиты» не имеет режима работы в каче-стве «системной службы», поэтому в «Автозагрузке» онбесполезен. Необходимый нам дистрибутив можно скачатьс официального сайта производителя ключей HASP –www.alladin.ru. Нам необходим файл LMSetup.exe. При ус-тановке соглашаемся со всеми его предложениями и (этоважно!) выбираем режим установки «Service». В конце пе-резагружаем компьютер. Если вы не установите менеджерлицензий как описано выше, то при попытке запустить опуб-ликованное приложение «1С:Предприятие» на клиенте выполучите сообщение «Не обнаружен ключ защиты».

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

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

Итак, открываем Management Console и выделяем оп-цию «Applications». Щелкаем по ней правой клавишей ивыбираем «Publish Application». Открывается мастер пуб-ликации. Задаем имя нашего приложения (произвольно),например, 1C-Terminal (чтобы не путать в дальнейшем слокальной установкой у клиента). Поле «Description» мож-но оставить пустым или добавить комментарий к этому при-ложению. Полезно, если у нас будет много однотипных опуб-ликованных приложений. Нажимаем «Next». Ставим галку«Application» и в поле «Command line» нажимаем «Browse».Выбираем наш сервер и указываем путь к запускаемомуфайлу (в нашем случае это 1cv7.exe или 1cv7s.exe). Путь«Working Directory» оставляем по умолчанию. Нажимаем«Next». На следующем экране имеется возможность создатьподпапку для окружения «Program Neighborhood». Исполь-зуем эту возможность, если нам необходимо разделить мно-жество публикуемых приложений. Иначе – оставляем полепустым. Если мы хотим автоматически добавлять ярлыкизапуска на рабочий стол и в меню «Пуск» наших клиентов(что очень удобно), то выставляем галки «Add to the client’sStart Menu» и «Add shortcut to the client’s Desktop». Галку«Place under Programs Folder…» не устанавливаем. Нажи-маем «Next». Выбираем размер окна и цветовую гаммуприложения. Для запуска приложения во весь экран (па-нель задач при этом остается!) выбираем Session windowsize «Full Screen» и Colors «High Color (16 bit)». Галку «HideApplication title bar» снимаем, а «Maximize application atstartup» – устанавливаем. Нажимаем «Next». Снимаем гал-ку «Enable audio». При необходимости устанавливаем шиф-

рование данных (используется, например, при реализациипредоставления доступа к основной базе для филиаловчерез интернет (будет описано далее). Если мы включаемшифрование, скорее всего, понадобится дополнительнаялицензия для Citrix – Citrix Secure ICA Services. Устанавли-ваем галку «Printing» – Start this application without waitingfor printers to be created». Нажимаем «Next». Определяемсерверы для поставленных задач. В нашем случае сервертолько один, поэтому выделяем его в левом поле и нажи-маем «Add». Нажимаем «Next». Распределяем правапользователей на доступ к опубликованному приложению.Снимаем галку «Allow anonymous Connections» и добавля-ем нужные нам группы, например, «Администраторы до-мена» и «Пользователи домена». Если терминальный дос-туп необходимо предоставлять избранным пользователям,то удобнее всего создать в нашем домене (рабочей группе)дополнительную группу и помещать туда нужных пользо-вателей. Нажимаем «Finish».

Мы создали опубликованное приложение. Если наш сер-вер приложений является контроллером домена (при нали-чии возможности их разделить – не стоит объединять роликонтроллера домена и сервера приложений), то нам необ-ходимо отредактировать политику безопасности, предос-тавив доступ к самому серверу группе пользователей, ко-торой мы разрешили доступ к опубликованному приложе-нию.

Для этого открываем консоль редактирования полити-ки безопасности контроллера домена: «Пуск →→→→→ Програм-мы →→→→→ Администрирование →→→→→ Политика безопасности кон-троллера домена».

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

Теперь добавим администраторов Citrix. В ManagementConsole выделяем Citrix Administrators, правой клавишей«Add Citrix Administrator». В нашем домене находим группу«Администраторы домена» и добавляем ее. Ставим галку«Add local administrators». Нажимаем «Next», и выбираем«Full Administration». Нажимаем «Finish».

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

Все! Далее нам необходимо настроить клиентов.Итак, рассмотрим два варианта: клиенты локальной сети

и удаленные клиенты.

Настройка клиентов локальной сетиCitrix Metaframe имеет специальное средство – ICA ClientCreator. Его описание можно найти по приведенной в концестатьи ссылке.

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

93№11(24), ноябрь 2004

образование

Мы рассмотрим тривиальный способ – установка кли-ентов из дистрибутива и последующая настройка для со-единения. Еще раз акцентирую внимание на том, что дан-ная статья не описывает максимальную автоматизацию по-добного внедрения, а предназначена для получения опытаначального уровня. Дистрибутив клиента берем либо с ди-стрибутивных дисков Citrix, либо скачиваем последнююверсию с сайта производителя: www.citrix.com. Замечулишь, что при обновлении клиента до версии 8.0.xx онипочему-то потеряли возможность пользоваться в терми-нальных сессиях колесиком мышки. Сам автор используетверсию клиента 6.30.1051 как наиболее стабильную (тес-тировалось исключительно по личному опыту и касаетсятолько версии Citrix XP for Windows 2000). Итак, заходим наклиентский компьютер с правами администратора и запус-каем ica32.exe. В процессе выполняем стандартные дей-ствия по принятию лицензионного соглашения, указанияпути и программной группы. Сравниваем, корректно ли ус-тановщик определил имя клиента, и разрешаем использо-вать локальные имя и пароль клиента для аутентификации(отвечаем «Yes»). После установки – не соглашаемся пе-резагрузить компьютер – сделаем это чуть позже. Вместоэтого открываем редактор реестра командой regedt32.exe(regedit.exe – не годится!) и находим ветку HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSLicensing. Выделяем ееи выбираем меню «Безопасность →→→→→ Разрешения». Прохо-димся по всем перечисленным там пользователям и груп-пам, выставляя всем галочку «Полный доступ». Жмем «ОК»и выходим из программы редактирования реестра. Пере-загружаем клиента. Подразумевается, что в домене ужезаведены учетные записи пользователей и клиентскиекомпьютеры введены в домен. Заходим в систему с учет-ной записью пользователя, работающего на этом компь-ютере. Запускаем с рабочего стола или из меню «Пуск»Citrix Program Neighborhood. На предложение ввести имяи пароль жмем Cancel и соглашаемся, что хотим прерватьподключение. Меню «Tools →→→→→ ICA-Settings». Устанавлива-ем две нижние галочки – Pass-Through authentication и UseLocal Credentials for log on и жмем OK. Завершаем сеанспользователя (Logoff) и вновь входим с его учетной запи-сью. Снова открываем Citrix Program Neighborhood. Еслинаш значок «1C-Terminal» не появился автоматически, тоследуем дальнейшим инструкциям. Выбираем «Find NewApplication Set». Если ярлыка «Find New Application Set»не видно, тогда нажимаем кнопку «UP» и затем «Find NewApplication Set».

Выбираем «Local Area Network», «Далее», кликаем погалочке справа на поле «Click below to locate the ApplicationSet to add». Там должно отобразиться имя созданной намифермы приложений.

Если этого не произошло (такое бывает, когда у нас всети несколько серверов Citrix или по причине отсутствиямультиадресной рассылки информации о серверах) и мыполучили сообщение о невозможности найти что-либо, товыполняем следующие действия: Кнопка «Server Location»,Network Protocol →→→→→ TCP/IP, Address List →→→→→ Add… ВводимIP-адрес нашего сервера и нажимаем «ОК», затем снова«ОК». Опять кликаем по галочке справа на поле «Clickbelow to locate the Application Set to add».

Выбираем ее и жмем «Далее». Следующее окно ос-тавляем без изменений (Colors →→→→→ Use server Default,Windows Size →→→→→ Seamless Window). «Далее» →→→→→ «Готово».Найденная ферма появится в нашем окне Citrix ProgramNeighborhood.

Правой клавишей кликаем по ней и выбираем «Set asdefault». Затем снова правой клавишей – «ApplicationSettings →→→→→ Logon Information». Проверяем, чтобы были ус-тановлены галки Local User и Pass-Through Autentification.Жмем «ОК» и дважды кликаем по нашей ферме. Если мывсе сделали правильно, то в списке приложений появитсянаше опубликованное (1C-Terminal), а его ярлык будет ав-томатически добавлен на рабочий стол пользователя и вменю «Пуск →→→→→ Citrix Program Neighborhood». Если вместоэтого появилось окно запроса имени пользователя и па-роля – закрываем все окна и перезагружаем компьютер.Если все нормально – закрываем окно Citrix ProgramNeighborhood и запускаем с рабочего стола или из меню«Пуск» наше опубликованное приложение.

Внимание! Приложения в терминальном режиме могутзапускаться гораздо дольше обычного, зато работают по-том намного быстрее. Поэтому, запустив приложение одинраз, дождитесь его загрузки. Объясните это пользователям,так как на опыте проверено, что жать они будут на ярлыкдо посинения, запуская все новые и новые сессии. В итогевсе подвиснет. После запуска приложения в системном треепоявляется значок подключения к серверу Citrix. Он и сиг-нализирует, что приложение уже запущено. Если же запус-ка не произошло в течение продолжительного времени (бо-лее минуты), то стоит проверить права на ветку реестраHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ MSLicensing.Об этом мы говорили в самом начале этой главы.

Итак, наше приложение 1C-Terminal запустилось, и мыготовы к добавлению пользователю рабочих баз данных.Тут все почти стандартно. Единственное замечание – припопытке прописать базу через «Обзор» система выдастсообщение «ICA Client File Security». Ответим «Full Access»и «Never ask me again for any application». Данный вопросзадается, если пользователь является локальным админи-стратором на своей рабочей станции или данный пользо-ватель имеет право на подключение к общим системнымресурсам <DriveLetter>$, так как по умолчанию в Citrix MFXP включен режим присоединения клиентских дисков. Пос-ле этого можно спокойно прописывать все необходимыебазы. Если базы у всех пользователей одинаковы и неиз-менны, можно импортировать каждому пользователю вет-ку реестра при входе, что позволит каждому новому пользо-вателю автоматически получать список баз. Например, длясистемы 1С:Предприятие 7.7 список баз хранится в веткереестра: HKEY_CURRENT_USER\Software\1C\1Cv7\7.7\Titles. Сохраните ее, например, в файле Titles.reg и пропи-шите в Logon-script строку:

Однако подобные вопросы автоматизации выходят зарамки данной статьи.

Итак, помните, что самый главный смысл терминально-го решения, если вы ждете от него ускорения работы при-

regedit -s Titles.reg

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

94

образование

ложений, работающих, например, с dbf-базами, – это ло-кальное расположение рабочих данных!

Все, можно работать.

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

На сервере нам необходимо указать так называемый«альтернативный адрес», с которым будут работать удален-ные клиенты. Это тот самый внешний IP-адрес. Открываемкомандную строку и вводим команду:

где <IP-address> – наш внешний IP-адрес. Например:

Затем необходимо разрешить прохождение нужных нампакетов на межсетевом экране (Firewall), а также предос-тавить нашему серверу выход наружу по технологии NAT,либо напрямую. Порты, которые мы должны открыть:

Входящие соединения:! Источник: IP-удаленных клиентов (или Any, если мы его

не знаем или он динамический).! Порты источника: >1024.! Получатель: наш внешний IP.! Порты получателя: UPD-1604, TCP-1494.

Исходящие соединения:! Источник: внутренний IP нашего сервера (если он на-

прямую не подключен к Интернету).! Порты источника: UPD-1604, TCP-1494.! Получатель: IP-удаленных клиентов (или Any, если мы

его не знаем или он динамический).! Порты получателя: > 1024.

Если наш сервер подключен к Интернету с использова-нием технологии NAT, то необходимо организовать пере-направление пакетов по указанным портам с внешнего ин-терфейса Firewall на внутренний интерфейс сервера. То естьнеобходимо указать, что сигналы, приходящие на порт 1604по протоколу UPD и на порт 1494 по протоколу TCP, – необ-ходимо перенаправлять на те же порты внутреннего IP-адре-са сервера. Применяйте для этого средства, при помощикоторых вы организовали реализацию технологии NAT –почти наверняка они там присутствуют. Ранее автором быланаписана статья по реализации этого решения – техноло-гии общего доступа в Интернет, защиты при помощи меж-сетевого экрана и организации доступа внутрь сети извнепри помощи продукта WinRoute Pro 4.2. On-line редакциястатьи находится здесь: http://www.kuban.ru/forum_new/forum10/modpage/FAQ/wr/index.shtml .

К сожалению, стандартными средствами Firewall, встро-енного в Windows, проброс портов внутрь сети выполнитьневозможно, поэтому необходимо воспользоваться однимиз дополнительных средств.

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

На этапе выбора адреса для подключения выбираем«Wide Area Network», жмем «Далее», кнопка «ServerLocation», «Network Protocol →→→→→ TCP/IP, Address List →→→→→Add…». Вводим внешний IP-адрес нашего подключения восновном офисе, затем опцию «Firewalls» и устанавлива-ем галку «Use Alternate address for firewall connection».Нажимаем дважды «ОК». Кликаем по галочке справа наполе «Click below to locate the Application Set to add». Еслимы корректно настроили межсетевой экран, то должно вы-валиться имя созданной нами фермы приложений. Далеевсе так же, как и при настройке клиентов локальной сети.Рекомендуется после добавления нашей фермы приложе-ний кликнуть по ней правой клавишей мыши, перейти назакладку Default Option и установить четыре самых верх-них галки (Use data compression, Use cache for bitmap,Queue mouse movement and keystrokes, Turn off desktopintegration for this application set), а также выставить пара-метр Speed Screen Latency Reduction в положение «ON» иустановить справа две галки: «Mouse click feedback» и«Local Text Echo».

Настройки глубины цвета выбираем, исходя из ширинынашего канала и необходимости экономии трафика. Дляминимализации объемов передаваемых данных и обеспе-чения максимально возможной скорости на тонких кана-лах связи выбираем 16 или 256 цветов. Наиболее комфор-тный вид обеспечивается при глубине цвета не менее 16бит. На работе самой программы это никак не отразится –будет лишь изменена отображаемая цветовая гамма.

Помним, что клиенты удаленного офиса должны такжеиметь либо прямое подключение к Интернету, либо исполь-зовать технологию NAT, а на межсетевом экране должнобыть разрешено подключение этих клиентов на порты UDP-1604 и TCP-1494 для внешнего IP-адреса основной сети,где расположен сервер терминалов. В данном случае име-ется в виду Firewall, стоящий в клиентской сети.

В завершение хотелось бы привести полезную ссылку.Несмотря на то, что во время написания статьи автор непользовался приведенным ниже ресурсом, а основывалсяна личном опыте, все равно крайне рекомендуется его изу-чить, так как данная статья является средством Step-by-Step, а информация по приведенной ниже ссылке – наибо-лее полным руководством по продуктам Citrix в России. Всемы так или иначе ее использовали при изучении даннойтехнологии: http://citrix.1th.ru/admin3/index.html.

Автор выражает признательность всем коллегам, кото-рые помогали в редактировании этой статьи на этапе еетестирования.

Литература:1. Марков Р. Установка и настройка W2K Server. – Жур-

нал «Системный администратор», №10, октябрь 2004 г. –88-94 с.

Altaddr /SET <IP-address>

Altaddr /SET 195.131.101.xxx

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

Российская Федерация! Подписной индекс: 81655

Каталог агентства «Роспечать»! Подписной индекс: 87836

Объединенный каталог «Пресса России»Адресный каталог «Подписка за рабочим столом»Адресный каталог «Библиотечный каталог»

! Альтернативные подписные агентства:Агентство «Интер-Почта» (095) 500-00-60, курьерскаядоставка по МосквеАгентство «Вся Пресса» (095) 787-34-47Агентство «Курьер-Прессервис»Агентство «ООО Урал-Пресс» (343) 375-62-74

! Подписка On-linehttp://www.arzy.ruhttp://www.gazety.ruhttp://www.presscafe.ru

СНГВ странах СНГ подписка принимается в почтовых отделе-ниях по национальным каталогам или по списку номенкла-туры АРЗИ:! Азербайджан – по объединенному каталогу российских

изданий через предприятие по распространению печа-ти «Гасид» (370102, г. Баку, ул. Джавадхана, 21)

! Казахстан – по каталогу «Российская Пресса» черезОАО «Казпочта» и ЗАО «Евразия пресс»

! Беларусь – по каталогу изданий стран СНГ через РГО«Белпочта» (220050, г.Минск, пр-т Ф.Скорины, 10)

! Узбекистан – по каталогу «Davriy nashrlar» российскиеиздания через агентство по распространению печати«Davriy nashrlar» (7000029, Ташкент, пл.Мустакиллик,5/3, офис 33)

! Армения – по списку номенклатуры «АРЗИ» через ГЗАО«Армпечать» (375005, г.Ереван, пл.Сасунци Давида, д.2)и ЗАО «Контакт-Мамул» (375002, г. Ереван, ул.Сарья-на, 22)

! Грузия – по списку номенклатуры «АРЗИ» через АО«Сакпресса» ( 380019, г.Тбилиси, ул.Хошараульская, 29)и АО «Мацне» (380060, г.Тбилиси, пр-т Гамсахурдия, 42)

! Молдавия – по каталогу через ГП «Пошта Молдавей»(МД-2012, г.Кишинев, бул.Штефан чел Маре, 134)по списку через ГУП «Почта Приднестровья» (МD-3300,г.Тирасполь, ул.Ленина, 17)по прайслисту через ООО Агентство «Editil Periodice»(2012, г.Кишинев, бул. Штефан чел Маре, 134)

! Подписка для Украины:Киевский главпочтампПодписное агентство «KSS»Телефон/факс (044)464-0220

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

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

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

подписка на I полугодие 2005

95№11(24), ноябрь 2004

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

96

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

РЕДАКЦИЯИсполнительный директорВладимир ПоложевецОтветственный секретарьНаталья Хвостова[email protected]Технический редакторВладимир ЛукинРедакторАндрей Бешков

РЕКЛАМНАЯ СЛУЖБАтел./факс: (095) 928-8253Константин Меделянreс[email protected]

Верстка и оформление[email protected][email protected]Дизайн обложкиНиколай Петрочук

103045, г. Москва,Ананьевский переулок, дом 4/2 стр. 1тел./факс: (095) 928-8253Е-mail: [email protected]: www.samag.ru

РУКОВОДИТЕЛЬ ПРОЕКТАПетр Положевец

УЧРЕДИТЕЛИВладимир ПоложевецАлександр Михалев

ИЗДАТЕЛЬЗАО «Издательский дом«Учительская газета»

Отпечатано типографиейГП «Московская Типография №13»Тираж 7000 экз.

Журнал зарегистрированв Министерстве РФ по делам печати,телерадиовещания и средств мас-совых коммуникаций (свидетельствоПИ № 77-12542 от 24 апреля 2002г.)

За содержание статьи ответствен-ность несет автор. За содержание рек-ламного обьявления ответственностьнесет рекламодатель. Все права наопубликованные материалы защище-ны. Редакция оставляет за собой пра-во изменять содержание следующихномеров.

ЧИТАЙТЕВ СЛЕДУЮЩЕМНОМЕРЕ:

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

! Магазин «Компьютерная и деловая книга» (Ленинский проспект, строение 38).! Выставочный компьютерный центр «Савеловский» (Киоск у главного входа).! Выставочный компьютерный центр «Буденовский».! Книжная ярмарка «Центральная». Mагазин «Деловая и учебная литерату-

ра» (м. Тульская, Варшавское шоссе, д.9. эт. 5, павильон 515-09).! ТЦ «Электроника на Пресне». Mагазин «Техкнига» (павильон 8-9).! Редакция «Учительская газета» (Ананьевский переулок, д. 4/2, стр. 1).

On-line магазины:

! www.allsoft.ru! www.linuxcenter.ru! www.linuxshop.ru! www.bolero.ru

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

НЕ ПРОПУСТИТЕ ПОДПИСКУна первое полугодие 2005 года

подробная информация на стр. 95

Единая учетная записьдля Windows и Linux/UNIXв Active DirectoryВ данной статье пойдет речь о том, какуправлять единой учетной записьюпользователя посредством MS ActiveDirectory и Services For Unix, независи-мо от того, на какой платформе рабо-тает пользователь, будь то Windowsили Linux/UNIX.

Идеальный карманныйкомпьютер для системногоадминистратораЧасть 2Продолжаем знакомить читателей скарманным компьютером, работающимпод управлением операционной систе-мы Linux от компании Sharp. Из заклю-чительной части статьи вы узнаете обособенностях установки и сборки про-грамм для КПК, а также о возможнос-тях, которые он предоставляет систем-ному и сетевому администратору.

Защита сетевых сервисовс помощью stunnelКак защитить от прослушивания и вме-шательства извне данные, передавае-мые сервисами POP3, IMAP, MySQL,syslog? Предлагаем решить эту задачус помощью SSL и stunnel – для этого вамне придется прилагать больших усилий.

Linspire одним глазкомФирма Linspire – ветеран движения запопуляризацию Linux, хотя самой тор-говой марке едва насчитывается пятьмесяцев. Между тем, компания былаоснована в далеком 2001 году. С тех пори по сей день ее бессменным управля-ющим является всемирно известныйавантюрист-инноватор Майкл Роберт-сон, создатель портала MP3.com. Пер-воначально компания называласьLindows, а ее основное детище и геройсегодняшней статьи, настольный дист-рибутив Linux – LindowsOS. Такое явноесозвучие с «окнами» не могло понра-виться корпорации Microsoft и оченьбыстро стало предметом многочислен-ных судебных разбирательств, как натерритории США, так и за их предела-ми… В данном обзоре мы рассмотримосновные возможности Linspire 4.5.189

Developers Edition, датированной янва-рем 2004 года. С тех пор было выпуще-но несколько исправлений, однако ба-зовая функциональность системы непретерпела существенных изменений.