98
журнал для cистемных администраторов, вебмастеров и программистов №10(11) октябрь 2003 подписной индекс 81655 Управление сетевыми принтерами домена Настраиваем ASPLinux 7.3 Server Edition Установка IMAP4-сервера на базе cyrus-imapd + sendmail Использование LVM Борьба с вирусами: опыт контртеррористических операций Система обнаружения атак IDS Snort Мечта сисадмина Управление сетевыми принтерами домена Настраиваем ASPLinux 7.3 Server Edition Установка IMAP4-сервера на базе cyrus-imapd + sendmail Использование LVM Борьба с вирусами: опыт контртеррористических операций Система обнаружения атак IDS Snort Мечта сисадмина №10(11) октябрь 2003

011 Системный Администратор 10 2003

Embed Size (px)

DESCRIPTION

Борьба с вирусами: опыт контртеррористических операций Борьба с вирусами: опыт контртеррористических операций Использование LVM Использование LVM Управление сетевыми принтерами домена Управление сетевыми принтерами домена Мечта сисадмина Мечта сисадмина

Citation preview

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

журнал для cистемных администраторов,вебмастеров и программистов

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

Управление сетевымипринтерами домена

Настраиваем ASPLinux 7.3Server Edition

Установка IMAP4-серверана базе cyrus-imapd + sendmail

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

Борьба с вирусами: опытконтртеррористическихопераций

Система обнаруженияатак IDS Snort

Мечта сисадмина

Управление сетевымипринтерами домена

Настраиваем ASPLinux 7.3Server Edition

Установка IMAP4-серверана базе cyrus-imapd + sendmail

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

Борьба с вирусами: опытконтртеррористическихопераций

Система обнаруженияатак IDS Snort

Мечта сисадмина

№10

(11)

окт

ябрь

200

3

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

1№10(11), октябрь 2003

оглавление

Обнаружение телекоммуникационныхатак: теория и практика, Snort

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

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

Борьба с вирусами: опытконтртеррористических операций

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

Анализ защиты программи рекомендации по ее усилению

Станислав Гошко[email protected] 78

ОБРАЗОВАНИЕ

Полиномиальная арифметикаи поля Галуа, или Информация,воскресшая из пепла II

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

Вооруженное до зубов перемирие,или Я – то, чего не может быть!

Татьяна Ильченко[email protected] 92

Установка IMAP4-серверана базе cyrus-imapd + sendmail

Управление сетевымипринтерами домена

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

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

Настраиваем ASPLinux 7.3 Server Edition

Александр Шибенко[email protected] 16

4

Как бороться с баннерами в ICQ

Дмитрий Репин[email protected] 19

SMTP AUTH in da Postfix + ...

Андрей Мозговой[email protected] 26

10

BUGTRAQ 2, 29, 77

Денис Шергин[email protected]

Мечта сисадмина

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

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

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

Свой собственный модуль

Денис Колисниченко[email protected] 30

IMHO

С 1 октября началась подписка на 1-ое полугодие 2004 года.Подписной индекс по каталогу «Роспечать» – 81655.

Оформить подписку можно в любом почтовом отделении связи СНГ или через Интернет.Более подробная информация на нашем сайте www.samag.ru

Желаем успехов!

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

Page 4: 011 Системный Администратор 10 2003

Удаленное переполнение буферав ProFTPD-сервереПрограмма: ProFTPD 1.2.7, ProFTPD 1.2.8, ProFTPD 1.2.8rc1,ProFTPD 1.2.8rc2, ProFTPD 1.2.9rc1, ProFTPD 1.2.9rc2.Опасность: Критическая.Описание: Переполнение буфера обнаружено в ProFTPD-сервере. Удаленный атакующий может загрузить специаль-но обработанный файл на сервер, чтобы получить root shell.

Переполнение буфера происходит, когда файл переда-ется в ASCII-режиме. Как сообщается, удаленный пользо-ватель может выполнить произвольный код с root-приви-легиями, в обход существующих ограничений защиты.URL производителя: http://www.proftpd.orgРешение: Немедленно установите соответствующие ис-правления:

ftp.<two_letter_iso_country_code>.proftpd.org

(example: ftp.nl.proftpd.org). Not all countries havemirrors; however you should select one that is geographicallyclose to you.

The MD5 sums for the source tarballs are:

ca6bbef30253a8af0661fdc618677e5c proftpd-1.2.7p.tar.bz2677adebba98488fb6c232f7de898b58a proftpd-1.2.7p.tar.gz417e41092610816bd203c3766e96f23b proftpd-1.2.8p.tar.bz2abf8409bbd9150494bc1847ace06857a proftpd-1.2.8p.tar.gzb89c44467f85eea41f8b1df17f8a0faa proftpd-1.2.9rc1p.tar.bz214ab9868666d68101ed942717a1632d1 proftpd-1.2.9rc1p.tar.gz27e3f62a5615999adbbebcefa92b4510 proftpd-1.2.9rc2p.tar.bz29ce26b461b2fa3d986c9822b85c94e5f proftpd-1.2.9rc2p.tar.gz

Раскрытие чувствительной информациии отказ в обслуживании в ядре NetBSDПрограмма: NetBSD-1.5-1.6.1.Опасность: Низкая.Описание: Уязвимость обнаружена в kernel sysctl-коде вNetBSD. Локальный пользователь может раскрыть чувстви-тельную информацию и выполнить отказ в обслуживании.

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

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

Sysctl helper выполняет недостаточную проверку гра-ниц для нескольких sysctl-узлов в proc.curproc.rlimit-под-дерерве. Эта уязвимость может эксплуатироваться длячтения произвольных частей памяти ядра.URL производителя: http://www.netbsd.orgРешение: Установите обновленную версию ядра:

NetBSD-current: 25 àâãóñòà, 2003NetBSD-1.6 branch: 28 àâãóñòà, 2003NetBSD-1.5 branch: 28 àâãóñòà, 2003

Поднятие привилегий и слабыесессионные куки в KDEПрограмма: KDE 2.x-3.x.Опасность: Низкая.Описание: Две уязвимости обнаружено в KDE. Злонаме-ренный пользователь может поднять свои привилегии иподобрать сессионные куки.� KDM может представить пользователю root-привилегии,

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

� Слабость обнаружена в алгоритме, который генери-рует 128-битные сессионные куки. В результате зло-намеренный пользователь может подобрать сессион-ные куки в локальной сети, чтобы получить доступ ксистеме.

Решение: Обновите KDE до версии 3.1.4: ftp://ftp.kde.org/pub/kde/security_patches

Удаленное выполнение произвольногокода при некоторых конфигурацияхв wu-ftpd FTP-сервереПрограмма: wu-ftpd 2.6.2 и более ранние версии.Опасность: Предельно низкая.Описание: Уязвимость обнаружена в wu-ftpd в некоторыхконфигурациях (MAIL_ADMIN). Удаленный авторизован-ный пользователь может выполнить произвольный код науязвимой системе.

Если код wu-ftpd, сконфигурированный так, чтобы по-сылать почтовые сообщения, содержащие загружаемыеимена файлов (т.е. скомпилированный с опциейMAIL_ADMIN), тогда удаленный авторизованный пользо-ватель может эксплуатировать переполнение буфера вфункции SockPrintf() в «ftpd.c», загружая на сервер файлсо специально обработанным именем.

Согласно сообщению, функция store() в «ftpd.c» вы-зывает уязвимую SockPrintf()-функцию с именем файла,представленным пользователем, которое может быть до32768 символов, тогда как переменная «pathname» мо-жет быть не больше MAXPATHLEN символов (4095 в боль-шинстве Linux-систем). Т.е. обнаруженную уязвимостьможно успешно эксплуатировать только на Linux-систе-мах, в которых ядро откомпилировано с параметромMAXPATHLEN не менее 32768 символов (практически невстречается).URL производителя: http://www.wuftpd.org/Решение: Не используйте MAIL_ADMIN. Не используйтечрезмерно большие значения для параметра MAXPATHLEN.

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

2

bugtraq

Page 5: 011 Системный Администратор 10 2003
Page 6: 011 Системный Администратор 10 2003

4

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

ИСПОЛЬЗОВАНИЕ LVM

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

5№10(11), октябрь 2003

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

Рано или поздно, но это произойдёт. В один прекрасныйсолнечный день, когда хочется поваляться на пляже, вве-дя команду df, обнаруживаешь, что места на сервере ос-талось всего ничего. Причём как ни стараешься правиль-но разбить диск при установке системы, но предугадать,какой из разделов потребует больше места, а какой мень-ше, удаётся очень редко. Если корневой раздел, /usr и /optв большинстве своём сюрпризов не приносят, т.к. уста-навливаемый софт контролируется самим сисадмином иобычно здесь применяется стандартный набор приложе-ний. Каталог /tmp сейчас обычно отдают на откуп tmpfs –файловую систему в оперативной памяти. То с /var и /homeобычно возни больше. Выходов в этой систуации можетбыть несколько.

Первый. ПростойПлюнуть на всё требования и поступить ещё при установ-ке просто:

т.е. использовать всего два раздела swap и всё оставше-еся место отвести под корневой. Что тут сказать, покадиск не заполнится полностью, можно будет совсем недумать о наличии свободного/занятого места в разделах.Но это положительная сторона. А с другой стороны – про-изводительность диска в таком случае будет не на высо-те, особенно при большом заполнении. Плюс обязатель-но найдется кто-то, у кого дома много фильмов на дис-ках, и в один прекрасный день он решит их все принестина работу для демонстрации. Или кто-то «добрый» запи-шет большой файл в /tmp. После этого остановится всё,что требует места, например, почтовый сервер или syslog,которым просто некуда будет писать на диске данные.

Второй. ФашистскийЕсли места мало, его нужно расчистить:

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

Или просто посмотреть на те файлы, которые занима-ют много места.

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

Четвертый. СофтварныйПри помощи утилиты parted, гарантирующей сохранениеданных, размеры разделов изменяются. Но, к великому

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

# parted /dev/hda mkpartfs primary linux-swap 0 256 ↵&& parted /dev/hda mkpartfs primary ext2 256 ###

# find /home ( -atime +365 -o -name '*.avi') -exec rm {}\;

# find /home -size 200 > trash ; cat trash | less

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

6

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

дит как одно большое целое. В терминологии LVM этоназывается группой томов VG (volume group), это глав-ная часть, представляющая собой логическую над-стройку над физическими разделами, некий банк дис-ковых ресурсов. Операционная система видит VG какединое целое, хотя фактически она состоит из несколь-ких реальных разделов жёсткого диска. Это можнопредставить (но только представить) как создание рас-ширенного раздела при обычном разбиении. И теперькладём плитку, т.е. нарезаем в получившемся VG раз-делы требуемых размеров (или не нарезаем, если вэтом нет необходимости, т.е. сплошная стена вас впол-не устраивает). Эти разделы называются логическимитомами LV (logical volume). Такой раздел форматируетсязатем обычным образом под выбранную файловую сис-тему, и драйвер ФС работает именно на этом уровне. Так-же, именно эти разделы монтирует пользователь и про-писывает данные в /etc/fstab. В LVM (HOWTO), котороенаходится по адресу http://tldp.org/HOWTO/LVM-HOWTO/,все это схематически отображено так:

Сам логический том также состоит из песчинок, на-зываемых LE (logical extent), которые сопоставляютсяреальным физическим physical extents. Если в дальней-шем понадобится изменить размер logical volume, то этоможно будет проделать как раз на величину, кратнуюphysical extents. Такая взаимосвязь физических и логи-ческих extent обозначается термином mapping. И ещё,так как фактически нет разницы, какому PE противопо-ставить LE, то это можно сделать двумя вариантами –линейным (linear mapping) и чередующимся (stripedmapping). В первом случае всё просто: непрерывнойпоследовательности физических extent ставится в со-ответствие столь же непрерывная последовательностьлогических extent. Во втором – непрерывная последо-вательность логических extent связывается с чередую-щимися между различными физическими носителямиextent. Эта схема напоминает нулевой (полосатый)RAID-массив. При этом если разместить два диска наразличных IDE-каналах, можно добиться некоторого по-вышения производительности дисковых операций. Нонадёжность в таком случае ниже, т.к. в случае вылетаодного диска можно потерять всё. Поэтому бэкап в пос-леднем случае играет не последнюю роль. И ещё не

сожалению, parted не работает с современными журна-лируемыми файловыми системами RaiserFS и XFS.

Пятый. Естественно, хардварныйИдём к шефу и говорим, что свободного места нет, и тре-буем новый жёсткий диск для сервера и повышения зар-платы для себя (чтобы два раза не бегать). Далее встав-ляем его в корпус, форматируем и монтируем, например,в /home/newhome и часть данных переносим на новыйдиск. Чтобы при этом некоторые старые файлы были до-ступны, из нового месторасположения необходимо вос-пользоваться символическими ссылками. К слову, в та-ком случае очень неплохо бы и на втором диске создатьswap-раздел, а в файле /etc/fstab сделать запись о равен-стве их приоритетов.

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

Вариант шестойПредусмотреть возможное несоответствие размеров ивозможное перепланирование рабочего пространствав будущем еще на стадии разбиения диска или, еслиуж произошло такое, то воспользоваться удобными со-временными технологиями. Для решения этой задачив самый раз придется популярная технология LVM(Logical Volume Manager, или менеджер логических то-мов), которая полностью поддерживается Linux-ядромверсии 2.4.

По понятиямДавайте сначала немного разберёмся в терминологиии в том, что собственно происходит. Недавний ремонтвызывает у меня только строительные ассоциации, по-этому давайте представим жесткий диск в виде стены.Но стена неоднородная, она состоит из отдельных кир-пичиков, т.е. физических разделов жёткого диска(physical media), все равно каких, первичных или логи-ческих разделов на расширенном. В терминологии LVMкаждый кирпичик будет называться физическим томомPV (Physical Volume). Этому разделу при образованииприсваивается определенный идентификатор типа фай-ловой системы – 8e (например, программой fdisk). СамPhysical Volume образуется из неких элементарных еди-ниц, называемых PE (physical extents). Будем считать,это тот песок, из которого состоят кирпичи. Это мини-мальный размер, с которым умеет обращаться VG и поумолчанию равен 4 Мб. Далее, чтобы на голый кирпичприцепить что-то более привлекательное для глаза, егосначала заштукатуривают, и теперь наша стена выгля-

/dev/hda1 swap swap defaults,pri=1 0 0/dev/hdc1 swap swap defaults,pri=1 0 0

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

7№10(11), октябрь 2003

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

стоит смешивать в одной VG оба метода, если есть вэтом необходимость, то для striped mapping создайтеотдельную volume group. Как говорил один из моих пре-подавателей: «Природу не обманешь, за всё надо пла-тить». Естественно, за удобства приходится расплачи-ваться, в нашем случае это 10-15% процессорной мощ-ности. Причем перенос файловых систем с физическо-го на логический уровень на скорости дисковых опера-ций не отразился в linear случае.

От теории к практикеТеперь попробуем создать logical volume и подключить егокак обычную файловую систему. Для начала давайте оп-ределимся, что не надо класть в LV. Так, нет особого смыс-ла помещать туда каталог /boot, в котором содержитсяядро и Grub. Его стоит вынести в отдельный раздел раз-мером 50 Мб (с запасом) и в файле /etc/fstab прописатьтакие строки, чтобы он не автоматически монтировалсяпри загрузке.

Применять журналируемые файловые системы в этомслучае смысла особого нет, а при смене ядра (довольноредкое занятие) данный каталог всегда можно примонти-ровать вручную. Также, наверное, не стоит помещать тудаи следующие каталоги /etc, /proc, /lib, /mnt, /bin, /sbin, /dev,/root, swap и /tmp (хотя это всё относительно). Обычно со-став их более-менее статичен и много места не занима-ет, так, корневой раздел в CRUX такого состава получил-ся у меня всего навсего 300 Мб, остальное находится в/usr, /var и /home. При большом количестве внесистем-ного софта также следует вынести в отдельный ката-лог и /usr/local с /opt (я обычно делаю символическуюссылку ln -s /usr/local /opt, чтобы голову меньше ломать).Дополнительно ко всему у вас всегда будет возмож-ность зайти в систему из-под root в случае аварийныхобстоятельств. LVM можно использовать при наличиив системе и одного жёсткого диска, но наибольшую гиб-кость данная технология даёт при использовании двухи более дисков в системе. Для эксперимента возьмемдва раздела /dev/hda4 и /dev/hdс2.

Общее распределение разделов на дисках будет таким:� /dev/hda1 – /boot� /dev/hda2 – swap (содержит и /tmp)� /dev/hda3 – корневой (/etc, /proc, /lib, /mnt, /bin, /sbin,

/dev, /root)� /dev/hda4 – будет использован с LVM� /dev/hdс1 – swap� /dev/hdс2 – будет использован с LVM

Необходимый софтВ большинстве современных дистрибутивов, за исключе-нием разве ориентированных на power user, всё необхо-димое для работы уже имеется. Так, например, програм-ма установки Red Hat 9 позволяет создать LVM (и софт-RAID) в графическом режиме (рис.1), но, если честно, мнеона не показалась интуитивно понятной. Для поддержкитехнологии ядром при компиляции должны быть включе-ны следующие опции. В секции Multi-device support (RAIDand LVM) нужно включить поддержку самих Multiple devicesи далее собственно менеджера логических томов (Logicalvolume manager (LVM) support).

Файл /usr/src/linux/.config должен содержать следую-щие строки:

Следующим шагом необходимо установить софт дляработы с LVM (если его нет, конечно). В виде исходниковего можно взять с сайта http://www.sistina.com/. Установказаключается в стандартной компиляции (./configure && make;su; make install) и обычно проходит без сюрпризов. Врезультате получите три группы утилит, предназначен-ные для работы на «своём» уровне: pv* работает с фи-зическими томами, lg* – с логическими группами и lv* –с логическими томами. Все их можно найти при помо-щи табуляции.

Так команды вида *create создают том или группу взависимости от первых двух букв, *display выводит пол-ную информацию и т. д.

Для начала создаём физические разделы с идентифи-катором 8е. Для примера взят второй диск.

/dev/hda1 /boot ext2 noauto 1 2

## Multi-device support (RAID and LVM)#CONFIG_MD=y# CONFIG_BLK_DEV_MD is not set# CONFIG_MD_LINEAR is not set# CONFIG_MD_RAID0 is not set# CONFIG_MD_RAID1 is not set# CONFIG_MD_RAID5 is not set# CONFIG_MD_MULTIPATH is not setCONFIG_BLK_DEV_LVM=y

# /sbin/fdisk /dev/hdñ

Command (m for help): p

Disk /dev/hdñ: 3243 MB, 3243663360 bytes128 heads, 63 sectors/track, 785 cylindersUnits = cylinders of 8064 * 512 = 4128768 bytes

Device Boot Start End Blocks Id System/dev/hdb1 1 20 168682+ 82 Linux swap/dev/hdb2 21 785 3165088+ b Win95 FAT32

Command (m for help): tSelected partition 2Hex code (type L to list codes): 8eChanged system type of partition 2 to 8e (Linux LVM)Ðèñóíîê 1.

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

8

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

group, который в нашем случае равен 2 Тб, в варианте поумолчанию его значение равнялось бы 256 Гб.

Теперь pvscan сообщит, что тома активированы.

И теперь нарезаем большую VG на логические томатребуемых размеров. При этом нужно учитывать, что уре-зание файловой системы и затем логического тома (вотименно в два этапа) – немного более трудоёмкий процесс,чем увеличение. Дополнительно файловая система XFSпока не урезается. Поэтому лучше создать минимальнотребуемый размер логического тома (с запасом), а затемпри необходимости его просто увеличить до нужного. Со-здаем. При этом при помощи -L указывается нужный раз-мер, а при помощи -n имя и в конце следует имя VG. Еслизначение в килобайтах после него ставится K, в мегабай-тах M и в гигабайтах G.

Или для полосатости.

Проверяем.

Команда lvdisplay выдаст более подробную информа-цию. Обратите внимание на новое месторасположениевроде /dev/test/lvm_usr, именно с ними придется работатьв дальнейшем.

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

Для автоматического монтирования раздела при заг-рузке системы в /etc/fstab добавляем следующие строки:

# /sbin/lvcreate -L 1G -n lvm_usr test && /sbin/lvcreate ↵-L 1G -n lvm_home test

lvcreate -- doing automatic backup of "test"lvcreate -- logical volume "/dev/test/lvm_usr" ↵

successfully created

lvcreate -- doing automatic backup of "test"lvcreate -- logical volume "/dev/test/lvm_home" ↵

successfully created

# lvcreate -n stripedlv -i 2 -I 64 mygroup -L 20M

# /sbin/lvscanlvscan -- ACTIVE "/dev/test/lvm_usr" [1 GB]lvscan -- ACTIVE "/dev/test/lvm_home" [1 GB]lvscan -- 2 logical volumes with 2 GB total in 1 volume grouplvscan -- 2 active logical volumes

# /sbin/mkfs.reiserfs /dev/test/lvm_homeÈ ìîíòèðóåì â âûáðàííîå ìåñòî.# mkdir /home/test# mount -t reiserfs /dev/test/lvm_home /home/test

# df/dev/hda3 4032124 2789108 1038188 73% /.../dev/test/lvm_home 1048540 32840 1015700 4% /home/test

Теперь дисковые разделы превращаем в физическийтом, это своего рода форматирование, чтобы програм-мы высшего уровня могли работать с ними. Причем еслииспользуется файловая система устройств devfs, то не-обходимо задавать полное имя в соответствии с приня-тым обозначением, т.е. что-то типа /dev/ide/host0/bus0/target0/lun0/part4, программы не распознают символичес-ких ссылок.

Теперь запускаем программу vgscan, которая отыщетвсё разделы с идентификатором 8е и создаст конфигу-рационные файлы /etc/lvmtab и /etc/lvmtab.d.

Дополнительно можно проверить, что думает о создан-ных физических томах система.

И теперь объединяем все в группу томов. Для этоговызывается команда vgcreate, в качестве аргументов при-нимающая условное имя будущей группы, которое можетбыть любым (кроме lvm), и разделы, которые будут вклю-чены в эту группу. Дополнительно при помощи опции -s##m можно задать размер physical extent (в большинстверекомендуют 32 Мб). По умолчанию создаётся линейныйрежим чередования. Если есть необходимость, в полоса-том режиме используйте опцию -i, a -l # при этом задастразмер чередующихся блоков.

Обратите внимание на максимальный размер volume

Command (m for help): p

Disk /dev/hdñ: 3243 MB, 3243663360 bytes128 heads, 63 sectors/track, 785 cylindersUnits = cylinders of 8064 * 512 = 4128768 bytes

Device Boot Start End Blocks Id System/dev/hdb1 1 20 168682+ 82 Linux swap/dev/hdb2 21 785 3165088+ 8e Linux LVM

Command (m for help): wThe partition table has been altered!

Calling ioctl() to re-read partition table.

WARNING: If you have created or modified any DOS 6.xpartitions, please see the fdisk manual page for additionalinformation.Syncing disks.

# /sbin/pvcreate /dev/hda4pvcreate -- physical volume "/dev/hda4" successfully created

# /sbin/pvcreate /dev/hdb2pvcreate -- physical volume "/dev/hdb2" successfully created

# /sbin/vgscanvgscan -- reading all physical volumes (this may take a while...)vgscan -- "/etc/lvmtab" and "/etc/lvmtab.d" successfully createdvgscan -- WARNING: This program does not do ↵

a VGDA backup of your volume group

# /sbin/pvscanpvscan -- reading all physical volumes (this may take a while...)pvscan -- inactive PV "/dev/hda4" is in no VG [1.27 GB]pvscan -- inactive PV "/dev/hdb2" is in no VG [3.02 GB]pvscan -- total: 2 [4.29 GB] / in use: 0 [0] / in no VG: 2 ↵

[4.29 GB]

# /sbin/vgcreate -s 32 test /dev/hda4 /dev/hdb2vgcreate -- INFO: maximum logical volume size is 2 Terabytevgcreate -- doing automatic backup of volume group "test"vgcreate -- volume group "my" successfully created and activated

# /sbin/pvscanpvscan -- reading all physical volumes (this may take a while...)pvscan -- ACTIVE PV "/dev/hda4" of VG "test" ↵

[1.22 GB / 1.22 GB free]pvscan -- ACTIVE PV "/dev/hdb2" of VG "test" ↵

[2.97 GB / 2.97 GB free]pvscan -- total: 2 [4.29 GB] / in use: ↵

2 [4.29 GB] / in no VG: 0 [0]

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

9№10(11), октябрь 2003

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

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

В RedHat 9 в /etc/rc.d/rc.sysinit все это прописано таки-ми строками:

И для размонтирования при остановке системы долж-на выполниться команда (/etc/rc.d/init.d/halt):

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

Теперь при помощи resize_reiserfs изменяем разделсамой файловой системы:

Проверяем:

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

� размонтируем файловую систему;� уменьшаем файловую систему с запасом;� уменьшаем размер логического тома при помощи

lvreduce;� расширяем файловую систему до заполнения всего тома.

В командах это выглядит так:

При работе с ext2 используется – resize2fs, XFS –xfs_growfs (но пока она урезаться не может).

И хотелось бы сказать ещё об одной возможностиLVM, названной snapshots, которая позволяет админи-стратору создавать новое блочное устройство, в кото-рое копируется логический том в «замороженном» наэтот момент состоянии. Этот режим позволяет произ-водить резервное копирование без закрытия приложе-ний. Фактически теперь можно производить резервноекопирование при любой нагрузке. По окончании про-цесса копирования администратор должен удалитьsnapshots.

Создается snapshots командой lvcreate с ключом -s и суказанием размера, имени и логического тома, состоя-ние которого необходимо заморозить.

В результате образуется ещё один логический том сименем /dev/test/home_backup.

Его можно смонтировать и посмотреть, что там есть.

Всё, теперь архивируем данные и удаляем snapshots.

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

Дополнительную информацию, кроме вышеназванно-го HOWTO, можно получить в статьях Дэниеля Роббин-сона (Daniel Robbins) – одного из создателей дистрибу-тива Gentoo Linux в Learning Linux LWM, Part 1 и Part 2:http://www-106.ibm.com/developerworks/linux/library/l-lvm/

Как разместить корневую файловую систему на LVM,можно узнать по адресу: http://www.the-infinite.org/archive/docs/lvm/howto-boot-off-root-lv.txt

И в man-страницах, конечно же.

/dev/test/lvm_home /home/test reiserfs defaults 0 0

/sbin/vgscan/sbin/vgchange -ay

# LVM initialization

if [ -f /etc/lvmtab -a ! -e /proc/lvm ] ; thenmodprobe lvm-mod >/dev/null 2>&1

fi

if [ -e /proc/lvm -a -x /sbin/vgchange -a -f /etc/lvmtab ]; thenaction $"Setting up Logical Volume Management:" ↵

/sbin/vgscan && /sbin/vgchange -ay

fi

/sbin/vgchange -an

# /sbin/lvextend -L +1G /dev/test/lvm_homelvextend -- extending logical volume ↵

"/dev/test/lvm_home" to 2 GBlvextend -- doing automatic backup of volume group "test"lvextend -- logical volume "/dev/test/lvm_home" ↵

successfully extended

# /sbin/resize_reiserfs -f /dev/test/lvm_home

# dfdev/hda3 4032124 2789108 1038188 73% /

...

/dev/test/lvm_home 2097084 32840 2064244 2% /home/test

# umount /dev/test/lvm_home# resize_reiserfs -s -1.5G /dev/test/lvm_home # lvreduce -L -1G /dev/test/lvm_home # resize_reiserfs -f /dev/test/lvm_home

# mkdir /mnt/snapshots# mount /dev/test/home_backup /mnt/snapshotsmount: block device /dev/ops/dbbackup is write-protected, ↵

mounting read-only

# umount /dev/test/home_backup# lvremove /dev/test/home_backup

# lvcreate -L592M -s -n home_backup /dev/test/lvm_home

lvcreate -- WARNING: the snapshot must be disabled ↵if it gets full

lvcreate -- INFO: using default snapshot chunk size of 64 KB ↵for "/dev/test/home_backup "

lvcreate -- doing automatic backup of "test "

lvcreate -- logical volume "/dev/test/home_backup" ↵successfully created

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

10

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

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

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

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

ПреамбулаДанный материал – не сравнительный обзор протоколовработы с почтой, а практические рекомендации по уста-новке IMAP-сервера (Internet Message Access Protocol)для тех, кто уже определился, что именно это ему не-обходимо.

Тем, кто еще не определился с выбором, рекомендуюпочитать http://www.imap.org/imap.vs.pop.brief.html.

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

Дополнительно настроим веб-интерфейс к системефильтрации почты на сервере.

Использовавшаяся в процессе подготовки материалаоперационная система – Slackware Linux 9.0, MTA –sendmail 8.12.9, MUA – sylpheed 0.9.4.

Везде, где в тексте встречается your.hostname.domain –заменять на реальное имя вашего сервера.

Подготовительные работы� Обновляем openssl и sendmail до актуального состояния.� Скачиваем:

� cyrus-imapd-2.1.15.tar.gz (http://asg.web.cmu.edu/cyrus/)

� cyrus-sasl-2.1.15.tar.gz (http://asg.web.cmu.edu/sasl/)� php-4.3.2.tar.gz (http://www.php.net/)� apache-1.3.28.tar.gz (http://httpd.apache.org/)� imap-2002d.tar.Z (http://www.washington.edu/imap/)� libmcrypt-2.5.7.tar.gz (http://mcrypt.hellug.gr/)� smartsieve-i18n-ru.tar.gz (http://diesel.tomsk.ru/linux/

files/smartsieve-i18n-ru.tar.gz)� Заводим пользователя cyrus (группа mail, домашний

каталог /var/imap)

Сборка cyrus-saslSASL (Simple Authentication and Security Layer) – это на-бор утилит и библиотек, необходимых для авторизациипользователей.

В документации по cyrus-sasl рекомендуется отключитьвсе неиспользуемые механизмы авторизации, я решилоставить только digest-md5, cram-md5, plain, anonymous.

Заводим базу пользователей. Добавляем пользовате-ля (подобным образом нужно будет добавить всех почто-вых пользователей):

Указываем пароль, после этого у нас должен получить-ся файл /etc/sasldb2 (это и есть база паролей для автори-зации):

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

Сборка cyrus-imapdТеперь соберем непосредственно IMAP-сервер. Здесь всепросто:

Примечание: по умолчанию при обработке писем, в за-головках которых содержатся 8-битные символы (это про-тиворечит RFC), заменяет их символами «X». Если вы хо-тите, чтобы такие письма проходили без модификации –можете перед сборкой внести соответствующие измене-ния в файлах imap/message.c и imap/lmtpengine.c (заком-ментировав строки 270 и 860 соответственно). Но, вооб-ще-то, это нужно только в специфических случаях и луч-ше оставить все как есть, чтобы не противоречить стан-дарту.

Настраиваем cyrus-imapdДля того чтобы в случае неполадок облегчить поиск про-блемы, включаем журналирование посредством syslog.

Добавляем в /etc/syslog.conf следующее:

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

Создаем /etc/imapd.conf:

Его содержимое:

Подробнее о возможных используемых опциях можнопосмотреть в соответствующей man-странице:

Создаем каталоги и выставляем на них права:

# tar zxvf ./cyrus-sasl-2.1.15.tar.gz# cd cyrus-sasl-2.1.15# ./configure --disable-otp --disable-krb4 --disable-gssapi ↵

--without-pam# make# make install# ln -s /usr/local/lib/sasl2 /usr/lib/sasl2# ldconfig

# saslpasswd2 -c cyradmin

# chown cyrus.mail /etc/sasldb2

# tar zxvf ./cyrus-imapd-2.1.15.tar.gz# cd cyrus-imapd-2.1.15# ./configure# make# make install

local6.debug /var/log/imapd.logauth.debug /var/log/auth.log

# killall -1 syslogd

# touch /etc/imapd.conf

configdirectory: /var/imappartition-default: /var/spool/imapsievedir: /var/spool/sieveadmins: cyradminsasl_pwcheck_method: auxpropsasl_auxprop_plugin: sasldbsasl_mech_list: CRAM-MD5 PLAINtls_cert_file: /var/imap/server.pemtls_key_file: /var/imap/server.pem

# man imapd.conf

# mkdir /var/imap# chmod 750 /var/imap# mkdir /var/spool/imap# chmod 750 /var/spool/imap# mkdir /var/spool/sieve# chmod 750 /var/spool/sieve

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

12

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

Создаем структуру остальных каталогов (в документа-ции к cyrus-imapd сказано, что надо сделать «su cyrus» итолько потом выполнять следующие действия, но я устанав-ливал из-под рута и потом просто раздал права доступа):

Примечание: если у вас файловая система ext2 на томразделе, где будут размещаться базы, то почитайте ори-гинальную документацию к cyrus-imapd.

Если у вас прописаны в (x)inetd.conf сервисы pop3,imap, pop3s, kpop, lmtp, sieve – закомментируйте их и пе-резапустите (x)inetd.

В /etc/services прописываем (если там нет этих записей):

Из каталога master/conf берем конфигурационный файл:

Пробуем вручную запустить процесс master:

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

Вышеприведенной командой мы создали X.509 сер-тификат, действительный 1 год (эта строчка для генера-ции есть в документации к cyrus-imapd).

За более подробной информацией по поводу серти-фикатов и openssl, в общем, можно сходить на http://www.openssl.org/ в раздел документации, правда, там за-частую можно встретить надписи [STILL INCOMPLETE].

Настраиваем sendmailНам понадобится пакет sendmail-cf, если вы ставилиsendmail из пакета (package) в slackware.

Создаем наш mc-файл конфигурации sendmail:

Добавляем туда строчки:

Если вы ставили sendmail-cf из пакета, то в скриптеBuild надо заменить строчку:

на

Примечание: если вы устанавливаете imapd такимобразом, что сокет для работы с почтой находится в от-личном от /var/imap/socket/lmtp месте, то необходимо бу-дет исправить путь в файлике cyrusv2.m4 (по умолча-нию в slackware его можно найти в /usr/share/sendmail/cf/mailer).

Если у вас sendmail версии 8.12.8 и ниже – загляните вдокументацию к cyrus-imapd, но я бы посоветовал обно-вить sendmail.

Собираем новый sendmail.cf:

Добавляем запуск /usr/cyrus/bin/master в стартовыескрипты (например, в /etc/rc.d/rc.init2) и перезагружаемся.

Проверяем работоспособностьВоспользуемся утилитой imtest:

Вводим пароль, если нам отвечают A01 OK, то все нор-мально, если ругаются – идем в /var/log курить логи допросветления.

Создаем почтовые ящикиДля управления почтовыми ящиками в комплекте с cyrus-imapd идет утилита cyradm.

После инсталляции для запуска cyradm мне пришлосьскопировать часть библиотек, которые поставились несовсем корректно (при сборке cyrus-imapd с --prefix=/usrтакой проблемы не будет):

Типовая процедура создания нового почтового акка-унта:

В cyradm создаем почтовый ящик для пользователя иустанавливаем квоту в 20 Мб:

Все, теперь настраиваем клиентскую часть и прове-ряем, что у нас получилось.

В качестве клиента я использовал sylpheed, собран-ный с поддержкой SSL (configure --enable-ssl).

Настраиваем sieveSieve – язык, на котором пишутся почтовые фильтры вcyrus-imapd.

# ./Build current.cf# cp ./current.cf /etc/mail/sendmail.cf

# /usr/local/bin/imtest -m cram-md5 ↵-a cyradmin your.hostname.domain

pop3 110/tcpimap 143/tcpimsp 406/tcpacap 674/tcpimaps 993/tcppop3s 995/tcpkpop 1109/tcpsieve 2000/tcplmtp 2003/tcpfud 4201/udp

# cp master/conf/normal.conf /etc/cyrus.conf

# /usr/cyrus/bin/master &

# openssl req -new -x509 -nodes -out /var/imap/server.pem ↵-keyout /var/imap/server.pem -days 365

# chown cyrus.mail /var/imap/server.pem

# cd /usr/share/sendmail/cf/cf# cp ./linux.smtp.mc ./current.mc

define(`confLOCAL_MAILER', `cyrusv2')dnlMAILER(`cyrusv2')dnl

M4=`sh $BUILDTOOLS/bin/find_m4.sh`

M4=/usr/bin/m4

# cd cyrus-imapd-2.1.15/tools# ./mkimap# chown -R cyrus.mail /var/imap# chown -R cyrus.mail /var/spool/imap# chown -R cyrus.mail /var/spool/sieve

# cp -R /usr/local/lib/perl5 /usr/lib/

# saslpasswd2 -c dummyuser# cyradm --user cyradmin --server your.hostname.domain

your.hostname> cm user.dummyuseryour.hostname> sq user.dummyuser 20480

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

13№10(11), октябрь 2003

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

Проверяем работоспособность сервера sieve (timsieved):

Если отвечают «IMPLEMENTATION» «Cyrus timsievedv2.1.15» ... OK, то все в порядке.

Пишем на sieve скрипт для разбора почты (приведуздесь несколько типовых действий, дальше должно бытьпонятно):

Сохраняем этот скрипт в файлик test.script.Подключаемся к серверу sieve, загружаем и активи-

руем скрипт:

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

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

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

Устанавливаем библиотеку c-clientДля того чтобы впоследствии скомпилировать PHP споддержкой imap, необходимо установить бибилиоте-ку c-client.

Инструкции по сборке я нашел на www.php.net, поис-кав по сайту с ключевым словом «imap».

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

Авторы сего пакета, по всей видимости, не подозре-вают о существовании таких благ цивилизации, какautoconf и иже с ним, поэтому configure скрипта внутринет, вместо него эксплуатируются мозги администратора.

Просматриваем содержимое Makefile, среди коммен-тариев ищем наиболее подходящее вашей системе опи-сание, например, это «slx» («Linux using -lcrypt to get thecrypt() function»).

Затем пробуем скомпилировать c-client с выбраннойопцией:

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

Можно либо править Makefile, либо указывать опциипри запуске make.

Для моей системы команда сборки выглядела следу-ющим образом:

При возникновении проблем помогает вдумчивое про-чтение Makefile.

Итак, компиляция успешно завершена, теперь следу-ющий этап – инсталляция скомпилированного (да, не удив-ляйтесь, make install не сработает – авторы решили вы-держать все в одном стиле и не написали такой цели вMakefile, так что опять будем делать все вручную).

Создаем каталог /usr/local/imap-2002d и подкаталоги/usr/local/imap-2002d/include и /usr/local/imap-2002d/lib.

Из подкаталога c-client копируем все *.h-файлы вinclude, все *.c в lib.

В том же каталоге находим файл c-client.a и копируемего в lib, переименовывая в libc-client.a.

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

Устанавливаем веб-серверПредварительно собираем libmcrypt (тут все тривиально):

Установка и настройка Apache+PHP – очень обшир-ная тема, я ограничусь лишь минимальным количествомразъяснений, которого должно хватить для достижениянаших целей.

Распаковываем apache, запускаем скрипт configure безкаких-либо параметров.

Распаковываем php (в том же каталоге, где разверну-ли apache), собираем:

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

# make slx

# telnet your.hostname.domain sieve

require ["reject","fileinto"];

# íå ïðèíèìàåì ïî÷òó è âûñûëàåì ñîîáùåíèå îá îòêàçå:if address :is :all "From" "[email protected]" {

reject "Äîñòàëè";}

# ôèëüòðóåì ïî subject êîðïîðàòèâíûé ñïèñîê ðàññûëêè:if header :contains "Subject" "corporate mailing" {

fileinto "INBOX.lists.corporate";}

# åùå îäèí ñïèñîê ðàññûëêè:if header :is "List-Id" ↵

"<bugtraq.list-id.securityfocus.com>;" {fileinto "INBOX.lists.bugtraq";

}

# à ýòî âîîáùå ñòðàííûå ïèñüìà - àäðåñîâàíû íå íàì:if anyof ( not address :all :contains ["To", "Cc", "Bcc"] ↵

"[email protected]" ) {fileinto "INBOX.bad";

}

# sieveshell -u cyradmin your.hostname.domain> put test.script> activate test> quit

# make slx EXTRASPECIALS="SSLINCLUDE=/usr/include/openssl ↵SSLLIB=/usr/lib"

# tar zxvf ./libmcrypt-2.5.7.tar.gz# cd libmcrypt-2.5.7# ./configure# make# make install# ldconfig

# ./configure --with-imap=/usr/local/imap-2002d ↵--with-imap-ssl=/usr/include/openssl ↵--with-apache=./../apache_1.3.28 ↵--with-mcrypt=/usr/local --with-iconv

# make# make install

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

14

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

Копируем файлик php.ini-recommended в /usr/local/lib/php.ini.

Если php успешно собралось и заинсталлировалось,возвращаемся в каталог с apache:

Если все собралось, идем в каталог, куда заинсталли-ровался apache (по умолчанию – /usr/local/apache), в ка-талоге bin запускаем веб-сервер командой:

Проверяем работоспособность сервера:

Либо просто любым браузером обращаемся по адре-су нашего сервера.

Если видим ободряющую надпись «If you can see this, itmeans that the installation of the Apache web server software onthis system was successful», значит – все нормально, иначеперечитываем вышенаписанное и идем читать документа-цию по php и apache до тех пор, пока не наступит счастье.

Устанавливаем SmartSieveВ принципе можно удовлетвориться взаимодействием сsieve-сервером посредством sieveshell, но с точки зрениярядового пользователя такой метод управления почтойвряд ли можно назвать удобным.

Альтернативой может послужить использование Smart-Sieve (http://smartsieve.sourceforge.net/) – это написанныйна PHP менеджер sieve-скриптов, позволяющий черз веб-интерфейс управлять правилами сортировки почты.

Изначально я скачал с официального сайта smartsieve-i18n версии 0.5.1, однако при его использовании столк-нулся с проблемой работы с русскими именами катало-гов в почтовом ящике. Решив, что транслит и другие ком-промиссы – это не наш метод, пропатчил это дело, заод-но написав русскую версию.

Русифицированную версию smartsieve можно скачать поадресу: http://diesel.tomsk.ru/linux/files/smartsieve-i18n-ru.tar.gz.

Вся процедура установки сводится к распаковке тар-бола и копированию содержимого в структуру каталогов,являющуюся структурой http-корня веб-сервера.

По умолчанию опция DocumentRoot равна «/usr/local/apache/htdocs». Уточнить ее значение можно в основномконфигурационном файле apache – httpd.conf (по умол-чанию он находится в /usr/local/apache/conf).

Допустим, мы скопировали файлы smartsieve в /usr/local/apache/htdocs/smartsieve.

Проверяем работоспособность, открывая в браузерестраницу http://your.hostname.domain/smartsieve/

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

Небольшое примечание: smartsieve может не работатьс sieve-скриптами, написанными вами вручную, а не с егопомощью.

ЗаключениеЕсли вы дошли до этого места и у вас все работает, зна-чит, мы достигли поставленной вначале цели.

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

Отдельное спасибо Антону Жаровцеву (aka warm) законсультации.

# ./apachectl start

# lynx http://your.hostname.domain/

# ./configure --activate-module=src/modules/php4/libphp4.a# make# make install

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

Неделя Информационных Технологий «IT-Week 2004»это:� Крупнейший в России и странах СНГ форум в отрасли

Информационных Технологий� Пять международных IT-выставок, проводимых в одно

время и в одном месте� Две международные конференции� Более 250 компаний-участников из 25 стран мира� Свыше 75 000 посетителей из более чем 500 городов

России и СНГ� 35 000 специалистов IT-индустрии в деловой части вы-

ставки� Официальная поддержка Министерства РФ по связи

и информатизации, Министерства промышленности,науки и технологий РФ, Министерства экономическо-го развития и торговли РФ, Министерства образова-ния РФ, а также Правительства Москвы

В рамках «IT-Week 2004» пройдут следующие выстав-ки и конференции:1. Personal Computing Expo – общая, неспециализиро-

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

2. Hardware & Peripherals Expo – специализированнаявыставка, на которой представлены: компьютеры, мо-ниторы, периферийные устройства, комплектующие,накопители, коммуникационное оборудование и услу-ги, т.е. весь спектр hardware, ориентированного на ве-дение бизнеса.

3. Software Expo – специализированная выставка, ори-ентированная на программные продукты для систембухгалтерского и складского учета, комплексного ПОуправления предприятием, систем управления доку-ментооборотом, систем распознавания документов,разработку ПО, защиту информации. В рамках этойвыставки будет подготовлен цикл тематических се-минаров, посвященных актуальным вопросам в об-ласти разработки экономических программ и системуправления бизнесом.

4. Специализированная выставка CAD/CAM/CAE представ-ляет системы автоматизированного проектирования. Длябольшинства российских производителей необходимостьиспользования САПР для оптимизации работы предпри-ятия стала очевидной. Особенно ярко это проявляется втаких отраслях, как авиастроение, автомобилестроение,тяжелое машиностроение, архитектура, строительство,нефтегазовая промышленность.

5. eLearn Expo – специализированная выставка, на кото-рой будут демонстрироваться новейшие продукты и тех-нологии в сфере электронного обучения, предназначен-ные для коллективного и индивидуального пользования.Дистанционное обучение через сети Internet и Intranet,получившее широкое распространение в развитых стра-нах, становится все более актуальным и для России.

6. eBusiness Russia (Электронный бизнес в России) –международная конференции, посвященная вопросамавтоматизации бизнес-процессов, развития электрон-ной коммерции, подбора ИТ-персонала.

7. Международная конференция eLearning Russia (Ин-формационные технологии в образовании), на которойбудут освещены последние достижения образователь-ных технологий в школах, вузах, а также рассмотренывопросы дистанционного и бизнес-образования.

Рекламная кампания по привлечению посетителей наIT-Week основана на многолетнем опыте проведения выс-тавок, тщательном анализе данных маркетинговых иссле-дований и четком выделении целевой аудитории. Посеще-ние специализированных выставок Hardware & PeripheralsExpo, Software Expo, CAD/CAM/CAE, eLearn Expo, состав-ляющих деловую часть Недели Информационных Тех-нологий, возможно только для корпоративных бизнес-по-сетителей, прошедших регистрацию. Это позволяет каче-ственно изменить состав посетителей этой части и даетвозможность участникам в деловой обстановке предста-вить свою продукцию и услуги заинтересованным специа-листам и партнерам по бизнесу. Практически полностьюаудитория деловой части IT-Week представлена менед-жерами высшего и среднего звена, техническими специа-листами и системными администраторами.

Тел.: +7 (095) 935 7350, 935 8120eMail: [email protected]

Уважаемые господа!

Компания «ITE LLC» (Москва), при содействииITE Group Plc (Великобритания) предлагаетВашему вниманию

Москва, Экспоцентр на Красной Пресне26 – 29 апреля 2004 года

НЕДЕЛЮ ИНФОРМАЦИОННЫХ ТЕХНОЛОГИЙ«IT-WEEK 2004»

15№10(11), октябрь 2003

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

16

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

НАСТРАИВАЕМASPLINUX 7.3 SERVER EDITION

АЛЕКСАНДР ШИБЕНКО

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

17№10(11), октябрь 2003

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

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

Размечать жесткий диск оказалось даже приятно. Гра-фическая утилита позволяет легко и наглядно выбиратьтип и размер файловой системы, а также задавать точкумонтирования. Еще порадовало, что система без проблемраспознала наличие на материнской плате 815-го чипсетаи интегрированной видеокарты. Правда, установить для мо-нитора режим 800х600 с частотой 85 Гц не удалось, при-шлось ограничиться 60 Гц. Но на фоне воспоминаний отом, что выводилось на экран после установки RedHat 6.2на компьютер с 810-м чипсетом, с этим легко можно былосмириться. Также без проблем сами установились драй-веры для сетевых карт Compex и Davicom, причем о су-ществовании второй фирмы-изготовителя я до этого мо-мента даже не слышал. Затем из предложенного списка,где среди прочих фигурировал пункт «сервер для работыс 1С» я выбрал «сервер для рабочей группы», потом на-ставил галочек против интересующих меня пакетов, со-гласился с предложением доставить неотмеченные, нонеобходимые для работы выделенных, компоненты, по-наблюдал за их копированием и с удивлением понял, чтопроцесс инсталляции в целом занял совсем немного вре-мени. Единственное, что не удалось сделать – создать заг-рузочную дискету. После нескольких попыток, заканчи-вающихся сообщением об ошибке, было решено сделатьэто позднее.

Пришло время для более интересного занятия – соб-ственно настройки системы. Если помните, необходимобыло обеспечить подключение локальной сети к Интер-нету. Причем дело не ограничивалось только доступом кресурсам веб-серверов. Нужны были и ftp-клиент, и ра-бота с почтой по протоколу POP3. Поэтому разумным по-казалось воспользоваться трансляцией адресов (Networkaddress translation, NAT). ASPLinux 7.3 Server Edition бази-руется на ядре версии 2.4.18 и это значит, что соответ-ствующие настройки нужно производить с помощью ути-литы iptables, входящей в дистрибутив. В нашем случаевыглядит это следующим образом:

Т.е. все адреса из частной сети 192.168.100.0 будут транс-лироваться в единственный реальный адрес 207.46.249.27.Но это не все. Созданные подобным образом правиласохраняются только в оперативной памяти и в случаеперезагрузки сервера оказываются утерянными. Пер-вое, что приходит в голову, – написать собственныйсценарий и обеспечить его запуск во время старта сис-темы, к примеру, поместив его (или ссылку на него) в

каталог /etc/rc.d/rc3.d/. А заодно и в /etc/rc.d/rc5.d/. И вэтом же сценарии разрешить, что тоже необходимо, пе-ренаправление пакетов на другой сетевой интерфейскомандой:

Примерно так я и сделал. Все заработало, но не поки-дало ощущение неправильности или, точнее, неизящнос-ти такого подхода. Пришлось подробнее ознакомиться сописанием iptables, где, среди прочего, упоминались двасценария: iptables-save и iptables-restore. Причем после-дний вызывался в сценарии /etc/rc.d/init.d/iptables. Как го-ворится в детской игре, стало «теплее». Последовало про-чтение еще пары-тройки руководств – и все встало на своиместа. Действительно, при старте системы скрипт /etc/rc.d/init.d/iptables пытается считать файл /etc/sysconfig/iptables и применить сохраненные в нем правила. Ровното, что и требовалось. Осталось только сформировать этотсамый /etc/sysconfig/iptables. Но запущенный без парамет-ров iptables-save почему-то этот файл не создал и при-шлось сделать это принудительно:

Осталось разрешить перенаправление пакетов. Здесьрешение возникло в процессе просмотра log-файлов за-пуска и останова системы. Бросилось в глаза, что в нихприсутствует строка, содержащая примерно следующее:«sysctl: net.ipv4.ip_forward = 0». Т.е. при останове систе-мы задача, обратная нашей, решается с помощью вызо-ва команды sysctl, которая считывает предопределенныенастройки из файла /etc/sysctl.conf. Исправляем в немnet.ipv4.ip_forward = 0 на net.ipv4.ip_forward = 1 и можнодвигаться дальше.

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

О том, как с помощью Samba реализовать доступ кфайлам и эмуляцию контроллера домена, написаномного. Да и проблем на этом этапе практически не воз-никло. А вот с чем реально пришлось побороться – такэто с печатью. В «Руководстве пользователя» предла-гается использовать для ее настройки графическую ути-литу PrintTool. Однако если не устанавливать поддержкуX Window System (а так ли нужны они на сервере?), вос-пользоваться ей, естественно, не удастся. Поэтому опи-шу, как выглядел процесс при использовании только тек-стовой консоли.

Согласно большинству источников процедура настрой-ки печати заключается в следующем. Сначала проверя-ется наличие в секции [printers] файла smb.conf парамет-ра вида:

iptables -t nat –A POSTROUTING –s 192.168.100.0/24 ↵–d 0/0 –j SNAT --to-source 207.46.249.27

echo 1 > /proc/sys/net/ipv4/ip_forward

service iptables save

path = /var/spool/samba

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

18

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

Если его нет, нужно добавить. Кроме того, необходи-мо вставить в файл /etc/printcap следующие строки:

Проделав это и перезапустив с помощью расположен-ных в /etc/rc.d/init.d/ сценариев lpd и smb, я вместо распе-чатки тестовой страницы печати Windows c клиентскогоПК получил следующее. Сценарий lpd выдал предупреж-дение о несоответствии прав на каталог /var/spool/sambaи о том, что в системе отсутствуют принтеры. И действи-тельно, файл /etc/printcap оказался пустым. А у катало-га /var/spool/samba изменились владелец и права досту-па. Пришлось смотреть, что же делает /etc/rc.d/init.d/lpd.Что происходит с файлом printcap, стало понятно доста-точно быстро. Оказалось, что разработчики сценария те-перь предложили хранить описания установленных прин-теров в файле /etc/printcap.local, а в /etc/printcap простопереписывается его содержимое. А с правами все оказа-лось несколько сложнее. До конца разобраться в проис-ходящем так и не удалось, но работоспособное решениепоявилось. Вот оно.

В /etc/samba/smb.conf оставляем:

Создаем файл /etc/printcap.local следующего содержания:

На каталог /var/spool/samba устанавливаем права 1777.Затем создаем каталог /var/spool/samba/hp с правами поумолчанию. После чего перезапускаем /etc/rc.d/init.d/lpdrestart. Появится предупреждение о несоответствии правна каталог /var/spool/samba/hp и они изменятся на 700, авладельцем каталога станет пользователь lp. Теперь пе-чать должна заработать.

Дело осталось за малым – обеспечить запуск иостановку Samba. Ранее уже упоминался выполняющийэту процедуру сценарий /etc/rc.d/ini.d/smb. Можно было бы,как и на начальном этапе настройки iptables, создать нанего ссылки в соответствующих каталогах, но нашелсяболее простой, на мой взгляд, способ – воспользоваться

командой chkconfig. Для этого останавливаем Samba:

затем выполняем:

Но у меня так не получилось. Скорее всего дело в том,что для smb в chkconfig не прописаны уровни (run level)системы, для которых этот сервис должен выполняться.Поэтому пришлось сделать это следующим образом:

после чего выполнить проверку и снова запустить Samba:

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

В заключение хотелось бы поделиться еще одним со-ображением. При установке сервера я оставил на немпредлагаемую по умолчанию поддержку русского языкаи столкнулся со следующим неудобством, характерным,пожалуй, практически для всех локализованных продук-тов, но по-разному проявляющимся. Речь идет о диагнос-тических сообщениях и предупреждениях об ошибках.Если при работе с русифицированной версией какой-либоОС из семейства Windows весьма сложно бывает понять,о чем идет речь в выводимых системой сообщениях (итем более невозможно в том же англоязычном TechNetпровести контекстный поиск), то в моем случае выводи-мые по-русски, но в кодировке KOI-8R, сообщения на кли-ентских компьютерах оказались просто нечитабельными.В связи с этим есть предложение к разработчикам, зани-мающимся локализацией продуктов. Если это возможно,кроме перевода, оставляйте в системных сообщениях ихоригинальное написание. Тем самым вы существеннооблегчите жизнь многим системным администраторам.

Автор выражает большую благодарность порталуSysAdmins.RU и лично Липовцеву Алексею за участие внаписании этой статьи.

lp|hp:\:sd=/var/spool/samba:\:mx#0:\:sh:\

path = /var/spool/samba

lp|hp:\:sd=/var/spool/samba/hp:\:mx#0:\:sh:\

service smb restart

chkconfig --add smb

chkconfig --level 345 smb on

chkconfig --list smbservice smb restart

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

Теперь выставим пользователя:

Можно перезапускать сквид:

и радоваться жизни.При обращении к серверу ICQ получает html вот тако-

го формата:

Теперь мы несколько изменим данный текст и запи-шем его в нашем файле noicq.html:

Таким образом можно заменить картинку баннера сво-ей и даже вставить свой линк.

Материал предоставлен порталом SysAdmins.RU.http://portal.sysadmins.ru/board/viewtopic.php?t=20783

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

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

И такое решение есть!Запускаем на шлюзе:

и открываем аськино окошко ввода мессаджа (то, кото-рое с баннером).

И тут tcpdump вдруг показывает строчки вида:

Теперь открываем конфиг сквида и добавляем следу-ющие строчки:

Реконфигурим сквид и... нет баннеров, но есть некра-сивый html про ошибку в поле для баннера. Это не по-нашему!

Убираем две вышеобозначенные строки из squid.conf ипереходим к конфигурации SquidGuard (если кто не в кур-се, то http://onix.opennet.ru ). В директории баз SquidGuardсоздадим директорию icq, а в ней – файл expressions, вкотором напишем строчку:

Теперь в конфиге SquidGuard добавим такое правило:

А в блок ACL добавим:

ну а на сервер повесим файл /squidGuard/noicq.html, со-держащий примерно следующее:

tcpdump -li xl0 -w - src host ÍÀØ_IP |strings

GET /client/ate/ad-handler/ad_468/0,,93169~

acl ICQban urlpath_regex /client/ate/ad-handlerhttp_access deny ICQban

(/client/ate/ad-handler)

dest icq {expressionlist icq/expressionsredirect http://ÍÀØ ÑÅÐÂÅÐ/squidGuard/noicq.html}

pass ... !icq ...

STOP DA BANNERS! =)))

chown -R nobody /usr/local/squid/db/squidGuard

killall -HUP squid

<!-- Vignette StoryServer 5.0 Sun Jul 13 03:58:25 2003 --><html><head><title>Welcome to ICQ 2000a </title></head><!-- "ICQWidth=234" "ICQHeight=65" --><body bgcolor="white"><!-- Ate Windows options --><table width="100%" border="0"><tr><td align="CENTER" valign="MIDDLE"><!-- Icons and Banner --><a X-PASSCOOKIES href="http://ar.atwola.com/link/93169516/ ↵

%RAND%/aol/" target="_new"><img ↵src="http://ar.atwola.com/image/93169516/%RAND%/aol/ ↵" width="468" height="60" border="0"></a>

<!-- /// Icons and Banner --></table></body></html>

<!-- Vignette StoryServer 5.0 Sun Jul 13 03:58:25 2003 --><html><head><title>Welcome to ICQ 2000a </title></head><!-- "ICQWidth=234" "ICQHeight=65" --><body bgcolor="white"><!-- Ate Windows options --><table width="100%" border="0"><tr><td align="CENTER" valign="MIDDLE"><!-- Icons and Banner --><a X-PASSCOOKIES href="http://192.168.0.251/squidGuard/ ↵

NOBANNERS.html?%RAND%" target="_new"><img ↵src="http://192.168.0.251/squidGuard ↵/noicq.gif?%RAND%" width="468" height="60" border="0"></a>

<!-- /// Icons and Banner --></table></body></html>

КАК БОРОТЬСЯС БАННЕРАМИ В ICQ?

ДМИТРИЙ РЕПИН

19№10(11), октябрь 2003

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

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

20

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

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

МЕЧТА СИСАДМИНА

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

21№10(11), октябрь 2003

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

Одна из задач, которую постоянно приходится решать си-стемному администратору, – учет работы пользователейв Интернете, фильтрация ненужного трафика для повы-шения безопасности и отсеивания ненужного содержа-ния, распределение полосы между пользователями и плюссбор отчетных данных о том, кто, где и сколько. Для ад-мина со стажем это обычно не является трудной задачей,уже в распоряжении имеются собственноручно написан-ные скрипты, автоматизирующие эту рутинную работу,правда, постоянно меняющиеся данные, конечно, вносятнекоторый ажиотаж, да и возни, особенно поначалу, бы-вает предостаточно, в общем, результирующий КПД ос-тавляет желать лучшего. А вот для новичка в мире Unixэто может стать большой проблемой. OC Linux можно кри-тиковать за недружелюбие к начинающему пользовате-лю, за плохую поддержку оборудования, но практическивсегда можно найти дистрибутив, если не полностью под-ходящий под определенную задачу, то хотя бы частичноее решающий. Итак, знакомтесь: СensorNet (http://www.intrago.co.uk/products/censornet.php). Дистрибутив,базирующийся на Debian, предназначен для организациидоступа в Интернет, для управления и мониторинга пользо-вателей к Интернету. Представляет собой OpenSource-аль-тернативу коммерческим и далеко не бесплатным про-дуктам вроде WebSense, SurfControl, I-Gear, N2H2 и про-чим подобным проектам.

Возможности, предоставляемые CensorNet:� Фильтрация контента по URL, ключевым словам и фра-

зам, расширениям файлов, типам MIME, изображени-ям и пр.

� Управление доступом на уровне пользователя (нефильтруется, фильтруется, не разрешает, приостанов-ка или только по «белому» списку).

� Управление доступом на уровне компьютеров (разре-шен, запрещен, приостановка).

� Интернет-доступ по расписанию для пользователей,групп и компьютеров.

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

� Ограничение предельной полосы для пользователей,групп и машин.

� Детальный отчет по каждому пользователю.� Изменение (allow, deny) доступа к веб-сайтам на

«лету».� Подтверждение подлинности при помощи NT PDC,

Active Directory и Samba.� Автоматическое определение компьютеров в локаль-

ной сети.� Поддержка UPS.� Интегрированный firewall с NAT и кеширующий веб-сер-

вер.� Простая инсталляция и настройка посредством удоб-

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

ютеров.� Хорошая документация, понятная и новичку.

И все это совершенно бесплатно.

Опционально также возможен удаленный контроль ра-ботоспособности и создание RAID-1 SCSI и автоматичес-кое обновление списка запрещенных сайтов. Но это ужене за бесплатно. Так, возможность пользоваться Black ListSoftware Update (BLUD) стоит уже 150 у.е. на 12 месяцев.Хотя при желании некоторые опциональные функции имногое другое можно установить и настроить уже вруч-ную. Давайте познакомимся поближе.

Получение дистрибутива и его установкаПолучить СensorNet можно двумя способами: купитьCD-ROM и самому скачать с сервера. Как вы понимае-те, второй вариант наиболее подходящий в наших ус-ловиях. Но сразу скачать не получится. Сначала необ-ходимо зайти в раздел GPL Downlod и заполнить фор-му, указав рабочий e-mail, на который должна прийтиссылка на Download Centre. После чего вы получите дваписьма: одно вышепомянутое с сcылкой, а второе с бла-годарностью за интерес к дистрибутиву и пожелания-ми наладить обратную связь с разработчиками дляуточнения вопросов, связанных с дальнейшим совер-шенствованием СensorNet, и, естественно, разрешениятрудных моментов, связанных с эксплуатацией. В раз-деле Download можно найти как сам дистрибутив, намомент написания статьи это была версия 3.1r6 разме-ром 160 Мб, а также патчи и некоторые дополнения кпредыдущим версиям, плюс старые стабильные версиидистрибутива и документация по всем вопросам, дажетаким, как настройка Symantec Live Update с CensorNet.После закачки записываем ISO-образ на болванку, иможно загружаться.

Для установки потребуется отдельный компьютер сдвумя сетевыми картами и с жестким диском, подклю-ченным к первому IDE Master, причем все данные надиске будут уничтожены, о чем и предупреждает (двараза) соответствующая надпись при инсталяции. Самаустановка заключается в автоматической разбивке дис-ка, форматировании разделов под файловую системуext3 (всего создается два раздела корневой в началедиска и в конце swap) и распаковке на них одного боль-шого архива с CD-ROM, после чего устанавливаетсязагрузчик LILO. Вот в принципе и все. При желании всеэти операции можно провести и вручную без разруше-ния данных на жестком диске, если есть необходимостьсначала изучить работу на своем компьютере или про-сто добавить еще утилит в архив. На этом установкасобственно и заканчивается, далее вынимаем выехав-ший CD-ROM и перезагружаемся уже нормально с же-сткого диска.

В ходе загрузки системы обратите внимание на диаг-ностические сообщения о найденном оборудовании. Те-перь для настройки системы воспользуемся утилитой,названной CensorNet Configuration Tool (CCT). Ее можновызвать несколькими cпособами, и все они, естественно,требуют прав суперпользователя. При первом входе в си-стему регистрируемся как root и пароль root, который тутже необходимо сменить при помощи passwd. И для за-пуска CCT вводим команду setup. Навигация в CCT осу-ществляется при помощи стрелок, перемещение между

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

22

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

пунктами выбора Tab (Alt+Tab), пробелом включается/вык-лючается нужная опция, и Enter завершает процесс вы-бора данного пункта. Теперь можно, выбрав соответству-ющий пункт (рис. 1):

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

� В Network Configuration сконфигурировать сетевые ус-тройства (установить драйвера для карт в автомати-ческом или, если не получится, ручном режиме, спи-сок всех поддерживаемых можно найти на сайте; вве-сти IP-адреса для каждой; значения IP-адресов длядвух DNS-серверов и gateway; изменить сетевое имякомпьютера – по умолчанию sensornet).

� В DHCP Service Configuration при необходимости вклю-чить и отконфигурировать DHCP-сервис (диапазоныразрешенных IP-адресов и время использования IP-адреса компьютером (по умолчанию и максимальное)).

� В User Authentication Configuration выбрать метод аутен-тификации пользователя (Windows NT PDC, Windows2000 Active Directory и Internal Sensornet – Samba, пос-ледний по умолчанию, но при наличии первых двух ре-комендуется использовать именно их, да и для боль-ших сетей samba метод будет неудобным), при этомпри выборе нужного пункта активируются дополни-тельные поля для заполнения (пароль и имя пользова-теля, домен, резервный и основной PDC и пр.)

� В Web Cache Configuration настроить параметры веб-кеша, если вы уже используете данный сервис и нежелаете его перенастраивать, то достаточно выбратьпункт «Use Parent Cache» и указать необходимые па-раметры (hostname и порты), при выборе пункта «Usefor ALL request» SensorNet будет кешировать все зап-росы, а во вкладке Advanced можно установить раз-мер кеша.

� Настроить firewall. По умолчанию все входящие под-ключения заблокированы, кроме порта 22, предназ-наченного для удаленного администрирования по SSH,если не знаете, как работать с настройками firewall, тово вкладке Advanced можно отключить SSH или, на-оборот, разрешить доступ всем извне (хотя это и нелучшая идея), но этот пункт может понадобиться, еслиуже имеется установленный и настроенный firewall.

� Вкладка System Maintenance предназначена для сис-темного обслуживания и, наверное, наиболее часто ис-пользуемый пункт при эксплуатации SensorNet. Здесьможно просканировать сеть на обнаружение работа-ющих компьютеров и присоединение их к SensorNet(Probe LAN for Windows Workstation), перечитать спи-сок пользователей в PDC или Windows 2000 (RetrieveUser-list from Windows Domain Controller), очистить веб-кеш (Flush the Squid Web Disk-Cache), при этом Squidперезапускается, а вся информация удаляется, пере-строить внутреннюю базу данных (Rebuild InternalSensorNet Database), отключение пользователя admin,который нужен для удаленного администрирования(первоначальный пароль admin также нужно сменить)Reset Web Admin Area Access, в System Tuning можносинхронизировать диск, установить кратный вход(Multiple Login Sensitivity) для «кочующих» пользовате-лей, установить максимальное количество пользова-телей (Set user access level cache size) и последнимидвумя пунктами можно остановить или перезагрузитьSensorNet и выйти в shell.

� Для изменения пароля пользователям root, admin и веб-админ можно воспользоваться пунктом ChangePassword (рис. 2).

� При оплате сервиса BLUD его нужно активироватьв пункте B.L.U.D Configuration, после этого SensorNetбудет автоматически его загружать в установленноевремя.

� Последний пункт APC UPS Setting позволит настроитьпараметры источника бесперебойного питания (еслиего нет на последовательном порту, то SensorNet каж-дый раз будет ругаться при загрузке), установив тип,подключение к порту, параметры автоматической ос-тановки системы при разрядке батарей.

Дальнейшая работаПосле настройки всех необходимых параметров можно,предварительно выключив компьютер, отсоединить клави-атуру и монитор. Компьютер с установленным CensorNet ус-танавливается вместо маршрутизатора, т.е. между локаль-ной сетью и провайдером (рис. 3). Всю дальнейшую настрой-ку параметров можно производить при помощи SSH (SecureShell) или CensorNet Administration Area утилиты удаленноговеб-администрирования. Доступ к последней возможен толь-ко из внутренней сети. Для этого необходимо настроитьвеб-браузер для работы с proxy, некоторые рекомендациидля различных веб-браузеров рассмотрены в документе

Ðèñóíîê 1.

Ðèñóíîê 2.

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

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

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

«browser_config_guide», который имеется на сайте. ДляIE, например, выбираем «Сервис» → «Свойства обозре-вателя» вкладка «Подключение», нажимаем кнопку «Ус-тановить», далее выбираем подключение через локаль-ную сеть – «Ручная настройка proxy-сервера» и в окне HTTPвводим IP-адрес CensorNet-сервера, порт 8080 и для осталь-ных сервисов ставим галочку в пункте «Один прокси-сер-вер для всех протоколов» (рис. 4) (Tools -Internet Option →Сonection → LAN Settings → Use a Proxy Server → Advanced).

Ðèñóíîê 3.

Теперь, набрав в строке браузера IP-адрес или имя ком-пьютера CensorNet, попадаем в утилиту конфигурирования.Первоначально запрашивается логин и пароль. В целях бе-зопасности входите в систему как root только при первона-чальной настройке, далее при подключении через SSH ре-гистрируйтесь как admin, а при работе через веб-интерфейстолько как web_admin. В случае перехвата пароля вред, при-чиненный системе, будет меньше. Я надеюсь, что в даль-нейшем можно будет использовать защищенное подключе-ние при помощи https. Пользоваться CensorNet AdministrationArea особого труда не составит. Рабочее пространство со-стоит из нескольких вкладок (Home, Reports, Users,Workstations, Content Filter, Site Filters, Filetype Filters, ImageFilter рис. 5-5с), если подвести мышкой к соответствующе-му пункту, то появляется выпадающее меню с пунктами длянастройки параметров, при помощи которых и можно про-вести основные настройки, в том числе и создать резерв-ную копию CensorNet или восстановить все нажатием од-ной кнопки. Все вопросы освещены довольно подробно вдокументе CensorNetv3-UserGuide. При необходимости за-щищенного соединения можно прямо отсюда при помощиJava-апплета вызвать SSH. На этом, пожалуй, знакомство сэтим замечательным дистрибутивом и закончим. Как види-те, СensorNet позволяет более продуктивно использоватьресурсы Интернета, существенно сокращать время, связан-ное с администрацией сети, и тем самым освобождает ад-министратора для решения других насущных задач.Ðèñóíîê 4.

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

24

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

Ðèñóíîê 5-5a.

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

25№10(11), октябрь 2003

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

Ðèñóíîê 5b-5c.

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

26

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

SMTP AUTH IN DA POSTFIX + ...

АНДРЕЙ МОЗГОВОЙ

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

27№10(11), октябрь 2003

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

SMTP AUTH in da Postfix + Cyrus-SASL + Mysql + Courier-IMAP + DrWeb + SquirrelMail + SpamAssassin. Как собратьвсе это «хозяйство» с MTA Postfix, вы можете найти в сле-дующих статьях:� http://linuxnews.ru/docs/new/isp-mail/version1.2/isp-mail-

howto.1.2.rus.txt� http://www.onix.opennet.ru/mail/mail.html� http://www.postfix.org/docs.html

Как прикрутить SpamAssassin, можно почитать здесь:� А. Мозговой. Журнал «Системный администратор» №9(10),

стр. 50 (http://brain.msk.ru/Postfix+SpamAssassin.txt)� http://useast.spamassassin.org/doc.html

Настоящая статья только вскользь опишет общуюсборку большой связки.

Главная цель – настроить авторизацию по SMTP (без SSL)и выдержать стиль Mini-HOWTO.

Большая связкаВерсии ПО, используемые мной на момент написаниястатьи:� Linux Slackware-9.0 + Patches� Postfix-2.0.13� Cyrus-sasl-2.1.15� Mysql-3.23.56� Courier-imap-1.7.1� Drweb-4.29.5� SpamAssassin-2.55� Squirrelmail-1.4.0

Честно говоря, у меня крутится MySQL, который по-ставляется вместе с дистрибутивом. MySQL, наверное,лучше установить/настроить первым. Качаем, распаковы-ваем, конфигурим, собираем, устанавливаем. Заводим от-дельного пользователя под Postfix, например, «postfix».Кстати, для повышения безопасности, почта все-таки,заставьте MySQL не слушать Сеть, общайтесь только че-рез сокет-файл. Так оно и быстрее.

Создаем базу данных (mail), в которой будут хранить-ся таблицы, содержащие все записи о почтовых бюдже-тах (users), синонимах (aliases) и обслуживаемых доме-нах (transport).

Поля таблицМожно обойтись несколькими полями в каждой таблице, нов Postfix-2.x.x появилась поддержка дополнительных полей/условий. Это очень удобно, почему бы не воспользоватьсяими? Придерживаясь главной цели сей статьи, буду краток.Некоторые поля действительно необязательны, но они при-годятся, когда будем прикручивать веб-интерфейс собствен-ного производства (тема следующей статьи).

Cyrus-SASLНемногим сложнее MySQL. Качаем, распаковываем, кон-фигурим, собираем, устанавливаем.

PostfixКачаем, распаковываем. Учтите, что собирается postfix сучетом окружения и ОС, под которой в дальнейшем бу-дет работать. Читайте INSTALL-файл.

Настройка PostfixЕсли кратко, только то, что касается MySQL.

--- /etc/my.cnf ---...[mysqld]…skip-networking...--- EOF /etc/my.cnf ---

---./configure --enable-login --with-mysql --with-opensslmakemake install---* ïðî÷òèòå ôàéë doc/install.html, ÷òîá ñäåëàòü* âñå íåîáõîäèìûå ëèíêè

---make tidymake -f Makefile.init makefiles \'CCARGS=-DHAS_MYSQL -I/usr/include/mysql -DUSE_SASL_AUTH ↵

-I/usr/include/sasl' \'AUXLIBS=-L/usr/lib/mysql -lmysqlclient ↵

-lz -lm -L/usr/lib/sasl2 -lsasl2'make...make install---*óòî÷íèòå ïóòè äî áèáëèîòåê â âàøåé ñèñòåìå

CREATE TABLE users (uid int(11) NOT NULL auto_increment,gid int(11) NOT NULL default '12',alias varchar(255) NOT NULL default '',domain varchar(255) NOT NULL default '',active enum('1','0') NOT NULL default '1',maildir varchar(255) NOT NULL default '',password varchar(255) NOT NULL default '',password-crypt varchar(255) default NULL,owner varchar(255) NOT NULL default '',create_date datetime NOT NULL default '0000-00-00 00:00:00',change_date datetime NOT NULL default '0000-00-00 00:00:00',quota varchar(255) NOT NULL default 'NOQUOTA',comment text,PRIMARY KEY (uid),UNIQUE KEY alias (alias),FULLTEXT KEY comment (comment)

) TYPE=MyISAM COMMENT='Çäåñü õðàíèòñÿ èíôîðìàöèÿ ↵î ïî÷òîâûõ áþäæåòàõ';

CREATE TABLE aliases (id int(11) NOT NULL auto_increment,alias varchar(200) NOT NULL default '',rcpt varchar(200) NOT NULL default '',create_date datetime NOT NULL default '0000-00-00 00:00:00',change_date datetime NOT NULL default '0000-00-00 00:00:00',active enum('1','0') NOT NULL default '1',PRIMARY KEY (id),UNIQUE KEY alias (alias,rcpt)

) TYPE=MyISAM COMMENT='Çäåñü õðàíèòñÿ èíôîðìàöèÿ î ñèíîíèìàõ';

CREATE TABLE transport (id int(11) NOT NULL auto_increment,domain varchar(128) NOT NULL default '',transport varchar(128) NOT NULL default '',create_date datetime NOT NULL default '0000-00-00 00:00:00',change_date datetime NOT NULL default '0000-00-00 00:00:00',active tinyint(4) NOT NULL default '1',gid int(11) NOT NULL default '12',PRIMARY KEY (domain),KEY id (id)

) TYPE=MyISAM COMMENT='Çäåñü õðàíèòüñÿ èíôîðìàöèÿ ↵îá îáñëóæèâàåìûõ äîìåíàõ';

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

28

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

Вся информация по настройке Postfix подробно рас-писана в man-страницах и на домашнем сайте Postfix.

Расписывать установку и настройку Courier-imap,Drweb, SpamAssassin и Squirrelmail в этой статье нетсмысла.

SMTP AUTHСоздайте файл /usr/lib/sasl2/smtpd.conf следующего содер-жания:

Это все.Небольшая выжимка из README-файла.

� %u имя пользователя до @, под которым логинятся.� %p особенность запроса, механизм идентификации.� %r все что за @, т.е. имя домена.

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

--- /etc/postfix/main.cf ---relay_domains = $transport_mapstransport_maps = mysql:/etc/postfix/transport.cfvirtual_alias_domains = $virtual_alias_mapsvirtual_alias_maps = mysql:/etc/postfix/aliases.cfvirtual_gid_maps = mysql:/etc/postfix/gids.cfvirtual_mailbox_base = /virtual_mailbox_domains = $virtual_mailbox_mapsvirtual_mailbox_maps = mysql:/etc/postfix/users.cfvirtual_transport = virtualvirtual_uid_maps = mysql:/etc/postfix/uids.cf--- EOF /etc/postfix/main.cf ---

--- /etc/postfix/users.cf ---user = postfixpassword = PASSWORDdbname = mailtable = usersselect_field = maildirwhere_field = aliasadditional_conditions = and active = '1'hosts = unix:/var/run/mysql/mysql.sock--- EOF /etc/postfix/users.cf ------ /etc/postfix/gids.cf ---user = postfixpassword = PASSWORDdbname = mailtable = usersselect_field = gidwhere_field = aliasadditional_conditions = and active = '1'hosts = unix:/var/run/mysql/mysql.sock--- EOF /etc/postfix/gids.cf ---

--- /etc/postfix/aliases.cf ---user = postfixpassword = PASSWORDdbname = mailtable = aliasesselect_field = rcptwhere_field = aliasadditional_conditions = and active = '1'hosts = unix:/var/run/mysql/mysql.sock--- EOF /etc/postfix/aliases.cf ---

--- /etc/postfix/transport.cf ---user = postfixpassword = PASSWORDdbname = mailtable = transportselect_field = transportwhere_field = domainadditional_conditions = and active = '1'

hosts = unix:/var/run/mysql/mysql.sock--- EOF /etc/postfix/transport.cf ------ /etc/postfix/uids.cf ---user = postfixpassword = PASSWORDdbname = mailtable = usersselect_field = uidwhere_field = aliasadditional_conditions = and active = '1'hosts = unix:/var/run/mysql/mysql.sock--- EOF /etc/postfix/uids.cf ---

--- /usr/lib/sasl2/smtpd.conf ---pwcheck_method: auxpropmysql_user: postfixmysql_passwd: PASSWORDmysql_hostnames: localhostmysql_database: mailmysql_statement: select password from users where alias = '%u@%r'--- EOF /usr/lib/sasl2/smtpd.conf ---

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

29№10(11), октябрь 2003

bugtraq

Удаленное переполнение буферав OpenSSH #2Программа: OpenSSH 3.7.Опасность: Критическая.Описание: Удаленное переполнение буфера обнаруженов OpenSSH. На этот раз, в отличие от предыдущего исправ-ления, устраненная уязвимость позволяет выполнить про-извольный код на уязвимом сервере. Вчера OpenSSH опуб-ликовало информацию об уязвимости в OpenSSH, кото-рая позволяла удаленному пользователю выполнить DoS-нападение против SSH-сервера. Однако изначально гово-рилось о существовании уязвимости, которая могла исполь-зоваться для выполнения произвольного кода на уязвимомсервере. После детального изучения проблемы была об-наружена еще одна, более опасная уязвимость в OpenSSH,которая, возможно, позволяет удаленному пользователювыполнить произвольный код с root-привилегиями.URL производителя: http://www.openssh.com/Решение: Обновите до OpenSSH 3.7.1 или примените сле-дующий патч:

Appendix A: patch for OpenSSH 3.6.1 and earlierIndex: buffer.c===================================================================RCS file: /cvs/src/usr.bin/ssh/buffer.c,vretrieving revision 1.16retrieving revision 1.18diff -u -r1.16 -r1.18--- buffer.c 26 Jun 2002 08:54:18 -0000 1.16+++ buffer.c 16 Sep 2003 21:02:39 -0000 1.18@@ -23,8 +23,11 @@ void buffer_init(Buffer *buffer) {- buffer->alloc = 4096;- buffer->buf = xmalloc(buffer->alloc);+ const u_int len = 4096;+ buffer->alloc = 0;+ buffer->buf = xmalloc(len);+ buffer->alloc = len;

buffer->offset = 0;buffer->end = 0;

}@@ -34,8 +37,10 @@ void buffer_free(Buffer *buffer) {- memset(buffer->buf, 0, buffer->alloc);- xfree(buffer->buf);+ if (buffer->alloc > 0) {+ memset(buffer->buf, 0, buffer->alloc);+ xfree(buffer->buf);+ } } /*@@ -69,6 +74,7 @@ void * buffer_append_space(Buffer *buffer, u_int len) {+ u_int newlen;

void *p;if (len > 0x100000)

@@ -98,11 +104,13 @@goto restart;

}/* Increase the size of the buffer and retry. */

- buffer->alloc += len + 32768;- if (buffer->alloc > 0xa00000)++ newlen = buffer->alloc + len + 32768;+ if (newlen > 0xa00000)

fatal("buffer_append_space: alloc %u not supported",- buffer->alloc);- buffer->buf = xrealloc(buffer->buf, buffer->alloc);+ newlen);+ buffer->buf = xrealloc(buffer->buf, newlen);+ buffer->alloc = newlen;

goto restart; Cоставил Александр Антипов

/* NOTREACHED */ }Index: channels.c===================================================================RCS file: /cvs/src/usr.bin/ssh/channels.c,vretrieving revision 1.194retrieving revision 1.195diff -u -r1.194 -r1.195--- channels.c 29 Aug 2003 10:04:36 -0000 1.194+++ channels.c 16 Sep 2003 21:02:40 -0000 1.195@@ -228,12 +228,13 @@

if (found == -1) {/* There are no free slots. Take last+1 slot and expand the array. */

found = channels_alloc;- channels_alloc += 10;

if (channels_alloc > 10000)fatal("channel_new: internal error: channels_alloc %d "

"too big.", channels_alloc);+ channels = xrealloc(channels,+ (channels_alloc + 10) * sizeof(Channel *));+ channels_alloc += 10;

debug2("channel: expanding %d", channels_alloc);- channels = xrealloc(channels, channels_alloc ↵

* sizeof(Channel *));for (i = found; i < channels_alloc; i++)

channels[i] = NULL;}

===================================================================Appendix B: patch for OpenSSH 3.7Index: buffer.c===================================================================RCS file: /cvs/src/usr.bin/ssh/buffer.c,vretrieving revision 1.17retrieving revision 1.18diff -u -r1.17 -r1.18--- buffer.c 16 Sep 2003 03:03:47 -0000 1.17+++ buffer.c 16 Sep 2003 21:02:39 -0000 1.18@@ -23,8 +23,11 @@ void buffer_init(Buffer *buffer) {- buffer->alloc = 4096;- buffer->buf = xmalloc(buffer->alloc);+ const u_int len = 4096;+ buffer->alloc = 0;+ buffer->buf = xmalloc(len);+ buffer->alloc = len;

buffer->offset = 0;buffer->end = 0;

}@@ -34,8 +37,10 @@ void buffer_free(Buffer *buffer) {- memset(buffer->buf, 0, buffer->alloc);- xfree(buffer->buf);+ if (buffer->alloc > 0) {+ memset(buffer->buf, 0, buffer->alloc);+ xfree(buffer->buf);+ } } /*Index: channels.c===================================================================RCS file: /cvs/src/usr.bin/ssh/channels.c,vretrieving revision 1.194retrieving revision 1.195diff -u -r1.194 -r1.195--- channels.c 29 Aug 2003 10:04:36 -0000 1.194+++ channels.c 16 Sep 2003 21:02:40 -0000 1.195@@ -228,12 +228,13 @@

if (found == -1) {/* There are no free slots. Take last+1 slot and expand the array. */

found = channels_alloc;- channels_alloc += 10;

if (channels_alloc > 10000)fatal("channel_new: internal error: channels_alloc %d ""too big.", channels_alloc);

+ channels = xrealloc(channels,+ (channels_alloc + 10) * sizeof(Channel *));+ channels_alloc += 10;

debug2("channel: expanding %d", channels_alloc);- channels = xrealloc(channels, channels_alloc ↵

* sizeof(Channel *));for (i = found; i < channels_alloc; i++)channels[i] = NULL;}

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

30

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

ДЕНИС КОЛИСНИЧЕНКО

СВОЙ СОБСТВЕННЫЙМОДУЛЬ

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

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

31№10(11), октябрь 2003

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

Подробнее о формате файла /etc/modules.conf вы мо-жете прочитать в справочной системе, введя команду manmodules.conf.

При загрузке система читает этот файл и загружаетуказанные в нем модули. В нашем случае загружаетсятолько модуль i810_audio.

Примечание: загрузка модулей из файла modules.confобеспечивается программой modprobe, которая вызываетсяиз сценария инициализации системы /etc/rc.d/rc.sysinit.

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

Чтобы использовать программу insmod, вы должны об-ладать привилегиями суперпользователя – пользователяroot.

Просмотреть список загруженных модулей можно спомощью команды lsmod. Вот вывод этой программы:

Некоторые модули загружаются не из файла /etc/modules.conf. Например, модули файловых систем заг-ружаются по мере необходимости – при монтированииопределенной файловой системы загружается нужныймодуль, если, конечно, он есть. Модули nls_koi8-r иnls_cp866 загружаются также при монтировании фай-ловой системы, если указаны опции монтированияiocharset=koi8-r,codepage=866.

Выгрузить модуль предельно просто:

Программа modinfo позволяет просмотреть информа-цию о модуле:

Примечание: программы insmod, rmmod, lsmod и modinfoвходят в состав modutils. Для использования любой этойпрограммы необходимы права пользователя root.

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

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

Прежде чем сказать, что же такое модуль, поговорим одрайверах устройств. В Windows мы часто сталкиваемсяс установкой, удалением и обновлением драйверов. Драй-вером устройства называется определенная программа,позволяющая операционной системе (и пользовательскимпрограммам) работать с данным устройством. Операци-онная система Windows (имеется в виду ME/2000/XP) со-держит драйверы для работы с наиболее распространен-ными устройствами, но если вы хотите установить какое-нибудь экзотическое устройство (драйвера которого нетв базе драйверов операционной системы), вам нужендрайвер этого устройства – без него система не сможетработать с устройством. В Windows установка драйвероввыполняется достаточно просто – запустил программуустановки драйвера, подождал, пока драйверы будут ус-тановлены, и после перезапуска компьютера уже можноработать с новым устройством. Конечно, при условии, чтовы выбрали подходящий драйвер.

В Linux «драйверы»1 выполнены в виде модулей ядра.Ядро Linux содержит только самый необходимый код,

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

Такое решение нельзя назвать рациональным. Мы неможем предусмотреть, какие устройства будут установ-лены у конечного пользователя, даже если включить в со-став ядра драйверы всех возможных устройств. Предпо-ложим, что у нашего пользователя установлена звуковаяплата Yamaha, а наше ядро «знает» еще с десяток звуко-вых плат. Получится, что один код будет работать всегда,а остальные десять драйверов будут просто использоватьоперативную память. Кстати, об оперативной памяти: выпредставляете размер ядра, если оно будет содержатьдрайверы всех устройств?

Исходя из всего этого, разработчики ядра Linux «изоб-рели» механизм динамически загружаемых модулей. Мо-дули хранятся на диске в виде объектных файлов (*.o).При необходимости ядро загружает необходимый емумодуль. Откуда ядро знает, какой модуль нужно загру-жать, а какой – нет? Список модулей, а также передавае-мые им параметры хранятся в файле /etc/modules.conf (или/etc/conf.modules – в зависимости от дистрибутива и вер-сии ядра). Вот пример этого файла:

Ëèñòèíã 1. Ôàéë /etc/modules.conf (Linux Red Hat 7.3)

alias sound-slot-0 i810_audiopost-install sound-slot-0 /bin/aumix-minimal ↵

-f /etc/.aumixrc -L >/dev/null 2>&1pre-remove sound-slot-0 /bin/aumix-minimal ↵

-f /etc/.aumixrc -S >/dev/null 2>&1

insmod <èìÿ_ôàéëà_ìîäóëÿ>

Module Size Used by Not taintedautofs 12164 0 (autoclean) (unused)nls_koi8-r 4576 2 (autoclean)nls_cp866 4576 2 (autoclean)vfat 12092 2 (autoclean)fat 37400 0 (autoclean) [vfat]usb-uhci 24484 0 (unused)usbcore 73152 1 [usb-uhci]

rmmod èìÿ_ìîäóëÿ

modinfo usbcore

filename: /lib/modules/2.4.18-3/kernel/drivers/usb/usbcore.odescription: <none>author: <none>license: "GPL"

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

32

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

Макросы MODULE_AUTHOR и MODULE_DESCRIPTIONопределены в заголовочном файле module.h, поэтомуникаких дополнительных заголовочных файлов подклю-чать не нужно.

При необходимости модуль может выводить на кон-соль сообщения, например, о невозможности инициали-зации устройства. Выводимые модулем сообщения будутзапротоколированы службой протоколирования ядра –демоном klogd. Выводить сообщения нужно не с помо-щью функции printf(), а функцией printk(). В этом случаесообщения не только окажутся на системной консоли, нои будут запротоколированы в файле /var/log/messages.

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

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

Для компилирования модуля ядра вам понадобитсяустановленный компилятор gcc, файлы заголовки и ис-ходные тексты ядра – мы ведь занимаемся разработкоймодуля ядра. Проще говоря, нужно установить следую-щие пакеты:� cpp – препроцессор cpp;� binutils – набор различных утилит (as, gprof, ld и др.);� glibc-kerheaders – заголовочные файлы ядра;� glibc-devel – вспомогательные файлы для разработки

приложений с использованием стандартной библиоте-ки C;

� gcc – компилятор gcc;� kernel-source – исходные тексты ядра Linux.

Устанавливать пакеты нужно в указанной последова-тельности. Если компилятор gcc у вас установлен, то вам

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

Примечание: первые две строчки листинга 2 – это непросто магические строчки, а директивы препроцессора,которые при обработке файла препроцессором cpp будутзаменены нужным кодом.

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

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

Функция cleanup_module() вызывается при удалениимодуля. Как и в прошлом случае, она возвращает 0, еслиудаление модуля прошло успешно.

Названия функций init_module() и cleanup_module() нео-бязательны – вы можете назвать их по-другому, но дляэтого вам нужно использовать функции module_init() иmodule_exit(), которые определены в заголовочном фай-ле init.h.

Переделаем наш шаблон так, чтобы не использоватьстандартные имена функций init_module() и cleanup_module():

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

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

Ëèñòèíã 2. Êàðêàñ ìîäóëÿ ÿäðà Linux (module.c)

#define MODULE#define __KERNEL__#include <linux/module.h>

int init_module(){return 0;}

void cleanup_module(){return 0;}

Ëèñòèíã 3. Øàáëîí ìîäóëÿ ñ ïåðåèìåíîâàíèåì ñòàíäàðòíûõôóíêöèé (module2.c)

#define MODULE#define __KERNEL__#include<linux/module.h> // äëÿ ìîäóëÿ#include<linux/init.h> // module_init() è module_exit()

int start() { return 0; }

void stop() { return 0; }

module_init(start);module_exit(stop);

Ëèñòèíã 4. Èíôîðìàöèÿ î ìîäóëå (module.c)

#define MODULE#define __KERNEL__#include <linux/module.h>

MODULE_AUTHOR("Denis Kolisnichenko [email protected]");MODULE_DESCRIPTION("Linux kernel module");

int init_module() { return 0; }

void cleanup_module() { return 0; }

Ëèñòèíã 5. Èñïîëüçîâàíèå ôóíêöèè printk()

#define MODULE#define __KERNEL__#include <linux/module.h>#include <linux/kernel.h> // printk

MODULE_AUTHOR("Denis Kolisnichenko [email protected]");MODULE_DESCRIPTION("Linux kernel module");

int init_module(){printk(“My module: Starting...\n”);return 0;}

void cleanup_module(){printk(“My module: Stopping...\n”);return 0;}

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

33№10(11), октябрь 2003

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

Makefile поместите в один каталог с файлом module.cи выполните команду make. После ее выполнения вы по-лучите файл module.o, который будет находиться в одномкаталоге с файлом module.c.

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

После того, как наш модуль откомпилирован, его мож-но установить:

Вы увидите сообщение My module: Starting... Это же со-общение будет записано в файл протокола /var/log/messages.

Мы только что написали модуль ядра, который можноустановить, удалить, который выводит сообщения, но онничего полезного не делает. Усложним нашу задачу: на-пишем драйвер для некоторого устройства /dev/device.Данного устройства в нашей системе нет, поэтому намего нужно создать, но этим мы займемся чуть позже.

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

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

� Блочные: чтение и запись устройства выполняютсяблоками, как правило, по 512 или 1024 байта. Самыйяркий пример блочного устройства – жесткий диск.

� Сетевые: файлов этих устройств вы не найдете в ка-талоге /dev, поскольку использование файловой сис-темы, то есть работа с этими устройствами как с фай-лами, неэффективно. Пример – сетевая карта (ethX).

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

Разберемся, что означает каждый параметр. Первыйпараметр – это старший номер (major number) устройства,определяющий его тип. Если старший номер равен 0, тофункция возвратит свободный старший номер для уст-ройства нашего вида (символьное устройство).

Чтобы понять, для чего нужен старший номер, вспом-ним каталог /dev, содержащий файлы устройств. Возьмемфайл /dev/tty1 – это терминал с номером 1. Старший но-мер определяет тип устройства – терминал (tty), а млад-ший – его номер в системе (1). Человеку проще работатьне с номерами, а с символьными именами устройств, по-

нужно установить только последний пакет – исходные тек-сты ядра.

Также нужно убедиться, что наше ядро поддерживаетдинамически загружаемые модули. Для этого перейдитев каталог /usr/src/linux-2.4 (или /usr/src/linux) и введитекоманду make menuconfig. Вы получили сообщение, чтобиблиотека Ncurses не найдена? Установите пакетыncurses (или ncurses4) и ncurses-devel и введите командуmake menuconfig снова.

Убедитесь, что в разделе Loadable module support вклю-чена опция Enable loadable module support (см. рис. 1).

Если опция Enable loadable module support выключе-на, ее нужно включить, сохранить файл конфигурацииядра и перекомпилировать ядро. О компиляции ядра выможете прочитать в моей книге «Linux-сервер своими ру-ками» («Наука и техника», 2002 г.) или в статье «Компи-лирование ядра» http://dkws.narod.ru/linux/kernel/kern.html.

Компилятору gcc нужно передать много параметров,поэтому мы напишем так называемый Makefile, облегча-ющий нам жизнь при компилировании/перекомпилирова-нии модуля.

В качестве компилятора мы будем использовать ком-пилятор gcc ($CC), ему будут переданы параметры$MODFLAGS и –c module.c. module.c – это имя файла на-шего модуля. Опции компилятора означают следующее:� O3: будет использован третий уровень оптимизации

(что это такое, вы узнаете в справочной системе gcc:man gcc);

� Wall: включаем все предупреждения;� DLINUX: генерируем код для Linux;� I$(PATH): определяем путь поиска заголовочных фай-

лов. По умолчанию компилятор ищет файлы заголов-ков в каталоге /usr/include, но там может и не быть нуж-ных файлов, например, для дистрибутива ALT Linux(ядро 2.4.21) файлы заголовков находятся в каталоге/usr/include/linux-2.4.21rel-std-up/.

Ðèñóíîê 1. Êîíôèãóðèðîâàíèå ÿäðà

Ëèñòèíã 6. Makefile íàøåãî ìîäóëÿ (Makefile)

CC=gccPATH=/usr/include /usr/src/linux-2.4/includeMODFLAGS:= -O3 -Wall –DLINUX –D__KERNEL__ -I$(PATH)module.o: module.c$(CC) $(MODFLAGS) -c module.c

gcc –O3 -DMODULE -D__KERNEL__ -I/usr/include -c module.c

insmod module.o

extern int register_chrdev(unsigned int, const char *, ↵struct file_operations *);

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

34

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

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

Конечно, кроме этого сообщения будут другие сооб-щения, но нас они не интересуют. Почему именно это со-общение так важно для нас? В первой части сообщенияговорится, что наше устройство успешно зарегистриро-вано, а во второй – сообщается старший номер устрой-ства, который мы будем использовать для создания уст-ройств /dev/device0 и /dev/device1.

этому каждому старшему номеру соответствует символь-ное обозначение.

При регистрации устройства нужно указать его тип –старший номер устройства. Но откуда мы знаем, какойномер занят, а какой – нет? Проще всего указать 0 в каче-стве первого параметра функции register_chrdev(). В этомслучае функция возвратит свободный старший номер сим-вольного устройства для нашей системы. Если же явноуказать старший номер, может возникнуть конфликт но-меров, и наше устройство не будет зарегистрировано.

Второй параметр определяет имя устройства («device»).Последний параметр очень важен. Это структура указате-лей на функции для работы с нашим устройством. Нашдрайвер (модуль) содержит таблицу доступных функций, аоперационная система вызывает нужную функцию, когдапользовательской программе нужно выполнить операциюс файлом устройства (открытие/закрытие, чтение/запись).Таблица функций символьного устройства хранится вструктуре file_operations, которая передается при регист-рации устройства.

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

Ëèñòèíã 7. Äðàéâåð óñòðîéñòâà /dev/device (áåç ñòðóêòóðûfile_operations)

#define MODULE#define __KERNEL__

#include<linux/module.h>#include<linux/init.h>#include<linux/kernel.h>#include<linux/fs.h> // ðåãèñòðàöèÿ óñòðîéñòâ#include<linux/ioport.h> // ðàáîòà ñ ïîðòàìè ââîäà/âûâîäà#include<linux/sched.h> // ðåçåðâèðîâàíèå ïðåðûâàíèÿ

// Èìÿ íàøåãî óñòðîéñòâà#define DEV_NAME "device"

// Ïîðòû ââîäà-âûâîäà íàøåãî óñòðîéñòâà#define PORT_START 0x2000#define PORT_QTY 10

// Ïàìÿòü íàøåãî óñòðîéñòâà#define MEM_START 0x20000000#define MEM_QTY 0x20

// Íîìåð ïðåðûâàíèÿ äëÿ íàøåãî óñòðîéñòâà#define IRQ_NUM 9

MODULE_AUTHOR("Denis Kolisnichenko [email protected]");MODULE_DESCRIPTION("Linux kernel module");

// Ñòàðøèé íîìåð ôàéëà óñòðîéñòâàstatic int Major;

// Ñòðóêòóðà file_operations – ïîêà ïóñòàÿ, íî âñêîðå// ìû åå íàïèøåìstruct file_operations FO;

// Îáðàáîò÷èê ïðåðûâàíèÿvoid irq_handler(int irq, void *dev_id, struct pt_regs *regs){return;}

int init_module(){

// Ðåãèñòðèðóåì óñòðîéñòâîprintk("My module: starting…\n");

Major = register_chrdev(0, DEV_NAME, &FO);

if (Major < 0) {// Óñòðîéñòâî íå çàðåãèñòðèðîâàíîprintk("My module: registration failed\n");return Major;}printk("My module: device registered, ↵

major number = %d\n",Major);

// Ðåçåðâèðîâàíèå ïîðòîâ ââîäà-âûâîäàprintk("My module: allocating io ports\n");

if (check_region(PORT_START, PORT_QTY)){printk("My module: allocation io ports failed\n");return -EBUSY;}

request_region(PORT_START, PORT_QTY, DEV_NAME);printk ("My module: io ports allocated\n");

// Ðåçåðâèðîâàíèå ïàìÿòèif (check_mem_region(MEM_START, MEM_QTY)){printk("My module: memory allocation failed\n");release_region(PORT_START, PORT_QTY);return -EBUSY;}

request_mem_region(MEM_START, MEM_QTY, DEV_NAME);printk ("My module: memory allocated\n");

// Ðåçåðâèðîâàíèå ïðåðûâàíèÿif (request_irq(IRQ_NUM, irq_handler, 0, DEV_NAME, NULL)){printk("My module: IRQ allocation failed\n");release_mem_region(MEM_START, MEM_QTY);release_region(PORT_START, PORT_QTY);return -EBUSY;}printk ("My module: IRQ allocated\n");return 0;}

void cleanup_module(){// Îñâîáîæäàåì ïîðòû ââîäà-âûâîäàrelease_region(PORT_START, PORT_QTY);printk("My module: release io ports\n");

// Îñâîáîæäàåì ïàìÿòürelease_mem_region(MEM_START, MEM_QTY);printk("My module: release memory\n");

// Îñâîáîæäàåì ïðåðûâàíèåfree_irq(IRQ_NUM,NULL);printk("My module: release irq\n");

// Îòìåíÿåì ðåãèñòðàöèþ óñòðîéñòâàif (unregister_chrdev(Major, DEV_NAME) < 0){ printk("My module: cannot to unregister device\n");}

printk("My module: device unregistered\n");return;}

My module: device registered, major number = 255

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

35№10(11), октябрь 2003

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

В принципе можно обойтись и без кода поиска уст-ройств – без него модуль будет проще, да и работатьон будет быстрее. А мы знаем, чем проще программа,тем она надежнее. Обойти поиск устройств можно сле-дующим образом. Мы не знаем, сколько устройств типаdevice будет у конечного пользователя – у него можетбыть только одно устройство – /dev/device0, а можетбыть целых 20 устройств – /dev/device0…/dev/device19.Поэтому вместо описанного выше массива state, нуж-но использовать динамический список, который будетсодержать информацию о каждом устройстве типаdevice. При загрузке модуля он будет содержать всегоодин элемент – для устройства /dev/device0. Даже еслиэтого устройства не будет в системе, будем считать,что оно просто закрыто, а при попытке обращения кнему будем сообщать, что оно занято. По мере поступ-ления запросов программ на открытие других устройств/dev/deviceX будем добавлять новые элементы в нашсписок. Чтобы не усложнять код нашего модуля, в этойстатье мы не будем использовать динамические струк-туры – для вас как начинающего разработчика моду-лей ядра Linux, главное – разобраться с написаниемсамого модуля, а добавить динамические списки выможете в любой момент сами.

Если же вам все-таки хочется узнать конкретное коли-чество устройств /dev/deviceX, установленных у пользо-вателя, можно просто просмотреть содержимое каталога/dev и посчитать количество файлов device*.

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

Младший номер устройства мы получаем с помощьювызова MINOR(inode->i_rdev). Если устройство уже откры-то, мы выводим сообщение: Devise is busy. В противномслучае устанавливаем флаг открытия устройства, обну-ляем byte_read и byte_write, а также увеличиваем счетчикиспользования данного модуля (MOD_INC_USE_COUNT).

Вы не забыли, что нам еще нужно создать два устрой-ства типа device, чтобы программы могли бы работать сними? Перейдите в каталог /dev и от имени пользователяroot выполните команды:

Здесь 255 – это старший номер устройства (у вас онбудет другим), 0 и 1 – младшие номера устройств. Послевыполнения данных команд будут созданы два файла ус-тройств – /dev/device0 и /dev/device1.

После регистрации устройства функцией register_chrdev()мы пытаемся захватить диапазон портов. Для этого пред-назначена функция request_region(), но перед ее вызовоммы должны убедиться, что нужный нам диапазон не ис-пользуется (функция check_region()). Затем, если нужно, мырезервируем память для нашего устройства. Для резерви-рования памяти используется функция request_mem_region(),а для проверки возможности захвата памяти предназна-чена функция check_mem_region(). После успешной ре-гистрации памяти можно попытаться захватить IRQ – фун-кция request_irq().

Предположим, что на каком-то этапе регистрации драй-вера произошла ошибка. Если мы не смогли зарегистри-ровать порты ввода/вывода, вряд ли имеет смысл про-должать работу. Если же ошибка произошла при резер-вировании памяти, то перед завершением работы моду-ля нам нужно освободить порты ввода/вывода, которыемы зарегистрировали на предыдущем этапе. Аналогичнопоступаем при ошибке захвата IRQ – освобождаем пор-ты и память. Функции release_mem_region(),release_regionи free_irq() используются для освобождения памяти, пор-тов и IRQ соответственно.

Обратите внимание: мы написали драйвер так, чтоон захватывает порты и память от имени одного устрой-ства – DEV_NAME. В реальности все гораздо сложнее:нужно захватывать ресурсы для каждого устройстваданного типа. К тому же нужно предусмотреть поиск ус-тройств драйвером: в нашем случае мы знаем, что уст-ройств только два, но у конечного пользователя такихустройств может быть больше или меньше, поэтому нашдрайвер будет не универсален, если он будет поддержи-вать только два устройства. О поиске устройств мы по-говорим чуть позже.

Наш драйвер пока еще не может называться драйве-ром в прямом смысле этого слова: устройство-то он реги-стрирует, но не позволяет выполнить ни одной операциис устройством – ведь структура file_operations пуста.

Кроме структуры file_operations, нам еще понадобит-ся структура для хранения информации о состоянии ус-тройства, а так как устройств у нас два, то также нуженмассив структур для хранения состояния каждого уст-ройства. Индексами массива будут младшие номера ус-тройств.

mknod device c 255 0mknod device c 255 1

// Ñòðóêòóðà äëÿ õðàíåíèÿ ñîñòîÿíèÿ óñòðîéñòâàstruct device_state{// 1 – óñòðîéñòâî îòêðûòî, 0 - çàêðûòîint dev_open;// Êîëè÷åñòâî ïðî÷èòàííûõ áàéò èç óñòðîéñòâà

Ëèñòèíã 8. Ôóíêöèÿ îòêðûòèÿ óñòðîéñòâà

static int device_open(struct inode *inode, struct file *fp){struct device_state *dev_state;

printk("My module: try to open device with minor number ↵%d\n", MINOR(inode->i_rdev));

dev_state = &state[MINOR(inode->i_rdev)];

if(dev_state->dev_open){printk("Devise is busy\n");return -EBUSY;}dev_state->dev_open = 1;dev_state->byte_read = 0;dev_state->byte_write = 0;

MOD_INC_USE_COUNT;

return 0;

}

ssize_t byte_read;// Êîëè÷åñòâî çàïèñàííûõ áàéòssize_t byte_write;};// Ìàññèâ äëÿ õðàíåíèÿ èíôîðìàöèè î ñîñòîÿíèè óñòðîéñòâstatic struct device_state state[2];

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

36

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

Функция закрытия устройства: сбрасываем флагdev_open и уменьшаем счетчик использования устройства.

Теперь нам нужно указать ядру, какие функции нужноиспользовать для открытия и закрытия устройства:

Полный код модуля устройства device вместе с функ-циями открытия и закрытия устройства, а также структу-рой file_operations приведен в следующем листинге:

Ëèñòèíã 9. Ôóíêöèÿ çàêðûòèÿ óñòðîéñòâà

static int device_close(struct inode *inode, struct file *fp){struct device_state *dev_state;

printk("My module: try to close device with minor number ↵%d\n", MINOR(inode->i_rdev));

dev_state = &state[MINOR(inode->i_rdev)];if(!dev_state->dev_open){printk("Device is not open\n");return 0;}

dev_state->dev_open=0;

MOD_DEC_USE_COUNT;

return 0;}

struct file_operations FO ={open: device_open,release: device_close};

Ëèñòèíã 10. Ìîäóëü óñòðîéñòâà device (module.c)

#define MODULE#define __KERNEL__

#include<linux/module.h>#include<linux/init.h>#include<linux/kernel.h>#include<linux/fs.h> // ðåãèñòðàöèÿ óñòðîéñòâ#include<linux/ioport.h> // ðàáîòà ñ ïîðòàìè ââîäà/âûâîäà#include<linux/sched.h> // ðåçåðâèðîâàíèå ïðåðûâàíèÿ

// Èìÿ íàøåãî óñòðîéñòâà#define DEV_NAME "device"

// Ïîðòû ââîäà-âûâîäà íàøåãî óñòðîéñòâà#define PORT_START 0x2000#define PORT_QTY 10

// Ïàìÿòü íàøåãî óñòðîéñòâà#define MEM_START 0x20000000#define MEM_QTY 0x20

// Íîìåð ïðåðûâàíèÿ äëÿ íàøåãî óñòðîéñòâà#define IRQ_NUM 9

MODULE_AUTHOR("Denis Kolisnichenko [email protected]");MODULE_DESCRIPTION("Linux kernel module");

// Ñòàðøèé íîìåð ôàéëà óñòðîéñòâàstatic int Major;

// Ñòðóêòóðà file_operations – ïîêà ïóñòàÿ, íî âñêîðå// ìû åå íàïèøåìstruct file_operations FO{open: device_open,release: device_close};

// Ñòðóêòóðà äëÿ õðàíåíèÿ ñîñòîÿíèÿ óñòðîéñòâàstruct device_state{

// 1 – óñòðîéñòâî îòêðûòî, 0 - çàêðûòîint dev_open;// Êîëè÷åñòâî ïðî÷èòàííûõ áàéòîâ èç óñòðîéñòâàssize_t byte_read;// Êîëè÷åñòâî çàïèñàííûõ áàéòîâssize_t byte_write;};// Ìàññèâ äëÿ õðàíåíèÿ èíôîðìàöèè î ñîñòîÿíèè óñòðîéñòâstatic struct device_state state[2];

// Îáðàáîò÷èê ïðåðûâàíèÿvoid irq_handler(int irq, void *dev_id, struct pt_regs *regs){return;}

int init_module(){

// Ðåãèñòðèðóåì óñòðîéñòâîprintk("My module: starting…\n");

Major = register_chrdev(0, DEV_NAME, &FO);

if (Major < 0) {// Óñòðîéñòâî íå çàðåãèñòðèðîâàíîprintk("My module: registration failed\n");return Major;}printk("My module: device registered, ↵

major number = %d\n",Major);

// Ðåçåðâèðîâàíèå ïîðòîâ ââîäà-âûâîäàprintk("My module: allocating io ports\n");

if (check_region(PORT_START, PORT_QTY)){printk("My module: allocation io ports failed\n");return -EBUSY;}

request_region(PORT_START, PORT_QTY, DEV_NAME);printk ("My module: io ports allocated\n");

// Ðåçåðâèðîâàíèå ïàìÿòèif (check_mem_region(MEM_START, MEM_QTY)){printk("My module: memory allocation failed\n");release_region(PORT_START, PORT_QTY);return -EBUSY;}

request_mem_region(MEM_START, MEM_QTY, DEV_NAME);printk ("My module: memory allocated\n");

// Ðåçåðâèðîâàíèå ïðåðûâàíèÿif (request_irq(IRQ_NUM, irq_handler, 0, DEV_NAME, NULL)){printk("My module: IRQ allocation failed\n");release_mem_region(MEM_START, MEM_QTY);release_region(PORT_START, PORT_QTY);return -EBUSY;}printk ("My module: IRQ allocated\n");return 0;}

void cleanup_module(){// Îñâîáîæäàåì ïîðòû ââîäà-âûâîäàrelease_region(PORT_START, PORT_QTY);printk("My module: release io ports\n");// Îñâîáîæäàåì ïàìÿòürelease_mem_region(MEM_START, MEM_QTY);printk("My module: release memory\n");

// Îñâîáîæäàåì ïðåðûâàíèåfree_irq(IRQ_NUM,NULL);printk("My module: release irq\n");

// Îòìåíÿåì ðåãèñòðàöèþ óñòðîéñòâàif (unregister_chrdev(Major, DEV_NAME) < 0){ printk("My module: cannot to unregister device\n");}

printk("My module: device unregistered\n");return;}

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

37№10(11), октябрь 2003

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

Теперь драйвер для нашего абстрактного устройстваdevice готов. Вы можете написать небольшую програм-мку, которая бы пыталась выполнить операции с нашимустройством: открыть его и закрыть – других операциймы не определили. Для определения других действий ис-пользуется та же структура file_operations. В файле /usr/src/linux-2.4/include/linux/fs.h она объявлена так:

Как использовать структуру file_operations, думаю, ясно.Например, нам нужно описать обработчики записи и чте-ния устройства – функции device_write() и device_read():

Обработчики чтения и записи пишутся «по образу иподобию» обработчиков открытия и закрытия устройства,то есть сначала нам нужно определить младший номер спомощью вызова MINOR(), а затем произвести операциюс устройством.

Все ваши вопросы и комментарии рад буду выслушатьпо адресу [email protected].

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

static int device_open(struct inode *inode, struct file *fp){struct device_state *dev_state;

printk("My module: try to open device with minor number ↵%d\n", MINOR(inode->i_rdev));

dev_state = &state[MINOR(inode->i_rdev)];

if(dev_state->dev_open){printk("Devise is busy\n");return -EBUSY;}dev_state->dev_open = 1;dev_state->byte_read = 0;dev_state->byte_write = 0;

MOD_INC_USE_COUNT;

return 0;

}

static int device_close(struct inode *inode, struct file *fp){struct device_state *dev_state;

printk("My module: try to close device with minor number ↵%d\n", MINOR(inode->i_rdev));

dev_state = &state[MINOR(inode->i_rdev)];if(!dev_state->dev_open){printk("Device is not open\n");return 0;}

dev_state->dev_open=0;

MOD_DEC_USE_COUNT;

return 0;}

Ëèñòèíã 11. Ôðàãìåíò ôàéëà /usr/src/linux-2.4/include/linux/fs.h

struct file_operations {struct module *owner;loff_t (*llseek) (struct file *, loff_t, int);

struct file_operations FO ={open: device_open,release: device_closeread: device_read,write: device_write};

ssize_t (*read) (struct file *, char *, size_t, loff_t *);ssize_t (*write) (struct file *, const char *, ↵

size_t, loff_t *);int (*readdir) (struct file *, void *, filldir_t);unsigned int (*poll) (struct file *, ↵

struct poll_table_struct *);int (*ioctl) (struct inode *, struct file *, ↵

unsigned int, unsigned long);int (*mmap) (struct file *, struct vm_area_struct *);int (*open) (struct inode *, struct file *);int (*flush) (struct file *);int (*release) (struct inode *, struct file *);int (*fsync) (struct file *, struct dentry *, ↵

int datasync);int (*fasync) (int, struct file *, int);int (*lock) (struct file *, int, struct file_lock *);ssize_t (*readv) (struct file *, const struct iovec *, ↵

unsigned long, loff_t *);ssize_t (*writev) (struct file *, const struct iovec *, ↵

unsigned long, loff_t *);ssize_t (*sendpage) (struct file *, struct page *, ↵

int, size_t, loff_t *, int);unsigned long (*get_unmapped_area)(struct file *, ↵

unsigned long, unsigned long, unsigned long, ↵unsigned long);

};

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

38

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

УПРАВЛЕНИЕ СЕТЕВЫМИПРИНТЕРАМИ ДОМЕНА

ИВАН КОРОБКО

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

39№10(11), октябрь 2003

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

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

Предлагается решение, созданное на основе ASP, осо-бенностью которого является динамичность. Выбор ASPобусловлен его возможностью работать с OLE-объекта-ми и требованием динамичности.

Для воплощения данного решения была использо-вана библиотека интерфейса службы активного ката-лога (Active Directory Service Interface – ADSI), котораяпозволяет управлять пространством имен MicrosoftWindows 2000.

ADSI выпущен в 1997 году корпорацией Microsoft. ADSIподдерживает пространства имен LDAP, WinNT, IIS, NDS. Вработе используются пространства имен LDAP и WinNT. Про-странство имен LDAP используется для чтения текущегодомена, соответственно списка опубликованных в них прин-теров и поля AD. Протокол WinNT используется для работыуправления принтерами и очередями печати.

Файловая структура проектаИнструмент представляет сайт, точкой входа в которыйявляется страница на языке HTML. Сайт создан на осно-ве окон (Frameset): файл default.htm делит окно браузерана два столбца. Текст файла default.htm (HTML):

Остальные страницы взаимосвязаны друг с другом иявляются рекурсивными. Обе страницы написаны на ASP.Для создания обеих страниц был выбран VBScript. VBScriptвыбран потому, что является языком, поставляемым сMicrosoft Windows; обладает необходимыми возможнос-тями для реализации данного проекта, имеет простойсинтаксис.

Каждый из ASP-файлов состоит из трех частей, кото-рые взаимосвязаны друг с другом: WinNT, LDAP, HTML.

LDAPВ разделе LDAP рассмотрены следующие вопросы: опреде-ление доступного домена; построение запроса SQL; поископубликованных принтеров в AD; чтение полей принтеров.

Определение имени текущего доменаНазвание текущего домена определяется с помощьюфункции GetObject. Используя функцию GetObject, мож-го прочитать корень пространства имен, т.е. текущийдомен.

Пример определения текущего домена (VBScript):

Переменная domain_ имеет вид «dc=microsoft,dc=com»,если домен «microsoft.com».

Имя текущего домена, полученного с помощью прото-кола WinNT, нельзя использовать, поскольку с помощьюпротокола WinNT, можно получить только сокращенноеимя домена (в данном случае «Microsoft»). При указаниисокращенного имени в строке с SQL-запросом произой-дет ошибка. В сообщении, которое выведет браузер, бу-дет указано, что путь к базе ошибочен, и базу невозмож-но открыть.

Построение запроса SQLЗапрос SQL используется для осуществления процедурыпоиска объектов при заданном типе объекта.

В общем случае запрос SQL выглядит следующим об-разом:

В поле SELECT указываются поля, по которым идетвыборка. Поля перечисляются через запятую, «пробелы»после запятой обязательны. Полный список полей объек-тов AD можно получить с помощью утилиты ADSI Edit, ко-торая размещается в дистрибутиве Microsoft Windows 2000в директории /Support/Tools.

В поле FROM указывается путь к объекту. В данномслучае известен только домен. Пробелы в данном поленедопустимы.

В поле WHERE указывается тип объекта, к которому ад-ресован запрос. Данное поле является фильтром. ПротоколLDAP имеет несколько типов объектов, которые в запросеSQL определяются переменной objectClass: PrintQueue –массив принтеров, опубликованных в AD; Group – группы,созданные в AD; User – пользователи, созданные в AD;Computer – массив компьютеров, зарегистрированных в AD.Пример использования запроса SQL см. в разделе «Поископубликованных принтеров в AD».

«Поиск опубликованных принтеров в AD»Для поиска объектов в AD с помощью протокола LDAPиспользуется ADODB-соединение. После создания соеди-нения формируется SQL-запрос и осуществляется поискв соответствии с запросом. Результатом поиска являетсямассив, который содержит значения полей, указаных впараметре SELECT SQL-запроса. Затем происходит вы-вод данных на экран. В приведенном примере осуществ-ляется поиск всех опубликованных принтеров в текущемдомене и вывод на экран названия принтера и его сете-вого имени (VBScript):

<HTML><HEAD><!-- Ëåâûé ñòîëáåö ñîñòàâëÿåò 30% îò øèðèíû âñåãî îêíà.Ëåâîå îêíî èìååò èäåíòèôèêàòîð «main», âòîðîå «var». --><TITLE>Ñïèñîê äîñòóïíûõ ñåòåâûõ ïðèíòåðîâ </TITLE><META HTTP-EQUIV ="Content-Type" CONTENT="text/html; ↵

CHARSET=windows-1251"></HEAD><FRAMESET cols="30%,*" FRAMEBORDER="5" BORDER="yes" ↵

FRAMESPACING="5" ><FRMAE SRC="printer_adsi.asp?radGrp=1&Search_Text=" ↵

NAME="main" SCROLLING="yes" ÌÀRGINHEIGHT=1 ><FRAME SRC ="about:blank" NAME="var"></FRAMESET ></HTML>

SET rootDSE_ = GetObject("LDAP://RootDSE")domain_ = "LDAP://" + rootDSE_.Get("defaultNamingContext")

SELECT ïîëå_1, ïîëå_2, …, ïîëå_n FROM ↵“LDAP://dc=äîìåí_1,dc=äîìåí_2…,domen_n” ↵WHERE objectClass=’òèï_îáúåêòà’

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

40

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

В Active Directory объектом класса printQueue являет-ся принтер. Данный объект имеет свойства, значение ко-торых может быть двух типов: строкой и массивом. В при-веденном примере значение, содержащее название прин-тера, является строкой, содержащее сетевые имена прин-теров, является массивом.

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

WinNTС помощью протокола WinNT осуществляется подключе-ние к локальному принтеру; чтение настроек и парамет-ров принтера; управление принтером; чтение и управле-ние очередью печати принтера.

Подключение к локальному принтеруДля подключения к принтеру в текущем домене необ-ходимо знать два параметра – название компьютера, ккоторому подключен принтер, и название принтера. По-скольку принтеры сетевые, то имя компьютера, к кото-рому подключены принтеры, является именем серверапечати (Print Server). Именем принтера является его се-тевое имя (Share Name). Оба эти параметра определя-ются с помощью протокола LDAP. Синтаксис строкиподключения в общем виде выглядит следующим об-разом:

где serve_name – имя сервера печати, а shares_enum –сетевое имя принтера.

Для получения доступа ко всем доступным принтерами их очередям печати протокол WinNT совместно исполь-зуется с протоколом LDAP (VBScript):

Чтение настроек и параметров принтераЧтение настроек с помощью протокола WinNT осуществ-ляется с помощью элементов массива объекта, вызван-ного с помощью функции GetObject :

Set objConnection = CreateObject("ADODB.Connection")Set objCommand = CreateObject("ADODB.Command")objConnection.CommandTimeout = 120objConnection.Provider = "ADsDSOObject"objConnection.Open "Active Directory Provider"Set objCommand.ActiveConnection = objConnectionobjCommand.CommandText = "SELECT printername, printsharename ↵

FROM '"&domain_&"' WHERE objectClass='printQueue'"objCommand.properties("Timeout")=30objCommand.properties("Cache Results")=falseSet st = objCommand.Executest.MovefirstOn Error Resume NextDo Until st.EOF

printer_name=St.Fields("PrinterName").Value

shares_enum=""shares=St.Fields("printsharename").Valuefor each share in sharesshares_enum=shares_enum+sharenext

Response.write printer_name & shares_enum & chr(13) st.MoveNextLoop

Set pq = GetObject("WinNT://" & server_name & "/" ↵& shares_enum)

Set st=objconnection.execute("SELECT shortservername, ↵printsharename, FROM '" & Domain_ & " ' ↵WHERE objectClass='printQueue'" )

Do Until st.EOF

shares_enum=""shares=St.Fields("printsharename").Value

for each share in sharesshares_enum=shares_enum & sharenext

server_name=St.Fields("ShortServerNAme").ValueSet pq = GetObject("WinNT://" & server_name & "/" ↵

& shares_enum) st.MoveNextLoop

Set pq = GetObject("WinNT://" & server_name & "/" ↵& shares_enum)

pq.name

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

41№10(11), октябрь 2003

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

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

Управление принтеромУправление принтером также осуществляется с помощьюэлементов массива объекта, вызванного с помощью фун-кции GetObject. Элементы массива содержат не толькостроки и массивы, но и команды:

Приведем пример использования одной из команд(VBScript):

Чтение и управление очередью печати принтераОчередь печати представляет собой массив, содержащийв себе задания, которые находятся в очереди печати намомент извлечения из нее данных с помощью протоколаWinNT. Массив очереди печати является элементом мас-сива, получаемого с помощью функции GetObject. Он со-держит элементы, список которых приведен в таблице.Все элементы представляют собой строки:

Пример, в котором читаются поля и выводятся на эк-ран (ASP):

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

Пример, в котором удаляется второе задание из оче-реди печати. Если такого нет, то ошибка обрабатываетсяс помощью выражения «On Error Resume Next» (VBScript):

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

Таблица стилей и выбор кодировки страницыОбе ASP-страницы используют таблицу стилей и работа-ют в кодировке WIN-1251. Стили описываются в подклю-чаемом файле style.css:

Файл стилей указывается в разделе LINK, необходи-мая кодировка – в разделе META (HTML):

Параметр CHARSET отвечает за выбор кодировки, в ко-торой будет отображаться документ.

Автоматическое обновление страницОсобенностью проекта является его динамичность, кото-рая достигается автоматическим обновлением страницчерез определенный промежуток времени. Обновлениеобеих страниц происходит с частотой, которая указыва-ется пользователем. Определение времени автоматичес-кого обновления является эвристической операцией. Ре-комендуется использовать время автоматического обнов-ления от 5 до 10 секунд. Время обновления указываетсяв разделе META (HTML):

Set pq = GetObject("WinNT://" & server_name & "/" ↵& shares_enum)

pq.purge

Set pq = GetObject("WinNT://" & server_name & "/" ↵& shares_enum)

For Each printJob In pq.PrintJobsstatus_pre=printJob.status

select case status_precase "0" status_="Íîðìàëüíî"case "1" status_="Ïàóçà"case "18" status_="Îøèáêà"end select

number_docum=number_documsummary = summary & ”Íîìåð äîêóìåòà: ” & number_docum ↵

& chr(13) & chr(13) & ”Ñòàòóñ: ” & status_pre & ↵chr(13) & ”Ïðèîðèòåò: ” & printJob.Description & ↵chr(13) & ”Ïîëüçîâàòåëü: ” & printJob.User & chr(13) & ↵”Âñåãî ñòð. ” & printJob.TotalPages & chr(13) & ↵”Ðàçìåð, (Mb) ” & round(printJob.Size/1000000,2) & ↵chr(13) & ”Ñòàòóñ: ” & status_pre & chr(13) & chr(13)

NextWscript.Echo summary

On Error Resume NextSet pq = GetObject("WinNT://" & server_name & "/" ↵

& shares_enum)For Each printJob In pq.PrintJobs If (number_docum=2) then printJob.remove end ifnumber_docum=number_documNext

H4 {font-size:11; font-family:Arial;}H5 {font-size:10; font-family:Arial;}H6 {font-size:9; font-family:Arial;}

<HEAD><LINK HREF="style.css" TYPE=text/css REL=stylesheet><META HTTP-EQUIV ="Content-Type" ↵

CONTENT="text/html; CHARSET=windows-1251"></HEAD>

</HEAD>< META HTTP-EQUIV ="refresh" CONTENT=10 ></HEAD>

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

42

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

Параметр CONTENT отвечает за временной интервалобновления страниц. Время указывается в секундах.

Взаимодействие страницВзаимодействие страниц основано на передаче форм,содержащих данные, методом GET.

Передача данных осуществляется с помощью двухметодов: прямого и косвенного.

Прямой метод:В исходной странице создается форма, которая содержитполя для ввода информации и кнопку для отправки ин-формации и загрузки страницы, принимающей данные(HTML):

В разделе FORM присутствуют следующие парамет-ры: ACTION, TARGET, METHOD. В параметре ACTION ука-зывается файл, в который будут передаваться данныепосле нажатия на кнопку.

Подразделом, который обязательно присутствует вразделе FORM, является INPUT. INPUT имеет следую-щие параметры: TYPE, NAME, VALUE. Параметр TYPEопределяет вид приемника информации: кнопка(TYPE=«submit» или «reset»); окно для ввода текста(TYPE=«text»), значение по умолчанию; кнопка выбораодного параметра из группы (TYPE=«radio»). VALUE –название поля, отображаемое в объекте. NAME – имя,которое участвует в формировании запроса.

Запрос, который формируется с помощью метода GET,в общем виде выглядит следующим образом:

В приведенной строке присутствуют следующие обо-значения: П – параметр, З – значение.

В используемом примере данная стока будет выгля-деть следующим образом:

если в стоке было введено «HP».Рассмотрим «страницу-приемник»: для получения пе-

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

Таким образом, параметр s_p_r=«HP».Прямой метод используется для осуществления поиска.

Косвенный метод:Косвенный метод используется для передачи данных изодной ASP-страницы в другую. Он основан на том, что

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

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

Для доступа к очереди принтера, как ранее отмеча-лось, используется протокол WinNT. Для использованияпротокола необходимо передавать 2 параметра: сетевоеимя принтера (Share Name) и название окна (Frame), вкотором необходимо вывести данную страницу. Опира-ясь на приведенные ранее примеры, данные будут пере-даваться на страницу View_Printer.asp, запрос будет иметьследующий вид (ASP):

Из-за особенностей ASP необходимо прибегать к обо-значению кавычек функцией chr(34).

Подробнее о передаче данных будет рассказано в раз-деле, посвященном WinNT.

Поиск по заданным критериямПоиск базируется на использовании фильтра. Передосуществлением поиска пользователь выбирает крите-рий поиска, словосочетание для поиска и нажимаеткнопку «Поиск», которая формирует запрос и загружа-ет страницу. В качестве критерия может быть выбранодин из параметров: «Название», «Описание», «Раз-мещение». По умолчанию принято значение «Назва-ние». Выбор значения по умолчанию осуществляетсяметкой CHECKED в соответствующем разделе INPUT.Форма на странице-отправителе выглядит следующимобразом (HTML):

Если, например, осуществляется поиск всех устройств,которые встречают в названии словосочетание «hp», тоформируется следующий запрос:

В принимающем запрос файле printer_adsi.asp длярасшифровки запроса используется следующая мето-дика:� данные, переданные форме, присваиваются перемен-

ным;� происходит фильтрация данных в зависимости от па-

раметра, отвечающего за критерий поиска;� происходит поиск в соответствующих полях;� вывод результатов поиска на экран.

<FORM ACTION="printer_adsi.asp" TARGET="main" METHOD="get"> <INPUT TYPE="submit" VALUE="Ïîèñê"></INPUT> <INPUT NAME="Search_Text"></INPUT></FORM>

http://èìÿ_ñòðàíèöà.asp(htm)?Ï1=Ç1&Ï2=Ç2&...Ïn=Çn

http://printer_adsi.asp?Search_Text=HP

set s_p_r= Request.QueryString(«Search_Text»)

<% <A HREF=" & chr(34) & "View_Printer.asp?Printer_to=" & ↵printer_name & chr(34) & " target=" & chr(34) &"var"& ↵chr(34) & " > <IMG SRC =images\pr1.jpg BORDER=0> </A> %>

<FORM ACTION="printer_adsi.asp" TARGET="main" METHOD="get"> <INPUT TYPE="submit" VALUE="Ïîèñê"></INPUT> <INPUT NAME="Search_Text"></INPUT><BR>

<INPUT CHECKED TYPE="radio" VALUE="1" ↵NAME="radGrp">Íàçâàíèå

< INPUT TYPE="radio" VALUE="2" NAME="radGrp">Îïèñàíèå< INPUT TYPE ="radio" VALUE="3" NAME="radGrp">Ðàçìåùåíèå

</FORM>

http://printer_adsi.asp?Search_Text=hp&radGrp=1

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

43№10(11), октябрь 2003

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

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

Данный сайт работает с Active Directory. Поскольку длячтения AD необходимы права администратора, то сайтбудет работать только в случае его использования сис-темным администратором. Необходимо иметь возмож-ность просматривать сайт с любого компьютера в доме-не без перерегистрации пользователя. Для достиженияжелаемого результата необходимо назначить следующиеправа доступа на папку, в которой опубликован сайт: груп-пе «Domain Admins» необходимо предоставить уровеньдоступа «Full Control» на папку с сайтом; остальные груп-пы и пользователи должны быть удалены (см. рисунок 1).В настройке IIS для данного сайта в его свойствах необ-ходимо, как показано на рисунке 3, войти во вкладку«Authentication Methods», нажав на кнопку «Edit». Затемвыключить анонимный доступ (Anonnymos access), убравгалку напротив соответствующей записи. В разделе«Authenticated access» необходимо установить галку толь-ко напротив «Basic authentication». Ðèñóíîê 1.

Ðèñóíîê 2. Èëëþñòðàöèÿ ñâîéñòâ ïðèíòåðà è î÷åðåäè ïå÷àòè

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

44

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

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

невозможен по неизвестным причинам. Рекомендуется неставить эту галку.

Приложение:

default.htm

style.css

printer_adsi.aspÐèñóíîê 3.

Ðèñóíîê 4. Èëëþñòðàöèÿ âåá-èíòåðôåéñà ñåòåâîãî ïðèíòåðà

<html><head><title>Ïðèíòåðû èçäàòåëüñòâà ÏÐÎÑÂÅÙÅÍÈß</title><meta http-equiv="Content-Type" content="text/html; ↵

charset=windows-1251"><FONT FACE="Arial" size="3"></FONT></head><frameset cols="30%,*" FRAMEBORDER="5" BORDER="yes" ↵

FRAMESPACING="5" ><frame src="printer_adsi.asp?radGrp=1&Search_Text=" ↵

name="main" scrolling="yes" ÌÀRGINHEIGHT=1 ><frame src="about:blank" name="var"></frameset></html>

H4 {font-size:12; font-family:Arial;}H5 {font-size:11; font-family:Arial;}H6 {font-size:10; font-family:Arial;}

<%@ Language=VBScript CODEPAGE=1251%><HTML> <body link="red" VLINK=red> </body><TITLE> Âûáîð ïîðÿäêà óïîðÿäî÷èâàíèÿ àäìèíñêîãî ñîôòà </TITLE>

Page 47: 011 Системный Администратор 10 2003

45№10(11), октябрь 2003

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

view_printer.asp

<HEAD><LINK href="style.css" type=text/css rel=stylesheet><meta http-equiv="Content-Type" content="text/html" ↵

charset=windows-1251><meta http-equiv="refresh" content=10 ></HEAD> <BODY>

<FONT FACE="Arial"><H4><b><center>"Ïðèíòåðû"</center></H4> <br> <h6><FORM ACTION="printer_adsi.asp" target="main" METHOD="get"> <INPUT TYPE="submit" VALUE="Ïîèñê"></INPUT> <INPUT NAME="Search_Text"></INPUT><br>

<input checked type="radio" value="1" ↵name="radGrp">Íàçâàíèå

<input type="radio" value="2" name="radGrp">Îïèñàíèå<input type="radio" value="3" name="radGrp">Ðàçìåùåíèå

</FORM> </h6><center><table widht=90% cellpadding=10%> <td><%set rootDSE_ = GetObject("LDAP://RootDSE")domain_ = "LDAP://" + rootDSE_.Get("defaultNamingContext")Set objNameSpace = GetObject("WinNT:")Set objConnection = CreateObject("ADODB.Connection")Set objCommand = CreateObject("ADODB.Command")objConnection.CommandTimeout = 120objConnection.Provider = "ADsDSOObject"objConnection.Open "Active Directory Provider"Set objCommand.ActiveConnection = objConnectionobjCommand.CommandText = "SELECT servername, printername, ↵

printsharename, location, description FROM '"&domain_&"' ↵WHERE objectClass='printQueue'"

objCommand.properties("Page size")=1000

objCommand.properties("Timeout")=30objCommand.properties("Cache Results")=falseSet st = objCommand.Executest.Movefirst

set radio_=Request.QueryString("radGrp") '- what is search ↵- can 1 - fullname ,2 - location ,3 - description

set s_p_r= Request.QueryString("Search_Text")

summary="<Table width"& chr(61) & "100% > <TR> ↵<TD></TD><Center> <TD> <B> ↵<H5>Íàçâàíèå ïðèíòåðà</H5></TD> <TD> </TD> <TD> ↵</TD></tr></Center>"

flag=0i=0

on error resume nextdim array_1(500)i=0Do Until st.EOF

printer_name=St.Fields("PrinterName").Value

shares_enum=""shares=St.Fields("printsharename").Valuefor each share in sharesshares_enum=shares_enum+sharenext

server_name=St.Fields("servername").Value

descrits_enum=""if vartype(St.Fields("description"))=8204 then

descrits=St.Fields("description")for each des in descritsdescrits_enum=descrits_enum+desnext

end if

location_name=St.Fields("location").Value

Set pq = GetObject("WinNT://" & server_name & "/" ↵& shares_enum)

status_printer=pq.statusselect case status_printercase "0" status_P="<img src=images\3normal.jpg border=0>"case "1" status_P="<img src=images\2pause.jpg border=0>"case "18" status_P="<img src=images\1error.jpg border=0>"end select

select case radio_case "1"

summary_where_search= shares_enum & printer_namecase "2"

<%@language=VBScript %><html><head><meta http-equiv="Content-Type" content="text/html" ↵

charset=windows-1251><meta http-equiv="refresh" content=10 ><LINK href="style.css" type=text/css rel=stylesheet>

</head><body><FONT FACE="Arial"><% set printer_name_to=Request.QueryString("Printer_to")

set rootDSE_ = GetObject("LDAP://RootDSE")domain_ = "LDAP://" + rootDSE_.Get("defaultNamingContext")

Set objConnection = CreateObject("ADODB.Connection")objConnection.Provider = "ADsDSOObject"objConnection.Open "ADSI"

set st=objconnection.execute("SELECT shortservername, ↵printername, printsharename, location, ↵description, driverversion, drivername, portname, ↵printlanguage, printcolor, printmaxresolutionsupported, ↵printmemory, whencreated, whenchanged, servername, ↵printpagesperminute FROM '" & Domain_ & " ' ↵WHERE objectClass='printQueue'" )

Do Until st.EOFprinter_name=St.Fields("PrinterName").Value

if printer_name_to=printer_name thenshares_enum=""shares=St.Fields("printsharename").Value

summary_where_search= descrits_enumcase "3"

summary_where_search= location_nameend select

if instr(Lcase(summary_where_search), Lcase(s_p_r)) thenarray_1(i)="<TR><td>" & status_P & " </td> <TD> <H6> ↵

" & printer_name & "</H6></TD> <TD><A href=" ↵& chr(34) & "view_printer.asp?Printer_to=" ↵& printer_name & chr(34) & " target=" & chr(34) ↵&"var"& chr(34) & "title=" & chr(34) ↵& printer_name & " - " & descrits_enum & chr(34) ↵& " > <b> <img src=images\pr1.jpg border=0> ↵</b></a> </td> <td> <A href=http:\\" ↵& shares_enum & " target=" & chr(34) ↵&"var"& chr(34) & "title=" & chr(34) ↵& printer_name & " - " & descrits_enum ↵& chr(34) & " > <b> ↵<img src=images\pr2.jpg border=0> ↵</b></a> </td></tr>"

i=i+1flag=1end if

st.MoveNextLoop

up_array=ubound(array_1)

for j=0 to up_arrayfor i=0 to up_array

if strcomp(array_1(i),array_1(i+1),0)=1 thentemp=array_1(i)array_1(i)=array_1(i+1)array_1(i+1)=tempend if

nextnext

for i=0 to up_arraysummary=summary&array_1(i)next

result_search=summary_header & " <table > <tr> " ↵& summary & " </tr> </table></h6>"

if flag=0 thenresult_search="<center><FONT FACE=Arial size=3><B><I><H5> ↵

Ïî çàïðîñó íè÷åãî íå íàéäåíî!</H5></B></I></center>"end if

Response.write result_search%></BODY> </HTML>

Page 48: 011 Системный Администратор 10 2003

46

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

Отдельное спасибо Филиппу Зыкову, руководителюЦентра ИТ Издательства «Просвещение», благодаря идеекоторого и возникла данная статья.

number_docum=0

For Each printJob In pq.PrintJobsstatus_pre=printJob.statusselect case status_precase "0" status_="<img src=images\3normal.jpg border=0>"case "1" status_="<img src=images\2pause.jpg border=0>"case "18" status_="<img src=images\1error.jpg border=0>"end selectnumber_docum=number_docum+1sum_jobs=sum_jobs & "<TR><TD width=60><h6> ↵

<a href="&chr(34)&" view_printer.asp?Printer_to=" ↵& printer_name_to ↵& "&change_status=4&Number_Doc="&number_docum ↵& chr(34)& " > <img src=images\l2.jpg border=0></a> ↵<a href="&chr(34)&" view_printer.asp?Printer_to=" ↵& printer_name_to ↵& "&change_status=5&Number_Doc="&number_docum ↵& chr(34)& "><img src=images\l1.jpg border=0></a> ↵<a href="&chr(34)&" view_printer.asp?Printer_to=" ↵& printer_name_to ↵& "&change_status=6&Number_Doc="&number_docum ↵& chr(34)& "><img src=images\l3.jpg ↵border=0></a></td></center> <td> <h6>" ↵& printJob.Description & "</td><TD><h6>" ↵& printJob.User & "</TD> <TD width=40> <h6>" ↵& printJob.Priority &" </TD> <TD width=50><h6>" ↵& printJob.TotalPages & " </TD><TD width=40><h6>" ↵& round(printJob.Size/1000000,2) & " </TD> ↵<TD width=50><h6>"& status_ & "</TD>"

Next

s1="<center><b> <H4>" & printer_name & "</b></center><Br> ↵<Table width=100% > <tr> <td> <h5> Îïèñàíèå: <Br></td> ↵<td colspan=3> <h6>"& descrits_enum & "<Br></td></tr> ↵<tr><td><b><h5> Ðàñïîëîæåíèå:</b><Br></td> <td><h6>" ↵& location_name & "<Br></td> <td><h5>"

s2="<b> Äðàéâåð: </b><Br></td> <td><h6>" & driver_name ↵& "<Br></td> </tr> <tr> <td> <h5> <b> Ñåðâåð: </b> ↵<Br></td> <td> <h6>" & server_name & "<Br></td> ↵<td><b><h5> Âåðñèÿ: </b><Br></td> <td> <h6>" ↵& driver_version & "<Br></td></tr> <tr><td><h5><b> Ïîðò: ↵</b><Br></td> <td> <h6>" & port_name & "<Br></td> <td> <h5>"

s3="<b> Òèï äàííûõ: </b><Br></td> <td> <h6>"& pq.Datatype ↵&"<Br></td></tr> <tr><td><b><h5> ßçûê: </b><Br></td> ↵<td><h6>" & language_enum & "<Br></td> <td> <b><h5> ↵Ïîääåðæêà öâåòà: </b><Br></td> <td> <h6>" & support_color ↵& "<Br></td> </tr> <tr> <td> <b><h5> Ðàçðåøåíèå: ↵</b><Br></td> <td><h6>" & resolution & " dpi <Br></td> ↵<td><h5>"

s4="<b> Ñêîðîñòü: </b><Br></td> <td> <h6>" & print_speed ↵& " ñòð./ìèí.<Br></td> </tr> <tr> <td><b><h5> Ïàìÿòü: ↵</b><Br></td> <td><h6>" & print_memory ↵& " Ká <Br></td> <td><h5>"

s5="<b> Ñîçäàí: <Br></td></b><td><h6>" & When_created ↵& "<Br></td></tr><tr> <td><b><h5> ↵Ñòàòóñ:</b><Br></td><td><center> <h6>"& status_P ↵& "</center><Br></td> <td><b><h5> </b><Br></td> <td><h6>" ↵& "<Br></td></tr> <td><h5>"

b1="<b>Ïðèíòåð: </b></td><td><center> ↵<a href="&chr(34)&" view_printer.asp?Printer_to=" ↵& printer_name_to & "&change_status=1"&chr(34)& " > ↵<img src=images\pause_pr.jpg border=0></a> &nbsp &nbsp &nbsp"

b2="<a href="&chr(34)&" view_printer.asp?Printer_to=" ↵& printer_name_to & "&change_status=2"&chr(34)& ↵"><img src=images\resume_pr.jpg border=0></a> ↵&nbsp &nbsp &nbsp"

b3="<a href="&chr(34)&" view_printer.asp?Printer_to=" ↵& printer_name_to & "&change_status=3"&chr(34)& ↵"><img src=images\1error.jpg ↵border=0></a></td></center></tr></table> "

summary=s1 & s2 & s3 & s4 & s5 & b1 & b2 & b3 & "<br> <br>"end if

st.MoveNextLoopResponse.write summaryResponse.write num_documResponse.write sum_jobs%>

for each share in sharesshares_enum=shares_enum & sharenext

descrits_enum=""if vartype(St.Fields("description"))=8204 thendescrits=St.Fields("description")

for each des in descritsdescrits_enum=descrits_enum+desnext

end iflocation_name=St.Fields("location").Value

driver_name=St.Fields("driverName").Valuedriver_version=St.Fields("driverVersion").Value

if vartype(St.Fields("portName"))=8204 thenports=St.Fields("portName")

for each port in portsport_name=port_name+portnext

end if

support_color=St.Fields("printColor").ValueResolution=St.Fields("PrintMaxResolutionSupported").Valueprint_speed=St.Fields("PrintPagesPerMinute").Valueserver_name=St.Fields("ShortServerNAme").Value

print_memory=St.Fields("PrintMemory").Valueserver_name=St.Fields("servername").Valuewhen_created=St.Fields("WhenCreated").Valuewhen_changed=St.Fields("WhenChanged").Value

language_enum=""if vartype(St.Fields("printLanguage"))=8204 thenformats=St.Fields("printLanguage")

for each format in formatslanguage_enum=language_enum+formatnext

end ifSet pq = GetObject("WinNT://" & server_name & "/" ↵

& shares_enum)set printer_change_status=Request.QueryString("change_status")select case printer_change_statuscase "1" pq.pausecase "2" pq.resumecase "3" pq.purgecase "4"

number_=1number_to_=""

For Each printJob In pq.PrintJobsset number_to_=Request.QueryString("number_doc")

if cint(number_to_)=number_ thenprintJob.pauseend if

number_=number_+1next

case "5"number_=1number_to_=""

For Each printJob In pq.PrintJobsset number_to_=Request.QueryString("number_doc")

if cint(number_to_)=number_ thenprintJob.resumeend if

number_=number_+1next

case "6"number_=1number_to_=""

For Each printJob In pq.PrintJobsset number_to_=Request.QueryString("number_doc")

if cint(number_to_)=number_ thenset del_docum=pq.printJobsdel_docum.Remove cstr(printJob.name)end if

number_=number_+1next

end selectchange_status=0status_printer=pq.statusselect case status_printercase "0" status_P="<img src=images\3normal.jpg border=0>"case "1" status_P="<img src=images\2pause.jpg border=0>"case "18" status_P="<img src=images\1error.jpg border=0>"end selectsum_jobs="<Table width=100% > <TR> <Center> ↵

<TD><h5>Îïåðàöèè</td><td><B><H5> Íàçâàíèå äîêóìåíòà ↵</TD> <TD> <B> <H5> Ïîëüçîâàòåëü </TD> <TD> <H5> <B> ↵Ïðèîðèòåò </TD> <TD> <H5> <B> Êîë-âî (ñòð) </TD> <TD> ↵<B> <H5> Ðàçìåð (Ìá)</TD> <TD> <B> <H5> Ñîñòîÿíèå ↵</TD></Center>"

Page 49: 011 Системный Администратор 10 2003
Page 50: 011 Системный Администратор 10 2003

48

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

ОБНАРУЖЕНИЕ ТЕЛЕКОММУНИКАЦИОННЫХ АТАК:ТЕОРИЯ И ПРАКТИКА, SNORT

ПАВЕЛ ЗАКЛЯКОВ

Page 51: 011 Системный Администратор 10 2003

49№10(11), октябрь 2003

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

По данным CERT[1], число инцидентов в сети растёт непо дням, а по часам – если грубо поделить 100 тысяч на365 дней и на 24 часа, то получится примерно около 11регистрируемых инцидентов в час. Ситуацию, сложившу-юся в последнее время с червём Blaster, следует убратьиз рассмотрения как исключение.

Мы видим, что число инцидентов растёт, а в то же времяпоследние номера журнала не изобилуют статьями по воп-росам сетевой безопасности, а тем более обнаружению те-лекоммуникационных атак. На мой взгляд, есть ряд удач-ных публикаций [2-4]; менее удачных в силу сложности не-посредственной применимости [5-8] и неудачных, но все онидалеки от обнаружения атак. Даже широко продаваемаялитература [9-14] далека от жизни, и за красивыми назва-ниями порой ничего не стоит, кроме полного отставания ввопросах практической реализации. Хотелось бы несколькозаполнить этот вакуум полезной информацией, в частностиинформацией про систему обнаружения атак IDS Snort [15].

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

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

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

Вышеописанные типы классификации хороши с точкизрения детализации по тем или иным критериям, но час-то они выделяют отдельные классы, имеющие минималь-ное значение с точки зрения систем обнаружения атак(СОА). Поэтому наиболее перспективной представляетсяуже описанная в литературе следующая классификация,разделяющая атаки на классы, в которых их будет легчеобнаружить и классифицировать:1. Удалённое проникновение (remote penetration). Атаки,

которые позволяют реализовать удалённое управле-ние компьютером через сеть. Примерами программ,реализующих такое управление, являются, NetBus илиBack Orifice, реверсивный сеанс telnet [18, стр. 314].

2. Локальное проникновение (local penetration). Атака,приводящая к получению несанкционированного дос-тупа к узлу, на котором она запущена, либо повыше-нию прав пользователя. Примером такой программыявляется GetAdmin или реализация эксплоита для уяз-вимости в ядрах Linux через ptrace.

3. Удалённый отказ в обслуживании (remote DoS (denialof service)). Атаки, которые позволяют нарушить фун-кционирование системы или перезагрузить компьютерудалённо. Примерами такой атаки являются teardrop,trinoo, fapi.

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

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

6. Сканеры уязвимостей (vulnerability scanners). Програм-мы, осуществляющие поиск уязвимостей на узлах сетии которые могут быть использованы для реализацииатак. Примеры: система SATAN или Shadow SecurityScanner, XSpider, LanGuard, XFocus-X-Scan и др.

7. Взломщики паролей (password crackers). Программы,которые подбирают пароли пользователей. Примеромвзломщика паролей может служить L0pht Crack дляWindows или Crack для *nix.

8. Анализаторы протоколов и снифферы (sniffers). Про-граммы, которые «прослушивают» сетевой трафик.При помощи этих программ можно автоматически ис-кать такую информацию, как идентификаторы и паро-ли пользователей, информацию о кредитных картах итак далее. Фактически анализатор протокола – этосниффер плюс некоторая часть, осуществляющаяфильтрацию и разбор перехваченных пакетов по не-которым правилам. Часто обе задачи выполняет одини тот же продукт. Примерами таких программ могутслужить tcpdump, ethereal, Microsoft Network Monitor,NetXRay компании Network Associates, Lan Explorer.Ðèñóíîê 1. Êëàññèôèêàöèÿ àòàê

Ãðàôèê 1. Ðîñò ÷èñëà èíöèäåíòîâ ïî ãîäàì (îñü èíöèäåíòîâ âëîãàðèôìè÷åñêîì ìàñøòàáå, êðàñíàÿ ëèíèÿ ïîêàçûâàåò òåíäåí-öèþ ðîñòà)

Page 52: 011 Системный Администратор 10 2003

50

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

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

С точки зрения СОА не имеет смысла классифициро-вать атаки по основным видам угроз [13, стр 77]: наруше-ние конфиденциальности, целостности, доступности, таккак эти угрозы достаточно общие и реализуются по-раз-ному, соответственно их обнаружение может быть осу-ществлено не единственным способом.

Каждая фирма предпочитает классифицировать атакипо-своему, например, компания Internet Security Systems,Inc. [19] ещё больше сократила число возможных катего-рий, доведя их до пяти:� сбор информации (Information gathering);� попытки несанкционированного доступа (Unauthorized

access attempts);� отказ в обслуживании (Denial of service);� подозрительная активность (Suspicious activity);� системные атаки (System attack).

Первые четыре категории относятся к удалённым ата-кам, а последняя – скорее к локальным, так как удалён-ное совершение системных атак затруднительно. Такжев эту классификацию не попали некоторые атаки, напри-мер, «ложный DNS-сервер» [34, стр. 75-84], «подменаARP-сервера» [34, стр. 84-99] и др.

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

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

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

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

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

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

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

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

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

Первым, не самым эффективным способом борьбы яв-ляется их обнаружение с помощью антиснифферов. Сре-ди таких программных средств, ловящих снифферы всети, можно назвать следующие: AntiSniff, CPM (CheckPromiscuous Mode), neped, sentinel. Со своей задачей дан-ные программные продукты справляются очень неплохо.Однако хорошо настроенный сниффер обнаружить иминевозможно. Поиск необнаруживаемых средств возможентолько косвенными способами, например, путём созда-ния ловушек [6,20] и генерации ложного трафика к ним,содержащего ценную информацию, скажем, пароли в от-крытом виде при обращении к ложному почтовому POP3-серверу. Хост, воспользовавшийся ложной информаци-ей, будет значительным источником информации для ус-пешного поиска сниффера. Однако и в этом случае ата-кующего могут и не поймать, если никто не воспользует-ся ловушкой. Ярким примером из жизни может служитьистория с городом Ковентри во время Второй мировойвойны, когда был разбомблён целый город с людьми вцену сокрытия факта получения информации.

Page 53: 011 Системный Администратор 10 2003

51№10(11), октябрь 2003

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

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

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

Ещё одним способом борьбы со сниффингом пакетовв вашей сетевой среде является локализация трафикапутём использования коммутирующей инфраструктуры.Если, к примеру, во всей организации используется ком-мутируемый ethernet, хакеры могут получить доступ толькок трафику, поступающему на тот порт, к которому ониподключены. Коммутируемая инфраструктура не ликви-дирует угрозу сниффинга, но заметно снижает её остро-ту. На практике данный класс атак имеет очень узкое при-менение, ограничивающееся в случае локализации тра-фика одним сегментом. Сегодняшнее значительное па-дение цен на коммутаторы (switch-и,$25-55 за 5-16-пор-товые) позволяет полностью отказаться от концентрато-ров (hub), чем значительно снизить актуальность приме-нения данной атаки на практике.

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

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

Использование средств шифрования трафика (крип-тографии) не предотвращает возможности перехвата со-общений и не распознаёт работу снифферов, однако яв-ляется самым действенным средством по борьбе со сниф-ферами. Если канал связи является криптографически за-щищённым, то это значит, что нарушитель перехватыва-ет зашифрованные сообщения. Использование стойкихалгоритмов шифрования, например ГОСТ 28147-89, де-лает эту работу бесполезной. На сегодня существуют раз-личные реализации данного способа с различной степе-нью надёжности. Например, криптография некоторых ус-тройств фирмы Cisco на сетевом уровне базируется напротоколе IPSec, который представляет собой стандарт-ный метод защищённой связи между устройствами с по-мощью протокола IP. К прочим криптографическим про-токолам, которые можно использовать для борьбы со

сниффингом, можно отнести SSH (Secure Shell) и SSL(Secure Socket Layer).

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

Исходя из этого определения можно заключить, чтооно захватывает основные три типа угроз [13, стр. 77]:нарушение конфиденциальности, целостности, доступ-ности, но, как было замечено выше, реально эти три типасводятся к двум: активному сбору информации и нару-шению работы. Для обоих типов имеются средства про-тиводействия. Результатом нарушения работы можетбыть утечка информации, например, правила функцио-нирования могут быть таковы, что информация недоступ-на. Также может быть отказ в обслуживании, заменаодних параметров или данных другими. Формально в этоопределение попадёт и класс атак «без последствий»,когда что-то было изменено, но ничего от этого не нару-шилось, но от этого атаки не перестали быть атаками,как если бы вы перешли дорогу в отсутствие машин исвидетелей на красный свет, поэтому такие атаки надотакже рассматривать. Многие определения упускают этотна первый взгляд безобидный класс атак. С точки зре-ния СОА этот класс атак практически ничем не будетотличаться от других.

Под активным сбором информации следует пони-мать все способы, с помощью которых можно получитьинформацию: сканирование, работу со службами, полу-чение информации в результате нарушения работы. (Су-ществуют способы получения информации не техничес-кими средствами или способами, которым нельзя проти-вопоставить СОА. Такие способы не рассматриваются, таккак с технической точки зрения ни атаками, ни телеком-муникационными атаками они не являются. Например,обзор печатных источников открытой информации.)

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

Сканирование бывает двух видов: обычное (или от-крытое) и полуоткрытое (закрытое).

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

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

Page 54: 011 Системный Администратор 10 2003

52

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

После соединения со службой и получения от неё привет-ственных заголовков соединение закрывается.

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

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

С целью сбора информации открытому сканированиюмогут подвергаться не только отдельные службы и узлы,но и целые сети. Сканирование может проводиться каквручную, так и автоматическими средствами. С целью зат-руднения обнаружения в лог-файлах факта сканирования,оно может проводиться со случайным порядком сканиро-вания портов и продолжительное время. Для борьбы сосканированием рекомендуется использовать программы,отслеживающие обращения с одного IP-адреса в корот-кое время к различным портам и блокирующие весь тра-фик для данного адреса. Также рекомендуется вместо со-общения об ошибке, в случае отсутствия сервиса/узла/сети, во внешнюю сеть вообще не высылать никакой ин-формации [21]. Среди программ-сканеров можно перечис-лить следующие программные продукты, имеющие те илииные дополнительные возможности: nmap, ISS, SATAN,Connect, exsscan, getethers, IdentTCPscan, jakal, portscan,QueSo, sl0scan, spoofscan, strobe, xscan и др. Для защиты отатак, выполняемых сканерами, существуют различные про-граммы, например: courtney, IcmpInfo, scan-detector, klaxon,PortSentry и многие другие, включая большинство СОА.

У обычного открытого сканирования есть один минус,а именно, оно может быть легко обнаружено без исполь-зования СОА путём ручного просмотра лог-файлов. Напервых порах сканирования так и обнаруживали. В ответна это был придуман способ закрытого или полуоткрыто-го сканирования, когда простым способом без использо-вания дополнительных программ обнаружить факт ска-нирования невозможно.

Полуоткрытое сканирование – это формально неза-вершённое обычное открытое сканирование. Если рассмот-реть обычную процедуру трёхстороннего «рукопожатия»при установке TCP-соединения, то отличие от обычного ска-нирования будет заключаться в отсутствии третьей – за-вершающей стадии. Если коротко, то согласно рекоменда-циям [22, 23] при установке соединения с узла, осуществ-ляющего сканирование, посылается пакет с установлен-ным флагом SYN (первая стадия), в ответ высылается под-тверждение установления соединения пакетом с установ-ленными флагами SYN и ACK со сканируемого узла (вто-рая стадия). Далее требуется подтверждение установле-ния соединения со сканирующего узла пакетом с установ-ленным флагом SYN (третья стадия). При отсутствии пос-ледней стадии происходит разрыв формально не устано-

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

Также в этот класс следует отнести сканирования па-кетами без флагов, пакетами со всеми установленнымифлагами и различными их неправильными комбинациями,в литературе подобные сканирования носят свои названия,как NULL scan, FIN scan, X-MAS scan, «oddball packet» и др.Так как в RFC чётко не определено, как следует реагиро-вать на неправильные пакеты, то различные операцион-ные системы делают это по-разному, таким образом име-ется возможность определить используемую операцион-ную систему на хосте косвенным образом. Ситуация срав-нима со следующей: вы подходите или подъезжаете к све-тофору, а там одновременно горят и красный и зелёныйсигналы. Кто-то подождёт, кто-то пойдёт или поедет на-пролом, также по-разному реагируют и операционные сис-темы на неправильные пакеты. Для борьбы с утечкой ин-формации рекомендуется выбрасывать все неправильныепакеты, не отвечая на них сообщениями об ошибках. Также можно использовать системы обнаружения сканирова-ний или вторжений. С целью затруднения работы сканиру-ющей стороне возможно использование липучих ловушек.Большинство сканирующих и обнаруживающих программ-ных средств, перечисленных параграфом выше в разделеоткрытого сканирования, способны работать и с закрыты-ми сканированиями. Отделять эти программные средствав отдельную группу бессмысленно.

Само по себе сканирование без последующего продол-жения атак не несёт никакой угрозы, однако возникшая исуществующая по сей день практика безнаказанности за-ставляет обратить на данный вид атак больше внимания.Безнаказанность приводит к регулярному, практически не-прерывному и случайному сканированию всего блока IP-адресов. Это отмечается и в различных последних отчётахпо сетевой безопасности [24]. Факт сканирования уже неможет, как ранее, использоваться в качестве высокодос-товерного сигнала о начале какой-либо атаки. Случайныесканирования не столько представляют опасность для ска-нируемого узла, сколько «замусоривают» лог-файлы и зат-рудняют обнаружение атак, непосредственно направлен-ных на данный узел. Для повышения значимости сканиро-вания в качестве сигнального фактора обнаружения пер-вой стадии атаки следует использовать обработку инфор-мации с нескольких распределённых узлов. Более подроб-но об этом будет рассказано в последующих разделах.Сейчас перейдём к следующей, логически вытекающейстадии перерастания сканирования в работу со службами.

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

Page 55: 011 Системный Администратор 10 2003

53№10(11), октябрь 2003

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

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

Целью любой работы со службой обычно является по-лучение информации для последующего нарушения ра-боты служб.

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

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

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

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

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

Отказ в обслуживании. (DoS, Denial of Service). Отдель-ный вид атак, когда целью ставится перевести узел, сетьили службу в такое состояние, когда она не могла бы об-служивать легальных пользователей, выдавая им сообще-ние о недоступности или вообще не отвечая. Добиться дан-ного можно двумя путями. Первый – с помощью уязвимос-тей в атакуемом объекте. Несмотря на то, что цель атакподходит под определение данного класса, их принято клас-сифицировать как «изменение алгоритма функционирова-

ния», см. выше. Второй – с помощью большого числа зап-росов. Любой узел, даже без уязвимостей, с верифициро-ванным алгоритмом работы, можно перевести в состоя-ние отказа в обслуживании. Исторически изначально былапопытка борьбы с данным классом атак путём увеличенияпроизводительности узлов и скорости пропускных каналовк ним, но тут же последовал ответ в виде распределённыхатак на отказ в обслуживании (DDoS, Distributed Denial ofService). Распределённая атака на отказ в обслуживании –это когда атака ведётся не с одного узла в сети, а с не-скольких. Логично заметить, что путём увеличения числаатакующих узлов, даже при маленькой пропускной способ-ности и производительности, на них можно «забить» лю-бой высокоскоростной узел/канал. Набор узлов для про-ведения подобных атак обычно является следствием дру-гих атак. В результате уязвимостей на узлах они атакуют-ся и на них размещается некоторый код, который работаетпо продуманному алгоритму.

С точки зрения выбираемой цели совершения той илииной атаки в данный класс возможно включение и некото-рых видов вирусов-червей. Размещённый код может вы-жидать команды, а может и атаковать и «завербовывать»себе другие узлы, создавая распределённую сеть из зара-жённых узлов. Когда распределённая сеть из заражённыхузлов начнёт атаку на отказ в обслуживании, то защищать-ся от данной атаки отдельно невозможно. Последствияможно как-то уменьшить, если у вышестоящего провайде-ра во время атаки ставить up-stream-фильтры. Борьба вданном случае ведётся уже вручную, а не автоматически-ми средствами, постепенным отключением каждого заму-соривающего сеть узла через его провайдера.

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

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

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

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

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

Page 56: 011 Системный Администратор 10 2003

54

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

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

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

трацию пакетов на основе их заголовков и/или другихкритериев. Подробнее о межсетевых экранах можнопрочитать в следующей литературе [21, 25, 26].

2. Антивирусные программы, осуществляющие поисквирусов и подозрений на вирусы в файлах или инфор-мационных потоках. Подробнее смотрите [27, 28].

3. Снифферы – программы, осуществляющие перехватвсего проходящего трафика в сегменте для дальней-шего его анализа вручную или автоматическими сред-ствами [14, стр. 111-127].

4. Средства обнаружения атак/вторжений – так же, каки снифферы, перехватывают весь или часть траффи-ка и осуществляют поиск в нём подозрительных со-бытий. Используются различные методы поиска, чащевсего сигнатурный метод. Иногда средства обнаруже-ния вторжений дополнительно имеют свойства из дру-гих категорий [9].

5. Средства контроля целостности файловых системосуществляют периодическую проверку файловых си-стем, на которых установлены операционные систе-мы, которые могут быть скомпрометированы на фактизменения или удаления «неизменяемых» файлов, по-явления новых. Проверка чаще всего осуществляетсяс использованием средств криптографии с целью по-вышения надёжности. По результатам проверки воз-можны различные заранее запрограммированные дей-ствия [14, стр 100-109], [4].

6. Ловушки – осуществляющие имитацию работы тойили иной службы/хоста/сети. Контролирующие и про-токолирующие все обращения к ним. Являются разви-вающимся классом на сегодняшний день. Очень пер-спективны с точки зрения сбора доказательств злогоумысла нападающего, не подвергая при этом реаль-ные системы какой-либо опасности [6, 20].

Разберём все эти классы более подробно.

Межсетевые экраны«МЭ представляет собой локальное (однокомпонентное)или функционально-распределённое средство (комплекс),реализующее контроль за информацией, поступающей вАС и/или выходящей из АС, и обеспечивает защиту АСпосредством фильтрации информации, т.е. её анализа посовокупности критериев и принятия решения о её распро-странении в (из) АС» [25].

В отечественной литературе в последнее время наблю-дается разнобой в терминологии, в качестве синониматермина МЭ часто используются слова: «брандмауэр» и«firewall», заимствованные из немецкого и английскогоязыков, соответственно дословно обозначающие «огнен-ная стена».

Работу МЭ можно разделить на несколько составляю-щих:� Анализ и фильтрация пакетов. Пакеты могут быть раз-

личных протоколов.� Блокирование пакетов протоколов или содержимого.� Аутентификация пользователя (подключения) и шифро-

вание сеанса. Одновременно в МЭ могут присутствоватьлюбые составляющие из перечисленных в зависимо-сти от требований, предъявляемых к МЭ. Если клас-сифицировать МЭ по ЭМВОС (OSI/ISO) [29 стр. 19-25],[30 стр. 66-74] уровню, то имеется два основных типа МЭ:� МЭ сетевого уровня или фильтры пакетов;� шлюзы приложений.

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

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

Под анализом и фильтрацией пакетов обычно пони-мается соответствие заголовков или поля данных какому-либо критерию. В процессе совершения атак или веденияподготовки к ним обмен с потенциально атакуемым объек-том ведётся посредством обмена пакетами. МЭ являетсяузким местом, где можно отсеять ненужные пакеты. Такимобразом, если знать адреса нарушителей, то можно зап-ретить обмен любым трафиком с нарушителями. Так, воз-можно разрешение или запрещение использования каких-либо служб какими-то отдельными узлами. Например, еслиимеется внутренняя БД, например, на порту 1433, то мож-но запретить все входящие пакеты, имеющие порт назна-чения 1433, тем самым исключив возможность атаки наэтот порт. Также фильтрация может осуществляться наоснове критерия «направления установки соединения»изнутри наружу или снаружи внутрь по флагам в пакетах.Можно запретить все входящие соединения.

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

Многие операционные системы имеют мощные встро-енные МЭ. Обычно это пакетные фильтры с расширяемы-ми возможностями. Так, операционная система Linux име-ет пакет iptables (ipchains или ipfw), позволяющий произво-дить фильтрацию [7, 8]. ОС OpenBSD, FreeBSD и другиетакже имеют МЭ. Различные версии Windows (на базе NT)имеют также встроенные, но с меньшим набором функ-циональных возможностей МЭ. Малый набор фильтрую-

Page 57: 011 Системный Администратор 10 2003

55№10(11), октябрь 2003

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

щих возможностей штатными средствами, особенно усемейства операционных систем Windows, компенсиру-ется наличием большого числа коммерческих продуктовот третьих производителей, например AtGuard, ZoneAlarmи др. Для ОС с открытым кодом такие продукты по боль-шей части бесполезны, так как они не могут фильтроватьлучше, чем сама ОС, средствами ядра.

Имеется множество программно-аппаратных средств отразличных производителей, реализующих функции филь-трации «в виде отдельного блока» независимо от ОС: CiscoSecure IDS, ISS RealSecure for Nokia, NFR Intrusion DetectionAppliance, SecureCom, Citadel и многие другие. Некоторыеиз них даже сертифицированы бывшим ФАПСИ.

С точки зрения размещения МЭ может располагаться какна защищаемом узле, так и отдельно. Первый вариант об-ходится дешевле, но с большим риском для безопасности.Существует конечная вероятность того, что атака можетвывести МЭ из строя. Отдельные узлы, особенно не имею-щие IP-адресов (например, различные МЭ-мосты [26]) и ад-министрируемые исключительно с консоли или доверенно-го интерфейса, практически имеют очень большую надёж-ность, определяемую только используемым ПО внутри этихсредств, которое может случайно содержать ошибки. Таккак извне к таким устройствам обратиться невозможно, тоневозможно и как-то повлиять на их работу. Даже атака наотказ в обслуживании экранируемой сети при правильномрасчёте не приведёт к выводу из строя или изменению ал-горитма работы таких устройств. Пакеты, предназначенныедля фильтрования, будут отфильтрованы в любом случае.

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

Многие вещи довольно сложно или неэффективно реа-лизовать с помощью фильтров пакетов, например, еслинадо разрешить посещать какой-то сайт, но в то же времязапретить посещение его какой-то части, то для выполне-ния данной задачи потребуется разборщик и анализаторпакетов, и пр. В конечном счёте получится что-то вродепрозрачного шлюза приложений. Поэтому лучше сразузаметить, что с подобной задачей легко справляются шлю-зы приложений. По сложившейся практике никто не назы-вает шлюзы межсетевыми экранами, хотя они являютсяих подтипом. Шлюзов приложений также много, сколько иприложений, их использующих. Наибольшей популярнос-тью пользуются http-прокси-сервера, насколько они попу-лярны, настолько же часто они подвергаются различныматакам. Среди открытых программных продуктов, распро-страняемых по лицензии GNU Public License, наибольшейпопулярностью пользуется пакет squid. Среди программ-ных продуктов с закрытым кодом сложно перечислить од-нозначно наиболее часто используемые продукты.

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

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

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

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

Подключение в разрыв может быть как прозрачным(без изменения сетевых настроек), так и нет (когда тре-буется изменение настроек). Возможно прозрачное уста-новление прокси в «разрыв» так, что даже легитимныепользователи, общающиеся с внешней сетью, его не за-метят. В то же время будет иметься возможность полногоконтроля их соединений. Многие операционные системы,в частности ОС Linux, позволяют делать данные вещиштатными средствами (bridge, divert, squid) [26].

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

Page 58: 011 Системный Администратор 10 2003

56

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

сто изнутри эту дверь кто-то откроет. Поэтому комплекс-ная защита межсетевыми экранами не ограничивается.

Следующим отдельным классом идут антивирусныесредства.

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

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

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

лённый компьютер через эту уязвимость.� Написать программу, осуществляющую автоматичес-

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

� Разработать средство взаимодействия заражённыхкомпьютеров.

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

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

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

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

Обычно таким местом, где следует поставить антиви-русного сторожа, являются почтовые сервера и межсете-вые экраны. На первых осуществляется проверка всейэлектронной корреспонденции на наличие известных ви-русов. На вторых может проверяться любой сетевой по-ток вне зависимости, куда он идёт или откуда поступает.Для поиска вирусов используется сигнатурный метод.Данный процесс фактически ничем не отличается от сиг-натурного обнаружения атак, однако тут есть своя специ-фика существующей БД и проверяемого потока. Напри-мер, антивирусные программы могут исправлять потокданных, вылечивая заражённые объекты «на лету», неблокируя их, в то время как СОА в основной массе неимеют аналогичных возможностей.

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

Среди программных продуктов можно назвать оченьмного антивирусных программ, но выделить наиболее эф-фективные среди них довольно сложно, а тем более попы-таться как-то выбрать лучшее средство. Наличие больше-го числа сигнатур не является доминирующим аргументомв пользу того или иного антивирусного продукта, так какнужного вируса в БД сигнатур может не оказаться, несмот-ря на то, что там содержится наибольшее число сигнатур.Поэтому защита не может основываться на одних антиви-русных средствах. Среди наиболее часто используемогоантивирусного ПО следует назвать: AVP Касперского,Dr.Web, Norton Antivirus, OpenAV и др. Многие продуктыимеют версии для различных операционных систем, начи-ная от Linux и заканчивая Novell Netware. Существуют ан-тивирусы и с открытым программным кодом.

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

Page 59: 011 Системный Администратор 10 2003

57№10(11), октябрь 2003

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

мым местом для перехвата всего проходящего трафика вданном сегменте. Явным образом снифферы защищать немогут, они защищают «косвенным» образом и использу-ются как составная часть других средств. При этом при не-обходимости физически специально создаются условия дляперехвата всего трафика. Например, сниффер может бытьподключён к дополнительному концентратору или к специ-альному порту коммутатора, на который передаются ко-пии данных со всех портов. После получения данных сниф-фером производится их анализ. Анализ может быть какместным, так и внешним. Данные могут помещаться в БД,которая будет анализироваться уже другими средствами.Захватывать данные удобнее всего в сетях с общей сре-дой передачи, как в Ethernet. Среди программных продук-тов, осуществляющих перехват всего трафика в сетяхEthernet, можно назвать tcpdump, windump, ethereal и др.Вести перехват данных можно и в сетях, отличных отEthernet, реализация в этом случае может немного услож-ниться, и потребуется наличие дополнительной аппарат-ной компоненты. Суть при этом не меняется.

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

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

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

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

ность существования уязвимостей для этих атак больше,но и вероятность присутствия данной атаки в сигнатурнойБД тоже велика, поэтому СОА обнаруживают такие атаки.Так, любое сканирование распознаётся практически безо-шибочно. В качестве реакции на какое-то событие СОАможет передавать управление любому заранее написан-ному скрипту, который может инициировать закрытие со-единения с атакующим узлом либо изменять политикуфильтрации пакетов. Из последнего следует, что СОА оченьтесно используются совместно с межсетевыми экранами.Отсутствие в трафике данных, коррелирующих с теми илииными сигнатурами, не говорит об отсутствии нарушите-лей, поэтому в данных средствах используется сбор ин-формации с различных мест. Сбор данных в сети осуще-ствляется посредством сенсоров – небольших программили приспособлений, расположенных вблизи прослушива-емых мест и выдающих различную информацию о состоя-нии прослушиваемого объекта. Объектом может быть каксоединение, так и лог-файл работы той или иной програм-мы. Средства, анализирующие лог-файлы, исторически непринято называть сенсорами. Фактически, сенсор – это ма-ленькая копия СОА, отправляющая данные в некий общийцентр – ядро анализа СОА. Всё вышеописанное может рас-полагаться как на одном узле, и тогда сложно отделить однифункции от других, так и в различных местах сети.

СОА исторически делятся на два типа: cеть- и хост-ори-ентированные СОА. Хост-ориентированные СОА как раз изанимаются анализом различных файлов на хосте, в товремя как сеть-ориентированные занимаются перехватоми анализом трафика в сети. Большее развитие в после-днее время получило сеть-ориентированное направление.Отчасти это объясняется платформенной независимостьюСОА от используемых ОС на компьютерах в сети.

Правильно настроенная СОА обнаруживает большойпроцент атак, при маленьком проценте ложных срабаты-ваний. Понятие «СОА» часто трактуется очень широко ивключает в себя множество различных компонентов, в ре-зультате чего довольно сложно определить границы. На-пример, это может быть обычная БД. Те же антивирусныесредства также могут являться одним из компонентов СОА.Не следует исключать ошибки первого рода, которые ухо-дят из внимания СОА. Среди программных продуктов мож-но перечислить: NIDS, BRO, Snort и др., о последнем про-дукте как раз пойдёт речь дальше в статье.

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

Page 60: 011 Системный Администратор 10 2003

58

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

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

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

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

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

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

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

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

Рассмотрим преимущества тех или иных видов лову-шек с точки зрения поимки нарушителей.

Ловушки, моделирующие отдельные службы, хоро-ши тогда, когда имеется некоторый известный узел, вы-полняющий функции какого-либо сервера, например, веб-сервера или шлюза. С большой вероятностью данный сер-вер будет атаковаться, и будут попытки взлома. Если нетуязвимостей или их наличие маловероятно, то все атаки ипопытки взлома будут просто-напросто растрачивать ре-сурсы сервера. При этом разделение случаев атак от ле-гального использования будет осложнено. Создание наэтом же сервере (логически) других фиктивных сервисовзаставит атакующих распараллелить свои действия. Таккак потенциально возможных уязвимых сервисов будетбольше, то и вероятность успешной атаки с точки зренияатакующих будет больше. Эту вероятность можно будетзаведомо повысить, выдав ложные сведения о плохой за-щищённости подставных виртуальных ловушек. Между темлегальные пользователи не будут работать с ловушкамиили реальными службами нештатными способами, пыта-ясь вывести те из строя, основываясь на ложной инфор-мации, полученной прямым или косвенным способом отловушек о наличии тех или иных уязвимостей. Таким об-разом, можно понизить вероятность ошибок первого и вто-рого рода. Однако при данной реализации есть некоторая

Ðèñóíîê 2. Âèäû ëîâóøåê

Page 61: 011 Системный Администратор 10 2003

59№10(11), октябрь 2003

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

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

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

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

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

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

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

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

В силу специфики, варианты размещение ловушек мо-гут очень сильно отличаться друг от друга. См. рисунок 3.

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

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

IDS Snort

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

Несмотря на то, что IDS расшифровывается как IntrusionDetection System и дословно переводится как Система Об-наружения Вторжений (СОВ) использование этого терминане совсем правильно и в силу возможностей великого имогучего русского языка мы будем говорить о Системе Об-наружения Атак (СОА) Snort. Простой пример в правильнос-ти выбранного термина: атака может быть совершена, но

Ðèñóíîê 3. Âàðèàíòû ðàçìåùåíèÿ ëîâóøåê:à) ëîâóøêà íà îòäåëüíîì õîñòå; á) ëîâóøêà-ñåòü

Page 62: 011 Системный Администратор 10 2003

60

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

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

ИсторияДанный продукт, а вместе с ним и выпускающий его одно-имённый проект является уже немолодым, первые упоми-нания датируются январём 1999 года, собственно, когда егооснователю (Martin Roesch) и пришла в голову мысль о со-здании некоторой логической структуры правил по выбо-рочному перехвату трафика. С этого момента и начало за-рождаться некоторое подобие простой системы обнаруже-ния атак. Что можно отметить последующим появлениемверсии 1.0. Уже к концу января появляется законченныйпродукт, который в полной мере может «ловить» атаки иназываться системой обнаружения атак. Система может наосновании заданных правил ловить атаки и структурирован-но вести лог-файлы. Правила можно задавать в любом удоб-ном для пользователя порядке, и система толерантно отно-сится к этому. Однако созданный продукт не устраивает раз-работчика в полной мере, и есть ещё ряд вещей, которыехочет внедрить Мартин в свой продукт с целью его улучше-ния. А именно: ставятся задачи создания возможности за-дания правил и обработки TCP-пакетов на основании выс-тавленных в них флагах. Обработка фрагментированныхпакетов и др. В это время Мартин меняет работу и привыка-ет к своей новой эргономичной клавиатуре, что сказывает-ся на замедлении темпов процесса разработки. Основныесилы переключаются на исправление ошибок, и появляетсяидея улучшить читаемость правил, в ухудшение удобностиих набирания пользователями. Правила должны стать бо-лее длинными, менее удобными, но зато более понятными.Переписывается заново ядро обработки пакетов, за счёт чегоувеличивается скорость их обработки, по просьбам «трудя-щихся» вводится более точное определение времени при-

хода пакета в систему, с учётом миллисекунд. В конце мар-та – начале апреля добавляется ранее задуманная обработ-ка фрагментированных пакетов и другие вещи. В конце ап-реля добавляется возможность разбора PPP- и SLIP-паке-тов, что позволило модемным пользователям применятьSnort в полной мере. К проекту постепенно начинают под-ключаться всё больше и больше людей: Chris Sylvain, DamienDaspit и другие. Благодаря им у Snort появляется ряд новыхполезных свойств. Проект идёт по миру и развивается. Кначалу лета выходит уже версия 1.2 с частично переписан-ным кодом. Однако обнаруживаются ошибки в работе Snortна платформах, отличных от Linux, в результате чего в авгу-сте появляется версия 1.2.1 с исправлениями, которая безпроблем может запускаться как на Sparc, так и на OpenBSD.Чуть позже, в конце сентября (1999), ставится точка на ак-тивном развитии версии серии 1.x, и выдвигается идея осоздании улучшенной с радикально переписанными куска-ми кода второй серии версий с номером 2.0. Всё самое луч-шее – во вторую версию. Работа над второй версией идётмедленно, в то же время и не прекращается улучшение пер-вой. В конце декабря выходит версия 1.5. Новый год знаме-нуется выходом версии 1.6. К середине года выходит вер-сия 1.6.1, и ставится задача по выпуску версии 1.7 к октябрь-ской конференции «SANS Network Security 2000» [31]. По-спешный выход 1.6.1 приводит к выходу 1.6.2.2, и далее 1.6.3.Версию 1.7 удаётся выпустить только в начале 2001 года.Возможно, это было сделано специально, с целью озна-менования больших трудов на протяжении полугода. Вер-сия 1.7 уже без проблем компилируется и работает натаких платформах, как:� Linux 2.0.X, Linux 2.1.X, Linux 2.2.X (i386)� FreeBSD 3.x, 4.x (i386)� SunOS/gcc 5.5, 5.5.1, 5.6, 5.7, 5.8 (sparc)� OpenBSD 2.7, 2.8� Tru64/gcc� HPUX 11.0/gcc

Ещё через полгода выходит новая версия, идея по вы-ходу второй версии вот-вот осуществится, на этот раз вразрабатываемую версию уже включено всё самое лучшее,чего удалось добиться в версии 1.7. Далее, во второй по-ловине лета у Мартина рождается сын, и поэтому его уси-лия более переключаются на него. Несмотря на это акту-альность выпуска второй версии не уменьшается. До кон-ца года выходят версии 1.8.1 с множеством дополнений иновых функций и сразу же после выходят исправления кновым ошибкам в 1.8.2. В новом, 2002 году выходит вер-сия 1.8.3, и продолжает улучшаться вторая версия. В 2003году выходят завершающие версии 1.9.x и долгожданнаявторая версия, туда уже включены следующие функции,многие из которых даже и не принадлежат руке Мартина:� Улучшенная производительность (благодаря новым об-

разцам для фильтров и переписанному блоку сравнения).� Лучшее декодирование.� Расширенные возможности дефрагментирования и по-

вторной сборки пакетов.� Исправлены тысячи ошибок.� Обновлены правила для обнаружения атак.� Обновлён файл конфигурации Snort.conf.

Page 63: 011 Системный Администратор 10 2003

61№10(11), октябрь 2003

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

� Введены новые ключевые слова и соответствие об-разцам.

� Новый анализатор HTTP-потоков.� Расширены возможности аномального детектирования

(для HTTP, RPC, TCP, IP и др. протоколов).� Лучшая защищённость программы.� Исправлена ошибка Xrefs.� Flexresp работает быстрее и эффективнее.� Лучшие возможности chroot().� Исправлено декодирование 802.1q.

Количество постоянных разработчиков Snort уже пре-высило 13, а количество людей, как-то оказавших помощьпроекту, уже исчисляется сотнями. И вот летом выходитулучшенная «вторая» версия – 2.0.1, а уже в начале осени,17 сентября 2003 года, выходит версия 2.0.2, установкой инастройкой которой мы и займёмся чуть ниже. Что же ка-сается разработчиков, то они ни на минуту не останавли-ваются и продолжают совершенствовать данный продукт.Одним из направлений развития предполагается созданиесистем из 5/10/20/100 машин с установленным Snort в видесенсоров с целью централизованного обнаружения и мо-ниторинга больших сетей, в том числе и с целью обнару-жения распределённых телекоммуникационных атак. Покрайней мере Мартин просит всех заинтересованных в дан-ном проекте дать о себе знать [32]. Возможно, удастся об-судить тему нескольких сенсоров в будущих публикациях,а пока непосредственно перейдём к установке самой про-стой конфигурации Snort с введением логов в файл.

Начальная установка IDS SnortДля начала нам необходимо зайти на сайт [15] и скачатьоттуда последнюю версию. Сейчас это версия 2.0.2 http://www.Snort.org/dl/Snort-2.0.2.tar.gz. Далее необходимо удо-стовериться в том, что мы скачали что надо, для этого мыскачиваем контрольную сумму http://www.Snort.org/dl/Snort-2.0.2.tar.gz.md5. (Также можно проверить подлин-ность с помощью имеющейся PGP-подписи.) Подсчиты-ваем контрольную сумму от скачанного файла:

В результате запуска получим:

Сверив это значение с тем, что записано в файле Snort-2.0.2.tar.gz.md5, и убедившись, что они идентичны, мы мо-жем приступать к распаковке и установке пакета. Не сле-дует пренебрегать этим, казалось бы, излишним шагом.В 2002 году уже имелись инциденты по взлому различ-ных веб-сайтов, в том числе и различных официальныхзеркал, с которых скачивались «модифицированные»программы [24].

Все возникающие вопросы мы будем решать по мереих появления. Содержимое полученного архива следуеткуда-либо записать, удобнее это сделать в mc. Мы созда-дим для этого директорию /progi, куда и запишем содер-жимое скачанного архива.

В директории /progi/Snort-2.0.2/contrib мы можем найтимножество полезных программ и утилит, которые не явля-ются частью Snort, но значительно могут помочь в работесо Snort. Многие вещи нам в первый раз не понадобятся,они скорее нужны для продвинутых пользователей. Средипредставленных программ вы найдёте готовые скрипты скомандами по созданию таблиц в различных БД: MSSQL,MySQL, PostgreSQL, Oracle с целью ведения логов в БД.(Организация ведения логов в другие БД открыта и не пред-ставляет сложностей, разве что придётся написать скрип-ты самостоятельно.) Делать выборки и различные опера-ции с БД более удобно, чем с обычными текстовыми лог-файлами. Для более-менее простого просмотра БД с лога-ми мы там же можем найти ACID – систему визуальногоотображения содержимого БД через php и веб-сервер.

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

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

# md5sum snort-2.0.2.tar.gz

21b14d90e2a323831d85f3d845d64b23 snort-2.0.2.tar.gz

Ðèñóíîê 4. Screenshot ñêîïèðîâàííîãî ñîäåðæèìîãî àðõèâà

Ðèñóíîê.5. Âèä ACID ÷åðåç âåá-áðàóçåð mozilla

Page 64: 011 Системный Администратор 10 2003

62

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

модуль SnortLog.pm для Perl в Net-SnortLog-0.1.tar.gz. По-мимо этого имеется:� Guardian – скрипт на Perl, позволяющий изменять пра-

вила пакетного фильтра (пока для ipchains) с файломконфигурации и небольшим README.

� PassiveOS – скрипт для Perl, пытающийся по имею-щимся логам определить, какую операционную сис-тему имел атаковавший вас хост.

� mysql.php3 – php-скрипт для просмотра статистики ра-боты Snort в online (10 наиболее частых TCP-опробо-ваний, 10 наиболее частых UDP-опробований и пр. ),данные берутся из БД mysql.

� snort2html, cкрипт на Perl, создающий отчёты в html.� S99snort – стартовый скрипт, чтобы запускать Snort при

загрузке системы из /etc/rc.d/init.d – он вам понадобится,если вас не устроит изложенный вариант решения ниже.

� snortdb-extra.gz – файл с правилами, создающими дере-во таблиц в любой SQL92-совместимой БД, с целью бо-лее удобного изучения данных Snort пользователями.

� snortlog – ещё один небольшой скрипт на Perl, веду-щий анализ логов.

� snortnet.tar.gz – набор программ, используемых про-ектом по обнаружению распределённых телекоммуни-кационных атак, когда Snort используется в качествесетевого сенсора.

� snortwatch – программка на python, позволяющая от-слеживать предупреждения, генерируемые Snort.

� Даже имеется система обнаружения аномальных со-бытий на основе их вероятности – SPADE (StatisticalPacket Anomaly Detection Engine).

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

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

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

Для самого простого случая, как у нас, не надо переда-вать никаких параметров. (Забегая вперёд, для продвину-тых пользователей скажу, что для конфигурации Snort дляработы с БД MySQL следует указывать параметр --with-mysql,со всеми остальными рассмотрим этот режим работы Snortпозже, возможно, даже в следующей статье). В процессеконфигурации осуществляется проверка на наличие всехнеобходимых компонент. Так как Snort работает в режимесниффера, когда перехватывает пакеты, то он используетбиблиотеку libpcap. Если вы никогда не ставили её и непользовались пакетом tcpdump, то у вас её может не ока-заться, и тогда вы через несколько строчек после запуска

увидите сообщение о произошедшей ошибке и необходи-мости установки библиотеки.

В RedHat 7.3 libpcap-0.6.2-12.i386.rpm находится навтором диске в директории /RedHat/RPMS. (В RedHat 9.0файл уже называется libpcap-0.7.2-1.i386.rpm и находит-ся тоже на втором диске в той же директории).

Устанавливаем библиотеку (с поправкой на вашу вер-сию):

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

сообщений об ошибках, можем запустить компиляцию ко-мандой:

# ./configureÐèñóíîê 6. Ñîîáùåíèå ñ îøèáêîé âî âðåìÿ çàïóñêà êîíôèãóðè-ðîâàíèÿ î íåîáõîäèìîñòè óñòàíîâêè áèáëèîòåêè libpcap

# rpm -i libpcap-0.6.2-12.i386.rpm

Page 65: 011 Системный Администратор 10 2003

63№10(11), октябрь 2003

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

из директории /progi/snort-2.0.2, куда мы распаковалипакет. После завершения компиляции у нас в директории/progi/snort-2.0.2/src должен появиться запускаемый файл –snort. Это и есть готовая программа. (У меня её размер1224986). Если её просто запустить, то она выдаст ин-формацию о ключах и пожалуется на то, что мы, «глу-пые» пользователи, не сообщили, что ей после запусканужно делать: «Uh, you need to tell me to do something...»Программа готова к работе, задавая нужные ключи, мож-но запустить её работать, однако более разумным будетпредварительное копирование программы в систему, тоесть «установка» на своё место. С помощью команды:

программа копируется в директорию /usr/local/bin, уста-навливается man. После того как программа установле-на, наступает самый интересный, а может, и самый му-торный момент – конфигурация и создание правил, от кор-ректности задания которых будет зависеть – будут ли ло-виться те или иные атаки или нет. Цитата из раздела проsendmail в [33, стр. 718] гласит: «Если вы увидите челове-ка, который начинает создание конфигурационного файлас пустой страницы в текстовом редакторе, можете с чис-той совестью звонить в 03... Не имеет никакого смысла со-здавать этот файл с нуля (особенно если учесть его слож-ность) – гораздо проще изменить существующий. Тольконе забудьте сделать перед этим его копию!» То же самоеможно сказать и про конфигурационный файл Snort –snort.conf. Конечно, он несколько проще его вышеупомя-нутого собрата, но незначительно. Готовый файл имеетсяв директории etc (/progi/snort-2.0.2/etc/snort.conf). Имя и раз-мещение для файла конфигурации нигде не определены,однако де-факто файл называется snort.conf и размещатьмы его будем в директории /etc/snort, которую необходимосоздать. Далее в директории /etc/snort создадим поддирек-торию rules, позже мы туда поместим правила. Правиламы также возьмём готовые и рассмотрим парочку правил,чтобы было ясно, как они создаются, на случай, если нампридётся их править и писать свои правила. Готовые пра-вила можно взять из дистрибутива, однако они могут не-сколько отставать от жизни. Поэтому лучше брать ежед-невно обновляемые правила на сайте Snort в разделеdownload: http://www.snort.org/dl/rules/snortrules-stable.tar.gz.Они подходят как для версий 1.9.x, так и для всех вер-сий 2.0.x на момент написания статьи. Вопросы авто-матического скачивания и обновления правил в этой ста-тье мы рассматривать не будем. Также во всех файлах справилами имеется шаблон файла конфигурации. Из фай-ла с последними правилами или из дистрибутива пере-писываем все файлы с расширением .rules в директорию/etc/snort/rules, а оставшиеся несколько файлов в /etc/snort:� classification.config� generators� gen-msg.map� Makefile.am� reference.config

� sid� sid-msg.map� snort.conf

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

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

Заголовок определяет, какие пакеты следует смотреть,опции определяют, на что следует смотреть в перехвачен-ных пакетах. Так, правило по «обнаружению водителя с пас-сажиром на жёлтых «Жигулях» будет выглядеть так: «Со-общить в центр, если мимо поста будут проезжать жёлтые«Жигули», едущие из центра в область по Рублёвскомушоссе c номером «22-33» днём с включёнными фарами,если водитель негр, а пассажиры – стройная блондинка ссобачкой, о том, что проехала машина А.». Если приме-нять это всё сразу к правилам и проводить аналогию, топервая часть правила – это «сообщить в центр, если мимопоста будут проезжать жёлтые «Жигули», едущие из цент-ра в область по Рублёвскому шоссе», а вторая – «c номе-ром «22-33» днём с включёнными фарами, если водительнегр, а пассажиры – стройная блондинка с собачкой, о том,что проехала машина А.». «Сообщить в центр» – это будетдействие. «Жёлтые «Жигули» – это протокол. «Едущие изцентра в область» – это направление следования, порты иIP-адреса отправителя и получателя. «По Рублёвскому шос-се» – это будет интерфейс, который будет слушать Snort, кправилам это отношения не имеет. А всё остальное будетопцией с условием. Если выразить это коротко и без ком-ментариев, то получится, что заголовок содержит инфор-мацию о принимаемом действии по данному правилу, про-токол, порты и IP-адреса отправителя и получателя с сете-выми масками. Опции же определяют, какую часть пакетастоит просматривать на соответствие чему-то и какой текствыдавать. Часть пакета – это будет салон автомобиля –смотрим на пассажира и водителя, а какой текст выда-вать – «проехала машина А.». Простой пример:

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

Теперь пример посложнее, давайте возьмём файл /etc/snort/rules/ftp.rules и рассмотрим его первую непустуюстрочку с правилом:

# make

# make install

alert tcp any any -> 192.168.1.0/24 111 ↵(content:"|00 01 86 a5|"; msg:"mountd access";)

alert tcp $EXTERNAL_NET any -> $HOME_NET 21 ↵(msg:"FTP CEL overflow attempt"; ↵flow:to_seserver,established; ↵content:"CEL "; ↵nocase; ↵content:!"|0a|"; ↵within:100; ↵

Page 66: 011 Системный Администратор 10 2003

64

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

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

Внимательный читатель заметит, что вместо адре-сов в последнем правиле используются переменные$EXTERNAL_NET и $HOME_NET. Введение переменныхочень удобно, и оно предусмотрено синтаксисом файлаконфигурации, где могут писаться правила. Можно одинраз задать постоянные и часто неменяемые параметрысети, и не придётся после менять их во многих местах.Настройка Snort по большей части как раз и сводится кзаданию подобных уже выбранных переменных в файлеконфигурации. Помимо этого к каждой такой перемен-ной идут комментарии.

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

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

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

Первое, что мы видим в конфигурационном файле, –это инструкция о необходимости выполнения конфигура-ции в 4 этапа:1. Установка сетевых переменных;2. Конфигурирование препроцессоров;3. Конфигурирование и определение, куда будет вестись

вывод;4. Выбор необходимых правил.

1-й этапПеременная $HOME_NET определяет IP-адреса, считае-мые адресами нашей домашней сети. Это нужно, чтобыSnort знал, что считать своим, а что чужим. Например,если мы имеем одну машину с адресом 123.45.45.45, тоследует написать:

В случае маскируемых сетей и если их несколько, пи-шем без пробелов в скобках:

Можно использовать ключевое слово «any» – оно оз-начает любой адрес. Далее следует определить адресвнешней сети. Обычно это все адреса:

Далее идёт секция с выбором серверов, используемыхв сети. Нужно это для того, чтобы не распылять ресурсынапрасно и повысить эффективность работы. Вопрос, ко-нечно, открытый: какой смысл ловить атаки на веб-сер-вера, если у вас в сети нет ни одного веб-сервера? Нобольшая часть ответит, что никакого, поэтому в этой сек-ции следует убрать лишнее либо задать более конкрет-но. Спешу вас предупредить, что бездумное комментиро-вание этих строчек может привести к не запуску Snort исообщениям об ошибках, так как некоторые включаемыениже файлы с правилами, возможно, будут иметь ссылкина несуществующие переменные. Далее определяютсяпорты для некоторых служб и прочие переменные. Дляпервого запуска лучше бегло пробежать, пропустив не-которые сложные моменты, и запуститься, а после ужезаниматься более детальным изучением тех или иных пра-вил и строчек в конфигурационном файле с целью выбо-ра оптимальных настроек. Переменную $RULE_PATH сле-дует определить как rules:

а не:

что написано по умолчанию, либо необходимо переписатьправила в другую директорию.

2-й этапКонфигурирование препроцессоров. На первый взгляд мо-жет показаться, что препроцессоры – это лишняя и не-нужная вещь, и, наверное, это будет по большей частиправдой, только если не одно «но», что в сети одно и тоже сообщение может быть разбито на две части и на мно-го маленьких пакетов вплоть до содержания в 1 байт. Та-кие пакеты, не обнаруживая себя, будут проходить черезлюбую СОА без особых трудностей; в зарубежной лите-ратуре, в том числе и электронной, эта классическая си-туация очень хорошо и с рисунками расписана. Поэтомуразумнее накапливать все маленькие пакеты в буфере ипересобирать до нужного размера, а после уже прове-рять на наличие признаков той или иной атаки. Пересо-бирать можно и обычные, среднестатистические пакетыпри необходимости. Также, если необходимо, препроцес-соры могут выполнять предварительные преобразованиявеб-адресов. Не секрет, что через процент и шестнадца-теричное число в строке адреса можно передавать лю-var HOME_NET 123.45.45.45

var HOME_NET [10.1.1.0/24,192.168.1.0/24]

var EXTERNAL_NET any

var RULE_PATH rules

var RULE_PATH ../rules

reference: bugtraq,679; ↵reference:cve,CVE-1999-0789; ↵reference:arachnids,257; ↵classtype: attempted-admin; ↵sid:337; ↵rev:5;)

Page 67: 011 Системный Администратор 10 2003

65№10(11), октябрь 2003

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

бые символы. Так, в истории есть один интересный факт,ставший примером классической глупости компанииMicrosoft, связанной с этим преобразованием, когда оная,обнаружив одну ошибку, исправила её другой. Некото-рое время назад в серверах IIS была найдена ошибка,которая заключалась в том, что если в конце URL-адресакакого-либо asp-сценария дописать точку, то вместо за-пуска сценария на выполнение выводился его исходныйтекст. (Подобная ситуация была и со знаком пробела). Насообщения об этом известная фирма выпустила тут жезаплатку, заключавшуюся в установке простой проверкисинтаксиса запроса на наличие в конце знака «.» и уда-лении его перед передачей запроса непосредственно об-рабатывающему его серверу. На что специалисты толькопосмеялись, а взломы серверов продолжились как ни вчём не бывало, с тем лишь различием, что в конце запро-са вместо точки стал использоваться её шестнадцатерич-ный код со знаком процента, который беспрепятственнопропускался всеми фильтрами. Этот обходной манёвр не-сколько позже тоже прикрыли, но факт остался фактом.Поэтому лучше 7 раз подумать и один раз сделать, чемодин раз подумать и 7 раз переделывать. Если, прочитавкомментарии к препроцессорам, вы поняли, что всё ещёне сильны в их настройке или даже не поняли, зачем онивообще нужны, то лучше оставьте пока эту секцию безизменений.

3-й этапКонфигурирование параметров вывода. Здесь мы указы-ваем, куда у нас будет осуществляться вывод, в БД или вобычный лог-файл. Если в БД, то можно задать различ-ные параметры, если в файл, то можно задать имя фай-ла. Подробнее о ведении логов в БД и настройках, я ду-маю, я напишу в следующих статьях, а пока мы попыта-емся настроить вывод в обычный файл, как и планирова-лось. (Замечание: напоминаю, что для вывода в БД необ-ходима компиляция с поддержкой той или иной БД). Длявывода в файл надо оставить всё как есть по умолчаниюи создать директорию, куда будут вестись логи – это /var/log/snort. Необходимо проследить, чтобы у Snort былодостаточно прав на запись в неё.

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

После внесения изменений мы сохраняем конфигура-ционный файл и запускаем Snort от имени суперпользо-вателя командой:

(вместо eth0 можно указать любой другой прослушивае-мый интерфейс), использованные опции означают:� -o – сменить порядок применения правил с Alert →

Pass → Log order на Pass → Alert → Log order, это уско-ряет несколько работу.

� -i eth0 – слушать указанный интерфейс. Можно опус-тить, если интерфейс один в системе.

� -d – выводить содержимое уровня приложения в паке-тах, если стоит режим избыточности вывода или ве-дения учёта пакетов (дополнительная информация намне помешает).

� -с /etc/snort/snort.conf – использовать указанный кон-фигурационный файл.

Имеется ещё одна полезная опция «-l имя_директории»– она позволяет задавать ведение логов в какую-либо кон-кретную директорию. По умолчанию это /var/log/snort, по-этому мы не стали задавать этот излишний параметр.

После этого, если программу не прерывать, то она ви-сит на консоли и ловит атаки – это не самый удобный спо-соб запуска, но для понимания происходящего и отладки –самый лучший. При этом на каждый IP-адрес, с которогоидут атаки, создаётся поддиректория в директории, кудаведутся логи, и там создаётся файл с коротким названи-ем сокращённо от протокола и портов зарегистрирован-ной атаки, например: TCP:3739-1080 или TCP:21-21, илиICMP_ECHO. В частности, пока я отлаживал запуск в про-цессе написания этой статьи, за несколько секунд успелозарегистрироваться несколько реальных атак.

Внутри файлы имеет более подробное содержаниепроизошедшего, например, просмотрев файлICMP_ECHO, мы получаем информацию, что были атакина узлы xx.xx.xx.7, xx.xx.xx.15, xx.xx.xx.16, что показанона рис. 8.

# /usr/local/bin/snort -o -i eth0 -d -c /etc/snort/snort.conf

Ðèñóíîê 7. Âèä äèðåêòîðèè, êóäà âåäóòñÿ ëîãè

Ðèñóíîê 8. Ïðèìåð ñîäåðæèìîãî ôàéëà ñ èíôîðìàöèåé îá àòàêàõ

Page 68: 011 Системный Администратор 10 2003

66

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

Замечание. Из-за нашествия червя Blaster в последнеевремя (начиная с августа), которое стало возможным бла-годаря ошибкам в Windows NT/2000/XP и Windows 2003Server, «холостой» трафик на все узлы в сети увеличилсяпрактически в десять и более раз за счёт подобных паке-тов. Поэтому не удивляет тот факт, что за малый проме-жуток времени были зарегистрированы атаки.

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

Автоматизация процесса запуска SnortИзначально вопрос автоматического запуска никак небыл продуман, и каждый запускал его как хотел из стар-товых скриптов. Потом кто-то выложил свои скрипты всети, а потом стартовый скрипт для помещения в дирек-торию /etc/rc.d/init.d стал поставляться среди дополнитель-ных программ (см.выше). Объяснить сиё можно толькотем, что Snort может запускаться на различных платфор-мах, а поддерживается он многими (см. таблицу 1, в кото-рой запуск реализуется по-разному).

Один из возможных способов автоматического за-пуска представлен ниже. Для Linux следует создатьфайл /etc/rc.d/init.d/snortd следующего содержания:

Далее следует дать команду:

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

Закомментированная строчка «ifconfig eth0 up» имеетследующий смысл: если при каких-то условиях (смена но-мера, запуска или какой-то сбой при запуске network) унас Snort будет запускаться до запуска сети и поднятияинтерфейса, то при её наличии ошибки не будет. Повтор-ное поднятие уже поднятого интерфейса ошибок даватьне должно. Строчку «rm /var/log/snort/alert» и несколькососедних можно закомментировать, если вы не хотите,чтобы у вас при запуске этот файл начинался с нуля.

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

Планы на будущееЕсли эта статья вам понравилась и вы заинтересовалисьСОА Snort, значит, статья удалась. В дальнейшем я пла-нирую продолжить тему обнаружения атак и написать провведение логов в БД, просмотр БД с помощью ACID, воз-можно, рассказав ещё про Snortcenter и другие вещи. Да-лее я планирую переключить внимание на обнаружениераспределённых телекоммуникационных атак с помощьюнескольких сенсоров Snort.

В эксперименте по установке и настройке IDS Snortразных версий принимал участие RedHat Linux v.7.3.

Литература:1. Статистика CERT http://www.cert.org/stats/cert_stats.html2. C.Яремчук. L.I.D.S. //Системный администратор,

№4(5), 2003.3. В.Мешков. Система крипрографической защиты ин-

формации //Системный администратор, №4(5), 2003.4. С.Яремчук. Контрольная сумма на защите Linux/

FreeBSD //Системный администратор, №6(7), 2003.5. С.Яремчук. SELinux //Системный администратор,

№5(6), 2003.6. А.Даниленко. Технологии протоколирования Honeypot

в обеспечении безопасности сетевых Unix-систем //Си-стемный администратор, №5(6), 2003.

#!/bin/bash## snortd Start/Stop the snort IDS daemon.## chkconfig: 2345 79 11# description: snort is a lightweight network intrusion# detection tool that currently detects more# than 1100 host and network vulnerabilities,# portscans, backdoors, and more.## June 10, 2000 -- Dave Wreski <[email protected]># - initial version## July 08, 2000 Dave Wreski <[email protected]># - added snort user/group# - support for 1.6.2

# Source function library.. /etc/rc.d/init.d/functions

# Specify your network interface hereINTERFACE=eth0# See how we were called.case "$1" in start) echo -n "Starting snort: " # ifconfig eth0 up daemon /usr/local/bin/snort -o -i $INTERFACE -d -D \ -c /etc/snort/snort.conf touch /var/lock/subsys/snort sleep 3 if [ -f /var/log/snort/alert ] then rm /var/log/snort/alert fi echo ;; stop) echo -n "Stopping snort: " killproc snort rm -f /var/lock/subsys/snort echo ;; restart) $0 stop $0 start ;; status) status snort ;; *)

# chkconfig snortd on

Òàáëèöà 1. Ïëàòôîðìû, íà êîòîðûõ ðàáîòàåò Snort

echo "Usage: $0 {start|stop|restart|status}" exit 1esac

exit 0

Page 69: 011 Системный Администратор 10 2003

67№10(11), октябрь 2003

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

7. В.Мешков. Брандмауэр //Системный администратор,№1(2), 2003.

8. В.Мешков Брандмауэр ч.2. //Системный администра-тор, №2(3), 2003.

9. Лукацкий А.В., Обнаружение атак. – СПб: БХВ-Петер-бург, 2001. – 624 с.

10.Милославская Н.Г., Толстой А.И. Инстрасети: обнару-жение вторжений: Учеб. пособие для вузов. – М: ЮНИ-ТИ-ДАНА, 2001.

11.Н.Польман, Т.Кразерс. Архитектура брандмауэров длясетей предприятия.: Пер. с англ. – М.: Издательскийдом «Вильямс», 2003.

12.С.Норткат, М.Купер и др. Анализ типовых нарушенийбезопасности в сетях.: Пер. с англ. – М.: Издательскийдом «Вильямс», 2001.

13.П.Н.Девянин, О.О.Михальский, Д.И.Правиков,А.Ю.Щербаков. Теоретические основы компьютернойбезопасности: Учеб. пособие для вузов. – М: Радио исвязь, 2000.

14.Анонимный автор, Максимальная безопасность вLinux.: Пер. с англ./Автор анонимный – К.: Издатель-ство «ДиаСофт», 2000.

15.Сайт системы обнаружения атак IDS «Snort» http://www.snort.org/

16.А.Потёмкин. Общий обзор наиболее часто применяе-мых техник компьютерных атак и защиты от них //Сис-темный администратор, №1(2), 2003.

17.Форум журнала «Системный администратор» http://www.samag.ru/cgi-bin/yabb/YaBB.pl

18.Мак-Клар, Стюарт, Скембрей, Джоел, Курц, Джордж.Секреты хакеров. Безопасность сетей – готовые ре-шения, 2-е изд.: Пер. с англ. – М.: Издательский дом«Вильямс», 2001.

19.Сайт компании Internet Security Systems, Inc. http://www.iss.net/

20.Правиков Д.И. Закляков П.В. Использование виртуальныхловушек для обнаружения телекоммуникационных атак.//Проблемы управления безопасностью сложных систем:Труды международной конференции. Москва, декабрь2002 г./ Под ред. Н.И.Архиповой и В.В.Кульбы. Часть 1. –М.: РГГУ – Издательский дом МПА-Пресс. 342 с., с 310-314;

21.Роберт Л. Зиглер., Брандмауэры в Linux. : Пер. с англ.:Уч.пос. – М.: Издательский дом «Вильямс», 2000. – 386 с.

22. Request For Comments ? 79323. Request For Comments ? 316824.Отчёт фирмы Symantec по угрозам безопасности в

Интернете. http://www.symantec.com/region/ru/ruresc/download/SymantecInternetSecurityThreatReport2003.pdf

25.Руководящий документ Государственной ТехническойКомиссии России при Президенте РФ «Средства вы-числительной техники. Межсетевые экраны»

26.П.Закляков «Разводной мост на Linux» //Системныйадминистратор, №4(5), 2003.

27.Козлов Д.А. Энциклопедия компьютерных вирусов.- М.:«Солон», 2001. – 464 с.

28.Большая вирусная энциклопедия http://www.viruslist.com/index.html

29.С.Манн, М.Крелл Linux. Администрирование сетей TCP/IP. Пер. с англ. – М.:ООО «Бином-Пресс», 2003.

30.В.Г.Олифер, Н.А.Олифер. Компьютерные сети. Прин-ципы, технологии, протоколы – СПб: Питер, 2001.

31.Сайт SANS Institute – Computer Security Education andInformation Security Training http://www.sans.org/

32.Файл NEWS из Snort-2.0.2.tar.gz33.Дж.Такет, С. Барнет. Использование Linux. Специаль-

ное издание.: 5-e изд.:Пер с англ.: Уч. пос. – М.: Изда-тельский дом «Вильямс», 2000.

34. Медведковский И.Д., Семьянов П.В., Платонов В.В.Атака через INTERNET. Под научной редакцией проф.Зегжды П.Д. - СПб: «Мир и семья-95», 1997.

Page 70: 011 Системный Администратор 10 2003

68

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

БОРЬБА С ВИРУСАМИОПЫТ КОНТРТЕРРОРИСТИЧЕСКИХ ОПЕРАЦИЙ

КРИС КАСПЕРСКИ

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

Солдатская мудрость

Червю LoveSan, разрушительной силойсвоей эпидемии побудившего меня написать

эту статью, посвящается…Автор

…знайте: когда вы читаете эти строки, какой-то парень на планете отлаживает очередной вирус,который не сегодня завтра нанесет удар и одной из жертв вирусного террора окажетесь вы.Не пытайтесь отмахнуться от проблемы и не надейтесь, что на этот раз вас «пронесет»!Вирусные атаки стали слишком интенсивными и никто не может чувствовать себяв безопасности. Использование антивирусов ничего не меняет: если вы администрируетелокальную сеть крупной организации, персонально для вас может быть написан специальныйвирус (троянская программа, шпион), проходящий сквозь антивирусные заслоны, как ножсквозь масло. Причем если до недавнего времени вирусы были нетехнической проблемой«грязных рук», которая решалась элементарным выламыванием дисководов и раздачей по ушамвсем любителям левого «софта», то основная масса современных вирусов проникает в целевыекомпьютеры самостоятельно, не требует никаких действий со стороны пользователя.Всякий уважающий себя администратор должен уметь находить и нейтрализовать имеющиеего вирусы самостоятельно. Тому, как именно это сделать, и посвящена настоящая статья.(P.S. речь идёт о ОС Windows NT/W2K/XP/9x/Me)

Page 71: 011 Системный Администратор 10 2003

69№10(11), октябрь 2003

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

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

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

Использование антивирусов также не решает пробле-мы. Чтобы там ни говорила реклама, а качество антиви-русных программ все еще оставляет желать лучшего.Зачастую вирусы не распознаются совсем или распозна-ются, но не удаляются. Мягкая переустановка системы(т.е. переустановка «поверх» ранее установленной вер-сии) не гарантирует удаления заразы, и многие зловред-ные программы ее вполне благополучно переживают!Форматирование диска – вообще безумный способ лече-ния, сродни сжиганию больных на костре – жестокий икрайне неэффективный. До тех пор, пока не будут пере-крыты все каналы проникновения вируса в систему, по-вторные заражения будут происходить вновь и вновь!

Основной недостаток подавляющего большинства ан-тивирусов как раз и состоит в том, что удаляя вирус изсистемы, они даже и не пытаются заткнуть те дыры, кото-рые вирус использует для своего распространения. Какследствие, «лечение» компьютера, подключенного к сети,превращается в перегон тараканов из одной казармы вдругую, а потом обратно. Ладно, заражение локальнойсети – это еще полбеды («останавливаем» сеть, лечимвсе машины, «запускаем» сеть), но вот проникновениевирусов в Интернет представляет собой весьма нетриви-альную проблему. Вылечить все машины глобальной сетиза раз просто нереально… Можно (и нужно!) установитьочередное обновление от Microsoft, заткнув брешь в сис-теме безопасности, но… кто даст голову на отсечение,что этот способ действительно сработает? Ряд обнару-женных дыр парням из Microsoft удалось заткнуть лишьсо второго-третьего раза, а некоторые дыры остались незаткнутыми и до сих пор (или заплатки были выпущеныне для всех ОС). Причем наблюдается ярко выраженнаятенденция в ухудшении поддержки четвертой версииWindows NT. Хоть и древней, но до сих пор работающей.

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

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

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

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

Знание языка ассемблера – древнейшего языка про-граммирования – обязательно. И одних лишь учебниковв стиле «ASSEMBLER» Юрова и «Программируем на язы-ке ассемблера IBM PC» Рудакова для его освоения ката-строфически недостаточно, поскольку всякий язык позна-ется лишь при общении «вживую». Сходите на любой си-стемно-ориентированный сайт (например, www.wasm.ru)и попытайтесь ухватить суть ассемблера извне, а не из-нутри. На форумах, где дикие люди произносят непонят-ные слова, ругаются матом и обсуждают репродуктивныерецепторы вирусов, витает особый системный дух, дела-ющий все сложное таким простым и понятым.

В конечном счете ассемблер – это всего лишь язык, при-чем очень и очень простой. Некоторые даже сравниваютего с эсперанто – десяток команд и вы уже можете сносноговорить. Единственная сложность состоит в том, что ви-русы, в отличие от нормальных программ, содержат мно-жество ассемблерных «извращений», смысл которых по-нятен только посвященным. Для непосвященных же это ин-теллектуальный вызов! Это увлекательные логические (ипсихологические!) головоломки; это бессонные ночи, горыраспечаток, яркие озарения и ни с чем не сравнимые ра-дости найденных вами решений! Хотя, если говорить чест-но… все уже украдено до нас, тьфу, все головоломки дав-ным-давно разгаданы, а задачки решены. Ресурсы глобаль-ной Сети к вашим услугам! Посетите сайт удивительногочеловека и исследователя программ Марка Русиновича –http://www.sysinternals.com, а также отыщите его книгу«Внутреннее устройство Windows 2000». Еще вам приго-дится знаменитый Interrupt List Ральфа Брауна, – хорошо

Page 72: 011 Системный Администратор 10 2003

70

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

структурированный справочник по портам, ячейкам памя-ти и прерываниям (включая недокументированные). Пос-ледние версии Platform SDK и DDK от Microsoft и BasicArchitecture/Instruction Set Reference/System ProgrammingGuide от Intel иметь обязательно. Русские переводы техни-ческой документации, которые заполонили книжные мага-зины, годятся разве что для студентов, работающих надочередным рефератом, который все равно не читают, а дляреальной работы они не пригодны.

Из инструментария вам в первую очередь понадобитсяхороший отладчик и дизассемблер. Конечно, свой выборкаждый волен делать сам, но ничего лучше soft-ice от NuMega(www.numega.com) и IDA PRO от Ильфака Гуильфанова(www.idapro.com) еще никто не видел. Оба этих продуктаотносятся к классу тяжелой артиллерии и по сложности сво-его управления ничуть не уступают таким софтверным мон-страм, как, например, Photoshop или Corel DRAW. Равно какизучение интерфейса, Photoshop не заменяет собой освое-ние техники рисования, так и искусство владения отладчи-ком/дизассемблером не ограничивается чтением штатнойдокументации. Ищите в магазинах «Отладка Windows-при-ложений» Джона Роббинса, «Отладчик soft-ice» Романа Ай-рапетяна, «Образ мышления – дизассемблер IDA» КрисаКасперски и «Фундаментальные основы хакерства – искус-ство дизассемблирования» его же.

Места наиболее вероятноговнедрения вирусовОбъектом вирусного поражения могут выступать как ис-полняемые файлы (динамические библиотеки, компонен-ты ActiveX, плагины), драйвера, командные файлы опе-рационной системы (bat, cmd), загрузочные сектора (MBRи BOOT), оперативная память, файлы сценариев (Visual

Basic Script, Java Script), файлы документов (MicrosoftWord, Microsoft Excel) и… это далеко не все! Фантазиясоздателей вирусов поистине безгранична, и потому уг-розы следует ожидать со всех сторон.

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

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

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

Количество всевозможных «родимых пятен», прямоили косвенно указывающих на зараженность файла, весь-ма велико и ниже перечислены лишь наиболее характер-ные из них. Но даже они позволяют обнаружить до 4/5всех существующих вирусов, а по некоторым оценкам иболее того (по крайней мере все «лауреаты» вирусногоTOP-20 обнаруживаются).

Текстовые строкиПрежде чем приступать к тотальному дизассемблиро-ванию исследуемого файла, нелишне пролистать егодамп на предмет выявления потенциально небезопас-ных текстовых строк, к которым, в частности, относятсякоманды SMTP-сервера и командного интерпретатораоперационной системы («HELO/MAIL FROM/MAIL TO/RCPT TO, DEL/COPY/RD/RMDIR соответственно), ветвейавтозапуска реестра (RunServices, Run, RunOnce), агрес-сивные лозунги и высказывания («легализуем марихуа-ну», «сам дурак») и т. д.

Источники угрозыПо данным сайта VX.NETLUX.ORG на начало сентября2003 года рейтинг «популярности» вирусов и троянскихконей выглядел так:

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

� I-Worm.Sobig.f� Worm.Win32.Lovesan� Worm.Win32.Welchia� I-Worm.Sobig.a� Worm.Win32.Ladex� Win32.Parite� I-Worm.FireBurn� Trojan.Win32.Filecoder� I-Worm.Mimail� I-Worm.Klez.a-h� 33.525� Worm.P2P.Harex.a� I-Worm.Tanatos.a� TrojanProxy.Win32.Webber� MBA.First� AJ family� Worm.P2P.Tanked� Andrey.932� Worm.Win32.Opasoft� Worm.Win32.Autorooter

Ðèñóíîê 1. TOP-20 âèðóñíîé ãîíêè íà âûæèâàíèå

Page 73: 011 Системный Администратор 10 2003

71№10(11), октябрь 2003

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

Конечно, все это еще не свидетельство наличия виру-са (троянской программы), а отсутствие компрометирую-щих программу текстовых строк – не гарант ее лояльнос-ти, но… просто поразительно, какое количество совре-менных вирусов ловится таким элементарным способом.Не иначе как снижение культуры программирования даето себе знать? Действительно, подавляющее большинствопрограмм (и зловредных программ в том числе) сегодняразрабатывается на языках высокого уровня, и програм-мисты не дают себе труда хоть как-то скрыть «уши», тор-чащие из секции данных (не знают, как это сделать?). От-компилированная программа просто шифруется статичес-кими упаковщиками, которые легко поддаются автомати-ческой/полуавтоматической распаковке, выдавая иссле-дователю исходный дамп со всеми текстовыми строкамина поверхности (см. раздел «Идентификация упаковщи-ка и автоматическая распаковка»).

Выше в качестве примера приведен фрагмент вирусаI-Worm.Kiliez.e, на малоизвестность которого жаловатьсяне приходится (вах! как трудно взглянуть на дамп того,что вы запускаете!).

Идентификация упаковщикаи автоматическая распаковкаУпаковка исполняемых файлов «навесными» упаковщи-ками была широко распространена еще во времена гос-

подства MS-DOS и преследовала собой следующие цели:� уменьшение размеров программы на диске;� сокрытие текстовых строк от посторонних глаз;� затруднение анализа программы;� «ослепление» сигнатурного поиска.

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

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

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

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

Критическая ошибка в SVCHOST.EXEЕсли, работая под Windows 2000/Windows XP, вы пойма-ете сообщение о критической ошибке приложения в мо-дуле SVCHOST.EXE и эта критическая ошибка с завид-ной регулярностью станет повторяться вновь и вновь, неторопитесь переустанавливать систему, не сносите вашкомпьютер в ремонт! Источник ошибки сидит отнюдь не внем, а приходит к вам по Сети своим шагом и имя ему –DCOM RPC bug.

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

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

Ðèñóíîê 3. Ýòî íå ïðèçíàê íåñòàáèëüíîñòè ñèñòåìû. Ýòî – ïðè-çíàê âèðóñíîé àòàêè! Åñëè íàæàòü íà «ÎÊ» – ïåðåñòàíåò ðàáî-òàòü áóôåð îáìåíà è íåêîòîðûå äðóãèå ôóíêöèè ñèñòåìû, åñëèíàæàòü íà «Îòìåíó» – çàïóñòèòñÿ îòëàä÷èê (åñëè îí ó âàñåñòü) è ñèñòåìà ïîëíîñòüþ âñòàíåò. Åñëè æå íå äåëàòü íèòîãî, íè äðóãîãî – ñèñòåìà óñïåøíî ïðîäîëæèò ñâîþ ðàáîòó…

Ðèñóíîê 2. Ôðàãìåíò âèðóñà I-Worm.Kilez.e, òåêñòîâûå ñòðîêèñîäåðæàùèåñÿ â òåëå êîòîðîãî âûäàþò àãðåññèâíûå íàìåðåíèÿïîñëåäíåãî ñ ãîëîâîé

Page 74: 011 Системный Администратор 10 2003

72

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

упакован и/или зашифрован. Зачастую расшифровщиккрайне примитивен и состоит из десятка-другого ма-шинных команд, смысл которых понятен с первоговзгляда. В таком случае распаковать файл можно и са-мостоятельно. Вам даже не придется выходить из ди-зассемблера, всю работу можно выполнить и на встро-енном языке (если, конечно, ваш дизассемблер поддер-живает такой язык). Для расшифровки простейших«ксорок» хорошо подходит HIEW, а задачи посложнеерешаются с помощью IDA. Подробное изложение мето-дики расшифровки исполняемых файлов вы найдете вкниге «Образ мышления – дизассемблер IDA» КрисаКасперски.

Если же код расшифровщика по своей дремучестинапоминает непроходимый таежный лес, у исследова-ния есть все основания считать, что исследуемая про-грамма упакована одним из навесных упаковщиков, ккоторым, в частности, принадлежат ASPack, UPX, NeoLiteи другие. Отождествить конкретный упаковщик при на-личии достаточного опыта можно и самостоятельно(даже полиморфные упаковщики легко распознаютсявизуально, стоит только столкнуться с ними три-пять разкряду), а во всех остальных случаях вам помогут специ-альные сканеры, самым известным (и мощным!) из ко-торых является бесплатно распространяемый PESCAN(http://k-line.cjb.net/tools/pe-scan.zip). Давайте возьмемфайл с вирусом Worm.Win32.Lovesan (также известныйпод именем MSblast) и натравим на него PE-SCAN. Ска-нер тут же сообщит, что вирус упакован упаковщиком UPX,который можно скачать с сервера upx.sourceforge.net, апри нажатии на кнопку «OEP» определит и адрес ориги-нальной точки в файл (в данном случае она равна0x00011CB). Ну коль скоро мы знаем имя упаковщика,найти готовый распаковщик не составит больших про-блем («UPX» + «unpack» в любом поисковике)1. С дру-гой стороны, знание оригинальной точки входа в файлпозволяет установить на этот адрес точку останова итогда в момент передачи управления только что распа-кованному файлу, отладчик немедленно всплывет (вни-мание! установка программной точки останова с кодомCCh в подавляющем большинстве случаев приводит ккраху распаковщика, для предотвращения которого сле-дует воспользоваться аппаратными точками останова;за подробностями обращайтесь к руководству пользо-

вателя вашего отладчика, в частности, в soft-ice уста-новка аппаратной точки останова осуществляется коман-дой BPM адрес X).

А как быть, если PE-SCAN не сможет определить ори-гинальную точку входа или ни один из найденных вамираспаковщиков не справляется с данным файлом? Еслиисследуемый файл хотя бы однократно запускался (тоесть ваша машина уже потенциально заражена), можновзять ProcDump (http://ProcDump32.cjb.net) и, запустив рас-паковываемый файл еще раз, снять с него полный дамппамяти (Task → имя процесса → Dump Fill). Конечно, что-бы полученный дамп превратился в полноценный PE-файл, над ним придется как следует поработать «рука-ми», но для дизассемблирования сойдет и так. Шансы рас-паковать файл без его запуска средствами ProcDump от-носительно невелики, да и качество распаковки оставля-ет желать лучшего. Зачастую распакованный файл не при-годен даже для дизассемблирования, не то что запуска!

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

Итак, вызываем soft-ice и устанавливаем точки оста-нова на все потенциально опасные функции, а также всете функции, которые обычно присутствуют в стартовомкоде (см. раздел «Стартовый код»). Если вирус написанна языке высокого уровня, мы захватим выполнение ещедо начала выполнения функции main. В противном слу-чае отладчик всплывет при первой попытке выполненияпотенциально опасной функции.

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

Ðèñóíîê 4. PE-SCAN â äåéñòâèè

Ëèñòèíã 1. Ïðèìåð òèïè÷íîãî «êñîðíîãî» ðàñøèôðîâùèêàñ êîììåíòàðèÿìè

; CODE XREF: sub_401090+58?j.text:004010DA loc_4010DA:; çàãðóçèòü â DL ñëåäóþùèé áàéò.text:004010DA mov dl, [esp+ecx+0Ch]; ðàñøèôðîâàòü ïî XOR 66h.text:004010DE xor dl, 66h; ïîëîæèòü íà ìåñòî.text:004010E1 mov [esp+ecx+0Ch], dl; óâåëè÷èòü ñ÷åò÷èê íà åäèíèöó.text:004010E5 inc ecx; åùå åñòü ÷òî ðàñøèôðîâûâàòü?.text:004010E6 cmp ecx, eax; …åñëè äà, òî ìîòàåì öèêë.text:004010E8 jl short loc_4010DA; CODE XREF: sub_401090+48?j.text:004010EA loc_4010EA:

Page 75: 011 Системный Администратор 10 2003

73№10(11), октябрь 2003

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

Давайте продемонстрируем технику ручной распаковкина примере анализа вируса IWorm.Sobig.f. PE-SCAN пока-зывает, что он упакован полиморфным упаковщикомTeLock 0.98 (http://egoiste.cjb.net/), однако найти готовый рас-паковщик в Интернете для этой версии не удается (те, чтоесть, не распаковывают файл совсем или распаковываютего неправильно). Пошаговая трассировка распаковщика(равно как и попытки анализа алгоритма распаковки) заво-дят нас в никуда, ибо код оказывается слишком сложен дляначинающих (а вот опытные программисты получают от егореконструкции настоящее удовольствие, ибо упаковщиквесьма неплох). Просмотр дампа в HEX-редакторе также непоказывает ничего подозрительного. Тупик…

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

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

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

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

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

Приблизительная структура типичного стартового кодатакова: сначала идет пролог, затем настройка обработчи-ка структурных исключений (для Си++ программ), обнару-живающая себя по обращению к сегментному регистру FS.Далее следует вызов функций GetVersion (GetVersionEx),GetModuleHandleA и GetStartupInfoA. Подробнее об иден-тификации стартового кода можно прочитать в книге«Фундаментальные основы хакерства» Криса Касперскиили в «Hacker Disassembling Uncovered» его же.

Здесь же мы не можем позволить себе подробно оста-навливаться на этом обширном вопросе и просто срав-ним start-up код нормальной программы с кодом вирусаWin2K.Inta.1676:

Òàáëèöà 1. Ôóíêöèè, ïîìîãàþùèå ïåðåõâàòèòü óïðàâëåíèåó ðàñïàêîâàííîãî âèðóñíîãî êîäà, ïîëó÷èâøåãî óïðàâëåíèå

Ðèñóíîê 5. Ðàñïàêîâàííûé âðó÷íóþ I-Worm.Sobig.f ñðàçó æåâûäàåò àãðåññèâíîñòü ñâîèõ íàìåðåíèé õàðàêòåðíûìè òåêñòîâûìèñòðîêàìè

Ëèñòèíã 2. Òàê âûãëÿäèò íîðìàëüíûé start-up îò MicrosoftVisual C++ 6.0…

.text:00401670 start proc near

.text:00401670 push ebp

.text:00401671 mov ebp, esp

.text:00401673 push 0FFFFFFFFh

.text:00401675 push offset stru_420218

.text:0040167A push offset __except_handler3

.text:0040167F mov eax, large fs:0

.text:00401685 push eax

.text:00401686 mov large fs:0, esp; Get current version number of Windows.text:00401696 call ds:GetVersion.text:004016EC push 0.text:004016EE call __heap_init.text:00401704 mov [ebp+var_4], 0.text:0040170B call __ioinit.text:00401710 call ds:GetCommandLineA.text:00401716 mov dword_424F44, eax.text:0040171B call ___crtGetEnvironmentStringsA.text:00401720 mov dword_4235C0, eax.text:00401725 call __setargv.text:0040172A call __setenvp.text:0040172F call __cinit.text:00401754 call _main.text:00401763 call _exit

Ëèñòèíã 3. …à òàê âûãëÿäÿò îêðåñòíîñòè òî÷êè âõîäà âèðóñàWin2K.Inta.1676

.text:00011000 start proc near

.text:00011000 mov eax, [esp+arg_0]

.text:00011004 lea edx, loc_11129

.text:0001100A mov [eax+34h], edx

.text:0001100D lea edx, dword_117A0

.text:00011013 lea eax, aHh ; "HH"

.text:00011019 mov [edx+8], eax

.text:0001101C mov [eax+4], aSystemrootSyst

.text:0001101C ; "\\SystemRoot\\system32\\drivers\\inf.sys"

Page 76: 011 Системный Администратор 10 2003

74

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

Смотрите! В то время как «хорошая» программа ле-ниво опрашивает текущую версию операционной систе-мы и иже с ней, зловредный вирус сломя голову несетсяв объятья драйвера inf.sys. Правильные программы таксебя не ведут и коварность вирусных планов разоблача-ется с первого взгляда!

Разумеется, отсутствие стартового кода еще не естьсвидетельство вируса! Быть может, исследуемый файлбыл упакован или разработчик применил нестандарт-ный компилятор или набор библиотек. Ну с упаковкоймы уже разобрались, а с идентификацией компилято-ра поможет справиться IDA и наш личный опыт (заме-чание: текущие версии IDA PRO определяют версиюкомпилятора непосредственно по стартовому коду, и,если он отсутствует или был изменен, механизм рас-познавания дезактивируется и поиском подходящейбиблиотеки сигнатур нам приходится заниматься вруч-ную, через меню File → Load file → FLIRT signature file). И,если обнаружится, что нормальный start-up у файла все-таки есть, но выполнение программы начинается не с него,шансы на присутствие вируса значительно возрастут!

Троянские программы, в большинстве своем написан-ные на языках высокого уровня, имеют вполне стандар-тный Start-Up и потому на такую наживку не обнаружи-ваются. Взять, например, того же Kilez, стартовый кодкоторого выглядит так:

Даже «невооруженным» глазом видно, что старто-вый код червя идентичен стартовому коду MicrosoftVisual C++ 6.0, что и неудивительно, так именно на немчервь и написан.

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

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

Так происходит потому, что дописывая свое тело вконец файла, «вирусная» секция оказывается самой пос-ледней секцией инициализированных ячеек памяти, закоторой простирается обширный регион неинициализи-рованных данных, без которого не обходится ни одна про-грамма. Это-то его (вирус) и демаскирует!

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

Нестандартные секцииПри заражении исполняемого файла методом дозаписисвоего тела в его конец у вируса есть две альтернативы:либо увеличить размер последней секции файла (а это,как правило, секция .data), присвоив ей атрибутExecutable2, либо создать свою собственную секцию. Обаэтих способа легко распознаются визуально.

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

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

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

.text:00011023 push 1200h

.text:00011028 push 0

.text:0001102D call ExAllocatePool

.text:00011032 or eax, eax

.text:00011034 jnz short loc_1103E

.text:00011036 mov eax, 0C0000001h

.text:0001103B retn 8

Ëèñòèíã 4. ×åðâü I-Worm.Kilez.h èìååò ñòàíäàðòíûé ñòàðòîâûéêîä

.text:00408458 start proc near

.text:00408458 push ebp ; sub_408458

.text:00408459 mov ebp, esp

.text:0040845B push 0FFFFFFFFh

.text:0040845D push offset stru_40D240

.text:00408462 push offset __except_handler3

.text:00408467 mov eax, large fs:0

.text:0040846D push eax

.text:0040846E mov large fs:0, esp

.text:0040847B mov [ebp+var_18], esp; Get current version number of Windows.text:0040847E call ds:GetVersion.text:004084AF xor esi, esi.text:004084B1 push esi.text:004084B2 call __heap_init.text:004084C4 mov [ebp+var_4], esi.text:004084C7 call __ioinit.text:004084CC call ds:GetCommandLineA.text:004084D2 mov dword_494E68, eax.text:004084D7 call ___crtGetEnvironmentStringsA.text:004084DC mov dword_493920, eax.text:004084E1 call __setargv.text:004084E6 call __setenvp.text:004084EB call __cinit.text:004084F0 mov [ebp+StartupInfo.dwFlags], esi.text:004084F3 lea eax, [ebp+StartupInfo].text:004084F6 push eax ; lpStartupInfo.text:004084F7 call ds:GetStartupInfoA.text:004084FD call __wincmdln

Page 77: 011 Системный Администратор 10 2003

75№10(11), октябрь 2003

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

Таблица импортаОперационные системы семейства Windows поддержива-ют два основных способа компоновки: статический и ди-намический. При статической компоновке имена (орди-налы) вызываемых API-функций выносятся в специаль-ную таблицу – таблицу импорта, изучение которой даетболее или менее полное представление о природе иссле-дуемой программы и круге ее интересов. К потенциальноопасным функциям в первую очередь относятся сетевыефункции, функции поиска, вызова и удаления файлов,TOOLHELP-функции, используемые для просмотра спис-ка активных процессов и внедрения в них…

Конечно, зловредной программе ничего не стоит заг-рузить все эти функции и самостоятельно, путем дина-мической компоновки, в простейшем случае опирающей-

ся на вызов LoadLibrary/GetProcAddress, а то и вовсе на«ручной» поиск API-функций в памяти (адрес системногообработчика структурных исключений дает нам адрес,принадлежащий модулю KERNEL32.DLL, базовый адрескоторого определяется сканированием памяти на пред-мет выявления сигнатур «MZ» и «PE» с последующимразбором PE-заголовка), но в этом случае текстовые стро-ки с именами соответствующих функций должны так илииначе присутствовать в теле программы (если только онине зашифрованы и не импортируются по ординалу).

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

Анализ таблицы импорта позволяет выявить также и рядвирусных заражений. Собственно, у вируса есть два пути:использовать таблицу импорта файла-жертвы или создаватьсвою. Если необходимых вирусу API-функций у жертвы нети она не импортирует функции LoadLibrary/GetProcAddress,вирус должен либо отказаться от ее заражения, либо темили иным образом импортировать недостающие функциисамостоятельно (некоторые вирусы используют вызов пофиксированным адресам, но это делает их крайне нежиз-неспособными, ограничивая ареал обитания лишь теми вер-сиями ОС, на которые явно закладывались вирусописате-ли; другие же определяют адреса функций самостоятельно:по сигнатурному поиску или ручным анализом таблицы им-порта: первое – громоздко и ненадежно, второе – слишкомсложно в реализации для начинающих).

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

Ðèñóíîê 7. Òàê âûãëÿäèò äèçàññåìáëåðíûé ëèñòèíã ôàéëà, çà-ðàæåííîãî âèðóñîì WinNT.Infis.4608: òî÷êà âõîäà ðàñïîëîæåíàâ ñåêöèè .reloc, ïîìåùåííîé íåïîñðåäñòâåííî çà êîíöîì èíè-öèàëèçèðîâàííûõ äàííûõ ó ñàìîé «êðîìêè» èñïîëíÿåìîãî ôàéëà

Ëèñòèíã 5. Òàê âûãëÿäèò äèçàññåìáëåðíûé ëèñòèíã ôàéëà, çà-ðàæåííîãî âèðóñîì WinNT.Chatter: èñïîëíÿåìûé êîä, ðàñïîëî-æåííûé â ñåêöèè .reloc, ïðåäíàçíà÷åííîé äëÿ õðàíåíèÿ ïåðå-ìåùàåìûõ äàííûõ, ñèãíàëèçèðóåò î íåíîðìàëüíîñòè ñèòóàöèè

Ðèñóíîê 6. Òàê âûãëÿäèò äèçàññåìáëåðíûé ëèñòèíã íîðìàëüíîãîôàéëà. Òî÷êà âõîäà ðàñïîëîæåíà âíóòðè ñåêöèè .text â ãóùåáèáëèîòå÷íûõ ôóíêöèé, ïðèõîäÿñü ïðèáëèçèòåëüíî íà ñåðåäèíóôàéëà

Page 78: 011 Системный Администратор 10 2003

76

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

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

Это вернейший признак вирусного заражения! Вернееи быть не может!

А что, если вирус захочет создать собственную секциюимпорта или как вариант попытается расширить уже су-ществующую? Ну две секции импорта для операционныхсистем семейства Windows – это слишком! Хотя… Поче-му, собственно, нет? Вирус создает еще одну секцию им-порта, дописывая ее в конец файла, копирует туда содер-жимое оригинальной таблицы импорта, добавляет недо-стающие API-функции и затем направляет поле Import Tableна «свою» таблицу импорта. По факту загрузки файла опе-рационной системой вирус проделывает обратную опера-цию, перетягивая таблицу импорта «назад» (необходимостьпоследней операции объясняется тем, что система нахо-дит таблицу импорта по содержимому поля Import Table, а

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

Как вариант вирус может добавить к файлу секциюBOUND IMPORT, что очень просто реализуется и, что са-мое интересное, обнаруживается далеко не всеми дизас-семблерами! Откройте исследуемый файл в HIEW и по-смотрите на 12-й элемент Header Data Directories. Еслитакой элемент действительно присутствует и хранит в себенечто отличное от нуля, – вероятность присутствия виру-са в файле становится весьма велика (хотя некоторыелегальные программы, в частности, линкер ULINK ЮрияХарона также содержат в себе секцию BOUND IMPORT,но вирусами, очевидно, не являются).

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

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

1 Упаковщик UNPX также содержит в себе и распаков-щик, хотя это скорее исключение, чем правило.

2 Впрочем, под Windows 9x/NT этого можно и не де-лать, так как она разрешает выполнение кода в секцииданных.

Ëèñòèíã 6. «Çàãëóøêà», ïðåäñòàâëÿþùàÿ ñîáîé ïåðåõîäíèê êèìïîðòèðóåìîé ôóíêöèè è îòòÿãèâàþùàÿ âñå ïåðåêðåñòíûå ññûë-êè íà ñåáÿ

; CODE XREF: sub_432A58+C0?pBRAT0:00648310 CreateFileA proc near; sub_432BC0+C0?p ...BRAT0:00648310BRAT0:00648310 FF 25 48 44+ jmp ds:__imp_CreateFileABRAT0:00648310 CreateFileA endp

Ëèñòèíã 7. Òàáëèöà èìïîðòà èññëåäóåìîãî ïðèëîæåíèÿ: íàëè-÷èå «ïàðàçèòíîé» ññûëêè íà CreateFileA óêàçûâàåò íà ôàêòâèðóñíîãî çàðàæåíèÿ

; DATA XREF: CreateDirectoryA?r.idata:006A4440 extrn __imp_CreateDirectoryA:dword; DATA XREF: CreateEventA?r.idata:006A4444 extrn __imp_CreateEventA:dword; DATA XREF: CreateFileA?r.idata:006A4448 extrn __imp_CreateFileA:dword; DATA XREF: sub_6A4140?r.idata:006A4448; DATA XREF: CreateProcessA?r.idata:006A444C extrn __imp_CreateProcessA:dword; DATA XREF: CreateThread?r.idata:006A4450 extrn __imp_CreateThread:dword

Page 79: 011 Системный Администратор 10 2003

Множественные уязвимостив Portable OpenSSH в PAM-кодеПрограмма: Portable OpenSSH 3.7p1, 3.7.1p1.Опасность: Высокая.Описание: Несколько уязвимостей обнаружено в PortableOpenSSH в PAM-коде. Удалённый атакующий в некото-рых конфигурациях может выполнить произвольный кодна системе.

Сообщается, что как минимум одна из обнаруженныхуязвимостей может эксплуатироваться удалённо в неко-торых конфигурациях (в которых отключен privsep). Вер-сия OpenSSH для OpenBSD не содержит уязвимый код,поэтому не уязвима.URL производителя: http://www.openssh.com/portable.htmlРешение: Обновите программу до Portable OpenSSH 3.7.1p2или отключите поддержку PAM («UsePam no» в sshd_config).

Множественные уязвимостив Apple Macintosh OS XПрограмма: Apple Macintosh OS X.Опасность: Высокая.Описание: Множественные уязвимости обнаружены вApple Macintosh OS X. Удаленный пользователь можетскомпрометировать удаленную систему или выполнитьDoS-нападение.� SA9743. Mac OS X уязвима к недавно обнаруженным

уязвимостям в OpenSSH. Уязвимость может исполь-зоваться для DoS-нападения.

� SA9758. Переполнение буфера обнаружено в обработ-чике Sendmail адресов и в обработчике правил. Уяз-вимость может использоваться для выполнения про-извольного кода.

� SA9535. «off-by-one» переполнение обнаружено в фун-кции «fb_realpath()». Уязвимы приложения, использу-ющие уязвимую функцию.

Уязвимость обнаружена в функции «arplookup()». Зло-намеренный пользователь в локальной сети может исчер-пать память ядра, посылая поддельные ARP-запросы.URL производителя: http://docs.info.apple.com/article.html?artnum=61798Решение: Обновите систему до OS X 10.2.8, вручную илииспользуя Software Update в System Preferences:� Mac OS X Client (updating from 10.2 - 10.2.5):

ht tp: / /download. in fo.apple.com/Mac_OS_X/061-0 6 7 7 . 2 0 0 3 0 9 2 2 . P k N 4 5 / 2 Z /MacOSXUpdateCombo10.2.8.dmg

� Mac OS X Client (updating from 10.2.6 - 10.2.7):ht tp: / /download. in fo.apple.com/Mac_OS_X/061-0675.20030922.fvWWd/2Z/MacOSXUpdate10.2.8.dmg

� Mac OS X Server (updating from 10.2 - 10.2.5):ht tp: / /download. in fo.apple.com/Mac_OS_X/061-0 6 8 1 . 2 0 0 3 0 9 2 2 . d Z w 2 3 / 0 Z /MacOSXSrvrUpdCombo10.2.8.dmg

� Mac OS X Server (updating from 10.2.6 - 10.2.7):ht tp: / /download. in fo.apple.com/Mac_OS_X/061-0 6 7 9 . 2 0 0 3 0 9 2 2 . G h 6 7 8 / 0 Z /MacOSXServerUpdate10.2.8.dmg

Удаленное выполнение произвольногокода в MondoSearchПрограмма: MondoSearch 4.x-5.х.Опасность: Критическая.Описание: Уязвимость обнаружена в MondoSearch. Зло-намеренный пользователь может получить доступ к уяз-вимой системе.

Дополнительные подробности не сообщаются. Mondosoftоценила риск обнаруженной уязвимости как «критический»и советует немедленно установить заплату.URL производителя: http://www.mondosoft.com/security/Решение: Установите заплату для версий 4.4, 5.0, и 5.1:http://www.mondosoft.com/security/msp0903a.zip

Удаленное выполнение произвольногокода в LSH (эксплоит)Программа: LSH 1.4.x - 1.5.x.Опасность: Критическая.Описание: Уязвимость обнаружена в LSH – бесплатнойальтернативе OpenSSH. Удаленный пользователь можетвыполнить произвольный код на уязвимой системе.

Переполнение обнаружено в «read_line.c». Ниже ра-бочий код, которых позволяет удаленному атакующемускомпрометировать уязвимый сервер.Пример/Эксплоит: http://www.securitylab.ru/_exploits/lsh_exploit.c.txtURL производителя: http://www.net.lut.ac.uk/psst/Решение: Разрешайте подключения только из доверенныхIP-адресов. Дождитесь соответствующего исправления.

Уязвимость в обработке TCP-пакетовв Microsoft Windows 2000 и Windows XPПрограмма: Microsoft Windows 2000 Advanced ServerMicrosoft Windows 2000 Datacenter Server, Microsoft Windows2000 Professional, Microsoft Windows 2000 Server, MicrosoftWindows XP Home Edition, Microsoft Windows XP Professional.Опасность: Низкая.Описание: Уязвимость обнаружена в обработке TCP-па-кетов в Microsoft Windows 2000 и Windows XP. Удаленныйатакующий может раскрыть конфиденциальную инфор-мацию.

Windows, при определенных обстоятельствах, не сбра-сывает «URG» тэг TCP-пакетов. Когда это происходит,Windows не устанавливает корректное значение для 16-би-тового значения «URG», включая в тэг «URG» случайныеданные других пакетов.URL производителя: http://www.microsoft.comРешение: Для передачи критически важных данных ис-пользуйте шифрованный трафик.

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

bugtraq

77№10(11), октябрь 2003

Page 80: 011 Системный Администратор 10 2003

78

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

АНАЛИЗ ЗАЩИТЫПРОГРАММИ РЕКОМЕНДАЦИИПО ЕЁ УСИЛЕНИЮ

СТАНИСЛАВ ГОШКО

Page 81: 011 Системный Администратор 10 2003

79№10(11), октябрь 2003

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

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

В большинстве своём крэкеры используют следующийинструментарий:� отладчики (SoftICE, TRW, Turbo Debugger, ...)� дизассемберы (IDA, W32 Dasm, Sourcer, ... )� шестнадцатиричные редакторы (Hiew, Hex Workshop, ...)� мониторы (FileMon, RegMon, ...)

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

Winzip 8.0Загрузить SoftICE, поставить точку прерывания наGetDlgitemTexta, затем заполнить поля формы Winzip(name, serial_number; заполнить чем угодно) и нажать OK.Появится окно SoftICE, там поставить точку прерыванияна 0167:00407AAB и посмотреть данные.� bpx GetDlgItemTextA� bpx 0167:00407AAB� d eax� В окне данных будет серийный номер, сгенерирован-

ный по вашему имени.

Hexworkshop 2.54Ставим точку прерывания на GetWindowTexta, затем ста-вим точку прерывания по адресу 0167:004262AF. Трасси-руем без вхождения (F10) до второго перехода jnz. Этотвторой переход выполняться не хочет, изменяем флаг нуля(в окне регистров наводим на Z и нажимаем INS).

Теперь убираем все точки прерывания:

и закрываем SoftICE – F5.Вводим имя и фирму, на которую хотим зарегистриро-

ваться. Вот и всё.

Winamp 2.xx� bpx hmemcpy� Вводим serial.� Всплываем в SoftICE.� Видим что-то вроде:

два раза клацаем на эту строку, жмём F5.� ? eax (там и хранится регистрационный код).� Убираем точки прерывания, выключаем SoftICE.

Irfanview 2.0Данная программа была препарирована за 5 минут, а де-лалось это так:

� Устанавливаем точку прерывания в SoftICE наMessageBoxA:

� Всплывя в Irfan, мы видим кучу разных сравнений инесколько переходов. Моё внимание привлекла функ-ция Kernel32, заполнив форму, я нашёл на неё пере-ход и увидел, что переход находится по адресу:

� Исправляем флаг нуля в окне регистров и жмём F5,вуаля – мы зарегистрированы.

P.S. Можно было в HIEW заменить этот переход на jz.

mIRC v. 6.01Загрузить SoftICE, поставить точку прерывания наMessageBoxA.

Затем заполнить поля формы и нажать «ОК». Появит-ся окно SoftICE. Выйдем из User32.dll и затем проанали-зируем код, предшествующий сообщению об ошибке.

Выше вызова MessageBoxA я натолкнулся на следую-щий вызов функции:

Команду условного перехода необходимо либо обра-тить (jnz 004c3ce1), либо забить nop.

Адрес инструкции условного перехода следующий:004с3с24.

CustomiserДанная программа работает определённое количествовремени и потом сообщает о том, что время её использо-вания кончилось. И больше работать не хочет – это выра-жается в том, что пропадает кнопка «Continue».

Начнём наше исследование с того, что взглянём, ка-кие функции данная программа импортирует. Нас особобудут интересовать функции из USER32.dll, так как диа-лог, на котором была кнопка «Continue», импортируетсяскорее всего оттуда. Мое внимание привлекла функция –DialogBoxParamA.

Загружаем SoftICE и ставим брейкпоинт на эту функ-цию:

После этого запускаем программу и сразу же всплы-

bpx MessageBoxA

0167:00440347 jnz 00440375

bpx MessageBoxA

; Ïîìåùàåòñÿ â ñòåê ñìåùåíèå ñåðèéíîãî íîìåðàpush 0056d737; Ïîìåùàåòñÿ â ñòåê ñìåùåíèå èìåíèpush 0056d350; Âûçîâ ôóíêöèè, êîòîðàÿ ïðîâåðÿåò êîððåêòíîñòücall 004c37b1; Ïðîâåðêà ðåçóëüòàòà ôóíêöèètest eax,eax; !!!!!!!!!!!!!jz 004c3ce1

bpx DialogBoxParamA

cmp eax, esi

bc *

Page 82: 011 Системный Администратор 10 2003

80

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

вёт SoftICE в недрах USER32.dll, и мы поднимемся из этойфункции (нажатием F12).

Протрассируем до адреса 41f8c4, и там мы заметимподозрительный условный переход, следом за которымидёт ещё один. Второй переход указывает на вызов фун-кции EnableWindow. Становится ясно, что нам нужно пе-рейти по этому переходу. Для этого мы инвертируем флагнуля в SoftICE и нажимаем F5, что возвращает управле-ние программе, и мы видим, что программа заработала.

Теперь мы должны пропатчить её. Запускаем HIEW,переходим по адресу 41f8c4 и меняем байты «75 03» на«EB 18».

После этого снимем брейкпоинт в SoftICE.

Запустим программу, нажмём кнопку «Exit», и про-грамма не завершится, а, наоборот, запустится. Но по-прежнему будет постоянно появляться это мерзкое окнос сообщением, что время твое прошло. Поэтому мы по-пытаемся избавиться от него. Найдём вызов функциирисования данного окна. Получится адрес 41f89c, и тамбудет вызов подпрограммы из 3 байт, которые переза-пишем 3 nop («90»).

Перезаписывать будем при помощи HIEW.Вот полная информация о проведённых изменениях:

После этого программа будет запускаться без всякихокон.

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

Shadow Security Scanner 5.37Эта программа – один из лучших сетевых сканеров безо-пасности. Она имеет ограничение по времени на исполь-зование (trial).

Метод, который применялся при взломе Customiser,не работает потому, что окно создаётся функциейCretaeWindowExA, это всё несколько усложняет.

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

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

После этого переход, если не равно нулю. Поиграем сфлагом нуля, и что мы видим – программа заработала,осталось только её пропатчить:

Вот и всё, защита с программы снята.

Как мы можем видеть, взлом программы чаще всегоотталкивается от перехвата WIN API-функций. Как мож-но этому противостоять?

Существует несколько методов:

Написание и использование своихфункций с переходом куда-нибудьв середину WIN API-функцииРассмотрим написание своих функций на примере функ-ции GetWindowTextA.

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

Давайте рассмотрим, как начинается данная функция:

Так начало функции выглядит у меня. Каждому необ-ходимо посмотреть на её начало под отладчиком самому:� Загрузить SoftICE� Ctrl + D ( Всплываем в SoftICE)� u GetWindowTextA

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

Причём при вызове GetWindowTextA идёт переход поадресу 77d5c13a. Мы же можем сделать следующим об-разом:

Данный метод позволяет защититься от точки преры-вания в SoftICE такого вида:

Так же можно сделать следующим образом:

И таких вариантов существует достаточно много.В оптимальном варианте применения данной техники

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

bc *

41f89c: 90 90 9041f8c4: EB 18

cmp [ebx+14],0

593598: EB

77d5c13a: push 0c77d5c13c: push 77d6e49877d5c141: call 77d439c0

push xxxxxxxx................push xxxxxxxxcall GetWindowTextA

push xxxxxxxx................push xxxxxxxxpush return_addresspush 0cjmp (GetWindowTextA+2)

bpx GetWindowTextA

push xxxxxxxx................push xxxxxxxxpush return_addresspush 0cpush 77d6e498jmp (GetWindowTextA+7)

Page 83: 011 Системный Администратор 10 2003

81№10(11), октябрь 2003

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

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

Это позволит ещё более обезопасить программу отперехвата WIN API-функций.

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

Он заключается в том, что перед вызовом необходи-мой WIN API-функции подсчитывается её контрольная сум-ма и сверяется с той суммой, которая хранится в програм-ме. Как вы помните, при установленной точке прерыва-ния на место первой инструкции записывается байт «СС»(int 3), который и изменяет контрольную сумму даннойфункции. При проверке контрольной суммы данной фун-кции и определении отладки можно выйти из программы.

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

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

Обнаружение отладчикаи завершение программыВсе отладчики подсистемы семейства Windows делятсяпо уровням:� ring 3 (уровень приложения)� ring 0 (уровень ядра)

В основном все отладчики, кроме SoftICE, относятся котладчикам уровня приложения и против них существуетмножество методов, которые мы сейчас и рассмотрим:

Использование WIN API-функцииIsDebuggerPresentИспользовать её довольно легко:

Или вот её полный код:

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

Вначале нам необходимо сохранить оригинальныйобработчик SEH:

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

Восстановление оригинального обработчика в нашемслучае будет производиться следующей инструкцией:

Данная инструкция восстанавливает из стэка ориги-нальный обработчик SEH.

А теперь рассмотрим программу, которая обрушиваетотладчик, а без отладчика работает:

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

Победить правильно настроенный SoftICE практичес-ки невозможно, но дело в том, что в 90% он не настроендолжным образом.

1) Стандартным методом является использование сле-дующего кода:

При попадании на инструкцию int 3 взломщик попадётвнутрь обработчика и будет там вдали от защитного ме-ханизма программы.

2) Следующий код эффективно использовать для мо-дификации ключа расшифровки:

if (!IsDebuggerPresent()) goto no_debugger //........................................no_debugger:

mov eax,fs:[018h]mov eax,[eax+30h]movzx eax,byte ptr [eax+02]ret

push offset SEH_Handlermov fs:[0],esp

pop dword ptr fs:[0]

.386p

.model flat

extrn ExitProcess:PROC

.dataHi dd 0.code;--------------------------------------------------------;start:

pop ebx ; Àäðåñ äëÿ âûçîâà èñêëþ÷åíèÿcall setupSEH

Ex_Handler:mov esp,[esp+8] ; Îøèáêà äàåò íàì ñòàðûé ESP

; â [ESP+8]exit:

push 0 ; Êëàä¸ì â ñòýê 0call ExitProcess ; È çàâåðøàåì ïðîãðàììó

;--------------------------------------------------------;setupSEH:

push dword ptr fs:[0] ; Push îðèãèíàëüíûé; îáðàáîò÷èê SEH

mov fs:[0],esp ; È ïîìåùàåì íîâûé; (êîòîðûé íàõîäèòñÿ; ïîñëå ïåðâîãî call)

mov eax,012345678h ; Ïûòàåìñÿ ïèñàòü; â ÿäðî (÷òî âûçîâåò

xchg eax,[ebx] ; èñêëþ÷åíèå)

end start

push sspop ssint 3

mov ebp,"BCHK"

push dword ptr fs:[0]

Page 84: 011 Системный Администратор 10 2003

82

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

3) Разработчики SoftICE оставили возможности дляопределения его присутствия, которыми мы и воспользу-емся для защиты своей программы от SoftICE.

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

Список файлов:� «\\.\NTICE»� «\\.\SIWVIDSTART»� «\\.\SICE»� «\\.\SIWVID»

Ну вот с отладчиками и закончили.

ДизассемблерыПерейдём к дизассемблерам, которые позволяют анали-зировать код без его исполнения. Чтобы им противосто-ять, оптимальным вариантом считается шифрование кри-тических участков программы. Также определённое рас-пространение получила техника под названием «перекры-вающийся код». Рассмотрим листинг:

Что же делает выделенная восклицательными знака-ми часть кода?� В eax помещается значение 04ebh(это опкод команды

jmp $+4)� jmp $-4, переходит на значение 04ebh� jmp $+4, переходит на метку next

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

Защита от изменения кодаМногие программисты видели так называемые патчи (зап-латки) для программ, которые сводят суть защиты про-граммы на нет. Как же с этим бороться?

Существуют два метода защиты:� Шифровать при помощи контрольной суммы критичес-

кого места программы важные данные.

При этом если даже защита будет снята, программабудет работать некорректно. И это сведёт попытки взлом-щика на нет. А для полноценного взлома такого вида за-щиты нужно будет полностью разобраться в алгоритме,что доступно далеко не каждому взломщику.� Использование помехозащищённого программирования.

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

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

Первый способ скрывает защитный механизм внутрипрограммы. А второй запутывает своими обращениями кразличным файлам.

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

mov eax,04ebhjmp $-4

next:

push sspop ssint 3db blabla ; Îïêîä ìîäèôèöèðóþùèé êëþ÷

; äåêðèïòîâàíèÿ

Page 85: 011 Системный Администратор 10 2003
Page 86: 011 Системный Администратор 10 2003

84

образование

ПОЛИНОМИАЛЬНАЯ АРИФМЕТИКАИ ПОЛЯ ГАЛУА

КРИС КАСПЕРСКИ

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

Искусство рассуждать – это искусствообманывать самого себя

Антуан де Сент-Экзюпери«Цитадель»

ИЛИ ИНФОРМАЦИЯ, ВОСКРЕСШАЯИЗ ПЕПЛА II

Page 87: 011 Системный Администратор 10 2003

85№10(11), октябрь 2003

образование

Полиномиальная арифметикаПолиномиальной арифметике посвящен шестой разделтретьего тома «Искусства программирования» ДональдаКнута, где полиному дается следующее определение:«Формально говоря, полином над S представляет собойвыражение вида: u(x) = unx

n + … + u1x + u0, где коэффици-енты un, … ,u1,u0 – элементы некоторой алгебраическойсистемы S, а переменная x может рассматриваться какформальный символ без определяющего значения. Бу-дем полагать, что алгебраическая система S представля-ет собой коммутативное кольцо с единицей. Это означа-ет, что S допускает операции сложения, вычитания и ум-ножения, удовлетворяющие обычным свойствам: сложе-ние и умножение являются ассоциативными и коммута-тивными бинарными операциями, определенными на S,причем умножение дистрибьютивно по отношению к сло-жению. Существует также единичный элемент по сложе-нию 0 и единичный элемент по умножению 1, такие, чтоa + 0 == a и a1 == a для всех a из S. Вычитание являетсяобратной по отношению к сложению операцией, но о воз-можности деления как операции, обратной по отношениюк умножению, ничего не предполагается. Полином0∗xn + m + … + 0∗x n + 1 + unx

n + … + u1x + u0 рассматриваетсякак идентичный unx

n + … + u1x + u0, хотя формально он от-личается от него».

Таким образом, вместо того, чтобы представлять ин-формационное слово D, кодовое слово C и остаток отделения R в виде целых чисел (как это делалось намиранее), мы можем связать их с соответствующими ко-эффициентами двоичного полинома, выполняя все пос-ледующие математические манипуляции по правиламполиномиальной арифметики. Выигрыш от такого пре-образования на первый взгляд далеко не очевиден, ноне будем спешить, а лучше преобразуем любое при-шедшее нам в голову число (например, 69h) в двоич-ный полином. Запустив «Калькулятор» или любое дру-гое подходящее приложение по вашему вкусу, переве-дем наше число в двоичный вид (при соответствующихнавыках эту операцию можно выполнить и в уме, см.«Техника и философия хакерских атак» Криса Каспер-ски): 69h → 1101001.

Ага, крайний правый коэффициент равен единице,затем следуют два нулевых коэффициента, потом еди-ничный коэффициент… Короче говоря, получается сле-дующее: 1∗x6 + 1∗x5 + 0∗x4 + 1∗x3+ 0∗x2 + 0∗x + 1. По сутиговоря, битовая строка «1101001» является одной изформ записи вышеуказанного полинома – ненагляднойс точки зрения неподготовленного человека, но удобнойдля машинной обработки. Постойте, но если 69h ужепредставляет собой полином, то в чем разница междусложением полиномов 69h и 27h и сложением целых чи-сел 69h и 27h?! Разница несомненно есть. Как еще по-казал Ницше: фактов нет, а есть одни лишь интерпрета-ции. Интерпретация же чисел и полиномов различна, иматематические операции над ними выполняются посовершенно независимым правилам.

Коэффициенты в полиномиальной арифметике стро-го типизированы и коэффициент при xk имеет иной тип,нежели при xm (конечно, при том условии, что k ≠ m).

А операции над числами различных типов категори-чески не допустимы! Все коэффициенты обрабатыва-ются независимо, а возникающий при этом перенос встарший разряд (заем из старшего разряда) попростуне учитывается. Покажем это на примере сложениячисел 69h и 27h:

Простейшие расчеты показывают, что сложение по-линомов по модулю два дает тот же самый результат,что их вычитание, и «волшебным» образом совпадает сбитовой операцией XOR. Впрочем, совпадение с XOR –чистая случайность, но вот эквивалентность сложения ивычитания заставляет заново пересматривать привыч-ную природу вещей, вспоминая задачки из серии «уМаши было одно яблоко, Петя отнял у нее его, затем ейподарили еще одно, спрашивается: сколько всего яблоку Маши осталось? А сколько у нее было бы, если бы пер-вое яблоко осталось не отнятым?». С точки зрения ариф-метики по модулю два ответ: один и ноль соответствен-но. Да! Не отними бы Петя у Маши яблоко, 1 + 1 == 0 ибедная Маша вообще осталась бы ни с чем. Так что,мальчики, почаще отнимайте яблоки у девушек – учитеих компьютерной грамотности!

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

Однако в нашем случае одной лишь полиномиальнойарифметикой дело не обходится и для реализации коде-ра/декодера Рида-Соломона нам потребуется активнаяпомощь со стороны полей Галуа. Что же это за поля та-кие, спросите вы?

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

Ëèñòèíã 1. Ñëîæåíèå, âûïîëíåííîå ïî ïðàâèëàì ïîëèíîìèàëüíîéäâîè÷íîé àðèôìåòèêè (ñëåâà) è ñëîæåíèå, âûïîëíåííîå ïî ïðà-âèëàì îáû÷íîé àðèôìåòèêè (ñïðàâà).

1101001 (69h) 1101001 (69h)+0100111 (27h) +0100111 (27h) ––––––– ––––––– 1001110 (4Eh) 10010000 (90h)

Page 88: 011 Системный Администратор 10 2003

86

образование

для примера. С тем же успехом инопланетянин мог ско-пировать содержимое всех серверов Интернета, нане-ся на свой металлический стержень всего одну-един-ственную риску. Не верите? А зря! Переводим Британ-скую энциклопедию в цифровую форму, получая огром-ное-преогромное число. Затем – ставим впереди негозапятую, преобразуя записываемую информацию вдлиннющую десятичную дробь. Теперь только остаетсянайти два числа A и B, таких, что результат деления A и Bкак раз и будет равен данному числу с точностью допоследнего знака. Запись этих чисел на металличес-кий стержень осуществляется нанесением риски, де-лящей последний на два отрезка с длинами, кратнымивеличинам А и B соответственно. Для считывания ин-формации достаточно всего лишь измерить длиныотрезков А и B, а затем – поделить один на другой.Первый десяток чисел после запятой будет более илименее точен, ну а потом… Потом жестокая практикаопустит абстрактную теорию по самые помидоры, окон-чательно похоронив последнюю под толстым слоем ин-формационного мусора, возникающего из невозможно-сти точного определения геометрических размеровобъектов реального мира.

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

То есть, если c = a ∗ b, то еще не факт, что a == c/b!Таким образом, для практической реализации кодов Рида-Соломона обычная арифметика непригодна и приходит-ся прибегать к помощи особой математики – математикиконечных групп Галуа.

Под группой здесь понимается совокупность целыхчисел, последовательно пронумерованных от 0 до 2n – 1,например: {0, 1, 2, 3} или {00h 01h, 02h, 03h, 04h, 05h, 06h,07h, 08h, 09h, 0Ah, 0Bh, 0Ch, 0Dh, 0Eh, 0Fh}. Группы, со-держащие 2n элементов, называются полями Галуа(Galois Field) и обозначаются так: GF(2n)1.

Члены групп в обязательном порядке подчиняютсяассоциативному, коммутативному и дистрибьютивномузаконам, но обрабатываются довольно противоестествен-ным на первый взгляд образом:1) сумма двух любых членов группы всегда присутству-

ет в данной группе;2) для каждого члена «а» группы существует тожде-

ственный (identity) ему член, обычно записываемыйкак «e», удовлетворяющий следующему условию:a + e = e + a = a;

3) для каждого члена «a» группы, существует обратный(inverse) ему член «–a», такой, что: a + (–a) == 0.

Начнем с первого тезиса. Не кажется ли он вам бре-дом? Допустим, у нас есть группа {0, 1, 2, 3}. Это ка-ким же в дупель пьяным нужно быть, чтобы при вычис-лении значения 2 + 3 получить число меньшее или рав-ное 3?! Оказывается, сложение в полях Галуа осуще-ствляется без учета переноса и сумма двух членов груп-

пы равна: c = (a + b) % 2n, где операция «%» обознача-ет взятие остатка. Применительно к нашему случаю:(2 + 3) % 4 == 1. У математиков это называется «сло-жением по модулю 4».

Естественно, вас интересует: а применяется ли сло-жение по модулю на практике или используется лишь вабстрактных конструкциях теоретиков? Хороший вопрос!Сложение по модулю мы машинально выполняем десят-ки раз на дню, даже не задумываясь о том, что это иесть сложение без учета переноса. Вот, например, про-снувшись в шесть вечера по утру, вы просидели за ком-пьютером девять часов кряду, а потом неожиданно бро-сили взгляд на свои наручные часы. Какое положениезанимала часовая стрелка в это время, при условии, чточасы идут точно? Искомое значение со всей очевиднос-тью представляет собой сумму 6 и 9 по модулю 12 и рав-но оно: (6 + 9) % 12 == 3. Вот вам наглядный примерпрактического использования арифметики Галуа. А те-перь давайте в порядке эксперимента вычтем из числа 3число 6… (если не догадываетесь, как это правильно сде-лать, – возьмите в руки часы).

Теперь самое главное: раз результат деления одно-го члена группы на другой, естественно, не равныйнулю, член в обязательном порядке должен присутство-вать в данной группе, то несмотря на то, что делениеосуществляется в целых числах, оно будет точным. Точ-ным, а не округленным! Следовательно, если c = a ∗ b,то a == c/b. Другими словами, умножение и деление не-противоречивым образом определено для всех членовгруппы, конечно, за исключением невозможности де-ления на нуль, причем расширения разрядной сетки приумножении не происходит!

Конечно, это не совсем обычное умножение (и да-леко не во всяком поле Галуа дважды два будет раночетырем), однако никто и не требует от арифметикиГалуа ее соответствия «здравому смыслу» и «житейс-кому опыту». Главное – что она работает, причем ра-ботает хорошо. И существование жестких дисков, CD-ROM/DVD приводов – лучшее тому подтверждение, ибовсе они так или иначе используют эту арифметику всвоих целях.

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

Для реализации кодера/декодера Рида-Соломона нампотребуются четыре базовых арифметических операции:сложение, вычитание, умножение и деление. Ниже онибудут рассмотрены во всех подробностях.

Сложение и вычитаниев полях ГалуаСложение по модулю два в полях Галуа тождественновычитанию и реализуется битовой операцией XOR. Этотвопрос мы уже обсуждали при изучении полиномиальнойарифметики, поэтому не будем лишний раз повторяться,а просто приведем законченный пример программнойреализации функции сложения/вычитания:

Page 89: 011 Системный Администратор 10 2003

87№10(11), октябрь 2003

образование

Умножение в полях ГалуаОткрыв учебник математики за третий класс (если мнене изменяет память), мы найдем, что умножение пред-ставляет собой многократное сложение и, коль скоро сло-жение в полях Галуа мы выполнять уже научились, мыимеем все основания считать, что реализация функцииумножения не создаст особого труда. Так? А вот и нет! Явсегда знал, что дважды два равно четырем, до концаникогда не верил в это и, впервые столкнувшись с поля-ми Галуа, понял, насколько был прав2. Выяснилось, чтосуществуют и такие математики, где дважды два не рав-но четырем, а операция умножения определяется не че-рез сложение, а совсем по-другому.

Действительно, если попытаться «обернуть» функциюgf_sum в цикл, мы получим то же самое сложение толь-ко в профиль. a ∗ b будет равно а, если b четно, и нулю,если b нечетно. Ну и кому такое умножение нужно? Соб-ственно, функция «настоящего» умножения Галуа на-столько сложна и ресурсоемка, что для упрощения еереализации приходится прибегнуть к временному пре-образованию полиномов в индексную форму, последую-щему сложению индексов, выполняемому по модулю GF,и обратному преобразованию суммы индексов в поли-номиальную форму.

Что такое индекс? Это – показатель степени при ос-новании два, дающий искомый полином. Например, ин-декс полинома 8 равен 3 (23 = 8), а индекс полинома 2равен 1 (21 = 2). Легко показать, что a ∗ b = 2i

∗ 2j = 2(i+j).В частности, 2 ∗ 8 = 23

∗ 21 = 2(3+1) = 24 = 16. Составимследующую табличку и немного поэкспериментируемс ней:

До сих пор мы оперировали понятиями привычнойнам арифметики, и потому добрые две трети полей таб-лицы остались незаполненными. В самом деле, уравне-ния типа 2x = 3 в целых числах не разрешимы и ряд ин-дексов не соответствует никаким полиномам! Так-то онотак, но в силу того, что количество полиномов всякогополя Галуа равно количеству всевозможных индексов,мы можем определенным образом сопоставить их другдругу, закрыв глаза на то, что с точки зрения обычнойматематики такое действие не имеет никакого смысла.Конкретная схема сопоставления может быть любой,главное – чтобы она была внутренне непротиворечивой,

то есть удовлетворяла всем правилам групп, перечис-ленным выше (см. «Поля Галуа»).

Естественно, поскольку от выбранной схемы сопос-тавления напрямую зависит и конечный результат, обестороны (кодер и декодер Рида-Соломона) должны со-блюдать определенные договоренности. Однако различ-ные кодеры/декодеры Рида-Соломона могут использо-вать различные схемы сопоставления, несовместимыедруг с другом.

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

С помощью данной таблицы вы легко сможете осу-ществлять преобразование из полиномиальной формыв индексную и наоборот. Как пользоваться этой табли-цей? Допустим, мы хотим умножить полиномы 69 и 96.Находим в первой колонке число 69. Ему соответствуетalpha 47, запоминаем (записываем его на бумажке) и пе-реходим к числу 96, alpha которого равен 217. Склады-ваем 47 и 217 по модулю 256, получая в результате:(217 + 47) % 256 = 8. Теперь переводим результат про-изведения из индексной формы в полиномиальную: на-ходим в первой колонке число 8 и в третьей колонке ви-дим соответствующий ему полином: 3. (Если же мы вы-

Òàáëèöà 1. Òàáëèöà ïîëèíîìîâ (ëåâàÿ êîëîíêà) è ñîîòâåòñòâó-þùèõ èì ñòåïåíåé äâîéêè (ïðàâàÿ êîëîíêà).

Ëèñòèíã 2. Ôóíêöèÿ, ðåàëèçóþùàÿ ñëîæåíèå/âû÷èòàíèåâ ïîëÿõ Ãàëóà.

// ôóíêöèÿ âîçâðàùàåò ðåçóëüòàò ñëîæåíèÿ (âû÷èòàíèÿ)// äâóõ ïîëèíîìîâ a è b ïî ìîäóëþ 2int gf_sum(int a, int b){

return a ^ b;}

Òàáëèöà 2. Lock-up-òàáëèöà äëÿ GF(256). Ïåðâàÿ ñëåâà êîëîí-êà – ïîëèíîìû/èíäåêñû (îáû÷íî îáîçíà÷àåòñÿ, êàê i), âòî-ðàÿ – òàáëèöà ñòåïåíåé ïðèìèòèâíîãî ïîëèíîìà 2 (îáû÷íî îáî-çíà÷àåòñÿ êàê alpha_of), òðåòüÿ – èíäåêñû, ñîîòâåòñòâóþùèåäàííîìó ïîëèíîìó (îáû÷íî îáîçíà÷àåòñÿ êàê index_of).

Page 90: 011 Системный Администратор 10 2003

88

образование

полним обратную операцию, разделив 3 на 69 – мы по-лучим 96, что доказывает непротиворечивость операцийделения и умножения, а также всей арифметики Галуа вцелом). Быстро, не правда ли, хотя местами и не совсемпонятно, почему таблица составлена именно так, а неиначе? Хуже всего, что достоверность результата нельзяпочувствовать «вживую», поскольку все это – абстрак-ции чистейшей воды, что серьезно осложняет отладкупрограммы (сложно отлаживать то, чей принцип работыдо конца не понимаешь).

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

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

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

Деление в полях ГалуаДеление в полях Галуа осуществляется практически точ-но так, как и умножение, с той лишь разницей, что ин-дексы не прибавляются, а вычитаются друг из друга. Всамом деле: a/b == 2i/2j == 2(i-j). Для перевода из поли-номиальной в индексную форму и наоборот может ис-пользоваться уже приводимая выше look-up таблица.

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

Простейшие практические реализацииХорошим примером воплощения кодера/декодера Рида-Соломона являются древние модели жестких дисков,разработанных в недрах фирмы IBM. Модель IBM 3370имела простой и наглядный кодер/декодер Рида-Соло-мона типа (174,171) в поле Галуа GF(256). Другими сло-вами, он оперировал 8-битными ячейками (28 = 256), ина 171 информационный байт приходилось 3 байта сум-мы четности, что в результате давало кодовое слово сразмером 174 байт, причем, как мы увидим далее, всетри байта контрольной суммы рассчитывались совершен-но независимо друг от друга, поэтому фактически ко-

Ëèñòèíã 3. Ïðîöåäóðà ãåíåðàöèè look-up òàáëèöû áûñòðîãî óì-íîæåíèÿ ïîëèíîìîâ.

// ñòåïåíü RS-ïîëèíîìà (ñîãëàñíî Ñòàíäàðòà ECMA-130 – âîñåìü)#define m 8// n=2∗m-1 (äëèíà êîäîâîãî ñëîâà)#define n 255// êîëè÷åñòâî îøèáîê, êîòîðûå ìû õîòèì ñêîððåêòèðîâàòü#define t 1// k = n-2∗t (äëèíà èíôîðìàöèîííîãî ñëîâà)#define k 253

// íåñîêðàòèìûé ïîðîæäàþùèé ïîëèíîì// ñîãëàñíî Ñòàíäàðòó ECMA-130: P(x) = x8 + x4 + x3 + x2 + 1int p[m+1]={1, 0, 1, 1, 1, 0, 0, 0, 1 };

// òàáëèöà ñòåïåíåé ïðèìèòèâíîãî ÷ëåíàint alpha_to[n+1];// èíäåêñíàÿ òàáëèöà äëÿ áûñòðîãî óìíîæåíèÿint index_of[n+1];

//--------------------------------------------------------// ãåíåðèðóåì look-up òàáëèöó äëÿ áûñòðîãî óìíîæåíèÿ äëÿ GF(2m)// íà îñíîâå íåñîêðàòèìîãî ïîðîæäàþùåãî ïîëèíîìà P©// îò p[0] äî p[m].//// look-up òàáëèöà:// index -> polynomial èç alpha_to[] ñîäåðæèò j=alpha^i,// ãäå alpha åñòü ïðèìèòèâíûé ÷ëåí, îáû÷íî ðàâíûé 2// à ^ - îïåðàöèÿ âîçâåäåíèÿ â ñòåïåíü (íå XOR!);//// polynomial form -> index èç index_of[j=alpha^i] = i;//// © Simon Rockliff//--------------------------------------------------------

generate_gf(){

int i, mask;

mask = 1; alpha_to[m] = 0;

for (i = 0; i < m; i++){

alpha_to[i] = mask;index_of[alpha_to[i]] = i;

if (p[i] != 0) alpha_to[m] ^= mask;mask <<= 1;

} index_of[alpha_to[m]] = m; mask >>= 1;

for (i = m+1; i < n; i++){

if (alpha_to[i-1] >= mask) alpha_to[i] = alpha_to[m] ̂ ((alpha_to[i-1]^mask)<<1);else alpha_to[i] = alpha_to[i-1]<<1;

index_of[alpha_to[i]] = i;} index_of[0] = -1;

}

Ëèñòèíã 4. Ôóíêöèÿ áûñòðîãî òàáëè÷íîãî óìíîæåíèÿ ïîëèíîìîââ ïîëÿõ Ãàëóà.

// ôóíêöèÿ âîçâðàùàåò ðåçóëüòàò óìíîæåíèÿ äâóõ ïîëèíîìîâ// a íà b â ïîëÿõ Ãàëóàint gf_mul(int a, int b){

int sum;// íåìíîãî îïòèìèçàöèè íå ïîâðåäèòif (a == 0 || b == 0) return 0;// âû÷èñëÿåì ñóììó èíäåêñîâ ïîëèíîìîâsum = alpha_of[a] + alpha_of[b];// ïðèâîäèì ñóììó ê ìîäóëþ GFif (sum >= GF-1) sum -= GF-1;// ïåðåâîäèì ðåçóëüòàò â ïîëèíîìèàëüíóþ ôîðìó// è âîçâðàùàåì ðåçóëüòàòreturn index_of[sum];

}

Ëèñòèíã 5. Ôóíêöèÿ áûñòðîãî òàáëè÷íîãî äåëåíèÿ â ïîëèíîìîââ ïîëÿõ Ãàëóà.

// ôóíêöèÿ âîçâðàùàåò ðåçóëüòàò äåëåíèÿ äâóõ ïîëèíîìîâ// a íà b â ïîëÿõ Ãàëóà, ïðè ïîïûòêå äåëåíèÿ íà íîëü ôóíêöèÿ// âîçâðàùàåò -1int gf_div(int a, int b){

int diff;// íåìíîãî îïòèìèçàöèè íå ïîâðåäèòif (a == 0) return 0;// íà íîëü äåëèòü íåëüçÿ!if (b == 0) return -1;// âû÷èñëÿåì ðàçíîñòü èíäåêñîâdiff = alpha_of[a] – alpha_of[b];// ïðèâîäèì ðàçíîñòü ê ìîäóëþ GFif (diff < 0) diff += GF-1;// ïåðåâîäèì ðåçóëüòàò â ïîëèíîìèàëüíóþ ôîðìó// è âîçâðàùàåì ðåçóëüòàòreturn index_of[diff];

}

Page 91: 011 Системный Администратор 10 2003

89№10(11), октябрь 2003

образование

дер/декодер Рида-Соломона оперировал одним байтом,что значительно упрощало его архитектуру.

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

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

Ниже приведен фрагмент оригинальной прошивкижесткого диска IBM 3370 (только не спрашивайте: откудаон у меня взялся):

Ну что, слабо нам разобраться: как он работает? Чтокасательно переменной s0 – с ней все предельно ясно:она хранит контрольную сумму, рассчитанную по три-виальному алгоритму. Как вы, наверное, помните, сло-жение в полях Галуа осуществляется логической опе-рацией XOR, и потому: s0 += input[i].

Назначение переменной s1 выяснить сложнее, и чтобыпонять суть разворачивающегося вокруг нее метаболизма,мы должны знать содержимое таблицы GF_mult_by_alpha.Несмотря на то, что по соображениям экономии бумаж-ного пространства она здесь не приводится, ее имя го-ворит само за себя: содержимое s1 суммируется с оче-редным байтом контролируемого потока данных и ум-ножается на так называемый примитивный член, обо-значаемый как alpha, и равный двум. Другими словами:s1 = 2 ∗ (s1 + input[i]).

Допустим, один из байтов потока данных впослед-ствии будет искажен (обозначим его позицию как err_i),тогда индекс искаженного байта можно определить три-виальным делением s1 на s0. Почему? Так ведь выра-жение s1 = 2 ∗ (s1 + input[i]) по своей сути есть не чтоиное, как завуалированное умножение информацион-ного слова на порожденный полином, динамически ге-нерируемый на основе своего примитивного членаalpha. А контрольная сумма информационного слова,хранящаяся в переменной s0, фактически представля-ет собой то же самое информационное слово, только

представленное в более «компактной» форме. И, какуже говорилось в предыдущей статье: если ошибкапроизошла в позиции x, то остаток от деления кодово-го слова на порожденный полином будет равен k = 2x.Остается лишь по известному k вычислить x, что в дан-ном случае осуществляется путем обращения к табли-це GF_log_base_alpha, хранящей пары соответствиймежду k и 2x. Коль скоро позиция сбойного байта най-дена, его можно исправить путем XOR с рассчитаннойконтрольной суммой s0 (input[err_i] ^= s0). Конечно, ска-занное справедливо только для одиночных ошибок, аискажения двух и более байт на блок данный алгоритмисправить не в силах. Собственно, для этого и присут-ствует третий байт контрольной суммы – sm1, защища-ющий декодер от «политнекорректных» попыток ис-правления ошибок, когда их больше одной. Если выра-жение s1/s0 == sm1 ∗ s0 становится ложным, контрол-лер винчестера может засвидетельствовать факт на-личия множественных ошибок, констатируя невозмож-ность их исправления.

Однако, как хорошо известно, дефекты магнитной по-верхности имеют тенденцию образовывать не одиночные,а групповые ошибки. И, чтобы хоть как-то компенсиро-вать слабость корректирующего алгоритма, парни из IBMприбегли к чередованию байт. Винчестер IBM 3370 имелчередование 3:1, то есть сначала шел первый байт пер-вого блока, за ним первый байт второго блока, за ним –первый байт третьего и только потом – второй байт пер-вого блока. Такой трюк усиливал корректирующую спо-собность винчестера с одной одиночной ошибки, до трехпоследовательно искаженных байт... Однако, если раз-рушению подвергались не соседние байты, то корректи-рующая способность вновь опускалась до значений в одинискаженный байт на блок, но вероятность такого событиябыла несравненно меньше.

Естественно, что данный алгоритм может быть реа-лизован не только в самом жестком диске, но и вне его.Варьируя размер блоков и степень чередования, вы обес-печите себе лучшую или худшую защищенность прибольшей или меньшей избыточности информации. Дей-ствительно, пусть у нас есть N секторов на диске. Тогда,разбив их на блоки по 174 сектора в каждом и выделив3 сектора для хранения контрольной суммы, мы сможемвосстановить по меньшей мере N/174 секторов диска.Исходя из средней емкости диска в 100 Гб (что соответ-ствует 209 715 200 секторам), мы сможем восстановитьдо 1 205 259 секторов даже при их полном физическомразрушении, затратив всего лишь 2% дискового про-странства для хранения контрольных сумм. Согласитесь,что редкая «сыпка» винчестера проходит столь стреми-тельно, чтобы корректирующих способностей кода Рида-Соломона оказалось недостаточно для ее воскрешения(конечно, если эту сыпку вовремя заметить и если ко-эффициент чередования выбран правильно: так, что сек-тора, принадлежащие одному дисковому блину, обслу-живались бы разными корректирующими блоками, впротивном случае при повреждении поверхности одно-го из блинов возникнет групповая ошибка, уже неиспра-вимая данной программой).

Ëèñòèíã 6. Êëþ÷åâîé ôðàãìåíò êîäåðà Ðèäà-Ñîëîìîíà, âûðâàí-íûé èç ïðîøèâêè IBM 3370.

for (s0 = s1 = sm1 = i = 0; i < BLOCK_SIZE; ++i){

s0 = s0 ^ input[i];s1 = GF_mult_by_alpha[ s1 ^ input[i] ];sm1 = GF_mult_by_alpha_inverse[sm1 ̂ input[i] ];

};

Ëèñòèíã 7. Êëþ÷åâîé ôðàãìåíò äåêîäåðà Ðèäà-Ñîëîìîíà, âûð-âàííûé èç IBM 3370.

// âû÷èñëÿåì ñèíäðîì îøèáêèerr_i = GF_log_base_alpha[ GF_divide[s1][s0] ];// èñïðàâëÿåì ñáîéíûé áàéòinput[err_i] ^= s0;

Page 92: 011 Системный Администратор 10 2003

90

образование

А как быть, если «навернется» весь жесткий диск це-ликом? Наиболее разумный выход – создать массив изнескольких дисков, хранящих полезную информацию впе-ремешку с корректирующими кодами. Главный минус та-кого подхода – его неэффективность на массивах, состо-ящих из небольшого количества жестких дисков. Разум-ный минимум: четыре информационных диска и один кон-трольный, тогда потеря любого из информационных дис-ков компенсируется оставшимся в живых контрольным.Ну а потерянный контрольный диск элементарным обра-зом заменяется на новый, с последующим пересчетомвсех контрольных кодов. Правда, одновременный выходдвух дисков из строя – это кранты. Массив из пятнадцатидисков, двенадцать из которых – информационные, а ос-тавшиеся три – контрольные, намного более отказоустой-чив и допускает одновременный крах двух любых дисков,а при благоприятном стечении обстоятельств – и трех.

Собственно, во всем этом ничего нового нет, и соот-ветствующие RAID-контроллеры можно купить букваль-но в любом магазине. Однако… мне трудно представитьсебе, сколько будет стоит RAID-контроллер уровня 15 иудастся ли его вообще заставить работать (по личномуопыту могу сказать, что RAID-контроллеры даже началь-ных уровней – вещь крайне глючная, капризная и требо-вательная как к железу, так и к операционному окруже-нию). Наконец, практически все RAID-контроллеры тре-буют наличия абсолютно идентичных, ну или близких посвоим характеристикам и/или интерфейсам дисков. А колитаковых нет?

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

Как это можно реально использовать на практике? Пер-вое, что приходит на ум, использовать часть емкости жес-тких дисков под хранение избыточной информации, помо-гающей восстановить их в случае аварии. Если несколькокомпьютеров объединить в сеть (что уже давным-давносделано и без нас), то при относительно небольших наклад-ных расходах мы сможем восстановить любой из жесткихдисков членов сети даже при полном его разрушении лишьза счет одной избыточной информации, распределенноймежду остальными компьютерами. Более надежного хра-нилища для ваших данных нельзя и придумать! Подобнаясхема была реализована автором этой статьи в локальныхсетях нескольких фирм и доказала свою высокую живу-честь, гибкость и функциональность. Необходимость в по-стоянном резервировании содержимого жестких дисковавтоматически отпала, что в условиях одноранговой сетис отсутствующим выделенным сервером более чем акту-ально! А ведь такие локальные сети – не редкость (нет, яне утверждаю, что такие сети хороши, просто я констати-рую факт, что они существуют в природе и в обозримомбудущем вымирать не собираются).

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

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

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

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

1 На самом деле, полями Галуа называют любые ко-нечные поля, но в данном контексте мы будем говоритьлишь о тех полях, количество членов которых равно 2n.

2 Другими словами говоря, щелкая выключателем, язнаю, что сейчас загорится свет. Но я не уверен в этом(монтер перерезал провода, лампочка перегорела и т. д.)Вот так и с математикой. Та жвачка, которой пичкают насв школе и позже в институте, – это не математика. Этонабор шаманских обрядов, который нас заставляют со-вершать, но который не позволяет проникнуть в самуюсуть – в дао математики. Может, оно и к лучшему, не знаю,но во всяком случае считаю долгом сказать, что «мате-матика» преподаваемая в средних и высших учебных за-ведениях, имеет к математике не больше отношения, чемпрограммирование к терзанию мыши в Word и установкесистемы Windows.

Page 93: 011 Системный Администратор 10 2003

91№10(11), октябрь 2003

Рады видетьВас нашимичитателями!

Единыйподписнойиндекс:

81655по каталогуагентства«Роспечать»

Началась подписка на I полугодие 2004 г.Более подробная информация на сайте www.samag.ru

в разделе «Подписка»

подписка

Page 94: 011 Системный Администратор 10 2003

92

IMHO

Page 95: 011 Системный Администратор 10 2003

93№10(11), октябрь 2003

IMHO

ВООРУЖЕННОЕДО ЗУБОВ

ПЕРЕМИРИЕ,ИЛИ

Я – ТО, ЧЕГОНЕ МОЖЕТ БЫТЬ!

ВООРУЖЕННОЕДО ЗУБОВ

ПЕРЕМИРИЕ,ИЛИ

Я – ТО, ЧЕГОНЕ МОЖЕТ БЫТЬ!

ТАТЬЯНА ИЛЬЧЕНКО

Разговоры о том, что информационные технологии и свя-занная с ними профессиональная деятельность – ни мно-го, ни мало, а исключительно мужская епархия, понемногустихают. И вот уже немногие представительницы прекрас-ного пола занимают свое место в среде программистов,веб-дизайнеров, администраторов баз данных и пр., ра-нее традиционно считавшихся этаким «мужским клубом».И если раньше многие работодатели уже по телефону ка-тегорично сообщали: «Девушку программистом на работуне возьму!» – не глянув в резюме, то теперь шансы по-пасть на собеседование и получить работу в большей сте-пени стали зависеть от уровня компетентности и квалифи-кации, чем от половой принадлежности. Но при этом про-слеживается влияние этой самой принадлежности на раз-мер оклада, и влияние, надо сказать, удручающее – в не-которых фирмах планка оклада запросто может опустить-ся на весьма значительную сумму, если должность в IT-подразделении предлагается женщине. Например, один изуслышанных мной мотивов занижения оклада: «Зачем ейтакой оклад, вот выйдет замуж, и пусть у нее муж зараба-тывает!» – безапелляционно заявил один из руководите-лей компании, крупнейшей в своем секторе рынка на югеРоссии. Если посмотреть на количественное соотношение,то женщин в IT очень и очень мало (по некоторым оцен-кам, не больше 8% от общего количества специалистов,занятых в IT). На мой взгляд, это может быть связано стем, что женщине, выбирающей профессию в сфере IT,предстоит преодолевать устоявшиеся стереотипы и огра-ничения, накладываемые обществом. Вот и получается, чтомало кто из девушек, даже обладающих и склонностью, испособностями, может решиться стать системным, сете-вым администратором (администратором БД) или програм-мистом. Считается же, что компьютерным гением можетбыть только мужчина, и это при том, что первым програм-мистом принято считать леди Аду Августу Лавлейс (LadyAda Augusta Lovelace) – дочь известного английского по-эта и ассистентку знаменитого математика и изобретате-ля Аналитической Машины Чарльза Бэббиджа (CharlesBabbage). Вот и получается, что стереотипы, складывав-шиеся десятилетиями, не получается просто отбросить –приходится с ними воевать и их преодолевать, если ужрешила по зову сердца стать программистом или систем-ным администратором.

Тенденция же, несмотря на все это, как говорится, нали-цо, и программисты-женщины уже давно не редкость. Ина-че дело обстоит в сфере системного администрирования:вот уж где мужчины считают себя непревзойденными и кудаочень неохотно допускают противоположный пол. Это по-настоящему закрытый клуб профессионалов. Мужской клуб.Точнее, был таковым до совсем недавнего времени – те-перь и тут можно встретить, хоть и редко, девушку с LAN-тестером в руках, отверткой в кармане или за консолью «са-мого-главного-сервера-компании»1. При этом я хочу отме-тить, что в моем понимании системный администратор – этонастоящий профессионал, который одновременно долженбыть программистом (в той мере, которая позволяет писатьутилиты, сценарии, автоматизирующие рутинные операциии т. п.), аналитиком, постановщиком задач и не только. Внашей стране системный администратор в зависимости от

Page 96: 011 Системный Администратор 10 2003

94

IMHO

Вообще девушке, претендующей на должность систем-ного администратора в сколько-нибудь серьезной органи-зации (замечу, что я имею в виду наличие достаточной ква-лификации) туго приходится уже на первом собеседованиив кадровом агентстве – в головах рекрутеров, так же, как ибольшинства работодателей, прочно укрепился вышеупо-мянутый стереотип «компьютерщика» – в большинстве слу-чаев это «слегка выбритый» длинноволосый тип с лихора-дочным блеском в глазах, в вытянувшемся свитере и вы-тертых джинсах, изъясняющийся вроде и на русском, но со-вершенно непонятном языке. Он же обладает заведомымпреимуществом, закрывающим передо мной перспективытрудоустройства на конкретную должность – он мужчина!Всё, пока есть претенденты равной или превосходящей ква-лификации мужского пола, женщинам доступ сюда закрыт.Хорошо, если пригласят на собеседование, и то больше излюбопытства, чем планируя предложить вам вакантную дол-жность. Даже если кандидат, претендующий на одну со мнойпозицию, обладает квалификацией, уступающей моим зна-ниям и умениям, у него все равно преимущество – ему про-стят куда более значительные огрехи и пробелы в знаниях,предложив восполнить их до второго тура собеседований,тогда как мне просто пообещают позвонить и забудут обэтом. Или что, на мой взгляд, еще хуже – примут на работув качестве экзотической игрушки на испытательный срок.Еще одно немаловажное обстоятельство, подчас мешаю-щее в поисках работы, – это стереотип «Вот сейчас я еевозьму, а она раз – замуж и/или в декрет». И с этим стерео-типом бороться сложнее всего. Я теперь пишу в резюме «за-мужем, детей нет», а в сопроводительном письме добавляю,что в ближайшее время (года три-четыре) мы и не планиру-ем рождение ребенка. Иногда и это обстоятельство оказы-вается чуть ли не решающим. В общем, поиски работы дляженщины в сфере информационных технологий напомина-ют хитроумную игру-квест: нужно найти и обрести артефакт,который позволит выполнить миссию. Это теперь по соб-ственному опыту знаю, что такой артефакт – не что иное,как квалификация. И она должна быть не просто высокой, апредполагает чуть ли не исчерпывающие знания предмет-ной области системного администрирования в пределахспециализации – только тогда можно рассчитывать на рав-ные условия при проведении конкурсного отбора на вакант-ные должности и на соответствующее отношение сотрудни-ков компании, где доведется работать.

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

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

Последние семь лет моя работа непосредственно связа-на с информационными технологиями. От эникейства, на-писания программ на заказ, консультаций пользователей я«доросла» до должности системного администратора в со-ставе регионального центра поддержки информационныхсистем и автоматизации крупной нефтяной компании. Сей-час у меня «под началом» больше десятка серверов-шлю-зов, файл-серверов, серверов баз данных, почтовых и веб-серверов, функционирующих под управлением как ОС се-мейства MS Windows, так и различных клонов UNIX – BSD-like и Linux – в управлении одного из дочерних обществ ком-пании и в восьми его филиалах, разбросанных по области,территория по площади которой равна двум Франциям. Кро-ме меня, в нашей группе работают: программист, связист,начальник группы и девять специалистов по ИТ-поддержкев филиалах. Обстановка у нас в коллективе достаточно ком-фортная и даже дружеская, несмотря на во многом пересе-кающиеся сферы ответственности. Первое время, правда,приходилось преодолевать отношение к себе как к диковин-ке, но в первую же неделю мне довелось разрешить некото-рые проблемы в локальной сети и с доступом в Интернет порадиоканалу, сложившиеся якобы исторически, после чегоколлеги безоговорочно признали меня «своим братом-си-садмином». Правда, дозваться теперь иногда кого-то из кол-лег, чтобы помогли что-то тяжелое перенести, бывает про-блематично – легче самой все сделать.

Поскольку по большей части работа системного адми-нистратора связана с постоянно изменяющейся предметнойобластью, приходится следить за новинками, успевать от-слеживать и латать вновь появляющиеся уязвимости и ошиб-ки, модернизировать парк техники, удерживать в зоне от-ветственности сервера филиалов и осуществлять методи-ческое руководство в области сетевого администрированиядля специалистов в филиалах. И мне эта работа нравится,ибо её характер заставляет постоянно держать себя в фор-ме, успевать перерабатывать большие объемы информациив ограниченные отрезки времени. При этом учишься одно-временно контролировать сразу нескольку дел: срочные(патчи, сервиспаки, срочная замена рабочих станций и пр.),текущие (регламентные работы – логи, состояние сети и пр.),поддержка пользователей (самое сложное, ибо «зная, что2∗2=4, трудно понять, как кто-то может этого не понимать»).И при этом надо рабочий день построить так, чтобы оста-лось время на чтение новостей, поддержку собственного сай-та, написание облегчающих жизнь программ/скриптов/ути-лит, систематизацию собственных архивов, заметок (mini-HOWTO) и участие в различных конференциях-форумах. Но,как я уже сказала выше, мне это нравится, и я постараюсьубедить читателя в том, что женщина-сисадмин не морскаясвинка, которая не имеет отношения ни к морю, ни к по-взрослевшим поросятам.

Page 97: 011 Системный Администратор 10 2003

95№10(11), октябрь 2003

IMHO

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

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

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

И в заключение хочется добавить несколько пожеланийвсем сторонам этого «вооруженного до зубов перемирия» –так можно охарактеризовать сложившееся исторически по-ложение в сфере информационных технологий. Женщинам– терпения и настойчивости в достижении желаемого напрофессиональном поприще. Работодателям – внимания крезюме претенденток на объявленные вами вакансии в IT-подразделении: нас еще не легион, но уже и не так мало,чтобы пренебрегать возможностью найти среди нас именнотакого специалиста, который вам нужен. Сотрудникам-со-ратникам – коллегам по IT хорошо бы пожелать более тер-пимого отношения к коллегам-женщинам. Все мы учимся, анаши ошибки – почва для обретения опыта. И поверьте,женщины, ставшие системными администраторами по при-званию, так же, как и вы, способны дневать и ночевать всерверной, когда этого требуют обстоятельства, протягиватьи обжимать кабель, знают «как называется вон та штучка вPCI-слоте» и уверенно держат в руках не только отвертку иLAN-тестер, но и паяльник, если потребуется. И также спо-собны одновременно контролировать несколько проблем-ных мест и попутно решать масштабные задачи. А «lamers»присутствуют в обоих конкурирующих лагерях. За сим по-звольте откланяться, искренне ваша.

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

Page 98: 011 Системный Администратор 10 2003

96

СИСТЕМНЫЙ АДМИНИСТРАТОР№10(11), Октябрь, 2003 год

РЕДАКЦИЯИсполнительный директорВладимир ПоложевецОтветственный секретарьНаталья Хвостова[email protected]Технический редакторВладимир ЛукинНаучно-технические консультантыПавел ГашевПавел ЗакляковРуслан ИвановАндрей Бешков

РЕКЛАМНАЯ СЛУЖБАтел.: (095) 928-8253 (доб. 112)факс: (095) 928-8253Константин Меделянreс[email protected]

Верстка и оформление[email protected][email protected]Дизайн обложкиНиколай Петрочук

103012, г. Москва,Ветошный переулок, дом 13/15тел.: (095) 928-8253 (доб. 112)факс: (095) 928-8253Е-mail: [email protected]: www.samag.ru

РУКОВОДИТЕЛЬ ПРОЕКТАПетр ПоложевецУЧРЕДИТЕЛИВладимир ПоложевецАлександр МихалевИЗДАТЕЛЬЗАО «Издательский дом«Учительская газета»

Отпечатано типографиейООО «Мастер Печати»Тираж 5500 экз.Журнал зарегистрированв Министерстве РФ по делам печати,телерадиовещания и средств мас-совых коммуникаций (свидетельствоПИ № 77-12542 от 24 апреля 2002г.)

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

ЧИТАЙТЕВ СЛЕДУЮЩЕМНОМЕРЕ:

Файловые системы LinuxЧто мне нравится в OС GNU/Linux –так это гибкость во всем: можно со-брать систему под определенные за-дачи, выбрав необходимое из множе-ства компонентов. Кроме патчей кядру, различных версий библиотек икомпиляторов есть возможность вы-бора и файловой системы, на кото-рой будет работать Ось. В даннойстатье я предлагаю пробежаться потому многообразию и определитьсяс выбором, узнать о достоинтсвах инедостатках предлагаемых файло-вых систем.

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

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

Интеграция SQUID + LDAPО настройках самого сервера LDAPнаписано достаточно много, поэтомуостанавливаться на этом не буду. Ин-теграция службы каталогов с разны-ми службами освещена тоже доста-точно подробно, например: http://www.linuxrsp.ru/artic/LDAP-HOWTO.html

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

Задача достаточно проста, заста-вить SQUID не только авторизоватьпользователей, но и забыть, наконец,об acl-листах, в которых описаныгруппы.

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

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

Fusebox в помощьвеб-программистуОсталось немного людей, использую-щих только средства HTML при созда-нии веб-сайтов. Большинство веб-про-граммистов используют PHP, MS ASPи т. п., но мало кто знает, как можнооблегчить свой труд. Одним из реше-ний этой проблемы является Fusebox.

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