№11(12) ноябрь 2003 подписной индекс 81655 журнал для cистемных администраторов, вебмастеров и программистов
Виртуальный полигон для разработчика и администратора на основе Linux и VMWare Архитектура файловой системы ext2 Аудит учетных записей пользователей в Active Directory Windows Server 2003: взгляд системного администратора
№11(12) ноябрь 2003
Удобнее, эффективнее, лучше: snort + MySQL Fusebox в помощь веб-программисту
оглавление BUGTRAQ
2, 33 БЕЗОПАСНОСТЬ Защитник сети
АДМИНИСТРИРОВАНИЕ
Сергей Яремчук grinder@ua.fm
Виртуальный полигон для разработчика и администратора на основе Linux и VMWare Андрей Бешков tigrisha@sysadmins.ru
4
Сергей Яремчук grinder@ua.fm
18
62
WEB Fusebox в помощь веб-программисту
Архитектура файловой системы ext2 Владимир Мешков ubob@mail.ru
Удобнее, эффективнее, лучше: snort + MySQL Павел Закляков amdk7@mail.ru
Файловые системы Linux
56
26
Андрей Уваров dashin@ua.fm Дмитрий Горяинов dg@webclub.ru
76
Интеграция SQUID + LDAP Марк Кричмар mark@rusautogaz.ru
ОБРАЗОВАНИЕ 34
Использование бездисковых маршрутизаторов Андрей Мозговой brain@m9.ru
Аудит учетных записей пользователей в Active Directory Максим Костышин Maxim_kostyshin@mail.ru
38
Крис Касперски kk@sendmail.ru
Воспоминания замечательных дней: заря компьютеризации России и борцы 44 с железными конями той эпохи... Алексей Костромин natalex_home@mail.ru
89
ПОЛЕЗНЫЕ СОВЕТЫ 50
Кто предупрежден – тот вооружен Михаил Торчинский Mikhail@3r.ru
№11(12), ноябрь 2003
80
КАК ЭТО БЫЛО
Windows Server 2003: взгляд системного администратора Алексей Доля Михаил Мельников info@samag.ru
Коды Рида-Соломона в практических реализациях, или Информация, воскресшая из пепла III
90
1
bugtraq Переполнение буфера в функции User32.dll Удаленное переполнение буфера в Microsoft Windows 4.0/2000/XP/2003 в Messenger Service Программа: Microsoft Windows XP (Professional, Home в Microsoft Windows NT/2000/XP/2003 Edition), Microsoft Windows Server 2003 (Web Edition, Standard Edition, Enterprise Edition, Datacenter Edition), Microsoft Windows NT 4.0 (Workstation, Terminal Server Edition, Server), Microsoft Windows 2000 (Server, Professional, Datacenter Server, Advanced Server). Опасность: Критическая. Описание: Уязвимость обнаружена в Microsoft Windows 4.0/2000/XP/2003. Злонамеренный локальный пользователь может поднять свои привилегии. Проблема связана с тем, что ListBox- и ComboBox-управления вызывают функцию User32.dll, которая содержит переполнение буфера. В результате злонамеренный пользователь может эксплуатировать эту уязвимость через интерактивный или привилегированный процесс, который использует ListBox- и ComboBox-управления, чтобы выполнить произвольный код с привилегиями этого процесса. Уязвимость может эксплуатироваться через Utility Manager в Windows 2000. Также возможна эксплуатация и через другие приложения сторонних фирм. Переполнение происходит, когда передается LB_DIRсообщение к ListBox или CB_DIR-сообщение к ComboBox с чрезмерно длинным параметром pathname. Подробности в источнике сообщения. URL производителя: http://www.microsoft.com Решение: Установите соответствующее исправление: Microsoft Windows NT Workstation 4.0, Service Pack 6a; Microsoft Windows NT Server 4.0, Service Pack 6a; Microsoft Windows NT Terminal Server Edition, Service Pack 6; Microsoft Windows 2000, Service Pack 2; Microsoft Windows 2000 Service Pack 3, Service Pack 4; Microsoft Windows XP Gold, Service Pack 1; Microsoft Windows XP 64 bit Edition; Microsoft Windows XP 64 bit Edition Version 2003; Microsoft Windows Server 2003; Microsoft Windows Server 2003 64 bit Edition.
Удаленный DoS против OpenBSD pf(4) Программа: OpenBSD 3.2, 3.3. Опасность: Критическая. Описание: Уязвимость обнаружена в пакетном фильтре OpenBSD pf(4). Удаленный пользователь может аварийно завершить работу приложения. Сообщается, что приложение может обратиться к памяти, которая предварительно была освобождена. В этом случае, если используются активные scrub-правила, удаленный пользователь может аварийно завершить работу за приложения. URL производителя: http://www.openbsd.org Решение: Установите соответствующие исправления: ftp://ftp.openbsd.org/pub/OpenBSD/patches/3.3/common/ 006_pfnorm.patch ftp://ftp.openbsd.org/pub/OpenBSD/patches/3.2/common/ 019_pfnorm.patch
Программа: Microsoft Windows 2000 (Advanced Server, Datacenter Server, Professional, Server), Microsoft Windows NT 4.0 (Server, Terminal Server Edition, Workstation), Microsoft Windows Server 2003 (Datacenter Edition, Enterprise Edition, Standard Edition, Web Edition), Microsoft Windows XP (Home Edition, Professional). Опасность: Критическая. Описание: Переполнение буфера обнаружено в Messenger Service в Microsoft Windows. Удаленный атакующий может выполнить произвольный код на уязвимой системе. Проблема связана с тем, что Messenger Service не проверяет длину сообщения. В результате злонамеренный пользователь может послать сообщение, которое переполнит буфер и выполнит произвольный код на уязвимой системе с привилегиями системы. Messenger Service отключен по умолчанию в Microsoft Windows 2003. URL производителя: http://www.microsoft.com Решение: Фильтруйте Netbios и RPC-трафик. Установите соответствующие обновления: Microsoft Windows NT Workstation 4.0, Service Pack 6a; Microsoft Windows NT Server 4.0, Service Pack 6a; Microsoft Windows NT Terminal Server Edition, Service Pack 6; Microsoft Windows 2000, Service Pack 2; Microsoft Windows 2000, Service Pack 3, Service Pack 4; Microsoft Windows XP Gold, Service Pack 1; Microsoft Windows XP 64-bit Edition; Microsoft Windows XP 64-bit Edition Version 2003; Microsoft Windows Server 2003; Microsoft Windows Server 2003 64-bit Edition.
Множественные уязвимости в Novell iChain Программа: Novell iChain 2.2. Опасность: Критическая. Описание: Novell выпустил support pack для iChain. В нем устраняются несколько уязвимостей, которые могут использоваться злонамеренным пользователем, чтобы внедриться в сессию другого пользователя, вызвать отказ в обслуживании и скомпрометировать систему. Пользователь может внедриться в сессию другого пользователя, если сессия нового пользователя открыта на том же самом порту. Удаленный пользователь может завершить работу сервера, используя WGET. iChain подвержен к OpenSSL-уязвимостям в ASN.1-обработчике. URL производителя: http://support.novell.com/cgi-bin/ search/searchtid.cgi?/2967175.htm Решение: Установите соответствующие исправления: Apply iChain 2.2 Support Pack 2 beta: http://support.novell.com/ servlet/filedownload/sec/ftf/b1ic22sp2.exe iChain 2.2 Support Pack 2 beta – TID2967175: http://support. novell.com/cgi-bin/search/searchtid.cgi?/2967175.htm Cоставил Александр Антипов
2
администрирование
ВИРТУАЛЬНЫЙ ПОЛИГОН ДЛЯ РАЗРАБОТЧИКА И АДМИНИСТРАТОРА НА ОСНОВЕ LINUX И VMWARE
АНДРЕЙ БЕШКОВ 4
администрирование В первой статье этого цикла, опубликованной в сентябрьском номере журнала «Системный администратор», я довольно подробно описал, что такое технология виртуальных машин VMWare Workstation и каково ее предназначение. Также мы изучили теоретические основы функционирования, способы и возможные цели практического применения VMWare Workstation в повседневной деятельности администратора. Свою точку зрения на вопрос, для решения каких задач стоит применять подобный комплекс программного обеспечения, я высказывал в предыдущей статье. Ну а для тех, кто присоединился к нам только сейчас, кратко повторим содержание сказок тысячи и одной ночи, прозвучавших раньше. Таким образом, тем, кто еще не в курсе, я намекаю, что она была посвящена установке, настройке и опыту успешного применения VMWare Workstation на платформе Windows. Господам линуксоидам просьба перестать плеваться и все же найти в себе силы прочесть вышеуказанную статью. Сделать это необходимо хотя бы по той простой причине, что в данной статье я сознательно буду говорить только о необходимом минимуме теории функционирования VMWare Workstation. Вместо этого мы обсудим особенности дизайна виртуальных машин и множество прочих полезных вещей. Думаю, лучше потратить время на изложение новых знаний, чем на повторение пройденного материала. Перед тем как пуститься в обсуждение всего разнообразия полезных применений продукта, которому посвящена наша сегодняшняя беседа, разберемся с некоторыми наиболее важными базовыми идеями и терминами, проходящими красной нитью через текст всей статьи. Операционная система, под управлением которой работает программа VMWare Workstation, называется «основной» системой. Такие системы, в свою очередь, делятся на официально поддерживаемые и те, кому не повезло. Начнем с перечисления имен титулованных особ из рода Linux: Mandrake Linux 8.2, 9.0 Red Hat Advanced Server 2.1 Red Hat Linux 7.0, 7.1, 7.2, 7.3, 8.0 SuSe Linux Enterprise Server 7,8 SuSe Linux 7.3, 8.0, 8.1 Официально поддерживаемыми называются те виды Linux, для которых разработчики VMWare Workstation создали бинарные файлы модулей, загружаемых в ядро. Пользователи всех остальных версий Linux должны компилировать такие модули из исходных текстов самостоятельно. В качестве основной Linux-системы ALT Linux Master 2.2 был выбран вопреки тому факту, что он отсутствует в приведенном выше списке, но в то же время довольно широко распространен среди русскоязычных пользователей, и, наконец, за то, что вовремя оказался под рукой. Процедура установки на любой из официальных Linux-дистрибутивов слишком проста, чтобы научить читателя чему-то полезному. Многие подводные камни пройдут мимо и не будут замечены до тех пор, пока не придется самостоятельно устанавливать виртуальные
№11(12), ноябрь 2003
машины для работы под управлением варианта Linux, неизвестного авторам VMWare Workstation. Пользуясь моим опытом, читатель ценой малой крови научится устанавливать VMWare Workstation на любое множество разновидностей Linux. Теперь перейдем ко второму виду систем. Системы, запущенные внутри контейнера виртуальной машины VMWare Workstation, называются «гостевыми». Я уверен, что с задачей, которую мы будем решать, в той или иной степени приходилось сталкиваться большинству администраторов. Нужно создать действующий макет сети предприятия с несколькими компьютерами, благополучно проживающими внутри этих виртуальных сетей. И, вдобавок ко всему, нужно обеспечить всю веселую компанию доступом в Интернет. Для облегчения восприятия учебного материала упростим рабочий макет, поместив в каждую сеть только необходимый минимум компьютеров. Я думаю, этого будет достаточно для успешного усвоения обсуждаемых концепций.
На приведенной выше схеме мы видим, что в сетях VMnet3 и VMnet2 находятся машины, работающие под управлением операционных систем Windows 98SE и Windows 2000, символизирующие обычные рабочие станции. Машина Windows 98SE имеет статический адрес 192.168.120.15, а Windows 2000 получает адрес 192.168.80.128 динамически с помощью DHCP. Сеть Vmnet1 используется нами как демилитаризованная зона (DMZ). Внутри нее обитает машина со статическим адресом 192.168.40.32 под управлением Linux Mandrake 9.0. На ней для демонстрации работы сетевых служб установлен веб-сервер Apache. Между собой все три сети, перечисленные выше, соединены с помощью шлюза, как ни странно, имеющего также три сетевых интерфейса и функционирующего под управлением FreeBSD 4.7. Я надеюсь, всем понятно, что для облегчения стыковки наших сетей все три интерфейса машины FreeBSD должны иметь фиксированные адреса. Ну и в роли нашего последнего героя выступает машина NetBSD с двумя интерфейсами. Первый из них с адресом 192.168.40.57 смотрит в демилитаризованную зону, а второй является шлюзом в Интернет. На втором интерфейсе 192.168.32.128 работает механизм преобразования сетевых адресов (NAT), это, в свою оче-
5
администрирование редь, дает возможность предоставить доступ к веб-серверу клиентам, находящимся в Интернете. Частично благодаря этому машины, находящиеся в наших локальных сетях, могут легко пользоваться услугами не только Linux веб-сервера, но и какого угодно другого веб-сервера, расположившегося в любой точке Интернета. С точки зрения VMWare Workstation наши тестовые сети будут выглядеть так.
Workstation. Таким образом, вы сможете выбрать способ, наиболее подходящий лично вам. Ну а процедура конфигурирования, которая последует сразу за инсталляцией, одинакова для обоих видов дистрибутивов. Первым делом давайте рассмотрим наиболее простой способ. Для установки из rpm нужно выполнить всего одну команду. # rpm -i VMware-workstation-4.0.0-4460.i386.rpm
Убеждаемся, что все установилось правильно. # rpm -qa | grep VMware VMwareWorkstation-4.0.0-4460
На этом действия с rpm можно считать законченными. Переходим к инсталляции из tar.gz: # tar
zxvf
VMware-workstation-4.0.0-4460.tar.gz
Распаковываем дистрибутив и в результате получаем директорию vmware-distrib. Переходим в нее и запускаем скрипт инсталляции. На первый взгляд схема сетевых взаимодействий выглядит устрашающе сложно, но на самом деле это не так, и через несколько минут вы будете с легкостью ориентироваться в топологии наших сетей. Итак, на рисунке мы видим все перечисленные ранее хосты и их интерфейсы. Присмотревшись внимательно, легко разобраться в соответствии между IP-адресами и интерфейсами. Далее изображены три виртуальных коммутатора для сетей hostonly VMnet1 (192.168.40.0), VMnet2 (192.168.80.0), VMnet3 (192.168.120.0). Соответственно для работы с устройством NAT (192.168.32.2) предназначена сеть VMnet8, для которой по умолчанию используется адресное пространство 192.168.32.0. Также обратите внимание на тот факт, что виртуальные DHCP-сервера работают только в сетях VMnet2 и VMnet8. Исходя из того факта, что в сетях VMnet1 и VMnet3 используются статические IP-адреса, DHCP-сервера этих сетей отключены за ненадобностью. Итак, приступим к установке. На сайте производителя заказываем себе тестовый серийный номер для Linux. Все подобные лицензии действуют в течение 30 дней с момента заказа. Таким образом, мы получаем в свое распоряжение на целый месяц полнофункциональную версию программы. Через несколько минут в наш ящик электронной почты упадет два письма с серийными номерами для разных платформ. Запрашивать новые тестовые лицензии можно неограниченное количество раз, но на разные почтовые ящики. Таким образом, можно использовать VMWare Workstation, не нарушая никаких законов, сколько угодно долго. Подобная лояльная политика персонала VMWare.inc вызывает искреннее уважение. Дело в том, что дистрибутив VMWare Workstation для Linux распространяется в двух форматах – rpm и tar.gz. Скачать их можно тут: http://www.vmware.com/download/ workstation.html. Также не забудьте взять фирменную документацию в формате pdf. Я расскажу о процедуре установки каждого из этих дистрибутивов VMWare
6
# cd vmware-distrib # ./vmware-install.pl
Скрипт будет задавать нам вопросы. В большинстве случаев нам подойдут ответы, предлагаемые по умолчанию. Они заключены в квадратные скобки и, чтобы согласиться с ними, нужно просто нажать клавишу «Enter». Итак, приступим. In which directory do you want to install the binary files? [/usr/bin]
Скрипт спрашивает, куда складывать выполняемые файлы. Ответ по умолчанию нас вполне удовлетворяет. In which directory do you want to install the library files? [/usr/lib/vmware]
Следующий вопрос касается того, куда нужно поместить библиотечные файлы. Поступаем так же, как и в предыдущем случае. In which directory do you want to install the manual files? [/usr/share/man]
А здесь мы будем хранить документацию для VMWare Workstation в формате man. In which directory do you want to install the documentation files? [/usr/share/doc/vmware]
Скрипт предложил поместить документацию в формате txt в директорию /usr/share/doc/vmware/. Пусть будет так, я не против, да и места на жестком диске не жалко. The path "/usr/share/doc/vmware" does not exist currently. This program is going to create it, including needed parent directories. Is this what you want? [yes]
Жалуется на то, что директории /usr/share/doc/vmware
администрирование не существует, и спрашивает, создавать ли ее. Отвечаем «yes». Кстати, после инсталляции, сходив в директорию /usr/share/doc/vmware/, видим, что кроме лицензий и инструкций по установке там больше ничего нет. Все то же самое можно увидеть внутри директории doc дистрибутива VMWare Workstation. Ну что же, не будем останавливаться и продолжим настройку. What is the directory that contains the init directories (rc0.d/ to rc6.d/)? [/etc/rc.d]
Тут нужно указать, где находится директория со скриптами для разных уровней загрузки системы. Для используемого мною дистрибутива это директория /etc/rc.d/. What is the directory that contains the init scripts? [/etc/rc.d/init.d]
Ну а тут находятся скрипты запуска демонов, используемые при начальной загрузке системы. Before running VMware Workstation for the first time, you need to configure it by invoking the following command: "/ usr/bin/vmware-config.pl". Do you want this program to invoke the command for you now? [yes]
Можно считать инсталляцию завершенной. Скрипт спрашивает, нужно ли приступить к конфигурированию. Оно производится с помощью скрипта /usr/bin/vmwareconfig.pl. Теперь к нам присоединяются те, кто производили установку из rpm. Они должны запустить этот скрипт вручную. Узнаем версию ядра. Чуть позже эти знания обязательно пригодятся нам. # uname -a Linux tigroid.net 2.4.20-alt5-up #1 Sun Feb 16 16:46:13 ↵ MSK 2003 i686 unknown unknown GNU/Linux
Запускаем скрипт конфигурирования: /usr/bin/vmware-config.pl You must read and accept the End User License Agreement to continue. Press enter to display it.
Нажимаем Enter и читаем лицензионное соглашение. Переход между страницами соглашения осуществляется клавишей «Пробел». Дойдя до конца, видим приглашение принять лицензию. Do you accept? (yes/no)
yes
Отвечаем «yes» и движемся дальше.
binary. Далее система хочет убедиться в том, что у нас установлен работоспособный компилятор языка C. Setup is unable to find the "make" program on your machine. Please make sure it is installed. Do you want to specify the location of this program by hand? [yes]
Говорит, что не может найти утилиту make на нашей машине, и предлагает поискать ее самостоятельно, а затем сообщить правильный путь. Ну что же, попробуем найти то, что нам нужно. # which make which: no make in (/root/bin:/sbin:/usr/sbin:/usr/local/ ↵ sbin:/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin)
Теперь посмотрим в списке установленных пакетов: # rpm -qa | grep make
Как ни грустно признать такой факт, но, судя по всему, этой утилиты у нас и вправду нет. Вставляем в привод первый диск дистрибутива и переходим в директорию с пакетами. # cd /mnt/cdrom/auto/ALTLinux/RPMS
Ставим make: # rpm -i make-3.79.1-ipl6mdk.i586.rpm
Те, у кого под рукой нет дисков с Alt Linux, но есть постоянное подключение к Интернету, могут воспользоваться репозитарием пакетов сайта altlinux.ru. Устанавливать пакеты в этом случае можно с помощью программы aptget или synaptic. После инсталляции make прерываем сценарий vmwareconfig нажатием клавиш Ctrl+C и запускаем его опять. Скрипт снова спрашивает о наличии компилятора, на это мы ему вновь отвечаем «yes». И в ответ получаем вот такую неприятную ошибочку. Using compiler "/usr/bin/gcc". Use environment variable CC to override. i586-alt-linux-gcc: No such file or directory Your compiler "/usr/bin/gcc" is not supported by this version of VMware Workstation. Unable to continue. For more information on how to troubleshoot module-related problems, please visit our Web site at "http://www.vmware.com/ download/modules/modules.html" and "http://www.vmware.com/ support/reference/linux/prebuilt_modules_linux.html". Execution aborted.
Trying to find a suitable vmmon module for your running kernel. None of VMware Workstation's pre-built vmmon modules is suitable for your running kernel. Do you want this program to try to build the vmmon module for your system (you need to have a C compiler installed on your system)? [yes]
Система рапортует о том, что не смогла найти модули, подходящие к нашему ядру. Список доступных модулей можно увидеть в директории /usr/lib/vmware/modules/
№11(12), ноябрь 2003
Начинаем разбираться с проблемой. # rpm -qa | grep gcc libgcc3.2-3.2.1-alt2 gcc-common-1.2.1-alt2
Судя по всему, компилятор действительно отсутствует, в наличии только служебные пакеты для gcc.
7
администрирование В ALT Linux для удобства администрирования используется концепция альтернатив. Это означает, что все наиболее важные системные утилиты должны иметь ссылки на свои бинарные файлы из каталога /etc/alternatives: #ll /etc/alternatives/gcc lrwxrwxrwx 1 root rpm 20 Aug 29 00:39 ↵ /etc/alternatives gcc -> /usr/bin/gcc_wrapper
What is the location of the directory of C header files that match your running kernel? [/usr/src/linux/include]
Смотрим, куда установили заголовочные файлы нашего ядра, на основе которых VMWare Workstation будет собирать модули, загружаемые в работающее ядро. # rpm -qpl kernel24-headers-2.4.20-alt5.i586.rpm
Таким образом, мы видим, что файл /etc/alternatives/ gcc указывает на файл /usr/bin/gcc_wrapper, который не является полноценным компилятором. А служит лишь для того, чтобы выводить сообщение об ошибке на случай, если пользователь попытается запустить его. # ./gcc_wrapper i586-alt-linux-gcc: No such file or directory
Судя по всему, это директория /usr/lib/kernel/2.4.20-alt5/ include/. Пишем ее в ответ на приглашение и снова жмем «Enter». Система начнет компиляцию, и на экране начнут появляться надписи вроде: Extracting the sources of the vmmon module. Building the vmmon module.
Такая вот своеобразная заглушка. Ну что же, значит, придется снова ставить все самому. Переходим на диск 3 дистрибутива и пытаемся устанавливать пакет gcc2.962.96-alt3.i586.rpm. Внимательный читатель может задать вопрос, почему мы используем gcc именно этой версии, когда нам доступна гораздо более новая версия 3.2. Ответ очень прост: ядро, на котором работает система, собрано версией 2.96 компилятора gcc. Так что если попытаться поставить что-то другое, скрипт инсталляции VMWare Workstation наотрез откажется работать. # rpm -i gcc2.96-2.96-alt3.i586.rpm error: failed dependencies: cpp2.96 = 2.96-alt3 is needed by gcc2.96-2.96-alt3 binutils >= 1:2.13.90.0.4-alt2 is needed by gcc2.96-2.96-alt3 glibc-devel is needed by gcc2.96-2.96-alt3
Итак, судя по результатам работы команды rpm, у нас неудовлетворенные зависимости между пакетами. Начнем разрешение конфликтов. Как всегда, ехидно замечаем, что счастливчики, пользующиеся apt-get или synaptic, подобных проблем не почувствуют. Мое нежелание использовать apt-get связано с тем, что я предпочитаю делать все самостоятельно. Каким из перечисленных способов добавлять программное обеспечение в систему, оставляю на ваше усмотрение. Ну а я займусь увлекательной игрой, суть которой сводится к поиску и установке следующих пакетов. # # # # # # #
rpm rpm rpm rpm rpm rpm rpm
-i -i -i -i -i -i -i
cpp2.96-2.96-alt3.i586.rpm kernel-headers-common-1.0-alt2.noarch.rpm kernel24-headers-2.4.20-alt5.i586.rpm glibc-devel-2.2.6-alt0.6.i586.rpm libbfd-2.13.90.0.4-alt2.i586.rpm binutils-2.13.90.0.4-alt2.i586.rpm gcc2.96-2.96-alt3.i586.rpm
Вновь запускаем скрипт, система снова спросит о компиляторе, а мы опять нажмем «Yes», соглашаясь с тем, что вот теперь-то у нас точно есть компилятор. Using compiler "/usr/bin/gcc". Use environment variable CC to override.
На экране появится надпись о том, что в качестве компилятора будет использоваться /usr/bin/gcc. Нас такой поворот событий вполне удовлетворяет, поэтому с легким сердцем переходим к следующему шагу.
8
make: Entering directory `/root/tmp/vmware-config0/vmmon-only' make[1]: Entering directory ↵ `/root/tmp/vmware-config0/vmmon-only' make[2]: Entering directory ↵ `/root/tmp/vmware-config0/vmmon-only/driver-2.4.20-alt5-up' make[2]: Leaving directory ↵ `/root/tmp/vmware-config0/vmmon-only/driver-2.4.20-alt5-up' make[2]: Entering directory ↵ `/root/tmp/vmware-config0/vmmon-only/driver-2.4.20-alt5-up' make[2]: Leaving directory ↵ `/root/tmp/vmware-config0/vmmon-only/driver-2.4.20-alt5-up' make[1]: Leaving directory ↵ `/root/tmp/vmware-config0/vmmon-only' make: Leaving directory `/root/tmp/vmware-config0/vmmon-only'
Система закончит сборку модуля vmmon и перейдет к следующему модулю по имени vmnet. В результате сборки каждого модуля должна появляться вот такая надпись: «The module loads perfectly in the running kernel», говорящая, что созданный модуль загружается в ядро без конфликтов. Далее отвечаем на вопрос, хотим ли мы, чтобы наши виртуальные машины могли работать с сетью. Do you want networking for your virtual machines? (yes/no/ help) [yes]
Как обычно, радостно соглашаемся и переходим на следующую ступеньку. Configuring a bridged network for vmnet0.
Сеть vmnet0 используется для работы с устройствами типа мост и конфигурируется автоматически, поэтому нам о правильности ее настроек заботиться нет нужды. Configuring a NAT network for vmnet8. Do you want this program to probe for an unused private subnet? (yes/no/help) [yes] no
Сеть vmnet8 по умолчанию используется для работы с устройством NAT. Скрипт спрашивает, не желаем ли мы автоматически выбрать свободную частную подсеть. Мы этого не хотим, потому как в наших планах построения макета записано, что для данной цели будет использоваться сеть 192.168.32.0. What will be the IP address of your host on the private network? [172.16.252.1] 192.168.32.1
администрирование What will be the netmask of your private network? [255.255.255.0]
Соответственно описываем нужную нам для NAT-сеть и ее маску. The version of DHCP used in this version of VMware Workstation is licensed as described in the "/usr/share/doc/vmware/ DHCP-COPYRIGHT" file. Hit enter to continue.
Нажав «Enter», приступаем к изучению лицензии на усеченной версии сервера DHCP, поставляющегося в комплекте с VMWare Workstation. Do you want to be able to use host-only networking in your virtual machines? [no] yes
Разрешаем использовать сети типа host-only. Что это за сети и каково их предназначение, читайте в первой статье. Do you want this program to probe for an unused private subnet? (yes/no/help) [yes] no
Запрещаем автоматический поиск свободных сетей, потому что мы хотим самостоятельно выбирать адреса раздаваемых сетей. Главное – случайно не напороться на уже существующую в локальной сети подсеть. Иначе некоторое количество «приятных» минут вам обеспечено. What will be the IP address of your host on the private network? 192.168.40.0 What will be the netmask of your private network? 255.255.255.0
Мне такая возможность показалось полезной, и я разрешил ее включение. Кстати, в фирменной документации сказано, что если на вашей машине уже работает Samba, то в этом случае нужно в ответ на вопрос сказать «no», потому что иначе в системе начнутся конфликты между полной и усеченной версиями Samba. This system appears to have a CIFS/SMB server (Samba) configured for normal use. If this server is intended to run, you need to make sure that it will not conflict with the Samba server setup on the private network (the one that we use to share the host's filesystem). Please check your / etc/samba/smb.conf file so that: . The "interfaces" line does not contain "192.168.40.1/255.255.255.0" . There is a "socket address" line that contains only your real host IP address
Кстати, стоит отметить, что скрипт самостоятельно нашел на моей машине установленную, но не запущенную в данный момент полноценную версию Samba. Проверить, правда ли это, можно, запустив на другой консоли следующие команды: # rpm -qa | grep samba samba-client-2.2.7-alt3 samba-2.2.7-alt3 samba-client-cups-2.2.7-alt3 samba-common-2.2.7-alt3
Ну что же, вернемся обратно к установке. Как всегда, сначала рассказали о лицензии на сервер Samba, с помощью которого будет идти обмен файлами, а затем уведомили, что Samba у нас функционирует нормально. Затем прошел автоматический запуск демона VMWare Workstation.
The following hostonly networks have been defined: . vmnet1 is a host-only network on private subnet 192.168.40.0.
Вот так мы создали сеть Vmnet1 с адресным пространством 192.168.40.0 и маской сети 255.255.255.0. Повторяем те же действия для сетей vmnet2 и vmnet3. Только теперь в качестве адресов сетей используем соответственно 192.168.80.0 и 192.168.120.0. The following hostonly networks have been defined: . vmnet1 is a host-only network on private subnet 192.168.40.0. . vmnet2 is a host-only network on private subnet 192.168.80.0. . vmnet3 is a host-only network on private subnet 192.168.120.0.
Cкрипт рапортует об успешном создании сетей vmnet1, vmnet2, vmnet3. В ответ на вопрос, не хотим ли мы настроить еще несколько сетей, отвечаем «no». Do you want this program to automatically configure your system to allow your virtual machines to access the host's filesystem? (yes/no/help) [no]
Хотим ли мы, чтобы виртуальные машины могли прозрачно работать с файлами, находящимися на файловых системах основной операционной системы? Реализуется это через запуск под управлением основной операционной системы усеченной версии программного обеспечения Samba. Эта версия создана специально для подобной цели, и, скорее всего, ни для чего другого не годится.
№11(12), ноябрь 2003
Starting VMware services: Virtual machine monitor Virtual ethernet Bridged networking on /dev/vmnet0 Host-only networking on /dev/vmnet1 Host-only networking on /dev/vmnet2 Host-only networking on /dev/vmnet3 Host-only networking on /dev/vmnet8 NAT networking on /dev/vmnet8
(background) (background) (background) (background)
[ [ [ [ [ [ [ [
OK OK OK OK OK OK OK OK
] ] ] ] ] ] ] ]
Снова принимаем поздравления с удачной установкой. Кстати, убедиться, что работает именно усеченная версия Samba, можно с помощью запуска на другой консоли вот такой команды. # ps -ax | grep -v grep | grep mbd 1260 ? S 0:00 /usr/bin/vmware-nmbd -D ↵ -l /dev/null -s /etc/vmware/vmnet1/smb/smb.conf ↵ -f /var/run/vmware-nmbd-vmnet1.pid 1280 ? S 0:00 /usr/bin/vmware-smbd -D ↵ -l /dev/null -s /etc/vmware/vmnet1/smb/smb.conf ↵ -f /var/run/vmware-smbd-vmnet1.pid
Теперь нужно решить, от имени какого пользователя samba будет получать доступ к файлам, находящимся на диске основной операционной системы. You have successfully configured VMware Workstation to allow your virtual machines to access the host's filesystem. Would you like to add a username and password for accessing your host's filesystem at this time? (yes/no/help) [yes] no
Мне показалось, что создавать еще одного пользова-
9
администрирование теля только для того, чтобы разграничить доступ к файлам основной системы, нецелесообразно. Особенно учитывая тот факт, что я пользуюсь этой машиной единолично. Таким образом, Samba будет работать от имени пользователя root, запустившего серверную часть VMWare Workstation. Проверить, как функционируют подсистемы VMWare Workstation и какой у каждой из них статус, можно с помощью следующей команды: # service vmware status At least one instance of VMware Workstation is still running. vmnet-bridge (pid 1165) is running... vmnet-dhcpd (pids 1373 1287 1273 1239) are running... vmnet-netifup (pids 1308 1251 1208 1182) are running... Module vmmon installed Module vmnet installed
Итак, первоначальная настройка VMWare Workstation закончена, и мы можем позволить себе посмотреть, как выглядят добавочные сетевые адаптеры, на основе которых работают наши виртуальные сети. # ifconfig lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:2 errors:0 dropped:0 overruns:0 frame:0 TX packets:2 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:92 (92.0 b) TX bytes:92 (92.0 b) vmnet1
Link encap:Ethernet HWaddr 00:50:56:C0:00:01 inet addr:192.168.40.1 Bcast:192.168.40.255 ↵ Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:65 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:100 RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
vmnet2
Link encap:Ethernet HWaddr 00:50:56:C0:00:02 inet addr:192.168.80.1 Bcast:192.168.80.255 ↵ Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:100 RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
vmnet3
vmnet8
Link encap:Ethernet HWaddr 00:50:56:C0:00:03 inet addr:192.168.120.1 Bcast:192.168.120.255 ↵ Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:100 RX bytes:0 (0.0 b) TX bytes:0 (0.0 b) Link encap:Ethernet HWaddr 00:50:56:C0:00:08 inet addr:172.16.252.1 Bcast:172.16.252.255 ↵ Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:100 RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
Теперь проверим, какие процессы работают в системе от имени VMWare Workstation # ps -ax | grep -v grep | grep vm 7398 ? S 0:00 /usr/bin/vmnet-dhcpd ↵ -cf /etc/vmware/vmnet1/dhcpd/dhcpd.conf ↵ -lf /etc/vmware/vmnet1/dhcpd/dhcpd.leases ↵ -pf /var/run/vmnet-dhcpd-vmnet1.pid vmnet1 7411 ? S 0:00 /usr/bin/vmware-nmbd -D ↵ -l /dev/null -s /etc/vmware/vmnet1/smb/smb.conf ↵ -f /var/run/vmware-nmbd-vmnet1.pid 7431 ? S 0:00 /usr/bin/vmware-smbd -D ↵
10
-l /dev/null -s /etc/vmware/vmnet1/smb/smb.conf ↵ -f /var/run/vmware-smbd-vmnet1.pid 7434 ? S 0:00 /usr/bin/vmnet-dhcpd ↵ -cf /etc/vmware/vmnet2/dhcpd/dhcpd.conf ↵ -lf /etc/vmware/vmnet2/dhcpd/dhcpd.leases ↵ -pf /var/run/vmnet-dhcpd-vmnet2.pid vmnet2 7493 ? S 0:00 /usr/bin/vmnet-dhcpd ↵ -cf /etc/vmware/vmnet8/dhcpd/dhcpd.conf ↵ -lf /etc/vmware/vmnet8/dhcpd/dhcpd.leases ↵ -pf /var/run/vmnet-dhcpd-vmnet8.pid vmnet8 7516 ? S 0:00 /usr/bin/vmnet-natd ↵ -d /var/run/vmnet-natd-8.pid ↵ -m /var/run/vmnet-natd-8.mac ↵ -c /etc/vmware/vmnet8/nat/nat.conf 7543 ? S 0:00 /usr/bin/vmnet-dhcpd ↵ -cf /etc/vmware/vmnet3/dhcpd/dhcpd.conf ↵ -lf /etc/vmware/vmnet3/dhcpd/dhcpd.leases ↵ -pf /var/run/vmnet-dhcpd-vmnet3.pid vmnet3
Если вы помните, мы уже говорили, что в сетях vmnet1 и vmnet3 все клиенты работают со статическими адресами, поэтому DHCP-сервера этих сетей работают вхолостую. Желательно не забыть отключить DHCP-компоненты вышеназванных сетей. Впрочем, если вы этого не сделаете, то ничего страшного не произойдет, но дизайн сети будет уже не таким опрятным, да и системные ресурсы все же не бесконечны. Все настройки VMWare Workstation хранятся внутри каталога /etc/vmware. Каждая из сетей имеет свою папку внутри вышеназванного каталога. Для наглядности давайте посмотрим на содержимое папки /etc/vmware/vmnet1, в которой хранятся настройки для сети vmnet1. Как вы могли бы догадаться, /etc/vmware/vmnet1/dhcpd/ содержит настройки сервера dhcp, а /etc/vmware/vmnet1/smb/ соответственно является местом хранения конфигурационных файлов усеченной версии сервера Samba. Для того чтобы остановить сервера DHCP, обслуживающие сети vmnet1 и vmnet3, нужно удалить каталоги /etc/vmware/vmnet1/dhcpd/ и /etc/vmware/vmnet3/dhcpd/. Ну и напоследок стоит убедиться, что в файле /etc/vmware/ vmnet2/dhcpd/dhcpd.conf есть вот такая секция: subnet 192.168.80.0 netmask 255.255.255.0 { range 192.168.80.128 192.168.80.254; option broadcast-address 192.168.80.255; option domain-name-servers 192.168.80.1; option domain-name "localdomain"; option routers 192.168.80.2; }
Иногда скрипт конфигурирования сети VMWare Workstation забывает дописать в эту секцию строку option routers, отвечающую за адрес шлюза по умолчанию. Соответственно клиенты при работе с DHCP-сервером успешно получают IP-адреса, но дальше своей родной сети пойти не могут, потому что не знают адреса маршрутизатора. Осталось подправить одну крохотную, но в то же время очень важную настройку. Если мы хотим, чтобы люди из внешнего мира видели наш виртуальный веб-сервер, работающий на машине Linux Mandrake, то нам нужно организовать проброс входящих соединений. Получается, что все соединения, приходящие на 80-й порт реальной машины, нужно заворачивать на 80-й порт виртуального веб-сервера. Делается это очень просто, хотя и не так элементарно, как если бы VMWare Workstation работала под управлением Windwos. Нужно добавить в файл /etc/vmware/vmnet8/nat/nat.conf внутрь секции [incomingtcp] следующие строки.
администрирование vmnet-sniffer – перехватчик трафика для виртуальных
# incoming www from outside on port 80 80 = 192.168.40.32:80
Затем необходимо перезапустить серверную часть VMWare Workstation, заставив применить внесенные изменения. # service vmware restart Stopping VMware services: Virtual machine monitor [ OK Bridged networking on /dev/vmnet0 [ OK DHCP server on /dev/vmnet1 [ OK SMB share server on /dev/vmnet1 [ OK SMB name server on /dev/vmnet1 [ OK Host-only networking on /dev/vmnet1 [ OK DHCP server on /dev/vmnet2 [ OK Host-only networking on /dev/vmnet2 [ OK DHCP server on /dev/vmnet3 [ OK Host-only networking on /dev/vmnet3 [ OK DHCP server on /dev/vmnet8 [ OK NAT networking on /dev/vmnet8 [ OK Host-only networking on /dev/vmnet8 [ OK Virtual ethernet [ OK Starting VMware services: Virtual machine monitor [ OK Virtual ethernet [ OK Bridged networking on /dev/vmnet0 [ OK Host-only networking on /dev/vmnet1 (background) [ Host-only networking on /dev/vmnet2 (background) [ Host-only networking on /dev/vmnet3 (background) [ Host-only networking on /dev/vmnet8 (background) [ NAT networking on /dev/vmnet8
] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] OK OK OK OK
] ] ] ]
Судя по выводу скрипта, DHCP-сервера отключились во всех виртуальных сетях разом. На самом деле это не так. Давайте проверим наличие демонов VMWare Workstation в памяти. Делать это нужно все той же доброй старой командой ps: # ps -ax | grep -v grep | grep vm 4515 pts/1 S 0:00 /usr/bin/vmnet-bridge ↵ -d /var/run/vmnet-bridge-0.pid /dev/vmnet0 eth0 4531 pts/1 S 0:00 /usr/bin/vmnet-netifup ↵ -d /var/run/vmnet-netifup-vmnet1.pid /dev/vmnet1 vmnet1 4555 pts/1 S 0:00 /usr/bin/vmnet-netifup ↵ -d /var/run/vmnet-netifup-vmnet2.pid /dev/vmnet2 vmnet2 4586 ? S 0:00 /usr/bin/vmnet-dhcpd -cf /etc/vmware/vmnet2/dhcpd/dhcpd.conf ↵ -lf /etc/vmware/vmnet2/dhcpd/dhcpd.leases ↵ -pf /var/run/vmnet-dhcpd-vmnet2.pid vmnet2↵ 4595 pts/1 S 0:00 /usr/bin/vmnet-netifup ↵ -d /var/run/vmnet-netifup-vmnet3.pid /dev/vmnet3 vmnet3 4645 pts/1 S 0:00 /usr/bin/vmnet-netifup ↵ -d /var/run/vmnet-netifup-vmnet8.pid /dev/vmnet8 vmnet8 4675 ? S 0:00 /usr/bin/vmnet-natd ↵ -d /var/run/vmnet-natd-8.pid ↵ -m /var/run/vmnet-natd-8.mac ↵ -c /etc/vmware/vmnet8/nat/nat.conf 4686 ? S 0:00 /usr/bin/vmnet-dhcpd ↵ -cf /etc/vmware/vmnet8/dhcpd/dhcpd.conf ↵ -lf /etc/vmware/vmnet8/dhcpd/dhcpd.leases ↵ -pf /var/run/vmnet-dhcpd-vmnet8.pid vmnet8
Затаив дыхание, рассматриваем вывод команды. И – о чудо! – судя по надписям, демоны DHCP-сервера вполне нормально обслуживают сети vmnet2 и vmnet8. С начальной настройкой покончено, можно двигаться дальше. Также стоит посмотреть, что появилось в директории /usr/bin/ после инсталляции: vmnet-bridge – программа для создания устройств «мост»; vmnet-dhcpd – усеченная версия демона dhcp; vmnet-natd – демон, реализующий функции устройства NAT; vmnet-netifup – программа для создания виртуальных сетевых интерфейсов;
№11(12), ноябрь 2003
интерфейсов, например, прослушивать данные, передаваемые через сеть vmnet3, можно с помощью команды vmnet-sniffer -e /dev/vmnet3. Это бывает очень полезно для отладки разных проблем сетевой подсистемы; vmstat – показывает состояние виртуальной машины; vmware – собственно главный исполняемый файл системы VMWare Workstation; vmware-config.pl – наш старый знакомый скрипт настройки; vmware-loop – программа для экспорта данных из виртуальной файловой системы в реальную; vmware-mount.pl – инструмент для управления монтированием разделов виртуальных дисков; vmware-nmbd – усеченная версия сервера имен NETBIOS; vmware-ping – служит для проверки виртуальных сетей; vmware-smbd – усеченная версия демона для работы с SMB/CIFS (Samba); vmware-smbpasswd – программа управления пользователями и паролями из комплекта Samba; vmware-uninstall.pl – скрипт деинсталляции VMWare Workstation; vmware-wizard – программа, используемая внутри VMWare Workstation для создания новых виртуальных машин.
Как вы могли убедиться, VMWare Workstation поставляется с довольно богатым набором инструментов. Возможно, некоторые из них мы будем использовать для диагностики и устранения неполадок, если таковые возникнут в наших виртуальных сетях. Продолжать злоупотреблять полномочиями пользователя root больше нет необходимости, поэтому нам стоит превратиться в обычного пользователя, под которым мы и будем ежедневно работать с VMWare Workstation. $ /usr/bin/vmware
Программа должна отработать нормально, и на экране появится главное окно клиентской части VMWare Workstation. Пользуясь меню Help → Enter Serial Number, активируем установленное программное обеспечение с помощью тестового серийного номера, присланного нам по почте.
Программа предложит зарегистрироваться в качестве пользователя на сервере vmware.com. Я решил, что делать этого не желаю, и нажал «Cancel». Вы же можете поступать, как захотите, потому что регистрация на сайте – мероприятие сугубо добровольное и на работу не влияющее.
11
администрирование
Теперь необходимо проверить, правильно ли сработала активация лицензии. Для этой цели нам пригодится меню Help → About Если у вас появилось на экране что-то подобное следующему рисунку, значит, дела идут как положено.
Особое внимание cтоит обратить на дату, расположившуюся за надписью Expiration. Она указывает, до какой даты мы сможем пользоваться лицензией, а значит, и самой программой VMWare Workstation. Итак, закончив с первоначальной настройкой VMWare Workstation, перейдем к созданию наших виртуальных машин. Этот процесс очень подробно описывался в первой статье данного цикла. Если есть желание, можете выполнить его снова. Хотя я думаю, что ничего нового вы для себя не откроете. Ну а я как человек, искренне верящий в слова «лень – двигатель прогресса», поступлю иначе. Если вы помните, от предыдущей статьи нам в наследство остались комплекты файлов виртуальных машин, созданных под Windows. Сейчас мы займемся их переносом под Linux. Машина, на которой происходят все безобразия, описанные в этой статье, имеет на борту две операционных системы – ALT Linux и Windows 2000 Professional. Таким образом, нам нужно примонтировать файловую систему Windows к дереву Linux в директорию /mnt/win_d/VirtualMachines. Выполнив эту задачу, мы получим доступ к файлам наших виртуальных машин. Итак, давайте посмотрим, из каких файлов состоит любая виртуальная машина. В качестве примера возьмем машину Windows 98. Файлы win98-f001.vmdk и win98.vmdk отвечают за работу с жестким диском. Первый из них содержит образ диска, а второй – его конфигурацию. Далее идет файл
12
nvram, в котором хранится образ и настройки BIOS данной виртуальной машины. Как вы, наверное, уже догадались по названию, vmware.log хранит протоколы работы. Поэтому в случае возникновения каких-либо сбоев в функционировании гостевой системы, устранение неполадок лучше всего начать с просмотра именно этого файла. И наконец, мы подходим к самому интересному из всей коллекции – файлу win98.vmx. Именно он хранит в себе набор необходимых для работы виртуальной машины данных. В качестве таких данных могут выступать: список устройств и их характеристики; количество виртуальных жестких дисков; соответствие между файлами виртуальных жестких дисков и устройствами гостевой системы; перечень сетевых адаптеров и их MAC-адреса; настройки вспомогательного программного обеспечения. В случае если VMWare Workstation в данный момент производит какие-либо действия с нашей виртуальной машиной, в директории появится еще и файл блокировки доступа win98.vmx.WRITELOCK. Ну а если вдобавок ко всему еще и гостевая система выполняется, то для каждого файла виртуального диска создается дополнительный файл блокировки win98.vmdk.WRITELOCK. Также внутри директории можно встретить файлы вида win98.vmss и win98.vmsn. Соответственно первый из них содержит данные, полностью описывающие состояние виртуальной машины на тот момент, когда ее функционирование было приостановлено с помощью команды Power → Suspend. Ну а второй хранит данные моментального снимка виртуальной машины, получаемого с помощью команды Snapshot → Save Snapshot. Время от времени внутри директории с файлами гостевой системы на короткие промежутки времени будут появляться различные служебные файлы, но вы их, скорее всего, никогда не увидите. Разобравшись с устройством виртуальной машины на файловом уровне, перейдем от теории к действиям. Для того чтобы мы могли работать с выбранной машиной, нужно объяснить VMWare Workstation, где находятся необходимые нам файлы. Используем меню File → Open, получаем следующую картинку.
администрирование Выбираем файл win98.vmx и обязательно используем по прямому назначению кнопку «ОК». После того, как VMWare Workstation выполнит открытие всех нужных файлов, можно запускать виртуальную машину с полученной только что гостевой системой. Тут нас ждет несколько неприятных неожиданностей. Как из рога изобилия, начинают сыпаться ошибки и предупреждения. Возможно, на вашей системе некоторые из них никак не проявят себя, а взамен появятся какие-либо новые конфликты. Но бояться этого все же не стоит. Большинство из таких проблем поддаются коррекции довольно просто.
Совсем не понравилась VMWare Workstation моя ps/2 мышь glidepoint. Но это не беда, доктор сказал, что на этом свете почти все неприятности поправимы.
Итак, тут мы видим конфликтную ситуацию, возникшую внутри подсистемы сетевого оборудования. А если говорить точнее, то VMWare Workstation сообщает, что у нее отсутствует сетевой адаптер VMnet3. Нажимаем «OK» и переходим к следующей ошибке.
Эта ошибка единственная, с которой я не смог справиться, но она некритична. Дело в том, что моя устаревшая видеокарта и установленный на машину X-сервер не поддерживают аппаратную акселерацию режима DGA, поэтому во время работы гостевой системы в полноэкранном режиме возможны проблемы с быстродействием. Ради интереса я проверил, так ли это. Невооруженным глазом заметить какое-либо замедление не удалось.
Снова не совпадает наименование устройств системы. На этот раз нам отказала звуковая карта.
После того как гостевая система с горем пополам закончила загрузку, вся панель устройств похожа на выездной пикник красного креста. Просмотрев весь список ошибок, который VMWare Workstation посчитала необходимым показать нам, приступим к исправлению оных. Первым делом беремся за настройку сетевого адаптера. Проходим через меню Edit → Virtual Machine Settings и выбираем устройство Network Adapter. Точно такого же эффекта можно добиться с помощью меню Edit → Removable Devices → Ethernet0 → Edit. Теперь жалоба касается CD-ROM. Нас предупреждают, что не все режимы работы будут доступны из-за конфликтов с настройками реального и проецируемого на него виртуального устройства.
В связи с разницей в имени гибкого диска между Windows и Linux, диск A:\ тоже не хочет работать. Итак, нам нужно вместо VMnet3 выбрать из ниспадающего меню /dev/vmnet3. Затем с помощью переключателя «Connect» подключить устройство к работающей гостевой системе. Дело в том, что VMWare Workstation позволяет подключать и отключать многие устройства прямо на ходу. В качестве таких устройств могут выступать
№11(12), ноябрь 2003
13
администрирование CD-ROM, Ethernet-адаптер, гибкие диски, SCSI-устройства, звуковая карта, высокоточный таймер реального времени. Это, в свою очередь, позволяет более оперативно исправлять проблемы, обходясь без перезагрузки гостевой системы. В общем, должна получиться комбинация настроек, отображенная на следующем рисунке.
Выбрав тот или иной путь для разрешения проблемы с CD-ROM устройством, идем дальше. Теперь нужно разобраться с PS/2 мышью, установленной на основной системе. Запускаем программу настройки общесистемных параметров (для моего дистрибутива это drakconf ) и выбираем в качестве мыши устройство «Стандартная PS2 мышь с колесом (IMPS2)». Теперь займемся лечением устройства CD-ROM. Сразу же после переноса гостевой системы с Windows на Linux это виртуальное устройство представляет собой следующую совокупность настроек.
Настраивать мышь можно и вручную: для этого нужно открыть файл /etc/X11/XF86Config-4, в котором находятся настройки X-сервера. Ищем внутри него секцию, отвечающую за работу мыши, и вносим вместо нее следующие строки: Для начала указываем, что нужное нам физическое устройство называется /dev/cdrom/. И обязательно устанавливаем переключатель опции «Legacy emulation». Таким образом, включается режим совместимости со старыми образцами устройств CD-ROM. Это дает дополнительную стабильность функционирования. Затем выбираем один из двух путей: либо приказываем работать с виртуальным CD-ROM в формате IDE-устройства, либо маскируем его под SCSIустройство. В результате должна получиться одна из двух изображенных ниже комбинаций настроек.
14
Section "InputDevice" Identifier "Mouse1" Driver "mouse" Option "Protocol" Option "Device" Option "ZAxisMapping" EndSection
"IMPS/2" "/dev/psaux" "4 5"
Вешаем на стену скальп еще одной решенной проблемы и переходим к следующей. Сейчас нам нужно починить устройство для работы с гибкими дисками. Под Windows оно называется A:\ , ну а под Linux это будет одно из устройств семейства /dev/fd. В моей системе это устройство называется /dev/fd0.
администрирование Налюбовавшись рисунками с изображением настроек «до» и «после», перейдем к решению следующей проблемы. У нас на очереди звуковая карта. Посмотрим, что именно вписано в конфигурацию этого устройства.
Неудивительно, что оно не работает при таком странном названии «-1». Вместо этого, слегка задумавшись, но ничуть не сомневаясь, выбираем /dev/dsp:
Разобравшись со всеми проблемами, закрываем VMWare Workstation и все остальные приложения. Теперь нужно перезапустить X-сервер для того, чтобы изменения в настройках мыши вступили в действие. Нажимаем комбинацию кнопок Ctrl+Alt+BackSpace. После перезагрузки X-сервера снова входим в систему и запускаем VMWare Workstation и внутри нее гостевую машину Windows 98. Уж теперь-то все должно заработать на ура. Используя вышеописанную методику, чиним все остальные гостевые системы. Таким образом, у нас появятся работоспособные виртуальные машины с FreeBSD, NetBSD, Linux, Windows 2000. Кстати, перед запуском каждой из них вы будете видеть вот такую картинку, предупреждающую о том, что в системе работает несколько гостевых систем, и совместный доступ к аппаратным устройствам может работать некорректно.
Судя по всему, гостевая система, запущенная первой, заблокировала устройство /dev/fd0, и теперь ни одна другая система не сможет работать с ним до тех пор, пока оно не будет освобождено. Дабы избежать подобных коллизий в будущем, сделайте так, чтобы переключатели «Connected» и «Connected at power on» были отключены.
Таким образом, устройство для работы с гибкими дисками будет отключено по умолчанию. Мы сможем включить его обратно в любой момент, когда нам нужно будет поработать с ним. А затем, когда необходимость в его услугах отпадет, будем возвращать его в первозданное состояние. Самый простой способ включить или выключить устройство – это воспользоваться меню Edit → Removable Devices, а затем выбрать нужное устройство и вид действия, производимого над ним. Например, для отключения обсуждавшего выше дисковода гибких дисков нужно пройти через следующую цепочку меню Edit → Removable Devices → floppy0 → Disconnect. Разобравшись с первым конфликтом, переходим к следующему. Тут мы видим, что таймер реального времени, в качестве которого выступает устройство /dev/rtc, также заблокирован первой гостевой системой.
К таким устройствам можно отнести CD-ROM, гибкие диски и таймер реального времени. Если не хотите, чтобы подобные надписи впредь появлялись на экране, воспользуйтесь переключателем «Never show this hint again». Хотя такой подход все равно не спасет от конфликтов, зато избавит от постоянного лицезрения данной надписи. Загрузив первую гостевую систему, сразу же запускаем вторую и моментально получаем первый конфликт. Прочитав фирменную документацию по VMWare Workstation, узнаем, что операционные системы семейства Windows в процессе работы постоянно опрашивают это устройство. Подобное поведение, в свою очередь, может привести к весьма чувствительному повышению нагрузки на основную систему. Далее в документации
№11(12), ноябрь 2003
15
администрирование говорится, что теоретически Windows должна нормально работать и без использования таймера реального времени. Отключаем устройство RTC и проверяем. По крайней мере, мои виртуальные машины, подвергшись такой вивисекции, не утратили стабильного функционирования. Кстати, иногда редактирование конфигурации выключенной виртуальной машины может привести к такой ошибке.
Пугаться этого не стоит, вероятность того, что вы испортите свою гостевую систему, слишком мала. Просто по непонятным причинам конфигурационный файл оказывается заблокирован для записи. Чтобы решить эту проблему, нужно закрыть вкладку виртуальной машины внутри VMWare Workstation и открыть ее снова. На следующей картинке можно увидеть одновременную работу всех систем, на импортирование которых мы потратили столько труда. Для наглядности каждая из них запущена в отдельном окне. Конечно, можно было запустить их внутри разных вкладок родительского окна, но я решил, что так картинка будет выглядеть недостаточно эффектно. Добиться подобного вида можно, используя меню File → New → New Window. Во вновь появившемся окне, следуя укоренившейся привычке, выбираем File → Open. Внимательный читатель может спросить, зачем все эти сложности. Мой ответ будет довольно прост. Такой подход позволяет разложить виртуальные машины в нужном порядке по виртуальным столам оконного менеджера. Лично мне это кажется весьма удобным. У подобной методики работы есть один щекотливый момент. Если внутри любого окна создана вкладка с гостевой операционной системой, то эта система становится не доступна для запуска из другого окна. Все дело в том, что VMWare Workstation в момент открытия конфигурации виртуальной машины создает файл эксклюзивной блокировки. Называется такой файл обычно «имя гостевой системы.vmx.WRITELOCK». Причем файл создается еще до запуска гостевой системы и остается до тех пор, пока не будет закрыта вкладка гостевой системы или завершится работа VMWare Workstation. Получается, что конфигурация гостевой системы будет заблокирована в любом случае, вне зависимости от того, работает гостевая система или нет. Если попытаться открыть эту гостевую систему еще раз, то получим по рукам.
16
В свою очередь, признаком работы системы служит появление дополнительного файла блокировок файлов жестких дисков, называющегося «имя гостевой системы .vmdk.WRITELOCK». Видимо, разработчики VMWare Workstation не смогли придумать более надежного способа для проверки факта запуска той или иной гостевой системы. Кстати, если во время работы гостевой системы удалить все файлы WRITELOCK, то ее легко можно запустить повторно. Например, на следующем рисунке можно видеть два экземпляра гостевой системы Windows 98, запущенных из одного и того же файла и работающих одновременно довольно-таки стабильно.
Впрочем, использовать такие приемы в практической работе не стоит, потому что совершенно непонятно, как поведут себя обе гостевые системы, если им одновременно потребуется записать какие-либо данные в файл виртуального диска. Мы немного отвлеклись от темы нашего повествования. После переноса и успешного запуска всех гостевых систем настал момент проверить, насколько правильно работает наш макет. Для этого на Windows-машинах выполняем команду ipconfig /all и смотрим, какие настройки у нашей сетевой подсистемы. Например, на следующем снимке можно увидеть результат выполнения вышеуказанной команды на машине Win2000.
администрирование Так как все остальные системы, используемые в нашем макете, являются диалектами Unix, то для просмотра состояния их сетевых интерфейсов нужно использовать команду ifconfig. Например, для машины FreeBSD вывод команды выглядел вот так: lnc0:
lnc1:
lnc2:
lp0: faith0: lo0:
flags=8843<UP,BROADCAST,RUNNING,SIMPLEX, ↵ MULTICAST> mtu 1500 inet 192.168.40.2 netmask 0xffffff00 ↵ broadcast 192.168.40.255 inet6 fe80::20c:29ff:fec7:b430%lnc0 ↵ prefixlen 64 scopeid 0x1 ether 00:0c:29:c7:b4:30 flags=8843<UP,BROADCAST,RUNNING,SIMPLEX, ↵ MULTICAST> mtu 1500 inet 192.168.80.2 netmask 0xffffff00 ↵ broadcast 192.168.80.255 inet6 fe80::20c:29ff:fec7:b43a%lnc1 ↵ prefixlen 64 scopeid 0x2 ether 00:0c:29:c7:b4:3a flags=8843<UP,BROADCAST,RUNNING,SIMPLEX, ↵ MULTICAST> mtu 1500 inet 192.168.120.2 netmask 0xffffff00 ↵ broadcast 192.168.120.255 inet6 fe80::20c:29ff:fec7:b444%lnc2 ↵ prefixlen 64 scopeid 0x3 ether 00:0c:29:c7:b4:44 flags=8810<POINTOPOINT,SIMPLEX,MULTICAST> ↵ mtu 1500 flags=8002<BROADCAST,MULTICAST> mtu 1500 flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> ↵
№11(12), ноябрь 2003
ppp0: sl0:
mtu 16384 inet6 ::1 prefixlen 128 inet6 fe80::1%lo0 prefixlen 64 scopeid 0x6 inet 127.0.0.1 netmask 0xff000000 flags=8010<POINTOPOINT,MULTICAST> mtu 1500 flags=c010<POINTOPOINT,LINK2,MULTICAST> mtu 552
Таким образом, проверив правильность настройки сетевых компонентов всех подопытных систем, начинаем смотреть, как по тестовым сетям передаются данные. Для этого на любой машине выполняем команду ping с адресами всех остальных машин. Если ping работает, то переходим к следующему этапу. Теперь любым браузером заходим на адрес 192.168.40.32. Должны увидеть чтото вроде такой страницы с приветствием от веб-сервера Apache. Затем с любой машины, находящейся за пределами созданной виртуальной сети, пытаемся сходить браузером на адрес нашей реальной машины. В ответ должны получить тот же самый привет от Apache. Судя по всему, задача по созданию виртуального полигона, полностью соответствующего схеме, наконец-то выполнена. Как всегда, прощаемся до следующей статьи, которая будет посвящена разным трюкам, заметно облегчающим жизнь при работе с VMWare Workstation.
17
администрирование
ФАЙЛОВЫЕ СИСТЕМЫ LINUX
СЕРГЕЙ ЯРЕМЧУК
18
администрирование Что мне нравится в OС GNU/Linux, так это гибкость во всем, практически можно собрать систему под определенные задачи, выбрав необходимое из множества компонентов. Кроме патчей к ядру, различных версий библиотек и компиляторов, есть возможность выбора и файловой системы, на которой будет работать ОС. В данной статье я предлагаю пробежаться по многообразию и определиться с выбором, узнать о достоинствах и недостатках предлагаемых файловых систем. Под файловой системой понимается физический способ организации данных на дисковом разделе, т.е. возможность их хранения, нахождения и манипулирования ими (запись, стирание). Думаю, такого простенького определения вполне достаточно, чтобы понять, какие требования выдвигаются к файловой системе. До недавнего времени в Linux предлагалась для использования фактически только одна файловая система ext2fs. Да, возможно было, конечно, и установить ее в раздел FAT, но занятие это кажется мне крайне нездоровым, да и производительность и стабильность при таком размещении только страдает. Также изначально в ядре поддерживается возможность взаимодействовать с файловыми системами других ОС, расположенных на одном диске. Их можно посмотреть, набрав: #make xconfig
и зайдя в пункт меню File system, все я их перечислять не буду, для включения их поддержки ядром его необходимо иногда пересобрать, активировав необходимый пункт. Да и то для наиболее распространенных, таких как NTFS Windows NT и UFS (FFS) FreeBSD, запись в них помечена как DANGEROUS, плюс еще не забыта даже MINIX (стоит ли говорить о позавчерашнем дне). Но сейчас предлагаемый ассортимент несколько увеличился, в современных ядрах добавилась возможность работы с так называемыми журналируемыми файловыми системами – ext3fs, ReiserFS, XFS и JFS. Не говоря уж о поддержке технологий Soft-RAID и LVM. Но и это еще не все, для тех, кому нужна повышенная конфиденциальность информации, хранимой на компьютере, вполне подойдет CFS, свободная криптографическая файловая система от Матта Блейза (Mutt Blaze) для Unix/Linux (http://www.crypto.com/ software/) или TCFS (Transparent Cryptographic File System) (http://www.tcfs.it/). В данной статье будут рассмотрены только классические файловые системы как наиболее часто применяемые на компьютерах, об остальных поговорим как-нибудь отдельно в следующий раз. Итак, по старшинству.
Ext2fs Как уже говорилось, данная файловая система в Linux – это уже стандарт де-факто, ее характеризует довольно высокая надежность и самое высокое из рассматриваемых файловых систем быстродействие, которые в свою очередь достигаются дублированием особо важных метаданных и очень эффективным механизмом кэширования дисковых операций. Но так как Linux используется все чаще и чаще на высокопроизводительных
№11(12), ноябрь 2003
серверах, то она уже не удовлетворяет обычным требованиям – большие разделы жесткого диска, быстрое восстановление после сбоев, высокопроизводительные операции ввода/вывода, потребность в хранении тысяч и тысяч файлов, представляющих терабайты данных. Все это уже превышает возможности данной файловой системы. Еще одной особенностью этой файловой системы является тройная косвенная адресация для указания расположения блоков больших файлов. Выглядит это примерно так. Вся информация о расположении блоков данных, принадлежащих данному файлу, хранится в inode. Если файл маленький, то в его метаданных хватает места для размещения нужной информации, и туда помещаются прямые ссылки на ячейки (логические блоки), в которых хранятся данные, – прямая адресация. При увеличении же объема файла, так как отведенное место уже не может адресовать занимаемое пространство, то блоки метаданных указывают уже на косвенные блоки, в которых содержатся адреса с данными, определенными в файле (простая косвенная адресация), или опять же указатели на следующие косвенные блоки (тройная косвенная адресация). То есть если файл увеличивается в размере и для пользователя это проходит как единичная операция, внутри выглядит несколько иначе: поначалу распределяются новые блоки, для того чтобы содержать новые данные, затем модифицируется inode, чтобы сделать запись о новых указателях и новых размерах, а затем, в конце концов, производится запись данных. Вот теперь представьте, что будет, если при записи файла произойдет сбой. Возможно несколько вариантов. Например, запись уже произведена или еще не начиналась – это самый оптимистичный вариант, в первом случае после перезагрузки вы так и будете работать с документом, ничего не заметив, а во втором случае просто теряется пара часов работы, но с файловой системой ничего такого страшного не произойдет. А вот если система «упала» именно в момент сохранения файла, то это худшее из того, что могло произойти. Если запись производилась в зону метаданных, то теперь информация, содержащаяся в них, не будет соответствовать реальному расположению файлов на диске. Ситуация несколько усугубляется еще и тем, что Linux, в отличие от Windows, не обязательно записывает обновленный файл поверх старого, при записи во избежание фрагментации выбирается место, чтобы он влез полностью и на соседние блоки. Поэтому-то в этой системе нет программ дефрагментаторов, мне доводилось видеть фрагментацию данных максимум 1-2 %, да и то на переполненном диске, что, согласитесь, очень мало (вообще на переполненных дисковых разделах существенно падает скорость операций IO, что характерно для всех Unix-файловых систем). Так вот, а если данные заносились в каталог (а ведь это тоже файл), то после перезагрузки мы можем недосчитаться одного каталога или, что хуже, вообще целого раздела. Ну а если произошел сбой при записи в область данных, то, что он будет потом содержать, зависит от вашего везения, особенно в случае, если производилась запись
19
администрирование поверх старого варианта файла. Конечно, ситуация не так плачевна, как я обрисовал. За то время, что я активно эксплуатирую систему, и пройдя вместе с ней не одно выключение электропитания, случаев из ряда вон выходящих не было. Естественно, чтобы избежать такое рассогласование, для данной файловой системы были разработаны утилиты, помогающие восстановить ее после сбоев. За несколько лет их алгоритм, в отличие от всеми любимого Scandisk, не поленились довести практически до совершенства. Так как проверять при каждой перезагрузке все диски, установленные на компьютере, согласитесь, накладно по времени, нашли такой простой выход. После того как все данные согласованы, непосредственно перед самым ее размонтированием устанавливается бит чистого размонтирования – clean bit (в Windows также используется аналогичная технология). И перед загрузкой системы перед ее монтированием программа fsck (FileSystem ChecK) просто проверяет его наличие, если бит установлен, то делается вполне разумное предположение, что файловая система находится в непротиворечивом состоянии, а если нет, то запускается изрядно всем надоевшая утилита fsck. В связи с тем, что ext2fs создает избыточные копии критически важных метаданных, вероятность полной потери данных чрезвычайно мала, система определяет местонахождение поврежденных метаданных и потом либо восстанавливает данные, копируя их из резервных копий, либо просто удаляет файл или файлы, чьи метаданные пострадали. Точнее, не удаляет, а переносит их в каталог /lost+found. Правда, в большинстве дистрибутивов и определение корректности завершения работы также немного упростили. Так, чтобы не гонять fsck индивидуально для каждого раздела, при включении компьютера стартовыми скриптами проверяется наличие файла /.autofsck, который должен удаляться в /etc/rc.d/init.d/halt. Его наличие указывает на некорректность выключения питания, и fsck отрабатывает по полной программе, а если такой файл не обнаруживается, то делается вполне справедливое предположение о нормальном завершении работы, и диски проверяются по минимуму, тем самым ускоряя загрузку системы. Но вот не всегда удается нормально завершить работу, и fsck отрывается, что говорится, по полной программе. Вот тут-то и кроется очевидное неудобство, согласитесь, что чем больше файловая система, тем дольше длится процесс проверки. На дисковом разделе размером в несколько десятков гигабайт, что давно уже перестало быть редкостью и тенденция к увеличению размеров разделов только растет, с большим количеством файлов и каталогов процедура проверки метаданных во время загрузки может очень сильно затянуться. Может, для домашнего компьютера это всего лишь раздражает пользователя (сколько отказываются от проверки Scandisk при загрузке, а потом удивляются, почему в свойствах неправильно указано свободное пространство). А вот если выбило главный производственный сервер и теперь пользователи вынуждены ждать, пока он перегрузится? Вот так плавно челове-
20
чество подошло к журналируемым файловым системам. Напоследок скажу, что сейчас имеет смысл использовать ext2 только в разделе /boot, который обычно автоматически не монтируется при загрузке, запись в него производится довольно редко, и особого смысла держать журнал нет.
Что такое журнал? Все колдовство журнала заключается в механизме транзакций, термин известен тем, кто работал с базами данных. Точно так же, как и в них, механизм транзакций вместо отслеживания модификаций к таблицам и данным рассматривает операцию записи на диск как атомарную, а не разделенную на несколько этапов, что позволяет отследить, прошла ли запись вообще, и в свою очередь гарантировать, что все или ни одно изменение файловой системы не сделано. Поясню сказанное на примере. При создании нового файла изменяются несколько структур метаданных (inodes, списки свободных блоков, список файлов каталога и др.). Прежде чем файловая система сделает изменения, создается транзакция, в которой описывается то, что она собирается сделать. Как только транзакция будет зарегистрирована (на диске), файловая система приступает непосредственно к изменению метаданных. То есть фактически журнал в journaling файловой системе – просто список производимых операций. В случае системного сбоя файловая система будет восстановлена к непротиворечивому состоянию путем повторного запуска журнала и отката к предыдущему состоянию. К тому же в таком случае файловая система осматривает только те участки диска, в которых изменялись метаданные, т.е. она уже «знает», на каком участке произошел сбой. Это намного быстрее, чем при традиционной проверке всего диска при помощи fsck. И что самое существенное, время восстановления, получается, совсем не зависит от размера раздела, а скорее зависит от интенсивности операций ввода/вывода на момент сбоя. Можно выделить два возможных варианта работы журналируемой файловой системы. В первом варианте в журнал заносятся только изменяемые метаданные файла, в таком случае при сбое будет гарантирована целостность метаструктур файловой системы, а сохранность самих данных уже зависит от везучести. Второй вариант предусматривает занесение в журнал вместе с метаданными также и самих данных, как изменившихся, так и немодифицированных, в этом случае есть вероятность, что данные после сбоя будут восстановлены. И конечно же, «природу не обманешь, за все нужно платить». А платить теперь приходится быстродействием, так как самая медленная операция в компьютере – это операции ввода/вывода на диск, количество таких операций выросло, особенно при использовании варианта с полным журналированием данных. Стараются решить данную проблему разными ухищрениями, например, размещение журнала на другом физическом диске. Да и потери невелики, ведь фактически время работы с журналом намного меньше, чем работа непосредственно с данными. И есте-
администрирование ственно, некоторый полезный объем теперь приходится отводить под сам журнал, но он, как правило, не занимает места больше 32 Мб, что по нынешним временам не так уж и много. Самый главный вывод такой: журналируемые файловые системы предназначены не для восстановления всех ваших данных любой ценой, главная их задача заключается в поддержании непротиворечивости метаданных файловой системы на момент сбоя и ускорения процесса загрузки системы после сбоя. Также в большинстве современных journaling-файловых систем поддерживаются: более быстрое распределение свободных блоков, для этого многие из них построены на основе сбалансированных деревьев, иначе известных как B+ деревья; большее количество файлов в каталоге, т.к. в этом случае обычная связка name-inode становится неэффективной, то для хранения имен файлов используются B+ деревья. В некоторых случаях возможно использование всего одного B+ дерева для полной системы, что намного укорачивает поиск файла и соответственно операции по работе с ним. Плюс динамическое выделение inоdes вместо неэффективного статического. Старая методика прямого, косвенного и тройного косвенного механизма хранения информации о нахождении данных файла очень неудобна при работе с файлами большого размера по причине долгого поиска информации и в современных файловых системах заменена на более удобную, позволяющую работать с большими файлами «напрямую». Кроме того, некоторые новые файловые системы имеют более совершенный механизм управления внутренней фрагментацией (что это такое, объясню чуть позже) и распределения inodes, чем ext2. Может, конечно, сложиться впечатление, что место журналируемых файловых систем где-нибудь на сервере, нет, они подходят на все сто процентов для использования на клиентских машинах, где тоже есть необходимость в сохранении данных. Теперь, когда мы точно знаем, что ожидать от описываемых файловых систем, перейдем к их конкретной реализации.
Ext3fs Хотя данная файловая система не была первой поддерживаемой ядром Linux официально (появилась только с версии 2.4.16), все-таки, я думаю, справедливо будет начать именно с нее. Разработана она в недрах компании Red Hat (там и следует искать все новинки о ее работе) доктором Stephen Tweedie. Найти патчи для ядра можно по адресу ftp://ftp.linux.org.uk/pub/linux/sct/fs/jfs/. Чтобы не изобретать колесо, в данном случае поступили просто, прикрутив к стандартной ext2fs журнал. Фактически только добавив файл журнала (в зависимости от опций монтирования можно и не видеть, находится в ./.journal) и заменив драйвер ядра, отвечающий за файловую систему, поэтому она, естественно, наследует все достоинства и недостатки, присущие ext2fs. Но что это дало? Самое главное – это то, что утилиты ext2fs, которые шлифовались в течение нескольких лет, работают в ней как ни в чем не
№11(12), ноябрь 2003
бывало, не замечая подмены. К тому же идентичность файловых систем позволяет оперативно переходить как с еxt3fs на ext2fs, так и наоборот. Поясню. Мне часто приходится устанавливать другие дистрибутивы, в том числе и со старыми ядрами, не поддерживающими новинку. Так вот все разделы, на которых используется ext3fs, я монтирую просто как ext2fs, и никаких, повторяю, никаких недоразумений при использовании не происходит. Другое преимущество данной файловой системы состоит в том, что она, в отличие от остальных, поддерживает режим журналирования данных (полное или частичное). Естественно, добавление журнала, казалось, должно ухудшить производительность данной системы по сравнению с «нежурнальным» вариантом. Оказалось, что за счет улучшения алгоритма движения головки жесткого диска данная файловая система в некоторых случаях даже обходит ext2fs. Ext3fs имеет три режима работы: data=writeback – режим, при котором не выполняется никакого журналирования данных, только метаданные, самый ограниченный режим журналирования (кстати, применяемый во всех других ФС, рассматриваемых ниже), не гарантирующий сохранности данных после сбоя. Но за счет этого возрастает скорость работы такой файловой системы, и фактически журнал предназначен только для того, чтобы уменьшить время начальной загрузки системы. По умолчанию же используется data=ordered – «золотая» середина между полным журналированием данных и предыдущим режимом. Официально в этом случае журналируются только метаданные, но блоки соответствующих им данных записываются первыми. В большинстве случаев такой режим гарантирует сохранность данных, особенно если данные дописывались в конец файла, чего в большинстве случаев предостаточно. Производительность, естественно, чуть ниже предыдущей и выше полного журналирования, которому отвечает режим. data=journal – в котором все новые данные сначала пишутся в журнал и только после этого переносятся на свое постоянное место. В случае аварийного отказа журнал можно повторно перечитать, приведя данные и метаданные в непротиворечивое состояние. Кстати, данный режим в случае, когда диск интенсивно загружен операциями IO, оказывается даже быстрее всех остальных. Выбранный режим, отличный от установленного по умолчанию, необходимо указать с помощью опции -o. Например: #mount
-o data=journal -t ext3 /dev/hda5
/usr/local
или в /etc/fstab: /dev/hda5 /usr/local
ext3
data=writeback
1 0
или если режим по умолчанию, то просто: /dev/hda5 /usr/local
ext3
defaults
1 0
21
администрирование Если же теперь хочется отказаться от него, то, исправив ext3 на ext2, можно забыть о журнале: /dev/hda5 /usr/local
ext2
defaults 1 0
Для того чтобы к обычной ext2fs добавить журнал, достаточно выполнить команду: # /sbin/tune2fs -j /dev/hdà5
причем можно даже файловую систему не размонтировать перед этим, так как гарантируется сохранность данных (но предварительная архивация данных никому еще не вредила). Для того чтобы изначально создать ext3 на пустом, только что созданном разделе диска, достаточно выполнить команду: # /sbin/mke2fs -j /dev/hdb5
Начиная с версии 0.9.5 ext3fs, можно использовать другой диск для хранения файла журнала. Подробности можно узнать по адресу http://www.zipworld.com.au/~akpm/linux/ ext3/ext3-usage.html. Вот и все о данной файловой системе. Что и говорить, это предсказуемая и главное – удобная файловая система. До недавнего времени добрая половина разделов жесткого диска на моем домашнем компьютере была отформатирована именно под ext3, но эксперименты с латентностью ядра при обработке музыки убедили, что пора с ней красиво расставаться (хотя доводилось слышать и полностью противоположное мнение). Плюс у нее есть еще недостаток, доставшийся по наследству, который практически полностью решен в другой файловой системе. Но интересно, что в дистрибутивах RedHat программа установки, несмотря на наличие стольких альтернатив, позволяет создать только ext2 и ext3, хотя ядро поддерживает JFS и RaiserFS. Что это – упорное продвижение своей файловой системы или нежелание идти в ногу с прогрессом?
ReiserFS Это первая «сторонняя» файловая система, появившаяся в официальном ядре, начиная с версии 2.4.4, но в первое время ее работа вызывала одни только нарекания, и поэтому использовали ее только любители острых ощущений. Данный проект начинался в 90-х годах, первый прототип носил название TreeFS. Разработана Хансом Райзером (Hans Reiser) и его компанией Namesys (http://www.namesys.com/), причем задачи они перед собой поставили очень, я бы сказал, революционные. Разработчики системы мечтают создать не только файловую систему, но вообще механизм иерархического именования объектов. Они считают, что лучшая файловая система та, которая формирует единую общедоступную среду, названную namespace. Для достижения этого файловая система должна выполнять часть работы, традиционно выполнявшуюся приложениями, что уменьшит количество несовместимых API узкоспециального назначения. При таком подходе пользователи часто могут продолжать пря-
22
мое использование файловой системы вместо формирования уровней специального назначения типа баз данных и т. п. Правда, надо отметить, что они не первые, еще при создании BeFS первоначально это было сделано, и с большим успехом, работа filesystem как базы данных, но в конечном счете вернулись назад к атрибутам и индексированному доступу. Некоторое движение в этом направлении сделано и в MacOS. При этом для добавления новых возможностей используется plugins. А вообще на сайте проекта наилучшая документация из всех рассматриваемых. Но предупреждаю, ее там много. Базируется файловая система на оптимизированных b* сбалансированных деревьях (одно на файловую систему), использование которых, кроме увеличения поизводительности, снимает ограничение на количество каталогов, хотите – 100 000, без проблем. Но текущая на данный момент версия 3.6 поддерживает журналирование только метаданных, хотя при необходимости полного журналирования можно использовать патч от Chris Mason и дополнительно в новой версии ReiserFS v.4 release, которая будет доступна вместе с ядром 2.6. Также будет задействован подобный режим. Главное преимущество данной файловой системы проявляется в работе с маленькими файлами. Как я уже говорил, информация на физическом носителе хранится не как попало, а отдельными блоками, размер которых зависит и от размера раздела (это связано с максимально возможной адресацией) в том числе (устанавливается при форматировании), в большинстве случаев используется 4 Кб. Так вот, еxt2 (и ext3, и FAT тоже) могут адресовать только целое количество блоков. Ну и что? Имеем файл 10 Кб, размер блока 4 Кб. Получается, что файл займет 2 целых блока и один только наполовину. 4 + 4 + 2 (и 2 осталось незанятыми, это и называется внутренней фрагментацией). Для единичного файла это нестрашно, но если их несколько тысяч? Кстати, Fast File System (FFS), применяемая в BSD, умеет адресовать субблоки, а во всеми любимой FAT придется мириться с неизбежной потерей места. Разработчики ReiserFS не стали решать множество противоречивых задач, а остановились на одной и довели ее до конца. ReiserFS может запросто упаковывать несколько маленьких файлов в один дисковый блок (tail packing), а совсем маленькие вообще просто запихать в inode (внутрь b*tree). По необходимости для файла может ассигноваться точный размер. Такой режим работы предусмотрен по умолчанию, но для повышения быстродействия есть возможность ее отключить. Хотя показатели ReiserFS при работе с большими файлами также высоки, именно работа с маленькими файлами (меньше Кб) и обслуживание большого их количества выделяет данную ФС. По работе с ними она превосходит по быстродействию все представленные файловые системы (видел цифры в 8-15 раз) и именно за счет того, что данные и метаданные хранятся рядом, и головке диска не придется рыскать по всему диску. Плюс, как видите, достигается значительная экономия дискового пространства. Различные источники называют ReiserFS самой устойчивой из всех рассматриваемых ФС, ее, я думаю, мож-
администрирование но рекомендовать для корневого раздела, который к тому же состоит из маленьких файлов. Такая себе рабочая лошадка. Но для работы с данной файловой системой, кроме поддержки ее самим ядром, необходимы также свои собственные утилиты для работы и обслуживания разделов, хотя они уже входят в стандартную поставку всех современных дистрибутивов, а если нет, то возьмите по адресу ftp://ftp.namesys.com/pub/ reiserfsprogs/reiserfsprogs-3.6.4.tar.gz. Патч к ядру для обновления версии ReiserFS можно взять с ftp://ftp.namesys.com/pub/reiserfs-for-2.4, рядом лежат патчи к ядрам версии 2.2. Если ядро уже поддерживает ReiserFS и имеются необходимые утилиты, то, набрав: # /sbin/mkreiserfs /dev/hda2
можно создать на ней соответствующую файловую систему. Для автоматического монтирования ее при загрузке достаточно прописать в файле /etc/fstab: /dev/hda4 /home
reiserfs
defaults
0 0
или #/sbin/mount -t
/reiserfs
dev/hda4 /home
при монтировании вручную. Если для увеличения производительности необходимо отключить упаковку хвостов, то добавьте опцию notail: /dev/hda4 /home
reiserfs
notail 0 0
А опция -genericread может увеличить (а может и нет) производительность при операциях поиска файлов, т.е. когда головка мало считывает, а много перемещается по диску. И, кстати, проект Reiser4, в котором не последнее место уделено security, поддерживается DARPA (Defense Advanced Research Projects Agency).
XFS Основа следующей файловой системы XFS была создана в начале 90-х (1992-1993) фирмой Silicon Grapgics (сейчас SGI) для мультимедийных компьютеров с ОС Irix, заменив уже не удовлетворявшую требованиям времени EFS, но немного очищенная от некоторого кода GPL версия 1.0 стала доступна только 1 мая 2001 года. Найти всю необходимую информацию можно по адресу: http://oss.sgi.com/projects/xfs. Интересно, что «любимица» всех линуксоидов, компания SCO, и здесь засветилась, назвав выход XFS под лицензией GPL «примером ярких работ нарушения авторских прав». Эта файловая система с самого начала была ориентирована на очень большие файлы (9 000 петабайт – 9 миллионов терабайт – 1018 байт) и файловые системы (18 000 петабайт ), это достигается тем, что она, в отличие от предыдущих, является полностью 64-битной, что позволяет адресовать большие массивы данных. Особенностью этой файловой системы является устройство журнала – в него пишется часть метаданных самой файло-
№11(12), ноябрь 2003
вой системы таким образом, что весь процесс восстановления сводится к копированию этих данных из журнала в файловую систему. Размер журнала задается при создании системы, он должен быть не меньше 32 Мб; а больше, наверное, и не надо – такое количество незакрытых транзакций тяжело получить. Тесты на производительность показывают бесспорное преимущество XFS, особенно при работе с большими и во многих случаях средними файлами. Также эту файловую систему характеризует прямолинейность падения производительности при увеличении нагрузки и предсказуемость, дополнительно она не генерирует излишнюю дисковую активность, т.к. пытается кэшировать как можно больше данных и «основанием» для сброса на диск является заполнение памяти, а не интервал времени, как это принято в других файловых системах (кроме, наверное, ReiserFS v4). Любое дисковое устройство при создании файловой системы XFS разбивается на несколько равных по размеру линейных областей (0.5-4 Гб), в терминологии XFS они именуются «allocation group». Уникальность allocation group в том, что каждая группа управляет своими собственными inodes и свободным местом, что превращает группы в своего рода автономные файловые системы, сосуществующие в рамках общей XFS. Такая организация позволяет эффективно организовать параллельную обработку операций ввода/вывода, которая особенно проявляется на многопроцессорных системах. В каждой такой группе используется три В+ дерева, два из которых отвечают за свободные inodes (allocation). В этой системе реализована очень хорошая возможность, позволяющая избежать фрагментации файлов, называемая delayed allocation. При этом файловая система, получая данные для записи, поначалу лишь резервирует под них необходимое свободное место, откладывая саму запись до момента фактического сброса данных. Когда же такой момент наступает, то XFS решает, куда необходимо их поместить. Если осуществляется дозапись, то подбираются соседние сектора. Но наибольший эффект в такой задержке получается еще за счет того, что, если создается временный файл с малым временем жизни, то он вообще при таком случае на диск не пишется (соответственно не приходится занимать/освобождать метаданные). Для борьбы с внешней фрагментацией (против которой борятся программы типа Norton Speed Disk) имеется утилита xfs_fsr. Текущим ядром серии 2.4.* данная файловая система не поддерживается (но уже имеется в тестовых ядрах 2.6), хотя в некоторых дистрибутивах (Gentoo, Lunar Linux) она уже предлагается пользователю, поэтому необходимо сходить на сайт разработчика за патчем (ftp://oss.sgi.com/ projects/xfs/download/) и необходимыми утилитами (как миниум xfsprogs) для работы с ней. Сейчас на сайте доступен релиз 1.3. Теперь, пересобрав ядро и установив необходимые утилиты, можно создать файловую систему: #/sbin/mkfs.xfs /dev/hdb2 èëè mkfs -t xfs /dev/hdb2
Для увеличения производительности в некоторых случаях может помочь опция -l size=32m, фиксирующая журнал на 32 Мб, и с помощью -d agcount=x лучше устано-
23
администрирование вить минимально возможное количество allocation groups (т.е. взяв максимально возможные 4 Гб на группу), например, при разделе 18 Гб устанавливаем: #/sbin/mkfs.xfs -d agcount=5 -l size=32m -f
/dev/hdb2
Необязательная опция -f позволяет создать XFS поверх любой существующей ФС, но при создании раздела поверх ReiserFS (и наоборот) необходимо заполнить нулями начальный раздел, содержащий метаданные перед переформатированием, т.к. команда mount может неправильно распознать, какая из файловых систем установлена.
нения маленьких файлов в пределах inode. Если каталог имеет до 8 файлов, то информация о них содержится внутри inode, при увеличении же их количества используются уже знакомые B+ деревья. Для уcтановки необходимы утилита jfsutils, патч к ядру jfs-2.4.х-patch и код файловой системы jfs-2.4-1.0.20.tar.gz, хотя вероятно, что поддержка данной файловой системы в ядре уже имеется. После установки и компиляции всех программ для создания раздела достаточно выполнить команду: # mkfs.jfs /dev/hdb3
и смонтировать ее: # dd if=/dev/zero of=/dev/hdb2 # mount -t jfs /dev/hdb3 /jfs
И прервать секунд через 10-20 комбинацией Ctr+C. Смонтировать вновь созданный раздел теперь можно командой:
Для возможности работы с внешним журналом необходимо создать два неиспользуемых раздела, например:
# mount -t xfs =/dev/hdb2 /home # mkfs.jfs -j /dev/hdb1 /dev/hda6 # mount -t jfs /dev/hda6 /jfs
или в файле /etc/fstab:
или в /etc/fstab: /dev/hdb2 /home
xfs
defaults
0 0 /dev/hda6 /jfs jfs defaults 1 2
Для повышения производительности можно задать некоторые опции noatime, nodiratime, osyncisdsync, вместе помогающие добиться асинхронного вывода информации, и практически имитировать поведение ext2, а также logbufs, устанавливающий размер буфера, имеющий значение по умолчанию, равное 2 (но, например, 8 при 128 Мб оперативной памяти устанавливать не стоит). /dev/hdb2 /home xfs noatime, nodiratime, ↵ osyncisdsync, logbufs=4 0 0
Еще в документе Linux XFS FAQ, доступном на сайте разработчика, сказано, что на данный момент загрузка с раздела XFS поддерживается полностью загрузчиком GRUB версий 0.92 и выше, LILO же позволяет загружаться только при установке в MBR (Master Boot Record), при установке в корневой раздел есть вероятность, что загрузиться не получится. В CVS доступны утилиты xfsdump и xfsrestore, позволяющие сохранить и при необходимости восстановить образ раздела диска. Остальную информацию посмотрите в каталоге /usr/src/linux/Documentation/ filesystems xfs.txt. Как установить XFS в корневой раздел, можно посмотреть в документе Linux+XFS-HOWTO (http://www.linuxdoc.org/HOWTO/Linux+XFS-HOWTO/).
JFS (Journaled File System) Создана фирмой IBM для своей OS/2 Warp, а затем выпущена по лицензии GPL и портирована под Linux. Всю необходимую информацию можно получить по адресу http://oss.software.ibm.com/jfs. По своим характеристикам и архитектуре очень схожа с предыдущей, поэтому подробно останавливаться на них не буду. Подобно предыдущей в этой файловой системе раздел логически подразделяется на «агрегаты», включающие, кроме данных, и отдельный журнал, и каждый из таких сегментов можно монтировать отдельно. Также имеется возможность хра-
24
Напоследок хочу отметить, что все описываемые файловые системы на данный момент поддерживают установку на Soft-RAID и LVM, при наложении соответствующих патчей возможно применение ACL. Как видите, ОС Linux предоставляет пользователю возможность выбрать даже файловую систему, оптимизированную под конкретные задачи. И самое главное, не обязательно, чтобы была установлена только одна из этих файловых систем. Но вот однозначно сказать, что такая файловая система намного лучше, я не могу. Как вы понимаете, все зависит от конкретной задачи, ведь приложения, которые используются на сервере, могут отличаться. Но для раздела /boot лучшим решением будет ext2, для корневого раздела, состоящего из мелких файлов – ReiserFS. Для сравнения приведу результат теста Linux: Benchmarking Filesystems In 2.6.0-test2, найденный мной на странице http://kerneltrap.org/node/view/715. Там же можно найти и мнения различных людей по поводу полученных результатов. При записи и копировании каталога (mozilla build tree) размером 295 Мб файловые системы показали такой результат, который, я думаю, в комментариях не нуждается.
Литература: Серия статей Advanced filesystem implementor’s guide Daniel Robbins: http://www-106.ibm.com/developerworks/ linux/library/l-fs1/, перевод которых можно найти на сайте http://www.softerra.ru/.
администрирование
АРХИТЕКТУРА ФАЙЛОВОЙ СИСТЕМЫ EXT2
В статье рассматривается логическая структура ext2 – файловой системы операционной системы Linux.
ВЛАДИМИР МЕШКОВ
26
администрирование Основные компоненты файловой системы ext2 Как и в любой файловой системе UNIX, в составе файловой системы ext2 можно выделить следующие составляющие: блоки и группы блоков; информационный узел (information node); суперблок (superblock).
Блоки и группы блоков Все пространство раздела диска разбивается на блоки фиксированного размера, кратные размеру сектора – 1024, 2048 и 4096 байт. Размер блока указывается при создании файловой системы на разделе жесткого диска. Меньший размер блока позволяет экономить место на жестком диске, но также ограничивает максимальный размер файловой системы. Все блоки имеют порядковые номера. С целью уменьшения фрагментации и количества перемещений головок жесткого диска при чтении больших массивов данных блоки объединяются в группы.
Информационный узел Базовым понятием файловой системы является информационный узел, information node, или inode. Это специальная структура, которая содержит информацию об атрибутах и физическом расположении файла. Атрибутами файла являются его тип (обычный файл, каталог и т. д.), права доступа к нему, идентификатор владельца, размер, время создания. Информация о физическом расположении представляет собой последовательность абсолютных номеров блоков, содержащих данные файла.
Суперблок Суперблок – основной элемент файловой системы ext2. Он содержит следующую информацию о файловой системе (список неполный): общее число блоков и inode в файловой системе; число свободных блоков и inode в файловой системе; размер блока файловой системы; количество блоков и inode в группе; размер inode; идентификатор файловой системы; номер первого блока данных. Другими словами, это номер блока, содержащего суперблок. Этот номер всегда равен 0, если размер блока файловой системы больше 1024 байт, и 1, если размер блока равен 1024 байт. От целостности суперблока напрямую зависит работоспособность файловой системы. Операционная система создает несколько резервных копий суперблока для возможности его восстановления в случае повреждения. Главная копия находится по смещению 1024 байт от начала раздела, на котором создана файловая система (первые 1024 байта зарезервированы для загрузчика операционной системы). Ранние версии файловой системы ext2 создавали копии суперблока в начале каждой группы блоков. Это приводило к большим потерям дискового пространства, поэтому позже количество резервных копий суперблока было уменьшено, и для их размещения были выделены группы блоков 0, 1, 3, 5 и 7.
Ðèñóíîê 1. Îáîáùåííàÿ ñòðóêòóðíàÿ ñõåìà ôàéëîâîé ñèñòåìû ext2
№11(12), ноябрь 2003
27
администрирование Формат группы блоков Обобщенная структурная схема файловой системы ext2 представлена на рис. 1. Практически все группы блоков имеют одинаковый формат. В каждой группе, помимо информационных блоков, хранится информация о занятости блоков и inode группы в виде битовой карты. В состав группы блоков 0 входят также суперблок и таблица дескрипторов групп, которую мы рассмотрим ниже. Битовая карта занятости блоков обычно расположена в первом блоке группы. Если в группе присутствует резервная копия суперблока, битовая карта располагается во втором блоке группы. Размер битовой карты – один блок. Каждый бит этой карты обозначает состояние блока. Если бит установлен (1), то блок занят, если сброшен (0) – блок свободен. Первому блоку группы соответствует нулевой бит карты, второму блоку – первый бит и т. д. Inode, находящиеся в пределах одной группы, собраны в таблицу. В битовой карте занятости inode группы каждый бит характеризует состояние элемента в таблице inode группы. Каждая группа блоков описывается при помощи дескриптора группы блоков. Дескриптор группы – это структура, которая содержит информацию об адресах битовой карты занятости блоков, битовой карты занятости inode и таблицы inode соответствующей группы. Все дескрипторы групп собраны в таблицу дескрипторов групп, которая хранится в группе блоков 0. Так же, как и для суперблока, операционная система создает резервные копии таблицы дескрипторов групп.
Алгоритм чтения файла Каждый inode, как и блок, имеет порядковый номер, уникальный в пределах файловой системы, и содержит информацию только об одном файле. Таким образом, для получения доступа к содержимому файла необходимо знать порядковый номер соответствующего ему inode. Как было сказано выше, информация о физическом расположении файла содержится в inode. Эта информация представляет собой последовательность 32-битных номеров блоков, содержащих данные файла (рис. 1). Первые 12 номеров – это прямые ссылки на информационные блоки (direct blocks number). 13-й номер является косвенной ссылкой (indirect blocks number). В нем находится адрес блока, в котором хранятся адреса информационных блоков. 14-й номер – двойная косвенная ссылка (double blocks number), 15-й номер – тройная косвенная ссылка (triple blocks number). Имя файла в состав inode не входит, установление соответствия между именами файлов и порядковыми номерами inode выполняется через каталоги.
Каталоги Файлы в UNIX- и POSIX-системах хранятся в древовидной иерархической файловой системе. Корень файловой системы – это корневой каталог, обозначенный символом «/». Каждый промежуточный узел в дереве файловой системы – это каталог. Конечные вершины дерева файловой системы являются либо пустыми каталога-
28
ми, либо файлами. Абсолютное путевое имя файла состоит из имен всех каталогов, ведущих к указанному файлу, начиная с корневого каталога. Так, путевое имя /home/ test.file означает, что файл test.file расположен в каталоге home, который, в свою очередь, находится в корневом каталоге «/». Каталог, так же как и файл, описывается при помощи inode. Содержимое каталога представляет собой массив записей, каждая из которых содержит информацию о файле, который находится «внутри» текущего каталога. Запись каталога имеет следующий формат: порядковый номер inode файла; длина записи в байтах; имя файла; длина имени файла. Поиск номера inode файла всегда начинается с корневого каталога. Например, чтобы получить порядковый номер inode файла, находящегося в корневом каталоге, операционная система должна получить содержимое корневого каталога, найти в нем запись с именем этого файла и извлечь из этой записи порядковый номер inode файла. Несколько первых номеров inode зарезервированы файловой системой, их перечень содержится в заголовочном файле <linux/ext2_fs.h>: /* * Special inode numbers */ #define EXT2_BAD_INO 1 /* Bad blocks inode */ #define EXT2_ROOT_IN 2 /* Root inode */ #define EXT2_ACL_IDX_IN 3 /* ACL inode */ #define EXT2_ACL_DATA_INO 4 /* ACL inode */ #define EXT2_BOOT_LOADER_INO 5 /* Boot loader inode */ #define EXT2_UNDEL_DIR_INO 6 /* Undelete directory inode */
Для записи корневого каталога зарезервирован inode под номером 2 (root inode). Этот inode находится в группе блоков 0 и занимает вторую позицию в таблице inode этой группы. Номер первого незарезервированного inode хранится в суперблоке. Определив порядковый номер inode файла, ядро вычисляет номер группы, в которой этот inode расположен, и его позицию в таблице inode группы. Считав из этой позиции inode, операционная система получает полную информацию о файле, включая адреса блоков, в которых хранится содержимое файла. Номер группы блоков, в которой расположен inode, вычисляется по формуле: group = (inode_num - 1) / inodes_per_group
где: group – искомый номер группы блоков; inode_num – порядковый номер inode, определяющего файл; inodes_per_group – число inode в группе (эта информация находится в суперблоке). Позиция inode в таблице inode группы определяется по формуле:
администрирование index = (inode_num - 1) % inodes_per_groupe
где index – позиция inode в таблице. Рассмотрим пример получения содержимого файла test.file, находящегося в корневом каталоге. Для чтения файла /test.file необходимо: в массиве записей корневого каталога найти запись об этом файле; извлечь порядковый номер inode файла, вычислить номер группы, в которой этот inode расположен; из дескриптора данной группы извлечь адрес таблицы inode группы; вычислить позицию inode в этой таблице; считать inode файла; из inode извлечь адреса информационных блоков и осуществить чтение информации, находящейся в этих блоках.
1. 2.
3. 4.
На рис. 2 подробно показаны этапы чтения файла /test.file. Этапы 1-6 – чтение корневого каталога: Из группы блоков 0 считывается таблица дескрипторов групп. Из таблицы дескрипторов групп извлекается дескриптор группы блоков 0 и из него считывается адрес таблицы inode группы 0. Из группы блоков 0 считывается таблица inode. Порядковый номер inode корневого каталога фиксирован и равен 2, поэтому из таблицы inode группы 0 считывается второй элемент, который содержит адрес блока с содержимым корневого каталога. Предположим, что этот блок расположен в группе блоков A.
5. Из группы блоков A считывается блок, содержащий записи корневого каталога. 6. Выполняется поиск записи с именем «test.file». Если такая запись найдена, из нее извлекается порядковый номер inode файла «test.file». Определив номер inode, можно получить доступ к информационным блокам файла (этапы 7-11): 7. Вычисляется номер группы, в которой находится данный inode, и его позицию в таблице inode группы (предположим, что номер группы равен B, а позиция в таблице – X). 8. Из таблицы дескрипторов групп извлекаем дескриптор группы блоков B, и из него считывается адрес таблицы inode этой группы блоков. 9. Из группы блоков B считывается таблица inode. 10. Из таблицы inode группы блоков B считывается inode, находящийся в позиции X. 11. Из считанного inode извлекаются адреса блока с содержимым файла /test.file и выполняется чтение информации из блока с указанным адресом.
Программная реализация алгоритма чтения файла Исходные данные: имеется раздел жесткого диска, на котором создана файловая система ext2. Этому разделу соответствует файл устройства /dev/hda3. В корневом каталоге раздела создан подкаталог home, а в нем находится файл test.file следующего содержания:  ÷àùàõ þãà æèë áû öèòðóñ? Äà, íî ôàëüøèâûé ýêçåìïëÿð! 1234567890-=
Ðèñóíîê 2. Ïîðÿäîê âûïîëíåíèÿ ïðîöåäóðû ÷òåíèÿ ôàéëà â ôàéëîâîé ñèñòåìå ext2 (íà ïðèìåðå ôàéëà /test.file)
№11(12), ноябрь 2003
29
администрирование Не подумайте плохого, это не бред, а тестовое упражнение из курса подготовки телеграфистов в войсках связи бывшего СССР! Внимание! Следует учесть один важный момент. Созданный файл не будет сразу записан на диск, а сначала попадет в дисковый буфер. Попытка сразу же получить содержимое файла по вышеприведенному алгоритму ни к чему не приведет, так как информация об этом файле физически на диске отсутствует. Необходимо «заставить» систему записать дисковый буфер на диск. Самый простой способ сделать это – выполнить операцию перезагрузки. Поэтому после того, как файл создан, перезагрузите систему. Наша задача – используя файл устройства /dev/hda3, осуществить чтение файла /home/test.file методом прямого доступа к его информационным блокам. Рассмотрим программную реализацию модуля, выполняющего эту операцию. Заголовочные файлы: #include #include #include #include #include #include
<stdio.h> <sys/types.h> <fcntl.h> <unistd.h> <errno.h> <linux/ext2_fs.h>
В заголовочном файле <linux/ext2_fs.h> определены структурные типы, описывающие основные компоненты файловой системы ext2 – суперблок, дескриптор группы блоков, информационный узел, запись каталога. Рассмотрим кратко поля, которые входят в каждую из этих структур: 1. Структура суперблока struct ext2_super_block: __u32 s_inodes_count – общее число inode в файловой системе; __u32 s_blocks_count – общее число блоков в файловой системе; __u32 s_free_blocks_count – количество свободных блоков; __u32 s_free_inodes_count – количество свободных inode; __u32 s_first_data_block – номер первого блока данных (номер блока, в котором находится суперблок); __u32 s_log_block_size – это значение используется для вычисления размера блока. Размер блока определяется по формуле: block size = 1024 << s_log_block_size; __u32 s_blocks_per_group – количество блоков в группе; __u32 s_inodes_per_group – количество inode в группе; __u16 s_magic – идентификатор файловой системы ext2 (сигнатура 0xEF53); __u16 s_inode_size – размер информационного узла (inode); __u32 s_first_ino – номер первого незарезервированного inode. 2. Структура дескриптора группы блоков struct ext2_group_desc: __u32 bg_block_bitmap – битовая карта занятости блоков группы; __u32 bg_inode_bitmap – битовая карта занятости inode группы;
30
__u32 bg_inode_table – адрес таблицы inode группы. 3. Структура информационного узла struct ext2_inode: __u16 i_mode – тип файла и права доступа к нему. Тип файла определяют биты 12-15 этого поля: 0xA000 – символическая ссылка; 0x8000 – обычный файл; 0x6000 – файл блочного устройства; 0x4000 – каталог; 0x2000 – файл символьного устройства; 0x1000 – канал FIFO. __u32 i_size – размер в байтах; __u32 i_atime – время последнего доступа к файлу; __u32 i_ctime – время создания файла; __u32 i_mtime – время последней модификации; __u32 i_blocks – количество блоков, занимаемых файлом; __u32 i_block[EXT2_N_BLOCKS] – адреса информационных блоков (включая все косвенные ссылки). Значение EXT2_N_BLOCKS определено в файле <linux/ext2_fs.h>: /* * Constants relative to the data blocks */ #define EXT2_NDIR_BLOCKS 12 #define EXT2_IND_BLOCK EXT2_NDIR_BLOCKS #define EXT2_DIND_BLOCK (EXT2_IND_BLOCK + 1) #define EXT2_TIND_BLOCK (EXT2_DIND_BLOCK + 1) #define EXT2_N_BLOCKS (EXT2_TIND_BLOCK + 1)
4. Структура записи каталога struct ext2_dir_entry_2: #define EXT2_NAME_LEN 255
__u32 inode – номер inode файла; __u16 rec_len – длина записи каталога; __u8 name_len – длина имени файла; char name[EXT2_NAME_LEN] – имя файла. Определим имя раздела, на котором создана файловая система, глобальные структуры и переменные. #define PART_NAME "/dev/hda3" struct ext2_super_block sb; /* áóôåð äëÿ õðàíåíèÿ òàáëèöû äåñêðèïòîðîâ ãðóïï */ unsigned char buff_grp[4096]; unsigned char buff[4096]; /* èíôîðìàöèîííûé áóôåð */ int indev; /* äåñêðèïòîð ôàéëà óñòðîéñòâà */ int BLKSIZE; /* ðàçìåð áëîêà ôàéëîâîé ñèñòåìû */
Определим несколько функций, которые нам понадобятся для работы: Функция чтения суперблока: void read_sb() { memset(&sb,0,1024);
Смещаемся на 1024 байта от начала раздела и считываем суперблок в структуру struct ext2_super_block sb: if(lseek(indev,1024,0) < 0) { perror("lseek"); exit(-1);
администрирование } if(read(indev,(char *)&sb,sizeof(sb)) < 0) { perror("read"); exit(-1); }
Из таблицы дескрипторов групп извлекаем дескриптор группы group и копируем его в структуру struct ext2_group_desc gd: memset((void *)&gd, 0, sizeof(gd)); memcpy((void *)&gd, buff_grp + (group * (sizeof(gd))), ↵ sizeof(gd));
Проверяем идентификатор файловой системы: if(sb.s_magic != EXT2_SUPER_MAGIC) { printf("Íåèçâåñòíûé òèï ôàéëîâîé ñèñòåìû!\n"); exit(-1); }
Вычисляем позицию inode c порядковым номером inode_num в таблице inode группы group и считываем этот inode в структуру struct ext2_inode:
Значение EXT2_SUPER_MAGIC определено в заголовочном файле <linux/ext2_fs.h>. Отображаем информацию о файловой системе, которая находится в суперблоке:
index = (inode_num - 1) % sb.s_inodes_per_group; pos = ((__u64)gd.bg_inode_table) * BLKSIZE + ↵ (index * sb.s_inode_size); pread64(indev, in, sb.s_inode_size, pos); return;
printf("\nSuperblock info\n-----------\n"); printf("Inodes count\t\t-\t%u\n",sb.s_inodes_count); printf("Blocks count\t\t-\t%u\n",sb.s_blocks_count); printf("Block size\t\t-\t%u\n",1024 << sb.s_log_block_size); printf("First inode\t\t-\t%d\n",sb.s_first_ino); printf("Magic\t\t\t-\t0x%X\n",sb.s_magic); printf("Inode size\t\t-\t%d\n",sb.s_inode_size); printf("Inodes per group\t-\t%u\n",sb.s_inodes_per_group); printf("Blosks per group\t-\t%u\n",sb.s_blocks_per_group); printf("First data block\t-\t%u\n\n",sb.s_first_data_block); return; }
Функция чтения таблицы дескрипторов групп:
}
Функция чтения блока данных: void read_iblock(struct ext2_inode *in, int blk_num) { __u64 pos;
Входные параметры функции – структура inode и номер блока (имеется в виду номер из последовательности адресных блоков, расположенных в inode). Вычисляем смещение к информационному блоку на разделе и считываем этот блок в глобальный буфер buff:
void read_gdt() {
pos = ((__u64)in->i_block[blk_num]) * BLKSIZE; pread64(indev, buff, BLKSIZE, pos);
Вычисляем размер блока файловой системы:
return; BLKSIZE = 1024 << sb.s_log_block_size
}
Функция получения содержимого корневого каталога: Таблица дескрипторов групп находится в блоке, который расположен сразу же за первым блоком данных (за суперблоком). Считываем таблицу: if(lseek(indev, (sb.s_first_data_block + 1) * BLKSIZE, 0) < 0) { perror("lseek"); exit(-1); } if(read(indev,buff_grp,BLKSIZE) < 0) { perror("read"); exit(-1); } return; }
Функция получения содержимого inode по его номеру: void get_inode(int inode_num, struct ext2_inode *in) {
Входные параметры функции – порядковый номер inode и структура struct ext2_inode. struct ext2_group_desc gd; __u64 group, index, pos;
Вычисляем номер группы блоков, в которой находится inode с порядковым номером inode_num: group = (inode_num - 1) / sb.s_inodes_per_group;
№11(12), ноябрь 2003
void get_root_dentry() { struct ext2_inode in;
Порядковый номер inode корневого каталога известен, поэтому получаем содержимое inode корневого каталога и считываем в буфер buff его содержимое: get_inode(EXT2_ROOT_INO, &in); read_iblock(&in, 0);
В буфере buff будет находиться содержимое корневого каталога. return; }
Функция получения номера inode по имени файла: int get_i_num(char *name) {
Входные параметры функции – имя файла. Возвращаемое значение – порядковый номер inode файла. int i = 0, rec_len = 0; struct ext2_dir_entry_2 dent;
В буфере buff находится массив записей каталога. Для определения порядкового номера inode файла необходи-
31
администрирование мо найти в этом массиве запись с именем этого файла: for(; i < 700; i++) { memcpy((void *)&dent, (buff + rec_len), sizeof(dent)); if(!memcmp(dent.name, name, dent.name_len)) break; rec_len += dent.rec_len; } return dent.inode; }
} } buff1[n] = '\0';
Для каждого элемента абсолютного путевого имени файла определяем порядковый номер inode, считываем этот inode в память и затем получаем содержимое нулевого блока: i_num = get_i_num(buff1); get_inode(i_num, &in); read_iblock(&in, 0);
А теперь распишем главную функцию: int main() {
Переменные и структуры:
Отобразим информацию о файле (имя, порядковый номер inode, размер файла и его тип):
struct ext2_inode in; // àáñîëþòíîå ïóòåâîå èìÿ ôàéëà unsigned char *full_path = "/home/test.file"; unsigned char buff1[EXT2_NAME_LEN]; static int i = 1; int n, i_num, outf, type;
printf("Inode number - %u\n", i_num); printf("File name - %s\n", buff1); printf("File size - %u\n",in.i_size);
Тип файла определяют старшие четыре бита поля i_mode структуры struct ext2_inode: type = ((in.i_mode & 0xF000) >> 12); printf("Type - %d ",type);
Первым символом в абсолютном путевом имени файла должен быть прямой слэш (/). Проверяем это:
switch(type) { case(0x04) : printf("(êàòàëîã)\n\n"); break; case(0x08) : printf("(îáû÷íûé ôàéë)\n\n"); break; case(0x06) : printf("(ôàéë áëî÷íîãî óñòðîéñòâà)\n\n"); break; case(0x02) : printf("(ôàéë ñèìâîëüíîãî óñòðîéñòâà)\n\n"); break; default: printf("(unknown type)\n"); break; }
if(full_path[0] != '/') { perror("slash"); exit(-1); }
Открываем файл устройства, считываем суперблок и таблицу дескрипторов групп: indev = open(PART_NAME,O_RDONLY); if(indev < 0) { perror("open"); exit(-1); } read_sb(); read_gdt();
Проверяем тип файла. Если это обычный файл – прерываем цикл:
Получаем содержимое корневого каталога: if(type & 0x08) { get_root_dentry();
Сейчас в буфере buff находятся все записи корневого каталога (если хотите, можете сохранить их в отдельном файле). Теперь, имея записи корневого каталога, мы можем добраться до содержимого файла test.file, используя вышеприведенный алгоритм чтения файла. С этой целью организуем цикл. В теле цикла проведем разбор абсолютного путевого имени файла, выделяя его элементы – подкаталоги (он у нас один, home) и имя искомого файла (test.file). Для каждого элемента определим порядковый номер inode, считаем этот inode и затем получим содержимое нулевого блока (из последовательности адресных блоков, находящихся в inode): while(1) { memset(buff1,0,sizeof(buff1)); for(n = 0 ; n < EXT2_NAME_LEN; n++, i++) { buff1[n] = full_path[i]; if((buff1[n] == '/') || (buff1[n] == '\0')) { i++; break;
32
В буфере buff будет находиться информация, считанная из информационных блоков файла /home/test.file. Запишем эту информацию в файл: outf = open("out",O_CREAT|O_RDWR,0600); write(outf, buff, sizeof(buff)); close(outf); break; } }
Выходим: close(indev); return 0; }
На этом рассмотрение логической структуры файловой системы ext2 завершим.
Ссылки: 1. http://www.nongnu.org/ext2-doc 2. http://e2fsprogs.sourceforge.net/ext2intro.html
bugtraq Sql-инъекция и неавторизованный доступ в Spaiz-Nuke и PHP-nuke Программа: Spaiz-Nuke версии <= 1.2beta, PHP-nuke все версии. Опасность: Высокая. Описание: Несколько уязвимостей обнаружено в Spaiz-Nuke и PHP-nuke. Удаленный пользователь может выполнить произвольный Sql-код на уязвимой системе. Удаленный пользователь может получить доступ к системе без пароля. Внедрение Sql-кода в модуле администрирования. Уязвимость обнаружена в сценарии auth.php в функции проверки логина и пароля. Атакующий может получить зашифрованный пароль администратора. Отсутствие проверки ввода обнаружено в переменной $aid, содержащей логин для авторизации. Используя кавычку, можно перенаправить вывод в произвольный файл на сервере. Эксплоит: www.site.com/admin.php?op=login&pwd=123&aid= Admin’%20INTO%20OUTFILE%20'/path_to_file/pwd.txt Проверялось только на Spaiz-Nuke. После ввода данной строки в браузере на уязвимом сервере будет создан файл /path_to_file/pwd.txt, содержащий зашифрованный пароль для логина «Admin». Решение: Включите magic_quotes_gpc в файле php.ini. Внедрение Sql-кода в модуле web_links. Отсутствие проверки ввода обнаружено в переменной $cid в модуле web-links. Атакующий может внедрить произвольный Sql-код. Эксплоит: показывает пример получения логинов и зашифрованных паролей администраторов движка. Работает на БД, поддерживающих команду UNION (mysql > 4). Для других БД необходимо изменять вид sql-запроса.
1. Для php-nuke Данная строка выдаст все логины: www.site.com/modules.php ?name=Web_Links&l_op=viewlink&cid=2%20UNION%20select% 20counter,%20aid,%20pwd%20FROM%20nuke_authors%20— Данная строка выдаст все зашифрованные пароли: www.site.com/modules.php?name=Web_Links&l_op= viewlink&cid=2%20UNION%20select%20counter,%20pwd, %20aid%20FROM%20nuke_authors%20—
2. Для Spaiz-Nuke Изменить nuke_authors в строке на spnuke_authors.
3. Внедрение Sql-кода в модуле download * Для PHP-nuke: www.site.com/modules.php?name=Downloads &d_op= viewdownload&cid=2%20UNION%20select%20counter, %20aid,%20pwd%20FROM%20nuke_authors%20— Для Spaiz-Nuke так же, как и в предыдущем случае.
4. Доступ без расшифровки пароля Пароли данного движка шифруются с помощью алгоритма md5, однако атакующий может получить доступ, даже не зная расшифрованного пароля. Сначала следует зашифровать полученные логин и зашифрованный md5-пароль с помощью алгоритма base64. Сделать это можно, например, здесь:http://www.isecurelabs.com/base64.php Шифруем этим алгоритмом следующую строку:
№11(12), ноябрь 2003
login:crypt_passwd:
где login=логин, crypt_passwd=зашифрованный пароль. Получаем хеш. Теперь можно получить доступ к панели администрирования, используя следующий URL: www.site.com/admin.php?admin=ваш_хэш Вручную использование данной уязвимости немного неудобно, поэтому был написан эксплоит, позволяющий добавить нового администратора со всеми правами. Посмотреть эксплоит можно здесь: http://rst.void.ru/download/r57nuke.txt URL производителя: http://www.php-nuke.org Решение: Способов устранения обнаруженной уязвимости не существует в настоящее время.
Удаленное переполнение буфера в Washington University FTP daemon (Wu-FTPd) Программа: Wu-FTPd version 2.6.2 (с поддержкой SKEY). Опасность: Высокая. Описание: Переполнение буфера обнаружено в Washington University FTP daemon (Wu-FTPd). Удаленный атакующий может выполнить произвольный код на уязвимом сервере с root-привилегиями. Переполнение стекового буфера обнаружено в коде, который обрабатывает SKEY-идентификацию в Wu-FTPdсервере. Представляя специально обработанные опознавательные мандаты, удаленный атакующий может аварийно завершить работу демона или выполнить произвольный код с root-привилегиями. Переполнение расположено в функции skey_challenge() в src/ftpd.c файле: char *skey_challenge(char *name, struct passwd *pwd, int pwok) $ { $ static char buf[128]; ... if (pwd == NULL || skeychallenge(&skey, pwd->pw_name, sbuf)) $ sprintf(buf, "Password required for %s.", name); else sprintf(buf, "%s %s for %s.", sbuf, pwok ? "allowed" : "required", name); return (buf); }
в коде не проверяются размеры параметра *name. Уязвимы системы, поддерживающие SKEY-идентификацию. URL производителя: http://www.wuftpd.org/ Решение: Отключите поддержку SKEY или примените следующий патч: % diff -u ftpd.c fixed-ftpd.c --- ftpd.c 2001-11-29 17:56:11.000000000 +0100 +++ fixed-ftpd.c 2003-10-20 20:43:58.000000000 +0200 @@ -1662,9 +1662,9 @@ /* Display s/key challenge where appropriate. */ if (pwd == NULL || skeychallenge(&skey, pwd->pw_name, sbuf)) - sprintf(buf, "Password required for %s.", name); + snprintf(buf, 128-1, "Password required for %s.", name); else - sprintf(buf, "%s %s for %s.", sbuf, + snprintf(buf, 128-1, "%s %s for %s.", sbuf, pwok ? "allowed" : "required", name); return (buf); } %
Cоставил Александр Антипов
33
администрирование
МАРК КРИЧМАР 34
администрирование О настройках самого сервера LDAP написано достаточно много, поэтому останавливаться на этом не буду. Интеграция службы каталогов с разными службами освещена тоже достаточно подробно, см., например: http:// www.linuxrsp.ru/artic/LDAP-HOWTO.html. В этой статье я не нашел, как подружить proxy-сервер SQUID с вышеозначенной службой, это и сподвигло меня на сей труд, не судите строго. В данный момент подобная конфигурация работает на платформе Dell PowerEdge 2500, операционная система Linux RHAS release 2.1 (Pensacola). Тестировалось на различных версиях RH Linux, на других дистрибутивах *NIX-like систем не пробовал, но затруднений возникнуть не должно. Итак, начнем. Задача достаточно проста – заставить SQUID не только авторизовать пользователей, но и забыть, наконец, об acl-листах, в которых описаны группы. Согласитесь, приятней добавить пользователя в определенную группу LDAP и все, а пользователь получает почтовый ящик и доступ в Интернет через proxy-сервер. Причем ничего не надо перезапускать. Первым делом скачиваем свежую версию SQUID, я рассматриваю на примере SQUID-2.5.STABLE2.tar.gz. Распаковываем: tar zxvf SQUID-2.5.STABLE2.tar.gz
Переходим в созданный каталог с исходниками proxyсервера и начинаем собирать: ./configure --enable-delay-pools ↵ --enable-cache-err-language=Russian-1251 ↵ --enable-linux-netfilter ↵ --enable-external-acl-helper=ldap_group ↵ --enable-basic-auth-helpers=LDAP
Небольшое пояснение, обо всех параметрах запуска смысла писать нет, достаточно понятно, а вот два последних нам как раз и нужны для интеграции с LDAP-сервером. Последний ключ --enable-basic-auth-helpers=LDAP, собственно, и указывает кэширующему серверу SQUID, что проверку пары логин-пароль на предмет правильности он поручает внешней программе. Ключ --enable-external-acl-helper=ldap_group необходим, чтобы группы в LDAP соотносились с группами в понимании SQUID. Далее, следуя INSTALL: make all make install
Копируем 2 файла: cp helpers/basic_auth/LDAP/squid_ldap_auth ↵ /usr/local/squid/libexec cp helpers/external_acl/ldap_group/squid_ldap_group ↵ /usr/local/squid/libexec
Переходим во вновь созданное дерево кэширующего сервера SQUID, в моем случае /usr/local/squid/sbin: cd /usr/local/squid/sbin
Создаем кэш:
№11(12), ноябрь 2003
./squid –z
Теперь необходимо внести изменения в конфигурационный файл SQUID. Следующая строчка заставляет кэширующий сервер доверять авторизацию внешней программе. auth_param basic program ↵ /usr/local/squid/libexec/squid_ldap_auth –P ↵ –b dc=mydomain,dc=ru ↵ –f (&(uid=%s)(description=active)) –h 127.0.0.1
Понятно, что всё пишется на одной строке. Другие auth_param нужно закомментировать. Теперь пояснения по поводу параметров: -P – оставлять соединение с LDAP-сервером открытым, для большого числа пользователей, для малого числа, LDAP смысла поднимать нет; -b – с чего начинать поиск, в моем случае – с самого верха; -f – применить (&(uid=%s)(description=active)) данный фильтр, для проверки пары логин-пароль. В жизни приходится сталкиваться с тем, что необходимо лишить пользователя доступа к Интернету, но не удалять же из-за этого его запись, тем более, мы не запрещаем ему пользоваться почтой, которая тоже работает через LDAP. Поэтому я и использовал поле description в LDAP для своих нужд.
Небольшое пояснение по поводу пары логин-пароль, это, как вы уже догадались, два поля в LDAP: uid и userpassword, логин и пароль соответственно. Вернемся к полю description, если в нем находится строчка active и логин-пароль совпадают, то все чудесно, если в этом поле пусто или что-то другое, то извиняйте, доступ через SQUID-сервер невозможен. Фактически мы заставляем проверять на истинность не два параметра – логин и пароль, а три. Кстати, ничто не мешает таким же образом вставить в фильтр еще значения, я не представляю зачем, но жизнь многогранна, кто знает, кому что понадобится. И последний параметр -h 127.0.0.1, где, собственно, запущен LDAP-сервер, в данном случае на одной машине с кэширующим сервером. Следующая строчка в файле squid.conf настраивает кэширующий сервер на поддержку внешних групп, так называемых acl-листов. external_acl_type ldap_group %LOGIN ↵ /usr/local/squid/libexec/squid_ldap_group –P ↵ –b dc=mydomain,dc=ru ↵ –f (&(uid=%v)(member=ou=%a,dc=mydomain,dc=ru)) ↵ –h 127.0.0.1 –p 389
Опять же все на одной строке. Ключи -P, -b и -f, -h имеют те же значения, что и выше. Ключ -p – порт, который слушает LDAP-сервер, этот параметр можно опустить, если используется стандартный порт. По поводу параметров фильтра требуется специальное пояснение, каждая запись пользователя, кроме всего прочего, должна быть членом класса groupOfNames, в
35
администрирование этом случае у каждого пользователя появляется обязательное поле member. Пример ldif-файла для создания пользователя, группы я приведу в конце. Ну и наконец, описываю сами группы, механизм тот же самый, что и при стандартном описании, сравним: Старое: acl users proxy_auth dima petya vasya authenticate_program /usr/local/squid/bin/ncsa_auth ↵ /usr/local/squid/etc/passwd
Новое: acl users external ldap_group accounts acl admin external ldap_group admin acl icq_only external ldap_group icq
Далее все как обычно: http_access allow admin
и так далее. Описание стандартных настроек кэширующего сервера выходит за рамки данной статьи, предполагается, что вы уже знакомы с ними. А теперь поподробнее о настройке LDAP-сервера. Конфигурационный файл должен иметь такое содержание: # include include include include #Ýòà ñõåìà include
/usr/local/etc/openldap/schema/core.schema /usr/local/etc/openldap/schema/cosine.schema /usr/local/etc/openldap/schema/inetorgperson.schema /usr/local/etc/openldap/schema/nis.schema äëÿ ïîääåðæêè qmail /usr/local/etc/openldap/schema/qmail.schema
pidfile argsfile
/usr/local/var/slapd.pid /usr/local/var/slapd.args
# ïîëå userPassword ëåæèò ïàðîëü ïîëüçîâàòåëÿ. Åãî ìîæåò #ïðî÷èòàòü è èçìåíèòü òîëüêî ñàì ïîëüçîâàòåëü, íó è ñåáÿ #ëþáèìîãî íå çàáûë. access to attr=userPassword by self write by anonymous auth by dn="cn=Manager,dc=mydomain,dc=ru" write by * none #Åñëè â ýòîì ïîëå active – Èíòåðíåò åñòü, èíà÷å – íåò access to attr=description by self read by anonymous read by dn="cn=Manager,dc= mydomain,dc=ru" write by * none #Íà îäíîé ñòðî÷êå access to attr=title,ou,telephoneNumber,cn,sn,givenName,o, ↵ initials,physicalDeliveryOfficeName,destinationIndicator by self write by anonymous read by users read by dn="cn=Manager,dc= mydomain,dc=ru" write access to * by self read by anonymous read by users read by dn="cn=Manager,dc= mydomain,dc=ru" write database suffix rootdn rootpw
ldbm "dc= mydomain,dc=ru" "cn=Manager,dc= mydomain,dc=ru" secret
Затем создаем файл example.ldif с описанием корневого дерева и групп пользователей, например, такого содержания: #Êîðåíü íàøåãî äåðåâà äèðåêòîðèé dn: dc=mydomain,dc=ru objectClass: top #Ãðóïïà àäìèíîâ dn: ou=admin,dc=mydomain,dc=ru objectClass: top objectClass: organizationalUnit ou: admin #Ãðóïïà äëÿ ïîëüçîâàòåëåé icq dn: ou=icq,dc=mydomain,dc=ru objectClass: top objectClass: organizationalUnit ou: icq #Ãðóïïà äëÿ ïðîñòûõ ïîëüçîâàòåëåé dn: ou=accounts,dc=mydomain,dc=ru objectClass: top objectClass: organizationalUnit ou: accounts #Äîáàâëÿåì 1 ïîëüçîâàòåëÿ â ãðóïïó admin dn: uid=boss,ou=admin,dc=mydomain,dc=ru objectClass: top objectClass: person objectClass: organizationalPerson objectClass: inetOrgPerson #Ýòî äëÿ Qmail objectClass: qmailUser #Îáÿçàòåëüíûé êëàññ, ÷òîáû ïîÿâèëîñü ïîëå member objectClass: groupOfNames #Åñëè active òî âñå ïó÷êîì:) description: active #Ñþäà ÿ çàáèâàþ âðåìÿ ñîçäàíèÿ äàííîé çàïèñè, íà âñÿêèé ñëó÷àé destinationIndicator: 01.02.03 #Çäåñü ÿ óêàçûâàþ ëèìèò â áàéòàõ, êîòîðûé óñòàíîâëåí #äëÿ äàííîãî ïîëüçîâàòåëÿ preferredLanguage: 50000000 #Ýòî ïîëå òîëüêî äëÿ Qmail accountStatus: active #Èìåííî ïî ýòîìó ïîëþ ïðîâåðÿåòñÿ ïðèíàäëåæíîñòü #ïîëüçîâàòåëÿ ê ãðóïïå member: ou=admin,dc=mydomain,dc=ru sn:: 0J/Rg9GC0LjQvQ== cn:: 0J/Rg9GC0LjQvSDQktC70LDQtNC40LzQuNGAINCS0LvQsNC00L ↵ jQvNC40YDQvtCy0LjRhw== userPassword: 123 telephoneNumber: 111-11-11 title:: 0J/RgNC10LfQuNC00LXQvdGC ou:: 0JzQvtGB0LrQstCwINC60YDQtdC80LvRjA== givenName:: 0JLQu9Cw0LTQuNC80LjRgA== initials:: 0JLQu9Cw0LTQuNC80LjRgNC+0LLQuNGH mail: boss@mydomain.ru uid: boss #Ýòî ïîëå òîëüêî äëÿ Qmail mailMessageStore: /var/qmail/maildirs/boss #Ýòî ïîëå òîëüêî äëÿ Qmail mailHost: mailhost.boss.ru #Äîáàâëÿåì 1 ïîëüçîâàòåëÿ â ãðóïïó icq dn: uid=icq_user,ou=icq,dc=mydomain,dc=ru objectClass: top objectClass: person objectClass: organizationalPerson objectClass: inetOrgPerson objectClass: groupOfNames description: active member: ou=icq,dc=mydomain,dc=ru sn: Sidoriv cn: Sidorov Fedor Petrovich userPassword: 321 telephoneNumber: 999-99-99 title: Doctor ou: Departament givenName: Fedor initials: Petrovich mail: icq_user@mydomain.ru uid: icq_user #Äîáàâëÿåì 1 ïîëüçîâàòåëÿ â ãðóïïó accounts
36
администрирование dn: uid=Ivan,ou=accounts,dc=mydomain,dc=ru objectClass: top objectClass: person objectClass: organizationalPerson objectClass: inetOrgPerson objectClass: groupOfNames description: active member: ou=icq,dc=mydomain,dc=ru sn: Ivanov cn: Ivanov Ivan Ivanovich userPassword: 333 telephoneNumber: 999-99-99 title: Doctor ou: Departament givenName: Ivan initials: Ivanovich mail: Ivan@mydomain.ru uid: Ivan
Запись для первого поля почти реальная, форма, а не содержание. Последние две записи несколько аскетичные, если вам не нужна ни адресная книга, ни поддержка QMail, то это как раз необходимый минимум. Небольшое пояснение. Поля sn, cn и др. заполнены русским текстом в формате utf8. Ничего не имею против английского, но некоторые пользователи жалуются. К тому же появляется адресная книга вашей фирмы, не советую пользоваться адресной книгой в Outlook Express, на редкость неудобная реализация. Я пользуюсь той, что идет в пакете Mozilla, но это дело вкуса.
№11(12), ноябрь 2003
Теперь пора добавить наши данные. В случае работающего OpenLDAP: /path/ldapadd –x –D “cn=Manager,dc=mydomain,dc=ru” –W ↵ –f /path/example.ldif
/path/ – реальное местоположение утилиты ldapadd и файла example.ldif. В заключение хочется добавить, что лень и нехватка времени заставили меня написать некоторое количество скриптов, в основном на Perl, которые проверяют и расходование трафика пользователями и блокировки доступа в Интернет с посылкой уведомления по почте. Мои пользователи через веб-интерфейс правят свои учетные записи на предмет рабочих телефонов, места работы, смены пароля – это реализовано на PHP. Этим я хочу сказать, что трудностей с созданием ваших программ для манипулирования LDAP быть не должно. Для создания записей в OpenLDAP я пользуюсь GQ-0.6.0: http://biot.com/gq/. Вот, собственно, и всё. Удачи! Благодарность Henrik Nordstrom hno@squid-cache.org за то, что написал модуль squid_ldap_group и объяснил мне, как им пользоваться.
37
администрирование
ИСПОЛЬЗОВАНИЕ БЕЗДИСКОВЫХ МАРШРУТИЗАТОРОВ
Настоящая статья не описывает сборку, инсталляцию и настройку бездисковых станций, идет рассмотрение только в общих чертах. Цель – показать читателям, как это выглядит и применяется на практике.
АНДРЕЙ МОЗГОВОЙ 38
администрирование Структура сети и роль бездисковых станций
Так уж вышло, что физическое месторасположение мостов (bridge) [1] не самое удачное. Вдобавок с электропитанием перебои. Компьютеры не самые мощные PI-200 МГц, DIMM – 32 Мб, но это не мешает им обслуживать 4 сети по 100 Мб/с и одну по 10 Мб/с. Могли бы все быть по 100 Мб/с, просто PCI-слотов не хватает. В дальнейшем разговор будет идти о bridge и сетях, которые выделены в серую рамку. А вот и фото из технического коридора:
Как видите, материнская плата и блок питания легко поместились в обычном электрощите. Главное – сообразить, как все правильно разместить. Блок питания лучше размещать сверху, тогда нагретый им воздух не будет повышать температуру процессора. А этот факт может о себе напомнить в жаркие летние деньки. Аккуратно зафиксируйте кнопки Вкл/Выкл, Питания и RESET. Они могут вам понадобиться в первые дни настройки. Опора для сетевых карт взята прямо из старенького корпуса формата AT. Видеокарты нет. Это не принципиальное решение. Просто нет у меня такого маленького мониторчика, который с легкостью можно взять с собой в технический коридор. Вместо видеокарты использую последовательный порт (com port). Это очень удобно, можно просто прийти с ноутбуком и решить любые проблемы. Главное – собрать ядро с опцией Character devices → Support for console on serial port (CONFIG_SERIAL_CONSOLE=y), указать соответствующие опции при загрузке ядра (console=ttyS1) [2] и добавить строчку в /etc/inittab (s1:12345:respawn:/sbin/ agetty -L ttyS0 9600 vt100).
Как же загружается и настроена бездисковая станция? В этом разделе bridge будем называть клиентов, а router, с которого загружается bridge, – сервером. Все, что требуется от клиента, – это послать запрос по сети, получить настройки, скачать образ и передать управления на него. На стареньких компьютерах редко встречаются интегрированные сетевые интерфейсы с возможностью загрузки по сети. Приходится использовать сетевые кар-
№11(12), ноябрь 2003
39
администрирование ############# # dhcpd.conf # # For diskless station. allow booting; allow bootp; # option definitions common to all supported networks... option domain-name "my-domain.ru"; option domain-name-servers ns.my-domain.ru, ns1.my-domain.ru; #ddns-update-style none; default-lease-time 600; max-lease-time 7200; subnet 192.168.0.0 netmask 255.255.255.0 { option routers 192.168.0.1; option subnet-mask 255.255.255.0; option broadcast-address 192.168.0.255; option dhcp-client-identifier "PXEClient"; next-server 192.168.0.1; filename "pxelinux.0"; host bridge { hardware ethernet 00:00:00:00:00:00; fixed-address 192.168.0.2; } }
Кратко прокомментирую самое главное. Клиент получит IP-адрес (fixed-address 192.168.0.2), соответствующий MAC-адресу (hardware ethernet 00:00:00:00:00:00). Адрес TFTP-сервера и имя образа он узнает из параметров nextserver 192.168.0.1 и filename «pxelinux.0» соответственно. Запускаем DHCPD, на первый раз можно с опциями «-d -f», чтобы увидеть запросы клиента и как на них реагирует DHCPD. Включите клиента, он пошлет запросы, получит настройки, выведет их на экран (конечно, не обязательно, но вы поймете, что клиент получил либо не получил их, тем более комментарий к происходящему выведет DHCPD). ты с BOOTROM (энергонезависимая память с прошивкой, осуществляющей загрузку). Давно, еще на стареньких NE2000, появилась возможность установки и использования этих самых BOOTROM. Только в наше время это дело выбора. Можно найти сетевую карту со слотом для ПЗУ, докупить саму ПЗУ, сделать прошивку, необходимую вам, и наслаждаться проделанной работой. А можно сразу купить сетевую карту, поддерживающую загрузку по сети. Сейчас распространены прошивки Intel PXE, лучше остановиться на версии v2.x. У автора как раз завалялось несколько таких карточек, а именно 3Com905C-TX-M. Устанавливаем, входим в BIOS сетевой карты, настраиваем, чтобы загружалась по сети. Все, на этом настройка клиента заканчивается. Но что, если у вас нет под рукой такого 3Com, но нашлась какаянибудь другая карта с уже установленным ПЗУ. Вам помогут либо etherboot, либо netboot [3]. Клиент настроен, включен и рассылает запросы по сети, ожидая ответа от DHCP-сервера в виде сетевых настроек и TFTP-сервера, с которого необходимо забрать образ.
Сервер На сервере должны быть остановлны DHCPD [4], TFPD и пакет SYSLINUX [5]. Как я уже говорил (см. выше), сначала DHCPD должен отдать сетевые настройки, следовательно, настраиваем его в первую очередь. Вот примерное содержание конфигурационного файла:
40
администрирование
№11(12), ноябрь 2003
41
администрирование Второй шаг. Настройка TFTP TFTP-сервер поставляется в комплекте практически с любым дистрибутивом. Скорее всего и в вашем Linux он уже установлен. Автор не стал запускать TFTP под наблюдением INETD (именно в моем случае это просто излишне, для себя решайте сами). Вся настройка сервиса (если без INETD) укладывается в указание нужных параметров при запуске [6].
дистрибутива ядро скачивает с TFTP-сервера согласно параметрам (см. конфигурационный файл).
Безопасность Используйте firewall, дабы прикрыть новые сервисы. Можно ограничить доступ к ним только из одной сети, но iptables позволяет ограничить доступ даже по MAC-адресам. Для DHCPD укажите сетевой интерфейс, который будет обслуживаться этим сервисом.
/usr/sbin/in.tftpd -l -v -s /tftpboot/
Заключение В директорию /tftpboot/ (у меня это линк на /usr/local/ tftpboot/) копируем бинарник pxelinux.0 из пакета SYSLINUX. Это все, что понадобится нам из этого пакета. Конфигурационные файлы для PXELINUX хранятся в корне TFTPсервера в каталоге «pxelinux.cfg». Чтобы клиент легко разобрался, какой конфигурационный файл предназначен именно ему, файлы соответствуют IP-адресам клиентов, но в шестнадцатеричном представлении. Так, для нашего клиента, имеющего IP-адрес 192.168.0.2, конфигурационный файл для pxelinux.0 должен находиться по следующему адресу: /tftpboot/pxelinux.cfg/C0A80002
Как вы думаете, как будет выглядеть конфигурационный файл для 192.168.0.0/24? Правильно – «C0A8». Вот мой конфигурационный файл: default /kernels/test/bzImage initrd=/images/initrd.br ↵ load_ramdisk=1 prompt_ramdisk=0 ramdisk_size=16384 ↵ rw root=/dev/ram0 console=ttyS0 prompt 1 display /images/default.txt F1 /images/help.txt timeout 50 label linux kernel /kernels/bare.i/bzImage append label bare.i kernel /kernels/bare.i/bzImage append initrd=/images/initrd.br load_ramdisk=1 ↵ prompt_ramdisk=0 ramdisk_size=8192 ↵ rw root=/dev/ram SLACK_KERNEL=bare.i
Примечание. Убедительная просьба – прочтите документацию по настройке PXELINUX. PXELINUX обладает широкими возможностями, с его помощью вы можете загрузить любую операционную систему и даже восстанавливать ее после краха. Если внимательно разобрать конфигурационный файл, вы поймете, что ядра Linux и сами образы системы хранятся в разных директориях (автору так удобнее). Собрать ядро для бездисковой станции проблем не составит. Прочтите HOWTO на тему Diskless и Kernel [7]. Главное, включите поддержку ram-дисков и ext2. От NFSROOT автор отказался наотрез, ну не нужен он там. Лучше собрать свой маленький дистрибутив или воспользоваться каким-нибудь однодискетным. Автор собрал таковой в стиле Slackware, основанный на BusyBox [8]. Образ
42
Не бойтесь экспериментировать. Собрать и настроить такой bridge несложно, зато практическая польза – все 100%. К тому же, настроив одну станцию и собрав один маленький дистрибутив, вам наверняка захочется сменить еще парочку маршрутизаторов на бездисковые.
Ссылки: [1]Что такое bridge и чем он отличается от router, должен знать каждый системный администратор. К тому же, как настроить bridge, описывалось в статье Заклякова П. Разводной мост на Linux (Bridging Firewalls). – //Журнал «Системный администратор» №4(5), апрель 2003 г. – 42-54 с. Хотя лично у меня есть небольшие расхождения в реализации. В основном они сводятся к упрощению. Например, вместо того чтобы патчить ядро, можно просто использовать последнюю версию оного. Сначала прочтите Bridge+Firewall-HOWTO, вы сами все поймете. Вот несколько ссылок, которые помогут вам до конца разобраться: http://bridge.sourceforge.net/ http://www.linux.org/docs/ldp/howto/Bridge/index.html http://www.linux.org/docs/ldp/howto/Bridge+Firewall.html http://www.linux.org/docs/ldp/howto/BRIDGE-STPHOWTO/index.html http://www.ibiblio.org/ [2]По всем параметрам, которые можно задать ядру через командную строчку, есть хороший man – man 7 bootparam. [3]Подробнее о etherboot и о netboot можно узнать, найдя эти проекты на http://www.sf.net [4]Homesite dhcpd: http://www.isc.org/products/DHCP/ [5]Homesite syslinux: http://syslinux.zytor.com/index.php [6]man in.tftpd [7]http://www.ibiblio.org/pub/Linux/docs/HOWTO/DisklessHOWTO http://www.ibiblio.org/pub/Linux/docs/HOWTO/KernelHOWTO [8]BusyBox представляет собой «набор» основных утилит Linux, только они специально несколько упрощены. Все равно очень удобно. Очень удачно описана сборка дистрибутива в статье «Создание загрузочных дискет и CD-дисков Linux» Всеволода Стахова, которая была опубликована в журнале «Системный администратор» №6(7), июнь 2003 г. – 44-51 с.
администрирование
АУДИТ УЧЕТНЫХ ЗАПИСЕЙ ПОЛЬЗОВАТЕЛЕЙ В ACTIVE DIRECTORY
МАКСИМ КОСТЫШИН 44
администрирование Поводом для появления данной статьи послужила информация, опубликованная в журнале «Windows & .Net Magazine/RE» №5 за 2003 год под названием «Утилита LDIF Directory Exchange», подсказавшая решения, которые можно было использовать для того, чтобы обеспечить необходимый уровень автоматизации при проведении аудита учетных записей пользователей в Active Dircectory. В статье было приведено описание основных возможностей двух утилит Ldifde.exe и Csvde.exe, обеспечивающих добавление, изменение и удаление объектов Active Directory. Информация, изложенная ниже, ориентирована на использование Windows-платформ и предназначена в основном для людей, отвечающих за вопросы компьютерной безопасности аудиторов, специализирующихся в данной области. Надеемся, что статья будет полезна и людям, профессионально занимающимся администрированием локальных сетей.
разделение, выяснить, как с ним можно связаться (конечно же, речь здесь не идет о стандартных учетных записях типа «Администратор», «Administrator», «Guest», «Гость», и другие). И в-третьих, выполнение требований политики безопасности предприятия подразумевает, что усилия и администраторов, и пользователей должны быть направлены на то, чтобы учетная запись использовалась только ее владельцем. То есть, если протокол выполнения операций работы с какой-либо из программ показал, что пользователь вошел под учетной записью Иванова Ивана Ивановича, то абсолютно нерационально будет тратить время на дополнительные разборки с ситуациями, когда выясняется, что учетной записью пользуются (из-за недостаточных знаний компьютера или обычной лени) все сотрудники отдела, в котором трудятся пять человек.
Постановка проблемных вопросов
Попробуем перечислить те возможности, которые есть под руками у администратора для работы с учетными записями пользователей в Active Directory, и то, насколько они могут быть использованы для проведения аудита. Оснастка Active Directory – пользователи и компьютеры (которую можно найти в разделе «Администрирование» на сервере). Замечательная возможность для добавления, редактирования свойств и удаления пользователей домена, но, к сожалению, достаточно бесполезная в вопросах проведения ревизии и аудита. К положительным моментам можно отнести возможность проведения экспорта списка пользователей, в который можно включить такие поля, как – «имя входа пользователя», «имя», «выводимое имя», «фамилия», «изменен». Отметим, что поле «изменен» показывает время и дату последних изменений для учетной записи администратором (производилась коррекция настроек) или владельцем (смена пароля). Системная утилита Net.exe. С помощью этой утилиты вы можете обеспечить работу с данными конкретного пользователя (вариант вызова – «Net user») – получить дату и время последней регистрации в сети, а также определить, когда завершается срок действия пароля. Программы-сканеры, задача которых заключается в сборе информации о состоянии локальной сети или конкретного компьютера. Среди наиболее интересных программ в плане получения информации о пользователях отметим CFI LANguard Network Security Scanner (ver 3.1.5). Она предоставляет возможность получения достаточно подробной информации об учетных записях, такой как дата и время последней регистрации; данные о том, когда пароль будет просрочен; количество регистраций пользователя в сети; значение индекса попыток входа с некорректным паролем. Кроме того, программа позволяет на основании данных двух сохраненных протоколов сканирования сформировать отчет о расхождениях и получить перечень заведенных и удаленных учетных записей. Справедливости ради отметим, что программа имеет существенные недостатки, особенно для русскоязычной категории пользователей, так как она некорректно обрабатывает русские названия (в именах и допол-
В определенный момент времени наступает то критическое состояние для списка пользователей локальной сети предприятия, когда нежелание остановиться и провести анализ его содержимого может повлечь большие затраты и проблемы, нежели своевременное проведение работ по аудиту и устранению выявленных недостатков. О чем идет речь? В организациях, где число сотрудников, работающих с компьютерной техникой, превышает 100 человек, администрированием занимаются, как правило, два-три сотрудника. Не все они, в силу различных обстоятельств, с достаточным педантизмом относятся к работе по внесению во вновь создаваемые учетные записи информации о владельцах. Кроме того, администраторы обычно не включены в список тех сотрудников, которым обязаны сообщать об увольнениях. Два этих обстоятельства являются основными причинами, из-за которых и происходит накопление учетных записей «мертвых душ». Попробуем провести некоторую систематизацию наиболее значимых и очевидных проблем для списка пользователей Active Directory. Во-первых, лишние записи в списке пользователей, которые могут быть: учетными записями уволенных сотрудников; учетными записями работающих сотрудников, которыми не пользуются и владельцы которых уже вряд ли помнят имена для входа в сеть (не говоря уже о паролях); учетными записями заблокированных пользователей, для которых администратор выполнил первый шаг перед удалением, но так и не закончил процедуру; учетными записями, созданными для тестирования, которые обычно имеют достаточно высокие привилегии, и которые администратор забыл удалить, после того как процесс тестирования был завершен. Во-вторых, к недопустимым можно отнести те учетные записи, которые однозначно не идентифицируют владельца, т.е. дополнительная информация в которых не позволяет назвать человека, определить его должность и под-
№11(12), ноябрь 2003
Обзор возможностей по работе с учетными записями
45
администрирование нительных параметрах учетных записей и пр.). Кроме того, отсутствует возможность сохранить в отдельном файле информацию о найденных расхождениях в списках учетных записей. Перейдем теперь к рассмотрению утилит, которые, на наш взгляд, предоставляют возможность получения наиболее полной информации по пользователям – Ldifde.exe и Csvde.exe. Первая утилита позволяет экспортировать данные из Active Directory в файл формата LDIF. Стандарт файла LDIF определен в рекомендациях RFC-2849 для импорта и экспорта данных из каталогов LDAP, таких как Active Directory. После экспорта данных можно использовать LDIF-файл для импорта тех же объектов в другой каталог LDAP. Csvde.exe – утилита, аналогичная Ldifde.exe (параметры вызова идентичны), в которой используется другой формат хранения данных в текстовом файле – значения разделяются запятыми (CSV-формат). Данный формат поддерживается программой Microsoft Excel, понимающей файлы в CSV-формате, а также Microsoft Access.
Òàáëèöà 1. Îïèñàíèå íåêîòîðûõ ïîëåé ó÷åòíûõ çàïèñåé LDAP-êàòàëîãà
Использование утилиты Csvde.exe Для наглядности, вместо полного описания параметров работы с утилитой приведем пример, на основе которого можно построить запросы для всех необходимых для аудита случаев. csvde -f USERS_WORK.CSV -b GUEST MICROSOFT * -r "(&(objectClass=user)(!(objectClass=computer)) ↵ (!(userAccountControl=514))(!(userAccountControl=66050)))" -l "DN, memberOf, badPasswordTime, lastLogon, logonCount, ↵ sAMAccountName, userAccountControl, whenChanged, whenCreated"
Использование данной команды позволяет сохранить в файле наиболее интересную с точки зрения аудита информацию по действующим (не заблокированным) учетным записям пользователей. В файл USER_WORK.CSV (параметр -f) будут записаны данные учетных записей пользователей домена. Программа будет производить обработку данных, которые должны быть доступны пользователю GUEST домена MICROSOFT, пароль для которого должен быть введен в процессе выполнения команды (параметр -b). Из всех объектов LDAP-каталога будут отобраны только учетные записи пользователей, для которых в поле параметра userAccountControl отсутствует информация о блокировке учетной записи (параметр -r). В качестве логических операций для фильтра используются – «!» – логическое НЕТ, «&» – логическое И, «|» – логическое ИЛИ. В результате выполнения команды в CSV-файле будут сохранены данные полей, перечисленных в параметре -l (список наиболее интересных полей приведен в таблице 1). Примечание: команда «Net user» некорректно обрабатывает данные поля pwdLastSet, а также некоторые значения времени. Для поля pwdLastSet, в случае если пароль не был задан, выводятся текущие дата и время. Для данных времени вместо значений вида 00:mm AM и 00:mm PM выводятся значения 12:mm AM и 12:mm PM соответственно.
46
Форматы представления данных даты и времени Если вы были наблюдательны, то заметили, что в таблице 1 имеются два различных варианта представления значений даты и времени. Если формат вида ГГГГММДДЧЧММСС.0Z (тип GeneralizedTime для ASN.1 кодирования), используемый для полей whenChanged, whenCreated по Гринвичу достаточно понятен, то параметры, такие как lastLogon, pwdLastSet, accountExpires, представляют информацию о дате и времени в 32-битном UNIX-формате, и содержат значения секунд, прошедших начиная с 1 января 1970 г., GMT. Для наглядности приведем некоторые значения, которые могут содержаться в файле выгруженных значений для параметров даты и времени в Unix-формате: 126858492000000000 – ñîîòâåòñòâóåò 1.01.2003 00:00 127014876000000000 – ñîîòâåòñòâóåò 1.07.2003 00:00 127014912000000000 – ñîîòâåòñòâóåò 1.07.2003 01:00
Использование функций преобразований для данных CSV-формата Информацию по учетным записям, которая выгружена с помощью команды, аналогичной, указанной в начале раздела «Использование утилиты Csvde.exe», можно попытаться загрузить в Microsoft Access, однако, в связи с тем, что программа некорректно обрабатывает символ-разделитель «,» в структурах типа «CN=Bill Gates,CN=Users, DC=Microsoft,DC=com», то лучше воспользоваться аналогичными возможностями программы Microsoft Excel (см. рис. 1). Далее, информацию для удобства использования можно обработать с помощью имеющихся в Microsoft Excel возможностей (макросы, функций).
администрирование = ÅÑËÈ( ÇÍÀ×ÅÍ(ËÅÂÑÈÌÂ(F2;11))=0; -1; ÎÊÐÓÃËÂÍÈÇ((ÇÍÀ×ÅÍ(ËÅÂÑÈÌÂ(F2;11))- 12685849200)/24/3600; 0) ) Ðèñóíîê 1. Ïðèìåð äàííûõ CSV-ôàéëà ïîñëå ýêñïîðòà â Microsoft Excel
На рисунках приведена информация CVS-файла сразу после проведения его загрузки в Microsoft Excel (рис. 1) и после проведенных преобразований (рис. 2). Примеры таких преобразований приведены ниже. Предлагаемые варианты преобразований не претендуют на логическую законченность, но могут являться той основой, с помощью которой за короткий срок может быть разработан необходимый механизм обработки под каждый конкретный случай.
Полученное на первом этапе значение сдвига дней относительно 1 января 2003 г. (в ячейке E2) используется для формирования даты в стандартном формате. =ÅÑËÈ( E2=-1; "Îòñóòñòâóåò"; ÑÖÅÏÈÒÜ( ÄÅÍÜ(ÄÀÒÀÇÍÀ×("1/1/2003")+E2); "."; ÌÅÑßÖ(ÄÀÒÀÇÍÀ×("1/1/2003")+E2); "."; ÃÎÄ(ÄÀÒÀÇÍÀ×("1/1/2003")+E2) )
Обработка данных даты и времени формата GeneralizedTime для ASN.1 кодирования Преобразование числа в формате ГГГГММДДММСС.0Z в формат ДД.ММ.ГГГГ ЧЧ:ММ Ðèñóíîê 2. Âèä èíôîðìàöèè CSV-ôàéëà ïîñëå ïðåîáðàçîâàíèé ñ èñïîëüçîâàíèåì âîçìîæíîñòåé Microsoft Excel
=ÑÖÅÏÈÒÜ( ÏÑÒÐ(N2;7;2); "."; ÏÑÒÐ(N2;5;2); "."; ÏÑÒÐ(N2;1;4); " "; ÏÑÒÐ(N2;9;2); ":"; ÏÑÒÐ(N2;11;2) )
Получение данных из структуры поля DN Для получения имени пользователя из структуры вида «…CN=Имя_пользователя,…» в ячейке A2, может быть использована следующая формула преобразования: =ÏÑÒÐ(A2; ÍÀÉÒÈ("CN=";A2)+3; ÍÀÉÒÈ(","; A2; ÍÀÉÒÈ( "CN="; A2 )+3 ) - ÍÀÉÒÈ("CN=";A2) -3 )
Для получения информации из структуры вида «…OU=Данные,…» в ячейке A2 может быть использована следующая формула преобразования: =ÅÑËÈ(ÅÏÓÑÒÎ('0'!A2);""; ÅÑËÈ(ÅÎØÈÁÊÀ(ÍÀÉÒÈ("OU=";'0'!A2)); "USERS"; ÏÑÒÐ( '0'!A2; ÍÀÉÒÈ("OU=";'0'!A2)+3; ÍÀÉÒÈ(","; '0'!A2; ÍÀÉÒÈ("OU=";'0'!A2)+3) – ÍÀÉÒÈ("OU=";'0'!A2) -3 ) ) )
Обработка значения поля userAccountControl о блокированности записи Получение данных о состоянии учетной записи по значению поля userAccontControl, содержащемуся в ячейке G2: =ÅÑËÈ(ÅÏÓÑÒÎ(G2);""; ÅÑËÈ(ÈËÈG2=514; G2=66050);"Çàáëîêèðîâàííàÿ";"Äåéñòâóþùàÿ") )
Подробные пояснения и описание формата хранения данных в поле userAccountControl можно найти в статье Microsoft «How to Use the UserAccountControl Flags to Manipulate User Account Properties» (http://support. microsoft.com/?kbid=305144). Отметим только, что если параметры учетной записи не заданы, то десятичное значение userAccountControl равно 512; десятичное значение для блокированной учетной записи при отсутствии других параметров – 514.
Заключение Обработка данных даты и времени Unix-формата Получение даты в формате ДД.ММ.ГГГГ на основании данных в Unix-формате предлагаем производить в два этапа. На первом этапе вычисляется количество дней, прошедших с 1 января 2003 г. На втором формируется строка даты в стандартном формате. Для получения количества дней, прошедших с 1 января 2003 г., на основании данных в ячейке F2, заданных в Unix-формате даты и времени, может быть использована следующая формула преобразования:
№11(12), ноябрь 2003
В статье предложен достаточно простой метод получения данных для аудита учетных записей пользователей в Active Directory, не требующий специальных навыков и знаний языков программирования. Отметим, что кроме изложенного метода может быть использован вариант, рекомендуемый Microsoft, предполагающий использование интерфейсов службы Active Directory (ADSI), которые предоставляют простой, мощный, объектно-ориентированный доступ к ресурсам Active Directory. Интерфейсы ADSI позволяют программистам и администраторам создавать программы каталога с использованием инструментальных средств высокого уров-
47
администрирование ня, например, Microsoft Visual Basic, Java, C или Visual C++, не заботясь о различиях в пространствах имен. Интерфейсы ADSI полностью поддерживают сценарии, что облегчает их использование администраторами. И напоследок, в качестве рекомендаций перечислим те нюансы, на которые следует обратить внимание при проведении анализа данных списка пользователей, которые могут указывать на существующие проблемы при использовании учетных записей: заблокированные учетные записи (после анализа последней даты регистрации могут быть удалены в случае, если необходимость в них отсутствует);
48
данные учетной записи о том, что последняя регист-
рация в сети происходила три и более месяца назад, могут указывать на то, что сотрудник, которому принадлежала учетная запись, уже уволен; если количество регистраций в сети для учетной записи равно нулю, а со времени ее создание прошло свыше одного месяца, то это может говорить о том, что созданная учетная запись оказалась невостребованной; большое количество регистраций в сети может указывать на то, что учетная запись используется для входа в сеть не только владельцем.
администрирование
WINDOWS SERVER 2003: ВЗГЛЯД СИСТЕМНОГО АДМИНИСТРАТОРА
АЛЕКСЕЙ ДОЛЯ МИХАИЛ МЕЛЬНИКОВ 50
администрирование Не так давно всемирно известная группа Gartner провела весьма интересное исследование рынка серверных операционных систем семейства Windows, в результате выяснилось, что подавляющее большинство компаний и администраторов предпочитают базировать свои серверы на старой как мир Windows NT 4.0 (она занимает порядка 60-70% рынка), и переход на Windows 2000 Server, а тем более на недавно вышедшую Windows Server 2003 для них выглядит непривлекательной идеей. Microsoft же, в свою очередь, незадолго до выхода Windows Server 2003 также провела статистическое исследование, в котором рынку Windows NT 4.0 отводится всего лишь 35%. Более того, было развернуто свыше 10 000 серверов вне стен Microsoft под управлением Windows Server 2003 еще до официального дня презентации. Кому верить – вопрос риторический. Однако время на месте не стоит, да и сама Microsoft дышит оптимизмом: с момента появления NT 4.0 воды утекло довольно много, а вариантов серверных Windows помимо самой Windows NT 4.0 набралось уже два: Windows 2000 Server, и вот, встречайте, Windows Server 2003 (как всегда в нескольких редакциях и ценовых категориях: Enterprise, Web, Datacenter и, конечно же, Standard). Каждый из вариантов системы позиционируется компанией Microsoft для решения конкретных задач в ориентации на разную производительность, функциональность и гибкость, и масштаб организационной инфраструктуры. Windows Server 2003 Datacenter разработана для критичных бизнес-приложений, она позволяет решать задачи, требующие масштабируемости и доступности высокого уровня. Например, решения для баз данных, планирования ресурсов на предприятии, высокоскоростной интерактивной обработки транзакций и консолидации серверов. Windows Server 2003 Datacenter Edition поддерживает 32-потоковую мультипроцессорную обработку данных (SMP) и до 64 Гб оперативной памяти (речь идет о 32-разрядной версии, 64-разрядная поддерживает соответственно 128 Гб ОЗУ), а также предоставляет стандартные функции: восьмиузловую кластеризацию и службы балансировки нагрузки. Windows Server 2003 Web Edition будет применяться для конкретных задач, ориентированных на использование веб-технологий. Эта версия предназначена для разработки и поддержки хостинга веб-приложений, вебстраниц и веб-служб XML. Web Edition разработана для использования в основном в качестве веб-сервера IIS версии 6.0 и предоставляет платформу для успешной разработки и развертывания веб-служб XML, которая использует технологию ASP.NET, являющуюся одной из основных частей .NET Framework. Кстати говоря, предполагается, что Windows Server 2003 Web Edition приобрести в розничной продаже будет нельзя, поскольку она будет распространяться исключительно через официальных партнеров Microsoft. В свою очередь Windows Server 2003 Standard Edition от Enterprise Edition предоставляемым функционалом во многом схожи, и по рекомендации Microsoft могут использоваться в зависимости от масштаба существу-
№11(12), ноябрь 2003
ющей или предполагаемой информационной структуры компании. «При разработке Windows Server 2003 мы ставили во главу угла повышение безопасности системы, – заявил Билл Вегте, вице-президент подразделения Windows Server Division корпорации Microsoft. – Безопасность является одной из главных забот пользователей, и новые функции, реализованные в этой версии, значительно облегчают создание защищенных систем. Windows Server 2003 представляет собой надежную безопасную платформу, обогащенную целым рядом новаторских решений». И действительно, выход операционной системы откладывался (по заявлениям Microsoft для того, чтобы максимально эффективно и качественно пройти этап тестирования нового продукта), ее названия (по сравнению с бэта-версиями) менялись. Ключевой довод разработчиков сводился к повышению безопасности новой ОС. Что ж, будем надеяться, что цели поставленные разработчиками, реализованы. Возвращаясь к цифрам статистики, можно сделать вывод, что не раз наученные горьким опытом администраторы из принципа не переходят на новую версию Windows. А сама миграция им представляется переездом на Гондурас без денег и запасного белья. Некоторые ждут как минимум двух официальных патчей, которые по идее должны исправить практически все недочеты разработчиков, другие же закрывают глаза на все, и по-прежнему каждый день в меню «Пуск» наблюдают надпись Windows NT 4.0 или Windows 2000.
Ðèñóíîê 1. Ïðèìåð ïðîåêòèðîâàíèÿ ñèñòåìû áåçîïàñíîñòè ñåðâåðà
Компания Microsoft призывает администраторов переходить на Windows Server 2003, не дожидаясь первого сервис-пака. Тем не менее выход сервис-пака уже официально назначен на декабрь этого года. Впрочем, стоит заметить, что при недочетах Windows 2000, в новой Windows 2003 таковых (во всяком случае пока) не обнаружено, и после разговора с несколькими администраторами крупных компаний, которые уже успели перейти на Windows Server 2003, складывается впечатление, что система действительно внушает доверие. Для начала давайте рассмотрим некоторые предпо-
51
администрирование сылки к миграции на новую ОС. В первую очередь это удобство в администрировании сервера: подобно новенькой BMW, «водителю» не нужно прилагать излишних телодвижений для того, чтобы нажать какую-либо кнопку. То же самое и здесь. Наиболее интересным приложением в новой ОС является мастер управления сервером (см. рисунок), который будет встречать вас каждый раз при включении компьютера, начиная с самого первого запуска системы. Он введен взамен прежнего мастера настройки сервера. С его помощью выполняются базовые операции администратора над сервером, которые раньше требовали значительно больших затрат времени. Одна из главных целей мастера управления сервером – предоставить системным администраторам удобную возможность настраивать сервер для выполнения конкретных задач, например, создания DNS-серверов, контроллера домена, DHCP-серверов и т. д.
Ðèñóíîê 2. Ìàñòåð óïðàâëåíèÿ ñåðâåðîì â äåéñòâèè
Как и всегда, разработчики делают ставку на повышение надежности и производительности нового продукта. С Windows Server 2003 все эти обещания выглядят как нельзя более внушительно. Внесены усовершенствования в такие технологии, как балансировка нагрузки сети, служба Active Directory (об этом ниже), кластеры серверов. Кроме того, интегрирована новая среда – так называемая CLR (Common Language Runtime). Ключевым свойством CLR с точки зрения администратора является возможность обеспечения программной изоляции приложений, исполняемых в общем адресном пространстве. Это осуществляется с помощью безопасного в отношении типов (type safety) доступа ко всем областям памяти при исполнении безопасного управляемого кода. Некоторые компиляторы могут создавать MSIL-код, который не только безопасен в отношении типов, но и поддается простой проверке на безопасность исполнения. Этот процесс называется верификацией и позволяет серверам легко проверять написанные на MSIL пользовательские программы, и запускать только те, которые не будут производить опасных обращений к памяти. Такая независимая верификация важна для действительно масштабируемых серверов, исполняющих пользовательские программы и скрипты.
52
Весьма интересным и значительным изменениям подвергся и весь процесс управления системой. В Windows Server 2003 повышена надежность и доступность средств управления, введенных ранее в Windows 2000, и усовершенствованы основные функции, такие как инструментарий управления Windows, групповая политика и результирующая политика. Благодаря службам управления IntelliMirror все приложения, данные и настройки доступны пользователям независимо от точки входа в систему, что, несомненно, повышает производительность. Как и в Windows 2000, установка, удаление и обновление приложений могут выполняться удаленно. В конечном счете адекватно задачам развернутой инфраструктуры эффективное использование всех сервисов предполагает для конечного пользователя наличие гибкой, управляемой системы для работы, исключая необходимость настраивать рабочие места под сервер.
Ðèñóíîê 3. Îïðåäåëåíèå ïóòè ìèãðàöèè äëÿ ñåðâåðà ïðè ïåðåõîäå íà ïëàòôîðìó Windows Server 2003
Миграция – процесс нелегкий и недешевый. Его целесообразность всегда стоит под вопросом. Тем не менее Windows Server 2003 – отличная замена старым NT 4.0 и Windows 2000 Server. Причин для миграции с прежних серверных версий Windows на Windows Server 2003 много, и для каждого предприятия они могут быть персональными. Кто-то использует в качестве сервера Windows 2000 Server, а кто-то до сих пор базирует свой сервер на основе Windows NT 4.0. Если у вас последний случай, то стоит заметить, что Windows Server 2003 не просто превосходит Windows NT 4.0 по многим параметрам, но и является более надежной ОС. К тому же использование всех возможностей Windows Server 2003 позволит вам значительно повысить не только производительность и надежность сети, но и упростить само ее администрирование. Например, служба Microsoft Active Directory упрощает администрирование крупных и территориально распределенных сетей и дает возможность пользователям быстро находить необходимые данные независимо от размеров сети и количества серверов. Усовершенствования, которые внесены в эту технологию, по заявлениям разработчиков имеют важное стратеги-
администрирование ческое значение для сетей предприятий любых размеров. В число нововведений и усовершенствований Active Directory входит переименование домена, что позволяет изменять DNS- и NetBIOS-имена уже зарегистрированных доменных имен в составе логической схемы лес (forest) таким образом, что результирующий состав леса остается синтаксически корректным.
Ðèñóíîê 4. Âëèÿíèå îáíîâëåíèÿ äîìåíîâ íà äîâåðèòåëüíûå îòíîøåíèÿ
Также следует отметить появление в Active Directory поддержки класса inetOrgPerson – теперь администратор может использовать данную возможность для выполнения миграции объектов inetOrgPerson из каталога LDAP в Active Directory при необходимости сравнить содержимое Active Directory с другими каталогами LDAP или создать объекты inetOrgPerson в Active Directory.
Ðèñóíîê 5. Ïðåèìóùåñòâà ìèãðàöèè íà ïëàòôîðìó Windows Server 2003 î÷åâèäíû, îñîáåííî åñëè âû èñïîëüçóåòå Windows NT 4.0
Windows Server 2003 является достойной альтернативой Windows NT 4.0 и побуждает системных администраторов, избавиться от старого ПО и перейти к новому. В качестве основного довода Microsoft приводит аргумент, формулирующийся примерно так: пора выкинуть старое железо под управлением Windows NT 4.0 и заменить его новыми высокопроизводительными кластерами под управлением Windows Server 2003 – это позволит упростить топологию сети предприятия, повысить производитель-
№11(12), ноябрь 2003
ность и масштабируемость, а также облегчить администрирование сети в общем. Ну и самое заметное усовершенствование в Active Directory, конечно же, повышение общей производительности. В Windows Server 2003 организовано более эффективное управление репликацией и синхронизацией содержимого Active Directory. Благодаря этому администраторам будет легче контролировать типы данных, подлежащих репликации и синхронизации между контроллерами одного или нескольких доменов. Кроме того, Active Directory предлагает больше возможностей в плане интеллектуального отбора данных, подлежащих репликации. Например, можно выбирать только изменившиеся данные, исключая необходимость обновлять полностью весь каталог. Нельзя не рассказать и о новшествах в плане Internet Information Server (IIS), который теперь наделен порядковым номером 6.0. Теперь IIS предоставляет ряд новых функций и усовершенствований, среди которых новые программные средства, функции безопасности, новая архитектура обработки запросов и новые функции обеспечения быстродействия и масштабируемости. Функция отслеживания состояния системы (WAP), интегрированная в IIS 6.0, поможет вам следить за состоянием рабочих процессов посредством периодической проверки связи с ними. Естественно, цель подобных «процедур» состоит в выявлении блокировки того или иного процесса. Если какой-либо процесс блокирован, служба WAP закрывает его и взамен запускает другой, идентичный ему процесс. Привязка к процессорам в IIS 6.0 также играет далеко не последнюю роль. Каждый рабочий процесс можно привязать к отдельному процессору, и при этом попадания в кэш процессора (L1 или L2) происходят чаще. В плане безопасности в IIS 6.0 введены такие функции, как блокировка сервера, усовершенствование протокола SSL, интеграция так называемого паспорта (Microsoft Passport), авторизация URL и многое другое. Windows Server 2003 содержит значительное количество поправок и усовершенствований Active Directory, и перечисленные выше нововведения и обновления AD – это всего лишь маленькая доля всего, что появилось нового в этой службе. При помощи специальных служб сертификации и средств управления сертификатами организации могут создавать собственную инфраструктуру открытых ключей (так называемую Public Key Infrastructure, PKI). Инфраструктура PKI позволяет администраторам внедрять технологии обеспечения безопасности, основанные на стандартах, (например, вход в систему с использованием смарт-карт, проверку подлинности клиентов по протоколам Secure Sockets Layer (SSL) и Transport Layer Security (TLS). Службы сертификации позволяют администраторам создавать доверенные центры сертификации, отвечающие за выдачу и отзыв сертификатов X.509 V3. Благодаря этому организации могут и не зависеть от ком-
53
администрирование мерческих систем проверки подлинности, даже если такая система интегрирована в инфраструктуру открытых ключей отдельной организации. Весьма интересной возможностью, которую вы получите при миграции на Windows Server 2003 также является консоль управления групповой политикой, которая была задумана в качестве дополнительного компонента Windows Server 2003. С ее помощью администратор может использовать групповую политику для настройки параметров и определения действий пользователей и компьютеров. В отличие от локальной, групповую политику можно использовать для настройки правил, применяемых на заданном узле, в домене или же подразделении Active Directory. В ближайшее время Microsoft предложит пользователям несколько дополнительных программных модулей для обеспечения безопасности. Одним из них является Secure Configuration Wizard (мастер создания защищенных конфигураций) – дополнительный модуль для Windows Server 2003, помогающий автоматизировать настройку серверов с целью обеспечения максимальной безопасности (с использованием функциональных ролей). Кроме того, Microsoft расширит спектр предлагаемых шаблонов и рекомендаций (Patterns and Practices), добавив к ним практические рекомендации по таким вопросам, как инфраструктура идентификации и инфраструктура мобильного доступа, что поможет пользователям создавать и эксплуатировать защищенные системы на основе Windows Server 2003. Windows Server 2003 обладает рядом новых и усовершенствованных функций для создания защищенных серверных конфигураций на платформе Windows. Благодаря этим нововведениям заказчикам будет легче создавать безопасные конфигурации и управлять ими. В частности, можно будет безопасно предоставлять доступ в корпоративную сеть конечным пользователям, а также своим партнерам, поставщикам и клиентам. Ниже перечислены некоторые функции, обеспечивающие повышенную безопасность Windows Server 2003. Значительно переработанные службы инфраструктуры открытых ключей (PKI) обеспечивают пользователей простой системой управления сертификатами, повышающей безопасность основанных на IPSec виртуальных частных сетей (VPN) и сетевых коммуникаций, систем аутентификации, использующих беспроводные протоколы семейства 802.1x, процессов входа в систему с использованием микропроцессорных карточек, шифрующей файловой системы и других служб. Открытый защищенный протокол аутентификации (Protected Extensible Authentication Protocol – PEAP) предлагает средства парольной аутентификации, призванные повысить безопасность сетевых соединений. PEAP идеально подходит пользователям, которым необходима возможность использования беспроводной связи, но которые не обладают ресурсами, необходимыми для построения полноценной инфраструктуры открытых ключей.
54
Диспетчер авторизации (Authorization Manager) обеспечивает возможность авторизации на основе принципа прикладных ролей, упрощая системным администраторам управление доступом конечных пользователей к веб-службам. «А стоит ли надеяться на непроверенную надежность, в то время как уже полюбившаяся и настроенная «под ключ» система работает без сбоев несколько лет и никаких сюрпризов не преподносит?», – спросит рядовой администратор сети, не желающий иметь лишние проблемы. Вопрос, конечно, риторический, и для каждого на него найдется свой ответ. Но все же, если вы как администратор гонитесь за стабильностью, быстродействием и крайне высокой надежностью, а главное – исключительно личным комфортом, то переход на Windows Server 2003 может стать праздником. Все же обойдемся без иронии. Презентация системы, прошедшая несколько месяцев назад по всем крупным городам России, прошла более чем скромно. Обусловлено это было тем, что само слово «Server» уже предусматривает небольшой круг потенциально заинтересованных лиц и не требует такой глобальной рекламы, какая, например, была перед выходом Windows XP осенью 2001 года. Также не стоит строить иллюзий на предмет новой серверной ОС от Microsoft. Было бы глупо отрицать, что сами разработчики не предполагают выпуск как минимум двух-трех патчей, которые должны «залатать дыры», непредусмотренные программистами как по части безопасности, так и по части просто стабильной работы системы. Все же есть несколько весьма впечатляющих доводов в пользу Windows Server 2003, если сравнивать ее с Windows 2000. Сразу отметим, что производительность системы в общем плане повысилась на 10-15%. Скорость загрузки системы возросла на 20-30%. Количество ошибок стало значительно ниже, однако все же вызывают некоторые трудности небольшие программы, к которым мы так привыкли. Например, ICQ в некоторых случаях (опять же определить трудно, в каких именно) подключается к серверу Mirabilis только в режиме администратора. Пользователи же подключиться к ICQ не могут. Эта проблема может решиться обеспечением сетевого доступа к папке, где хранится сама программа для всех пользователей. Но все же не факт, что это поможет. И такие проблемы встречаются далеко не с одной ICQ. Приводить полный список в виде «программа – ошибка» смысла не имеет. По части игр, дорогие администраторы, тоже стоит заметить, что играть по сети в Quake в рабочее время не получится – подобные игры теперь просто не работают под управлением Windows 2003. Правда, после брожений по сетевым форумам, где «лучшие умы российской кибернетики» пытаются «научить» Windows запускать любимые игры, стало понятно, что Windows 2003 – операционная система не обязательно серверная, но и домашняя. Во всяком случае при желании она может стать таковой.
безопасность
ЗАЩИТНИК СЕТИ
СЕРГЕЙ ЯРЕМЧУК 56
безопасность Главной задачей администратора является обеспечение бесперебойной работы компьютеров и безопасности компьютерной сети. Если для малых сетей, когда компьютеры находятся в соседних помещениях, обычно обходятся установкой и конфигурированием firewall на маршрутизаторе и антивирусом на каждом компьютере, то в больших сетях задача усложняется. Уследить за происходящим в подопечной сети в этом случае задача уже далеко не тривиальная и требующая совсем другого подхода. Теперь сисадмину, чтобы не бегать по этажам в поисках неисправностей, желательно иметь систему удаленного мониторинга компьютеров. В целях же обеспечения безопасности, кроме установки firewall, необходимо использовать системы обнаружения вторжения, позволяющие оценить происходящее в сети в целом, не ограничиваясь только защитой наиболее важных компонентов сети по отдельности. И желательно, чтобы не прерывать контроля за подчиненной сетью в случае остановки сервера по какой-либо причине, установить эту систему на отдельный компьютер. В качестве последнего вполне может подойти любой из списанных (с подходящей мощностью, естественно). Настройка и отладка подобных систем – задача совсем не простая и требующая много времени и сил для поиска и подбора необходимых компонентов и чтения документации и сбора всего этого воедино. Поэтому хотелось бы иметь инструмент, позволяющий установить все одним махом с удобной и понятной настройкой. Успех операционной системы Linux во многом состоит и в том, что каждый может собрать дистрибутив конкретно под свои нужды, а собрав, показать, естественно, другим. Нашелся среди того большого разнообразия и удовлетворяющий поставленной выше задаче. Шведский дистрибутив Compledge Sentinel (http:// compledge.com/sentinel/) размером всего 147 Мб предназначен для мониторинга работы компьютеров, аудита безопасности сетей и обнаружения вторжения в компьютерные сети. То есть представьте себе отдельный компьютер с установленной Linux-системой, который только тем и занимается, что отслеживает происходящее в контролируемой сети и в случае чего сигнализирует сисадмину, принимает меры по недопущению распространения дальнейшей угрозы. И самое главное, так как Sentinel представляет собой законченное решение, поэтому и усилий для первоначальной настройки необходимо приложить минимум. Достаточно всего лишь установить его и запустить необходимые сервисы.
№11(12), ноябрь 2003
На сайте, кроме ISO-образа дистрибутива, можно найти исходники, документацию и несколько дополнительных пакаджей. Установка особой сложности не представляет, необходимо просто заполнять запрашиваемые пункты для последующей настройки, после чего просто распакуется архив с системой. Удобно, что в отличие от большинства дистрибутивов, предназначенных для администратора (ClarkConnect, SmoothWall, Astaro Security Linux), программа установки позволяет разбить диск вручную (при помощи cfdisk) с последующим указанием точек монтирования, а не автоматически уничтожая при этом все данные, что позволяет установить эту систему второй для первоначального ознакомления. В дальнейшем монитор с клавиатурой можно отключить и получать информацию при помощи веб-интерфейса. Для осуществления задуманного имеется полный комплект необходимых приложений. Nagios (http://www.nagios.org/) представляет собой программу удаленного системного мониторинга, позволяющую отслеживать ошибки в работе серверов и сервисов и выдавать собранную информацию через вебинтерфейс, в том числе и на пейджер или сотовый телефон посредством SMS и WAP, есть возможность пользователю добавлять свои программы оповещения. Nagios позволяет производить мониторинг таких сетевых сервисов, как SMTP, TELNET, SSH, HTTP, DNS, POP3, IMAP, NNTP и многих других. Кроме этого, есть возможность добавлять свои скрипты мониторинга и реакции на определенные события. Управлять систе-
57
безопасность
мой мониторинга также можно не только локально, но и удаленно, в том числе и с мобильного телефона через wap-интерфейс. Nagios после запуска контролирует работоспособность только локального компьютера, для мониторинга остальных его необходимо предварительно настроить. Более подробно о настройке Nagios читайте в статьях Андрея Бешкова [1, 2, 3].
Nagat (http://nagat.sourceforge.net/) – утилита веб-администрирования Nagios, использующая php. В настоящее время доступна только CVS-версия. Мне лично не очень нравится, но многие сочтут ее более удобной, чем настройка непосредственно в конфигурационных файлах. Nessus (http://www.nessus.org) – относится к сканерам обнаружения вторжения (remote security scanner) и при-
58
безопасность
№11(12), ноябрь 2003
59
безопасность меняется для поиска уязвимостей и слабозащищенных сервисов. Основан на части кода от другого известного сканера портов nmap. Имеет клиент-серверную и модульную архитектуру. В качестве сервера используется Unixсистема, клиенты бывают как для Unix-машин, так и под Windows – NessusWX (имеется в комплекте Compledge Sentinel). Все уязвимости, о которых «знает» программа, описываются в виде отдельных модулей на специально разработанном для этой цели языке NASL (Nessus Attack Scripting Language), которые можно добавлять по мере пополнения базы модулей.
Snort (http://www.snort.org) – cетевая cистема детектирования вторжения (NIDS), проверяющая сеть и выявляющая попытки атак и сканирования. Распознаются распространенные попытки осуществления атак buffer overflows, CGI attack и др., а также практически все методы сканирования и сбор «баннеров», т.е. информации о системах (fingerprinting). ACID – Analysis Console for Intrusion Databases (http:// www.andrew.cmu.edu/~rdanyliw/snort/snortacid.html) представляет собой систему на основе языка PHP, предназначенную для поиска и обработки базы данных инцидентов, замеченных при помощи программ защиты типа IDS и firewalls (например, в нашем случае Snort и tcpdump, есть вариант, анализирующий программы ipchains, iptables и ipfw). Программа содержит интерфейс поиска предупреждений, соответствующих фактически любым критериям, включая время прибытия, время сигнатуры, адрес/порт источника/адресата, флаги, полезный груз, и т. д. ACID также обеспечивает способность аннотировать и логически группировать связанные события, удалять ложные и уже обработанные предупреждения. Все это затем выводится в виде разнообразных статистических отчетов и графиков,
в которые могут быть включены время, датчик, сигнатура, протокол, IP-адрес, TCP/UDP-порты, классификация и пр. OpenMosix (http://openmosix.sourceforge.net/) – приложение кластеризации для Linux, заставляющее несколько компьютеров работать как один. В комплекте Compledge Sentinel имеется четыре перекомпилированных ядра: два из которых передназначены для систем с одним процессором и два – для многопроцессорных систем, одно из двух ядер имеет поддержку openMosix и одно без таковой. Необходимое ядро выбирается при установке системы и в дальнейшем используется по умолчанию. И для обеспечения работоспособности и доступа через веб-интерфейс для настройки вышеописанных сервисов имеется Apache c OpenSSL, PHP и MySQL (первоначальный пароль для доступа сompledge), которые используются для хранения событий ACID и получения информации через защищенный веб-интерфейс. При этом система выдает подробнейшую информацию по дням, протоколам, узлам, портам, сигнатурам и пр. Вся необходимая информация для функционирования этих сервисов – пароли, IP-адреса, расположение баз данных – вводится во время установки. И поэтому в дальнейшем по конфигурационным файлам лазить не придется, хотя для более тонкой настройки каждого сервиса все-таки придется, предварительно ознакомившись с документацией на сайте. Что я могу сказать напоследок. Установка и настройка каждого из вышеописанных приложений требует больших временных затрат и усилий, не говоря уже о необходимых навыках, знаниях и желании этим всем заниматься. Но время обычно на стороне нападающего. Строить защиту по принципу «а кому это нужно» или «времени предостаточно» – плохая идея. После того как компьютер будет подключен к Интернету, сразу найдутся желающие покопаться в чужой информации. И в этой ситуации Compledge Sentinel может прийти на выручку. Он уже практически готов к бою. Литература: 1. Бешков А. Установка Nagios. – //Журнал «Системный администратор» №2(3), февраль 2003 г. – 6-14 с. 2. Бешков А. Мониторинг Windows-серверов с помощью Nagios. Часть 1. – //Журнал «Системный администратор»№7(8), июль 2003 г. – 12-19 с. 3. Бешков А. Мониторинг Windows-серверов с помощью Nagios. Часть 2. – //Журнал «Системный администратор»№8(9), август 2003 г. – 12-23 с.
ВТОРОЙ СЕМИНАР СИСТЕМНЫХ АДМИНИСТРАТОРОВ И ИНЖЕНЕРОВ SYSM.02 В середине декабря 2003 года портал SysAdmins.RU проводит второй Семинар системных администраторов и инженеров – SYSM.02. Первая подобная встреча проводилась в июле этого года (см. журнал «Системный администратор» №9(10), 2003 г). При планировании SYSM.02 организаторы учитывают все позитивные и негативные моменты первого Семинара. К участию приглашаются системные и сетевые администраторы, инженеры, IT-директора и аналитики, представители прессы. На мероприятии будут обсуждаться многие проблемы IT-рынка, планирование карьеры ITспециалистом, многие юридические аспекты и правовые вопросы, так или иначе связанные с работой системных адмнистраторов и инженеров. Также будет проведено учредительное собрание профсоюза «Работников сферы информационных технологий». Более подробную информацию можно получить на портале SysAdmins.RU, на официальном сайте Семинара http://sysm.ru и в декабрьском номере журнала.
60
безопасность
УДОБНЕЕ, ЭФФЕКТИВНЕЕ, ЛУЧШЕ:
ПАВЕЛ ЗАКЛЯКОВ
62
безопасность Описанный в статье [1] способ настройки IDS Snort, при котором логи ведутся в текстовый файл, имеет как положительные моменты, так и отрицательные. Среди положительных моментов можно назвать простоту. С текстовыми файлами человек может работать «напрямую», просматривая их в текстовом редакторе, используя различные возможности их обработки с помощью средств shell и perl. Удобства очевидны: не требуются дополнительные программы и прочие утилиты. Однако если смотреть шире, то по мере увеличения возможностей СОА эти преимущества обращаются в недостатки. Приведём один такой существенный недостаток: при очень больших объёмах логов место на диске при использовании текстовых файлов тратится не оптимально. Многие программы пытаются вести логи в своём, более компактном формате, либо имеют такую опциональную возможность. На первый взгляд это решает проблему размера лог-файлов, заметно их сокращая, но вместе с этим привносится и ряд новых потенциально возможных неудобств. Вот и получается, что двоичные файлы оказываются меньше по размеру, но не могут быть централизованно для всех программ стандартизированы, а текстовые файлы не предоставляют широких возможностей для их быстрого просмотра и более глубокого анализа с целью обнаружения каких-то внутренних зависимостей. Вот и подумаешь исходя из этого: «А зачем изобретать велосипед, не проще ли воспользоваться уже какой-нибудь готовой СУБД для ведения логов в неё?». Дополнительные плюсы от использования СУБД очевидны: во-первых, СУБД стандартизирована, во-вторых, легче решается вопрос переноса данных в другую СУБД, если у неё вдруг окажутся лучшие математические возможности по анализу данных. Также в случае использования нескольких сенсоров (сбора данных с нескольких узлов) с СУБД проблем не будет, а с текстовыми файлами может возникнуть путаница в именах лог-файлов, либо простои из-за периодических блокировок одного и того же лог-файла, так как одновременно данные из двух мест туда писаться не могут. На наше счастье все эти проблемы по более компактному хранению информации, более удобному её анализу и организации многопользовательского доступа уже решены в многопользовательских реляционных базах данных. (Под пользователями в данном случае можно понимать все процессы на одном или нескольких компьютерах, желающие работать в один и тот же момент с БД.) Далее мы попытаемся настроить Snort для работы с БД MySQL и поговорим о способах просмотра записанных данных. Занесение данных в БД – лишь малая часть проблемы, можно сказать, надводная часть айсберга, а вот «что делать с уже внесёнными данными дальше?» – это уже вопрос, который может и не иметь однозначно правильного ответа. Попытка дать на него ответ – это довольно непростая задача, особенно если мы хотим сделать какие-то обоснованные выводы на основе данных, собранных с распределённой сети сенсоров. Наибольшую сложность могут представлять попытки обнаружения в данных следов распределённых телекоммуникационных атак, но об этом, скорее всего, я напишу в будущих статьях.
№11(12), ноябрь 2003
Занесение данных из IDS Snort в БД Для начала мы возьмём относительно простую и свободно распространяемую БД MySQL. Её выбор обоснован большей распространённостью среди простых БД и наличием достаточного числа литературы к ней на русском языке [5]. Напомню основные моменты по установке Snort (подробнее см. [1]). Как и обычно, скачиваем и ставим последний Snort, если он не стоит: # wget http://www.snort.org/dl/snort-2.0.2.tar.gz # wget http://www.snort.org/dl/snort-2.0.2.tar.gz.md5
Сравниваем значения хеша, выданного командами: # cat snort-2.0.2.tar.gz.md5 # md5sum snort-2.0.2.tar.gz
Аналогично скачиваем и проверяем последние правила: # # # #
wget http://www.snort.org/dl/rules/snortrules-stable.tar.gz wget http://www.snort.org/dl/rules/snortrules-stable.tar.gz.md5 cat snortrules-stable.tar.gz.md5 md5sum snortrules-stable.tar.gz
Распаковываем скачанное куда-нибудь, например в директорию /progi/snort-2.0.2, и запускаем там конфигурирование с опцией --with-mysql: #./configure --with-mysql
не забываем про библиотеку libpcap. Если она не стоит и выдаётся ошибка:
копируем со второго диска (RedHat v.7.3) и ставим: # rpm -ihv libpcap-0.6.2-12.i386.rpm
Если БД MySQL у вас не установлена, то вам выдастся следующее сообщение в процессе конфигурирования:
и вам надо будет поставить БД MySQL. RedHat 7.3 идёт с версией 3.23.49-3 и mysqlclient9-3.23.22-6. Так как более новые версии данных продуктов доступны также в rpm через up2date (или http://redhat.com/apps/support/errata/), то мы возьмём их, соответственно версии 3.23.54a-3 и 3.23.22-8.
63
безопасность Обладатели других версий Linux могут установить себе БД самостоятельно, при этом, наверное, будет лучше скачать последнюю версию прямо с сайта MySQL [6]. Решение всех возникших проблем при этом ложится на ваши плечи. Мы же пишем все нужные файлы для MySQL в отдельную директорию и ставим их все вместе, так как это проще, чем соблюдать последовательность установки, дабы избежать ошибок с зависимостями о необходимости установки того rpm перед этим или после этого.
Далее, либо руками прописываем мягкие ссылки на /etc/rc.d/init.d/mysqld в директориях /etc/rc.d/rc?.d на запуск и останов, либо запускаем: # chkconfig mysqld on
который делает это за нас. (Замечание: в некоторых неrpm поставках mysqld называется mysql.) Далее либо перезапускаемся, либо запускаем MySQL руками: # /etc/rc.d/init.d/mysqld start
Далее повторно (если у вас не был установлен MySQL) запускаем конфигурацию из директории, где у нас установлен дистрибутив Snort. # ./configure --with-mysql
Запускаем компиляцию: # make
И устанавливаем Snort: # make install
Далее из snortrules-stable.tar.gz копируем правила (файлы *.rules) в /etc/snort/rules. Остальные файлы помещаем в /etc/snort. После этого редактируем /etc/snort/ snort.conf. Точная настройка и разбор snort.conf-файла вообще заслуживает отдельной статьи. Основные моменты, что мы меняли в [1]: В первом разделе это были переменные: var HOME_NET 123.45.45.45
или для диапазона адресов:
64
var HOME_NET [10.1.1.0/24,192.168.1.0/24] var RULE_PATH rules
Вторая и четвёртые части у нас не изменились, а в третьей, отвечающей за вывод данных, как раз и будут главные изменения. Там мы укажем, что необходимо вести вывод в БД MySQL. Мы находим закомментированные строчки: # # # # # #
database: log to a variety of databases --------------------------------------See the README.database file for more information about configuring and using this plugin.
output database: log, mysql, user=root password=test ↵ dbname=db host=localhost # output database: alert, postgresql, user=snort dbname=snort # output database: log, unixodbc, user=snort dbname=snort # output database: log, mssql, dbname=snort user=snort ↵ password=test
Раскомментируем первую, нужную нам для MySQL строчку, или сделаем её копию и укажем имя БД, пароль и пользователя для доступа к ней, которые зададим после. Пусть пользователь БД будет называться snort, пароль будет ваш_пароль№1, пользоваться мы будем БД snort. Имя нашего хоста будет localhost. В итоге получим: output database: log, mysql, user=snort ↵ password=âàø_ïàðîëü¹1 dbname=snort host=localhost
Как легко догадаться, БД может называться как угодно, пароль и имя пользователя могут быть любыми, лишь бы они соответствовали учётным записям в БД, которые мы сейчас создадим. Также БД может быть запущена и на другом компьютере, но об этом мы поговорим, когда будем строить распределённую систему сенсоров для обнаружения распределённых телекоммуникационных атак. Для того чтобы делать записи в БД, нужно, чтобы в этой самой БД существовала не только необходимая БД с соответствующим именем, но и были созданы таблицы, куда, собственно, и будут добавляться записи. Если мы прочитаем файл README.database, на который есть ссылка в комментариях к строчкам выше, то оттуда мы можем узнать, что можно вести логи не только в MySQL, который мы выбрали вначале, но и в: PostgreSQL; любую unix ODBC БД; MS SQL Server; Oracle. Список вполне неплохой. Если почитать README.database внимательно, то там будет написано практически всё, чем мы займёмся дальше, правда, на английском языке. Если БД MySQL у вас установлена впервые или вы её ранее не настраивали, то вам в целях безопасности придётся немного поднастроить её сейчас, в частности, задать пароль на суперпользователя БД – root (root для MySQL и root для системы – это разные пользователи). Для этого подключаемся к БД от имени пользователя root:
безопасность # mysql -u root
Далее нам выдастся обычное приглашение уже самой базы данных.
Команды следует набирать после приглашения «mysql>»: mysql> set password for ↵ 'root'@'localhost'=password('âàø_ïàðîëü¹2');
в ответ должно выдастся что-то вроде: Query OK, 0 rows affected (0.39 sec)
Затем создаём БД snort (это нужно и тем, у кого MySQL уже давно настроена): mysql> create database snort;
Иногда слова CREATE DATABASE пишут заглавными буквами, но в данном случае это не важно. Далее следует выйти из БД командой:
Это долго и неудобно, велика вероятность ошибки. Поэтому лучше воспользоваться уже готовым cписком команд, благо для популярных БД они поставляются с дистрибутивом Snort в директории contrib. Нужный нам файл называется create_mysql. Мы ограничимся лишь быстрым просмотром этого файла для ознакомления, а если у вас будет своя, уникальная БД, тогда вам лучше взять подобный файл и разобраться со структурой таблиц досконально, а пока я не вижу смысла придумывать велосипед. Создать описанную структуру можно командой: # mysql -D snort -u root ↵ -p < /progi/snort-2.0.2/contrib/create_mysql
Однако мы сделаем это немного по-другому, в интерактивном режиме, чтобы было более понятно. Для этого файл create_mysql мы помещаем в директорию, из которой будем запускать MySQL, чтобы он его видел без указания лишних путей. Запускаем: # mysql -u root -p
Введя ваш_пароль№2, в приглашении БД указываем, что мы хотим подключиться и работать с БД snort. mysql> connect snort
mysql> exit
Теперь, после того как мы установили пароль для захода в БД, нам следует набирать пароль при входе в БД и заходить уже другой командой, с лишним ключом «-p», говорящим о необходимости запрашивать пароль: # mysql -u root -p
на запрос пароля при входе следует вводить «ваш_пароль№2», заданный выше. Далее необходимо создать пользователей, от имени которых мы будем работать с БД, задать им права на выполнение тех или иных действий, пароли и структуру таблиц БД snort. Количество таблиц, которые использует Snort, велико для того, чтобы задавать их все вручную: schema event signature sig_reference reference reference_system sig_class sensor iphdr tcphdr udphdr icmphdr opt data encoding detail
№11(12), ноябрь 2003
После успешного подключения указываем, что нам необходимо выполнить содержимое файла create_mysql, то есть фактически создать нужную нам структуру таблиц. mysql> source create_mysql
В ответ на это мы должны увидеть множество строчек вида: Query OK, 0 rows affected (0.00 sec) Query OK, 1 row affected (0.00 sec)
означающих, что выполнение той или иной SQL-команды прошло успешно. В директории /var/lib/mysql/snort должны появиться файлы, соответствующие созданным таблицам. Далее нам необходимо создать пользователя snort, от имени которого Snort будет работать с БД, задать ему пароль и вручить ему права на те или иные действия с БД snort. Например, на добавление новых записей в таблицы и пр. Явной команды вроде adduser для добавления пользователей, как в Linux, здесь нет, объясняется это тем, что сведения о пользователях хранятся также в самой БД в её таблицах, поэтому при задании каких-либо атрибутов пользователю, то есть его прав или пароля, пользователь автоматически вносится в БД. Именно исходя из соображений безопасности по доступу к таблице с данными пользователей мы выше ввели пароль для суперпользователя БД. Вручаем права пользователю snort:
65
безопасность mysql> grant CREATE,INSERT,SELECT,DELETE,UPDATE ↵ on snort.* to snort;
для того чтобы можно было работать с БД, локально запускаем всё то же самое, но для snort@localhost: mysql> grant CREATE,INSERT,SELECT,DELETE,UPDATE ↵ on snort.* to snort@localhost;
Далее, забегая вперёд, создадим ещё одного пользователя и вручим ему права только на просмотр БД. В принципе, если этим пользователем будет php-скрипт на нашем компьютере, достаточно одной (второй) записи для локального доступа. Пользователя назовём acidviewer, а из прав дадим ему те же, что и выше, кроме права DELETE. mysql> on mysql> on
grant CREATE,INSERT,SELECT,UPDATE ↵ snort.* to acidviewer; grant CREATE,INSERT,SELECT,UPDATE ↵ snort.* to acidviewer@localhost;
Теперь зададим пароли для созданных аккаунтов. Так как информация о паролях хранится в БД mysql, а мы сейчас работаем с БД snort, переключимся на первую. mysql> connect mysql
Поскольку аккаунтов для одного и того же пользователя два, один для доступа извне, а другой с localhost, то пароли будут задаваться также два раза. Можно задать разные пароли, но будет велик риск запутаться. Пароль ваш_пароль№1 используется тот, что мы указали выше при редактировании файла snort.conf в третьей секции. Пароль для acidviewer следует придумать, назовём его ваш_пароль№3. mysql> set password for ↵ 'snort'@'localhost'=password('âàø_ïàðîëü¹1'); mysql> set password for 'snort'@'%'=password('âàø_ïàðîëü¹1'); mysql> set password for ↵ 'acidviewer'@'localhost'=password('âàø_ïàðîëü¹3'); mysql> set password for ↵ 'acidviewer'@'%'=password('âàø_ïàðîëü¹3');
Далее сбрасываем привилегии и выходим. mysql> flush privileges; mysql> exit
Сейчас Snort полностью готов для того, чтобы вести логи в созданную нами БД. Замечание: дотошный читатель скажет, что пользователю snort мы задали несколько больше привилегий, чем ему это необходимо. Сделано это было специально с целью не запутывать читателя лишней информацией и лишними пользователями. Поэтому два пользователя были объединены в одного и от имени snort будет работать не только Snort, но и программа (скрипт), с помощью которой мы будем просматривать БД и, возможно, редактировать её. Как раз для редактирования расширенные права и нужны. Пробуем запустить Snort вручную. # /usr/local/bin/snort -o -i eth0 -d -c /etc/snort/snort.conf
66
Параметр, указывающий на каком интерфейсе будет слушать Snort: «-i eth0», можно опустить. Замечание: если у вас пароль, указанный в snort.conf (ваш_пароль№1), не соответствует заданному в БД для пользователя snort (тоже ваш_пароль№1) из-за ошибки в написании, то вам может выдасться в процессе запуска Snort сообщение: ERROR: database: mysql_error: Access denied for user: 'snort@localhost' (Using password: YES)
Если вы следовали изложенному выше, у вас проблем быть не должно. В случае успешного ручного запуска создаём скрипт для автоматизации этого процесса при загрузке компьютера. Скрипт назовём snortd и поместим его в /etc/rc.d/init.d: #!/bin/bash # # snortd Start/Stop the snort IDS daemon. # # chkconfig: 2345 79 11 # description: snort is a lightweight network intrusion # detection tool that currently detects more than 1100 host # and network vulnerabilities, portscans, backdoors, and more. # # June 10, 2000 -- Dave Wreski <dave@linuxsecurity.com> # - initial version # # July 08, 2000 Dave Wreski <dave@guardiandigital.com> # - added snort user/group # - support for 1.6.2 # Source function library. . /etc/rc.d/init.d/functions # Specify your network interface here INTERFACE=eth0 # See how we were called. case "$1" in start) echo -n "Starting snort: " # ifconfig eth0 up daemon /usr/local/bin/snort -o -i $INTERFACE ↵ -d -D -c /etc/snort/snort.conf touch /var/lock/subsys/snort sleep 3 if [ -f /var/log/snort/alert ] then rm /var/log/snort/alert fi echo ;; stop) echo -n "Stopping snort: " killproc snort rm -f /var/lock/subsys/snort echo ;; restart) $0 stop $0 start ;; status) status snort ;; *) echo "Usage: $0 {start|stop|restart|status}" exit 1 esac exit 0
Замечание: закомментированная строчка «ifconfig eth0 up» имеет следующий смысл: если при каких-то условиях (смена номера запуска или какой-то сбой при запуске network) Snort будет запускаться до запуска сети и поднятия интерфейса, то при её наличии ошибки не
безопасность будет. Повторное поднятие уже поднятого интерфейса ошибок давать не должно. Строчку «rm /var/log/snort/alert» и несколько соседних можно закомментировать, если вы не хотите, чтобы у вас при запуске этот файл начинался с нуля. Далее, либо руками прописываем мягкие ссылки на /etc/rc.d/init.d/snortd в директориях /etc/rc.d/rc?.d на запуск и останов, соблюдая последовательность запуска, чтобы Snort запускался после MySQL, например: # ln -s /etc/rc.d/init.d/snortd /etc/rc.d/rc3.d/S79snortd # ln -s /etc/rc.d/init.d/snortd /etc/rc.d/rc3.d/K11snortd
либо запускаем: # chkconfig snortd on
или # chkconfig --level 3 snortd on
(сделать ссылки только для уровня 3), который делает это за нас. Автоматизация этого процесса не даёт гарантии того, что запуск Snort окажется после MySQL, а останов наоборот, поэтому этот момент следует проконтролировать вручную, посмотрев, чтобы номер у S??snortd был больше, чем у S??mysqld, а номер у K??snortd был меньше, чем у K??mysqld. Напомню, что в дистрибутиве Snort, в директории contrib имеется файл S99snort, аналогичный snortd. В случае успешного выполнения вышенаписанных действий по автоматизации процесса запуска Snort должнен запуститься либо при запуске вручную скрипта автоматизации, как это будет сделано ниже, либо после перезапуска компьютера. В любом случае в ответ на ваши действия вы должны увидеть зелёное ok, а на команду status вам должно выдаваться, что Snort выполняется.
Если это так, то половина нужного нам результата получена, и мы смело можем переходить ко второй части, а именно к настройке и изучению средств просмотра БД snort, куда запущенный нами Snort исправно записывает свои замечания о проходящем через него трафике.
Просмотр содержимого БД snort Если компьютер с установленным и правильно запущенным Snort подключить к сети Интернет напрямую, то есть с использованием реального IP-адреса, то менее чем через несколько минут в БД snort появятся новые записи. (В последнее время львиную долю этих записей составляют ICMP-сканирования.) Появление новых записей в БД не так наглядно для конечного пользователя, как если бы логи велись в файл, а мы бы запустили:
№11(12), ноябрь 2003
# tail -f èìÿ_ýòîãî_ôàéëà
для просмотра вновь появляющихся записей или: # cat èìÿ_log_ôàéëà
для просмотра содержимого всего файла. Для работы с БД нам необходимо наличие большего объёма знаний. Счастлив тот, кто знает СУБД как свои пять пальцев, – он может смело пропустить несколько абзацев ниже. Со всеми остальными мы попытаемся просмотреть таблицы БД snort с помощью SQL-запросов. Для начала нам необходимо подключиться к СУБД MySQL. Сделать это можно как от имени суперпользователя root, так и от имени заведённых пользователей snort и acidviewer. Выберем пользователя snort и выполним команду: # mysql -u snort -p
В качестве пароля необходимо ввести ваш_пароль№1. Вся последующая работа с БД ведётся с помощью SQL-запросов. Для получения более-менее наглядного представления о таблицах с данными мы выполним несколько простых SQL-запросов. Более глубокое изучение языка запросов читатели могут выполнить самостоятельно. После того как мы убедимся, что данные в таблицах есть, мы перейдём к настройке средств более удобного просмотра БД, а именно ACID. Первая команда, которую мы выполним, покажет нам, какие БД имеются в нашей СУБД. mysql> SHOW DATABASES;
Замечание: регистр команд не имеет значения, MySQL обработает запрос, даже если вы смешаете регистры, однако мы будем писать команды в верхнем регистре, как стандарт де-факто при использовании языка SQL. Команды можно вводить в несколько строчек, концом команды считается знак «;», а не символ перевода строки. Это очень удобно при написании длинных команд, так как не теряется наглядность. В ответ на запрос мы должны увидеть табличку с тремя БД: mysql, snort и test. Выберем БД snort: mysql> CONNECT snort;
и посмотрим, какие таблицы у нас имеются: mysql> SHOW TABLES;
67
безопасность Замечание 1: нумерация событий для разных сенсоров не сквозная, поэтому первичным ключом в данной таблице являются два поля sid и cid. Это можно заметить, если внимательно посмотреть содержимое файла create_mysql. Замечание 2: как легко догадаться, сенсоров может быть несколько, если получится, то этот случай мы обсудим в следующих статьях. Замечание 3: давать команду для показа всех строк данной таблицы: mysql> SELECT * FROM event;
Как раз все те, которые мы создавали ранее. Чтобы посмотреть заголовки столбцов выбранной нами таблицы event, дадим команду:
не имеет смысла, так как через некоторое время число записей в данной таблице может стать очень большим. При этом вывод её на экран может занять несколько минут. Чтобы понять, что такое сигнатура номер 2 или тот номер, что будет у вас в таблице, обратимся к таблице singature и посмотрим содержимое строки с sig_id=2; mysql> SELECT * FROM signature WHERE sig_id=2;
mysql> SHOW COLUMNS FROM event;
либо mysql> DESCRIBE event;
Если нам не нужна лишняя информация, то мы можем её не выводить, например, выполнив запрос только на вывод содержимого полей sig_id и sig_name следующим образом: mysql> SELECT sig_id,sig_name FROM signature WHERE sig_id=2;
Как мы видим для моего случая, это «STEALTH ACTIVITY (SYN FIN scan) detection».
По интуитивным соображениям можно понять, что cid отвечает за нумерацию событий. С помощью команды: mysql> SELECT * FROM event WHERE cid<10;
мы можем получить список нескольких первых событий.
Подобным образом можно просматривать все нужные нам таблицы и получать информацию не хуже, чем если бы мы читали текстовый файл. Используя более хитрые запросы, можно выводить информацию из нескольких таблиц в виде одной. Например, если мы хотим посмотреть несколько первых событий, как и ранее, только без столбца sid и чтобы вместо signature выводился не номер, а сразу словами разъяснение, то есть sig_name из таблицы signature, то команда, выполняющая это, будет выглядеть так: mysql> SELECT event.cid,signature.sig_name,event.timestamp ↵ FROM event,signature ↵ WHERE event.signature=signature.sig_id AND cid<10;
Вот результат её выполнения. Полученная таблица содержит 4 столбца с заголовками, которые мы видели ранее: sid или sensor ID – тот сенсор, с которого была получена информация; cid или ID counter – грубо говоря, номер события. signature – номер сигнатуры, которая была обнаружена; timestamp – временная метка, чтобы знать, когда произошло событие.
68
безопасность Обратившись к [5], можно научиться выполнять и более виртуозные запросы. В таблице iphdr для каждого события по его cid точно так же можно узнать IP-адрес источника атаки и на какой адрес она была нацелена. Моё мнение таково, что хороший системный администратор или специалист по информационной безопасности должны уметь выполнять простые SQL-запросы в командной строке, как это было описано выше. Конечно, никто этого делать не заставляет, и большинство из нас далеки от совершенства, выше было рассказано про то, без чего по-хорошему никак не обойтись. Любая, будь то самая удобная графическая оболочка при попытке задания более сложных запросов неминуемо приведёт вас к написанию SQL-запросов вручную. Несмотря на то что язык SQL лучше знать, чем не знать, не хотелось бы упускать из вида те инструменты, которые значительно упрощают нашу жизнь, в частности, программу phpMyAdmin.
phpMyAdmin Для работы phpMyAdmin [8] и ACID необходимо, чтобы были установлены пакеты php и php-mysql, у меня это были php-4.1.2-7.3.6 php-mysql-4.1.2-7.3.6, на 2-м и 3-м дисках RedHat v.7.3, соответственно, имеются более ранние версии. Всё вышеизложенное по поводу просмотра БД в более наглядной форме можно реализовать с помощью этого продукта. Для работы Snort он не нужен, но для более наглядного представления данных в БД считаю, что с этим пакетом стоит познакомиться всем тем, кто с ним не знаком. Для начала следует сходить на сайт этой программы [8] и скачать последнюю версию с какого-нибудь зеркала. На момент написания статьи последней версией была 2.5.4. После скачивания, например [9], и проверки хешфункции:
Если вы установили правильный пароль, то при попытке обращения к директории phpmyadmin веб-сервера, поддерживающего php, должно выдасться следующее:
Многих должен порадовать тот факт, что поддерживается русский язык и есть выбор различных кодировок. Далее, если щёлкнуть на «Базы данных», должны высветиться те БД, которые имеются в MySQL.
Щёлкая на Snort, мы выбираем эту БД и попадаем к следующему окну, где сразу видны названия тех таблиц, которые содержатся в этой БД.
# md5sum phpMyAdmin-2.5.4-php.tar.gz (MD5: 76fc7216aa2f132888c7173a6668af46)
содержимое архива следует поместить в папку для phpскриптов. Если не следовать досконально файлу Documentation.txt и закрыть глаза на некоторые вопросы безопасности, то удобнее будет создать директорию phpmyadmin, например, в /var/www/html и содержимое phpMyAdmin-2.5.4, то есть всё то, что находится в архиве, поместить туда (в /var/www/html/phpmyadmin). Далее следует внести небольшое исправление в /var/www/html/ phpmyadmin/config.inc.php в строку: $cfg['Servers'][$i]['password'] = '';
указав там свой пароль от БД: $cfg['Servers'][$i]['password'] = 'âàø_ïàðîëü¹2';
Остальные настройки, как host, port, user и пр., менять не стоит, так как по умолчанию всё должно работать.
№11(12), ноябрь 2003
Щёлкая на название таблицы event слева, получаем информацию об этой таблице:
69
безопасность Соответственно, если изменить запрос, например, на: mysql> SELECT event.cid,signature.sig_name,event.timestamp ↵ FROM event,signature ↵ WHERE event.signature=signature.sig_id AND cid<10;
Далее, внизу, SQL-запрос в окошке оставляем без изменения и жмём кнопку «Пошёл». После чего у нас на экран выводится содержимое нашей таблицы.
мы получим тот же результат, что и ранее мы получали через консольного клиента. Именно поэтому, какой бы оболочка удобной ни была, следует знать SQL, так как это основа работы с БД. Надеюсь, что просмотр содержимого БД двумя вышеописанными способами не показался вам чудовищно сложным. Наоборот, я старался сделать это как можно проще, чтобы от слов «БД» у вас не возникали мысли о «чёрном ящике» за семью печатями и не шли мурашки по коже. Надеюсь, что мне удалось убедить тех, кто ранее не был знаком с БД, что это не есть плохо, когда логи хранятся в БД. Их можно также легко просматривать, если не сказать, что даже с большим числом удобств, чем если бы они были в обычном текстовом файле. После того как мы убедились, что наша БД содержит информацию, попытаемся настроить специализированные и более удобные средства просмотра БД, а именно ACID. Продвинутые читатели, если их не устроит ACID, могут также пропустить всё, что говорится ниже, и самостоятельно «изобрести велосипед» не хуже. Со всеми же остальными начнём настраивать уже готовый пакет – ACID, поставляемый вместе с дистрибутивом Snort (в директории contrib).
ACID
Задав себе повторно тот же, что и ранее, вопрос, а именно: «Что за событие означает сигнатура номер 2?», мы можем также просто щёлкнуть на имя таблицы signature слева и увидеть параметры этой таблицы, затем внизу, не меняя SQLзапроса в окошке, нажав на кнопку «Пошёл», получаем содержимое первых 30 строк, среди которых находим нужную.
70
ACID [10] расшифровывается как Analysis Console for Incident/Intrusion Databases и дословно переводится как консоль для анализа баз данных с инцидентами/атаками/ вторжениями. В общем, для нашего случая это то, что доктор прописал, тем более что данная программа была разработана координационным центром CERT [11] как часть проекта AIRCERT [12]. ACID из себя представляет набор php-cкриптов, способных выполнять различные функции, в том числе начиная с формирования запросов на получение данных из БД аналогично тому, как это мы делали ранее, и заканчивая декодированием пакетов с целью их более удобного визуального восприятия и подсчётом статистических данных. Содержимое БД при этом может формироваться не только за счёт системы обнаружения атак, но также может пополняться данными с различных межсетевых экранов и средств сетевого мониторинга. Для того чтобы наглядно оценить удобство использования данного средства, необходимо также иметь какой-либо из установленных веб-серверов с поддержкой php, например, всё тот же apache. Плюс необходимо иметь несколько дополнительных средств, нужных для работы ACID: ADODB [13]; JpGraph [15]; PHPlot [16]; GD [17].
безопасность «ADODB – это абстрактный класс доступа к базам данных, написанный на PHP» [14]. «Для тех, кто в танке, поясню на примере. Предположим, вы написали скрипт под MySQL, и тут заказчик говорит вам, что хостинг меняется, и там есть только PostgreSQL. Если вы не использовали класс абстрактного доступа к базам данных, то вам пришлось бы: заменить весь код работы с MySQL на postgreSQL; переписать SQL-запросы (так как есть отличия). Если бы вы использовали абстрактный слой доступа к БД, то вам скорее всего не пришлось бы менять php-код (только в одном месте указали бы, что используете PostgreSQL) и изменить SQL-запросы (хотя иногда и это не понадобилось бы). Я намеренно в этом описании использовал фразу «абстрактный класс доступа к БД», поскольку ADODB – не единственный подобный класс. Наиболее известные конкуренты: Pear::DB и Pear::MDB» [14]. JpGraph – это графическая библиотека для PHP, значительно упрощающая рисование различных графиков и диаграмм, позволяющая это делать с минимумом кода. При этом можно рисовать как черновые наброски, так и очень точные графики, в том числе и с указанием необходимых погрешностей. PHPLOT – фактически то же самое, что и JpGraph, позволяет рисовать графики. Требует наличия библиотеки GD. GD – это библиотека ANSI C, необходимая для динамического создания картинок. GD может создавать картинки в различных форматах, в том числе в PNG и JPEG. (GD не поддерживает формат GIF.) Пробежав по разделам download вышеописанных продуктов, скачиваем последние стабильные версии и проверяем их хеши: ACID 0.9.6b23 [18] ADODB 3.94 [19] JpGraph 1.13 [20] PHPlot 4.4.6 [21] GD 2.0.15 [22] d8c49614393fa05ac140de349f57e438 78aac17c7fd1d0e0f6685153facb8c36 6ededf633b4fd054662ec123c7825fbb ad78bd1658e3983bb6afbc074f029698 8a5b34e09fa29f20e31814cbd8c0d0b5
acid-0.9.6b23.tar.gz adodb394.tgz gd-2.0.15.tar.gz jpgraph-1.13.tar.gz phplot-4.4.6.tar.gz
В именах директорий gd-2.0.15, phplot-4.4.6 убираем номера версий либо делаем мягкие ссылки на эти директории: # cd /var/www/html # mv gd-2.0.15 gd # mv phplot-4.4.6 phplot
или # cd /var/www/html # ln -s gd-2.0.15 gd # ln -s phplot-4.4.6 phplot
Напоминание: для работы ACID необходимо наличие установленных пакетов php и php-mysql (подробнее см. выше). Далее следует настроить ACID на работу с нашей БД и показать ему, куда мы скопировали дополнительные пакеты, для этого в файле /var/www/html/acid_conf.php необходимо изменить переменные: $DBlib_path = "../adodb"; $alert_dbname = "snort"; $alert_user = "snort"; $alert_password = "âàø_ïàðîëü¹1"; $ChartLib_path = "../jpgraph";
Остальные переменные проще настроить по мере необходимости, у большинства читателей это не должно вызвать проблем, так как ACID очень дружелюбен и почти всегда указывает, что и где надо править в случае, если ему что-то не нравится. Далее обратимся по адресу: http://localhost/acid/. При первом запуске ACID нам сообщит, что дополнительные таблицы, необходимые для его работы, не созданы:
Для их создания нам необходимо нажать на «Setup page». После чего у нас отобразится следующее окно:
Содержимое архивов помещаем в /var/www/html: # # # #
tar tar tar tar
-zxvf -zxvf -zxvf -zxvf
acid-0.9.6b23.tar.gz -C /var/www/html adodb394.tgz -C /var/www/html gd-2.0.15.tar.gz -C /var/www/html phplot-4.4.6.tar.gz -C /var/www/html
Для JpGraph создаём директорию /var/www/html/jpgraph и содержимое архивной поддиректории src из архива помещаем туда. # # # #
tar -zxvf jpgraph-1.13.tar.gz -C /var/www/html mkdir /var/www/html/jpgraph mv /var/www/html/jpgraph-1.13/src/* /var/www/html/jpgraph rm -rf /var/www/html/jpgraph-1.13
№11(12), ноябрь 2003
В котором следует нажать на кнопку «Create ACID AG». После её нажатия у нас отобразится окно:
71
безопасность нам пользователя acidviewer с меньшими правами. Сейчас мы доведём начатое до конца. Для начала скопируем acid: # cp -R /var/www/html/acid /var/www/html/acidviewer
Далее отредактируем файл /var/www/html/acidviewer/ acid_conf.php, заменив в нём: $alert_user = "snort"; $alert_password = "âàø_ïàðîëü¹1";
на $alert_user = "acidviewer"; $alert_password = "âàø_ïàðîëü¹3";
В первых строчках мы можем прочитать, что в нашей БД (snort) дополнительно были созданы четыре таблицы: acid_ag; acid_ag_alert; acid_ip_cache; acid_event. После этого Snort готов к работе. Либо нажимаем в конце этой страницы на «Main page», либо опять набираем адрес: http://localhost/acid/. Если у вас БД маленькая, то страница должна отобразиться сразу, если же БД у вас большая, например, более полугода, то тогда придётся подождать вплоть до нескольких минут. В конце у вас должна выводиться картинка, похожая на следующую:
Интерфейс и кнопки по удалению записей останутся, но при их активации будет выводиться сообщение с ошибкой о том, что у пользователя недостаточно прав для удаления. Создание данного аккаунта удобно тем, что вы можете его давать вашим знакомым администраторам или другим людям для просмотра с меньшей опасностью потерять записи в вашей БД. Обращаться к нему следует http://localhost/acidviewer/, естественно, вместо localhost следует писать ваш адрес. И второе, чтобы кто попало через веб-интерфейс не заходил к вам на сервер и не смотрел ваши данные в ACID, создадим пользователей с паролями на доступ к acid и acidviewer. Для этого создадим директорию, где будет храниться файл с паролями, например /usr/lib/apache/passwords. # mkdir /usr/lib/apache/passwords
Далее, если в этой директории у вас нет файла с паролями и таких пользователей, создадим файл и пользователей. Вначале это будет пользователь admin с паролем ваш_пароль№4. Пароль следует ввести после соответствующего приглашения. # htpasswd -c /usr/lib/apache/passwords/passwords admin
Опция «-c» означает create (создать файл), указывайте её, если у вас нет файла /usr/lib/apache/passwords/ passwords. Далее добавим второго пользователя view с паролем ваш_пароль№5: # htpasswd /usr/lib/apache/passwords/passwords view
Если это так, то вы правильно всё сделали. Далее советую вам сделать два необязательных, но полезных действия, а именно: создать ещё один адрес с правами только для просмотра и задать пароли на доступ для обоих. Во время работы с БД мы уже создали необходимого
72
Не забудьте про необходимую безопасность для вашего узла, задав соответствующие атрибуты файлу и директории, где он лежит, чтобы файл не был доступен любой программе и любому локальному пользователю. Затем необходимо внести правку в /etc/httpd/conf/ httpd.conf, дописав туда следующее: <Directory "/var/www/html/acid"> AuthType Basic AuthName "commentline1" AuthUserFile /usr/lib/apache/passwords/passwords Require user admin AllowOverride None
безопасность </Directory> <Directory "/var/www/html/acidviewer"> AuthType Basic AuthName "commentline2" AuthUserFile /usr/lib/apache/passwords/passwords Require user view AllowOverride None </Directory>
Замечание: следует внимательно посмотреть, в какую секцию вы дописываете эти строчки, и проследить за другими секциями, может случиться так, что дописывать их придётся несколько раз, каждый раз для своей секции. Иначе может возникнуть ситуация, когда, например, для http-доступа у вас пароль спрашиваться будет, а для https – нет, или наоборот. В переменной AuthName можно записать любую информацию, которая будет выдаваться пользователю при запросе пароля.
После внесения изменений в конфигурационный файл необходимо уведомить apache об этих изменениях, просто перезапустив его командой: # /etc/rc.d/init.d/httpd restart
Если после этого у вас при заходе запрашивается пароль (не забудьте сбросить кеш) и всё работает, то статья удалась и можно сказать, что дальнейшее изучение ACID лучше выполнить самостоятельно с помощью «метода научного тыка», щёлкая мышкой. Графический интуитивно понятный интерфейс не должен вызвать у вас затруднений.
№11(12), ноябрь 2003
В следующих статьях я попробую рассказать о некоторых особенностях работы и настройки Snort, в частности о возможности подключения нескольких сенсоров.
Литература, ссылки: 1. П. Закляков. Обнаружение атак: теория и практика, Snort. – //Журнал «Системный администратор» №10(11), октябрь 2003 г. – 48-67 с. 2. Раздел документации к Snort: http://www.Snort.org/docs/ 3. Snort Installation Manual on RedHat 7.3: http:// www.Snort.org/docs/Snort-rh7-mysql-ACID-1-5.pdf 4. Snort Installation Manual on RedHat 9.0: http:// www.Snort.org/docs/Snort_acid_rh9.pdf 5. Л.Аткинсон. MySQL. Библиотека профессионала: Пер. с англ. – М.: Издательский дом «Вильямс», 2002. 6. MySQL The World’s Most Popular Open Source Database: http://www.mysql.com/, раздел download http:// www.mysql.com/downloads/index.html 7. П.Дюбуа. Применение MySQL и Perl в Web-приложениях: Пер. с англ. – М.: Издательский дом «Вильямс», 2002. 8. phpMyAdmin – MySQL DB administration tool: http:// www.phpmyadmin.net 9. Ссылка на одно из зеркал, откуда можно скачать phpMyAdmin: http://unc.dl.sourceforge.net/sourceforge/ phpmyadmin/phpMyAdmin-2.5.4-php.tar.gz 10. Сайт ACID (Analysis Console for Intrusion Databases): http://acidlab.sourceforge.net/ 11. Сайт координационного центра CERT: http:// www.cert.org/ 12. ACID (часть проекта AIR-CERT): http://www.cert.org/kb/ acid/ 13. ADOdb Database Library for PHP: http://php.weblogs.com/ adodb 14. М.Матюхин. Абстрактный доступ к БД с помощью ADODB, http://detail.phpclub.net/2003-08-19.htm 15. JpGraph – OO Graph Library for PHP: http://www.aditus.nu/ jpgraph/ 16. PHPLOT: http://www.phplot.com/ 17. GD Graphics Library: http://www.boutell.com/gd/ 18. http://acidlab.sourceforge.net/acid-0.9.6b23.tar.gz 19. http://phplens.com/lens/dl/adodb394.tgz 20. http://members.chello.se/jpgraph/jpgdownloads/jpgraph1.13.tar.gz 21. http://ftp1.sourceforge.net/phplot/phplot-4.4.6.tar.gz 22. http://www.boutell.com/gd/http/gd-2.0.15.tar.gz
73
web
Любой действующий сайт нуждается в обновлении. От корпоративного «интернет-представительства» до частного фотоальбома. А значит перед любым разработчиком возникает проблема адаптации готовой или создания собственной системы управления сайтом.
АНДРЕЙ УВАРОВ ДМИТРИЙ ГОРЯИНОВ 76
web Такие системы существуют в виде коммерческих и свободно распространяемых «движков», такие системы создаются и будут создаваться веб-разработчиками на самых различных языках программирования. Практически никогда такие системы не создаются «за раз». Их совершенствуют, дорабатывают, наделяют новыми возможностями. Говоря другими словами, проблема управления сайтом рождает проблему обновления и сопровождения программного обеспечения. Не важно, на каком языке программирования вы пишете. Вы вынуждены переделывать свой или чужой код. Вы нарабатываете повторно используемые решения в виде модулей, классов, интерфейсов. Вы так или иначе приходите к использованию технологии в разработке своих проектов. Вот о технологии мы и поговорим. Fusebox – это технология создания веб-приложений, начавшаяся с небольших модулей и развившаяся до применимости в средних и больших информационных системах. Изначально Fusebox создавалась для платформы Coldfusion. Сейчас существуют реализации для PHP, J2EE, MS ASP и Lasso. Т.е. для её применения вам скорее всего не придется усаживаться за изучение нового языка программирования. Основные цели, преследуемые Fusebox: Читаемость кода; Структурность и законченность приложений (Applications); Наглядность кода программ; Упрощение проектного менеджмента; Защищённость кодов и проекта в целом; Утилизация кода; Создание портативных «Partapplications». Fusebox задумывалась как модульная технология создания веб-приложений. Пространство приложения определяется (задается) каталогом на веб-сервере. Fusebox-приложение состоит из трех основных компонентов: оператор выбора (switch), обработчик события (fuseaction) и подключаемые модули (fuse). Оператор выбора (switch) – это своеобразный менеджер задач – вся работа приложения ведется через него. Обращения к той или иной функции приложения (выбор) осуществляется в зависимости от переданного оператору значения параметра «fuseaction». Метод передачи параметра определяется Fusebox автоматически. Вы можете передать эту переменную методом POST или в строке запроса и быть уверенным, что ваша программа получит передаваемое значение. Таким образом, внутри оператора выбора описываются возможные значения параметра «fuseaction» и обработка (fuseaction) этого значения приложением: запуск соответствующего кода или подключение нужного модуля (fuse). Модуль может быть выполнимым сценарием или просто набором страниц. Теперь посмотрим все это на конкретном примере. В качестве платформы для реализации используем PHP. Предполагается, что у читателя установлен интерпретатор PHP. Создайте для примера подкаталог «fuse_sample» внутри корневой директории веб-сервера. Для пользователей веб-сервера Apache (<http://httpd.apache.org>) это по умолчанию каталог /usr/local/apache/htdocs или /var/www (этот параметр хранится в файле настроек httpd.conf и
№11(12), ноябрь 2003
называется ServerRoot), а для пользователей MS-IIS (<http://www.microsoft.com/iis>), скорее всего каталог C:\inetpub\wwwroot. Файлы Fusebox 3.0 for PHP: <http://www.fusebox.org/ index.cfm?&fuseaction=phpframework.default> (а так же для других реализаций) можно получить по интернет-адресу: < h t t p : / / w w w . f u s e b ox . o r g / i n d ex . c f m ? & f u s e a c t i o n = framework.languages>. Выбираем нужную нам ссылку («Fusebox 3.0 for PHP» <http://www.fusebox.org/index.cfm?& fuseaction=phpframework.default>). На следующей странице выбираем ссылку «Download Core Files». В индексном файле index.php описывается только одно действие – выбирается ядро Fusebox для использования. Нужное значение зависит от того, какую версию PHP вы используете. Если этого не происходит, то можно выбрать вручную, закомментировав соответствующие строки, или переименовать файл fbx_Fusebox3.0_PHP4.0.6.php или fbx_Fusebox3.0_PHP4.1.x.php в index.php. Мы создадим крайне простое приложение. Оно будет иметь нижнее навигационное меню для перемещения по страницам. На страницах мы будем выводить идентифицирующий страницу текст. Первым делом (помните основные компоненты приложения?) посмотрим на оператор-переключатель. Он описан в файле fbx_Switch.php. Изменим его первые две ветви («mainpage» и «Fuse-box.defaultFuseaction») на: switch($Fusebox["fuseaction"]) { case "mainpage": case "Fusebox.defaultFuseaction": include( "out_simple.php" ); break; default: //îñòàëüíîå ñîäåðæèìîå îñòàâèì áåç èçìåíåíèé
Создадим в том же каталоге (fuse_sample) скрипт out_simple.php следующего содержания: <?php echo"This is main page"; ?>
Замечание: никогда не ленитесь писать «<?php» при оформлении PHP-кода. И скрипт out_main.php, который будет отрабатывать по умолчанию: <html> <body> <table width="50%" border="1" cellpaddin="3" ↵ cellspacing="0" align="center"> <tr> <td colspan="0" align="center"> <h2>Sample application</h2> </td> </tr> <tr> <td width="100%" valign="top"> <?php echo $Fusebox[ "layout" ]; ?> </td> </tr> <tr> <td colspan="2"> <?php Module( "index.php", array( "fuseaction"=>"bar.menu", ↵ "stoplayout"=>"true" ) ); ?> </td> </tr> </table> </body> </html>
77
web Этот пример – простая и надуманная демонстрация работы технологии Fusebox. В реальном программировании не стоит вот так совмещать HTML- и PHP-коды. Да, язык PHP (и не только он) это позволяет и часто это преподносится как возможность быстро научиться писать простые сценарии. В начале статьи мы говорили о том, что одна из наших задач – обновление и сопровождение программного обеспечения. Так вот, подобная «мешанина» крайне сложно читается даже через пару месяцев. А использовать такое смешанное кодирование при групповой работе – непростительная потеря времени. Ну и еще один довод: разделив HTML- и PHP-коды с помощью любой системы шаблонов, мы заранее позаботимся о более легкой возможности сменить дизайн сайта. HTML-верстальщик сможет работать именно с HTMLчастью. А от программиста не потребуется переносить все изменения в верстке в код PHP-скриптов. В файле fbx_Settings.php изменим первое условие на: //In case no fuseaction was given, I'll set up one to use //by default if( !isset( $attributes[ "fuseaction" ] ) ) { $attributes["fuseaction"] = "home.mainpage"; }
Этим мы определим новое значение «по умолчанию» для параметра «fusecation». Далее мы пропишем в файле fbx_Circuits.php (описывает состав приложения) следующее: $Fusebox["circuits"]["home"] $Fusebox["circuits"]["bar"]
= "fuse_sample"; = "fuse_sample/bar";
Так мы создаём привязку к структуре каталогов нашего приложения. Основное приложение располагается в каталоге «fuse_sample», а его подприложение – «fuse_sample/bar». В файл fbx_Layouts.php пропишем: Â ôàéë fbx_Layouts.php ïðîïèøåì: if ( $attributes["stoplayout"] ) { $Fusebox["layoutFile"] = ""; $Fusebox["layoutDir"] = ""; } else { $Fusebox["layoutFile"] = "out_main.php"; $Fusebox["layoutDir"] = ""; }
Займемся подприложением. В каталоге «fuse_sample» создадим подкаталог «bar» и скопируем в него файлы fbx_Settings.php, fbx_Layouts.php, fbx_Switch.php. Сейчас наша цель – создать горизонтальное меню. Изменим содержимое файла fbx_Switch.php на следующее: switch($Fusebox["fuseaction"]) { case "mainpage": case "Fusebox.defaultFuseaction": echo "Bar's main page"; break; case "menu": $XFA[ "main" ] = "home.mainpage"; $XFA[ "bar1" ] = $Fusebox[ "thisCircuit" ] . ".bar1"; $XFA[ "bar2" ] = $Fusebox[ "thisCircuit" ] . ".bar2"; $XFA[ "bar3" ] = $Fusebox[ "thisCircuit" ] . ".bar3"; include( "out_barmenu.php" ); break; case "bar1":
78
echo "this is content of bar1"; break; case "bar2": echo "this is content of bar2"; break; case "bar3": echo "this is content of bar3"; break; default:
//îñòàëüíîå ñîäåðæèìîå îñòàâèì áåç èçìåíåíèé
Содержимое файла fbx_Layouts.php изменим на: $Fusebox["layoutFile"] $Fusebox["layoutDir"]
= ""; = "";
И наконец, создадим сам скрипт-меню out_barmenu.php: <?php echo '<center><strong>'; echo '<a href="index.php?fuseaction=home.mainpage"> ↵ Main</a> | '; echo '<a href="index.php?fuseaction='.$XFA[ "bar1" ].'"> ↵ Bar 1</a> | '; echo '<a href="index.php?fuseaction='.$XFA[ "bar2" ].'"> ↵ Bar 2</a> | '; echo '<a href="index.php?fuseaction='.$XFA[ "bar3" ].'"> ↵ Bar 3</a>'; echo '</strong></center>'; ?>
И наше простейшее приложение готово. В реальности все несколько сложнее, но принцип тот же. Fusebox и его компоненты – это каркас разработки, в него можно включать сколько угодно подчиненных приложений, работающих независимо. Так как все запросы к приложению в Fusebox совершаются через один-единственный файл, то целесообразно организовать перенаправление любых запросов пользователя на него. Это нужно для предотвращения попыток излишне любопытного пользователя обратиться к какому-то элементу нашего приложения напрямую (например, ввести в адресной строке браузера http://our_site/fuse_sample/ out_main.php). Для этого есть несколько способов. Если вы используете веб-сервер Apache, имеете возможность работы с файлами конфигурации доступа к директории (файлы .htaccess) и у вас установлен модуль Rewrite, это можно сделать следующим образом. Создайте в каталоге вашего приложения (fuse_sample) файл .htaccess следующего вида: RewriteEngine on Options +FollowSymlinks DirectoryIndex index.php RewriteBase /fuse_sample/ RewriteCond %{REQUEST_FILENAME} !(index.php) RewriteRule ^(.*)$ index.php [QSA,R]
Таким образом мы перенаправим все HTTP-запросы к подкаталогу fuse_sample на файл /fuse_sample/index.php. Подробности о модуле Rewrite и использовании директив перенаправления можно найти в документации к веб-серверу Apache. Подведем некоторые итоги. Применение технологии Fusebox позволяет разработчикам вести параллельную работу над программным продуктом, не мешая друг другу. А выделенные и наработанные в процессе модули-подзадачи легко встраиваются в новые проекты с той же архитектурой, облегчая повторное использование кода.
образование
80
образование В прошлых статьях этого цикла мы рассмотрели базовый математический аппарат, на который опираются коды РидаСоломона, и исследовали простейший кодер/декодер, способный исправлять одиночные ошибки и работающий с двумя символами четности. Для подавляющего большинства задач такой корректирующей способности оказывается катастрофически недостаточно, и тогда приходится задумываться о реализации более мощного кодера/декодера. Кодер/декодер, рассматриваемый в настоящей статье, чрезвычайно конфигурабелен и может быть настроен на работу с любым количеством символов четности, а это означает, что при разумной избыточности он способен исправлять любое мыслимое количество ошибок. Подобная универсальность не проходит даром, и конструкция такого декодера усложнятся более чем в сто (!) раз. Самостоятельное проектирование декодеров Рида-Соломона требует глубоких знаний высшей математики в целом и природы корректирующих кодов в частности, поэтому не смущайтесь, если данная статья поначалу вам покажется непонятной. Это действительно сложные вещи, не допускающие простого объяснения. С другой стороны, для практического использования корректирующих кодов можно и не вникать в их сущность, просто откомпилировав исходные тексты кодера/декодера Рида-Соломона, приведенные в данной статье. Также вы можете воспользоваться любой законченной библиотекой, поставляемой сторонними разработчиками. В качестве альтернативного примера в заключение этой статьи будет кратно описан интерфейс библиотеки ElByECC.DLL, разработанной компанией «Elaborate Bytes» и распространяемой вместе с популярным копировщиком Clone CD. Известнейший прожигатель дисков всех времен и народов Ahead Burning ROM имеет аналогичную библиотеку, размещенную в файле NEWTRF.DLL.
Легенда Напомним читателю основные условные обозначения, используемые в этой статье. Количество символов кодируемого сообщения (называемого также информационным словом) по общепринятому соглашению обозначается буквой k; полная длина кодового слова, включающего в себя кодируемые данные и символы четности, – n. Отсюда, количество символов четности равно: n – k. За максимальным количеством исправляемых ошибок «закреплена» буква t. Поскольку для исправления одной ошибки требуется два символа четности, общее количество символов четности равно 2t. Выражение RS(n, k) описывает определенную разновидность корректирующих кодов Рида-Соломона, оперирующую с n-символьными блоками, k-символов, из которых представляют полезные данные, а все остальные задействованы под символы четности. Полином, порожденный на основе примитивного члена α, называется порожденным или сгенерированным (generate) полиномом.
Кодировщик (encoder) Существует по меньшей мере два типа кодеров РидаСоломона: несистематические и систематические кодировщики.
№11(12), ноябрь 2003
Вычисление несистематических корректирующих кодов Рида-Соломона осуществляется умножением информационного слова на порожденный полином, в результате чего образуется кодовое слово, полностью отличающееся от исходного информационного слова, а потому для непосредственного употребления категорически непригодное. Для приведения полученных данных в исходный вид мы должны в обязательном порядке выполнить ресурсоемкую операцию декодирования, даже если данные не искажены и не требуют восстановления! При систематическом кодировании, напротив, исходное информационное слово останется неизменным, а корректирующие коды (часто называемые символами четности) добавляются в его конец, благодаря чему к операции декодирования приходится прибегать лишь в случае действительного разрушения данных. Вычисление несистематических корректирующих кодов РидаСоломона осуществляется делением информационного слова на порожденный полином. При этом все символы информационного слова сдвигаются на n – k байт влево, а на освободившееся место записывается 2t байт остатка (см. рис. 1). Поскольку рассмотрение обоих типов кодировщиков заняло бы слишком много места, сосредоточим свое внимание на одних лишь систематических кодерах как на наиболее популярных.
Ðèñóíîê 1. Óñòðîéñòâî êîäîâîãî ñëîâà
Архитектурно кодировщик представляет собой совокупность сдвиговых регистров (shift registers), объединенных посредством сумматоров и умножителей, функционирующих по правилам арифметики Галуа. Сдвиговый регистр (иначе называемый регистром сдвига) представляет последовательность ячеек памяти, называемых разрядами, каждый из которых содержит один элемент поля Галуа GF(q). Содержащийся в разряде символ, покидая этот разряд, «выстреливается» на выходную линию. Одновременно с этим разряд «засасывает» символ, находящийся на его входной линии. Замещение символов происходит дискретно, в строго определенные промежутки времени, называемые тактами. При аппаратной реализации сдвигового регистра его элементы могут быть объединены как последовательно, так и параллельно. При последовательном объединении пересылка одного m-разрядного символа потребуем mтактов, в то время как при параллельном она осуществляется всего за один такт. Низкая эффективность программных реализаций кодеров Рида-Соломона объясняется тем, что разработчик не может осуществлять параллельное объединение элементов сдвигового регистра и вынужден работать с той шириной разрядности, которую «навязывает» архитектура данной машины. Однако создать 4-элементный 8-битный регистр сдвига параллельного типа на процессорах семейства IA32 вполне реально.
81
образование Цепи, основанные на регистрах сдвига, обычно называют фильтрами. Блок-схема фильтра, осуществляющего деление полинома на константу, приведена на рис. 2. Пусть вас не смущает тот факт, что деление реализуется посредством умножения и сложения. Данный прием базируется на вычислении системы двух рекуррентных равенств:
* íà îñíîâå èñõîäíûõ òåêñòîâ * Simon Rockliff, îò 26.06.1991, * ðàñïðîñòðàíÿåìûõ ïî ëèöåíçèè GNU –––––––––––––––––––––––––––––––––––––––––––––––––––––––––*/ encode_rs() { int i, j; int feedback; // èíèöèàëèçèðóåì ïîëå áèò ÷åòíîñòè íóëÿìè for (i = 0; i < n - k; i++) b[i] = 0; // îáðàáàòûâàåì âñå ñèìâîëû // èñõîäíûõ äàííûõ ñïðàâà íàëåâî for (i = k - 1; i >= 0; i--) { // ãîòîâèì (data[i] + b[n – k –1]) ê óìíîæåíèþ // íà g[i], ò.å. ñêëàäûâàåì î÷åðåäíîé «çàõâà÷åííûé» // ñèìâîë èñõîäíûõ äàííûõ ñ ìëàäøèì ñèìâîëîì áèòîâ // ÷åòíîñòè (ñîîòâåòñòâóþùåãî «ðåãèñòðó» b2t-1, // ñì. ðèñ. 2) è ïåðåâîäèì åãî â èíäåêñíóþ ôîðìó, // ñîõðàíÿÿ ðåçóëüòàò â ðåãèñòðå feedback, êàê ìû // óæå ãîâîðèëè, ñóììà äâóõ èíäåêñîâ åñòü // ïðîèçâåäåíèå ïîëèíîìîâ feedback = index_of[data[i] ^ b[n – k - 1]];
Ôîðìóëà 1. Äåëåíèå ïîëèíîìà íà êîíñòàíòó ïîñðåäñòâîì óìíîæåíèÿ è ñëîæåíèÿ
Здесь: Q(r)(x) и R(r)(x) – соответственно частное и остаток на r-шаге рекурсии. Поскольку сложение и вычитание, выполняемое по модулю два, тождественны друг другу, для реализации делителя нам достаточно иметь всего два устройства – устройство сложения и устройство умножения, а без устройства вычитания можно обойтись. После n-сдвигов на выходе регистра появляется частное, а в самом регистре окажется остаток, который и представляет собой рассчитанные символы четности (они же – коды Рида-Соломона), а коэффициенты умножения с g0 по g(2t – 1) напрямую соответствуют коэффициентам умножения порожденного полинома.
// åñòü åùå ñèìâîëû äëÿ îáðàáîòêè? if (feedback != -1) { // îñóùåñòâëÿåì ñäâèã öåïè bx-ðåãèñòðîâ for (j=n-k-1; j>0; j--) // åñëè òåêóùèé êîýôôèöèåíò g – // ýòî äåéñòâèòåëüíûé (ò.å. íåíóëåâîé // êîýôôèöèåíò, òî óìíîæàåì feedback // íà ñîîòâåòñòâóþùèé g-êîýôôèöèåíò // è ñêëàäûâàåì åãî ñî ñëåäóþùèì // ýëåìåíòîì öåïî÷êè if (g[j]!=-1) ↵ b[j]=b[j-1]^alpha_to[(g[j]+feedback)%n]; else // åñëè òåêóùèé êîýôôèöèåíò g – // ýòî íóëåâîé êîýôôèöèåíò, // âûïîëíÿåì îäèí ëèøü ñäâèã // áåç óìíîæåíèÿ, ïåðåìåùàÿ ñèìâîë // èç îäíîãî m-ðåãèñòðà â äðóãîé b[j] = b[j-1]; // çàêîëüöîâûâàåì âûõîäÿùèé ñèìâîë â êðàéíèé // ëåâûé b0-ðåãèñòð b[0] = alpha_to[(g[0]+feedback)%n]; } else {
Ðèñóíîê 2. Óñòðîéñòâî ïðîñòåéøåãî êîäåðà Ðèäà-Ñîëîìîíà
Простейший пример программной реализации такого фильтра приведен ниже. Это законченный кодер РидаСоломона, вполне пригодный для практического использования. Конечно, при желании его можно было бы и улучшить, но тогда неизбежно пострадала бы наглядность и компактность листинга. Ëèñòèíã 1. Èñõîäíûé òåêñò ïðîñòåéøåãî êîäåðà Ðèäà-Ñîëîìîíà /*-------------------------------------------------------* * êîäèðîâùèê Ðèäà-Ñîëîìîíà * ======================== * * êîäèðóåìûå äàííûå ïåðåäàþòñÿ ÷åðåç ìàññèâ data[i], * ãäå i=0..(k-1), à ñãåíåðèðîâàííûå ñèìâîëû ÷åòíîñòè * çàíîñÿòñÿ â ìàññèâ b[0]..b[2*t-1]. * Èñõîäíûå è ðåçóëüòèðóþùèå äàííûå äîëæíû áûòü ïðåäñòàâëåíû * â ïîëèíîìèàëüíîé ôîðìå (ò.å. â îáû÷íîé ôîðìå ìàøèííîãî * ïðåäñòàâëåíèÿ äàííûõ). * Êîäèðîâàíèå ïðîèçâîäèòñÿ ñ èñïîëüçîâàíèåì ñäâèãîâîãî * feedback-ðåãèñòðà, çàïîëíåííîãî ñîîòâåòñòâóþùèìè ýëåìåíòàìè * ìàññèâà g[] ñ ïîðîæäåííûì ïîëèíîìîì âíóòðè, ïðîöåäóðà * ãåíåðàöèè êîòîðîãî óæå îáñóæäàëàñü â ïðåäûäóùåé ñòàòüå. * Ñãåíåðèðîâàííîå êîäîâîå ñëîâî îïèñûâàåòñÿ ñëåäóþùåé * ôîðìóëîé: * ñ(x) = data(x)*x(n-k) + b(x) *
82
// äåëåíèå çàâåðøåíî, // îñóùåñòâëÿåì ïîñëåäíèé ñäâèã ðåãèñòðà, // íà âûõîäå ðåãèñòðà áóäåò ÷àñòíîå, êîòîðîå // òåðÿåòñÿ, à â ñàìîì ðåãèñòðå – èñêîìûé // îñòàòîê for (j = n-k-1; j>0; j--) b[j] = b[j-1] ;
b[0] = 0; } } }
Декодер (decoder) Декодирование кодов Рида-Соломона представляет собой довольно сложную задачу, решение которой выливается в громоздкий, запутанный и чрезвычайно ненаглядный программный код, требующий от разработчика обширных знаний во многих областях высшей математики. Типовая схема декодирования, получившая название авторегрессионого спектрального метода декодирования, состоит из следующих шагов: вычисления синдрома ошибки (синдромный декодер); построения полинома ошибки, осуществляемое либо посредством высокоэффективного, но сложно реализуемого алгоритма Берлекэмпа-Месси, либо посредством простого, но медленного Евклидового алгоритма;
образование нахождения корней данного полинома, обычно реша
ющееся лобовым перебором (алгоритм Ченя); определения характера ошибки, сводящееся к построению битовой маски, вычисляемой на основе обращения алгоритма Форни или любого другого алгоритма обращения матрицы; наконец, исправления ошибочных символов путем наложения битовой маски на информационное слово и последовательного инвертирования всех искаженных бит через операцию XOR.
Следует отметить, что данная схема декодирования не единственная и, вероятно, даже не самая лучшая, но зато универсальная. Всего же существует около десятка различных схем декодирования абсолютно не похожих друг на друга и выбираемых в зависимости от того, какая часть декодера реализуется программно, а какая аппаратно.
вокупность признаков и/или симптомов, характеризующих заболевание). Принятое кодовое слово v с компонентами vi = ci + ei, где i = 0, … n – 1, представляет собой сумму кодового слова c и вектора ошибок e. Цель декодирования состоит в очистке кодового слова от вектора ошибки, описываемого полиномом синдрома и вычисляемого по формуле Sj = v(α j + j0 – 1), где j изменяется от 1 до 2t, а α представляет собой примитивный член «альфа», который мы уже обсуждали в предыдущей статье. Да, мы снова выражаем функцию деления через умножение, поскольку деление – крайне неэффективная в смысле производительности операция. Блок-схема устройства, осуществляющего вычисление синдрома, приведена на рис. 4. Как видно, она представляет собой типичный фильтр (сравните ее со схемой рис. 2), а потому ни в каких дополнительных пояснениях не нуждается.
Ðèñóíîê 4. Áëîê-ñõåìà öåïè âû÷èñëåíèÿ ñèíäðîìà
Вычисление синдрома ошибки происходит итеративно, так что вычисление результирующего полинома (также называемого ответом от английского «answer») завершается непосредственно в момент прохождения последнего символа четности через фильтр. Всего требуется 2t циклов «прогона» декодируемых данных через фильтр, – по одному прогону на каждый символ результирующего полинома. Пример простой программной реализации синдромного декодера содержится в листинге 2, и он намного нагляднее его словесного описания.
Полином локатора ошибки
Ðèñóíîê 3. Ñõåìà àâòîðåãðåññèîííîãî ñïåêòðàëüíîãî äåêîäåðà êîððåêòèðóþùèõ êîäîâ Ðèäà-Ñîëîìîíà
Синдромный декодер Грубо говоря, синдром есть остаток деления декодируемого кодового слова c(x) на порожденный полином g(x), и, если этот остаток равен нулю, кодовое слово считается неискаженным. Ненулевой остаток свидетельствует о наличии по меньшей мере одной ошибки. Остаток от деления дает многочлен, не зависящий от исходного сообщения и определяемый исключительно характером ошибки (syndrome – греческое слово, обозначающее со-
№11(12), ноябрь 2003
Полученный синдром описывает конфигурацию ошибки, но еще не говорит нам, какие именно символы полученного сообщения были искажены. Действительно, степень синдромного полинома, равная 2t, много меньше степени полинома сообщения, равной n, и между их коэффициентами нет прямого соответствия. Полином, коэффициенты которого напрямую соответствуют коэффициентам искаженных символов, называется полиномом локатора ошибки и по общепринятому соглашению обозначается греческой буквой Λ (лямбда). Если количество искаженных символов не превышает t, между синдромом и локатором ошибки существует следующее однозначное соответствие, выражаемое следующей формулой НОД[xn-1, E(x)] = Λ(x), и вычисление локатора сводится к задаче нахождения наименьшего общего делителя, успешно решенной еще Евклидом и элементарно реализуемой как на программном, так и на аппаратном уровне. Правда, за простоту реализации нам
83
образование приходится расплачиваться производительностью, точнее непроизводительностью данного алгоритма, и на практике обычно применяют более эффективный, но и более сложный для понимания алгоритм Берлекэмпа-Месси (Berlekamp-Massy), подробно описанный Кнутом во втором томе «Искусства программирования» (см. также «Теория и практика кодов, контролирующих ошибки» Блейхута) и сводящийся к задаче построения цепи регистров сдвига с линейной обратной связью и по сути своей являющегося разновидностью авторегрессионого фильтра, множители в векторах которого и задают полином Λ. Декодер, построенный по такому алгоритму, требует не более 3t операций умножения в каждой из итерации, количество которых не превышает 2t. Таким образом, решение поставленной задачи укладывается всего в 6t2 операций умножения. Фактически поиск локатора сводится к решению системы из 2t уравнений – по одному уравнению на каждый символ синдрома – c t неизвестными. Неизвестные члены и есть позиции искаженных символов в кодовом слове v. Легко видеть, если количество ошибок превышает t, система уравнений становится неразрешима и восстановить разрушенную информацию в этом случае не представляется возможным. Блок-схема алгоритма Берлекэмпа-Месси приведена на рис. 5, а его законченная программа реализация содержится в листинге 2.
(Chien search), аналогичная по своей природе обратному преобразованию Фурье и фактически сводящаяся к тупому перебору (brute force, exhaustive search) всех возможных вариантов. Все 2m возможных символов один за другим подставляются в полином локатора в порядке социалистической очереди и затем выполняется расчет полинома. Если результат обращается в ноль – считается, что искомые корни найдены.
Восстановление данных Итак, мы знаем, какие символы кодового слова искажены, но пока еще не готовы ответить на вопрос: как именно они искажены. Используя полином синдрома и корни полинома локатора, мы можем определить характер разрушений каждого из искаженных символов. Обычно для этой цели используется алгоритм Форни (Forney), состоящий из двух стадий: сначала путем свертки полинома синдрома полиномом локатора Λ мы получаем некоторый промежуточный полином, условно обозначаемый греческой буквой Ω. Затем на основе Ω-полинома вычисляется нулевая позиция ошибки (zero error location), которая в свою очередь делится на производную от Λ-полинома. В результате получается битовая маска, каждый из установленных битов которой соответствует искаженному биту и для восстановления кодового слова в исходный вид все искаженные биты должны быть инвертированы, что осуществляется посредством логической операции XOR. На этом процедура декодирования принятого кодового слова считается законченной. Остается отсечь n – k символов четности, и полученное информационное слово готово к употреблению.
Исходный текст декодера Ниже приводится исходный текст полноценного декодера Рида-Соломона, снабженный минимально разумным количеством комментариев. К сожалению, в рамках журнальной статьи подробное комментирование кода декодера невозможно, поскольку потребовало бы очень много места. При возникновении трудностей в анализе этого листинга обращайтесь к блок-схемам, приведенным на рис. 3, 4 и 5 – они помогут. Ëèñòèíã 2. Èñõîäíûé òåêñò ïðîñòåéøåãî äåêîäåðà Ðèäà-Ñîëîìîíà
Ðèñóíîê 5. Ñòðóêòóðíàÿ ñõåìà àëãîðèòìà Áåðëåêýìïà-Ìåññè
Корни полинома Коль скоро полином локатора ошибки нам известен, его корни определяют местоположение искаженных символов в принятом кодовом слове. Остается эти корни найти. Чаще всего для этого используется процедура Ченя
84
/*-------------------------------------------------------* * äåêîäåð Ðèäà-Ñîëîìîíà * ===================== * * Ïðîöåäóðà äåêîäèðîâàíèÿ êîäîâ Ðèäà-Ñîëîìîíà ñîñòîèò * èç íåñêîëüêèõ øàãîâ: ñíà÷àëà ìû âû÷èñëÿåì 2t-ñèìâîëüíûé * ñèíäðîì ïóòåì ïîñòàíîâêè alpha**i â recd(x), ãäå recd – * ïîëó÷åííîå êîäîâîå ñëîâî, ïðåäâàðèòåëüíî ïåðåâåäåííîå * â èíäåêñíóþ ôîðìó. Ïî ôàêòó âû÷èñëåíèÿ recd(x) ìû çàïèñûâàåì * î÷åðåäíîé ñèìâîë ñèíäðîìà â s[i], ãäå i ïðèíèìàåò çíà÷åíèå * îò 1 äî 2t, îñòàâëÿÿ s[0] ðàâíûì íóëþ. Çàòåì, èñïîëüçóÿ * èòåðàòèâíûé àëãîðèòì Áåðëåêýìïà, ìû íàõîäèì ïîëèíîì ëîêàòîðà * îøèáêè – elp[i]. Åñëè ñòåïåíü elp ïðåâûøàåò ñîáîé âåëè÷èíó * t, ìû áåññèëüíû ñêîððåêòèðîâàòü âñå îøèáêè è îãðàíè÷èâàåìñÿ * âûâîäîì ñîîáùåíèÿ î íåóñòðàíèìîé îøèáêå, ïîñëå ÷åãî * ñîâåðøàåì àâàðèéíûé âûõîä èç äåêîäåðà. Åñëè æå ñòåïåíü elp * íå ïðåâûøàåò t, ìû ïîäñòàâëÿåì alpha**i, ãäå i = 1..n â elp * äëÿ âû÷èñëåíèÿ êîðíåé ïîëèíîìà. Îáðàùåíèå íàéäåííûõ * êîðíåé äàåò íàì ïîçèöèè èñêàæåííûõ ñèìâîëîâ.
образование * Åñëè êîëè÷åñòâî îïðåäåëåííûõ ïîçèöèé èñêàæåííûõ ñèìâîëîâ * ìåíüøå ñòåïåíè elp, èñêàæåíèþ ïîäâåðãëîñü áîëåå ÷åì t * ñèìâîëîâ è ìû íå ìîæåì âîññòàíîâèòü èõ. Âî âñåõ îñòàëüíûõ * ñëó÷àÿõ âîññòàíîâëåíèå îðèãèíàëüíîãî ñîäåðæèìîãî èñêàæåííûõ * ñèìâîëîâ âïîëíå âîçìîæíî.  ñëó÷àå, êîãäà êîëè÷åñòâî îøèáîê * çàâåäîìî âåëèêî, äëÿ èõ èñïðàâëåíèÿ äåêîäèðóåìûå ñèìâîëû * ïðîõîäÿò ñêâîçü äåêîäåð áåç êàêèõ-ëèáî èçìåíåíèé. * * íà îñíîâå èñõîäíûõ òåêñòîâ * Simon Rockliff, îò 26.06.1991, * ðàñïðîñòðàíÿåìûõ ïî ëèöåíçèè GNU –––––––––––––––––––––––––––––––––––––––––––––––––––––––––*/ decode_rs() { int i, j, u, q; int s[n-k+1]; // ïîëèíîì ñèíäðîìà îøèáêè int elp[n – k + 2][n - k]; // ïîëèíîì ëîêàòîðà îøèáêè // ëÿìáäà int d[n-k+2]; int l[n-k+2]; int u_lu[n-k+2], int count=0, syn_error=0, root[t], loc[t], z[t+1], ↵ err[n], reg[t+1];
elp[1][i] = 0; // ïîëèíîìèàëüíàÿ ôîðìà } l[0] = 0; l[1] = 0; u_lu[0] = -1; u_lu[1] = 0; u = 0; do { u++; if (d[u] == -1) { l[u + 1] = l[u]; for (i = 0; i <= l[u]; i++) { elp[u+1][i] = elp[u][i]; elp[u][i] = index_of ↵ [elp[u][i]]; } } else { // ïîèñê ñëîâ ñ íàèáîëüøèì u_lu[q], // òàêèõ ÷òî d[q]!=0 q = u - 1; while ((d[q] == -1) && (q>0)) q--;
// ïåðåâîäèì ïîëó÷åííîå êîäîâîå ñëîâî â èíäåêñíóþ ôîðìó // äëÿ óïðîùåíèÿ âû÷èñëåíèé for (i = 0; i < n; i++) recd[i] = index_of[recd[i]];
// íàéäåí ïåðâûé íåíóëåâîé d[q] if (q > 0) { j=q ; do { j-- ; if ((d[j]!=-1) && ↵ (u_lu[q]<u_lu[j])) q = j ; } while (j>0);
// âû÷èñëÿåì ñèíäðîì //----------------------------------------------------for (i = 1; i <= n - k; i++) { s[i] = 0; // èíèöèàëèçàöèÿ s-ðåãèñòðà // (íà åãî âõîä ïî óìîë÷àíèþ // ïîñòóïàåò íîëü) }; // âûïîëíÿåì s[i] += recd[j]*ij // ò.å. áåðåì î÷åðåäíîé ñèìâîë äåêîäèðóåìûõ äàííûõ, // óìíîæàåì åãî íà ïîðÿäêîâûé íîìåð äàííîãî // ñèìâîëà, óìíîæåííûé íà íîìåð î÷åðåäíîãî îáîðîòà // è ñêëàäûâàåì ïîëó÷åííûé ðåçóëüòàò ñ ñîäåðæèìûì // s-ðåãèñòðà ïî ôàêòó èñ÷åðïàíèÿ âñåõ äåêîäèðóåìûõ // ñèìâîë, ìû ïîâòîðÿåì âåñü öèêë âû÷èñëåíèé îïÿòü – // ïî îäíîìó ðàçó äëÿ êàæäîãî ñèìâîëà ÷åòíîñòè for (j=0; j<n; j++) if (recd[j]!=-1) ↵ s[i]^= alpha_to[(recd[j]+i*j)%n]; if (s[i]!=0) syn_error=1;
// // // //
åñëè ñèíäðîì íå ðàâåí íóëþ, âçâîäèì ôëàã îøèáêè
// ïðåîáðàçóåì ñèíäðîì èç ïîëèíîìèàëüíîé ôîðìû // â èíäåêñíóþ s[i] = index_of[s[i]]; } // êîððåêöèÿ îøèáîê //----------------------------------------------------if (syn_error) // åñëè åñòü îøèáêè, ïûòàåìñÿ // èõ ñêîððåêòèðîâàòü { // âû÷èñëåíèå ïîëèíîìà ëîêàòîðà ëÿìáäà //---------------------------------------------// âû÷èñëÿåì ïîëèíîì ëîêàòîðà îøèáêè ÷åðåç // èòåðàòèâíûé àëãîðèòì Áåðëåêýìïà. Ñëåäóÿ // òåðìèíîëîãèè Lin and Costello (ñì. "Error // Control Coding: Fundamentals and Applications" // Prentice Hall 1983 ISBN 013283796) d[u] // ïðåäñòàâëÿåò ñîáîé µ («ìþ»), âûðàæàþùóþ // ðàñõîæäåíèå (discrepancy), ãäå u = µ + 1 è µ // åñòü íîìåð øàãà èç äèàïàçîíà îò –1 äî 2t. // Ó Áëåéõóòà òà æå ñàìàÿ âåëè÷èíà îáîçíà÷àåòñÿ // ∆(x) («äåëüòà») è íàçûâàåòñÿ íåâÿçêîé. // l[u] ïðåäñòàâëÿåò ñîáîé ñòåïåíü elp äëÿ äàííîãî // øàãà èòåðàöèè, u_l[u] ïðåäñòàâëÿåò ñîáîé // ðàçíèöó ìåæäó íîìåðîì øàãà è ñòåïåíüþ elp, // èíèöèàëèçèðóåì ýëåìåíòû òàáëèöû d[0] = 0; // èíäåêñíàÿ ôîðìà d[1] = s[1]; // èíäåêñíàÿ ôîðìà elp[0][0] = 0; // èíäåêñíàÿ ôîðìà elp[1][0] = 1; // ïîëèíîìèàëüíàÿ ôîðìà for (i = 1; i < n - k; i++) { elp[0][i] = -1; // èíäåêñíàÿ ôîðìà
№11(12), ноябрь 2003
// // // if
êàê òîëüêî ìû íàéäåì q, òàêîé ÷òî d[u]!=0 è u_lu[q] åñòü ìàêñèìóì çàïèøåì ñòåïåíü íîâîãî elp ïîëèíîìà (l[u] > l[q]+u-q) l[u+1] = l[u]; else ↵ l[u+1] = l[q]+u-q;
// ôîðìèðóåì íîâûé elp(x) for (i = 0; i < n - k; i++) elp[u+1][i] = 0; for (i = 0; i <= l[q]; i++) if (elp[q][i]!=-1) elp[u+1][i+u-q]=alpha_to ↵ [(d[u]+n-d[q]+elp[q][i])%n]; for (i=0; i<=l[u]; i++) { elp[u+1][i] ^= elp[u][i]; // ïðåîáðàçóåì ñòàðûé elp // â èíäåêñíóþ ôîðìó elp[u][i] = index_of[elp[u][i]]; } } u_lu[u+1] = u-l[u+1]; // ôîðìèðóåì (u + 1) íåâÿçêó //---------------------------------------------if (u < n-k) // íà ïîñëåäíåé èòåðàöèè ðàñõîæäåíèå { // íå áûëî îáíàðóæåíî if (s[u + 1]!=-1) d[u+1] = alpha_to[s[u+1]]; ↵ else d[u + 1] = 0; for (i = 1; i <= l[u + 1]; i++) if ((s[u + 1 - i] != -1) && ↵ (elp[u + 1][i]!=0)) d[u+1] ^= alpha_to[(s[u+1-i] ↵ +index_of[elp[u+1][i]])%n]; // ïåðåâîäèì d[u+1] â èíäåêñíóþ ôîðìó d[u+1] = index_of[d[u+1]]; } } while ((u < n-k) && (l[u+1]<=t)); // ðàñ÷åò ëîêàòîðà çàâåðøåí //----------------------------------------------------u++ ; if (l[u] <= t) { // êîððåêöèÿ îøèáîê âîçìîæíà
85
образование q+=index_of[1^alpha_to[(loc[j]+root[i])%n]];
// ïåðåâîäèì elp â èíäåêñíóþ ôîðìó for (i = 0; i <= l[u]; i++) elp[u][i] = ↵ index_of[elp[u][i]];
q = q % n; err[loc[i]] = alpha_to ↵ [(err[loc[i]]-q+n)%n]; // recd[i] äîëæåí áûòü // â ïîëèíîìèàëüíîé ôîðìå recd[loc[i]] ^= err[loc[i]];
// íàõîæäåíèå êîðíåé ïîëèíîìà ëîêàòîðà îøèáêè //---------------------------------------------for (i = 1; i <= l[u]; i++) reg[i] = elp[u][i]; ↵ count = 0;
} } }
for (i = 1; i <= n; i++) { q = 1 ; for (j = 1; j <= l[u]; j++) if (reg[j] != -1) { reg[j] = (reg[j]+j)%n; q ^= alpha_to[reg[j]]; }
else {
// ïåðåâîäèì recd[] â ïîëèíîìèàëüíóþ ôîðìó for (i=0; i<n; i++) if (recd[i]!=-1) recd[i] = alpha_to[recd[i]]; else recd[i] = 0; // âûâîäèì èíôîðìàöèîííîå // ñëîâî êàê åñòü
if (!q) { // çàïèñûâàåì êîðåíü è èíäåêñ // ïîçèöèè îøèáêè root[count] = i; loc[count] = n-i; count++; }
} else
// íåò êîðíåé – ñòåïåíü // elp < t îøèáîê
// ôîðìèðóåì ïîëèíîì z(x) for (i = 1; i <= l[u]; i++) // Z[0] âñåãäà // ðàâíî 1 { if ((s[i]!=-1) && (elp[u][i]!=-1)) z[i] = alpha_to[s[i]] ^ ↵ alpha_to[elp[u][i]]; else if ((s[i]!=-1) && ↵ (elp[u][i]==-1)) z[i] = alpha_to[s[i]]; else if ((s[i]==-1) && ↵ (elp[u][i]!=-1)) z[i] = ↵ alpha_to[elp[u][i]]; else z[i] = 0 ; for (j=1; j<i; j++) if ((s[j]!=-1) && (elp[u][i-j]!=-1)) z[i] ^= alpha_to[(elp[u] ↵ [i-j] + s[j])%n]; // ïåðåâîäèì z[i] â èíäåêñíóþ ôîðìó z[i] = index_of[z[i]]; } // âû÷èñëåíèå çíà÷åíèÿ îøèáîê â ïîçèöèÿõ loc[i] //---------------------------------------------for (i = 0; i<n; i++) { err[i] = 0; // ïåðåâîäèì recd[] â ïîëèíîìèàëüíóþ ôîðìó if (recd[i]!=-1) recd[i] = alpha_to[recd[i]]; ↵ else recd[i] = 0; } // ñíà÷àëà âû÷èñëÿåì ÷èñëèòåëü îøèáêè for (i = 0; i < l[u]; i++) { err[loc[i]] = 1; for (j=1; j<=l[u]; j++) if (z[j]!=-1) err[loc[i]] ^= alpha_to ↵ [(z[j]+j*root[i])%n]; if (err[loc[i]]!=0) { err[loc[i]] = index_of[err[loc[i]]]; q = 0 ;// ôîðìèðóåì çíàìåíàòåëü // êîýôôèöèåíòà îøèáêè for (j=0; j<l[u]; j++) if (j!=i)
86
// ñòåïåíü elp > t, // ðåøåíèå íåâîçìîæíî
{ // ïåðåâîäèì recd[] â ïîëèíîìèàëüíóþ ôîðìó for (i=0; i<n; i++) if (recd[i]!=-1) recd[i] = alpha_to[recd[i]] ; else recd[i] = 0 ; // âûâîäèì èíôîðìàöèîííîå // ñëîâî êàê åñòü } else // îøèáîê íå îáíàðóæåíî for (i=0;i<n;i++) if(recd[i]!=-1)recd[i]=alpha_to[recd[i]]; ↵ else recd[i]=0;
} if (count == l[u]) {
// íåò êîðíåé, // ðåøåíèå ñèñòåìû óðàâíåíèé íåâîçìîæíî, // ò.ê. ñòåïåíü elp >= t
}
Интерфейс с библиотекой ElByECC.DLL Программная реализация кодера/декодера Рида-Соломона, приведенная в листингах 1, 2, достаточно наглядна, но крайне непроизводительна и нуждается в оптимизации. Как альтернативный вариант можно использовать готовые библиотеки от сторонних разработчиков, входящие в состав программных комплексов, так или иначе связанных с обработкой корректирующих кодов Рида-Соломона. Это и утилиты прожига/копирования/восстановления лазерных дисков, и драйвера ленточных накопителей (от стримера до Арвида), и различные телекоммуникационные комплексы и т. д. Как правило, все эти библиотеки являются неотъемлемой частью самого программного комплекса и потому никак не документируется. Причем восстановление прототипов интерфейсных функций представляет весьма нетривиальную задачу, требующую от исследователя не только навыков дизассемблирования, но и знаний высшей математики, иначе смысл всех битовых манипуляций останется совершенно непонятным. Насколько законно подобное дизассемблирование? Да, дизассемблирование сторонних программных продуктов действительно запрещено, но тем не менее оно законно. Здесь уместно провести аналогию со вскрытием пломб вашего телевизора, влекущее потерю гарантии, но отнюдь не приводящее к уголовному преследованию. Также никто не запрещает вызывать функции чужой библиотеки из своей программы. Нелегально распространять эту библиотеку в составе вашего программного обеспечения действительно нельзя, но что мешает вам попросить пользователя установить данную библиотеку самостоятельно?
образование Ниже приводится описание важнейших функций библиотеки ElByECC.DLL, входящей в состав известного копировщика защищенных лазерных дисков Clone CD, условно-бесплатную копию которого можно скачать c cайта: http://www.elby.ch/. Сам Clone CD проработает всего лишь 21 день, а затем потребует регистрации, однако на продолжительность использования библиотеки ElByECC.DLL не наложено никаких ограничений. Моими усилиями был создан h-файл, содержащий прототипы основных функций библиотеки ElByECC.DLL, специальная редакция которого была любезно предоставлена для журнала «Системный администратор». Несмотря на то, что библиотека ElByECC.DLL ориентирована на работу с секторами лазерных дисков, она может быть приспособлена и для других целей, например, построения отказоустойчивых дисковых массивов, о которых говорилось в предыдущей статье. Краткое описание основных функций библиотеки приводится ниже.
userdata_src – указатель на 2048-байтовый блок пользо-
вательских данных, для которых необходимо выполнить расчет корректирующих кодов. Сами пользовательские данные в процессе выполнения функции остаются неизменными и автоматически копируются в буфер целевого сектора, где к ним добавляется 104 + 172 байт четности и 4 байта контрольной суммы. header_src – указатель на 4-байтовый блок, содержащий заголовок сектора. Первые три байта занимает абсолютный адрес, записанный в BCD-форме, а четвертый байт отвечает за тип сектора, которому необходимо присвоить значение 1, соответствующий режиму «корректирующие коды задействованы». raw_sector_mode1_dst – указатель на 2352-байтовый блок, в который будет записан сгенерированный сектор, содержащий 2048-байт пользовательских данных и 104+172 байт корректирующих кодов вместе с 4 байтами контрольной суммы и представленный следующей структурой: Ëèñòèíã 5. Ñòðóêòóðà ñûðîãî ñåêòîðà
Подключение библиотеки ElByECC.DLL к своей программе Существуют по меньшей мере два способа подключения динамических библиотек к вашим программам. При динамической компоновке адреса требуемых функций определяются посредством вызова GetProcAddress, причем сама библиотека ElByECC.DLL должна быть предварительно загружена через LoadLibrary. Это может выглядеть, например, так (обработка ошибок для простоты опущена):
struct RAW_SECTOR_MODE1 { BYTE SYNC[12]; BYTE ADDR[3]; BYTE MODE; BYTE USER_DATA[2048]; BYTE EDC[4]; BYTE ZERO[8]; BYTE P[172]; BYTE Q[104]; };
// // // // // // // //
ñèíõðîãðóïïà àáñîëþòíûé àäðåñ ñåêòîðà òèï ñåêòîðà ïîëüçîâàòåëüñêèå äàííûå êîíòðîëüíàÿ ñóììà íóëè (íå èñïîëüçóåòñÿ) P-áàéòû ÷åòíîñòè Q-áàéòû ÷åòíîñòè
При успешном завершении функция возвращает ненулевое значение и ноль в противном случае.
Ëèñòèíã 3. Äèíàìè÷åñêàÿ çàãðóçêà áèáëèîòåêè ElByECC.DLL HANDLE h; int (__cdecl *CheckECCAndEDC_Mode1) (char *userdata, ↵ char *header, char *sector); h=LoadLibrary("ElbyECC.dll"); CheckECCAndEDC_Mode1 = GetProcAddress(h, "CheckECCAndEDC_Mode1");
Статическая компоновка предполагает наличие специального lib-файла, который может быть автоматически сгенерирован утилитой implib из пакета Borland C++ любой подходящей версии, представляющую собой утилиту командной строки, вызываемую так:
CheckSector Функция CheckSector осуществляет проверку целостности сектора по контрольной сумме и при необходимости выполняет его восстановление по избыточным кодам Рида-Соломона. Ëèñòèíã 6. Ïðîòîòèï ôóíêöèè CheckSector // óêàçàòåëü íà ñåêòîðíûé áóôåð CheckSector(struct RAW_SECTOR *sector, int DO); // òîëüêî ïðîâåðêà/ëå÷åíèå
sector – указатель на 2352-байтовый блок данных, содер-
implib.exe -a ElByECC.lib ElByECC.lib
GenECCAndEDC_Mode1 Функция GenECCAndEDC_Mode1 осуществляет генерацию корректирующих кодов на основе 2048-байтового блока пользовательских данных и имеет следующий прототип: Ëèñòèíã 4. Ïðîòîòèï ôóíêöèè GenECCAndEDC_Mode1
жащий подопытный сектор. Лечение сектора осуществляется «вживую», т.е. непосредственно по месту возникновения ошибки. Если количество разрушенных байт превышают корректирующие способности кодов РидаСоломона, исходные данные остаются неизменными; DO – флаг, нулевое значение которого указывает на запрет модификации сектора. Другими словами, соответствует режиму TEST ONLY. Ненулевое значение разрешает восстановление данных, если они действительно подверглись разрушению.
// óêàçàòåëü íà ìàññèâ èç 2048 áàéò GenECCAndEDC_Mode1(char *userdata_src, // óêàçàòåëü íà çàãîëîâîê char *header_src, struct RAW_SECTOR_MODE1 *raw_sector_mode1_dst)
№11(12), ноябрь 2003
При успешном завершении функция возвращает ненулевое значение и ноль, если сектор содержит ошибку (в режиме TEST ONLY) или если данные восстановить не удалось (при вызове функции в режиме лечения). Для
87
образование предотвращения возможной неоднозначности рекомендуется вызывать данную функцию в два приема. Первый раз – в режиме тестирования для проверки целостности данных, и второй раз – в режиме лечения (если это необходимо).
// user_data init for (a = 0; a < USER_DATA_SIZE; a++) user_data[a] = a; // src header init memset(stub_head, 0, HEADER_SIZE); stub_head[3] = 1; printf("+OK\n"); // ãåíåðàöèÿ êîäîâ Ðèäà-Ñîëîìîíà íà îñíîâå // ïîëüçîâàòåëüñêèõ äàííûõ //----------------------------------------------------printf("RS-code generate..................."); a = GenECCAndEDC_Mode1(user_data, stub_head, ↵ &raw_sector_for_damage); if (a == ElBy_SECTOR_ERROR) { printf("-ERROR!\x7\n"); ↵ return -1;} memcpy(&raw_sector_for_compre, &raw_sector_for_damage, ↵ RAW_SECTOR_SIZE); printf("+OK\n");
Финал Ниже приведен законченный примем использования корректирующих кодов на практике, пригодный для решения реальных практических задач. Ëèñòèíã 7. Ïðèìåð âûçîâà ôóíêöèé ElByECC.DLL èç ñâîåé ïðîãðàììû
// óìûøëåííîå èñêàæåíèå ïîëüçîâàòåëüñêèõ äàííûõ //----------------------------------------------------printf("user-data %04d bytes damage........", ↵ N_BYTES_DAMAGE); for (a=0;a<N_BYTES_DAMAGE;a++) ↵ raw_sector_for_damage.USER_DATA[a]^=0xFF; if(!memcmp(&raw_sector_for_damage, ↵ &raw_sector_for_compre,RAW_SECTOR_SIZE)) printf("-ERR: NOT DAMAGE YET\n"); ↵ else printf("+OK\n");
/*-------------------------------------------------------* * äåìîíñòðàöèÿ ElByECC.DLL * ======================== * * Äàííàÿ ïðîãðàììà äåìîíñòðèðóåò ðàáîòó ñ áèáëèîòåêîé * ElByECC.DLL, ãåíåðèðóÿ èçáûòî÷íûå êîäû Ðèäà-Ñîëîìîíà * íà îñíîâå ïîëüçîâàòåëüñêèõ äàííûõ, çàòåì óìûøëåííî * èñêàæàåò èõ è âíîâü âîññòàíàâëèâàåò. * Êîëè÷åñòâî ðàçðóøàåìûõ áàéò ïåðåäàåòñÿ â ïåðâîì ïàðàìåòðå * êîìàíäíîé ñòðîêè (ïî óìîë÷àíèþ – 6) ---------------------------------------------------------*/ #include <stdio.h> #include "ElByECC.h" // äåêîìïèëèðîâàíî àâòîðîì // ðóøèòü ïî óìîë÷àíèþ #define _DEF_DMG 6 // ñêîëüêî áàéò ðóøèòü? #define N_BYTES_DAMAGE
// ïðîâåðêà öåëîñòíîñòè ïîëüçîâàòåëüñêèõ äàííûõ //----------------------------------------------------printf("user-data check...................."); a = CheckSector((struct RAW_SECTOR*) ↵ &raw_sector_for_damage, ElBy_TEST_ONLY); if (a==ElBy_SECTOR_OK){ printf("-ERR:data not damage\x7\n");return ↵ -1;}printf(".data damge\n");
((argc>1)?atol(argv[1]):_DEF_DMG)
// âîññòàíîâëåíèå ïîëüçîâàòåëüñêèõ äàííûõ //----------------------------------------------------printf("user-data recorver................."); a = CheckSector((struct RAW_SECTOR*) ↵ &raw_sector_for_damage, ElBy_REPAIR); if (a == ElBy_SECTOR_ERROR) { printf("-ERR: NOT RECORVER YET\x7\n"); return ↵ -1; } printf("+OK\n");
main(int argc, char **argv) { int a; // çàãîëîâîê ñåêòîðà char stub_head[HEADER_SIZE]; // îáëàñòü ïîëüçîâàòåëüñêèõ äàííûõ char user_data[USER_DATA_SIZE];
// ïðîâåðêà óñïåøíîñòè âîññòàíîâëåíèÿ //----------------------------------------------------printf("user-data recorver check..........."); if(memcmp(&raw_sector_for_damage, ↵ &raw_sector_for_compre,RAW_SECTOR_SIZE)) printf("-ERR: NOT RECORVER YET\x7\n"); ↵ else printf("+OK\n");
// ñåêòîð äëÿ èñêàæåíèé struct RAW_SECTOR_MODE1 raw_sector_for_damage; // êîíòðîëüíàÿ êîïèÿ ñåêòîðà struct RAW_SECTOR_MODE1 raw_sector_for_compre; // TITLE //----------------------------------------------------printf("= ElByECC.DLL usage demo example by KK\n"); // èíèöèàëèçàöèÿ ïîëüçîâàòåëüñêèõ äàííûõ //----------------------------------------------------printf("user data initialize...............");
88
printf("+OK\n"); return 1; }
как это было
ВОСПОМИНАНИЯ ЗАМЕЧАТЕЛЬНЫХ ДНЕЙ: ЗАРЯ КОМПЬЮТЕРИЗАЦИИ РОССИИ И БОРЦЫ С ЖЕЛЕЗНЫМИ КОНЯМИ ТОЙ ЭПОХИ... Когда я был молодым и еще студентом, у меня было много амбиций и я считал себя круче всего и вся. Тогда только начинался расцвет компьютерных технологий в России, как говорит один мой знакомый: «В те времена мы были маленькие, а калькуляторы большие». Сейчас, когда я вспоминаю те славные дни, понимаю, каким я был ребенком. Я знал каплю из того моря, что я знаю сейчас, но тогда любой молодой человек, который собрал два-три компьютера, уже считался если и не профессионалом, то минимум хорошо разбирающимся. Причем интересный факт, люди в то время считали, что в магазине продавец-консультант обязательно навяжет им какую-то дрянь и попытается навариться на ничего не понимающем клиенте (и положа руку на сердце, так оно и было во многих местах). Вспоминаю чипсет от славной фирмы SYS. Первый! Интегрированный! Дешевый до безобразия! Все в одном. Я до сих пор уверен, что львиная доля материнских плат на этом чипсете осела на просторах нашей родины. Ужас, который я испытал, собрав первую машину на этом чипсете, я не забуду никогда! Глюки с памятью и видео – это мелочи по сравнению со звуком модема из колонок Genius... На меня это произвело такой эффект, что я зарекся и больше ни разу не покупал материнские платы на чипсетах от фирмы SYS. Сколько богатейшего опыта получили те, кто занимался сборкой компьютеров в то время! Все кривое и совсем не рабочее железо везли к нам. И ведь собирали, продавали, и это работало! Вспоминается сборка компьютеров в одной маленькой фирме (коих по Москве было как грибов). Ящик видеокарт, ящик звуковых карт, коробка памяти, одна материнская плата и мего-бубен, при помощи которого рождалось творение рук человеческих – компьютер! Не важно, что на него не ставился софт, и он зависал время от времени, не важно, что из колонок доносились не звуки, а пуки. Главное – это работало... первые 10 минут! Показали, собрали, клиенту ручкой помахали, гарантийный талон на маленькой бумажке (авось побыстрей потеряет) вручили и пошли творить дальше. Чудесные были времена. По прошествии нескольких лет школе, которую я заканчивал, администрация города подарила компьютерный класс. Я не знаю, где они нашли эти ящики, которые гордо назвали компьютерами, но весь класс был собран из машин на том самом чипсете SYS – даже то, что называлось сервером. Так как я остался в очень хороших отношениях со своей классной руководительницей – преподавателем информатики в школе, то честь настроить локальную сеть из этих полутрупов досталась мне и моему
№11(12), ноябрь 2003
другу. Это были незабываемые выходные. Компьютеры умирали на руках! Вот только что включался и работал. Кое-что поправили в Windows, перезагрузка и все... ноль эмоций: кулера не жужжат, сердце остановилось. Хаб в классе поставили тоже «потрясный»: пакеты ходили куда угодно, но только не по сети, может, у него была встроенная спутниковая антенна и он отсылал секретную информацию врагам нашей родины, не знаю. Полгода мы каждые выходные ходили в школу, как на работу. Оживляли, чинили, переставляли софт – это был ужас… Расцвет радиорынков. Кто из москвичей помнит Митино, Царицыно того времени, тот меня поймет. Покупалось и продавалось абсолютно все. Самое старое и ненужное железо везлось туда. Для многих людей этот рынок стал местом старта в большой бизнес, для других он был как дом родной. А сколько эмоций, когда покупалась новая игрушка. Никогда не знал заранее, как отнесется твоя операционная система к новому приобретению. А как игры были локализованы… Те, кто занимался локализацией, с криком «Стилус форева» (был такой переводчик тестов) загоняли игры в переводчик и в результате получались по истине шедевры. Играли в них не часами, а ночами и сутками, а потом с красными глазами делились друг с другом новостями игрового процесса. Каждая новинка в мире железа ожидалась с нетерпением и горячо обсуждалась. Каждый мегагерц в процессоре, каждый мегабайт памяти на видеокарте казался очередным прорывом технологий. А сейчас отношение к появлению нового процессора, жесткого диска или какойто революционной технологии спокойнее, словно прошел дождь или проехал мимо автобус. Мы к этим событиям настолько привыкли, что уже не успеваем отследить все новинки рынка. Сейчас, когда встает вопрос о помощи в приобретении компьютера, на пару дней зарываешься в Интернет и читаешь, а после удачной покупки через два дня выходит новый мегосуперпупер дивайс. Помню, как говорил одному своему товарищу, который покупал по тем временам крутой компьютер Intel Pentium 100 МГц: «Зачем тебе жесткий диск объемом 1,5 Гб? Что ты на него будешь писать? Вот у меня 340 Мб и мне хватает…» Посмотрел на своего железного коня, на котором пишется эта статья, в котором стоят два винчестера по 80 Гб. И ведь, правда, хватало. Но потом вышел на сцену Windows 95 и покатилось, с каждым годом объемы информации, которые оседали на жестких дисках росли, аппетиты ОС росли, потом появился формат MP3, затем MPEG... Алексей Костромин
89
полезные советы
КТО ПРЕДУПРЕЖДЕН – ТОТ ВООРУЖЕН
МИХАИЛ ТОРЧИНСКИЙ 90
полезные советы Летом этого года состоялось достаточно интересное и, на мой взгляд, нетривиальное событие. Прошел первый Семинар системных администраторов и инженеров. Его организаторы пригласили меня выступить с докладом на тему «Роль кадровых агентств в карьере IT-специалиста». Я с радостью согласился, т.к. в последнее время все чаще сталкиваюсь с тем, что многие специалисты в области информационных технологий, обладающие прекрасными профессиональными данными, хорошо образованные и потенциально интересные на рынке IT, с трудом находят себе работу. Видимо, настало время попытаться понять, что же необходимо предпринять, чтобы грамотно выстроить свою карьеру, используя такой ресурс, как кадровые агентства (КА)? Рынок IT после некоторого затишья продолжает свой рост. Появляются новые компании, происходят слияния и поглощения, растет требовательность заказчиков и сложность реализуемых проектов. Все это положительно сказывается на рынке труда – открываются новые вакансии, растет уровень заработной платы. Все больше и больше компаний выбирают работу с кадровым агентством как эффективный способ найти нужных профессионалов. И чтобы стать тем «избранным» среди множества других претендентов на открывшиеся вакансии, необходимо научиться работать с кадровым агентством. Именно отсутствие навыков общения с представителями агентства очень часто становится той помехой, которая мешает дальнейшему карьерному росту. Безусловно, при работе с КА существуют и положительные, и отрицательные стороны. Несомненным плюсом является возможность получить на рассмотрение несколько интересных вакансий и различных работодателей. Более того, многие HR-службы работодателей перестают рассматривать кандидатов, которые «пришли» не от агентства, «с улицы» или по знакомству. Таким образом, у кандидата от агентства создается неоспоримое преимущество по сравнению с кандидатами, которые решили самостоятельно заняться рассылкой своего резюме и не имеют поддержки со стороны рекрутера. И преимущество не только в этом. Агентство, долго работающее со своим заказчиком, хорошо знает специфику компании, людей, которые принимают в ней решения, их предпочтения и вкусы. Всей этой информацией он может поделиться с кандидатом, рассказать подробности о компании, о существующем в ней стиле управления, нюансы прохождения интервью с непосредственным руководителем и т. п. «Кто предупрежден – тот вооружен» – это высказывание как нельзя лучше подходит для кандидата, настроенного на получение места в интересующей его компании. С помощью КА арсенал кандидата пополняется не только информацией о работодателе и рекомендациями, как с ним вести переговоры, но и грамотно составленным резюме и презентацией кандидата рекрутером. Если рекрутер чувствует потенциал в кандидате, он сделает все, чтобы убедить работодателя встретиться с претендентом.
№11(12), ноябрь 2003
И наконец, в том случае, если работодатель остановил на вас свой выбор, очень удобно вести переговоры о компенсационном пакете через посредника, в лице рекрутера. Обсуждение вопросов, связанных с деньгами, всегда сопровождается определенным дискомфортом: попросишь больше – сочтут, что тебя интересует только зарплата, мало – могут подумать, что ты не уверен в себе. В такой ситуации рекрутер берет на себя обсуждение требований кандидата и возможностей работодателя. В результате при выходе на работу кандидат четко знает, на какие деньги он выходит, и нет необходимости лично обсуждать для себя более интересные условия. Но есть и обратная сторона медали в работе с КА. Рынок услуг КА очень конкурентен, и, как правило, заказчик сотрудничает одновременно с несколькими агентствами, рассматривая кандидатов от всех сразу. В таком случае вероятность, что другое агентство, в котором вы не проходите как кандидат, представит более профессионального, компетентного, опытного кандидата, весьма велика. Также нужно учитывать, что даже «ваше» КА не может ограничиться только вашей кандидатурой. Заказчик требует выбора, и, как правило, на одну вакансию нужно представить 5-6 человек. Так что в любом случае кандидату нужно проходить конкурс. И его исход зачастую трудно предугадать. Чаще всего случается так, что кандидат, настроенный на поиск работы с помощью рекрутеров, находит интернет-сайт, на котором имеется список КА, и делает рассылку своего резюме по большинству найденных. В данном случае он руководствуется соображением: «чем больше будет рассылка, тем больше предложений о работе я получу». Однако далеко не всегда такая тактика дает положительные результаты. На рынке работают сотни КА, и нужно потратить некоторое время на то, чтобы разобраться, какие из них действительно оказывают качественный сервис своим заказчикам и соискателям, с которыми они работают. Критериям, которым можно доверять при оценке рекрутинговых компаний, являются их известность на рынке и наличие определенной специализации. Известные компании, как правило, работают на российском рынке достаточно давно и уже успели хорошо зарекомендовать себя. Их отличает также от большинства других наличие известных brand-name-клиентов. Это очень важное отличие, т.к. крупные корпоративные клиенты имеют вполне сформировавшиеся и очень жесткие критерии выбора своих поставщиков, они дорожат своей репутацией и тщательно выбирают себе деловых партнеров. Узнать, с какими клиентами сотрудничает интересующее вас КА, как правило, можно на сайте рекрутеров. Услуги КА должны быть для соискателей абсолютно бесплатными. До сих пор попадаются КА, которые предпочитают зарабатывать деньги на соискателях, нежели оказывать качественный, профессиональный сервис своим клиентам. Если вы ненароком попали в такое КА, сразу прощайтесь, если услышите о просьбе оплатить какую-либо услугу. Если клиент, обратившийся в такое агентство, считает, что его будущий сотрудник сам дол-
91
полезные советы жен заплатить за то, что его знания и опыт будут использованы в компании, – скорее всего этот работодатель не то, что вы ищите. Для многих все еще мало известно, как сотрудничают между собой КА и их заказчик в лице компании, заинтересованной в подборе персонала. Что предшествует тому моменту, когда соискателю поступает предложение выйти на работу? Как и в любом другом бизнесе, все начинается с переговоров между КА и клиентом. После того как условия сотрудничества определены, консультанты агентства приступают к детальному изучению той позиции, над которой им придется работать. Работодатель предоставляет всю необходимую информацию о том, какого сотрудника он хочет видеть у себя на рабочем месте, какие требования он предъявляет к его профессиональному опыту и личным качествам. После определения так называемого описания позиции консультант приступает к поиску кандидата. Рекрутер использует массу различных методов для того, чтобы найти тех избранных, которых он представит своему клиенту. В большинстве случаев рекрутеру необходимо встретиться с кандидатом, прежде чем направлять резюме соискателя клиенту. Эта встреча очень важна, для многих она становится тем непреодолимым барьером, который они не могут преодолеть. Профессиональные качества соискателя, его умения и навыки играют очень важную, но далеко не последнюю роль на интервью в агентстве. «Человеческий фактор», личностный контакт между рекрутером и кандидатом – необходимое условие, при котором консультант примет решение о дальнейшем «продвижении» соискателя клиенту. Встречу в агентстве нужно воспринимать очень серьезно, к ней нужно подготовиться. Следует продумать ответы на возможные вопросы, подготовить свою «мини-презентацию», заранее сформулировать те вопросы, на которые вы хотели бы знать ответ. Для многих технических позиций наличие развитых коммуникативных навыков, а иными словами, умение общаться с людьми, понимать их и быть понятыми, – не самое главное. Но не следует забывать, что рекрутер в первую очередь оценивает ваше поведение, то, насколько вы активны, доброжелательны, контактны и уверены в себе. Не стоит злоупотреблять технической терминологией, и уж тем более указывать консультанту на его неосведомленность и безграмотность в тех вопросах, в которых вы считаете себя профи. Задача консультанта – не вступать с вами в диспут о преимуществах той или иной ОС или качестве и возможностях «железа», используемого вами в работе. Консультанту нужно понять, насколько ваша кандидатура подходит к конкретному заказчику, являетесь ли вы тем идеальным кандидатом, о котором было столько разговоров при обсуждении «описания позиции». Тем более, что в том случае, если у вас будет возможность попасть на встречу непосредственно к работодателю, с вами обязательно пообщаются на технические темы профильные специалисты, и вы блеснете своими знаниями.
92
Следующим этапом в работе КА является представление резюме кандидата клиенту. Скорее всего, агентство несколько переработает резюме соискателя, оформит его в индивидуальном формате, который принят в компании. Также резюме дополняется комментариями консультанта, которые он готовит после встречи с кандидатом. В этих комментариях консультант описывает свои впечатления от встречи, указывает индивидуальные особенности соискателя, его слабые и сильные стороны в личностном плане. После того как резюме попало в руки работодателя, им принимается решение о назначении встречи на своей территории. Этот этап является наиболее важным и сложным в процессе поиска работы. От этой встречи на 90% зависит, получите ли вы заветное предложение о работе. Чтобы увеличить ваши шансы на успех, рекрутер должен помочь вам подготовиться к встрече. Старайтесь фиксировать все, о чем вам будет говорить консультант, письменно. Это необходимо, т.к. информации будет достаточно много, и, чтобы не упустить мелочей, записи очень пригодятся. Разрабатывая план беседы, надо помнить, что на встрече у работодателя вы предстаете неким «товаром», который нужно с успехом прорекламировать. Основной посыл «аудитории» – это ваши личные достижения, то, чем вы можете гордиться, и то, что вы делаете и знаете лучше всего. Не забудьте уточнить время, место, должность и имя человека, с которым вам предстоит встречаться. Лучше всего, если консультант сможет дать вам короткую справочную информацию о нём. «Предупрежден – значит вооружен» – это справедливо и для соискателя вакантного места. Знание личных и деловых качеств человека, с которым предстоит встречаться, его характер и деловой опыт помогут сориентироваться, правильнее выстроить план беседы. На встрече не следует первым поднимать тему «денег». Работодатель уже знает, на какие деньги вы претендуете, т.к. это обязательно было отражено в вашем резюме. Логично, что, если вас пригласили на встречу, значит, клиент готов предложить вам эту сумму. К тому же деловой этикет подобных встреч не предполагает подобных разговоров, т.к. стороны пока еще не пришли к окончательному решению, и говорить о заработной плате, социальном пакете и бонусах пока рано. В том случае, если работодатель первым задает вопрос о том, на какие деньги вы рассчитываете, проявите такт и постарайтесь не называть конкретную сумму. Попросите перенести обсуждение этой темы на следующие встречи. Многие агентства ведут практику переговоров по вопросу зарплат от лица кандидата и заказчика, и чаще всего это оптимальный вариант безболезненного решения проблемы. По окончании встречи необходимо обязательно поблагодарить работодателя за встречу и обязательно поинтересоваться, каковы ваши дальнейшие шаги. Помните, чем больше информации вы получите, тем легче вы сможете планировать дальнейшие действия.
полезные советы Не стоит забывать и о таких вещах, как внешний вид. Даже если на новом месте работы от вас не потребуется соблюдать dress-code, тем не менее на официальную встречу с работодателем необходимо появиться одетым по-деловому, опрятно и без излишеств. Это может показаться странным, но некоторые кандидаты пренебрегают правилами личной гигиены, что недопустимо при встрече с работодателем, да и в повседневной жизни воспринимается, мягко говоря, не очень. Надеюсь, что среди потенциальных кандидатов, читающих эту статью, таких нет. Очень важно соблюсти пунктуальность. Опоздания на такие встречи недопустимы. Наилучший вариант – приехать за 10 минут до назначенного времени. Это позволит вам «отдышаться», освоиться в новой обстановке, еще раз подготовиться к интервью. После того как прошла встреча у работодателя, от вас будут ждать звонка консультанты агентства. Им необходимо узнать, как вы провели переговоры, в какой тональности шла беседа, какие договоренности и предложения были озвучены. Вы также можете поинтересоваться, какое впечатление вы произвели на работодателя. Договоритесь, когда вы должны выходить «на связь» в следующий раз, как будет вестись работа дальше. После того как прошла встреча между кандидатом и клиентом агентства, консультанту необходимо выяснить,
№11(12), ноябрь 2003
каково впечатление клиента о кандидате. Вариантов может быть три: «кандидат понравился», «не понравился», «кандидат понравился, но будем смотреть еще». Их всех трех вариантов только «не понравился» означает, что на этот раз кандидату не повезло и дальнейшего обсуждения позиции не будет. Далеко не всегда консультант сможет совершенно правдиво объяснить, почему клиент отказывается рассматривать кандидатуры в дальнейшем. Т.к. в большинстве случаев отказ происходит по причинам личностного характера, не всегда удобно и этично говорить об этом кандидату. Если же речь идет о недостаточных профессиональных качествах – скорее всего кандидат получит ответ, что конкретно не устраивает работодателя. Конечно, отказ – это всегда неприятно и воспринимается болезненно. Но не стоит раздражаться и выказывать недовольство работой КА. Не исключено, что в другое время у КА появится новая вакансия, которая вас заинтересует, и вы снова сможете сделать попытку. В том же случае, если вы произвели благоприятное впечатление на работодателя, ждите нескольких последующих встреч. Не стоит думать, что это формальность, так что на каждой их этих встреч вы должны быть все так же собранны и подготовлены. Случается, что даже на повторных встречах делается отказ. Тем более что кандидатов на позицию несколько и конкурс продолжается.
93
полезные советы Если вы подошли к встрече, на которой должно быть озвучено конкретное предложение о работе, выслушайте и примите к сведению все, что будет вам предложено, и возьмите тайм-аут. Не стоит тут же соглашаться. Еще раз взвесьте и обдумайте возможные последствия . Если вы не согласны с предложенными условиями, позвольте консультанту КА вступить в переговоры от вашего лица. «Торговаться» по этим вопросам возможно, но следует знать меру. После вашего встречного предложения последует ответ от работодателя, и если он вас не устраивает, скорее всего существенных изменений ждать не придется. Решайте самостоятельно, выбор за вами. Итак, решение принято, и осталось лишь «законно оформить отношения». Проявите предельную внимательность, проследите, чтобы все формальности были соблюдены, хотя практика показывает: недобросовестные работодатели не так часто сотрудничают с КА, так что вероятность быть обманутым стремится к нулю. Но даже если вы успешно нашли работу с помощью КА, на этом ваше сотрудничество не закончилось. Вопервых, существует испытательный срок. В течение этого времени внимание к вашей персоне как со стороны работодателя, так и КА очень пристальное. Испытатель-
94
ный срок, как правило, составляет 3 месяца. За это время у кандидата есть возможность проявить себя с лучшей стороны и доказать, что он именно тот, кого так усердно искали КА и работодатель. В противном случае испытательный срок может закончиться поиском «замены» кандидата. И тогда КА начинает работу поновому. Хотелось бы дать еще несколько рекомендаций кандидатам, успешно нашедшим работу через КА. Как и в большинстве сфер жизни, наибольшее значение играют личностные отношения. Консультанту агентства, так же, как и любому нормальному человеку, приятно, когда его работа оценена не только клиентом, но и кандидатом. Не стоит забывать о поддержании доброжелательных отношений с рекрутером, тем более что и деловые отношения могут возобновиться вновь, при желании кандидата сменить место работы. Иногда консультанту могут потребоваться ваши рекомендации или совет. Не стоит пренебрегать возможностью дать ответ и оказать информационную помощь представителю КА. В свою очередь, рекрутер сможет дать разъяснения по интересующим вас вопросам. Наладив партнерские отношения с консультантом, вы сможете планировать ваше дальнейшее карьерное развитие и рост.
подписка
Продолжается подписка на I полугодие 2004 г. Более подробная информация на сайте www.samag.ru в разделе «Подписка»
Единый подписной индекс:
81655 по каталогу агентства «Роспечать»
Рады видеть Вас нашими читателями!
№11(12), ноябрь 2003
95
СИСТЕМНЫЙ АДМИНИСТРАТОР №11(12), Ноябрь, 2003 год РЕДАКЦИЯ Исполнительный директор Владимир Положевец Ответственный секретарь Наталья Хвостова sekretar@samag.ru Технический редактор Владимир Лукин Научно-технические консультанты Дмитрий Горяинов Руслан Иванов Игорь Гарасюк РЕКЛАМНАЯ СЛУЖБА тел.: (095) 928-8253 (доб. 112) факс: (095) 928-8253 Константин Меделян reсlama@samag.ru Верстка и оформление imposer@samag.ru maker_up@samag.ru Дизайн обложки Николай Петрочук 103012, г. Москва, Ветошный переулок, дом 13/15 тел.: (095) 928-8253 (доб. 112) факс: (095) 928-8253 Е-mail: info@samag.ru Internet: www.samag.ru РУКОВОДИТЕЛЬ ПРОЕКТА Петр Положевец УЧРЕДИТЕЛИ Владимир Положевец Александр Михалев ИЗДАТЕЛЬ ЗАО «Издательский дом «Учительская газета» Отпечатано типографией ООО «Мастер Печати» Тираж 5500 экз. Журнал зарегистрирован в Министерстве РФ по делам печати, телерадиовещания и средств массовых коммуникаций (свидетельство ПИ № 77-12542 от 24 апреля 2002г.) За содержание статьи ответственность несет автор. За содержание рекламного обьявления ответственность несет рекламодатель. Все права на опубликованные материалы защищены. Редакция оставляет за собой право изменять содержание следующих номеров.
96
ЧИТАЙТЕ В СЛЕДУЮЩЕМ НОМЕРЕ: Безумный чертенок Почти каждый день мы слышим о том, что появился новый однодискетный/ LiveCD/«полновесный» дистрибутив Linux, а вот аналогичную новость про *BSD не каждый день услышишь. Из новостей портала www.opennet.ru я узнал о проекте Frenzy (пер. с англ. – безумие), который меня весьма заинтересовал. Процитирую разработчика: «Целью проекта Frenzy является создание «портативного инструмента системного администратора» на базе ОС FreeBSD, который было бы удобно постоянно иметь при себе...»
Крепость для пингвина Сегодня особое внимание уделяется защите серверов и персональных компьютеров от вторжения извне. Описание различных методов атак можно найти практически везде, у нападающего огромное количество способов пробраться в чужой компьютер. Но сисадмину или обычному пользователю от этого не легче, все больше и больше приходится уделять времени чтению документации, настройке системы, но время, как правило, не на стороне обороняющегося, да и опыт приходит вместе с ошибками. Ситуация усугубляется тем, что производители все чаще выпускают дистрибутивы по типу «два-в-одном», которые могут быть с одинаковым успехом установлены как на сервер, так и на персональный компьютер, причем, по моему мнению, все равно для того, чтобы привлечь большее количество клиентов, упор делается все-
таки на последний. Что делать в таком случае? Существует множество различных утилит, так или иначе предназначенных для улучшения защиты Linux-системы. В данной статье хочу обратить внимание на проект Bastille Linux.
LTSP – вторая жизнь старых компьютеров Все ОС Unix и подобные операционные системы изначально подготовлены для полноценной работы в среде клиентсервер. Основой взаимодействия графических приложений с сервером является протокол Х, который реализован так, что ему абсолютно неважно, где находится клиент и сервер. В самом общем случае они работают на одном компьютере, но ничто не мешает разместить их на разных компьютерах. Такая организация позволяет эффективно использовать компьютерный парк организации: все ресурсоемкие операции выполняются на специально выделенном мощном компьютере.
Обживаем мир Nagios В статье речь пойдет о действиях, которые необходимо предпринять для русификации веб-интерфейса. Описаны процедуры инсталляции дополнительного программного обеспечения, необходимого для работы с плоской и трехмерной картами сети. Рассмотрены методики создания самодельных иконок хостов и сервисов и настройки Nagios, которые необходимо задействовать для достижения вышеуказанных целей.
Наши партнеры