№4(53) апрель 2007
№4(53) апрель 2007 подписной индекс 20780 www.samag.ru
Создаем собственный хостинг, или Сам себе ISP NFS: из прошлого в будущее Администрируем учетные записи в AD Как проводить сбор системных сообщений в гетерогенной сети Cacti: вовремя находим проблемные участки сети Альтернативные беспроводные средства связи xAjax – простой способ создавать асинхронные веб-приложения Gnuplot: графики заказывали? VPN на основе протокола PPTP: как повысить безопасность?
Так видит журнал читатель, который забыл оформить подписку:
БЫ
СТ РО ТИ РАС РА КУ Ж ПИ
КА НИ НО КУ ВО ЛЫ ГО ЗА ДНИ ТЯ Е НУ ЛИ
ЛИ
СЬ
№5(30) май 2005 подписной индекс 81655 www.samag.ru
Почему MS SQL медленно работает? Ищем причины Строим защищенную беспроводную сеть: WPA-Enterprise, 802.1x EAP-TLS Настраиваем UPS под Linux Как восстановить удаленные файлы под BSD Что важно знать об IP-телефонии танавливаем Symantec Antivirus 9.0 в корпоративной сети Эффективно управляем полями пользователей в AD Контролируем безопасность сети с помощью OSSIM
ЗА Н КО ЕО НЧ ЖИ ИЛ ДА ИС НН ЬД О ЕН ЬГ И
ПО АВ СЛ РА Е О Л НА ТПУ РА СКА БО ТЕ
УЕ
ХА Л
ВО
ТП УС К
Интервью с Ларри Уоллом – создателем языка Perl
Так видит журнал читатель, оформивший подписку: №5(30) май 2005 подписной индекс 81655 www.samag.ru
Почему MS SQL медленно работает? Ищем причины Строим защищенную беспроводную сеть: WPA-Enterprise, 802.1x EAP-TLS Настраиваем UPS под Linux Как восстановить удаленные файлы под BSD Что важно знать об IP-телефонии танавливаем Symantec Antivirus 9.0 в корпоративной сети Эффективно управляем полями пользователей в AD Контролируем безопасность сети с помощью OSSIM Интервью с Ларри Уоллом – создателем языка Perl
ПОДПИШИТЕСЬ И ЧИТАЙТЕ! Роспечать – 20780, 81655 Пресса России – 87836 Интер-почта – тел. (495) 500-00-60
в номере 3 ТЕНДЕНЦИИ АДМИНИСТРИРОВАНИЕ 4 NFS: из прошлого в будущее
Сетевая файловая система разработана уже давно, но её развитие продолжается, и для ряда задач способ предоставления файлов через сеть остается одним из самых эффективных. Сергей Супрунов amsand@rambler.ru
12 VPN на основе протокола PPTP: как повысить безопасность?
Большинство специалистов считают протокол PPTP ненадежным с точки зрения безопасности и не рекомендуют его использование для создания VPN. Однако существует способ построения VPN на основе этого протокола с уровнем защищенности, достаточным для использования в корпоративной среде, и минимальными финансовыми затратами. Дмитрий Рощин nixwizard@gmail.com
22 Cacti – простой и удобный инструмент для мониторинга и анализа сети
По мере увеличения размеров сети все более актуальным становится вопрос обеспечения ее бесперебойной работы и своевременное нахождение проблемных участков. Добиться этого можно, только проводя постоянный мониторинг. Сергей Яремчук grinder@ua.fm
28 Как проводить сбор системных сообщений в гетерогенной сети
Обеспечиваем сбор и передачу информации между Windows и UNIX-системами. Андрей Бирюков mex_inet@rambler.ru
34 Sender Policy Framework как средство борьбы со спамом
Интернет разрабатывался как закрытая военная сеть, со временем сеть стала открытой, всплыли просчеты, результат которых – DOS-атаки, подделка имен DNS, черви, спам и многое другое. Технология Sender Policy Framework – лишь одна из попыток исправить ситуацию. Сергей Яремчук grinder@ua.fm
40 Администрирование учетных записей в домене Active Directory
Одна из важнейших задач администратора – управление локальными и доменными учетными записями: аудит, квотирование и разграничение прав пользователей в зависимости от их потребностей и политики компании. Что может предложить Active Directory для решения этих задач? Александр Емельянов numb13@mail.ru
ЧЕЛОВЕК НОМЕРА 46 Обыкновенный человек
Проще открыть Америку, чем разгадать человека. Однако некоторые «белые пятна» биографии Феликса Мучника, создателя Softkey, можно считать закрашенными. Оксана Родионова rodion@dol.ru
WEB 50 Создаем собственный хостинг, или Сам себе ISP
Только ленивый не писал на тему виртуального вебхостинга. Но большая часть информации слабо структурирована и не имеет отношения к высокопроизводительному, беопасному и массовому виртуальному веб-хостингу. Как создать полностью рабочую систему с нуля? Андрей Шетухин reki@reki.ru
56 xAjax – простой путь создания асинхронных веб-приложений
Если вы в полную силу используете DHTML, но вам кажется, что даже это не обеспечивает должного уровня интерактивности, – самое время начать использовать xAjax. Виктор Ермолаев quick_dead@mail.ru
60 Защита веб-служб. РНР-реализация
Защищаем веб-службы в соответствии со спецификацией WS-Security, с помощью Open Source-библиотеки xmlsec. Александр Календарев akalend@mail.ru
СЕТИ 68 Альтернативные беспроводные средства связи
Несмотря на свою распространенность, Wi-Fi обладает многими недостатками, есть ли альтернативные решения для организации беспроводной сети? Иван Максимов ivan_maksimov@inbox.ru
ВСПОМОГАТЕЛЬНЫЕ ПРОГРАММЫ 72 Gnuplot. Графики заказывали?
Профессиональный инструмент для визуализации данных. Евгений Балдин E.M.Baldin@inp.nsk.su
IMHO 80 Программисты, программы и искусственный интеллект
Вопрос возможности существования искусственного интеллекта всегда будет будоражить умы человечества. Алексей Мичурин alexey@michurin.com.ru
РЕТРОСПЕКТИВА 86 История компании MicroUnity: куда приводят мечты?
В cередине 1990-х годов MicroUnity вознамерилась произвести революцию в производстве микропроцессоров. Что из этого вышло? Дмитрий Мороз akuji@list.ru
92 КНИЖНАЯ ПОЛКА 66, 67, 78, 79
BUGTRAQ
Открыта подписка на второе полугодие 2007 год. Спешите оформить! №4, апрель 2007
тенденции Японские школы перейдут на Linux и 5.2.0, программная УАТС Asterisk PBX 1.2.13 и еще более СМИ Японии распространили информацию о том, что мес- 18 тысяч пакетов с программным обеспечением. тное Министерство экономики, торговли и промышленСоставил Дмитрий Шурупов ности собирается представить общественности специальпо материалам www.nixp.ru ную редакцию ОС GNU/Linux, ориентированную на школы страны. Причины, побудившие министерство рассмотреть возможность такой массовой миграции, банальны: по дан- Новый UserGate 4.2 – с возможностью ным, за весну прошлого года в школах Японии функциони- двойной антивирусной проверки ровали около 400 тысяч компьютеров под управлением ус- Компания Entensys анонсирует выход новой версии UserGate таревших ОС от Microsoft (Windows 98 и Windows Me), и об- 4.2. Теперь в прокси-сервере реализована одновременная новление всего компьютерного парка или закупка нового поддержка антивирусных модулей от «Лаборатории Каспроприетарного ПО предвидится слишком дорогим реше- перского» и Panda Software. Наличие двух антивирусных нием проблемы. В начале марта в Токио прошла конферен- модулей позволит обеспечить наиболее полную проверку ция, посвященная обсуждению вариантов отказа от пропри- трафика на наличие вирусов. Администратор UserGate моетарного ПО и, в частности, миграции на Linux и другое ПО жет сам выбирать: использовать один антивирусный модуль с открытым кодом, бесплатные версии которого свободно или оба одновременно. При этом в последнем случае можраспространяются в интернете. Всего в мероприятии при- но указать очередность проверки каждого типа трафика. няли участие около двух тысяч представителей государс- Например, HTTP-трафик сначала будет проверяться антивирусом от «Лаборатории Касперского», а затем модулем твенной власти и школьных учителей Японии. от Panda Software. При передаче FTP и почтового трафика есть возможность установить свои очередности проверки. Французские власти выбрали Ubuntu Национальное собрание Франции решило отказаться Конечно, двойное сканирование большого объема передаот Windows в пользу Open Source. Уже в июне его пред- ваемой информации может сказаться на производительносставители будут работать на 1154 новых ПК с Ubuntu Linux. ти, поэтому предполагается, что такая антивирусная проверПоставкой компьютеров с Ubuntu для Национального соб- ка будет использоваться для наиболее опасного трафика. рания займутся две компании: Linagora (системный интегра- Например, для HTTP требуется наиболее быстрая провертор, специализирующийся в области Open Source) и Unilog ка, поэтому можно использовать движок с более свежими (французское подразделение интернациональной компа- базами. Для почтового и FTP-трафика, где скорость некринии LogicaCMG, занимающейся консультациями в сфе- тична, можно установить двойное сканирование. ре IT и системной интеграцией). С Ubuntu Linux представители Национального собрания Франции будут использовать такое программное обеспечение, как офисный пакет OpenOffice.org, веб-браузер Firefox и почтовый клиент Thunderbird. Как заметили инициаторы Linux-миграции Ришар Казенаве (Richard Cazenave) и Бернар Карайона (Bernard Carayon) из Национального собрания, мир Open Source позволяет европейским пользователям добиваться меньшего уровня расходов и большей пользы от IT. Вышел Debian GNU/Linux 4.0 8 апреля команда разработчиков одного из самых популярных GNU/Linux-дистрибутивов Debian объявила о выходе новой версии продукта – Debian GNU/Linux 4.0 («etch»). На создание Debian GNU/Linux 4.0 у разработчиков ушел 21 месяц, а сроки релиза не раз откладывались. В дистрибутиве заявлена совместимость с распространенными стандартами FHS (Filesystem Hierarchy Standard) 2.3 и LSB (Linux Standard Base) 3.1. В этом релизе представлен долгожданный новый инсталлятор с графическим интерфейсом, переведенным на 58 языков. Среди программного обеспечения в Debian GNU/Linux 4.0: Linux-ядро 2.6.18, сервер графического окружения X.Org 7.1, рабочие среды KDE 3.5, GNOME 2.14 (с некоторыми модулями из GNOME 2.16) и Xfce 4.4, офисный пакет OpenOffice.org 2.0.4a, графический редактор GIMP 2.2.13, веб-браузер Iceweasel, клиент электронной почты Icedove, интернет-утилиты Iceape, СУБД PostgreSQL 8.1.8 и MySQL 5.0.32, набор утилит для компиляции GCC 4.1.1, вебсервер Apache 2.2.3, Samba 3.0.24, интерпретаторы языков программирования Python 2.4.4 и 2.5, Perl 5.8.8, PHP 4.4.4
№4, апрель 2007
администрирование
NFS: из прошлого в будущее
Сергей Супрунов Сетевая файловая система разработана уже давно, но её развитие продолжается, и для ряда задач способ предоставления файлов через сеть остается одним из самых эффективных.
N
FS (Network File System) была чнём наш краткий экскурс с версии 2. разработана компанией Sun Описывающий её документ датирован Microsystems в начале 80-х го- мартом 1989 года (первые реализации дов прошлого века для решения за- появились ещё раньше). Уже в нём укадачи совместного сетевого доступа зано, что одним из центральных прик файлам в системах UNIX. Благода- нципов, положенных в основу проторя открытости спецификации протоко- кола, является его способность рабола и сравнительной простоте реализа- тать на различных платформах, обесции NFS стала использоваться на мно- печиваемая использованием протокогих UNIX-системах. ла удалённого вызова процедур – RPC Первоначальные версии NFS, по- (Remote Procedure Calls). Собственно лучившие широкое распространение говоря, NFS как раз и определяется (известные как NFSv2 и NFSv3), «ку- как набор RPC-процедур. RPC в свою рировались» компанией Sun (см. RFC очередь работает поверх XDR (eXternal 1094, [1] и RFC 1813, [2]). Разработ- Data Representation), обеспечивающем ка нынешней спецификации (NFSv4, представление различных типов дансм. RFC 3530, [3]) отдана «на откуп» ных, передаваемых по сети. широкой общественности. RPC предоставляет возможность выполнять определённые процедуры Основные принципы на хосте (RPC-сервере) по запросу протокола удалённых пользователей (RPC-клиПоскольку 1-я версия протокола так ентов). То есть клиент формирует заи не была «материализована», то на- прос на вызов той или иной процеду-
ры и передаёт её RPC-серверу. Сервер обеспечивает локальное выполнение запроса и возвращает результат клиенту. Таким образом, удалённое приложение не должно заботиться о поддержке сетевого взаимодействия – для него работа с удалённым ресурсом остаётся полностью прозрачной. Для определения номеров портов, используемых RPC-клиентом и сервером в процессе работы, используется сервис трансляции портов (port mapper). Задача транслятора портов – зарегистрировать приложение, предоставляющее услуги RPC, и в дальнейшем сообщать клиентам, к каким портам следует подключаться для выполнения той или иной процедуры. Таким образом, NFS использует клиент-серверную модель взаимодействия. Принято говорить, что сервер экспортирует локальные файло-
администрирование вые системы, а клиент импортирует их. NFS и Windows лог rpcinfo с графическим интерфейсом В отличие от ряда других сетевых Не нужно думать, что NFS – это удел толь- (см. рис. 1). протоколов в NFS не реализованы ко UNIX-систем с чёрной и страшной конЕсли всё в порядке и вы видите именсредства «анонсирования» присутс- солью. Реализации этого протокола есть но то, что ожидали увидеть, то следуютвия серверов в сети, так что клиент и для Windows, и неплохо, нужно сказать, щий шаг – монтирование нужного ресурдолжен знать адрес нужного ему сер- взаимодействуют с UNIX-серверами. Мож- са. С помощью NFS Map Drive tool укаживера. Благодаря этому использование но указать такие пакеты, как DiskAccess, те букву диска, которая будет присвоена NFS не ограничивается пределами ло- nfsAxe, которые помимо инструментов ра- NFS‑каталогу, и либо укажите нужный рекальной сети (правильнее, наверное, боты с NFS и реализации NFS-серверов сурс вручную, либо, нажав на «Browse...», говорить «широковещательного доме- включают ряд дополнительных инструмен- выберите ресурс из определённых авна»), и она может работать, в том чис- тов – FTP- и Telnet-клиенты, средства ра- томатически. Теперь с этим новым дисле, и в сети Интернет. Хотя сразу нуж- боты с DNS и т. д. ком можно работать, как с локальным но отметить, что дизайн NFS предпоВ качестве примера коротко рассмот- (см. рис. 2). лагает работу через надёжное широко- рим работу NFS-клиента nfsAxe. Его отлиОтключение сетевого диска выполняполосное соединение, поэтому работа чает множество инструментов, делающих ется, как это принято в Windows, – с помов «глобальных» сетях будет не слиш- работу с NFS весьма комфортной. Напри- щью команды «net use N: /delete» (где N – ком эффективной. мер, с помощью NFSProbe вы можете про- буква смонтированного диска) либо через Важной особенностью NFS вер- смотреть, какие ресурсы доступны на том графический интерфейс (щелчок правой сий 2 и 3 является то, что этот прото- или ином сервере или в вашей сети. То есть кнопкой на значке «Мой компьютер → Откол не использует состояния (имеется вы получаете в своё распоряжение ана- ключить сетевой диск...»). в виду состояние самого NFS-соединения, а не транспортного протокола). ботоспособности клиенты могут про- внесены некоторые изменения, в том NFS-сервер не занимается отслежи- должить работу как ни в чём не быва- числе: ванием клиентов: каждое обращение ло, без необходимости повторно уста- n расширена работа с атрибутами файлов; клиента должно нести в себе всю ин- навливать соединения, «откатывать» формацию, необходимую для выпол- незавершённые транзакции и т. д. Ко- n добавлена процедура MKNOD для создания специальных файлов; нения запроса. Например, с каждым нечно, здесь есть свои нюансы, котоn появились асинхронная процедура запросом на чтение фрагмента фай- рых мы коснёмся чуть позже. WRITE и новая процедура COMMIT NFS предполагает, что файловая ла клиент должен сообщить свою аудля фиксации асинхронной записи. тентификационную информацию, де- система имеет стандартную древоскриптор файла (file handler), началь- видную структуру. Причём NFS за одБлагодаря асинхронной записи ную позицию указателя и количест- ну операцию выполняет поиск лишь во байт, которые должны быть прочи- одного элемента в текущем катало- клиент теперь может отправить на сертаны. Сервер, получив запрос, прове- ге. Объясняется такая «расточитель- вер сразу несколько последовательряет права клиента на чтение, откры- ность» желанием обеспечить неза- ных запросов WRITE, не дожидаясь вает указанный файл, считывает нуж- висимость от символа, используемо- подтверждения каждого из них, а заный фрагмент, закрывает файл и воз- го вкачестве разделителя каталогов, тем зафиксировать все изменения одкоторый может различаться в раз- ним запросом COMMIT. вращает результат клиенту. Правда, это вынуждает клиента На первый взгляд необходимость ных операционных системах. Впрооткрывать и закрывать файл при каж- чем, быстродействия такой подход сохранять у себя все записываемые блоки, пока не последует подтверждом запросе выглядит не слишком ра- явно не добавляет. Версия 2 предполагает, что все дение успешной фиксации, но в цециональным решением. Однако сервер, как правило, эффективно кэширу- RPC-процедуры будут выполнятьет единожды открытый файл, так что ся синхронно, т.е. клиентское прилос высокой долей вероятности последу- жение обязано дождаться подтвержющие запросы на чтение будут удов- дения выполнения операции, прежде летворяться из кэша, не требуя допол- чем продолжит свою работу. А подтверждение в свою очередь может нительных дисковых операций. Кроме того, отсутствие состоя- быть выдано лишь после действиния позволяет NFS-клиенту и серверу тельного завершения запроса. (Анонне беспокоиться о работоспособности сированная в v2 «для реализации друг друга – например, клиент вполне в последующих ревизиях» процедуможет ненадолго «пропасть» (скажем, ра WRITECACHE в версии 3 была исиз-за временных проблем с соедине- ключена, но возможность асинхроннием), а затем продолжить свою ра- ной записи была добавлена в процеботу; NFS-сервер этого даже не заме- дуру WRITE). Рисунок 1. Не знаю, намного ли это В третью версию протокола, датит. Аналогично, в случае сбоя на серудобнее консоли, но тоже вся нужная вере после восстановления его ра- тированную июнем 1995 года, были информация как на ладони
№4, апрель 2007
администрирование Первоначальные реализации работали преимущественно поверх В коллекции Портов FreeBSD есть реалипротокола UDP, однако в NFSv3 подзация NFS-сервера уровня пользоватедержка TCP также получила широкое ля – unfs3. Поддерживается третья версия распространение, что дополнительно протокола, и, учитывая, что «ядерная» рерасширило возможности работы NFS ализация по определению будет быстрее, в глобальных сетях. чем сервер, работающий на уровне польОднако не следует забывать, что зователя, то сейчас польза от UNFS3 неспецификация не предусматривает много сомнительна. шифрования или иной защиты передаваемых данных, поэтому передалом это новшество положительно сказывается на произ- ча файлов с использованием NFS по общедоступным севодительности. тям должна ограничиваться информацией, «утечка» которой не критична.
NFS уровня пользователя
Разработчики декларируют максимально полную реализацию стандарта, а также высокую переносимость между различными системами. Здесь используется exportsфайл формата, принятого в Linux, так что данную программу можно рассматривать как один из способов унифицировать использование NFS на различных системах в вашей сети, если это необходимо.
Новшества NFSv4
Четвёртая версия NFS кардинально отличается от предшественниц. Во-первых, здесь уже появилось отслеживание состояния клиента – так называемые «владения» (leases), что предоставляет гораздо больше возможностей реализации блокировок и более эффективного кэширования. Благодаря использованию так называемых компаундных операций (когда в одном запросе могут передаваться несколько RPC-вызовов) быстродействие должно значительно возрасти. Кроме того, в новой версии особое внимание уделено вопросам безопасности: n добавлена поддержка списков доступа (ACL); n вместо цифровых идентификаторов пользователя (UID и GID) теперь при AUTH_SYS-аутентификации передаются символьные имена, что в значительной степени снимает проблему несоответствия имён пользователей и идентификаторов на клиенте и сервере; n включена поддержка RPCSEC_GSS, позволяющего использовать различные защищённые протоколы аутентификации, например, Kerberos V (в NFSv3 поддержка Kerberos 4 опционально присутствовала в некоторых реализациях, но в v4 она уже обязательна). В 4-й версии все вспомогательные задачи (монтирование, блокировка и т. д.), в предыдущих версиях решаемые отдельными программами, теперь возлагаются на основной процесс, что положительно сказывается на эффективности использования firewall. Теперь требуется держать открытым один порт – 2049, да и необходимость в трансляторе портов тоже большей частью отпадает.
Работа клиента Поскольку поддержка NFS по умолчанию включена в ядро системы (см. файл GENERIC, опции NFS*; впрочем, NFS неплохо работает и в виде модуля), то её использование возможно без каких-либо дополнительных – достаточно указать в /etc/rc.conf переменную «nfs_client_enable=YES», чтобы при загрузке системы были установлены некоторые sysctl-переменные, связанные с NFS. И можно монтировать удалённую файловую систему, предоставляемую сервером: mount_nfs 10.0.0.254:/var/downloads /mnt
Здесь 10.0.0.254 – адрес NFS-сервера, /var/downloads – имя экспортируемого каталога (подробнее о сервере будет сказано чуть ниже), /mnt – точка монтирования в клиентской системе. Дополнительно могут быть указаны различные опции, такие как жёсткое указание используемой версии NFS и/или транспортного протокола (см. man mount_nfs). Особенно полезна опция -i, обеспечивающая возможность прервать в случае необходимости операцию с удалённой ФС с помощью <Ctrl+C> (по умолчанию операция будет выполняться «до победного конца», что в случае UDP и достаточно «щедрых» значениях тайм-аутов может вылиться в настоящее мучение при аварии на сервере или канале связи). В настоящее время команда mount_nfs работает только с версиями NFS 2 и 3, для NFSv4 следует использовать утилиту mount_nfs4. В 7.0-CURRENT (начиная с февральского снапшота) функциональность этих утилит объединена в mount_nfs.
Реализация во FreeBSD Во FreeBSD 6.2 поддерживаются реализации NFSv2 и v3. 4-я версия реализована лишь в клиенте и то частично (отсутствует поддержка RPCSEC_GSS, делегирование и многое другое). Поддержка NFS, как правило, «зашита» непосредственно в ядро операционной системы, благодаря чему пользовательские приложения могут работать с удалёнными файловыми системами совершенно таким же образом, как и с локальными – конкретная реализация «скрыта» за уровнем vnode и не требует от программ прикладного уровня каких-либо знаний об NFS.
Рисунок 2. Дот-файлы начинаются с подчёркивания, а не с точки. В остальном – вполне пригодный для работы каталог
администрирование Некогда для повышения быстродачу с помощью так называемых владений действия (даже ценой потери надёж- «Не совсем NFS» ности) было принято запускать не- FreeBSD, помимо версий NFSv2 и v3, под- (аналогичное решение появилось в NFSv4), сколько демонов nfsiod. Это позволя- держивает также расширенную реали- которые сервер передаёт клиентам на опло поднять скорость работы за счёт зацию NQNFS (Not Quite NFS – «не впол- ределённое время, отслеживая тем самым не NFS»). NQNFS разрабатывалась в пер- их состояние и получая возможность увеиспользования упреждающего чтения и отложенной записи. То есть клиент- вую очередь для поддержания согласо- домить клиента об изменениях открытого ими файла. ское приложение в этом случае фак- ванности кэша. В условиях отсутствия состояния соглаNQNFS обратно совместима с NFS, тически взаимодействует не с удалённым сервером, а с локальным демо- сование кэша является весьма сложной за- т.е. сервер, поддерживающий NQNFS, буном nfsiod, который берёт на себя об- дачей – как клиент сможет узнать, что ис- дет работать с обычным NFS-клиентом мен данными с сервером, выполняе- ходный файл изменился и его кэш, следо- по стандартному протоколу, не используя вательно, устарел? NQNFS решает эту за- никаких расширений. мый в фоновом режиме, что избавляет приложение от необходимости ждать В общем виде формат строки можно определить слезавершения каждой операции. Во FreeBSD 6.2 и 7.0 по умолчанию sysctl-переменная дующим образом: vfs.nfs.iodmin установлена в 0, то есть процессы nfsiod не за<ресурсы> <опции> <клиенты> пускаются. При необходимости это можно изменить: Здесь <ресурсы> – путь к экспортируемым каталогам; # sysctl -w vfs.nfs.iodmin=2 <опции> – дополнительные параметры монтирования, такие как предоставление ресурса только для чтения (-ro); <клиvfs.nfs.iodmin: 0 -> 2 енты> – имена или IP-адреса клиентских машин, которым # nfsiod позволено работать с ресурсом (поддерживаются также се# ps ax | grep nfsiod тевые группы – см. man netgroup). Несколько примеров: vfs.nfs.iodmin: 0 -> 2
Для размонтирования удалённого ресурса используется обычная команда umount.
Организация сервера Для организации NFS-сервера должны быть запущены как минимум три демона: mountd, nfsd и rpcbind. Рассмотрим, за что они отвечают. Первый отвечает за монтирование файловой системы при поступлении соответствующего запроса. Второй выполняет работу по протоколу NFS – обрабатывает конкретные запросы на чтение/запись, создание/ удаление файлов и т. д. Причём о числе этих демонов следует позаботиться заранее (по умолчанию во FreeBSD запускается четыре демона nfsd). Демон rpcbind отвечает за предоставление клиентам информации о том, к какому порту следует подключаться. Ранее для этого использовался демон portmap. Хотя обычно процессы nfsd работают на стандартном порту – 2049 (TCP и/или UDP), и, казалось бы, уточнять это не требуется, но вот процессы mountd могут запускаться на произвольных номерах портов, так что rpcbind для работы необходим. Для автоматической загрузки этих демонов можно в /etc/rc.conf указать следующие строки: rpcbind_enable=YES nfs_server_enable=YES
Демон mountd, определяя, какие ресурсы нужно предоставлять для доступа по сети, руководствуется файлом /etc/exports. Для успешного старта демона этот файл, как минимум, должен существовать. Содержимое его простое – в каждой строке указывается предоставляемый в общий доступ каталог с дополнительными опциями.
№4, апрель 2007
$ cat /etc/exports # Доступ к домашнему каталогу и всем подкаталогам # с двух указанных машин /usr/home/serg -alldirs 10.0.0.203 10.0.0.254 # Доступ на чтение со всей подсети 10.0.0.0/24 /var/downloads -ro -network 10.0.0.0 -mask 255.255.255.0 # Доступ с указанного хоста, причём пользователь # с идентификатором 0 получит права пользователя admin /usr/src -maproot=admin admin.domain.ru
Здесь есть одна особенность – для ресурсов, располагающихся на одном разделе, может быть только одна строка, описывающая доступ для конкретного «клиента». То есть если вы хотите предоставить доступ с машины admin к ресурсам /usr/ports и /usr/src (при условии, что они оба размещены на разделе /usr), то делать это нужно в одной строке: /usr/src /usr/ports
admin
Не забывайте после внесения изменений в /etc/exports перезапускать демон mountd: $ sudo /etc/rc.d/mountd onereload Reloading mountd config files.
Для использования блокировок файлов при совместном доступе требуется запуск ещё двух демонов – rpc.lockd и rpc.statd (второй демон обеспечивает предоставление информации о состоянии клиентов, необходимой для корректной работы блокировок, и, в частности, отвечает за снятие устаревших блокировок). Для их автоматического запуска в /etc/rc.conf следует указать строки: rpc_lockd_enable="YES" rpc_statd_enable="YES"
администрирование NFS за пару «кликов»? Разработчики большинства современных Linux-дистрибутивов стремится предоставить своим пользователям максимум удобных графических средств для работы. Однако протокол NFS не часто получает достаточное внимание разработчиков. Тем не менее, и обычным пользователям NFS мог бы сослужить хорошую службу. Например, перекинуть содержимое своего домашнего каталога с настольного компьютера на ноутбук... Казалось бы, это должно быть не намного сложнее, чем «расшарить» папку в Windows. В Ubuntu, в меню «Администрирование», есть пункт «Опубликованные папки», вызывающий инструмент shares-admin, – пара щелчков мышью, и каталог добавлен в /etc/exports.
Правда, из опций здесь можно поставить лишь признак «Только чтение», да и то не стоит слишком ему доверять – исходя из показанного на рис. 3 можно предположить, что каталог доступен для чтениязаписи всей сети, а 23-й хост чем-то провинился и получил ограничение. На самом же деле всё с точностью до наоборот, в чём можно убедиться, заглянув в /etc/exports: /home/amsand 172.20.0.23(rw) ↵ 172.20.0.0/255.255.255.0
А вот смонтировать NFS-каталог мышкой, как ни странно, не получится. «Подключение к серверу» предложит вам подключиться к чему угодно – FTP, SSH, WebDAV, Windows-ресурсу... Но только не к NFS-серверу. Так что всё равно придётся открывать консоль.
Для правильной работы эти демоны должны запускаться как на клиенте, так и на сервере.
Как проверить, что запущено Чтобы убедиться, что всё запущено должным образом, полезны две утилиты: showmount и rpcinfo. Первая, запущенная без параметров, покажет, для каких хостов в данный момент выполнено монтирование NFS‑ресурсов: # showmount Hosts on localhost: curs3.myserver.ru
Заметьте, что отображаются лишь ресурсы, смонтированные демоном mountd, т.е. те, к которым было обращение клиентов. Список каталогов, которые вообще могут быть экспортированы (но не факт, что востребованы кем-то в данный момент), позволяет получить ключ -e: $ showmount -e Exports list on localhost: /var/downloads 10.0.0.0 /usr/home/serg 10.0.0.203 10.0.0.254
Вторая утилита – rpcinfo – выдаёт более общую информацию о работе RPC на локальном или удалённом хосте. Например, будучи запущенной с ключом -p, она выведет список всех зарегистрированных RPC-процедур с указанием порта, на котором они работают (см. рис. 4). Здесь, кстати, можно увидеть, что демон nfsd готов обслуживать запросы на портах 2049 согласно протоколам v2 и v3. В системах Linux с ядром 2.6 можно созерцать ещё одну строчку – для v4, но во FreeBSD разработчики с этим пока не спешат. Дополнительный мониторинг работы NFS-сервера предлагает утилита nfsstat, которая позволяет увидеть, какие именно RPC-запросы наиболее часто выполняются, а также отследить некоторые ошибки (например, ошибки аутентификации).
Практический пример
Посмотрим на практике, какие шаги нужно выполнить, чтобы предоставить в общий доступ каталог веб-сервера /var/www. С ключом -a будет выведено, какие именно каталоги ка- Предположим, что полный доступ (на чтение-запись) должен кими хостами смонтированы: предоставляться хостам admin, webmaster и designer, причём с правами пользователя webmaster независимо от име$ showmount -a ни подключающегося пользователя, а также доступ на чтение хосту backup. Добавляем в /etc/rc.conf строки: All mount points on localhost: curs3.myserver.ru:/usr/home/serg
rpcbind_enable="YES" nfs_server_enable="YES" mountd_flags="-r -p 700" rpc_lockd_enable="YES" rpc_statd_enable="YES"
Третья строка используется, чтобы жёстко задать порт, на котором будет работать mountd (по умолчанию используется только флаг -r). Далее редактируем или создаём файл /etc/exports. Для нашей задачи он будет выглядеть так: /var/www -alldirs,mapall=webmaster admin webmaster designer /var/www -ro backup
Опция alldirs в первой строке используется, чтобы пользователи могли при необходимости монтировать не только корень /var/www, а и произвольный подкаталог. Для пущей важности запрещаем доступ к rpcbind в файле /etc/hosts. allow (rpcbind собирается с поддержкой TCP‑WRAPPER): Рисунок 3. Инструмент shares-admin из Ubuntu собственной персоной
rpcbind : admin webmaster designer : allow rpcbind : backup : allow rpcbind : ALL : deny
администрирование Ну и открываем на межсетевом экране (если по умолчанию всё закрыто) доступ к 111-м, 700-м (именно для этого использовалась жёсткая привязка порта) и 2049-м портам с адресов, которым нужен доступ к этим службам. Теперь со спокойной совестью перегружаемся или вручную выполняем следующий сценарий инициализации: # /etc/rc.d/nfsd start
Запустив rpcinfo и showmount -e: # showmount -e Exports list on localhost: /var/www admin webmaster designer backup
Автомонтирование каталогов UNIX-системы, как правило, имеют в своём составе средства автоматического монтирования каталогов. Хотя к теме данной статьи это непосредственного отношения не имеет, но всё же автомонтирование чаще всего применяется именно для работы с NFS‑каталогами, поэтому коротко осветим и эту тему. Во FreeBSD в состав системы включён демон amd. Настройки по умолчанию позволяют сразу же после активации (что достигается добавлением строки «amd_enable=YES» в /etc/rc.conf и либо перезагрузкой, либо запуском демона командой «/etc/rc.d/amd start») монтировать NFS-ресурсы простым обращением к ка-
убеждаемся, что всё готово к работе. Можно выполнять монтирование с клиентских машин: # mount -t nfs webserver:/var/www /mnt/www
Реализация в Linux В Linux дела с NFS обстоят заметно лучше – NFSv4 реализована практически полностью как в сервере, так и в клиенте, и можно в значительном объёме пользоваться преимуществами нового протокола. По сравнению с FreeBSD основное отличие, помимо немного других имён основных программ, – в формате файла /etc/export: <ресурс>
<клиент>(<опции>)
<клиент>(<опции>) . . .
То есть в одной строке ресурса вы можете задать различные опции для различных клиентов (во FreeBSD это приходится указывать отдельными строками). $ cat /etc/exports /home/serg 10.0.0.203(rw, sync) 10.0.0.254(ro, no_root_squash)
Здесь к указанному каталогу предоставляется доступ на чтение/запись (синхронную) с хоста 10.0.0.203, и только на чтение, но без подавления доступа с правами суперпользователя, с хоста 10.0.0.254. Для работы с таблицей экспорта (и для её перезагрузки в частности) используется утилита exportfs: $ sudo exportfs -ua $ sudo exportfs -a
Первой командой таблица полностью очищается, второй – строится заново согласно /etc/exports.
Вопросы безопасности Если говорить о NFSv2 и v3, то здесь вопросы безопасности приобретают особенно серьёзное значение, поскольку сам протокол не слишком об этом заботится. Целиком по-
№4, апрель 2007
талогу, соответствующему имени хоста: достаточно перейти в /net/<имя_хоста> (хотя по ls /net вы никаких подкаталогов в нём не найдёте), и вы увидите там содержимое удалённого каталога: $ cd /net/localhost $ ls var/www/*.s
var/www/bot.s
var/www/top.s
Спустя некоторое время смонтированный каталог, если не будет использоваться, так же автоматически будет размонтирован, высвобождая занятые ресурсы. Если необходима тонкая настройка способа монтирования, это можно выполнить в конфигурационном файле (по умолчанию /etc/amd.map). Подробности ищите на страницах справки.
лагаясь на семантику файловых систем в UNIX, NFS слепо доверяет идентификаторам пользователя и группы, поступающим с каждым запросом, и принимает решение о доступе, основываясь исключительно на них. Во-первых, это предполагает идентичность баз пользователей на сервере и клиенте, т.е. один и тот же пользователь и там, и там должен бы иметь один и тот же UID. Во‑вторых, здесь возникает проблема «локального суперпользователя» – если пользователь на своей рабочей станции располагает правами root (либо может их получить, например, загрузившись с LiveCD), то и на NFS-сервер он будет «стучаться» с идентификатором 0, соответствующим правам суперпользователя, но уже серверного, и может получить доступ к той информации, к которой по идее доступа у пользователя быть не должно. Для решения этих проблем используют отображение имён (mapping). Во FreeBSD существуют две опции: ‑maproot=<user>, позволяющая указать пользователя, чьи права будут задействованы при обращении к ресурсу пользователя с идентификатором 0 (по умолчанию используется nobody), и mapall=<user>, с помощью которой можно предоставлять ресурс всем удалённым пользователям с правами конкретного локального пользователя. В Linux аналогичные задачи решаются с помощью опций root_squash и all_squash. Имя пользователя, на которого отображаются подключения соответственно суперпользовате ля и всех польз о в ате л е й, м о жет быть задано с помощью опций anonuid и anongid (по умолчанию – Рисунок 4. Пример вывода утилиты nobody). rpcinfo
администрирование NFSv4 и FreeBSD FreeBSD довольно хорошо поддерживает 2-ю и 3-ю версии NFS, однако с 4-й пока как-то не ладится. Клиент уже может (хотя и с некоторыми ограничениями) взаимодействовать с серверами, поддерживающими NFSv4. А вот реализация сервера пока лишь обещается – теперь в одном из релизов 7-й ветки. На момент подготовки статьи в мар-
Также настоятельно рекомендуется ограничивать из внешних сетей доступ к открытым RPC-портам с помощью межсетевого экрана (эта задача усложняется тем, что демон mountd может выбирать рабочий порт произвольным образом). Кроме того, рекомендуется задать ограничительные правила в /etc/hosts.allow. Несмотря на это, защищённость протоколов NFS 2-й и 3‑й версий остаётся довольно низкой.
Некоторые тесты (ни на что не претендующие) Итак, что из себя представляет NFS, мы увидели. Теперь хорошо было бы посмотреть, какова же она в работе. Например, попробуем выполнить копирование сравнительно большого файла размером 188 Мб (первая команда – непосредственное копирование, вторая – копирование через NFS, смонтированную локально): $ time cp /var/downloads/7.0-CURRENT-200703-i386-docs.iso ↵ /tmp/ real user sys
0m40.667s 0m0.126s 0m18.844s
$ time cp /mnt/7.0-CURRENT-200703-i386-docs.iso /tmp/ real user sys
1m7.193s 0m0.004s 0m15.979s
$ ftp localhost . . . опущено . . . ftp> get 7.0-CURRENT-200703-i386-docs.iso . . . опущено . . . 226 Transfer complete 197828608 bytes received in 01:07 (2.81 MB/s)
От FTP, как видите, NFS не отстала ни на секунду и даже по сравнению с локальным копированием была не так уж плоха, во всяком случае различие в затраченном времени было не в разы – примерно 65%. Примерно такое же соотношение было и при копировании множества небольших файлов. При работе по сети (сервер – nfsAxe на Windows XP, клиент – FreeBSD) на копирование с клиента на сервер каталога со множеством файлов различного размера общим объёмом 83 Мб потребовалось 25 минут при использовании 3‑й версии и 30 минут для NFSv2. Чтение с сервера 952-х файлов общим размером 31,3 Мб (сервер на FreeBSD, клиент – nfsAxe на Windows) заняло примерно 1,5 минуты.
10
На ту же работу по протоколу FTP (клиент в FAR) потребовалось 7,5 минуты – в 5 раз больше. Проверка взаимодействия FreeBSD (сервер, Celeron 433 МГц) и Linux (клиент, Pentium IV 2.4 ГГц) показала вполне ожидаемые результаты: 3-я версия была процентов на 20‑30 быстрее, чем 2-я; на операциях чтения UDP показал почти в 5 раз лучшие результаты, чем TCP (тестирование проводилось в надёжной ненагруженной локальной сети). На операциях записи работа по TCP оказалась ненамного быстрее, чем по UDP. Так, при работе по NFSv3 чтение с сервера каталога /usr/ports/ftp (общим объёмом 8,7 Мб) заняло 1 минуту 7 секунд по TCP и всего 10 секунд по UDP. Запись этого же каталога обратно на сервер заняла 20 и 25 секунд соответственно. На чтение по протоколу FTP (использовался wget с опцией -r) потребовалось 2 минуты. Запуск сервера на Linux и клиента на FreeBSD на протоколах NFSv2 и v3 показал аналогичное соотношение производительности. А вот использование NFSv4 несколько удивило – при записи на сервер по UDP был показан самый лучший результат (29 секунд), а вот по TCP работа потребовала почти 7 минут против полутора для v2 и v3. Таким образом, на операциях чтения UDP показывает несколько лучшие результаты, TCP же работает быстрее на запись. NFSv4 на FreeBSD, к сожалению, пока ведёт себя иногда несколько странно.
товском снапшоте 7.0-CURRENT-200703 использовалась прежняя реализация, и надо полагать, что и в 7.0-RELEASE поддержки сервера NFSv4 ещё не будет. Можно отыскать некоторые сторонние патчи, реализующие сервер 4-й версии (например, на ftp://ftp.cis.uoguelph.ca/pub/nfsv4, есть патчи для FreeBSD 4.11 и 6.1), однако пока что их использование на промышленных серверах не рекомендуется.
Вместо заключения Как видите, NFS является простым способом объединить файловые системы нескольких машин с UNIX-подобными ОС (да и не только UNIX). Несмотря на некоторые претензии к ней в плане защищённости и быстродействия, она весьма эффективна для предоставления пользователям доступа к их домашним каталогам с любого компьютера в сети, для распространения «массивных» данных (например, исходных кодов системы или дерева коллекции Портов), да просто для быстрой переброски каких-нибудь файлов с одной машины на другую. Во всяком случае это будет быстрее, чем заниматься настройками Samba или «поднимать» целый FTP-сервер для разовой операции. Ну а с повсеместным распространением NFSv4 можно надеяться, что этот протокол ждёт достаточно светлое будущее. 1. NFS: Network File System Protocol Specification – http:// www.ietf.org/rfc/rfc1094.txt. 2. NFS Version 3 Protocol Specification – http://www.ietf.org/rfc/ rfc1813.txt. 3. Network File System (NFS) version 4 Protocol – http://www.ietf.org/ rfc/rfc3530.txt. 4. Небольшая страничка, посвящённая 4‑й версии NFS – http:// www.nfsv4.org. 5. NFSv4 delivers seamless network access – www-128.ibm.com/ developerworks/linux/llibrary/l-nfsv4.html.
администрирование
VPN на основе протокола PPTP: как повысить безопасность?
Дмитрий Рощин В настоящее время большинство специалистов считают протокол PPTP ненадежным с точки зрения безопасности и не рекомендуют его использование для создания виртуальных частных сетей (VPN). Однако существует способ построения VPN на основе этого протокола с уровнем защищенности, достаточным для использования в корпоративной среде, и минимальными финансовыми затратами. 12
администрирование Нелегкая судьба протокола PPTP Протокол PPTP (Point-to-Point Tunneling Protocol) разработан компанией Microsoft совместно с компаниями Ascend Communications, 3Com/Primary Access, ECI-Telematics и US Robotics. Этот протокол получил статус интернет-стандарта, но так и не был утвержден. Для организации туннеля в PPTP используется протокол GRE (Generic Routing Encapsulation), а для шифрования трафика используется MPPE (Microsoft Point-to-Point Encryption), протокол для шифрования пакетов протокола PPP потоковым шифром RC4. Фактически задача PPTP состоит в организации шифрованного туннеля, внутри которого будет работать протокол PPP. GRE не единственный протокол транспортного (согласно модели OSI) уровня, используемый в PPTP – для организации управляющего канала PPTP использует протокол TCP (порт 1723). В реализации Microsoft поддерживаются следующие методы аутентификации: PAP, CHAP, SPAP, MSCHAP v1, MSCHAP v2, EAP. Несмотря на наличие ряда «врожденных» дефектов, о которых я еще скажу далее, данный протокол до сих пор активно используется многими организациями благодаря тому, что до появления L2TP/IPSEC это был единственный VPN-протокол, поддержка которого была встроена в ОС Windows. Итак, как настроить PPTP VPN таким образом, чтобы обеспечить максимально возможный для данного протокола уровень безопасности? Думаю, что предложенное решение будет интересно еще и как очередной пример взаимодействия в рамках конкретной задачи коммерческого программного обеспечения с программным обеспечением, имеющим открытый исходный код. В первоначальном виде протокол PPTP представлял собой настоящее решето. Буквально все его составляющие были уязвимы к различным видам атак. Пароли в виде LM-хэшей; алгоритм MSHAP v1 (сплошное недоразумение); шифрование MPPE (многократное использование ключей шифрования, атаки на шифр RC4, генерация ключей шифрования на основе
№4, апрель 2007
пароля пользователя); полное отсутствие аутентификации сервера и проверки подлинности шифрованных пакетов; отсутствие шифрования во вреРисунок 1. Демонстрация работы asleap мя установления Конечно, уровень безопасности PPP-соединения; нет никакой защиты протокола IPSEC на порядок выше, канала управления и т. д. Все эти уязвимости были выявле- чем PPTP, однако есть один нюанс, коны в 1998 году Брюсом Шнаером [1]. торый позволяет и PPTP от Microsoft После чего Microsoft провела работу отстоять свое право на существование. по усилению безопасности и улучше- И вот в чем он заключается. нию качества кода реализации PPTP. Новая версия протокола получилась Свет в конце туннеля более защищенной, появилась вторая Главная уязвимость PPTP на сегодняшний день заключается в слабоверсия протокола MSCHAP. Однако в скором времени все тот сти алгоритмов парольной аутенже неугомонный Брюс Шнаер в 1999 тификации (MSCHAP, MSCHAPv2), году опять провел криптографичес- а также в том, что при использовании кий анализ уже обновленного прото- этих алгоритмов сессионные ключи кола [2]. Результаты снова оказались MPPE получаются из пользовательнеутешительными, это и понятно, ведь ского пароля [4]. Ведь редкий польмногие из уязвимостей существуют зователь установит себе пароль тииз-за недоработок в дизайне протоко- па «3hEML@4rj897#KJK$$», его будет ла. Осталась генерация ключей шиф- сложновато запомнить, а вот, наприрования на основе пароля пользова- мер, пароль «boomer» запомнить легтеля, равно как и отсутствие провер- ко. А наличие простого пароля хотя бы ки подлинности шифрованных паке- у одного пользователя делает возможтов, шифрование во время установ- ным проникновение злоумышленниления PPP-соединения по-прежнему ка во внутреннюю сеть организации. Здесь мы наблюдаем изначально неотсутствует. В 2003 году Джошуа Райт написал правильный подход к решению задаутилиту asleap [3], которая за доли се- чи – безопасность системы аутентикунд взламывает слабые пароли, за- фикации и шифрования ставится в защищенные алгоритмом MSCHAPv2, висимость от пользователя. Ситуация в корне меняется, если а чуть позже в нее был добавлен функционал работы с PPTP (см. рис. 1). вместо парольной аутентификации исЭта утилита изначально разрабатыва- пользовать аутентификацию EAP-TLS – лась для атак на патентованный про- расширение протокола PPP, разработокол Cisco Systems LEAP. Многие спе- танное Microsoft, которое позволяет циалисты по информационной безо- использовать для взаимной аутентипасности, увидев ее в действии, нача- фикации SSL-сертификаты. Этот мели призывать махнуть рукой на ущер- тод аутентификации лишен недостатбный от рождения протокол, мол, гор- ков MSCHAPv [1, 2], так как аутентибатого могила исправит, и переходить фикация пользователя производится по уникальному ключу, который гена L2TP/IPsec. Техническое задание для обеспечения безопасного удаленного доступа в локальную сеть компании №
Группа
Пользователи
IP-адреса серверов, на которые необходимо организовать доступ клиентов
Порт
Служба
1
Администраторы
Игорь Иванов
192.168.10.10
3389
RDP
2
Пользователи intranet-сайта
Ольга Петрова
192.168.10.11
80
HTTP
3
Пользователи терминалов Citrix
Владимир Сидоров
192.168.10.{12-15}
1494
ICA
13
администрирование
Рисунок 2. Схема VPN компании Testco
нерируется на основе случайных дан- зопасный удаленный доступ в локальных. На сегодняшний день использо- ную сеть компании 3 группам сотрудвание SSL-сертификатов является од- ников (см. таблицу). ним из самых надежных методов ауМожет быть, данное деление тентификации. Тот факт, что с его ис- не слишком удачное, ведь оно введепользованием построено большинс- но только для демонстрации возможтво современных систем электронной ности использования разграничения коммерции и интернет-банков, гово- доступа для пользователей VPN. рит о многом. В случае использования сертифи- Выбор ПО и «железа» катов, с длиной ключа 2048 бит на се- В качестве платформы для сервегодняшний день, EAP‑TLS практичес- ра мы будем использовать последки невозможно взломать. нюю стабильную версию FreeBSD 6.2. Сеансовые ключи MPPE в данном Можно использовать и платформу случае генерируются на основе ключа Windows, но тогда нам понадобится TLS master secret, полученного в про- Windows 2003 Enterprise Edition Server, цессе аутентификации TLS. Клиенты на котором придется поднимать центр также получают возможность провер- сертификации, а поднимать и адмики подлинности сервера еще на этапе нистрировать ЦС только ради VPN аутентификации. Кроме того, исполь- это, на мой взгляд, стрельба из пушки зование EAP-TLS дает нам возмож- по воробьям. К тому же использование ность применять двухфакторную ау- ПО с открытым исходным кодом знатентификацию клиентов, используя чительно уменьшает стоимость всесмарт-карты или электронные ключи го решения. e-token. Такая конфигурация позвоПочему именно FreeBSD, а не друляет выжать максимум безопасности гая UNIX-система? Главным звеном реиз протокола PPTP и достичь компро- шения является пакет MPD (Multi-link мисса между безопасностью, удобс- PPP daemon), основа которого – это мотвом работы пользователей и стои- дули ядра FreeBSD. Использование же MPD в свою очередь обусловлено исмостью всего решения. Рассмотрим пример практичес- пользованием функционала NAS ACL, кой реализации VPN с использовани- о котором будет сказано далее. К сожаем двухфакторной аутентификации лению, похожий проект Poptop не имепо протоколу EAP-TLS. ет данного функционала. MPD NAS ACL можно использовать только в связке с сервером RADIUS. Пример задачи Предположим, что согласно ТЗ, по- Из возможных вариантов серверов лученному от IT-директора компании RADIUS был выбран FreeRADIUS, так Testco, нам необходимо обеспечить бе- как это наиболее популярный и зре-
14
лый открытый RADIUS-сервер. Кстати, его использование плюс ко всему дает нам возможность вести учет работы клиентов VPN. Хранить информацию о пользователях и группах, а также данные учета их работы будем в БД MySQL. При желании использовать вебинтерфейс можно прикрутить Dialupadmin, который входит в состав пакета FreeRADIUS, однако этот вопрос выходит за рамки статьи. В качестве клиентской ОС, конечно же, Windows, иначе зачем использовать PPTP? Настройки, описанные далее, подойдут как Windows 2000 SP4, так и Windows XP SP2, так как процесс конфигурирования VPN-соединений для этих ОС практически идентичен. Для обеспечения двухфакторной аутентификации можно использовать как Aladdin e-token, так и Rainbow iKey. Для достижения более высокого уровня безопасности я советую использовать e-token PRO64, так как он умеет работать с ключами длиной в 2048 бит. И поддержка e-token как продукта гораздо лучше, чем поддержка iKey. В этой статье рассматривается именно вариант с e-token PRO64. «Железо» для сервера может быть практически любое, совместимое с FreeBSD 6.2 (см. список поддерживаемого оборудования на сайте freebsd.org). Минимальные требования по «железу» к описанной в этой статье системе – это процессор Celeron со 128 Мб оперативной памяти, далее все зависит от количества клиентов, хотя я все же рекомендую поставить хотя бы 512 Мб оперативной памяти.
Схема доступа Из всех вариантов расположения VPNшлюза наиболее предпочтительной является схема с расположением его в демилитаризованной зоне (DMZ), при этом локальная сеть организации, DMZ и Интернет отделены друг от друга межсетевым экраном (МСЭ). Этот вариант наиболее безопасен, так как позволяет контролировать трафик как между VPN-шлюзом и Интернетом, так и между VPN-шлюзом и локальной сетью (см. рис .2). Далее, основываясь на одном из основных принципов безопасности – минимизации привилегий, опре-
администрирование делим политику доступа для 3 групп пользователей VPN, описанных выше. Мы должны ограничить доступ клиентов VPN к локальной сети компании только теми ресурсами, которые им действительно необходимы. Очевидно, что у пользователей второй и третьей групп не должно быть доступа к ресурсам друг друга и первой группы. Даже администраторам не следует предоставлять удаленный доступ ко всей сети только на терминальный сервер по той причине, что не все администраторы должным образом следят за безопасностью своих компьютеров. Поэтому если не ограничить доступ, вирус с зараженного домашнего компьютера администратора может прорваться в локальную сеть компании. Контролировать доступ мы будем, используя такую замечательную возможность MPD, как NAS ACL. NAS (Network Access Server) – это сервер доступа, то есть сам MPD, а ACL (Access Control List) – это списки доступа, в данном случае это правила IPFW (родной пакетный фильтр FreeBSD). По умолчанию весь трафик с адресов VPN-клиентов будет заблокирован, но когда клиент пройдет авторизацию, сервер RADIUS определит группу, в которую входит данный клиент, и выдаст MPD-атрибут (один или несколько) mpd-rule, определенный для данной группы. Значением этого атрибута является правило IPFW, которое откроет доступ на разрешенный для него ресурс, после отключения клиента правило будет удалено. Для нормального функционирования VPN-шлюза в DMZ на МСЭ необходимо разрешить следующие типы трафика: n Прохождение GRE-пакетов с любого IP на VPN и обратно на интерфейсах inet0 и dmz0. n Прохождение TCP-пакетов с любого IP на VPN (порт 1723) и обратно на интерфейсах inet0 и dmz0. n Разрешить на интерфейсах (inet0 и lan0) все пакеты с VPN-шлюза в локальную сеть и обратно согласно нашей политике доступа (TCP с VPN-шлюза на 192.168.10.10 порт 3389 и на порт 192.168.10.11/24 80, и на (192.168.10.12–192.168.10.15) порт 1494). Пример конфигурационного файла pf.conf для пакетного фильтра OpenBSD PF: vpn_s="192.0.2.34" vpnnet="172.17.0.0/24" rdpterm="192.168.0.10" intranetweb="192.168.0.11" table <citrixfarm> const { 192.168.0.12, 192.168.0.13, ↵ 192.168.0.14, 192.168.0.15 } block log all pass quick on { inet0, dmz0 } inet proto gre from ↵ any to $vpn_s pass quick on { inet0, dmz0 } inet proto gre from ↵ $vpn_s to any pass in quick on inet0 proto tcp from ↵ any to $vpn_s port pptp keep state tag INET_DMZ pass in quick on dmz0 proto tcp from $vpnnet ↵ to $rdpterm port rdp keep state tag DMZ_LAN pass in quick on dmz0 proto tcp from $vpnnet ↵ to $intranetweb port http keep state tag DMZ_LAN pass in quick on dmz0 proto tcp from $vpnnet ↵ to <citrixfarm> port ica keep state tag DMZ_LAN pass out quick on dmz0 all keep state tagged INET_DMZ pass out quick on lan0 all keep state tagged DMZ_LAN
№4, апрель 2007
Кроме того, на МСЭ необходимо прописать маршрут до сети VPN, иначе обратные пакеты не дойдут туда. Для большинства UNIX-систем это будет выглядеть так: fire1# route add 172.17.0.0/16 192.0.2.34
Конфигурация пакетных фильтров Для запуска IPFW необходимо добавить следующую строку в файл /etc/rc.conf: firewall_enable="YES" firewall_type="VPN"
Тип VPN необходимо определить в файле /etc/rc.firewall следующим образом: [Vv][Pp][Nn]) # Диапазон адресов, которые будут выдаваться клиентам VPN, # не должен пересекаться с адресами локальной сети клиента, # поэтому не рекомендуется использовать диапазон 192.168 vpnnet="172.17.0.0/24" setup_loopback # Блокировать любой трафик от VPN-клиентов ${fwcmd} add 64000 deny all from $vpnnet to any # Нет необходимости фильтровать другой трафик, # так как VPN-шлюз находится в DMZ ${fwcmd} add 65000 pass all from any to any ;;
MPD будет добавлять правила для пользователей VPN начиная с номера 10000. После внесения изменений в конфигурационные файлы, если вы работаете удаленно, то необходимо перезагрузить машину, если же вы работаете с консоли, стартуете IPFW: vpn-s# /etc/rc.d/ipfw start
Установка и конфигурация mpd Из коллекции портов FreeBSD устанавливаем первую стабильную версию mpd4: vpn-s# cd /usr/ports/net/mpd vpn-s# make install clean vpn-s# echo 'mpd_enable="YES"' >> /etc/rc.conf
Mpd конфигурируется с помощью 3 файлов. Файл mpd.conf: default: # Создаем 50 netgraph интерфейсов load pptp0 # Загрузка разделов конфига load pptp1 load pptp2 ... load pptp49 pptp0: # Создать новый интерфейс new -i ng00 pptp0 pptp0 # Назначить клиенту IP-адрес, первый параметр – IP-адрес # конца туннеля со стороны сервера, 2-й – IP-адрес клиента # (маской задается диапазон сети из которого будет # назначен адрес) set ipcp ranges 172.18.0.1/32 172.18.1.1/32 # Загрузить общие для всех интерфейсов параметры # конфигурации load pptp_standart pptp1: new -i ng01 pptp1 pptp1
15
администрирование set ipcp ranges 172.18.0.1/32 172.18.1.2/32 load pptp_standart pptp2: new -i ng02 pptp2 pptp2 set ipcp ranges 172.18.0.1/32 172.18.1.3/32 load pptp_standart pptp99: new -i ng49 pptp49 pptp49 set ipcp ranges 172.18.0.1/32 172.18.1.50/32 load pptp_standart pptp_standart: # Отключить режим работы интерфейса «по требованию» set iface disable on-demand # Установить тип канала (описание типов смотрите в файле # mpd.links) set link type pptp # Мы не будем выдавать адрес DNS-сервера, так как теоретически # есть возможность подменить выдаваемый сервером адрес, # сессия IPCP не шифруется и не производится аутентификация # пакетов # set ipcp dns 127.0.0.1 set iface enable proxy-arp # Включить сжатие данных set bundle enable compression set ccp yes mppc # Включить 128-битное шифрование mppe set ccp yes mpp-e128 # Требовать шифрование set bundle yes crypt-reqd # IP-адрес сервера vpn-s.testco.ru # (необходимо заменить на реальный IP VPN-шлюза set pptp self 192.0.2.34 # Принимать входящие соединения по протоколу pptp set pptp enable incoming # Не инициировать соединения по протоколу pptp set pptp disable originate # Отключить механизм «windowing» определенный # протоколом. Этот механизм является дизайнерской # ошибкой. Его отключение улучшает производительность, # однако не все клиенты будут нормально работать # без этого механизма (Windows XP SP2 работает # без проблем) set pptp disable windowing # Устанавливаем MTU и MRU для канала PPP. Очень важно # установить эти значения меньше, чем по умолчанию (1500), # для того, чтобы избежать фрагментации пакетов GRE. # Особенно это важно при использовании eap-tls, так как # сертификат с ключем длиной в 2048 бит, не получится # уместить в одном пакете # # # # # # # # # # # #
set link mtu 1420 set link mru 1420 Включаем механизм mssfix для TCP. Этот механизм заботится о том, чтобы максимальный размер сегмента TCP, не превышал размер, заданный параметром MTU set iface enable tcpmssfix Данный для доступа к серверу RADIUS (IP, логин, пароль, порт для авторизации, порт для учета) set radius server 127.0.0.1 mpd Super!P33a 1812 1813 Таймаут для RADIUS set radius timeout 10 Дополнительный конфигурационный файл для RADIUS set radius config /usr/local/etc/mpd4/radius.conf Количество попыток соединения с сервером RADIUS set radius retries 3 Включить учет RADIUS set auth enable radius-acct Включить авторизацию RADIUS set auth enable radius-auth Включить eap set link enable eap Проксировать eap-запросы set eap enable radius-proxy
Файл mpd.links: pptp0: set pptp1: set pptp2: set … pptp49: set
16
link type pptp link type pptp link type pptp link type pptp
Файл radius.conf: # Данные для соединения с сервером учета acct 127.0.0.1 Super!P33a # Данные для соединения с сервером авторизации # и аутентификации auth 127.0.0.1 Super!P33a
Конфигурация FreeRADIUS Если FreeRADIUS устанавливается из портов, его файлы конфигурации по умолчанию хранятся в директории /usr/ local/etc/raddb: n radius.conf – главный конфигурационный файл FreeRADIUS; n clients.conf – файл, в котором хранятся описание клиентов RADIUS (не путать с клиентами VPN); n eap.conf – файл конфигурации протокола EAP; n sql.conf – файл конфигурации работы с БД; n dictionary – файл, в котором содержится словарь атрибутов RADIUS; n hints – необходим для работы модуля prerocess; n huntgroups – необходим для работы модуля prerocess. Главный конфигурационный файл радиуса на первый взгляд очень огромный и устрашающий. Но если мы выбросим из него все лишнее, оставив только директивы, необходимые для работы нашего VPN-сервера, получится компактный и легко читаемый конфигурационный файл: # Определение путей, необходимых для работы сервера prefix = /usr/local exec_prefix = ${prefix} sysconfdir = ${prefix}/etc localstatedir = /var sbindir = ${exec_prefix}/sbin logdir = /var/log raddbdir = ${sysconfdir}/raddb radacctdir = ${logdir}/radacct confdir = ${raddbdir} run_dir = ${localstatedir}/run/radiusd log_file = ${logdir}/radius.log libdir = ${exec_prefix}/lib pidfile = ${run_dir}/radiusd.pid checkrad = ${sbindir}/checkrad max_requests = 512 # Максимальное количество запросов # Слушать только на локальном интерфейсе bind_address = 127.0.0.1 hostname_lookups = no # Не разрешать имена хостов # Не убирать пробелы из имен пользователей nospace_user = no security { # Настройки безопасности # Ограничение максимального количества принимаемых # атрибутов до 200 max_attributes = 200 reject_delay = 1 # Задержка после отказа в доступе 1с # Сервер не будет отвечать на запросы типа Status-Server status_server = no } # Подключить файл с конфигурацией клиентов NAS $INCLUDE ${confdir}/clients.conf snmp
= no # Не использовать SNMP
thread pool { # Конфигурация потоков start_servers = 5 # Начальное количество потоков 5 # Максимальное количество потоков 32 max_servers = 32 # Минимум свободных потоков 3 min_spare_servers = 3 # Максимум свободных потоков 10 max_spare_servers = 10 max_requests_per_server = 0 # Предельное значение выполненных запросов после которого # поток останавливается (необходимо использовать
администрирование # при утечках ресурсов; нет необходимости задавать # это значение при нормальной работе сервера) } modules { # Конфигурация модулей # Подключаем отдельный конфигурационный файл для EAP $INCLUDE ${confdir}/eap.conf mschap { # Разрешаем использовать MSCHAP } # Модуль создает уникальный идентификатор сессии на основе # нижеследующих атрибутов и добавляет его в учетные пакеты acct_unique { key = "User-Name, Acct-Session-Id, NAS-IP-Address, Client-IP-Address, NAS-Port" } # Подключаем отдельный конфигурационный файл для работы # с БД $INCLUDE ${confdir}/sql.conf # Модуль создает файл типа utmp с информацией кто # и откуда в данный момент работает radutmp { # Путь к файлу utmp filename = ${logdir}/radutmp # Атрибут, из которого берем имя пользователя username = %{User-Name} case_sensitive = yes # Думаю, понятно # Запрашивать информацию у NAS check_with_nas = yes perm = 0600 # Файл доступен только callerid = "yes" # Записывать IP } } authorize { sql
# Модуль авторизации # Использовать SQL
} authenticate { # Модуль аутентификации # использовать MSCHAP (запасной вариант) Auth-Type MS-CHAP { mschap } eap # Использовать EAP } preacct { # Предучетный модуль # Создать уникальный идентификатор сессии перед # началом учета acct_unique } accounting { # Учетный модуль # Писать соответствующую информацию файл utmp radutmp sql # Учет работы пользователей в БД } session { # База данных сессий, используется для проверки # одновременного использования sql # Для этих целей использовать mysql }
Единственным клиентом нашего RADIUS будет mpd, который соединяется с сервером RADIUS по локальному интерфейсу, поэтому файл clients.conf выглядит следующим образом: client 127.0.0.1 { secret = Super!P33a shortname= MPD nastype = other }
Думаю, тут все понятно.
Переходим к конфигурированию EAP Для работы протокола EAP-TLS нам понадобятся файлы: n DH – файл с ключом Диффи-Хелмана; n random – ссылка на /dev/urandom; n root.pem – сертификат СЦ;
№4, апрель 2007
n server.key – закрытый ключ сервера; n server.pem – сертификат сервера; n ivanov_igor.p12 – PKCS#12-сертификат и закрытый ключ Игоря Иванова;
n olga_petrova.p12 – PKCS#12-сертификат и закрытый ключ Ольги Петровой;
n vladimir_sidorov.p12 – PKCS#12-сертификат и закрытый ключ Владимира Сидорова;
n PKCS#12 – это формат хранения зашифрованного закрытого ключа и сертификата в одном файле, который удобно использовать для их безопасной передачи. Очищаем директорию /usr/local/etc/raddb/certs/ и заходим в нее: vpn-s# rm –r /usr/local/etc/raddb/certs/* vpn-s# cd /usr/local/etc/raddb/certs/
Создаем файл c ключем Диффи-Хельмана: vpn-s#openssl dhparam -check -text -5 2048 -out dh
Задаем источник случайных чисел: vpn-s# ln -s /dev/urandom /usr/local/etc/raddb/certs/random
Скрипт для создания корневого ЦС: #!/bin/sh # Начнем с чистого листа rm -rf demoCA # Создаем новый самоподписанный сертификат и закрытый # ключ к нему. После запроса файл newreq.pem будет # содержать закрытый ключ и сертификат openssl req -new -x509 -keyout newreq.pem ↵ -out newreq.pem -days 730 -passin pass:My3ecret -passout pass:My3ecret -subj ↵ '/C=RU/ST=Russia/L=Moscow/O=Testco/OU=IT/CN=Testco ↵ CA/emailAddress=admin@testco.ru' # Создаем новый центр сертификации, корневым сертификатом # которого будет сертификат из файла newreq.pem echo "newreq.pem" | CA.pl -newca >/dev/null # Создадим файл в формате PKCS#12, используя, созданные # ранее закрытый ключ и сертификат. Сертификат в файле # demoCA/cacert.pem тот же, что и в файле newreq.pem. # Вместо использования ключа «-in #demoCA/cacert.pem» # мы могли бы использовать ключ «-in newreq.pem» и тогда # можно было бы опустить ключ «-inkey newreq.pem», потому # как файл newreq.pem содержит в себе и закрытый ключ # и сертификат openssl pkcs12 -export -in demoCA/cacert.pem ↵ -inkey newreq.pem -out root.p12 -cacerts ↵ -passin pass:My3ecret -passout pass:My3ecret # Извлекаем из созданного файла в формате PKCS#12 # сертификат и закрытый ключ и записываем их в новый файл # PEM-формата root.pem openssl pkcs12 -in root.p12 -out root.pem ↵ -passin pass:My3ecret -passout pass:My3ecret # Зачистка rm newreq.pem
Запускаем: vpn-s# ./root.sh
В результате работы скрипта должны быть созданы 2 файла root.p12 и root.pem. Первый содержит закрытый ключ и сертификат СЦ в формате PKCS#12, а второй – сертификат СЦ в формате pem. Скрипт для создания сертификата сервера RADIUS:
17
администрирование #!/bin/sh # Делаем запрос на новый сертификат в формате PKCS#10 openssl req -new -newkey rsa:2048 -keyout server.key ↵ -out newreq.pem -days 730 -passin pass:My3ecret ↵ -passout pass:My3ecret -subj ↵ '/C=RU/ST=Russia/L=Moscow/O=Testco/OU=IT/ ↵ CN=vpn-s.testco.ru/emailAddress=admin@testco.ru' # Подписываем запрос на сертификат. Ключ -infiles указывает # на запрос созданный предыдущей командой, вывод идет # в файл #newcert.pem. Ключ -extensions необходим # для добавления OID-проверки подлинности сервера openssl ca -policy policy_anything -out server.crt ↵ -passin pass:My3ecret -key My3ecret –extensions ↵ xpserver_ext -extfile xpextensions -infiles newreq.pem # Зачистка rm newreq.pem
Запускаем: vpn-s# ./server.sh
В результате работы скрипта должны быть созданы 2 файла server.key и server.crt, которые содержат закрытый ключ и сертификат сервера соответственно. Скрипт для создания клиентского сертификата (на примере создания для сертификата Игоря Иванова): #!/bin/sh # Делаем запрос на новый сертификат в формате PKCS#10 openssl req -new -keyout newreq.pem -out newreq.pem ↵ -days 730 -passin pass:My3ecret ↵ -passout pass:My3ecret -subj ↵ '/C=RU/ST=Russia/L=Moscow/O=Testco/OU=IT/ ↵ CN=Igor Ivanov/emailAddress=ivanov.i@testco.ru' # Подписываем запрос на сертификат # Ключ -infiles указывает на запрос созданный предыдущей # командой, вывод идет в файл newcert.pem. Ключ -extensions # необходим для добавления OID-проверки подлинности сервера openssl ca -policy policy_anything -out newcert.pem ↵ –passin pass:My3ecret -key My3ecret ↵ --extensions xpclient_ext -extfile xpextensions ↵ -infiles newreq.pem # Создадим файл cert-srv.p12 формата PKCS#12 из находящихся # в файле newreq.pem, нового сертификата и его закрытого ключа openssl pkcs12 -export -in newcert.pem ↵ -inkey newreq.pem –out ivanov_igor.p12 -clcerts ↵ -passin pass:My3ecret -passout pass:My3ecret # Зачистка rm newcert.pem newreq.pem
Запускаем: vpn-s# ./client.sh
В результате работы скрипта мы получили файл PKCS#12, который содержит закрытый ключ и сертификат Игоря Иванова, аналогичным образом создадим сертификаты для оставшихся двух пользователей. Далее создадим конфигурационный файл для EAP. Файл eap.conf: # Расширяемый Протокол Аутентификации # # Для всех видов EAP-аутентификации eap { # Какой тип EAP-аутентификации применить, когда получен # EAP-идентификатор default_eap_type = tls # Таймер по умолчанию для очистки списка EAP # Он служит для сопоставления полученных EAP-ответов # с отправленными EAP-запросами timer_expire = 60 # Поддерживаемые типы EAP # md5 { # } # Секция EAP-TLS
18
tls { private_key_password = whatever private_key_file = /usr/local/etc/raddb/certs/server.key # Иногда закрытый ключ и сертификат расположены в одном # файле, тогда директивы private_key_file и certificate_file # должны иметь одно и то же значение certificate_file = /usr/local/etc/raddb/certs/server.pem # Список корневых центров сертификации CA_file = /usr/local/etc/raddb/certs/root.pem # Файлы, необходимые для работы протокола TLS dh_file = /usr/local/etc/raddb/certs/DH random_file = /dev/urandom # Это значение никогда не должно превышать MAX_RADIUS_LEN # (4096), предпочтительно должно составлять половину # значения MAX_RADIUS_LEN, для того чтобы другие атрибуты # могли поместиться в радиус-пакет. На большинстве точек # доступа значение максимальной длины пакета сконфигурировано # между 1500-1600. В таком случае, размер фрагмента # должен быть <=1024 fragment_size = 1024 # include_length – это флаг, который по умолчанию установлен # в значение «да». Если он установлен в значение «да», # общая длина сообщения включается в каждый отправляемый # пакет. Если он установлен в значение «нет», полная # длина сообщения включается только в первый пакет серии # фрагментов include_length = yes # В данном случае нет необходимости делать проверку по спискам # отозванных сертификатов, потому что удалить пользователя # из базы проще, чем генерировать новый crl #check_crl = no } }
Далее нужно предоставить серверу RADIUS данные, необходимые для работы с БД. Для этого нам понадобится создать файл sql.conf, содержимое которого следует ниже: sql { driver = "rlm_sql_mysql" # Тип SQL-базы MySQL # Имя хоста или IP-адрес сервера MySQL, в нашем # случае это localhost server = "localhost" # Логин пользователя MySQL созданного специально # для работы с базой RADIUS login = "freeradius" password = "d1ametR" # Eго пароль radius_db = "radius" # Название базы acct_table1 = "radacct" # Первая таблица учета acct_table2 = "radacct" # Вторая таблица учета # Таблица проверяемых атрибутов authcheck_table = "radcheck" # Таблица выдаваемых атрибутов authreply_table = "radreply" # Таблица проверяемых атрибутов для групп groupcheck_table = "radgroupcheck" # Таблица выдаваемых атрибутов для групп groupreply_table = "radgroupreply" # Таблица соответствия пользователей и групп usergroup_table = "usergroup" # Удалять подвисшие сессии deletestalesessions = "yes" sqltrace = "no" # Не писать в файл SQL-запросы sqltracefile = "${logdir}/sqltrace.sql" # Количество одновременно открытых SQL-соединений num_sql_socks = 5 # Задержка перед повторной попыткой, после # неудачного соединения connect_failure_retry_delay = 60 # Получить значение атрибута %{SQL-User-Name} # из атрибута %{User-Name} sql_user_name = "%{User-Name}" # Проверка атрибутов во время авторизации authorize_check_query = "SELECT id, UserName, ↵ Attribute, Value, op ↵ FROM ${authcheck_table} ↵ WHERE Username = '%{SQL-User-Name}' ↵ ORDER BY id" # Выдача атрибутов во время авторизации authorize_reply_query = "SELECT id, UserName, ↵ Attribute, Value, op ↵ FROM ${authreply_table} ↵ WHERE Username = '%{SQL-User-Name}' ↵
администрирование ORDER BY id" # Проверка атрибутов для групп во время авторизации authorize_group_check_query = "SELECT ↵ ${groupcheck_table}.id, ↵ ${groupcheck_table}.GroupName, ↵ ${groupcheck_table}.Attribute, ↵ ${groupcheck_table}.Value, ↵ ${groupcheck_table}.op ↵ FROM ${groupcheck_table}, ↵ ${usergroup_table} ↵ WHERE ${usergroup_table}.Username = ↵ '%{SQL-User-Name}' ↵ AND ${usergroup_table}.GroupName = ↵ ${groupcheck_table}.GroupName ↵ ORDER BY ${groupcheck_table}.id" # Выдача атрибутов для групп во время авторизации authorize_group_reply_query = "SELECT ↵ ${groupreply_table}.id, ↵ ${groupreply_table}.GroupName, ↵ ${groupreply_table}.Attribute, ↵ ${groupreply_table}.Value, ↵ ${groupreply_table}.op ↵ FROM ${groupreply_table}, ↵ ${usergroup_table} ↵ WHERE ${usergroup_table}.Username = ↵ '%{SQL-User-Name}' ↵ AND ${usergroup_table}.GroupName = ↵ ${groupreply_table}.GroupName ↵ ORDER BY ${groupreply_table}.id" # Запрос управления учетом accounting_onoff_query = "UPDATE ${acct_table1} ↵ SET AcctStopTime='%S', ↵ AcctSessionTime=unix_timestamp('%S') ↵ - unix_timestamp(AcctStartTime), ↵ AcctTerminateCause= ↵ '%{Acct-Terminate-Cause}', ↵ AcctStopDelay = '%{Acct-Delay-Time}' ↵ WHERE AcctSessionTime=0 ↵ AND AcctStopTime=0 ↵ AND NASIPAddress= '%{NAS-IP-Address}' ↵ AND AcctStartTime <= '%S'" # Запрос обновления данных учета accounting_update_query = "UPDATE ${acct_table1} ↵ SET FramedIPAddress = '%{Framed-IP-Address}', ↵ AcctSessionTime = '%{Acct-Session-Time}', ↵ AcctInputOctets = '%{Acct-Input-Octets}', ↵ AcctOutputOctets = '%{Acct-Output-Octets}' ↵ WHERE AcctSessionId = '%{Acct-Session-Id}' ↵ AND UserName = '%{SQL-User-Name}' ↵ AND NASIPAddress= '%{NAS-IP-Address}'" # Запрос начала учета accounting_start_query = "INSERT into ↵ ${acct_table1} (AcctSessionId, ↵ AcctUniqueId, UserName, Realm, ↵ NASIPAddress, NASPortId, NASPortType, ↵ AcctStartTime, AcctStopTime, ↵ AcctSessionTime, AcctAuthentic, ↵ ConnectInfo_start, ConnectInfo_stop, ↵ AcctInputOctets, AcctOutputOctets, ↵ CalledStationId, CallingStationId, ↵ AcctTerminateCause, ServiceType, ↵ FramedProtocol, FramedIPAddress, ↵ AcctStartDelay, AcctStopDelay) ↵ values('%{Acct-Session-Id}', ↵ '%{Acct-Unique-Session-Id}', ↵ '%{SQL-User-Name}', '%{Realm}', ↵ '%{NAS-IP-Address}', '%{NAS-Port}', ↵ '%{NAS-Port-Type}', '%S', '0', '0', ↵ '%{Acct-Authentic}', '%{Connect-Info}', ↵ '', '0', '0', '%{Called-Station-Id}', ↵ '%{Calling-Station-Id}', '', ↵ '%{Service-Type}', '%{Framed-Protocol}', ↵ '%{Framed-IP-Address}', ↵ '%{Acct-Delay-Time}', '0')" # Запрос окончания учета accounting_stop_query = "UPDATE ${acct_table2} ↵ SET AcctStopTime = '%S', ↵ AcctSessionTime = '%{Acct-Session-Time}', ↵ AcctInputOctets = '%{Acct-Input-Octets}', ↵ AcctOutputOctets = '%{Acct-Output-Octets}', ↵ AcctTerminateCause = '%{Acct-Terminate-Cause}', ↵ AcctStopDelay = '%{Acct-Delay-Time}', ↵ ConnectInfo_stop = '%{Connect-Info}' ↵ WHERE AcctSessionId = '%{Acct-Session-Id}' ↵ AND UserName = '%{SQL-User-Name}' ↵ AND NASIPAddress = '%{NAS-IP-Address}'" # Проверка одновременных соединений simul_verify_query = "SELECT RadAcctId, ↵
№4, апрель 2007
AcctSessionId, UserName, NASIPAddress, ↵ NASPortId, FramedIPAddress, CallingStationId, ↵ FramedProtocol FROM ${acct_table1} ↵ WHERE UserName='%{SQL-User-Name}' ↵ AND AcctStopTime = 0" # Запрос информации о членстве пользователей в группах group_membership_query = "SELECT GroupName ↵ FROM ${usergroup_table} ↵ WHERE UserName='%{SQL-User-Name}'" }
Для работы сервера RADIUS необходим словарь атрибутов. Мы будем использовать словарь из дистрибутива FreeRADIUS с дополнением специфических атрибутов mpd. Скопируем словарь из дистрибутива: vpn-s# cp /usr/local/etc/raddb/dictionary.sample ↵ /usr/local/etc/raddb/dictionary
и добавим в него следующую строку: $INCLUDE
/usr/local/share/freeradius/dictionary.mpd
затем создадим файл-словарь /usr/local/share/freeradius/ dictionary.mpd: #---------------------------------------------------------# dictionary.mpd VENDOR mpd 12341 ATTRIBUTE mpd-rule 1 string mpd ATTRIBUTE mpd-pipe 2 string mpd ATTRIBUTE mpd-queue 3 string mpd #----------------------------------------------------------
Копируем оставшиеся необходимые файлы: vpn-s# cp /usr/local/etc/raddb/huntgroups.sample ↵ /usr/local/etc/raddb/huntgroups vpn-s# /usr/local/etc/raddb/hints.sample ↵ /usr/local/etc/raddb/hints
Конфигурация базы данных и создание учетных записей В заключение нам необходимо установить сервер MySQL для хранения данных авторизации пользователей и учета их работы с VPN: vpn-s# cd /usr/ports/databases/mysql50-server vpn-s# make install clean vpn-s# echo 'mysql_enable="YES"' >> /etc/rc.conf
Создадим базу данных: vpn-s# mysql mysql> CREATE DATABASE radius; mysql> use radius mysql> SOURCE /usr/local/share/doc/freeradius/examples/ ↵ mysql.sql
Далее необходимо завести пользователя Freeradius в MySQL с полными правами на базу radius: mysql> GRANT ALL PRIVILEGES ON radius.* ↵ to 'freeradius'@'localhost' IDENTIFIED BY 'd1ametR'; mysql> FLUSH PRIVILEGES; mysql>exit
База готова, начнем ее заполнять. Создадим в базе данных трех пользователей: Igor Ivanov,
19
администрирование
Рисунок 3. Сертификат Игоря Иванова в утилите «Свойства e-token»
Olga Petrova, Vladimir Sidorov, которые будут являться членами групп: RDP_USERS, HTTP_USERS, ICA_USERS соответственно: vpn-s# mysql –e ‘ INSERT INTO usergroup (UserName, ↵ GroupName, priority) VALUES ("Igor Ivanov", ↵ " RDP_USERS",1)’ radius vpn-s# mysql –e ‘ INSERT INTO usergroup (UserName, ↵ GroupName, priority) VALUES ("Olga Petrova", ↵ " HTTP_USERS",1)’ radius vpn-s# mysql –e ‘ INSERT INTO usergroup (UserName, ↵ GroupName, priority) VALUES ("Vladimir Sidorov", ↵ " ICA_USERS",1)’ radius
Установим для групп протокол авторизации EAP: vpn-s# mysql –e ‘INSERT INTO radgroupcheck (id, ↵ GroupName, Attribute, op, Value) VALUES (10, ↵ "RDP_USERS", "Auth-Type", ":=", "EAP")’ radius vpn-s# mysql –e ‘INSERT INTO radgroupcheck (id, ↵ GroupName, Attribute, op, Value) VALUES (20, ↵ "HTTP_USERS", "Auth-Type", ":=", "EAP") ’ radius vpn-s# mysql –e ‘INSERT INTO radgroupcheck (id, ↵ GroupName, Attribute, op, Value) VALUES (30, ↵ "ICA_USERS", "Auth-Type", ":=", "EAP") ’ radius
Определим списки доступа для каждой из групп: vpn-s# mysql –e ‘INSERT INTO radgroupreply (id, ↵ GroupName, Attribute, op, Value) VALUES (10, ↵ "RDP_USERS", "mpd-rule","+="," 100=allow tcp from ↵ any to 192.168.0.10/24 3389 keep-state")’ radius vpn-s# mysql –e ‘INSERT INTO radgroupreply (id, ↵ GroupName, Attribute, op, Value) VALUES (20, ↵ "HTTP_USERS", "mpd-rule","+="," 100=allow tcp from ↵ any to 192.168.0.11/24 80,443 keep-state")’ radius vpn-s# mysql –e ‘INSERT INTO radgroupreply (id, ↵ GroupName, Attribute, op, Value) VALUES (30, ↵ "RDP_USERS", "mpd-rule","+="," 100=allow tcp from ↵ any to 192.168.0.0/24{12-15} 1494 keep-state")’ radius
Конфигурация клиента Прежде чем настраивать VPN-соединение в Windows, следует записать закрытый ключ и сертификат клиента в хранилище электронного ключа e-token (предполагается, что драйвер e-token уже установлен). Запускаем утилиту «Свойства e-token» и выбираем вкладку дополнительно, вводим ПИН-код. Выбираем вкладку «Сертификаты и ключи» и кликаем импортировать сертификат, выбираем файл PKCS#12
20
и вводим пароль, который был установлен при создании файла PKCS#12: Если пароль был введен правильно, мы можем видеть данные об импортированном сертификате (см. рис. 3). Таким образом, мы инициализируем три ключа e-token, по одному для каждого из наших пользователей. После этого необходимо импортировать на клиентскую машину в раздел доверенных корневых центров сертификации компьютера сертификат ЦC из файла root.pem, предварительно изменив его расширение на «.crt». Настройка VPN-соединения: n Создадим новое VPN-соединение с названием «testco», имя VPN-сервера vpn-s.testco.ru. n Далее открываем свойства вновь созданного соединения (см. рис. 4). n Выбираем вкладку «Безопасность» и в ней пункт «Дополнительные (выборочные) параметры». Нажимаем кнопку «Параметры». Появится окно дополнительных параметров безопасности. n В разделе «Шифрование данных» кликаем мышкой на обязательное шифрование данных. В разделе «Безопасный вход» «Протокол расширенной проверки подлинности (EAP)», заходим в его свойства (см. рис .5). n Отмечаем пункт «Использовать мою смарт-карту». Ставим галочку «проверка сертификата сервера» и галочку «подключение к серверам». Вписываем имя vpn-s.testco.ru. Выбираем доверенный корневой центр сертификации «Testco CA». Далее жмем кнопку «ОК» 3 раза (см. рис. 6). n Теперь можно щелкнуть мышкой на появившемся на рабочем столе ярлыке «testco» и подключиться к сети Testco. n При подключении вам необходимо ввести ПИН-код e‑token, который был установлен при его инициализации. Теперь, если все настройки выполнены без ошибок, подключившись к VPN с помощью любого из ключей, мы получаем доступ к ресурсам локальной сети компании согласно приведенной выше схеме доступа. В случае возникновения проблем соединения советую включать отладку MPD в файле mpd.conf: startup: log +radius2 +ipcp2 +iface2
и запускать radiusd с ключом -X.
Сравнение с альтернативными решениями Попробуем сравнить наше решение с другими VPN-решениями, которые используются для организации безопасного удаленного доступа клиентов в локальную сеть организации. Наиболее популярной технологией, используемой в коммерческих решениях VPN, является IPsec. Она обеспечивает самый высокий уровень безопасности VPN, однако, на мой взгляд, больше подходит для организации шифрованных туннелей через Интернет именно между сетями, так как возникают трудности при подключении клиентов из-за NAT (NAT-T все еще сырая технология). Даже
администрирование
Рисунок 4. Свойства VPN-соединения testco
Рисунок 5. Настройка дополнительных параметров безопасности
при нормальной работе NAT-T в том местимости с NAT; серверное и клислучае, если мы используем для аутен- ентское ПО распространяется под литификации SSL-сертификаты, которые цензией GPL. из-за размера не могут быть передаОднако Microsoft не использует ны в одном пакете, существует пробле- эту технологию, и никто не может гама фрагментации пакетов IKE (прото- рантировать, что в следующем серкол обмена ключами и согласования висном пакете для XP или в Windows параметров в IPSec). При этом не все Vista не будут содержаться такие испакетные фильтры и трансляторы се- правления или новшества, после котевых адресов на маршруте от клиен- торых OpenVPN перестанет работать. та до VPN-шлюза будут корректно ра- А ведь такое уже было после выхода ботать с фрагментированными пакета- SP2 для XP. ми и пропускать их. И если фрагменЕще один недостаток OpenVPN тированный пакет не дойдет до места по сравнению с PPTP – это необхоназначения, параметры безопасности димость установки дополнительного IPsec не будут установлены, подключе- клиентского ПО и отсутствие его авние к VPN не состоится. томатического обновления. Притом Ради справедливости хочу заме- что в OpenVPN часто находят уязвитить, что при использовании PPTP то- мости, а пользователи обычно не люже могут возникнуть проблемы с NAT, бят обновлять ПО, это существенный если NAT не умеет анализировать по- минус. ле Call ID в пакетах GRE. Эти проблемы Мое мнение, что OpenVPN – это нарешаются с помощью дополнительных иболее перспективный проект в своей «подсистем», как например conntrack области, но для использования в корв Linux, однако надо помнить, что шлю- поративной среде, где подавляющее зы, через которые будут выходить в Ин- большинство клиентских машин ратернет ваши клиенты, не находятся ботает под управлением Windows, под вашим контролем, следователь- он не подходит. но, далеко не всегда вы сможете решать подобного рода проблемы. Один Заключение из вариантов решения такой проблемы Я считаю, что в итоге нам удалось соэто покупка прямого IP-адреса. здать VPN с относительно высоким Что касается другой популярной уровнем безопасности, несмотря на то технологии, OpenVPN, то это решение что создатели протокола PPTP сделалишено недостатков как PPTP, так и ли это почти невозможным. Если бы IPsec. Для шифрования и аутентифи- не возможность использования аутенкации в OpenVPN используется про- тификации EAP-TLS, протокол можтокол SSL (TLS), о преимуществах но было бы смело хоронить, а с таким которого я упоминал при описании доспехом «старый уродец» еще посEAP‑TLS; отсутствуют проблемы сов- лужит нам. Конечно, такие проблемы,
№4, апрель 2007
Рисунок 6. Настройка параметров протокола EAP-TLS
как атаки на шифр RC4, отсутствие шифрования во время установки PPPсоединения и отсутствие аутентификации GRE-пакетов, остались, но мы перекрыли возможность для проведения наиболее опасных атак, результатом которых может быть проникновение злоумышленника во внутреннюю сеть компании или раскрытие информации, передаваемой по VPN. Ведь любой грамотный в области информационной безопасности специалист прекрасно понимает, что взломать можно любую систему, вопрос только в том, какое количество ресурсов будет потрачено на этот взлом. И наша задача заключается в том, чтобы цена взлома оказалась непосильно дорогой для злоумышленников. Пусть ищут другие способы добычи информации, на нашем участке обороны им ничего не светит. Выражаю благодарность всем, кто начинал и продолжает работу над проектом MPD, особенно Антону Мотину и Глебу Смирнову, благодаря которым недавно вышел первый стабильный релиз этого замечательного ПО. 1. http://www.schneier.com/paper-pptp.html. 2. http://www.schneier.com/paper-pptpv2. html. 3. http://asleap.sourceforge.net. 4. http://www3.ietf.org/proceedings/99jul/I-D/ draft-ietf-pppext-mppe-keys-00.txt. 5. h t t p : / / w w w . s a n s . o r g / r e s o u r c e s / malwarefaq/pptp-vpn.php. 6. http://www.freeradius.org/doc/EAPTLS. pdf. 7. http://www.ietf.org/rfc/rfc3715.txt.
21
администрирование
Cacti – простой и удобный инструмент для мониторинга и анализа сети
Сергей Яремчук По мере увеличения размеров сети все более актуальным становится обеспечить ее бесперебойную работу и своевременно находить проблемные участки. Добиться этого можно, только проводя постоянный мониторинг.
М
ожно выделить несколько задач, решаемых с использованием приложений, предназначенных для мониторинга сетевых и системных ресурсов. Исходя из них, сформулировать требования к системе мониторинга. В первую очередь это контроль доступности и рабочих характеристик серверов, сервисов и активного оборудования, оценка загруженности и доступности канала передачи информации. Такая система должна быть способной накапливать всю собранную
22
информацию об объектах мониторинга. В дальнейшем используя временные характеристики, можно быстрее разобраться с возникшей проблемой. Для просмотра статистики необходим удобный интерфейс, с помощью которого можно быстро составлять необходимые запросы. Желательна возможность мониторинга в реальном времени. Сам по себе контроль – это половина задачи, система мониторинга должна уметь предупреждать администратора о появлении проблем (пропадание
канала, сервиса) или превышении допустимого порога одного из наблюдаемых параметров (загрузка процессора, свободное место на дисках). Существует большое количество Open Source-систем мониторинга: Nagios, базирующийся на нем Oreon, MRTG, RRDtool, небольшой Cricket, Zabbix, NetMRG и прочие. Соответственно и задачу можно решить разными способами и инструментами. Сегодня подробно рассмотрим лишь один из них.
администрирование Проект Cacti Cacti является удобным интерфейсом к RRDTool. С его помощью можно контролировать большое количество различных параметров, таких как загрузку систем и сетей, с выводом всевозможных графиков. Cacti без проблем будет работать в сетях любого размера, как маленьких, так и больших, со сложной разветвленной топологией. В качестве источника данных могут быть использованы любые внешние команды или сценарии с любыми параметрами, которые нужно собрать, реализована поддержка SNMP. Интерфейс написан на PHP, вся собранная информация сохраняется в базе данных MySQL. Распространяется Cacti по лицензии GNU GPL. Одним из требований при его создании было построение легкого в использовании интерфейса. Центральным звеном в этой системе являются графики. Все контролируемые параметры и настройки так или иначе привязаны к графикам. Графики статистик представлены в виде дерева, в котором графики сгруппированы по своим критериям. Причем один и тот же график может находиться в разных частях дерева. Например, при выводе сетевой статистики системы и при показе информации о конкретном сетевом устройстве. Это очень удобно, не нужно искать по вкладкам нужный график, вся информация всегда под рукой. Все графики можно быстро собрать в одном месте щелчком мышки в Graph Management. Пользователь может самостоятельно создавать графики, используя заранее подготовленные шаблоны. Шаблоны – это один из больших плюсов Cacti. Нет необходимости вникать в особенности работы RRDTools, просто выбираем шаблон, и график готов. При необходимости параметры любого созданного графика можно просмотреть и уточнить. Каждый график описывается двумя элементами: параметры настроек, определяющие свойства графика, и элементы, определяющие данные, которые должны быть представленными на нем. Информацию, выводимую графиком, можно на лету уточнять, например, изменяя временной промежуток, выделив его мышкой, или создавая новые источники на основе имеющихся данных. При необходимости можно обеспечить доступ к графикам нескольким пользователям. При этом каждому пользователю могут быть назначены четко заданные права, как на просмотр только «своих» или добавление графиков.
Установка Cacti Для работы Cacti потребуется наличие MySQL, PHP, RRDTool, net-snmp и веб-сервера с поддержкой PHP (Apache или IIS). Причем в процессе работы обнаружилось, что Cacti не «дружит» с Suhosin (расширение к PHP для усиления безопасности). На сайте проекта доступны архивы для Linux/ Windows и ссылки на пакеты для дистрибутивов, использующих RPM, ebuild Gentoo, оpenSUSE. Можно использовать CVS или архив с текущей сборкой. Хотелось бы обратить особое внимание на ресурс CactiUsers [2]. Здесь предлагается патч, позволяющий добавить в Cacti поддержку плагинов, и доступно 11 плагинов разной степени готовности. Например, плагин Discovery способен находить неизвестные Cacti устройства, поддерживающие SNMP, есть просмотрщик сообщений Netflow, Ntop и syslog, плагин для работы по SSL, плагин состояний узлов и некоторые другие. Также предлагается дистрибутив CactiEZ (пока бета 0.2), построенный на осно-
№4, апрель 2007
ве CentOS 4.3, содержащий настроенный Cacti с поддержкой плагинов и самими плагинами, а также 305 пакетов, среди которых Net-SNMP, Netflow, Webmin, eAccelerator и прочие. Если для мониторинга будет использован отдельный компьютер, то CactiEZ – хороший кандидат для использования на нем. В репозитарии дистрибутива Ubuntu 6.06, который использовался при тестовой установке, пакет Cacti есть: $ sudo apt-cache search cacti cacti-cactid - Multi-Threading poller for cacti cacti - Frontend to rrdtool for monitoring systems and services
В пакет Cacti входят все необходимые для работы компоненты, а cactid является заменой стандартному cmd. php. Он написан на С, использует POSIX и связан с библиотеками net-snmp. Им рекомендуется подменять cmd.php в тех случаях, когда стандартный вариант не справляется с нагрузкой. Актуальной на момент написания статьи была версия 0.8.6j. В версии 0.8.6h, которая доступна в репозитарии, были обнаружены ошибки, связанные с безопасностью, поэтому будем устанавливать из архива. Команда: $ sudo apt-cache depends cacti
в Ubuntu выдает длинный список пакетов. Чтобы не разбираться с ними персонально, лучше использовать команду: $ sudo apt-get -d install cacti
и затем установить с помощью dpkg все пакеты, кроме Сacti. Скачиваем пакет с Сacti: $ wget -c http://www.cacti.net/downloads/cacti-0.8.6j.tar.gz
Распаковываем: $ cd /var/www $ tar -xzvf /tmp/cacti-0.8.6j.tar.gz
На момент установки было доступно четыре патча, устанавливаем их: $ $ $ $ $ $ $ $ $
sudo cd cacti-0.8.6j sudo wget http://www.cacti.net/downloads/patches/ ↵ 0.8.6j/ping_php_version4_snmpgetnext.patch sudo wget http://www.cacti.net/downloads/patches/ ↵ 0.8.6j/tree_console_missing_hosts.patch sudo wget http://www.cacti.net/downloads/patches/ ↵ 0.8.6j/thumbnail_graphs_not_working.patch sudo wget http://www.cacti.net/downloads/patches/ ↵ 0.8.6j/graph_debug_lockup_fix.patch sudo patch -p1 -N < ping_php_version4_snmpgetnext.patch sudo patch -p1 -N < tree_console_missing_hosts.patch sudo patch -p1 -N < thumbnail_graphs_not_working.patch sudo patch -p1 -N < graph_debug_lockup_fix.patch
В примере в качестве рабочего каталога Cacti использован каталог веб-сервера. Можно поместить его в другое место, а в конфигурационном файле веб-сервера указать путь к нему, как это сделано в пакетах Ubuntu: $ cat /etc/cacti/apache.conf Alias /cacti /usr/share/cacti/site <DirectoryMatch /usr/share/cacti/site>
23
администрирование Options +FollowSymLinks AllowOverride None order allow,deny allow from all </DirectoryMatch>
Оба варианта будут работать, поступайте, как вам удобнее. Переименовываем каталог: $ sudo mv cacti-0.8.6j cacti
$database_default = "cacti"; $database_hostname = "localhost"; $database_username = "cactiuser"; $database_password = "cactipassword"; $database_port = "3306";
В пакетах Ubuntu этот участок вынесен в отдельный файл, находящийся в /etc/cacti, который подключен в config.php с помощью Include. Создаем в системе пользователя, от имени которого будут выполняться процессы Cacti:
Если MySQL еще не работает, запускаем его:
$ sudo adduser --no-create-home --disabled-password ↵ --disabled-login cactiuser
$ sudo /etc/init.d/mysql start
Делаем веб-сервер хозяином файлов в каталоге cacti:
Создаем новую базу данных cacti:
$ sudo chown -R www-data:www-data cacti/
$ mysqladmin --user=root create cacti
А в двух подкаталогах внутри пользователя cactiuser:
И заполняем ее, используя подготовленный шаблон:
$ sudo chown -R cactiuser cacti/rra/ cacti/log/
$ mysql -u root cacti < cacti.sql
Теперь даем все необходимые права специальному пользователю: $ mysql -u root cacti mysql> GRANT ALL ON cacti.* TO cactiuser@localhost ↵ IDENTIFIED BY 'cactipassword'; Query OK, 0 rows affected (0.06 sec)
mysql> flush privileges; Query OK, 0 rows affected (0.03 sec)
mysql> quit
Указываем в конфигурационном файле Cacti информацию, необходимую для соединения с базой данных. $ mcedit ./include/config.php /* make sure these values refect your actual database/host/user/password */ $database_type = "mysql";
Далее необходимо обеспечить периодический запуск скрипта poller.php посредством cron: $ sudo mcedit /etc/crontab */5 * * * * cactiuser php /var/www/cacti/poller.php ↵ >/dev/null 2>/var/log/cacti/poller-error.log
На этом установка Cacti завершена. Желательно в первый раз проверить работу вручную: $ sudo php /var/www/cacti/poller.php OK u:0.02 s:0.02 r:1.21 OK u:0.02 s:0.02 r:1.22 OK u:0.02 s:0.02 r:2.14 03/10/2007 03:29:35 PM - SYSTEM STATS: Time:3.2891 Method:cmd.php Processes:1 Threads:N/A Hosts:2 HostsPerProcess:2 DataSources:5 RRDsProcessed:5 OK u:0.02 s:0.02 r:2.19 OK u:0.02 s:0.02 r:2.19
Если вывод скрипта получился такой, идем дальше. Иначе необходимо проверить еще раз, что все сделано правильно.
Создание графиков в Cacti
Рисунок 1. Настройка Cacti
24
Набираем в строке веб-браузера http:// host_name/cacti и попадаем в Cacti Installation Guide, в котором необходимо пройти еще несколько шагов для настройки Cacti. На первом шаге выбираем «New Install» (или «Upgrade from 0.8.x.» при обновлении), здесь же выводится информация, взятая с include/config.php. Следует еще раз проверить ее корректность. Далее скрипт проверяет наличие всех необходимых для работы утилит. Если он их находит, напротив зеленым цветом будет отмечено FOUND, иначе необходимо будет указать полный путь к утилите самостоятельно (см. рис. 1). В этой же вкладке указываем версию SNMP (NET-SNMP 5.x
администрирование или UCD‑SNMP 4.x) и версию RRDTool (1.2 или 1.0). Все настройки затем можно сменить уже в процессе работы, зайдя в «Cacti Settings». После всего нажимаем на «Finish». Теперь регистрируемся как пользователь admin с паролем admin. В следующем окне вас заставят изменить пароль. По умолчанию в Cacti заведен только контроль четырех параметров (память, загрузка процессора, пользователи и процессы) локальной системы. В левом верхнем углу страницы две вкладки: n Console – здесь настраиваются графики, параметры Cacti, учетные записи пользователей, расположены некоторые утилиты; n Graphs – здесь найдете все графики, созданные в console. Дальнейшая работа будет состоять из трех вариантов: n создание нового сетевого устройства; n создание графиков для старых и новых устройств; n проверка их работоспособности. Для создания нового устройства выбираем в первом окне ссылку «Create devices» или в поле «Management → Devices». В появившемся окне заведен только localhost. Если в поле Status напротив localhost установлено «Disabled», включаем его. Для этого отмечаем нужное устройство флажком, затем в списке «Choose an action» выбираем «Enable», в следующем окне подтверждаем включение нового устройства. Для добавления нового устройства нажимаем Add в правом верхнем углу и в появившемся окне заполняем описание (Description) имя или IP-адрес узла. В Host Template указываем шаблон и параметры SNMP (см. врезку «Настройка SNMP») (см. рис. 2). После нажатия кнопки «Create» переходим в следующее окно. Если Cacti удалось соединиться с указанным узлом, информация о нем будет выведена в самом верху страницы. Иначе появится надпись «SNMP Failed», следует вернуться и проверить настройки. Это окно похоже на предыдущее, только добавились два поля «Associated Graph Templates» и «Associated Data Queries».
№4, апрель 2007
Рисунок 2. Создание нового устройства
Обратите внимание на столбец ем новое устройство и затем, выбрав Debugging, нажав на ссылку «Verbose в том же списке «Place on a tree», помеQuery» напротив сформированного щаем его в дерево устройств. Теперь графика, можно просмотреть запрос новое устройство и его графики будут и его результат (см. рис. 3). доступны для просмотра во вкладке Таким образом, на этапе настрой- «Graphs» (см. рис. 4). ки можно выяснить, будет ли работать этот график. После добавления Настройка вкладки в «Associated Graph Templates» в по- «Console» ле Status появится надпись «Not Being Все созданные графики можно найти Graphed». Это означает, что график еще в меню «Graph Management», где их не сформирован, и это пока не должно можно быстро копировать, удалить, вас волновать. После первого же запро- создать на их основе новый шаблон, са здесь появится «Is Being Graphed», изменить узел. По умолчанию все грарядом с которой будет надпись «Edit». фики будут выводиться в корне деНажатие на нее позволит отредактиро- рева, если количество узлов велико, вать параметры этого графика. зайдя в «Graph Trees», можно создать После добавления шаблонов нажи- новые ветки дерева, разместив в нем маем «Create Graphs for this Host» и пе- графики более логично. В «Sorting реходим в страницу создания графи- Type» вверху страницы можно выков, отмечаем нужные и еще раз на- брать вид сортировки. Изначально усжимаем «Create». Здесь для уточне- тановлена ручная сортировка, для пения доступны: цвет и тип будущих гра- ремещения графиков по ветке дерева фиков, максимальное значение пара- следует использовать стрелки. Можметров, подпись и прочее. Вернувшись но выбрать сортировку по имени или обратно в дерево устройств, включа- по номеру.
Настройка SNMP Для того чтобы настроить поддержку SNMP в Linux, вам понадобится пакет snmpd (или net-snmp). После его установки вводим «snmpconf -i» и далее в интерактивном режиме отвечаем на вопросы. Пунктов и подпунктов здесь достаточно. Минимум, что требуется сделать – выбрать в первом окне конфигурационный файл snmpd.conf, затем «Access Control Setup»,
здесь несколько вариантов, для большинства ситуаций подойдет «SNMPv3 readonly user», далее ввести имя пользователя, уровень безопасности и OID этого коммьюнити. Теперь переходим в секцию «Agent Operating Mode», выбираем «The IP address and port number that the agent will listen on» и указываем интерфейс, на котором будет агент отдавать данные. Конечно это не все, но для минимальной работы хватит.
25
администрирование
Рисунок 3. Просмотр свойств запроса при создании графика
Рисунок 4. Графики Cacti
Рисунок 5. Журнал работы Cacti
26
Следует ознакомиться и с параметрами в «Configuration → Setting», здесь имеется шесть вкладок: n General – настройка информации, заносимой в журнал, и куда будут заноситься события (файл/ syslog), на этапе отладки, следует включить «Poller Logging Level» в HIGH или DEBUG, чтобы полностью контролировать все запросы, здесь же настраиваются параметры SNMP; n Paths – указываются пути ко всем утилитам, используемым Cacti, а также, если нужно, и cactid; n Poller – настройка работы системы сбора информации, здесь можно переключаться между cmd.php или cactid, а также настраивается проверка доступности узлов; n Graph Export – здесь можно настроить экспорт графиков (в том числе и автоматический) в локальный файл или по протоколу ftp, sftp; n Visual – параметры вывода графиков, размерность сетки, размер шрифта и прочее; n Authentication – аутентификация пользователей, локальная или LDAP, и настройки сервера LDAP. В меню «Utilities → System Utilities» можно просмотреть журнал работы Cacti. Удобно, что в зависимости от результата записи имеют разный цвет (см. рис. 5), что помогает визуально определить неудачные запросы, причем можно сразу же перейти по гиперссылке в настройку устройства или отдельного графика. Отсюда же можно просмотреть журнал захода пользователей, кэш Pollerа и SNMPзапросов. По умолчанию в Cacti созданы два пользователя admin и guest. Последний не имеет пароля и позволяет пользователю только просматривать графики загрузки локальной системы. Для добавления пользователей переходим в «User Management» и выбираем «Add». Появится окно редактирования свойств нового пользователя. На первой странице вводим имя, пароль пользователя (ак тивация «User Must Change Password at Next Login» заставит пользователя сменить пароль при первой регистрации),
администрирование в «Login Options» указываем, что будет выведено после регистрации. Теперь появились еще три вкладки: «Realm Permissions», «Graph Permissions» и «Graph Settings», в которых более тонко настраиваются параметры доступа к графикам. В «Realm Permissions» указываем на операции, которые сможет осуществлять пользователь. После выбора нужных параметров нажимаем «Create». Пользователь пока не активирован, следует еще раз выбрать настройку пользователя.
Установка плагинов Cacti Без краткого рассказа о плагинах Cacti статья была бы неполной. Cacti – самодостаточная система, и в большинстве случаев ее возможностей должно Рисунок 6. Результат работы плагина tools хватить, но с помощью плагинов мож$plugins = array(); но несколько расширить ее функциональность. Устанавливаются плагины очень просто. Сначала необходимо пропатчить Cacti. Это можно сделать на уже работающей системе Для того чтобы добавить к нему плагин, в строке нибез какого-либо ущерба. же дописываем элемент с названием каталога установленного плагина. Для некоторых плагинов это единствен$ cd cacti; sudo tar -xzvf /home/grinder/source/cacti/ ↵ ное, что требуется сделать для их установки. В нашем слу cacti-plugin-arch.tar.gz чае это discovery. $ sudo patch -p1 -N < cacti-plugin-arch/ ↵
cacti-plugin-0.8.6j.diff $plugins[] = 'discovery';
Проверяем параметры внутри config.php, кроме того, в нем появились новые строки, требующие редактирования. Так, строка: $config['url_path'] = "/";
означает, что при обращении к серверу Cacti используется адрес http://host_name/, если вводится адрес вроде http:// host_name/cacti/, следует строку изменить на: $config['url_path'] = "/cacti/";
Теперь установим один из плагинов, у каждого есть свои особенности. Например, Discovery устанавливается так. Переходим в подкаталог cacti/plugins, который был создан при установке патча: $ cd cacti/plugins
Распаковываем архив: $ tar xzvf discovery-0.7.tar.gz
Создаем новые таблицы. $ mysql -u root -p cacti < discovery/discover.sql
Каждый плагин описан в массиве $plugins файла config.php. Изначально в нем записей нет.
№4, апрель 2007
Теперь в «Configuration → Setting» появилась еще одна вкладка «Misc», предназначенная для настроек плагинов. Для discovery в ней требуется указать подсеть для сканирования, метод сканирования (ICMP, TCP, UDP), коммьюнити SNMP и период. После этого discovery будет сообщать вам, если найдет узел, поддерживающий SNMP и неизвестный Cacti. Неплохой плагин tools, после его установки в «Console → Utilities» появится новое меню, в котором можно будет проверять работу сервисов на указанном узле или просматривать ответ SNMP (см. рис. 6). Советую также установить и плагин thold, с помощью которого можно отсылать сообщения. После его установки (только запись в config.php) в «Setting» появится еще одна вкладка. В ней требуется указать лишь почтовые адреса, на которые будут приходить сообщения, события (ошибки, тревоги и прочие), и способ отправки (PHP, SMTP, Sendmail) c необходимыми параметрами доступа. Появится и отдельная вкладка «Threhld», в которой можно затем их просмотреть оптом. Настройка любой системы мониторинга – задача кропотливая и весьма индивидуальная, поэтому обо всех вариантах рассказать не получится. Но, как видите, Cacti – очень простая в установке и использовании система, которая позволяет настроить систему мониторинга человеку, незнакомому со всеми тонкостями SNMP. 1. Сайт проекта Cacti – http://cacti.net. 2. Сайт проекта CactiUsers – http://cactiusers.org.
27
администрирование
Как проводить сбор системных сообщений в гетерогенной сети
Андрей Бирюков В больших сетях важна задача сбора системных событий, от успешного решения которой зависит работоспособность организации в целом. Рассмотрим сбор и передачу информации между Windows и UNIX-системами.
С
редства сбора отладочной информации, журналы событий, средства мониторинга – неотъемлемые части операционной системы. Без этих средств работа системного администратора была бы во много раз сложнее, ведь зачастую обнаружить источник проблемы без детального изучения журналов событий бывает невозможно. Учитывая, что даже сеть организации средних размеров сейчас может содержать более десяти серверов, проблема сбора данных о работе системы тесно связывается с проблемой обработки данной информации. Обработку можно производить с помощью таких продуктов, как Microsoft Operations Manager, о котором я уже рассказывал в предыдущих статьях (см. №10, 11 за 2006 год). Но что делать, если сеть имеет гетерогенную структуру, а на серверах установлены различные операционные системы? UNIX-системы и большинство производителей активного сетевого оборудования используют протокол Syslog для отправки системных сообщений.
28
Мне приходилось сталкиваться с ситуациями, когда для системных администраторов серверы под управлением Windows были «белым пятном» в системе уведомления о событиях, так как весь обмен сообщениями ведется посредствам Syslog, а в Windows эта служба не реализована. Как правило, решением в такой ситуации являлись либо собственные разработки или же сторонние решения. Однако у Microsoft тоже имеется программный продукт, который помимо прочих задач позволяет собирать логи от служб и приложений и отправлять сообщения посредствам Syslog.
Средство сбора информации Система Log Parser 2.2 [1] – мощный инструмент для доступа и обработки текстовых данных, таких как журнал событий Windows Event Log, XMLи CSV-файлы, реестр, и других текстовых файлов. Архитектура системы изображена на рис. 1. Слева – источники данных, как видите, их мно-
го, и главное, можно определять собственные. Ядром системы является SQLLite Engine Core, фактически это реализация языка SQL с аналогичным синтаксисом, так администраторам, знакомым с этим языком, будет несложно разобраться в синтаксисе, используемом данной программой. И наконец, слева мы видим пять «приемников» данных, это структурированные текстовые файлы, базы данных, таблицы, SYSLOG и вывод на экран. Хотя в моей статье основной упор делается на передачу системных сообщений посредствам SYSLOG, при желании вы сможете без особых проблем разобраться с передачей данных другим «приемникам». Итак, прежде всего определимся с задачей, которую нам необходимо решить. Пусть имеется некий сервер под управлением UNIX-системы, на который стекаются системные сообщения со всех системных устройств: серверов, маршрутизаторов, коммутаторов и т. д. На этом сервере осуществляется разбор всех сообщений и сортиров-
администрирование Уровни важности для сообщений ка по степени важности, источнику и другим Цифровой код Наименование приоритета критериям. Средство, 0 emerg которым может про1 alert изводиться разбор, мы 2 crit сейчас рассматривать 3 err не будем, скажу лишь, 4 warning что это может быть как 5 notice сценарий на Perl или 6 info Python собственного написания, так и серь7 debug езное коммерческое решение (к примеру Tivoli Security Operations Manager). Наша задача – передавать системные сообщения от Windowsсерверов, в частности, нас интересуют события системного журнала на контроллере домена Active Directory, события сервера Microsoft SQL 2000 и неудачные запросы на внутреннем корпоративном портале, под управлением Microsoft IIS.
Протокол SYSLOG Сообщение SYSLOG имеет следующую структуру: <Приоритет>Дата -время ИМЯ_УЗЛА Метка:Сообщение.
n Приоритет PRI. Например: <14>. Поле «приоритет» выделяется угловыми скобками и содержит целочисленное значение, построенное следующим образом: первые семь бит – это приложение, которое отправило сообщение, последние три – это важность сообщения. Перечислять приложения я не буду, при желании их список можно найти в любом справочнике по операционной системе Linux. Список возможных уровней важности для сообщения приведу в таблице, так как это нам потребуется в дальнейшем. n Заголовок HEADER. Например: Nov 11 16:05:33 MYSERVER-M. Заголовок содержит следующие два элемента: локальные дату и время, когда это сообщение было создано; имя узла, который отправил сообщение. n Сообщение MSG. Например: LogParser:The service was started. Эта часть состоит также из двух элементов: наименование приложения, отправившего сообщение, отделенного двоеточием («:»); непосредственно текст сообщения.
простейшего запроса на выборку достаточно использовать команду SELECT со следующим синтаксисом: SELECT * FROM Application
Такой запрос вернет все события журнала Application. Для того чтобы выполнить этот запрос в Log Parser и вывести результат на экран, необходимо набрать в командной строке следующее: LogParser "SELECT * FROM Application"
Но для больших запросов такой способ ввода не слишком удобен, гораздо удобнее создать .sql-файл, в котором и написать текст запроса. Тогда для запуска достаточно будет написать следующее: LogParser file:query.sql
Итак, напишем несколько запросов, осуществляющих выборку из различных источников данных. Напомню, что в контексте поставленной задачи нам необходимо выбрать системные сообщения от Windows-серверов, события сервера Microsoft SQL 2000 и Microsoft IIS.
Системные события Windows Начнем с аудита событий Windows, в частности с попыток неудачного входа в систему. Следующий сценарий выводит пользователей и количество неудачных попыток входа в систему для каждой учетной записи: SELECT STRCAT( EXTRACT_TOKEN( Strings, 1, '|'), STRCAT( '\\', EXTRACT_TOKEN( Strings, 0, '|'
В результате текст сообщения SYSLOG может выглядеть следующим образом: <14>Nov 11 16:05:33 MYSERVER-M LogParser:The service was started.
Как видите, формат сообщений SYSLOG довольно прост, и при необходимости вы можете без труда написать сценарий, осуществляющий, к примеру, выборку всех сообщений об ошибках важности err за последние сутки от системы аутентификации.
Язык запросов Рассмотрим язык запросов Log Parser. Как уже упоминалось ранее, этот язык схож с SQL. То есть для построения
№4, апрель 2007
Рисунок 1. Архитектура Log Parser
29
администрирование ) ) ) AS User, COUNT(*) AS Total FROM Security WHERE EventType = 16 AND EventCategory = 2 GROUP BY User ORDER BY Total DESC
Аргументы команды SELECT в этом запросе строят строку вида «Домен\Имя_пользователя количество обращений». Далее FROM указывает, из какого журнала событий необходимо извлекать данные, WHERE определяет условия, в этом случае тип события и категорию – Logon Type. Далее группируем вывод по именам пользователей и организовываем вывод по убывающей. Вот еще один пример, выводящий более подробную статистику с пояснениями по каждому конкретному событию: SELECT COUNT(EventID) AS TotalLogonFailures, TO_LOWERCASE(EXTRACT_TOKEN(Strings,0,'|')) AS User, TO_LOWERCASE(EXTRACT_TOKEN(Strings,1,'|')) ↵ AS Domain, TO_LOWERCASE(EXTRACT_TOKEN(Strings,5,'|')) ↵ AS WorkStation, CASE TO_INT(EXTRACT_TOKEN(Strings,2,'|')) WHEN 2 THEN 'Interactive ' WHEN 3 THEN 'Network' WHEN 4 THEN 'Batch' WHEN 5 THEN 'Service' WHEN 6 THEN 'Proxy ' WHEN 7 THEN 'Unlock ' WHEN 8 THEN 'NetworkCleartext' WHEN 9 THEN 'NewCredentials ' WHEN 10 THEN 'RemoteInteractive ' WHEN 11 THEN 'CachedInteractive' WHEN 12 THEN 'CachedRemoteInteractive' WHEN 13 THEN 'CachedUnlock' ELSE EXTRACT_TOKEN(Strings,2,'|') END AS Type INTO DATAGRID FROM \\%machine%\security WHERE EventID IN (529) GROUP BY User,Domain,WorkStation,Type ORDER BY TotalLogonFailures DESC
В результате работы этого запроса помимо обычного вывода на консоль также будет выведен отчет в специальное окно, которое позволяет администратору в более удобном виде просматривать статистику неудачных соединений (см. рис. 2). Следует также обратить внимание на то, что для выполнения запроса требуется запустить Log Parser со следующими параметрами: Logparser file:query.sql?machine=Имя_машины
где в качестве значения machine указывается имя целевой машины, на которой будет просматриваться журнал событий и осуществляться выборка по соответствующему критерию. Для аудита всех Windows-серверов в домене вам совершенно необязательно ставить систему на все машины. Достаточно поставить LogParser на один сервер или даже рабочую станцию и запустить под учетной записью с правами, достаточными для просмотра журнала событий. Не забывайте о том, что журнал Security в отличие от двух других журналов имеет более жесткие требования к соблюдению прав пользователя, который пытается его прочесть. Многие администраторы не любят различные системы монито-
30
Рисунок 2. Таблица отчетов
ринга из-за того, что они требуют устанавливать свои агенты на все контролируемые сервера и это якобы может привести к падению сервера или же замедлению его работы. Но Log Parser позволяет работать удаленно с другими серверами, не требуя при этом установки каких-либо приложений или сценариев на данные машины. Итак, на основе этих примеров, а также запросов, которые находятся в каталоге Samples/Queries Log Parser, вы можете без особого труда построить свой собственный запрос.
Мониторинг SQL-сервера Следующая задача, которую нам необходимо решить, – это получение информации из журнала событий Microsoft SQL‑сервера. Так как этот продукт хранит журнал событий в текстовом файле, то на основе запросов, которые будут приведены далее, можно без труда составить свой собственный для обработки любого текстового файла. Microsoft SQL Server 2000 хранит в журнале событий информацию обо всех событиях. В качестве примера нас будут интересовать все сообщения, связанные с базой данных master. Это основная системная база, и любой сбой или попытка несанкционированного доступа к ней могут привести к весьма печальным последствиям. На моем сервере искомый журнал событий находится в каталоге C:\Program Files\Microsoft SQL Server \LOG. Файлы имеют имена вида ERRORLOG.* и создаются каждый раз при запуске службы SQL Server, файл текущей сессии именуется ERRORLOG. Так как нас интересует текущая сессия, то соответственно просматривать будем только файл ERRORLOG. В простейшем случае такой запрос будет иметь следующий вид: SELECT Text FROM ERRORLOG WHERE Text LIKE '%master%' GROUP BY Text
Но этот запрос будет возвращать все записи, которые будут найдены в файле, независимо от времени их создания. Согласитесь, что это не слишком удобно. Особенно если мы собираемся запускать LogParser регулярно (например, каждые пять минут) для сбора актуальной статистики. Таким образом, нам необходимо написать запрос, который будет проверять наличие записей, к примеру, за последнюю минуту. Читателям, искушенным в программировании на SQL, предлагается сделать это посредством дан-
администрирование ного языка, однако я предпочитаю воспользоваться средствами VBscript. Option Explicit Dim objShell, stroka
// Объявляем переменные
stroka="LogParser ""SELECT Text FROM ERRORLOG WHERE ↵ (Text LIKE '%" & Date() &" " & Time() &"%') ↵ AND (Text LIKE '%master%') GROUP BY Text""" // В данном случае удобнее передать запросы LogParser // в командной строке, а не в отдельном файле ищем строку, // содержащую текущую дату и время (без секунд), и название // базы master // Объект командная строка Set objShell = CreateObject("WScript.Shell") // Выполняем строку с переданным запросом objShell.run (stroka) WScript.Quit // Завершаем работу сценария
Как видите, сценарий довольно прост в написании, и внести в него необходимые изменения можно без особого труда. Такой сценарий можно прописать для ежеминутного запуска в системе. Файл журнала, как правило, небольшой, и это не вызовет большой нагрузки на систему.
Сбор ошибок веб-сервера Итак, нам осталось получить системные сообщения от службы IIS, которая используется для внутреннего вебсайта. По умолчанию журнал событий находится в каталоге C:\WINDOWS\system32\LogFiles. Проверить место хранения можно, открыв консоль Internet Information Services (IIS) Manager, далее раскрыть Web Sites (или FTP, при необходимости) и в свойствах нужного веб-узла, например Default Web Site, посмотреть свойства Logging Properties. В открывшемся окне вы увидите путь к журналу событий веб-сервера. Для того чтобы получить, к примеру, информацию об ошибках выполнения сценариев Active Server Pages, можно воспользоваться следующим запросом к Log Parser: // Адрес URI SELECT EXTRACT_TOKEN(FullUri, 0, '|') AS Uri, // Сообщение об ошибке EXTRACT_TOKEN(cs-uri-query, -1, '|') AS ErrorMsg, // Номер строки EXTRACT_TOKEN(cs-uri-query, 1, '|') AS LineNo, COUNT(*) AS Total // Количество строк USING STRCAT( cs-uri-stem, REPLACE_IF_NOT_NULL(cs-uri-query, ↵ STRCAT('?', cs-uri-query))) AS FullUri FROM ex*.log // Файлы, из которых делать выборку // Условие выборки WHERE (sc-status = 500) AND (cs-uri-stem LIKE '%.asp') GROUP BY Uri, ErrorMsg, LineNo ORDER BY Total DESC
Такой запрос может быть полезен при тестировании и отладке корпоративных веб-ресурсов. А вот следующий запрос сообщит обо всех неудачных попытках аутентификации: SELECT cs-username, sc-status, COUNT(*) AS Total FROM ex*.log // Коды ошибок WHERE cs-username IS NOT NULL AND sc-status BETWEEN 401 ↵ AND 403 GROUP BY cs-username,sc-status // Имя пользователя ORDER BY Total DESC
№4, апрель 2007
Рисунок 3. Сообщения в файле журнала SYSLOG
В уже упоминавшемся ранее каталоге Samples приводится ряд запросов, которые помогут вам лучше разобраться в вопросах взаимодействия с IIS для написания собственных запросов.
Передаем информацию на сервер Итак, мы разобрались в вопросах обработки журналов событий с помощью запросов Log Parser и теперь приступим к реализации передачи системных сообщений средствами SYSLOG. Как видно, формат сообщений о системных событиях несколько отличается от используемого в журнале событий Windows Event Log и других журналах, в аспектах, касающихся различных приоритетов. В следующем запросе мы передадим на сервер SYSLOG с именем MYSERVER04 все сообщения из журнала System, при этом каждому системному событию будет присвоен определенный приоритет в соответствии с типом события в журнале Event Log. Также сообщению будет добавлен источник (см. рис. 3). Но перед тем как запустить Log Parser, обращаю ваше внимание на то, что в командной строке необходимо использовать следующий синтаксис: LogParser file:query.sql -o:SYSLOG
где ключ -о со значением SYSLOG указывает на формат отправляемых сообщений. SELECT TimeGenerated, // Время создания CASE SourceName // Смотрим источник сообщения // В зависимости от источника события в формате // EventLog, создаем источник в формате SYSLOG WHEN 'EventLog' THEN 'mark' WHEN 'Service Control Manager' THEN 'daemon' WHEN 'Print' THEN 'lpr' WHEN 'Kerberos' THEN 'auth' WHEN 'NETLOGON' THEN 'logaudit' WHEN 'Application Popup' THEN 'local7' ELSE 'local0' END AS MyFacility, // Здесь в зависимости от типа события // определяем важность SYSLOG CASE EventTypeName WHEN 'Error event' THEN 'err' WHEN 'Warning event' THEN 'warning' WHEN 'Information event' THEN 'info' ELSE 'info' END AS MySeverity, ComputerName, // Имя машины отправителя STRCAT(SourceName, ':'), // Имя в формате SYSLOG Message // Сообщение // Сообщения отправляются на сервер SYSLOG и в локальный файл INTO @MYSERVER04,Log.txt FROM System // Журнал System
31
администрирование В результате работы этого запроса в файле SYSLOG на сервере MYSERVER04 получаем сообщения следующего вида: <46>Apr 18 19:20:07 MYSERVER-M LogParser:EventLog: The Event log service was started. <30>Apr 18 19:20:47 MYSERVER-M LogParser:Service Control Manager: The Telephony service entered the running state. <46>Apr 18 19:33:17 MYSERVER-M LogParser:EventLog: The Event log service was stopped. <134>Apr 19 07:01:57 MYSERVER-M LogParser:Ati HotKey Poller: The service was started.
А вот другой пример, аналогичный тому, который мы разбирали в разделе, посвященном работе с IIS. Здесь на сервер SYSLOG передаются все сообщения об ошибках сервера, таких как отсутствие доступа (403), отсутствие файла (404) или же внутренняя ошибка сервера (500). SELECT TO_TIMESTAMP(date, time), CASE sc-status WHEN 500 THEN 'emerg' // Определяем тип события ELSE 'err' END AS MySeverity, s-computername AS MyHostname, // Имя машины cs-uri-stem, sc-status INTO @MYSERVER04 // Источник передается как параметр в командной строке FROM <1> WHERE sc-status >= 400 // Номер ошибки 400 и более
В результате получаем на сервере SYSLOG сообщения следующего вида: <115>Nov <115>Nov <115>Nov <115>Nov <115>Nov <115>Nov
18 18 18 18 18 18
00:28:59 00:29:00 00:29:01 00:29:02 00:29:04 00:29:05
MYSERVER04 MYSERVER04 MYSERVER04 MYSERVER04 MYSERVER04 MYSERVER04
IIS:/images/tibg.gif 404 IIS:/aa.css 404 IIS:/images/tibg.gif 404 IIS:/images/tibg.gif 404 IIS:/gorice/rulesinfo.nsf 403 IIS:/_vti_inf.html 404
Как видите, сообщения информативны, так что с их помощью вполне можно построить отчет, содержащий информацию о попытках некорректного обращения к ресурсам веб-узла. Теперь подправим запросы, которые были написаны ранее для Active Directory, и SQL. Запрос для IIS был только что приведен, поэтому его мы рассматривать не будем. SELECT
CASE SourceName // Смотрим источник сообщения // В зависимости от источника события в формате // EventLog, создаем источник в формате SYSLOG WHEN 'EventLog' THEN 'mark' WHEN 'Service Control Manager' THEN 'daemon' WHEN 'Print' THEN 'lpr' WHEN 'Kerberos' THEN 'auth' WHEN 'NETLOGON' THEN 'logaudit' WHEN 'Application Popup' THEN 'local7' ELSE 'local0' END AS MyFacility, // Здесь в зависимости от типа события определяем // важность SYSLOG CASE EventTypeName WHEN 'Error event' THEN 'err' WHEN 'Warning event' THEN 'warning' WHEN 'Information event' THEN 'info' ELSE 'info' END AS MySeverity, ComputerName, // Имя машины отправителя // Имя в формате SYSLOG STRCAT(SourceName, ':'), // Сообщение COUNT(EventID) AS TotalLogonFailures, TO_LOWERCASE(EXTRACT_TOKEN(Strings,0,'|')) AS User,
32
TO_LOWERCASE(EXTRACT_TOKEN(Strings,1,'|')) ↵ AS Domain, TO_LOWERCASE(EXTRACT_TOKEN(Strings,5,'|')) ↵ AS WorkStation, CASE TO_INT(EXTRACT_TOKEN(Strings,2,'|')) WHEN 2 THEN 'Interactive ' WHEN 3 THEN 'Network' WHEN 4 THEN 'Batch' WHEN 5 THEN 'Service' WHEN 6 THEN 'Proxy ' WHEN 7 THEN 'Unlock ' WHEN 8 THEN 'NetworkCleartext' WHEN 9 THEN 'NewCredentials ' WHEN 10 THEN 'RemoteInteractive ' WHEN 11 THEN 'CachedInteractive' WHEN 12 THEN 'CachedRemoteInteractive' WHEN 13 THEN 'CachedUnlock' ELSE EXTRACT_TOKEN(Strings,2,'|') END AS Type, message INTO @MYSERVER04 FROM \\%machine%\security WHERE EventID IN (529) GROUP BY User,Domain,WorkStation,Type ORDER BY TotalLogonFailures DESC
На сервер Syslog будут переданы сообщения в соответствии с описанным форматом. При этом перед каждым сообщением будет выводиться информация об источнике события. В сценарий, обрабатывающий журнал событий SQL, я не буду добавлять фрагмент запроса, касающийся важности и источника события, дабы не загромождать статью. Option Explicit Dim objShell, stroka // Объявляем переменные stroka="LogParser ""SELECT Text INTO @MYSERVER04 ↵ FROM ERRORLOG WHERE (Text LIKE '%" & Date() &" ↵ " & Time() &"%') AND (Text LIKE '%master%') ↵ GROUP BY Text""" // В данном случае удобнее передать запросы LogParser // в командной строке, а не в отдельном файле. Ищем строку, // содержащую текущую дату и время (без секунд), и название // базы master // Объект командная строка Set objShell = CreateObject("WScript.Shell") // Выполняем строку с переданным запросом objShell.run (stroka) WScript.Quit // Завершаем работу сценария
В результате работы этого сценария на сервер SYSLOG будут переданы искомые сообщения о состоянии SQL-сервера. В завершение хотелось бы упомянуть о средствах обработки сообщений на самом сервере SYSLOG. Тем, кто не использует какие-либо готовые решения, это может оказаться полезным. Для написания сценариев обработки на языке Perl можно воспользоваться интерфейсом Sys::Syslog, позволяющим более гибко работать с сообщениями Syslog при решении задач администрирования [2]. Также хочу напомнить о каталоге Samples, в котором помимо примеров запросов имеются примеры сценариев, файлов шаблонов и различных средств программирования, которые могут быть полезны. 1. Дистрибутив Log Parser – http://www.microsoft.com/downloads/ details.aspx?FamilyID=890cd06b-abf8-4c25-91b2-f8d975cf8c07 &displaylang=en. 2. Интерфейс Syslog – http://perldoc.perl.org/Sys/Syslog.html.
администрирование
Sender Policy Framework как средство борьбы со спамом
Сергей Яремчук Интернет разрабатывался как закрытая военная сеть, со временем сеть стала открытой, всплыли просчеты, результат которых – DOS-атаки, подделка имен DNS, черви, спам и многое другое. Все это реалии сегодняшнего Интернета. Технология Sender Policy Framework – лишь одна из попыток исправить ситуацию.
Технологии борьбы со спамом в RFC Изменить действующие технологии в глобальном масштабе уже невоз‑ можно. Это потребует колоссальных затрат, как временных, так и финан‑ совых. Поэтому все наработки по‑ являются в виде расширений к уже действующим протоколам. Так, Sender Policy Framework (структура полити‑ ки отправителя) является еще одним расширением к протоколу отправки электронной почты SMTP (Simple Mail Transfer Protocol). Протокол SMTP, заменивший в 80‑х годах UUCP, не поддерживает еди‑ ной схемы авторизации пользователя при отправке сообщения. В результа‑ те можно легко отправить сообщение, указав в команде MAIL FROM произ‑ вольный, в том числе и несуществую‑ щий почтовый адрес отправителя. Та‑ кое поведение нормально, ведь изна‑ чально протокол предусматривал и си‑ туацию, когда автор сообщения и его отправитель не одно и то же лицо. Да и понятие отправителя SMTP весьма за‑
34
путанно. Под этот термин попадают заголовки From, Sender, Resent-From и даже Envelope-from (заголовок, вы‑ рабатываемый почтовыми програм‑ мами). Результатом стало появление не‑ скольких рекомендаций и дополне‑ ний к SMTP. Так, в RFC 2505 от февра‑ ля 1999 года, который так и назывался «Anti-Spam Recommendations for SMTP MTAs» дана оценка спаму как явлению, заговорили о необходимости борьбы со спамом, который в то время уже до‑ стиг высокого уровня. И дано 13 реко‑ мендаций, выполнение которых помо‑ жет уменьшить количество спама. В частности рекомендовалось подтверждение FQDN (Fully Qualified Domain Name) отправителя сообщения, то есть проверка address → name долж‑ на соответствовать name → address, и обсуждены все проблемы, которые могут возникнуть при такой проверке. Все события должны регистрировать‑ ся, в SMTP-серверах должна быть за‑ ложена возможность блокировки узла, сети или конкретного отправителя.
Именно отсюда берет начало за‑ кат эры open relay-серверов, так как первым пунктом рекомендации гово‑ рится о необходимости аутентифи‑ кации пользователя перед отправ‑ кой сообщения. Кстати в этом же го‑ ду 1 марта открытым форумом ISP (http://www.ofisp.org) был одобрен до‑ кумент «Нормы пользования сетью» (Acceptable Use Policy), который рег‑ ламентировал нормы работы в сети, в том числе и ограничение на инфор‑ мационный шум (спам) и был обязате‑ лен для всех пользователей. Следующий вполне логичный этап – появление специального расшире‑ ния Simple Authentication and Security Layer (SASL), которое позволяет кли‑ енту SMTP указать серверу механизм аутентификации, произвести обмен по выбранному протоколу аутентифика‑ ции для идентификации отправителя путем нового вызова «AUTH». Все это описано в RFC 2554 «SMTP Service Extension for Authentication», вышед‑ шем в марте 1999 года (то есть через месяц после RFC 2505).
администрирование Параллельно развивались много‑ численные фильтрационные методы, Sender ID использующие статистический ана‑ Беглое знакомство с технологией SenderID лиз содержания письма (здесь наибо‑ (Sender ID: Authenticating E-Mail), предлага‑ лее популярны решения, работающие емой компанией Microsoft, может вызвать по алгоритму, основанному на теоре‑ ощущение дежа-вю. Такое впечатление, ме Байеса), системы определения при‑ что это SPF в вольном пересказе студентазнаков массовости сообщения, а также троечника. Здесь есть все то же, что и в SPF, различные варианты цветных списков: только для идентификации источника сооб‑ DNS Black List (DNSBL), серый и бе‑ щений будет использован метод Purported Responsible Address (PRA, предположи‑ лый списки.
Технология Sender Policy Framework
тельный ответственный адрес), которо‑ му посвящен целый RFC 4407 «Purported Responsible Address in E-Mail Messages». Разница между отправителем в SPF и за‑ гадочным PRA в SenderID заключается в том, что первые проверяют адрес отпра‑ вителя сообщений, а вторые – запись о ре‑ гистрации адреса последнего отправителя, то есть источник сообщения на последнем этапе пересылки. Если такового нет, то по‑ лучается SPF=Sender ID. Краткое описание работы Sender ID на сайте Microsoft до боли напоминает SPF (а чтобы понять, что хоте‑ ли сказать RFC, потребуется, как минимум, пара бутылок пива). Появление Sender ID в свое время вы‑ звало просто невероятный шквал крити‑ ки, особенно со стороны сообщества Open Source. Эксперты, входящие в рабочую группу MARID, решили, что использование в качестве стандартов технологий, которые могут оказаться запатентованными, не‑ приемлемо. Противоречивые условия ли‑
Технология Sender Policy Framework (SPF) является открытым стандар‑ том и определена в RFC 4408 «Sender Policy Framework (SPF) for Authorizing Use of Domains in E-Mail, Version 1» или SPFv1, который был опубликован в апреле 2006 года. Начало разработок датировано июнем 2003 года (хотя были и пред‑ шественники), тогда проект имел дру‑ гое название – Sender Permitted From или SMTP+SPF. После распада груп‑ пы MTA Authorization Records in DNS (MARID), которая занималась продви‑ жением стандарта, название было сменено (февраль 2004 года). В июле 2005 года SPF был одоб‑ рен группой, занимающейся стан‑ дартизацией Интернета IESG (Internet Engineering Steering Group) для экспе‑ римента IETF (Internet Engineering Task Force) и оформлен в виде рабочего несколько отличавшихся между собой, проекта – draft (http://www.schlitt.net/ поэтому вариант RFC 4408 принято spf/spf_classic/draft-schlitt-spf-classic- называть Classic SPF. Суть новой тех‑ нологии проста. Администратор поч‑ 02.html). Сама технология была разработа‑ тового домена с помощью специаль‑ на Менгом Уэнгом (Meng Weng), осно‑ ной SPF-записи в DNS-зоне перечис‑ вателем компании POBOX, некоторое ляет «разрешенные» адреса, с кото‑ время вся информация по SPF разме‑ рых может отправляться почта. То есть, щалась на сайте http://spf.pobox.com. например, администратор домена В настоящее время проект сменил example.org указывает, какие машины уполномочены отсылать электронную прописку [4]. До весны 2004 года разработки почту, адрес «MAIL FROM» у которой велись вяло. Затем технология полу‑ заканчивается на «@example.org». Сер‑ чила широкую известность, а круп‑ вер, получивший сообщение из этого ные компании вроде Google, Altavista, домена, сверяет IP-адрес с SPF-запи‑ AOL, Amazon, еBay, GMX, W3C и дру‑ сью. Если отправитель указан в спис‑ гие, как сговорившись, разом объяви‑ ке «разрешённых» адресов, то письмо ли о ее внедрении. Все это сопровож‑ считается прошедшим проверку. Ина‑ далось изрядной шумихой и мощной че, в зависимости от используемой рекламной кампанией, и некоторое политики сообщение отвергается или время создавалось впечатление, что помечается как подозрение на спам. Кроме этого, RFC настоятельно ре‑ спам будет побежден. После первой публикации появи‑ комендует проверять и тождество по‑ лось несколько вариантов на тему SPF, ля «HELO».
№4, апрель 2007
цензирования, к тому же некоторое время не доступные для общественности, и не‑ совместимость с классическим SPF при‑ вели к тому, что от использования в своих продуктах Sender ID сразу же отказались сообщества разработчиков Apache, Debian, SendMail, QMail, Exim и другие. В конце октября 2004 года была пред‑ ставлена обновленная версия Sender ID, в разработке которой участвовал Менг Уэнг. Она уже была частично совместима с SPF и поддерживала оригинальный син‑ таксис SPF (при записи spf2.0/mfrom,pra поддерживаются оба стандарта). Как бы то ни было, еще до принятия решения IETF новая технология уже раскручивалась вов‑ сю, и вскоре ее поддерживали все почто‑ вые серверы Microsoft, включая службы MSN Mail и Hotmail. Sender ID был одоб‑ рен одновременно с SPF в RFC 4406, в ко‑ тором сказано, что за успехом или неуда‑ чей обеих технологий будет вестись на‑ блюдение в течение последующих 2 лет. После чего будет принято решение об еди‑ ном стандарте. Чуть позже было объяв‑ лено, что Sender ID включен в программу Microsoft Open Specification Promise (обе‑ щание открытых спецификаций), то есть обязательство не подавать в суд ни на ко‑ го, кто будет использовать данную техно‑ логию и совместимую с GPL. Хотя вывод один, в мире больших денег борьба со спа‑ мом никого не интересует.
Проверка SPF дает некоторую ве‑ роятность того, что адрес отправителя не был подделан, которую затем мож‑ но учесть в правиле антиспамового фильтра. Конечно, спамеру ничего не стоит создать свой домен, в котором разрешить отправку сообщений с лю‑ бого адреса, но это требует дополни‑ тельных капиталовложений, времен‑ ных затрат и некоторой легализации. Это способно усложнить жизнь спаме‑ ру, особенно на фоне ужесточения за‑ конодательства по отношению к спаму. К тому же сегодня львиная доля спа‑ ма уходит с взломанных компьютеров и с поддельными обратными адреса‑ ми, а SPF как раз и нацелена на иден‑ тификацию подобной почты. После того как технология стала известной, появилось несколько пуб‑ ликаций как на российских, так и за‑ падных ресурсах, в которых показана низкая эффективность SPF (приблизи‑ тельно от 1 до 3%). Учитывая, что ин‑
35
администрирование Common Access Card Весьма интересная разработка Министерс‑ тва обороны США, потихоньку становящая‑ ся на гражданские рельсы. Суть ее такова. Каждый военнослужащий и гражданский персонал этого министерства имеет «типо‑ вую карту доступа» (Common Access Card, http://www.cac.mil), построенную на основе смарт-карты со встроенным микропроцес‑ сором, в которой записаны цифровые сер‑ тификаты PKI с информацией о пользова‑ теле. Такая карта используется как удос‑ товерение личности, для аутентификации и доступа к компьютерным сетям (Army Knowledge Online – AKO), печати и скани‑ рования документов и в том числе для под‑ тверждения полномочий при отправке поч‑
терес в настоящее время несколько поутих, сегодня часто приходится слышать мнение о том, что по причине низкой эффективности SPF в ее использовании нет смысла. Все не так просто как кажется на первый взгляд. Есть несколько моментов, о которых следует помнить. Самое главное, что SPF – это все-таки коллективная система, то есть, для наиболее эффективной ее работы необходи‑ мо, чтобы почтовые системы отправителя и получателя ее использовали. И чем больше будет таких систем, тем боль‑ ше вероятность того, что сообщения спамеров, отправлен‑ ные якобы из вашего домена, будут отсеяны. А на раннем этапе развития массовым распространением SPF как раз и не могла похвастаться. С другой стороны, технология SPF является как бы зер‑ кальным отражением DNSBL. Задача последней – «очер‑ нить» отправителя сообщения. Для этого все спамерские адреса (или заподозренные в таковых действиях) заносят‑ ся в базу, если письмо отправлено с адреса, имеющегося в этой базе, оно отвергается. Проблема состоит в том, что адреса спамеров отследить нереально, а вот случаи, ког‑ да в списки блокировки попадали нормальные отправите‑ ли, известны. В SPF не пытаются отследить спамеров, наоборот, ре‑ сурсы, разрешенные с точки зрения этой технологии, мож‑ но представить как некий аналог «белого» списка. Поэто‑ му SPF можно рассматривать не как попытку «очернить» отправителя, а наоборот, указать, что отправитель легален и с точки зрения администратора домена имеет полное пра‑ во отсылать электронные сообщения. Если сервер клиента взломан и с него некоторое время рассылался спам, то изъ‑ ять адрес из черного списка на порядок труднее, чем «раз‑ решить» отправлять почту с помощью SPF. Одной из проблем использования SPF является его при‑ менение при пересылке (forward) сообщений, когда в про‑ цессе пересылки один из почтовых доменов не будет ука‑ зан как разрешенный. Такие случаи не редки, пересылка используется для сбора сообщений в одном почтовом ящи‑ ке или для резервирования. Если весь процесс происходит внутри организации, решить эту задачу можно отключени‑ ем проверки SPF на всех серверах, кроме входного, и вне‑
36
сением резервных почтовых серве‑ ров в SPF-списки. С «внешними» кор‑ респондентами ситуация не так про‑ ста. Большинство предложенных се‑ годня решений (подмена отправителя, передача дополнительной информа‑ ции о реальном отправителе и другие) предполагают модификацию ПО. Хотя ее можно решить за счет более тонкой настройки политик SPF с использова‑ нием механизма exists, то есть устано‑ вить, что сообщениям, полученным на‑ прямую, доверять больше, переслан‑ ным – меньше. Исходя из сказанного технологию SPF ни в коем случае нельзя назы‑ вать универсальным средством борь‑ бы со спамом. Только при совместном использовании с другими решениями она будет эффективна. Особенно на фоне того, что крупные игроки уже ее используют. В заголовке сообщения, пришед‑ шего с Mail.ru на Gmail, можно найти такую строку:
товых сообщений. Каждый житель США имеет Social Security number (SSN) состоя‑ щий из 9 цифр (первые 3 указывают на ре‑ гион проживания, ходят слухи, что 2 сред‑ ние цифры указывают на этническую при‑ надлежность), поэтому при желании CAC можно легко использовать для аутентифи‑ кации пользователя в Интернет. Специалисты сходятся во мнении, что использование технологии вроде САС несколько усложнит незаконный доступ к ресурсам, но отнюдь не сможет ему вос‑ препятствовать. Кроме того, карты могут изнашиваться и ломаться, устройства счи‑ тывания не работать и прочее, что скажет‑ ся на доступе к ресурсам вполне легальных пользователей.
Received-SPF: pass (google.com: domain of vasja@mail.ru designates 199.099.099.099 as permitted sender).
Что свидетельствует об использовании SPF обоими. Анализируя спам в нескольких своих почтовых ящиках за несколько месяцев, могу сказать, что в узлах, использую‑ щих SPF, никогда не встретишь сообщения, отправленного с адресов вроде mail.ru, gmail.com и прочих, то есть тех, кото‑ рые поддерживают SPF. Там, где эта технология не исполь‑ зуется, можно встретить сообщения с любых адресов.
Интерпретация результата В RFC 4408 определено несколько возможных результа‑ тов проверки легитимности адреса отправителя в процес‑ се SMTP-запроса (в скобках указаны классификаторы, ко‑ торые используются в правилах): n None – означает, что в этом домене нет опубликован‑ ных SPF-записей, поэтому определить разрешения не‑ возможно. n Neutral ("?") – владелец домена явно указал, что он не может указать все адреса или не хочет устанавли‑ вать разрешения, обрабатывается аналогично None и служит больше для информационных целей. n Pass ("+") – такой результат означает, что клиент упол‑ номочен отсылать сообщения и в смысле репутации до‑ мен теперь «отвечает» за отправленное сообщение. n Fail ("-") – это явное утверждение того, что клиент не уполномочен отсылать почту из этого домена и сер‑ вер вправе пометить такое сообщение или отвергнуть. В случае если сообщение отбрасывается в течение SMTP-запроса, сервер должен использовать код ответа 550 SMTP, и если поддерживает код 5.7.1 DSN (Delivery Status Notification) (как при SMTP-аутентификации). n SoftFail ("~") – это промежуточный ответ между «Fail» и «Neutral», то есть ответственный за домен указывает, что отправитель не имеет права посылать сообщение, но не хочет утверждать это явно. Принимающая сторо‑
администрирование на не должна отвергать сообщение исключительно на основании тако‑ го результата, но вправе подверг‑ нуть его более скрупулезному ана‑ лизу, чем «Pass». n TempError – в процессе SPF про‑ верки произошла ошибка, и кли‑ ент вправе принять такое сообще‑ ние либо временно его отклонить. Если сообщение отклоняется в хо‑ де SMTP-запроса, должен исполь‑ зоваться код 451 и 4.4.3 DSN. n PermError – такая ошибка означает, что ответ не может быть интерпре‑ тирован правильно, такая ошибка требует ручного вмешательства владельца домена, так как может возникнуть, если результат явля‑ ется работой скриптов.
Рисунок 1. Создание SPF-политики с помощью веб-формы
вместо явного запрета «-all». Как раз случай создания «бе‑ Публикация SPF-политики Для проверки легитимности отправителя система SPF тре‑ лого» списка с помощью SPF. Причем обратите внимание, бует три параметра: HELO, MAIL FROM и его IP-адрес. Клю‑ что все указанное после all тестироваться не будет, поэто‑ чевыми компонентами такой системы является наличие му all должно стоять в записи последним. По данным вики‑ SPF-записи и поддержка расширения почтовым сервером. педиа (http://en.wikipedia.org/wiki/Sender_Policy_Framework), Разберем сначала, что должен сделать администратор до‑ согласно проведенным исследованиям всего около 5% до‑ мена, чтобы поддержать у себя SPF. Включить поддержку менов com и net использует SPF, да и то в виде «v=spf1 ?all». SPF в DNS очень просто. Запись – это простая строка в ба‑ Не в этом ли секрет низкой эффективности? В RFC определено ряд механизмов (mechanism), позво‑ зе данных DNS, содержащая директивы. Например, в BIND и совместимых с ним по формату текстовой записи зоны ляющих описать объекты, которым разрешено или запре‑ щено отсылать почту. К основным относятся all и include. серверов описание политики будет выглядеть так: Об all сказано выше, а механизм include позволяет адми‑ example.com. IN TXT "v=spf1 +mx ip4:192.168.0.0/24 ↵ нистратору определить несколько административно неза‑ a:mail.example.com -all" висимых областей и не описывать правила для каждой. На‑ пример, рассмотрим такое правило: то есть: n поддерживается протокол SPFv1 – v=spf1; example.com. IN TXT "v=spf1 +mx include: ↵ n почта из домена example.com может приходить с ад‑ example.net include:example.org -all" ресов, принадлежащих сети 192.168.0.0, с сервера Теперь если будет принято сообщение, отправлен‑ mail.example.com и MX-серверов этого домена (+mx), все остальные (all), получат Fail и пройти проверку ное из домена example.com, будет произведена проверка SPF‑записей и в доменах example.net и example.org. Если от‑ эти адреса не смогут ("-"). правка почты с этого адреса хотя бы в одном из них разре‑ Так было в первоначальном варианте, но последующая шена, письму будет присвоен статус Pass. Хотя здесь есть эксплуатация показала, что использование TXT не опти‑ интересный момент, ведь показанная выше запись и запи‑ мально. Поэтому был предложен новый тип записи – SPF. си в доменах example.net и example.org могут иметь прави‑ ло -all. Как должен вести себя механизм SPF? В рекомен‑ Политика в нем выглядит аналогично: дациях этот момент описан просто, только явное совпаде‑ example.com. IN SPF "v=spf1 +mx ip4:192.168.0.0/24 ↵ ние правила («if-pass») в доменах, указанных с помощью a:mail.example.com -all" include, приведет к остановке процесса поиска и выдаче Хотя для совместимости RFC рекомендует использо‑ результата. Кстати, если в этих доменах не будет SPF-за‑ писи, появится ошибка PermError. вать одновременно оба этих поля. Другой вид механизма, определенный в RFC как Как видно из примера, отношение владельца к опреде‑ ленному адресу указывается с помощью классификаторов, «designated sender», позволяет указать в политике диапа‑ о которых говорилось выше. Классификатор Pass ("+") уста‑ зон адресов отправителя сообщений. Возможно несколь‑ навливается по умолчанию, и его можно опускать при запи‑ ко вариантов: си, хотя для наглядности его лучше все-таки использовать. n a (a[:hostname/CIDR}) – все IP-адреса компьютера hostname; Если владелец домена определил известные ему ресурсы, а права остальных четко устанавливать не хочет, то в прави‑ n mx (mx[:domain/CIDR]) – все IP-адреса MX-серверов домена; если в домене единственная MX-запись, реко‑ ле, написанном выше, можно использовать «~all» или «?all»
№4, апрель 2007
37
администрирование Включение поддержки SPF в Postfix
Рисунок 2. Политика, созданная с помощью веб-формы
мендуется указывать его явно, то есть через «a»; не ре‑ комендуется в течение одного запроса обходить более 10 записей; n ptr (ptr[:domain]) – IP-адреса PTR-записей, которые ука‑ зывают на domain; как и при MX, не рекомендуется про‑ ходить более 10 записей; n ip4/ip6 (ip4:ip4-network/CIDR) – сеть диапазона IPv4 или IPv6, не разрешено опускать части адреса вро‑ де 192.168.0., по умолчанию CIDR составляет 32 (IPv4) и 128 (IPv6); n exists – очень полезная возможность, в то же время яв‑ ляющаяся причиной появления PermError. Дает возмож‑ ность администратору определять разрешения с помо‑ щью сложных запросов к DNS. Как правильно состав‑ лять макросы, описано в 8 разделе RFC 4408. Если количество серверов невелико, то при составлении SPF записи можно воспользоваться ресурсом [5] (см. рис. 1). Делается это просто: вводите домен и нажимаете «Begin», будет проанализирован ответ DNS-сервера и предложено заполнить остальные поля. После нажатия на «Continue» бу‑ дет сгенерирована запись для BIND и tinydns (djbdns), а так‑ же даны некоторые пояснения на английском. Проверить правильность SPF-записей можно одним из инструментов, описанных на странице Tools [6]. Возмож‑ ны два варианта: отсылка почтового сообщения, либо ука‑ зание адреса и отправителя, в специальной форме на сай‑ те (см. рис. 3). Кроме того, в репозитарии Ubuntu нашелся пакет spfqtool (SPF Query Tool). С его помощью можно также проверить правильность SPF-записи, введя все три пара‑ метра IP-адрес (-i), почтовый адрес (-s) и узел HELO (-h): $ spfqtool -i 194.144.197.145 -s grinder@ua.fm -h ua.fm SPF short result: softfail SPF verbose result: policy result: [softfail] from rule [~all] RFC2822 header: Received-SPF: softfail (ua.fm: domain of transitioning grinder@ua.fm does not designate 194.144.197.145 as permitted sender) receiver=ua.fm; сlient_ip=194.144.197.145; envelope-from=grinder@ua.fm;
38
На странице [7] приведен список сер‑ веров, изначально поддерживающих технологию SPF. Это Communigate Pro, Courier, Exim, Kerio MailServer и дру‑ гие. Здесь же даны ссылки на расши‑ рения и патчи, позволяющие вклю‑ чить такую поддержку в почтовый сер‑ вер или клиент. В список последних попали такие популярные продукты, как Postfix, Qmail, Sendmail, Exchange, Lotus Domino, Thunderbird, PowerDNS и другие. Для примера разберем, как подключить SPF к Postfix. На страни‑ це [7] для Postfix доступно несколько патчей, некоторые из них потребуют перекомпиляции. Если таковое не пла‑ нируется, лучше всего подойдет пакет на Perl – postfix-policyd-spf-perl. Для его работы потребуется наличие Mail::SPF и NetAddr::IP (о последнем в README почему-то ничего не сказано). Устанавливается он обычным образом: $ perl -MCPAN -e shell cpan> install Mail::SPF cpan> install NetAddr::IP cpan> q
Скачиваем, распаковываем, копируем пакет на место: $ $ $ $
wget –c http://www.openspf.org/blobs/ ↵ postfix-policyd-spf-perl-2.002.tar.gz tar xzvf postfix-policyd-spf-perl-2.002.tar.gz sudo cp postfix-policyd-spf-perl/ ↵ postfix-policyd-spf-perl/uar/lib/perl/ perl /usr/lib/perl/policyd-spf-perl
В файл /etc/postfix/master.cf добавляем следующую строку: policy unix - n n - - spawn user=nobody ↵ argv=/usr/bin/perl /usr/lib/perl/policyd-spf-perl
И в файле /etc/postfix/main.cf редактируем политику smtpd_recipient_restrictions, добавив две строки: smtpd_recipient_restrictions = ... reject_unauth_destination check_policy_service unix:private/policy ...
Перезапускаем Postfix: $ sudo /etc/init.d/postfix restart
Этот скрипт является аналогом spfqtool, поэтому если его запустить в командной строке, можно протестировать SPF-запись (запустить вручную нужно в любом случае, что‑ бы убедиться в отсутствии ошибок): $ perl /usr/lib/perl/policyd-spf-perl
Кроме описанных во врезках технологий были еще две:
администрирование Designated Mailers Protocol (DMP), http:// www.pan-am.ca/dmp) и Reverse Mail Exchanger (RMX), http://www.ietf.org/ internet-drafts/draft-danisch-dns-rr-smtp03.txt. По принципу работы они напо‑ минают SPF, но в последнее время о них ничего нового не слышно. Спам победить трудно, еще в RFC 2505 сказано, что только комбинация юридических и технических методов, вероятно, даст наилучший результат. С юридической точки зрения дело сдвинулось, в некоторых странах спам объявлен вне закона. Технически воз‑ можность идентифицировать пользо‑ вателя с помощью SPF или подобных решений не сможет полностью унич‑ тожить спам, но способна остановить его значительную часть. Проблема од‑ на: сегодня только малая часть доме‑ нов использует SPF-записи, либо отне‑ кивается правилом вроде ~all. Вывод напрашивается сам. Успехов! 1. RFC 2505 – http://tools.ietf.org/html/ rfc2505. 2. RFC 2554 – http://tools.ietf.org/html/ rfc2554.
№4, апрель 2007
Рисунок 3. Тестирование SPF-записи
3. RFC 4408 – http://tools.ietf.org/html/ rfc4408. 4. Сайт SPF – http://www.openspf.org. 5. Record wizard для создания SPF-запи‑ си – http://old.openspf.org/wizard.html. 6. Страница Tools – http://www.openspf.org/ ?back=Tools.
7. Список продуктов, поддерживающих и не поддерживающих SPF – http://www. openspf.org/Implementations. 8. Ресурс Sender ID – http://www.microsoft. c o m / m s c o r p /s a f e t y / t e c h n o l o g i e s / senderid/default.mspx.
39
администрирование
Администрирование учетных записей в домене Active Directory
Александр Емельянов Одна из важнейших задач администратора – управление локальными и доменными учетными записями: аудит, квотирование и разграничение прав пользователей в зависимости от их потребностей и политики компании. Что может предложить в этом плане Active Directory? 40
администрирование
В
продолжение цик ла с татей об Active Directory сегодня мы поговорим о центральном звене в процессе администрирования – управлении пользовательскими учетными данными в рамках домена. Нами будет рассмотрено: n создание учетных записей и управление ими; n типы профилей пользователей и их применение; n группы безопасности в доменах AD и их сочетания.
В конечном итоге вы сможете применить эти материалы для построения рабочей инфраструктуры либо доработки существующей, которая будет отвечать вашим требованиям. Забегая вперед, скажу, что тема тесно связана с применением групповых политик для административных Рисунок 1. Новые элементы для администрирования домена целей. Но вследствие обширности маn Domain Controllers. Это организационная единица (OU, териала, посвященного им, она будет раскрыта в рамках Organizational Unit), содержащая по умолчанию контролследующей статьи. леры домена. При создании нового контроллера он появляется здесь. Знакомство с Active Directory – n ForeignSecurityPrincipals. Это контейнер по умолчанию Users and Computers для объектов из внешних доверяемых доменов. После того как вы установили свой первый контроллер в домене (тем самым вы собственно и организовали домен), Важно помнить, что объекты групповых политик привяв разделе «Администрирование» появляется пять новых зываются исключительно к домену, OU или сайту. Это нужэлементов (см. рис. 1). Для управления объектами AD используется Active но учитывать при создании административной иерархии Directory – Пользователи и компьютеры (ADUC – AD Users вашего домена. and Computers, см. рис. 2), которая также может быть выВводим компьютер в домен звана через меню «Выполнить» посредством DSA.MSC. С помощью ADUC можно создавать и удалять пользо- Процедура выполняется непосредственно на локальной вателей, назначать сценарии входа для учетной записи, уп- машине, которую мы хотим подключить. Выбираем «Мой компьютер → Свойства → Имя компьюравлять членством в группах и групповыми политиками. Существует также возможность для управления объ- тера», нажимаем кнопку «Изменить» и в меню «Является ектами AD без обращения к серверу напрямую. Ее обес- членом» выбираем «домена». Вводим имя домена, в котопечивает пакет ADMINPAK.MSI, расположенный в дирек- рый мы хотим добавить наш компьютер, и далее доказытории «%SYSTEM_DRIVE%\Windows\system32». Развернув его на своей машине и наделив себя правами администратора домена (если таковых не было), вы сможете администрировать домен. При открытии ADUC мы увидим ветку нашего домена, содержащую пять контейнеров и организационных единиц. n Builtin. Здесь содержатся встроенные локальные группы, которые есть на любой серверной машине, включая и контроллеры домена. n Users и Computers. Это контейнеры, в которые по умолчанию размещаются пользователи, группы и учетные записи компьютеров при установке системы поверх Windows NT. Но для создания и хранения новых учетных записей нет необходимости пользоваться только этими контейнерами, пользователя можно создать даже в контейнере домена. При включении компьютера в домен он появляется именно в контейнере Computers. Рисунок 2. Active Directory - Users and Computers
№4, апрель 2007
41
администрирование Нюансы доменной аутентификации При использовании локальных профилей может возникнуть ситуация, когда пользователь домена пытается войти на рабочую станцию, которая имеет его локальный профиль, но по каким-то причинам не имеет доступа к контроллеру. На удивление, пользователь успешно пройдет аутентификацию и будет допущен к работе.
ваем, что у нас есть права на добавление рабочих станций к домену, введя аутентификационные данные администратора домена.
Создаем пользователя домена Для создания пользователя нужно выбрать любой контейнер, в котором он будет располагаться, нажать на нем правой кнопкой мыши и выбрать «Создать → Пользователь». Откроется мастер создания пользователя. Здесь вы сможете указать множество его атрибутов, начиная с имени пользователя и временными рамками входа в домен и заканчивая настройками для терминальных служб и удаленного доступа. По завершении работы мастера вы получите нового пользователя домена. Нужно заметить, что в процессе создания пользователя система может «ругаться» на недостаточную сложность пароля или его краткость. Смягчить требования можно, открыв «Политику безопасности домена» (Default Domain Security Settings) и далее «Параметры безопасности → Политики учетных записей → Политика паролей». Пусть мы создали пользователя Иван Иванов в контейнере Users (User Logon Name: ivanov@HQ.local). Если в системах NT 4 это имя играло лишь роль украшения, то в AD оно является частью имени в формате LDAP, которое целиком выглядит так:
Такая ситуация возникает из-за кэширования мандата пользователя и может быть исправлена внесением изменений в реестр. Для этого в папке HKEY_LOCAL_MACHINE\ Software\Microsoft\Windows NT \Current Version\Winlogon создать (если таковой нет) запись с именем CachedLogonCount, типом данных REG_DWORD и установить ее значение в ноль. Аналогичного результата можно добиться при помощи групповых политик.
пользующих протокол LDAP для связи с Active Directory. Для входа в домен Иван Иванов должен будет использовать имя в формате UPN (Universal Principal Name): ivanov@hq.local. Также в доменах AD будет понятно написание имени в старом формате NT 4 (пред Win2000), в нашем случае HQ\Ivanov. При создании учетной записи пользователя ей автоматически присваивается идентификатор защиты (SID, Security Identifier) – уникальный номер, по которому система и определяет пользователей. Это очень важно понимать, так как при удалении учетной записи удаляется и ее SID и никогда не используется повторно. А каждая новая учетная запись будет иметь свой новый SID, именно поэтому она не сможет получить права и привилегии старой. Учетную запись можно переместить в другой контейнер или OU, отключить или, наоборот, включить, копировать или поменять пароль. Копирование часто применяется для создания нескольких пользователей с одинаковыми параметрами.
cn="Иван Иванов", cn="Users", ↵ dc="hq", dc="local"
Здесь cn – container name, dc – domain component. Описания объектов в формате LDAP используются для выполнения сценариев WSH (Windows Script Hosts) либо для программ, ис-
42
Рисунок 3. Вкладка «User Profiles» апплета System
Рабочая среда пользователя Учетные данные, хранящиеся централизованно на сервере, позволяют пользователям однозначно идентифицировать себя в домене и получать соответствующие права и доступ к рабочей среде. Все операционные системы семейства Windows NT используют для создания рабочего окружения на клиентской машине профиль пользователя.
Локальный профиль Рассмотрим основные составляющие профиля пользователя: n Раздел реестра, соответствующ ий определенному поль зователю («улей» или «hive»). Фак тически данные этой ветк и р е е с т ра х ран я тс я в ф ай л е NTUSER.DAT. Он располагается в папке %SYSTEMDRIVE%\ Documents and Settings\User_name, которая содержит профиль пользователя. Таким образом, при входе конкретного пользователя в систему в раздел реестра HKEY_CURRENT_USER загружается «улей» NTUSER.DAT из папки, содержащей его профиль. И все изменения настроек пользовательской среды за сеанс будут сохраняться именно в этот «улей». Файл NTUSER.DAT.LOG – это журнал транзакций, который существует для защиты файла NTUSER.DAT. Однако для пользователя Default User вы вряд ли его найдете, поскольку он является шаблоном. Об этом далее. Администратор имеет возможность редактировать «улей» определенного пользователя прямо из своей рабочей среды. Для этого с помощью редактора реестра REGEDIT32 он должен загрузить «улей» в раздел HKEY_USERS, а затем после внесения изменений выгрузить его. n Папки файловой системы, содержащие файлы пользовательских настроек. Они располагаются в специальном каталоге %SYSTEMDRIVE%\Documents and Settings\User_name, где User_ name – имя пользователя, вошедшего в систему. Здесь хранятся элементы рабочего стола, элементы автозагрузки, документы и др.
администрирование Если пользователь впервые входит в систему, происходит следующее: 1. Система проверяет, существует ли локальный профиль этого пользователя. 2. Не найдя его, система обращается к контроллеру домена в поиске доменного профиля по умолчанию, который должен располагаться в папке Default User на общем ресурсе NETLOGON; если система обнаружила этот профиль, он копируется локально на машину в папку %SYSTEMDRIVE%\ Documents and Settings с именем пользователя, в противном случае он копируется из локальной папки %SYSTEMDRIVE%\Documents and Settings\Default User. 3. В раздел реестра HKEY_CURRENT_ USER загружается пользовательский «улей». 4. При выходе из системы все изменения сохраняются локально. В конечном итоге рабочее окружение пользователя – это объединение его рабочего профиля и профиля All Users, в котором находятся общие для всех пользователей данной машины настройки. Теперь несколько слов о создании профиля по умолчанию для домена. Создайте фиктивный профиль на своей машине, настройте его в соответствии с вашими нуждами либо с требованиями корпоративной политики. Затем выйдите из системы и снова зайдите как администратор домена. На общем ресурсе NETLOGON-сервера создайте папку Default User. Далее при помощи вкладки User Profiles в апплете System (см. рис. 3) скопируйте ваш профиль в эту папку и предоставьте права на ее использование группе Domain Users или какой-либо другой подходящей группе безопасности. Все, профиль по умолчанию для вашего домена создан.
Перемещаемый профиль Active Directory как гибкая и масштабируемая технология позволяет работать в среде вашего предприятия с перемещаемыми профилями, которые мы рассмотрим далее. Одновременно с этим будет уместным рассказать о перенаправлении папок как одной из возможностей
№4, апрель 2007
Рисунок 4. Здесь указывается путь к перемещаемому профилю
Рисунок 5. Путь к перемещаемым профилям нескольких пользователей
технологии IntelliMirror для обеспечеТаким образом, для пользоватения отказоустойчивости и централи- ля все проведенные изменения будут зованного хранения пользователь- абсолютно прозрачны. Сохраняя докуских данных. менты в папку «Мои документы», коПеремещаемые профили хранят- торая заведомо будет перенаправлеся на сервере. Путь к ним указывает- на на сетевой ресурс, он даже и не буся в настройках пользователя домена дет подозревать о том, что все сохра(см. рис. 4). няется на сервер. При желании можно указать пеНастроить перенаправление можремещаемые профили для несколь- но как вручную для каждого пользоких пользователей одновременно, вателя, так и при помощи групповых выделив нескольких пользователей, политик. и в свойствах во вкладке «Профиль» В первом случае нужно кликнуть указать %USERNAME% вместо папки на иконке «Мои документы» на рабос именем пользователя (см. рис. 5). чем столе либо в меню «Пуск» правой Процесс первого входа в систему кнопкой мыши и выбрать свойства. пользователя, обладающего переме- Дальше все предельно просто. Во‑втором случае нужно открыть щаемым профилем, сродни описанному выше для локального, за неко- групповую политику OU или домена, торым исключением. для которых мы хотим применить пеВо-первых, раз путь к профилю ренаправление, и раскрыть иерархию в объекте пользователя указан, систе- «Конфигурация пользователя → Конма проверяет наличие кэшированной локальной копии профиля на машине, далее все, как было описано. Во-вторых, по завершении работы все изменения копируются на сервер, и если групповыми политиками не указано удалять локальную копию, сохраняются на данной машине. Если же пользователь уже имел локальную копию профиля, то серверная и локальная копии профиля сравниваются, и происходит их объединение. Технология IntelliMirror в системах Windows последних версий позволяет осуществлять перенаправление определенных папок пользователей, таких как «Мои документы», «Мои рисунки» и др., на сетевой ресурс. Рисунок 6. Включение дисковых квот
43
администрирование n каждый раз, когда пользователь входит в систему, для него создается локальный профиль (точнее, профиль с сервера копируется локально), и если меняет рабочие машины, то на каждой из них остается такой «мусор»; этого можно избежать, настроив определенным образом групповые политики («Конфигурация компьютера → Административные шаблоны → System → User Profiles», политика «Delete cached copies of roaming profiles»).
Введение уже существующего пользователя в домен Рисунок 7. Настройка перенаправления папок при помощи групповых политик
Зачастую при внедрении службы каталогов в уже существующей сети на базе рабочих групп возникает вопрос о введении пользователя в домен без потери настроек его рабочей среды. Этого можно добиться, используя перемещаемые профили. Создайте на общем сетевом ресурсе (например, Profiles) на сервере папку с именем пользователя и задайте для нее разрешения на запись для группы Everyone. Пусть она называется HQUser, а полный путь к ней выглядит так: \\Server\Profiles\HQUser. Создайте пользователя домена, который будет соответствовать пользователю вашей локальной сети, и в качестве пути к профилю укажите \\Server\Profiles\HQUser. На компьютере, содержащем локальный профиль нашего пользователя, нужно войти под учетной записью администратора и при помощи вкладки User Profiles апплета System скопировать его в папку \\Server\Profiles\ HQUser. Нетрудно понять, что при следующем входе в систему под новой доменной учетной записью наш пользователь загрузит свой рабочий профиль с сервера, и администратору останется лишь решить, оставить этот профиль перемещаемым либо сделать локальным.
фигурация Windows» (см. рис. 7). Далее перенаправление настраивается либо для всех пользователей, либо для определенных групп безопасности OU или домена, к которым эта групповая политика будет применяться. Используя перенаправление папок к работе с перемещаемыми профилями пользователей, можно добиться, например, уменьшения времени загрузки профиля. Это при условии того, что перемещаемый профиль загружается всегда с сервера без использования локальной копии. Рассказ о технологии перенаправления папок был бы неполон без упоминания об автономных файлах. Они позволяют пользователям работать с документами даже при отсутствии подключения к сети. Синхронизация с серверными копиями документов происходит при следующем подключении компьютера к сети. Такая схема организации будет полезна, например, пользователям ноутбуков, работающих как в рамках локальной сети, так и дома. К недостаткам перемещаемых профилей можно отнести следующее: n может возникнуть ситуация, когда, например, на рабочем столе пользователя будут существовать ярлыки некоторых программ, а на другой машине, где захочет по- Квотирование работать обладатель перемещаемого профиля таких Очень часто пользователи загружают ненужной информапрограмм не установлено, соответственно часть ярлы- цией сетевые диски. Чтобы избежать постоянных просьб поков не будет работать; чистить свои личные папки от ненужного мусора (почему-то n многие пользователи имеют привычку хранить доку- он всегда оказывается нужным), можно использовать мементы, а также фотографии и даже видео на рабочем ханизм квотирования. Начиная с Windows 2000 это можно столе, в результате при загрузке перемещаемого про- делать стандартными средствами на томах NTFS. филя с сервера каждый раз создается дополнительный Для включения механизма квотирования и его настройтрафик в сети, а сам профиль загружается очень дол- ки нужно зайти в свойства локального тома и открыть го; для решения проблемы используйте разрешения вкладку «Квота» (Quota) (см. рис. 6). NTFS, чтобы ограничить сохранение «мусора» на раДалее помечаем «Включить управление квотами» и набочем столе; страиваем дисковые квоты по умолчанию для всех пользователей, записывающих информацию на этот том. Также можно посмотреть данные о занимаемом пространстве на диске и настроить квоты отдельно для каждого пользователя (см. рис. 8). Система подсчитывает занимаемое место на диске, основываясь на данных о владельце объектов, суммируя объем принадлежащих ему файлов и папок.
Группы пользователей в AD Рисунок 8. Управление дисковыми квотами для отдельных пользователей домена
44
Управление пользователями в рамках домена – задача несложная. Но когда нужно настроить доступ к опреде-
администрирование Вложенность доменных групп
пользовать ее при указании разрешений на доступ к обоВложенность Локальные группы Глобальные группы Универсальные группы им ресурсам. Либо мы моУчетная запись + + + жем создать две глобальные + (за исключением встроенных локальных групп – Локальные группы – группы в каждом домене, кои только в пределах собственного домена) торые будут содержать поль+ (только в пределах + Глобальные группы + собственного домена) зователей только своего доУниверсальные группы + – + мена, и включить их в универсальную группу. Любую ленным ресурсам для нескольких десятков (а то и сотен) из этих глобальных групп также можно использовать для пользователей, на раздачу прав доступа может уйти уй- назначения прав. ма времени. Доступ к каталогу Base должны иметь пользователи А если возникает необходимость тонко разграничить только из домена HQ.local (синие линии), поэтому мы вклюправа участникам нескольких доменов в рамках дерева чим их в локальную доменную группу, и этой группе преили леса, перед администратором встает задача сродни доставим доступ. задачам из теории множеств. На помощь здесь приходит Каталогом Distrib будут иметь право пользоваться как использование групп. члены домена HQ.local, так и члены домена SD.local (оранОсновная характеристика групп, встречающихся в рам- жевые линии на рис. 9). Поэтому пользователей Manager ках домена, была дана в прошлой статье [1], посвященной и Salary мы можем добавить в глобальную группу домеархитектуре службы каталогов. на HQ.local, а затем эту группу добавить в локальную Напомню, что локальные группы домена могут вклю- группу домена SD.local вместе с пользователем IT. Зачать пользователей своего домена и других доменов в ле- тем этой локальной группе и предоставить доступ к ресу, но область ее действия ограничивается доменом, кото- сурсу Distrib. рому она принадлежит. Сейчас мы рассмотрим вложенность этих групп подробГлобальные группы могут включать в себя только поль- нее и рассмотрим еще один тип групп – встроенные локальзователей своего домена, но есть возможность их исполь- ные доменные группы. зования для предоставления доступа к ресурсам как в рамВ таблице показано, какие группы в какие могут быть ках своего, так и другого домена в лесу. вложены. Здесь по горизонтали расположены группы, в коУниверсальные группы, соответствуя своему названию, торые вкладываются группы, расположенные по вертикамогут содержать пользователей из любого домена и исполь- ли. Плюс означает, что один вид групп может быть вложен зоваться также для предоставления доступа в рамках все- в другой, минус – нет. го леса. Не важно, в рамках какого домена универсальная На каком-то ресурсе в Интернете, посвященном сергруппа будет создана, единственное, стоит учитывать, что тификационным экзаменам Microsoft, я увидел упоминапри ее перемещении права доступа будут теряться и их не- ние о такой формуле – AGUDLP, что значит: учетные заобходимо будет переназначить заново. писи (Account) помещаются в глобальные группы (Global), Чтобы понять описанное выше и основные принци- которые помещаются в универсальные (Universal), котопы вложенности групп, рассмотрим пример. Пусть у нас рые помещаются в локальные доменные группы (Domain есть лес, содержащий два домена HQ.local и SD.local (ка- Local), к которым и применяются разрешения (Permissions). кой из них корневой в данном случае, не важно). Каждый Эта формула в полной мере описывает возможность влоиз доменов содержит ресурсы, к которым нужно предоста- женности. Следует добавить, что все эти виды могут быть вить доступ, и пользователей (см. рис. 9). вложены в локальные группы отдельно взятой машины Из рис. 9 видно, что к ресурсам Docs и Distrib должны (локальные доменные исключительно в рамках своего иметь доступ все пользователи в лесу (зеленые и красные домена). линии), поэтому мы можем создать универсальную групВстроенные локальные доменные группы расположепу, содержащую пользователей из обоих доменов, и ис- ны в контейнере Builtin и являются фактически локальными группами машины, но только для контроллеров домена. И в отличие от локальных доменных групп из контейнера Users не могут быть перемещены в другие организационные единицы. Правильное понимание процесса администрирования учетных записей позволит вам создать четко настроенную рабочую среду предприятия, обеспечив гибкость управления, а главное – отказоустойчивость и безопасность домена. В следующей статье мы поговорим о групповых политиках как инструменте для создания пользовательского окружения.
Рисунок 9. Предоставление доступа на основе групп
№4, апрель 2007
1. Емельянов А. Принципы построение доменов Active Directory, //«Системный администратор», №2, 2007 г. – С. 38-43.
45
человек номера
Обыкновенный человек
Проще открыть Америку, чем разгадать человека. Однако некоторые «белые пятна» биографии Феликса Мучника, создателя Softkey, можно считать закрашенными…
Открытие первое: он не вундеркинд Больше всего завораживают подробности нестандартных детства и отрочества Феликса Мучника – в 13 лет закончил школу, в 18 – Воронежский государственный университет. Любопытнейшая тема для разговора. Но сам Феликс мои неуклюжие восторги не разделяет. Может быть, «наелся» человеческим любопытством в детстве, когда к мальчику, который за два года перескочил из первого в пятый класс, непрерывно приставали журналисты пишущие и снимающие. А может быть, потому что Феликс Маратович справедливо считает: «Почти все дети умеют писать, читать и считать к первому классу. Сегодня, по крайней мере. Дайте ребенку развиваться, и он будет развиваться. 70% детей способны, только мы им не создаем условий. Так что я был совершенно нормальным ребенком».
46
С этим трудно спорить. Я сама научилась читать в пять лет и в первом классе жутко скучала на уроках чтения… Ну ладно, нормальный ребенок, согласилась я мысленно. А кто такой тогда вундеркинд? Феликс словно прочитал мои мысли и объяснил: «Мальчик в очочках сидит, что-то пишет непрерывно, его все заставляют…» Так вот что оно! Мы просто поразному понимаем слово «вундеркинд». Для меня это художница Надя Рушева, юные поэтессы Вика Ветрова и Ника Турбина, творящие свободно и без принуждения, для Феликса – несчастный ребенок, который сутки напролет что-то тупо зубрит. Уже в детстве и юности его свободолюбивая натура насилию над своей личностью противилась. Извините, что так высокопарно… Но по сути верно! До самых старших классов, когда пошла серьезная учеба, глубинное познание математики под руководством из-
вестного в Воронеже педагога Давида Борисовича Сморгонского, Феликс откровенно скучал на занятиях, домашние задания делал за четверть часа: «Я уходил гулять со своими ровесниками через 15 минут. Меня можно было всегда найти на улице. Это нормальное явление». Учился с опережением, только самостоятельно – по учебникам старших брата и сестры. Формально же был учеником 6, затем 7 и 8 классов. В Одессе со средней школой возник откровенный конфликт – мальчика хотели заставить сидеть дома и дожидаться сверстников. В Воронеже, куда семья переехала по семейным обстоятельствам, способного ученика не беспокоили, переводили из класса в класс. После школы родители не решились отпустить Феликса в московский вуз, «нормальный» выпускник десятого класса 13 лет от роду стал студентом матфака Воронежского университета. Изучал многомерные временные матрицы, занимался функциональным анализом. Как комментирует сам Феликс Маратович, «очень интересные предметы, но очень теоретические». А дальше последовало, пожалуй, последнее официальное «насилие над личностью». Феликса Мучника распределили… в сельскую школу. Просто диплом был со второй специальностью «педагог». Однако это не стало поводом для расстройства. Феликс вообще считает, что не бывает даром потраченного времени. Полтора года трудов праведных на ниве сельского образования оказались интересным опытом и для начинающего учителя математики, и для его учеников. Молодой, задорный педагогический коллектив, кружки по интересам – театр, футбол, баскетбол, карате. Два выпускника стали актерами, несколько поступили в политехнический институт. «У нас все было хорошо». Милое дело – воспоминания, они всегда окрашиваются радужным розовым цветом…
Вопрос на засыпку Вы производите впечатление человека, которому интересно жить на свете. Это так? Да. Конечно, очень интересно. Только некогда.
человек номера Открытие второе: профессия его выбрала После педагогического дебюта в трудовой книжке Феликса Мучника фигурирует оригинальная запись – «монтировщик сцены в воронежском Оперном театре». Зато дальше все по профилю. Вернее так: дальше началась жизнь, ныне переложенная в легенды, ведь Феликс Мучник из того поколения, которое вошло в программирование в 70-е. Сфера IT исхожена Феликсом вдоль и поперек. Это в 11 с половиной лет он программировал на машинах, которые ныне стоят в музее. А потом кем только не был – администратором, программистом, разработчиком СУБД, разработчиком операционных систем, руководителем проектов, создателем компаний… А почему «профессия выбрала»? Очень просто. Сработали гены. Отец занимался экономико-математическими методами и автоматизацией пищевой промышленности России. Мама Феликса была учителем математики, а затем… программистом. То, что интерес к информационным технологиям наследственный, Феликс допускает. Однако добавляет: «Есть власть генов, но она не определяющая». Тем более, абсолютно не верит в чудеса, мистику, высшие силы. Агоностик. Убежден, что человек сам строит свою судьбу. И уж тут «что выросло – то и выросло». И это здорово. Иначе вряд ли бы на свет появилась фирма Softkey. Создать ее мог только индивидуум, которого не смутило семь лет назад, что домашний софт народ не покупает, что Россия здорово отстает от Запада и в темпах компьютеризации, и в количестве компьютерных программ. В нашей стране, по меткому выражению Мучника, существовал «базарчик софта», до рынка было ой как далеко. Однако такое состояние дел стало лишь прекрасным поводом… открыть на этом «базарчике» цивилизованный магазин. Феликс вспоминает: «Это был момент, когда назревал конец второй волны западного интернет-бума. 1999 год. Полгода мы анализировали западный рынок и понимали, что у нас нет не только второй волны, у нас и первая еще не началась. Иллюзия. Не было активного интернет-поль-
№4, апрель 2007
Феликс Мучник убежден, что единственное его отличие от остальных «нормальных» людей – его проекты
зователя. Но стало понятно, что прой- уже давно запланировано. Как сказал дет пять лет, все это будет. Будут вы- Билл Гейтс в Москве осенью: «Ребяделенные каналы, спрос. И кто-то дол- та, не предлагайте нам ничего в течежен это обслуживать». ние следующих пятидесяти лет». МоКогда Мучник со товарищи созда- жет, конечно, произойти некое взрывли службу регистрации программ, вы- ное накопление, но это случится тогяснилось, что спрос есть. Есть поку- да, когда в Интернет вольются все патели, которые уже пользуются про- знания из всех ниш, мощности сильграммами, которым надо продлить ли- но возрастут. Сейчас есть предел – цензию, которые хотят честно купить больше 10 МГц нельзя сделать микнепиратское ПО. В 2001 году появил- росхему…» ся интернет-супермаркет программного обеспечения Softkey.ru. «И живет Вопрос на засыпку до сих пор», – замечает Феликс. В прошлом году я купила у вас На сегодня команда Мучника – око- Dr.Web… Не случайно, выходит? ло пятидесяти человек только в мос- Правильно, а где же еще покупать? ковском офисе, еще примерно 25 – в представительствах по разным стра- Открытие третье: нам (Украина, Казахстан, Белоруссия, он прагматик Болгария, Израиль, Польша, страны Личная жизнь Феликса Мучника – заБалтии, Молдова). крытая тема. Он не собирается обПрофессиональный опыт позво- суждать с журналистами, с сообщесляет ему не только уверенно вести твом посетителей своего блога посвперед свою компанию, но и рассуж- ледний прочитанный роман или моддать о дне сегодняшнем всей сферы ный кинохит. Как ни странно, я, журс изрядной долей скептицизма: «В IT налист, с ним соглашусь: должно быть нет гениальных идей уже давно. Пос- то, что скрыто от глаз. А бульварных ле последней информационной ре- скандалов хватает, обратитесь к желволюции вообще ничего не происхо- той прессе… дило. Мы только реализуем то, что Однако трудно скрыть, да и незапридумано еще Винером. Сегодня чем, что Феликс – счастливый муж, все идеи в IT – инновационного тол- отец, дед. Даже где-то идеальный ка, привнесенные либо из-за рубе- дед – не воспитывает внучку Олечжа, либо из других отраслей. Перво- ку, «это задача родителей», однако основа не меняется. И вообще, все обязательно возится с малышкой раз
47
человек номера
«Главное – решить, прорубать головой проблему или все-таки дверь поискать. Всегда надо искать дверь, она существует. И в этом я оптимист»
в неделю – неплохо, учитывая занятость руководителя крупной компании… Мучник опять возражает: «Я абсолютно нормальный человек. Ничего сверхъестественного в моей жизни нет. Я обычный дедушка, папа, муж. Я люблю иногда сходить в ресторан и вкусно поесть. Чаще ужинаю дома – у меня жена хорошо готовит. Люблю путешествовать, читать книжки. Не включаю телевизор, потому что новости телевизионные надоели. И так далее и тому подобное. Так живет значительное количество людей».
Прагматичный подход распространяется на все остальное. Например, на отношения с подчиненными. Если сотрудники интернет-магазина хамят покупателям, следует наказание. Это в воспитательной системе Мучника-начальника – «кнут». Если наказание не следует – это «пряник». Похвала – пустое дело. «Хвалить людей надо деньгами, чем-то еще. Грамоты им, что ли, давать, как в советское время? Когда человек делает свое дело, это нормально, он не молодец. Это моя позиция». Он и себя довольно строго оценивает. И, судя по тому, «В жизни нет проблем, кроме смерти. Все ос- как идет бизнес, цена на актальные вопросы можно решить. Это мои со- ции Феликса Мучника, кототрудники давно выучили. Посчитайте, как ре- рые «приобретает» сам Фешить вопрос, предскажите ситуацию, пост- ликс, неуклонно растет. Хотя бывает, что и падает… В этом ройте ее модель. И все». случае Феликс Маратович собой недоволен. Общение тоже нужно не просто Среднестатистический гражданин РФ Феликс Мучник убежден, что единс- для того, чтобы красноречие отточить твенное его отличие от остальных на собеседнике. Это возможность пе«нормальных» людей – его проекты. реварить чужой опыт, сделать из неГлавное дело жизни – Softkey. Нет, ни- го выводы. И даже, если повезет, покаких ахов и охов про любовь к Оте- учиться на чужих ошибках. В том чисчеству и пользу ближнему. Все прос- ле и для этого Феликс ведет свой блог то, прагматично и практично: «Компа- felixm.bloghost.ru. ния Softkey обслуживает массу людей, Если уж быть совсем точным, Фе350 тысяч на сегодняшний день. Люди ликс Мучник оптимистичный прагмазнают, что такое Softkey, и там покупа- тик. Не знаю, есть ли у психологов тают софт, который им нужен. Это удоб- кой термин. Вряд ли… Сам руковоно и быстро». дитель Softkey объясняет свою пози-
48
цию так: «В жизни нет проблем, кроме смерти. Все остальные вопросы можно решить. Это мои сотрудники давно выучили. Посчитайте, как решить вопрос, предскажите ситуацию, постройте ее модель. И все. Есть свет в конце туннеля, его не может не быть, в крайнем случае мы прорубим его киркой, выгрызем зубами. Все равно он существует. Должен существовать. Главное – решить, прорубать головой проблему или все-таки дверь поискать. Всегда надо искать дверь, она существует. И в этом я оптимист». Я было хотела сказать, что страсть к пу тешествиям тоже прагматична – все-таки отдыхать три раза в год по десять дней полезно для здоровья… Но рука у меня не поднимается написать такое о главном увлечении Феликса Мучника. Отправляясь бродить по миру с супругой Евгенией, он становится другим человеком. Романтиком. Феликс пробует блюда разных стран мира (часть из них готовится потом и дома, о чем можно прочитать в блоге em.wmjblogs.ru), фотографирует заморские красоты. А главное – жадно впитывает впечатления. «Я когда-то наблюдал – на Кипре, в одной из деревень залитая солнцем площадь, кафе, в нем сидят старички, играют в нарды, пьют кофе, вино, и у них совершенно правильное выражение лица. Они все сделали в своей жизни, и у них все хорошо. Они не собираются умирать. Они просто живут в свое удовольствие. Они выполнили долг перед всеми. Это моя дальняя мечта – пить вино с этими старичками, когда мне будет лет семьдесят…» А до этого должна сбыться еще одна мечта. Догадались какая? Ну конечно, кругосветное путешествие! И как-то очень верится, что однажды это желание исполнится. А Евгения Мучник обязательно опишет кругосветную «регату» в своем блоге fmm.spaces.live.com. Такая у них традиция.
Вопрос на засыпку А что будет завтра, вы себе представляете? Какая-то новая идея. Вообще идеи надо рождать раз в два года как минимум.
Текст Оксаны Родионовой, фото Владимира Лукина
web
Создаём собственный хостинг, или Сам себе ISP
Андрей Шетухин Только ленивый не писал на тему виртуального веб-хостинга. Это хорошо. Плохо то, что большая часть информации очень слабо структурирована и не имеет отношения к высокопроизводительному, безопасному и массовому виртуальному веб-хостингу. Как создать полностью рабочую систему «с нуля»?
Задачи
n создать максимально производительный и в то же время безопасный веб-хостинг; n позволить mod_php создавать файлы от имени пользователя, а не с правами веб-сервера; n ограничить доступ пользователей к чужим данным; n обезопасить систему от вторжения пользователей;
50
n обезопасить систему от вторжения извне.
Общая схема построения хостинга В качестве веб-сервера будем использовать Apache 1.3 с модулем mod_php и возможностью запуска cgi-скриптов, как наиболее популярный среди вебмастеров. В качестве СУБД – MySQL 5.1.
Для «продвинутых» клиентов предоставим в пользование компилятор gcc. Не следует бояться давать пользователю доступ к компилятору – на правильно настроенной системе даже при наличии компилятора ничего сломать не получится. Мы строим именно правильно настроенную систему, поэтому в распоряжении пользователя будет весь комплекс программного обеспечения.
web Чтобы снизить нагрузку на Apache, установим акселерирующий проксисервер. Из собственной многолетней практики наиболее подходящим акселератором на данный момент является nginx – стабильный и качественный многофункциональный веб-сервер/акселератор, разрабатываемый Игорем Сысоевым. Таким образом, сначала запрос от пользователя поступает на акселератор nginx, который ожидает приема всех данных и проксирует данные на Apache только после полного его получения. Этим мы снижаем нагрузРисунок 1. Общая ку на Apache, который каждый запрос обрабатывает в отдельном тяжеловесном процессе. Для по-настоящему безопасной работы необходимо, чтобы программы Рисунок 2. Схема на площадке каждого клиента выполнялись от своего пользователя. Для cgi-скриптов эта задача решается путем настройки suexec. Модуль PHP, который по определению является частью Apache, выполняется с правами пользователя, от которого запущен веб-сервер. Есть альтернативный вариант с использованием suphp, однако это очень сильно нагружает систему, и потому такая схема для массового веб-хостинга неприменима. Мы выберем компромиссный вариант: PHP будет работать как модуль Apache, а безопасность обеспечим настройками файловой системы и модуля PHP. Осталось решить последнюю проблему, а именно – создание файлов при работе mod_php с правами пользователя-владельца площадки, а не с правами веб-сервера. Обратимся к руководству по команде mount(8), из которого следует, что для наследования владельца при создании объектов внути каталога необходимо замонтировать раздел с опцией suiddir. Доступ по FTP следует предоставлять только через виртуальных пользователей. Это требование обусловлено тем, что пароли по протоколу FTP передаются в нешифрованном виде и их очень легко перехватить. Чтобы исключить возможность вторжения в систему по SSH, перехватив пароль для FTP, необходимы виртуальные пользователи – не существующие в системе, следовательно, бесполезные для потенциального взломщика. Полученная нами схема отображена на рис. 1. Помните, все сервисы, собранные в одном месте, – не более чем тестовая машина. В реальной конфигурации, способной обслуживать тысячи запросов в секунду, сервер MySQL должен быть на отдельной машине. Это же касается и акселератора nginx. Попытка собрать все воедино на одном физическом сервере резко снизит скорость работы всего комплекса ПО из-за слишком высокой нагрузки на дисковую систему.
Первоначальная подготовка сервера
n Конфигурация сервера: Intel(R) Xeon(TM) 3.0 ГГц/2 Гб RAM/Mirror SATA RAID (2х150 Гб).
№4, апрель 2007
схема построения хостинга
прохождения запроса
n Операционная система: FreeBSD 6.2-STABLE SMP i386.
n Диски: / – 400 Mб; /tmp – 2 Гб; /home – 85 Гб; /var – 40 Гб; /usr – 20 Гб. К сожалению, стандартные GENERIC и SMP-ядра не позволяют монтировать файловые системы с SUIDDIR, а потому требуется пересборка. Также неплохо было бы поменять в сторону увеличения параметры, заведующие выделением разделяемой памяти и оперативной памяти на процесс. Создаем файл /usr/src/sys/i386/conf/SMP-stellar со следующим содержимым: include GENERIC ident
SMP-GENERIC-STELLAR
options options
SMP SUIDDIR
options options options options options options options options
SYSVSHM SYSVSEM SYSVMSG SHMMAXPGS=65536 SEMMNI=40 SEMMNS=240 SEMUME=40 SEMMNU=120
options options options
MAXDSIZ=(1024UL*1024*1024) MAXSSIZ=(128UL*1024*1024) DFLDSIZ=(1024UL*1024*1024)
Пересобираем ядро и перегружаемся: cd /usr/src make buildkernel KERNCONF=SMP-stellar make installkernel KERNCONF=SMP-stellar shutdown -r now
После перезагрузки FreeBSD может монтировать файловые системы с опцией suiddir. Изменяем файл /etc/fstab так, чтобы раздел /home монтировался с suiddir. Дополнительно отключаем запись вре-
51
web мени последнего доступа к файлам; это дает некоторый выигрыш в производительности: /dev/ar0s1g
/home
ufs
rw,suiddir,noatime
2
2
Проверяем результат:
/dev/ar0s1g on /home (ufs, local, noatime, suiddir, soft-updates)
Сборка и настройка комплекса ПО Устанавливаем MySQL. Собственно, здесь нет ничего экстраординарного: cd /usr/ports/databases/mysql51-server export WITH_CHARSET=cp1251 export WITH_XCHARSET=all export BUILD_OPTIMIZED=yes make install clean
После установки сервера указываем в /etc/rc.conf: # # MySQL for virtual hosts # mysql_enable="YES"
Записываем файл конфигурации MySQL /var/db/mysql/ my.cnf: [client] port = 3306 socket = /tmp/mysql.sock default-character-set=cp1251 [mysqld] bind-address = 127.0.0.1 port = 3306 socket = /tmp/mysql.sock skip-character-set-client-handshake default-character-set=cp1251 skip-locking key_buffer = 32M max_allowed_packet = 16M table_cache = 256 sort_buffer_size = 1M read_buffer_size = 1M read_rnd_buffer_size = 4M myisam_sort_buffer_size = 64M thread_cache_size = 8 query_cache_size = 16M thread_concurrency = 8 max_connections = 128 max_user_connections = 126 log-slow-queries log binlog_ignore_db = mysql expire_logs_days = 5 max_binlog_size = 400M # Если нет необходимости в работе по сети, включаем # опцию skip-networking #skip-networking log-bin = mysql-bin server-id = 1 = 16M
[mysql] no-auto-rehash [isamchk] key_buffer
52
= 128M = 2M = 2M
[myisamchk] key_buffer sort_buffer_size read_buffer write_buffer
= = = =
128M 128M 2M 2M
[mysqlhotcopy] interactive-timeout
umount /home mount /home mount | grep /home
[mysqldump] quick max_allowed_packet
sort_buffer_size read_buffer write_buffer
= 128M
Запускаем сервер: /usr/local/etc/rc.d/mysql-server start
и проверяем, все ли работает нормально: ps axw | grep mysql 780 con- I 0:00.01 /bin/sh /usr/local/bin/mysqld_safe --defaults-extra-file=/var/db/mysql/my.cnf --user=mysql --datadir=/var/db/mysql --pid-file=/v 862 con- S 107:52.92 /usr/local/libexec/mysqld --defaults-extra-file=/var/db/mysql/my.cnf --basedir=/usr/local --datadir=/var/db/mysql --pid-file=/va 7861 p0 S+ 0:00.00 grep mysql
Задаем пароль для MySQL root: mysq -uroot Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 24356 Server version: 5.1.15-beta-log FreeBSD port: mysql-server-5.1.15 Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql> GRANT ALL ON *.* TO 'root'@'localhost' IDENTIFIED BY 'topsecret'; mysql> GRANT ALL ON *.* TO 'root'@'127.0.0.1' IDENTIFIED BY 'topsecret';
На этом установка MySQL окончена. В качестве фронтэнда у нас будет работать веб-сервер nginx, задача которого – проксировать HTTP-запросы на сервер Apache. Это дает резкое снижение нагрузки из‑за того, что nginx – мультиплексирующий сервер, способный обслуживать десятки тысяч одновременных подключений без порождения сотен дополнительных процессов или тредов. Смотрите схему на рис. 2. При такой схеме все запросы, приходящие на Apache, будут иметь один и тот же адрес – адрес, на котором запущен nginx. Для того чтобы Apache воспринимал запросы с IP-адресов посетителей, а не прокси nginx, необходимо дополнительно установить модуль mod_realip. Итак, устанавливаем nginx: cd /usr/ports/www/nginx make install clean
Устанавливаем Apache: cd /usr/ports/www/apache13 export WITH_APACHE_SUEXEC=yes export APACHE_SUEXEC_LOG=/var/log/apache/suexec_log export APACHE_SUEXEC_USERDIR=www make install clean
Устанавливаем mod_realip: cd /usr/ports/www/mod_realip make install clean
web На этом установка веб-сервера окончена. Следующий шаг – сборка php и mod_php. Из портов можно установить PHP4 или PHP5 – принципиальной разницы в технологии установки и конфигурирования нет, а потому будет описана только сборка mod_php5. Для нормальной работы с временными файлами (сессии, загрузка файлов и т. п.) требуется дополнительный патч, изменяющий права доступа с 0600 до 0660, чтобы веб-сервер имел право записи в них (патч доступен по адресу: для PHP4 – http://www.reki.ru/ hosting/patch-main::open_temporary_file.c.4 и PHP5 – http:// www.reki.ru/hosting/patch-main::open_temporary_file.c.5): cd /usr/ports/lang/php5 fetch http://www.reki.ru/hosting/ ↵ patch-main::open_temporary_file.c.5 mv patch-main::open_temporary_file.c.5 files/ make install clean
В появившемся меню указываем требуемые опции: +--------------------------------------------------------------------+ ¦ Options for php5 5.2.1_3 ¦ ¦ +----------------------------------------------------------------+ ¦ ¦ ¦ [X] CLI Build CLI version ¦ ¦ ¦ ¦ [X] CGI Build CGI version ¦ ¦ ¦ ¦ [X] APACHE Build Apache module ¦ ¦ ¦ ¦ [ ] DEBUG Enable debug ¦ ¦ ¦ ¦ [X] SUHOSIN Enable Suhosin protection system ¦ ¦ ¦ ¦ [X] MULTIBYTE Enable zend multibyte support ¦ ¦ ¦ ¦ [ ] IPV6 Enable ipv6 support ¦ ¦ ¦ ¦ [ ] MAILHEAD Enable mail header patch ¦ ¦ ¦ ¦ [X] REDIRECT Enable force-cgi-redirect support (CGI only) ¦ ¦ ¦ ¦ [X] DISCARD Enable discard-path support (CGI only) ¦ ¦ ¦ ¦ [ ] FASTCGI Enable fastcgi support (CGI only) ¦ ¦ ¦ ¦ [X] PATHINFO Enable path-info-check support (CGI only) ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ +-+----------------------------------------------------------------+-+ ¦ [ OK ] Cancel ¦ +--------------------------------------------------------------------+
в настройке. По окончании установки прописываем в файл /etc/rc.conf параметры для запуска nginx и Apache: # # Nginx Accelerator # nginx_enable="YES" # # Apache Backend # apache_enable="YES"
Конфиг урируем nginx (файл /usr/local/etc/nginx / nginx.conf): user www; worker_processes 2; pid
events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user ↵ [$time_local] $request ' '"$status" $body_bytes_sent ↵ "$http_referer" ' '"$http_user_agent" ↵ "$http_x_forwarded_for"';
В выводе команды полностью отсутствуют упоминания о mysql, gd, iconv и прочих функциях. Что неудивительно, ибо в системе FreeBSD все дополнительные модули ставятся отдельно. Чтобы установить необходимые модули, можно воспользоваться двумя тактиками: поставить все за один раз, подав команды: cd /usr/ports/lang/php5-extensions make install clean
и выбрав необходимый набор модулей из меню. Или собрать каждый модуль по отдельности: cd /usr/ports/www/php5-session make install clean cd /usr/ports/graphics/php5-gd make install clean ...
В случае необходимости можно дополнительно установить Zend Optimizer (http://www.zend.com/products/ zend_optimizer). Он также есть в портах FreeBSD (/usr/ports/ devel/ZendOptimizer). Установка Zend не представляет никакой сложности; а сам продукт практически не нуждается
№4, апрель 2007
access_log
off;
sendfile
on;
keepalive_timeout 65; gzip
on;
server { listen XXX.YYY.ZZZ.DDD:80; server_name localhost;
Проверить работоспособность установленного PHP можно командой: echo "<? phpinfo(); ?>" | php
/var/run/nginx.pid
location / { # Максимальный размер отдаваемого файла client_max_body_size 20M;
# Адрес, на который будем проксировать proxy_pass http://127.0.0.1:80; proxy_redirect off;
proxy_set_header Host proxy_set_header X-Real-IP
proxy_connect_timeout proxy_send_timeout proxy_read_timeout proxy_send_lowat
proxy_buffer_size proxy_buffers proxy_busy_buffers_size proxy_temp_file_write_size proxy_temp_path
}
}
}
$host; $remote_addr;
90; 90; 90; 12000; 4k; 4 32k; 64k; 64k; /var/tmp/nginx;
Конфигурируем Apache (файл /usr/local/etc/apache/ httpd.conf): LoadModule realip_module
libexec/apache/mod_realip.so
ServerName 127.0.0.1 Listen 127.0.0.1:80 RealIP localhost on
53
web <Directory /home/www/*/*/www> AllowOverride All Options +Indexes +ExecCGI FollowSymLinks DirectoryIndex index.php index.html index.htm </Directory> <Directory /home/www/*/*/cgi> AllowOverride All Options -Indexes +ExecCGI FollowSymLinks DirectoryIndex index.cgi index.html index.htm ↵ index.cgi </Directory> NameVirtualHost 127.0.0.1:80
Запускаем nginx и Apache: /usr/local/etc/rc.d/nginx start /usr/local/etc/rc.d/apache.sh start
Проверяем, все ли работает так, как надо: ps axw | grep nginx 3803 3804 3805 8128
?? ?? ?? p0
Is S S D+
0:00.00 0:22.79 0:22.31 0:00.00
ps axw | grep httpd
1363 8124 8125 8126 8129 8130 8131 8132
?? ?? ?? ?? ?? ?? ?? ??
Ss S R S S S S S
0:03.24 0:01.83 0:01.16 0:01.20 0:01.16 0:01.08 0:01.23 0:01.27
nginx: master process /usr/local/sbin/nginx nginx: worker process (nginx) nginx: worker process (nginx) grep nginx /usr/local/sbin/httpd /usr/local/sbin/httpd /usr/local/sbin/httpd /usr/local/sbin/httpd /usr/local/sbin/httpd /usr/local/sbin/httpd /usr/local/sbin/httpd /usr/local/sbin/httpd
Для FTP-доступа установим сервер pure-ftpd. Pure-ftpd – один из самых надежных и одновременно удобных FTP-серверов, зарекомендовавший себя великолепной работой на протяжении многих лет: cd /usr/ports/ftp/pure-ftpd make install clean
Указываем, что собирать сервер следует с поддержкой СУБД PostgreSQL, в которой будут храниться виртуальные пользователи. Выбор базы данных зависит от используемой системы управления хостингом. В нашем случае она построена на основе собственной разработки, базирующейся на СУБД PostgreSQL: +--------------------------------------------------------------------+ ¦ Options for pure-ftpd 1.0.21_1 ¦ ¦ +----------------------------------------------------------------+ ¦ ¦ ¦[ ] LDAP Support for users in LDAP directories ¦ ¦ ¦ ¦[ ] MYSQL Support for users in MySQL database ¦ ¦ ¦ ¦[ ] PAM Support for PAM authentication ¦ ¦ ¦ ¦[X] PGSQL Support for users in PostgreSQL database ¦ ¦ ¦ ¦[X] PRIVSEP Enable privilege separation ¦ ¦ ¦ ¦[X] PERUSERLIMITS Per-user concurrency limits ¦ ¦ ¦ ¦[X] THROTTLING Bandwidth throttling ¦ ¦ ¦ ¦[X] BANNER Show pure-ftpd welcome upon session start ¦ ¦ ¦ ¦[X] UPLOADSCRIPT Support uploadscript daemon ¦ ¦ ¦ ¦[ ] UTF8 Support for charset conversion (expreimental)¦ ¦ ¦ ¦[X] SENDFILE Support for the sendfile syscall ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ +-+----------------------------------------------------------------+-+ ¦ [ OK ] Cancel ¦ +--------------------------------------------------------------------+
При выборе установки с PostgreSQL автоматически поставятся порты databases/postgresql82-client и databases/
54
postgresql82-server. После установки добавляем в файл /etc/rc.conf строчки: # # BILLING DATABASE # postgresql_enable="YES"
Меняем домашний каталог для пользователя pgsql на /var/db/pgsql: mkdir /var/db/pgsql chown pgsql:pgsql /var/db/pgsql chmod 0700 /var/db/pgsql pw usermod pgsql -d /var/db/pgsql
и инициализируем базу данных: su - pgsql initdb --encoding=UTF8 --locale=ru_RU.UTF-8 ↵ --pgdata=/var/db/pgsql/data The files belonging to this database system will be owned by user "pgsql". This user must also own the server process. The database cluster will be initialized with locale ru_RU.UTF-8. ......
Конфигурируем файл /var/db/pgsql/data/postgresql.conf: max_connections = 150 shared_buffers = 40MB max_fsm_pages = 76800 log_destination = 'syslog' silent_mode = on autovacuum = on datestyle = 'iso, dmy' lc_messages = 'ru_RU.UTF-8' lc_monetary = 'ru_RU.UTF-8' lc_numeric = 'ru_RU.UTF-8' lc_time = 'ru_RU.UTF-8'
Файл прав доступа к базе данных /var/db/pgsql/data/ pg_hba.conf # TYPE DATABASE USER CIDR-ADDRESS METHOD # "local" is for Unix domain socket connections only local all all md5 # IPv4 local connections: host all all 127.0.0.1/32 md5 # IPv6 local connections: host all all ::1/128 md5
и запускаем сервер PostgreSQL: /usr/local/etc/rc.d/postgresql start
Проверяем работу: ps axw | grep postgres 749 ?? Ss 751 ?? Ss 752 ?? Ss
0:05.39 /usr/local/bin/postgres -D /var/db/pgsql/data 0:08.97 postgres: writer process (postgres) 0:00.64 postgres: stats collector process (postgres)
Ко н ф и г у р и руе м Pure - F TPD (/usr/ loc al /etc /pure ftpd.conf): ChrootEveryone BrokenClientsCompatibility MaxClientsNumber Daemonize MaxClientsPerIP VerboseLog
yes no 50 yes 8 no
web DisplayDotFiles AnonymousOnly NoAnonymous SyslogFacility DontResolve MaxIdleTime PGSQLConfigFile LimitRecursion AnonymousCanCreateDirs MaxLoad AntiWarez Umask MinUID AllowUserFXP AllowAnonymousFXP ProhibitDotFilesWrite ProhibitDotFilesRead AutoRename AnonymousCantUpload MaxDiskUsage CustomerProof
yes no yes ftp yes 15 /usr/local/etc/pureftpd-pgsql.conf 2000 8 no 4 yes 110:007 100 no no no no no no 99 yes
Указываем, откуда брать информацию о виртуальных пользователях (/usr/local/etc/pureftpd-pgsql.conf): PGSQLServer 127.0.0.1 PGSQLPort 5432 PGSQLUser pureftpd PGSQLPassword topsecret PGSQLDatabase billing PGSQLCrypt cleartext PGSQLGetPW SELECT passwd ↵ FROM ftp.ftpusers WHERE ftpuser='\L' PGSQLGetUID SELECT user_id ↵ FROM ftp.ftpusers WHERE ftpuser='\L' PGSQLGetGID SELECT group_id ↵ FROM ftp.ftpusers WHERE ftpuser='\L' PGSQLGetDir SELECT homedir ↵ FROM ftp.ftpusers WHERE ftpuser='\L'
№4, апрель 2007
Создаем таблицу пользователей в СУБД PostgreSQL: psql -U pgsql CREATE USER billing WITH PASSWORD='supersecret' ↵ NOCREATEDB NOCREATEUSER; CREATE DATABASE billing WITH ENCODING='UTF8' ↵ OWNER=billing; CREATE SCHEMA ftp; CREATE TABLE ftp.ftpusers ( ftpuser VARCHAR(255) NOT NULL CHECK ↵ (LENGTH(ftpuser) > 0), passwd VARCHAR(255) NOT NULL CHECK ↵ (LENGTH(passwd) > 0), user_id INT NOT NULL DEFAULT '-1', group_id INT NOT NULL DEFAULT '-1', homedir VARCHAR(255) NOT NULL CHECK ↵ (LENGTH(homedir) > 0), expires bigint not null default '-1', enabled bigint not null default '0', descr text, CONSTRAINT ftpusers_pk PRIMARY KEY (ftpuser) ) WITHOUT OIDS; CREATE USER pureftpd WITH PASSWORD 'topsecret' ↵ NOCREATEDB NOCREATEUSER; GRANT SELECT ON ftp.ftpusers TO pureftpd;
AND enabled = 1 AND enabled = 1 AND enabled = 1 AND enabled = 1
Продолжение следует Во второй части мы проведем предварительный аудит безопасности системы, рассмотрим создание пользователей хостинга, вопросы нагрузочного тестирования полученного комплекса ПО, аудит системы во время работы и тонкости, связанные с работой некоторых модулей PHP.
55
web
xAjax – простой путь создания асинхронных веб-приложений
Виктор Ермолаев Если вы в полную силу используете DHTML, но вам кажется, что даже это не обеспечивает должного уровня интерактивности, или вас смущает то, что после заполнения формы ваша веб-страница недоступна клиенту, пока не придет ответ от сервера, – самое время начать использовать xAjax. 56
web Ajax – мода в веб‑программировании Сейчас в Интернете все чаще и чаще появляются сайты, использующие новую технологию, называемую Ajax. Такая популярность объясняется возможностью динамического изменения контента страницы, что фактически превращает обычный браузер в среду выполнения, а гипертекстовый документ – в приложение. Такой эффект достигается за счет совместного использования DHTML (JavaScript + DOM + CSS, но третий пункт скорее опциональный) и любого из серверных языков.
Что такое xAjax Новые веяния в программировании сопровождаются появлением новых инструментов, позволяющих облегчить труд программисту – например, IDE и библиотеки готовых функций. Прелесть таких инструментариев заключается в том, что от программиста спрятана «черная» работа, и, более того, она уже сделана за него, осталось только воспользоваться плодами. Конечно, существование таких инструментов не освобождает программиста от необходимости знать внутреннюю схему работы, и не все возможно реализовать с их помощью. Так, для ASP недавно Microsoft выпустила дополнение к Visual Studio – Atlas, набор «компонентов», которые автоматизируют создание запросов на стороне клиента и обработку их на стороне сервера. Но поскольку Visual Studio является коммерческой средой, да и не все сайты хостятся на Windows, то определенный интерес вызывает то, что происходит в Open Source-сообществе. Здесь существует много библиотек. Сегодня речь пойдет о библиотеке xAjax (официальный сайт – www.xajaxproject.org), написанной на для серверного языка PHP. Рассмотрим основные вехи использования этой замечательной библиотеки. Сначала необходимо загрузить библиотеку (например, здесь http://downloads.sourceforge.net/ xajax/xajax_0.5_beta2.zip; конечно, лучше посетить http:// community.xajaxproject.org, чтобы получить последнюю версию библиотеки). Схема использования библиотеки очень проста – подключаете библиотеку, пишете все необходимые функции PHP и регистрируете их, а xAjax сгенерирует функции-врапперы (wrapper functions) на языке JavaScript, доступ к которым вы сможете получить уже из ваших скриптов. Чтобы ясно и кратко раскрыть смысл и технологию использования xAjax, рассмотрим пример. Исходная ситуация – база данных, PHP, JavaScript и браузер, задача – используя xAjax, обеспечить асинхронный вывод данных из базы данных и их обновление. Задача несложная сама по себе, а уж с использованием xAjax это станет еще проще.
Как это работает... Условимся, что библиотека xajax (папки xajax_core и xajax_js) лежит в одном каталоге с индексным файлом. Первая часть HTML\PHP-кода страницы: Листинг 1 01 <html> 02 <head>
№4, апрель 2007
03 <title>test</title> 04 <meta http-equiv="Content-Type" content="text/html; ↵ charset=windows-1251" /> 05 <?php 06 $xajax->printJavascript(""); 07 ?> 08 </head> 09 <script language="javascript"> 10 function getData() 11 { 12 document.getElementById('data').innerHTML='Загрузка...'; 13 xajax_getData(document.getElementById('xid').value); 14 return; 15 } 16 function updateData(frmid) 17 { 18 xajax_updateData(xajax.getFormValues(frmid)); 19 getData(); 20 return; 21 } 22 </script> 23 <body onLoad="xajax_getData(1)"> 24 <div> 25 <h1>Данные</h1> 26 // Введите id // 27 <form> 28 <select id="xid" name="xid" size="1" onChange="getData();"> 29 <option value="1" selected>1</option> 30 <option value="2">2</option> 31 <option value="3">3</option> 32 </select> 33 <div id="data"> 34 // Загрузка... // 35 </div> 36 </div> 37 <div> 38 <h1>Редактирование</h1> 39 <form method="post" name="upForm" id="upForm" ↵ onSubmit="updateData(this.id);return false;"> 41 <b>Field-1</b>&nbsp;<input name="editF1" ↵ type="text" id="editF1" /> 42 <br /> 43 <b>Field-2</b>&nbsp;<input name="editF2" ↵ type="text" id="editF1" /> 44 <br /> 45 <input type="submit" value="Обновить" /> 46 </form> 47 </div> 48 <div id="done"> 49 </div> 50 </body> 51 </html>
Здесь нас мало что интересует (но от гипертекстовой разметки никуда не денешься), кроме JavaScript и вставки на PHP. Начнем со второго – код на PHP (листинг 1, строки 5-7) добавляет в HTML инструкции о включении файла с JavaScript, которые сгенерировал xAjax. Такой подход весьма интересен хотя бы тем, что не загромождается код страницы, которую получит клиент. Далее описаны две функции getData() и updateData(frmid) (строки 10-21), здесь по названию понятно, за что они отвечают, но внутри этих функций происходит вызов других – тех самых , что сгенерировал xAjax, основываясь на нашем PHP-коде, который приведен в листинге 2 (к xajax.getFormValues вернемся немного позже). Листинг 2 <?php 01 define("XAJAX_DEFAULT_CHAR_ENCODING", "windows-1251"); 02 require_once("xajax_core/xajax.inc.php"); 03 define("HOST","xxx.xxx.xxx"); 04 define("DBNAME","xxx"); 05 define("DBUSER","xxx"); 06 define("DBPASS","xxx"); 07 $DB = mysql_connect(HOST, DBUSER, DBPASS) ↵ or die("Could not connect : " . mysql_error()); 08 mysql_select_db(DBNAME) ↵ or die("Could not select database");
57
web 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
function getData($id) { $query = "SELECT field1, field2 ↵ FROM mytable WHERE field1= $id"; $result = mysql_query($query) ↵ or die("Query failed : ". mysql_error()); $data = mysql_fetch_array($result, MYSQL_ASSOC); mysql_free_result($result); $objResponse = new xajaxResponse(); $response = "<b>поле1</b> - ".$data["field1"]." ↵ <b>поле2</b> - ".$data["field2"]; $objResponse->assign("data","innerHTML",$response); $script = "document.getElementById('editF1').value= ↵ ".$data["field1"]."; document.getElementById ↵ ('editF2').value='".$data["field2"]."';"; $objResponse->script($script); return $objResponse; } function updateData($frmData) { $query = "UPDATE mytable SET field2= ↵ '".$frmData["editF2"]."' ↵ WHERE field1=".$frmData["editF1"]; $result = mysql_query($query) ↵ or die("Query failed : ". mysql_error()); mysql_free_result($result); } $xajax = new xajax(); $xajax->setFlag('DecodeUTF8Input', true); //$xajax->setFlag('debug', true); $xajax->registerFunction("getData"); $xajax->registerFunction("updateData"); $xajax->processRequest(); ?>
Второй строкой идет подключение xAjax-библиотеки. Остальной код, пожалуй, стоит просматривать с конца – со строки $xajax = new xajax() (листинг 1, строка 28). Здесь мы создаем новый xAjax-объект и определяем его свойства.
Немного о кодировках Если вы хотите работать с кодировками, отличными от UTF‑8 (в xAjax пересылка данных между браузером и сервером ведется именно в таком формате), то помимо строки $xajax->setFlag('DecodeUTF8Input', true) (листинг 2, строка 29) необходимо определить константу XAJAX_DEFAULT_CHAR_ ENCODING, что и было сделано в первой строке листинга 2, и, как видно, используемая кодировка – Windows‑1251.
Продолжим... Продолжим разбор листинга 2. Во время написания программы и ее отладки очень интересно знать, что же происходит в ее недрах, обмен какими данными происходит, вызов каких функций производится, а иногда необходимо знать, и сколько времени все это занимает. Разработчики xAjax позаботились об этих вещах: если раскомментировать строку «$xajax->setFlag('debug', true)» (листинг 2, строка 30), то при выполнении каждого запроса браузер откроет дочернее окно (оно будет «незапрашиваемым», и мало-мальски приличный браузер блокирует его, так что, если у вас явно указано блокировать такие окна, разрешите принимать их с вашего узла), в котором и будут отображены все интересующие сведения. Далее с помощью метода registerFunction (листинг 2, строки 31-32) регистрируются все функции, к которым можно будет обратиться из JavaScript, используя префикс xajax_ (который, кстати, можно менять... делается это следующим образом – «$xajax = new xajax("","xajax_");). Ну и наконец, $xajax->processRequest() – разрешаем xAjax обрабатывать асинхронные запросы.
58
Функции работы с БД я комментировать не буду. Займемся более интересным делом – рассмотрим подробнее объект $objResponse = new xajaxResponse() (листинг 2, строка 15). Это и есть тот самый рычаг, с помощью которого можно управлять внешним видом вашей страницы. В качестве примера я использовал метод assign (листинг 2, строка 17), который c параметрами получает id элемента страницы, его тег (можно даже написать style.color) и новое значение тега, и метод script (листинг 2, строка 19) – xAjax позволяет не просто обмениваться данными между клиентом и сервером, но и «действиями»! Больше информации о методах и флагах можно почерпнуть из примеров, которые идут вместе с библиотекой, и из описания класса xajaxResponse. После того как $objResponse получил все «свойства» и «методы», его можно со спокойной совестью передать клиенту. А теперь вернемся к обещанному – xajax.getformvalues (листинг 1, строка 18). Эта функция на входе получает id формы и возвращает массив, который можно передать в PHP-функцию. Этот ассоциативный массив будет доступен на стороне сервера под именем, указанным для параметра в описании получающей функции (в примере – updateData($frmData) (листинг 2, строка 22)). Все просто, но есть две вещи, о которых не стоит забывать при обработке форм: n для индексов этого массива используются имена (!) полей формы, а не их id, поэтому при описании полей нужно указывать как id, так и имена (помимо этого разные браузеры по-разному обрабатывают последовательность id-name); n при указании реакции onSubmit (листинг 1, строка 40) необходимо писать «return false» для того, чтобы страница не перезагружалась и ей (странице) «казалось», что обработка формы отменена, в то время как JavaScript отправит асинхронный запрос.
О безопасности и совместимости О безопасности стоит сказать одно – использование xAjax не освобождает вас от необходимости принимать те же самые меры безопасности, что вы применяете в обычных синхронных запросах (например, замена некорректных символов на escape-последовательности). Пример претендует лишь на роль учебного и не годится для использования в реальных условиях. Совместимость библиотеки с различными браузерами напрямую зависит от того, как они поддерживают JavaScript. Разработчики обещают, что вы сможете использовать xAjax в Firefox, Mozilla (и, возможно, основанных на Mozilla браузерах), IE и Safari. От себя замечу, что библиотека прекрасно себя зарекомендовала и в Opera. А пример был протестирован в Opera 9, IE 7 и Firefox 1.5.
Выводы Стоит заметить, что xAjax не является единственной библиотекой в своем роде (аналоги sAjax, cakePHP, при желании в любом поисковике можно найти и больше), но продуманность ее строения и большой функционал делают её не только одной из самых простых в использовании, но и одной из самых мощных.
VI международная конференция «Современные технологии эффективной разработки веб-приложений с использованием PHP» Москва, 24-25 Мая 2007
Международный клуб разработчиков PHPCLUB приглашает Вас принять участие в PHPCONF 2007 – ежегодной международной конференции веб-разработчиков, которая состоится 24-25 мая 2007 года в Москве. Мероприятие будет проводиться уже в шестой раз. Тематика конференции охватывает широкий круг вопросов веб-программирования: Применение PHP в веб-разработке: приёмы, методы и парадигмы программирования в PHP, полезные модули и библиотеки, интеграция с Ajax. Эффективное создание приложений: фреймворки, гибкие методологии, экстремальное программирование, ТDD-методики. PHP и корпоративные информационные системы: разработка систем масштаба предприятия, интеграция корпоративных ИС. Будущее PHP: основные направления развития, PHP6, мультиязычные приложения, Unicode, применение в условиях Web 2.0. Внимание на конференции будет уделено таким темам как: Практика разработки корпоративных веб-приложений 2007. Аспектно-ориентированное программирование(AOP) в PHP. Nginx – архитектура самого быстрого веб-сервера. PHP/MapScript и MapServer. Публикация картографических данных с помощью PHP в WEB. PHP & Flash PHP & Flash, новая альтернатива для создания Rich Internet Applications (Flex Stress Testing Framework, модульное тестирование – FlexUnit, связка Flex и JavaScript). XForms – новое поколение веб-форм WAP (WAP 1.1, WAP 2.0, I-mode, Usability WAP сайтов, личный опыт). Exposing Hidden PHP Secrets / How PHP Ticks (PHP Internals) – как работает PHP внутри. Веб-службы снаружи и изнутри. Технические и маркетинговые аспекты поисковой оптимизации сайтов. Практика независимой WEB-разработки (freelance). Достоинства применения служб LDAP на предприятии. Обработка метаданных и цифровое подписывание HTML-форм. Управление зависимостями в программном коде. Формат PHPCONF 2007 включает серию мастер-классов в течение трех дней и 2-х дневную конференцию. Мероприятия будут проходить в течение недели с 21 по 25 мая. Аудиторию конференции составят более 200 представителей крупных и средних предприятий России и СНГ: профессиональные веб-разработчики и фрилансеры, руководители IT-отделов, руководители проектов, директора по развитию, а также разработчики, повышающие свою квалификацию. Профессиональный состав участников PHPCONF традиционно обеспечивается благодаря высокому уровню знаний и опыта докладчиков, выступающих на конференции. Местом проведения PHPCONF 2007 выбран «Телеком-холл» – крупный конференц-центр, расположенный в самом сердце российского Интернета в здании знаменитого дата-центра и узла обмена трафиком ММТС-9. Символично, что многие участники конференции будут получать и обмениваться новыми знаниями в области веб-программирования всего в нескольких метрах от серверов дата-центра М9, на которых эти знания будут воплощаться в реальные проекты. В ближайшее время на сайте конференции www.phpconf.ru будет выложена официальная программа проведения и открыта регистрация участников. Будем рады Вас видеть в составе делегатов конференции!
Организаторы: №4, апрель 2007
59
web
Защита веб-служб. РНР-реализация
Александр Календарев Веб-службы с каждым днем находят все большее применение как в публичных, так и в корпоративных системах. Как правило, такие системы требуют аутентификацию клиента и криптозащиту данных. Но у конечного пользователя не всегда есть возможность организовать обмен данных по SSL-каналу. В этом случае защиту веб-служб можно построить в соответствии со спецификацией WS-Security, с помощью Open Source-библиотеки – xmlsec.
Старые песни о главном Использование веб-службы во многих внутрикорпоративных информационных системах и финансовых сервисах требуют как персонализацию доступа, так и криптозащиту передаваемой информации. Увы, при разработке группы спецификаций веб-служб консорциум W3С ориентировался прежде всего на их публичное использование, и по этой причине вопросы безопасности вебслужб изначально не рассматривались как приоритетные. Традиционный подход к защите передаваемых данных в WEB предполагает организацию защищенного SSLканала, и доступ к веб-службе организуется по протоколу HTTPS (поддерживающее шифрование данных расширение протокола HTTP). Специфика этого протокола требует наличия на сервере специального SSLсертификата, фактически привязанного к одному конкретному IP-адресу.
60
Такое решение не всегда удобно, пре- верх существующей инфраструктуры жде всего в том случае, когда нам не- систем безопасности. обходимо реализовать несколько разСпецификация WS-Security, наличных защищенных каналов на од- против, описывает форматы закрыном веб-ресурсе. Потребность в предо- тия данных и цифровой подписи SAOPставлении конфиденциальной инфор- собщений. Развертывание веб-служб мации посредствам веб-служб росла, на базе спецификации WS-Security наи требовалась разработка соответс- много проще, и этот стандарт получил твующих спецификаций. более широкое распространение. Организация продвижения станСпецификация WS-Security быдартов структурированной информа- ла разработана на базе так называции – OASIS (the Organization for the емой технологии проталкивания отAdvancement of Structured Information крытых ключей. Обычно при органиStandards) – разработала новый набор зации инфраструктуры открытых клюспецификаций по защите веб-служб, чей (Public Key Infrastructure) испольобобщив накопленный опыт и учиты- зуется один из двух подходов: создавая имеющиеся недостатки. Группой ние механизмов запроса подлинносOASIS были предложены два подхо- ти сертификата у Удостоверяющего центра, так называемое «вытягивада: SAML [5] и WS-Security [1]. SAML (Security Assertion Markup ние», или присоединение к исходноLanguage) – это язык разметки заяв- му сообщению Сертификата подлинлений системы безопасности. Он осу- ности, то есть «проталкивание» Серществляет описание функций безопас- тификата. ности, относящихся к аутентификации Сегодня количество защищенных и авторизации. SAML используется по- веб-служб постоянно увеличивает-
web ся. Существует множество реализаций соответствующих библиотек для Java-платформы. Очередной всплеск активности в разработке защищенных веб-сервисов наметился и после выхода NET-Studio 2005, включающей в себя библиотеку пространства имен Microsoft.Web.Servises.Security. Пришла пора и РНР.
Песнь песней, или Что говорят нам спецификации Спецификация WS-Security позволяет организовать защиту SOAP-сообщения вне зависимости от транспортного протокола. В основе WS-Security лежат спецификации: n XML Signature [2]; n XML Encryption [3]; n SOAP [4]. Перейдем к примерам. В соответствии со спецификацией SOAP [1] все SOAPсообщение делится на две части: заголовок и тело сообщения. Заголовок содержит всю служебную информацию и обрамлен тегами <Header>. Тело сообщения содержит наши данные. Тело сообщения обрамляется тегами <Body>. В листинге 1 изображен «конверт» SOAP-сообщения, выделенный черным цветом. Листинг 1. Место WS-Security в SOAP-сообщении <Envelope> <Header> <wse:Security> <ds:Signature> . . . </ds:Signature> </wse:Security> </Header> <Body> <data>...</data> </Body> </Envelope>
Для примера взяты данные, которые содержатся в тегах <data>...</data> и для наглядности выделены красным цветом. Как было уже упомянуто, теги <data> помещены в тело SOAP-сообщения. В заголовок помещается вся информация спецификации WS-Security. Определим для этой спецификации пространство имен wse. Корневым элементом WS-Security является тег <wse:Security>. Данный элемент в листинге 1 выделен темно-зеленым цветом. Вся информация, которая имеет отношение к цифровой подписи, определена в спецификации XML Signature, префикс пространства имен ds. В листинге 1 и далее по тексту все теги этого пространства имен изображены синим цветом. Корневым тегом пространства имён XML Signature является тег <ds:Signature>. Тег является дочерним по отношению к тегу <wse:Security>. В случае если необходимо закрыть SOAP-сообщение, то все данные в соответствии со спецификацией SOAP должны находиться в теле сообщения, а вся служебная информация в заголовке сообщения. Закрытые данные буду т предс тавлены тегами <en EncryptedData>, а вся связанная с закрытием информация – ключи, ссылки и прочее должны быть расположены в элементе <wes:Security> (см. листинг 2).
№4, апрель 2007
Листинг 2. Криптозащита SOAP-сообщения <Envelope> <Header> <wse:Security> <en:ReferenceList> <en:Data Reference URI="#bodyID"/> <en:ReferenceList> </wse:Security> <Header> <Body Id="bodyID" > <en:EncryptedData > < en:Encryption Method … /> <ds:KeyInfo >… <\dsKeyInfo> < en:CipherData> < en CipherValue>SFD0BZGwZY8KTbL... ↵ </ en:CipherValue> < en:CipherData> <en:EncryptedData > </Body> </Envelope>
Рассмотрим пример формирования цифровой подписи SOAP-сообщения. В листинге 3 показан шаблон, т.е каркас структуры сообщения, без данных криптопреобразования подписанного SOAP-сообщения. Далее, в процессе подписания SOAP-сообщения должен будет заполниться контент элементов тегов <ds:DigectValue>, <ds:SignatureValue> и <ds:X509Certificate>. В соответствии со спецификацией XML Signature подписываемые данные должны находиться в корне документа. Если они находятся не в корне, то атрибут URI элемента <ds:Reference> указывает на адрес положения корневого элемента подписываемых данных. Это может быть как внешний документ, т.е. его адрес может быть как внешним, например http://hostname/path/document или file://path/document, так и внутренней ссылкой, например, выражением xpointer или просто указателем на элемент, имеющий ссылочный атрибут Id. Если идет ссылка, через атрибут Id, то для внутренней ссылки необходимо перед значением атрибута Id указать символ #. Так как мы используем подпись SOAP-сообщения, то значение атрибута URI элемента <ds:Reference> иметь внутреннюю ссылку через атрибут Id. Значение ссылочного атрибута Id равно Body, соответственно значение атрибута URI элемента <ds:Reference> будет #Body. Листинг 3. Криптошаблон защищенного SOAP-сообщения <Envelope> <Header> <wse:Security> <ds:Signature> <ds:SignedInfo> <ds:CanonicalizationMethod Algorithm="... " /> <ds:SignatureMethod Algorithm="... " /> <ds:Reference URI="Body"> <ds:Transform> <ds:Transform Algorithm="... " /> </ds:Transform> <ds:DigestMethod Algorithm="... " /> <ds:DigestValue> </ds:Reference> </ds:SignedInfo> <ds:SignatureValue /> <ds:KeyInfo> <ds:X509Data> <ds: X509Certificate> </ds:X509Data> </ds:KeyInfo> </ds:Signature> </wse:Security> </Header> <Body Id="#BodyId"> <data>...</data> </Body> </Envelope>
61
web Листинг 4. Результат цифровой подписи XML-Документа (спецификация XML-Signature) <Envelope> <Header> <wse:Security> <ds:Signature> <ds:SignedInfo> <ds:CanonicalizationMethod Algorithm="... " /> <ds:SignatureMethod Algorithm="... " /> <ds:Reference URI="#Body"> <ds:Transforms>...</ds:Transforms> <ds:DigestMethod Algorithm="... " /> <ds:DigestValue >HjY8ilZAIEM2tBbPn5mYO1ieIX4=<ds:DigestValue > </ds:Reference> </ds:SignedInfo> <ds:SignatureValue> SIaj/6KY3C1SmDXU2++Gm31U1xTadFp04WhJ/ajq8/l4ncAi2 BgfsJFbxrL+q7GKSKN9kfQ+UpN9+iD5fWmuavXEHe4Gw6R ... .................................................. ... hWYJ4ewZJ4hM4JjbFqZO+OEzDRSbw3DkmuBA/mtlx+3t13 5hqoMdVmtth/eTb64dsPdl9r 3k1ACVX9f8aHfQQdJOmLFQ== <ds:SignatureValue> <ds:KeyInfo > <ds:X509Data> <ds:X509Certificate> MIIE3zCCBEigAwIBAgIBBTANBgkqhkiG9w0BAQQ owgb8xCzAJBgNVBAYTAlVTMRMwEQYDVQQIEw ... ........................................... ... Zm9ybmlhMT0wOwYDVQQKEzRYTUwgU2VjdXJp dHkgTGlicmFyeSAoaHR0cDovL3d3dy5hbGVrc2V5L== </ds:X509Certificate> </ds:X509Data> </ds:KeyInfo > </ds:Signature> </wse:Security> </Header> <Body Id="Body"> <data>...</data> </Body> </Envelope>
Как было отмечено, контент (закодирован как Binary64) части элементов заполняется после обработки шаблона (см. листинг 3) криптопроцессором: n <ds:DigectValue> – содержит дайджест сообщения; n <ds:SignatureValue> – значение цифровой подписи; n <ds:X509Certificate> – данные приложенного сертификата. Результат обработки показан в листинге 4. Однако в соответствии с рекомендациями спецификации WS‑Security все данные о ключах и сертификатах рекомендует выносить в элемент <wse:BinarySecurityToken> пространства имен WSSecurity. Данный элемент в соответствии со спецификацией WS-Security является дочерним элементом <wse:Security>. Для определения месторасположения и состава данных, которые «должны» содержаться в элементе <ds:KeyInfo>, используются элементы <wse: Reference> и <wse:SecurityTokenReference>. Элемент <wse:Reference> аналогично элементу <ds:Reference> содержит атрибут URI, который содержит локальный адрес ссылки. Алгоритм формирования атрибута URI аналогичен алгоритму формирования атрибута URI элемента. Итак, последний шаг – это приведение полученного результата в соответствие со Спецификацией WS-Security. Для этого необходимо содержание элемента <ds:X509Certificate> перенести в элемент <wse:BinarySecurityToken>, а сам элемент <ds:X509Data> вместе с дочерним элементом
62
<ds:X509Certificate> удалить. Это показано в листинге 5. Подлежащий удалению контент в листинге 5 отображен серым цветом. В элемент <ds:KeyInfo> добавляются элементы <wse:Reference> и <wse:SecurityTokenReference>, а атрибут URI элемента <wse:Reference> должен будет указывать на локальный ссылочный адрес, через Id элемента <wse:BinarySecurityToken>.
С песней по жизни, или Хватит теории – ближе к делу
Для реализации спецификации WSSecurity на практике у нас есть несколько возможных путей. Реализация средствами РНР алгоритма подписи SAOP-сообщения, используя расширения mcrypt и OpenSSL. Данный вариант хорош, но слишком трудоемок. А нет ли путей решения, использующих уже готовые механизмы? Как вариант можно портировать готовые библиотеки классов .NET или JAVA. Данный вариант требует трудозатрат на изучение не простого API соответствующих классов .NET и JAVA. Можно использовать оболочку php-swig (www.swig.org) и портировать необходимые функции библиотек libxmlsec (www.aleksey.com/xmlsec) или xml-security-с (http://xml.apache.org/security). Однако данный вариант, аналогично предыдущему, требует значительных трудозатрат на изучение API С-функций. Наиболее простым решением будет использование утилиты командной строки xmlsec, которая входит в дистрибу-
Листинг 5. Приведение XML-Signature к WS-Security <Header> <wse:Security> <wse:BinarySecurityToken EncodungType="wse:Base64Binary" Value Type="wse:X509v3" Id="KeyToken"> gPC6vbTV50fxaXO/ZvOb6osvWmJpQBlJIOxRBcs2nS Y8MTqPgAa02gtaLQ6Thmpx1rc6VHuraLuIcsQ2BLu9 ............................................ REYvU2LtjCZfnBntDgvygJ1bzHCR8SxjzIAfHRsxpv== </wse:BinarySecurityToken > <ds:Signature> <ds:SignedInfo>. . .</ds:SignedInfo> <ds:SignatureValue>. . .</ds:SignatureValue> <ds:KeyInfo > <wse:SecurityTokenReference> <wse:Reference URI="#KeyToken"> </wse:SecurityTokenReference> <ds:X509Data> <ds:X509Certificate> gPC6vbTV50fxaXO/ZvOb6osvWmJpQBlJIOxRBcs2nS Y8MTqPgAa02gtaLQ6Thmpx1rc6VHuraLuIcsQ2BLu9 ............................................ REYvU2LtjCZfnBntDgvygJ1bzHCR8SxjzIAfHRsxpv== </ds:X509Certificate> </ds:X509Data> </ds:KeyInfo > </ds:Signature> </wse:Security> </Header>
web тив библиотеки libxmlsec. Рассмотрим предложенный вариант более подробно. Для использования утилиты командной строки xmlsec необходимо установить библиотеку libxmlsec (официальный сайт – http://aleksey.com/xmlsec). Установка под *NIX-платформы может осуществляется как из источников, так и из портов (FreeBSD) или RPM (Linux), для Windows есть бинарные библиотеки. Для развертывания библиотеки libxmlsec требуются дополнительные библиотеки: n OpenSSL 0.9.7; n libgcrypt-1.2.1; n libgpg-error-1.0. Это необходимо учитывать тем, кто собирается устанавливать libxmlsec из источников. Алгоритм формирования цифровой подписи SOAP-сообщения представляет собой три основных шага: n формирование XML Signature шаблона; n подпись шаблона в соответствии требовании спецификации W3C XML Signature; n приведение подписанного документа к требованиям спецификации Ws-Security.
механизмы перенаправления ввода-вывода. Далее будем рассматривать реализацию UNIX-версии. Первоначально необходимо записать наш шаблон во временный файл, а потом сформировать и выполнить соответствующую командную строку: Листинг 7. Пример кода формирования подготовки данных для их цифровой подписи (XML-Signature) 01 02 03 04 05 06 07 08 09
$temp_path = "/home/akalend/tmp"; $prefix = "in"; $tmpfname = tempnam($temp_path , $prefix ); $tpl->save($tmpfname); $key="/home/akalend/xmlsec/rsakey.pem"; $certFile="/home/akalend/xmlsec/rsacert.pem"; $cmd="xmlsec1 --sign --privkey-pem $key,$certFile ↵ --id-attr:id body $tmpfname 2>&1";
В приведенном коде строки 1-4 формируют промежуточный файл нашего шаблона в директории $temp_path. Строки 6, 7 определяют полные имена файлов – закрытый ключ (rsakey.pem) и сертификат подлинности (rsacert.pem). Строка 9 – формирование команды для выполнения в командном режиме. Утилита xmlsec1 имеет следующие параметры: n --sign – подпись XML-документа; Формирование шаблона. Шаблон должен соответс- n --verify – проверка подписи; твовать структуре XML-документа, указанного в листин- n --encrypt – закрытие XML-документа; ге 3. Шаблон может быть сформирован либо как DOM-до- n --decrypt – открытие XML-документа; кумент, либо загружен из файла, это на усмотрение раз- n --privkey-pem – для криптоопераций используется заработчика. Нам необходимо подписываемое сообщение, крытый личный ключ [, личный сертификат,...]; а точнее, данные XML-документа, импортировать в тело n --pubkey-pem – для криптоопераций используется отSOAP-сообщения. крытый личный ключ; В листинге 6 приведен пример формирования подпи- n --pubkey-cert-pem – для криптоопераций используетсываемого шаблона: ся root- сертификат. Листинг 6. Пример кода формирования шаблона с подписываемым XML-документом 01 02 03 04 05 06 07 08 09 10 11 12
$doc = new DOMDocument(); $doc->loadXML( $dataTxt); $tpl = new DOMDocument(); $tpl->loadXML( $xml); $root = $doc->documentElement; $data =$tpl->importNode($root, true); $body0 = $tpl->getElementsByTagName("Body"); $body = $body0->item(0); $body->appendChild( $data );
Строки 1, 2 загружают данные для документа, которые должны быть включены в тело SOAP-сообщения (внутрь элемента <Body>). Строки 4, 5 загружают шаблон SOAP-сообщения, который должен соответствовать шаблону в листинге 3 с пустым элементом <Body/>. Строки 7-12 реализуют импорт тела документа $doc в дочерний элемент <Body/> шаблона $tpl. Подпись шаблона осуществляется утилитой командной строки xmlsec. Следует отметить, что Windows и UNIX-версии будут немного отличаться. Во-первых, утилита командной строки в UNIX-версии называется xmlsec1, а в Windows версии – xmlsec. Так же в Windows-версии немного иначе работают
№4, апрель 2007
Так как для подписи используется внутренняя ссылка (id="body"), то из-за специфики реализации работы с указателями xpointer() в libxml необходимо явно указывать на ссылающийся элемент. В связи с этим используется параметр --id-attr:id Body (ссылка осуществлена посредством атрибута id элемента <Body id="body">). Как альтернативу можно использовать DTD-объявления. В нашем примере при выполнении в режиме командной строки осуществляется перенаправление stderr в поток стандарного вывода. В этом случае и результат, и ошибка будут в потоке стандартного вывода. Осуществим выполнение команды и получение результата через popen(): Листинг 8. Пример кода формирования цифровой подписи XML-документа (XML-Signature) 01 02 03 04 05 06 07 08 09
$p = popen( $cmd, 'r'); $readStream = ""; while( !feof($p) ) $readStream .= fread($p , 8192); pclose($p); if( strpos($readStream, "<?xml version=\"1.0 \"") ↵ === false ) die("error:" . $readStream); $doc->loadXML( $ readStream );
Строки 1-5 осуществляют выполнение командным процессором строки $cmd. Строки 7, 8 осуществляют гру-
63
web бую проверку – является ли входной документ XML-документом или это сообщение об ошибке. Принципиально такой проверки вполне достаточно. Как вариант можно использовать два промежуточных файла $tmpfname_in и $tmpfname_out. Тогда в командной строке добавится параметр --output $tmpfname_out. Строка 9 загружает данные из переменой в XMLDocument для дальнейшей обработки. Приведение к спецификации WS-Security осуществляется путем переноса содержания узла XMLNode <X509Certificate> в узел <BinarySecurityToken id="bst"> и удаление узла <X509Data>. Листинг 9. Пример кода переноса данных из узла <X509Data> в узел <BinarySecurityToken> 01 02 03 04 05 06
$x509cert = $doc-> ↵ getElementsByTagName("X509Certificate") -> item(0); $bst = $doc -> ↵ getElementsByTagName("BinarySecurityToken") -> item(0); $bst ->NodeValue = $ x509cert-> NodeValue; $KeyInfo = $x509cert -> parentNode -> parentNode; $KeyInfo->removeChild($x509cert -> parentNode );
С т р о к и 1, 2 о с у щ е с т в л я ю т в ы д е л е н и е у з л о в <X509Certificate> и <BinarySecurityToken>, а строка 3 – присвоение содержания одного узла другому. Строки 5, 6 выполняют уничтожение узла <X509Data> и его потомков.
Сколько песен еще недопето, или Что и как можно еще реализовать Говоря о защите SOAP-сообщения, необходимо упомянуть об алгоритме проверки подписи SOAP-сообщения: n приведение подписанного документа к требованиям Спецификации W3C XML Signature; n проверка цифровой подписи XML-сообщения утилитой xmlsec.
В случае измененного дайджеста подписи или сертификата: ERROR SignedInfo References (ok/all): 1/1 Manifests References (ok/all): 0/0
Если рассматривать криптозащиту SOAP-сообщения, то алгоритм закрытия SOAP-сообщения аналогичен алгоритму цифровой подписи SOAP-сообщения: n формирование XML Encryption-шаблона; n шифрование XML-документа шаблона в соответствии требованиям спецификации W3C XML Encryption; n приведение зашифрованного документа к требованиям спецификации Ws-Security. Если используется алгоритм rsa-oaep-mgf1p и используется прилагаемый сертификат, то значение узла /KeyInfo/ EncryptedKey/KeyInfo/X509Data/X509Certificate должно быть перенесено в содержание узла <BinarySecurityToken id="bstenc">, а вместо него дочерним узлом /KeyInfo/ EncryptedKey/KeyInfo станет узел BinarySecurityReference/ Reference, который должен иметь значение атрибута URI="#bstenc" (указатель на узел <BinarySecurityToken>) Аналог кода – листинг 8. В этом случае командная строка должна принять следующий вид: $cmd = "xmlsec1 encrypt --binary-data $tmpfnameDoc ↵ --privkey-pem $key,$certFile ↵ --session-key des-192 $tmpfnameTpl 2>&1"
Значение ключа --session-key des-192 сообщает утилите xmlsec, что необходимо осуществлять шифрование сессионным ключом des-192. Аналог кода – листинг 7. Для дешифрования SOAP-сообщения используется алгоритм, аналогичный алгоритму проверки цифровой подПриведение подписанного SOAP-сообщения к требо- писи. Первоначально приводим к требованиям спецификаваниям Спецификации W3C XML Signature заключается ции W3c XML Encryption, а далее вызываем утилиту xmlsec в создании дочернего узла <X509Data><X509Certificate> и анализируем результат. Если нет ошибок, то выделяем для узла <KeyInfo> и присвоение ему содержания узла «расшифрованное тело» SOAP-сообщения. Командная <BinarySecurityToken id="bst">. Это реализуется кодом, ана- строка для дешифрования: логичныму приведенным в листинге 8. Формирование $cmd = "xmlsec1 dencrypt --pubkey-cert-pem $certFile ↵ временного файла – аналогично коду в листинге 6, стро $tmpfnameDoc 2>&1"; ки 1-4. Проверка цифровой подписи XML-сообщения утилитой Рассматривая алгоритмы защиты SOAP-сообщений, xmlsec осуществляется командной строкой: мы опустили из рассмотрения транспорт. Если в качестве транспорта используется HTTP-протокол, то наилучшим ва$cmd="xmlsec1 --verify --trusted-pem $certFile ↵ риантом будет использование библиотеки curl.
--id-attr:id body $tmpfname 2>&1";
Необходимо осуществить анализ результата. Если подпись соответствует, то будет выведен следующий результат: OK SignedInfo References (ok/all): 1/1 Manifests References (ok/all): 0/0
В случае измененного текста сообщения: FAIL SignedInfo References (ok/all): 0/1 Manifests References (ok/all): 0/0
64
Раз словечко, два словечко – будет песенка, или Вместо заключения Одним из недостатков Open Source, если это не инвестиционный проект крупных фирм, таких как IBM или Microsoft, является инертность по отношению к новым технологиям. Это объясняется тем, что большинство разработчиков Open Source, как правило, занимаются своими проектами вне рабочего времени, или в Open Source отдается уже готовая разработка проекта какой-нибудь фирмы, после чего ее развитие сильно замедляется. Из этого правила есть исключения, и некоторые фирмы (например, Yahoo) уде-
web ляют немалое внимание Open Source, альфа-тестирование и готов для провыделяя своим сотрудникам часть вре- мышленной реализации. Он испольмени на развитие подобных проектов. зует часть функций, которые в будуК сожалению, вышеописанный недо- щем должны войти в libxmlsec, поэтостаток присущ и libxmlsec, и ее разви- му логично дождаться включения нотие происходит не так активно, как хо- вых шаблонных функций в libxmlsec, а уже потом включать модуль в PECL. телось бы. К настоящему времени мною на- Для желающих познакомиться с модуписаны некоторые функции по ре- лем – его описание и исходные тексты а лизации шаблонов WS -Security, с примерами можно найти по адресу но до включения их в библиотеку де- www.edocs.phpclub.net/xmlsec. ло пока не дошло. Функции находятЕсли давать краткую характерисся на этапе альфа-тестирования. Open тику этому модулю, то он призван заSource сообществу разработчиков менить собой PHP-код в листинге 6. libxmlsec также был предложен вари- Модуль реализует спецификации: ант изменения некоторых основных XML Signature и XML Encryption. функций ядра, но эти функции играют Как показала практика использоважную роль, и их изменение затруд- вания модуля php_xmlsec и общение нительно и нуждается в широком тес- в форумах большинство программистировании. Поэтому, очевидно, более тов интересует практическая стороправильное решение – это написание на применения, связанная с защитой новых базовых функций, чем я парал- веб-служб. Поэтому в настоящее врелельно и занимаюсь. мя начата работа над новым расширеТакже мною, в соавторстве с Робом нием (модуль php_wssecurity). Но опять Ричардсоном (Rob Richards), реализо- же разработка модуля php_wssecurity ван PHP-интерфейс к libxmlsec (модуль возможна только после доработки php_xmlsec) и небольшая часть интер- части шаблонных функций libxmlsec, фейса к WS-Security. Модуль прошел реализующих шаблоны в соответс-
№4, апрель 2007
твии со спецификацией Web Services Security. 1. Web Services Security: SOAP Message Security 1.1 – http://docs.oasis-open.org/ wss/oasis-wss-soap-message-security-1.1. 2. XML Signature – http://www.w3.org/TR/ xmldsig-core. 3. XML Encryption – http://www.w3.org/TR/ xmlenc-core. 4. Simple Object Access Protocol (SOAP) 1 – http://www.w3.org/TR/SOAP. 5. SAML (Securit y Asser tion Markup Language) – http://www.oasis-open.org/ committees/security. 6. Документация по использованию утилиты xmlsec1 – http://aleksey.com/xmlsec/ docs/xmlsec-man.html. 7. PHPInside (www.phpinside.ru, печатный выпуск 2006). Пятая международная PHP-конференция. А.Календарев. Криптозащита в B2b-веб-приложениях с использованием XML-Security. Москва, 2006 г. 8. А.Календарев. Примеры использования и описание модуля php_xmlsec. Санкт-Петербург, 2007 г. – www.edocs. phpclub.net/xmlsec.
65
bugtraq Выполнение произвольного кода в Citrix Presentation Server Client
Уязвимость при обработке сообщений в Symantec Mail Security for SMTP
Программа: Citrix Presentation Server Client версии до 10.0. Опасность: Критическая. Описание: Уязвимость существует из-за неизвестной ошибки в функционале поддержки ICA-подключений через прокси-сервер. Удаленный пользователь может с помощью специально сформированного веб-сайта выполнить произвольный код на целевой системе. URL производителя: www.citrix.com/English/SS/downloads/ details.asp?dID=2755&downloadID=22400&pID=186. Решение: Установите последнюю версию (10.0 или выше) с сайта производителя.
Программа: Symantec Mail Security for SMTP 5.0 for Windows, возможно, более ранние версии. Опасность: Критическая. Описание: Уязвимость существует из-за ошибки при обработке определенных сообщений. Удаленный пользователь может с помощью специально сформированного сообщения вызвать отказ в обслуживании или выполнить произвольный код на целевой системе. URL производителя: www.symantec.com/enterprise/products/ overview.jsp?pcid=1008&pvid=845_1. Решение: Установите исправление (Patch 175) с сайта производителя.
Переполнение буфера в Mercury Mail Transport System Программа: Mercury Mail Transport System 4.01b и 4.01a, возможно, более ранние версии. Опасность: Критическая. Описание: Уязвимость существует из-за ошибки проверки границ данных при обработке IMAP-сообщений, полученных от клиента. Удаленный пользователь может с помощью специально сформированной последовательности IMAP-команд вызвать переполнение стека и выполнить произвольный код на целевой системе. U R L п р о и з в о д и т е л я : w w w. p m a i l .c o m /ove r v i e w s / ovw_mercury.htm. Решение: В настоящее время способов устранения уязвимости не существует.
Множественные уязвимости в продуктах Kaspersky
Программа: Kaspersky Internet Security 6.x, Kaspersky AntiVirus 6.x, Kaspersky Anti-Virus 5.x. Kaspersky Anti-Virus 4.x. Опасность: Высокая. Описание: 1. Уязвимость существует из-за того, что приложение использует небезопасные методы (например, StartUploading()) в AxKLSysInfo.dll и AxKLProd60.dll ActiveX‑компонентах. Удаленный пользователь может с помощью специально сформированного веб-сайта удалить или скачать произвольные файлы на системе. 2. Целочисленное переполнение обнаружено в драйвере klif.sys в функции _NtSetValueKey(). Локальный пользователь может вызвать переполнение динамической памяти и выполнить произвольный код на системе с повышенПереполнение буфера в Novell Netmail ными привилегиями. Программа: Novell Netmail 3.5.2, возможно, более ранние 3. Уязвимость существует из-за ошибки в драйвере версии. klif.sys, которая позволяет локальному пользователю выполОпасность: Критическая. нить произвольный код на системе с привилегиями Ring-0. Описание: Уязвимость существует из-за ошибки проверки 4. Уязвимость существует из-за ошибки проверки граграниц данных в WEBADMIN.EXE при обработке HTTP Basic- ниц данных в модуле arj.ppl в OnDemand Scanner. Удаленный аутентификации. Удаленный пользователь может послать пользователь может с помощью специально сформированслишком длинное имя пользователя (более 231 байт) на порт ного ARJ-архива вызвать переполнение динамической паприложения 89/TCP, вызвать переполнение стека и выпол- мяти и выполнить произвольный код на целевой системе. нить произвольный код на целевой системе. URL производителя: www.kaspersky.com URL производителя: www.novell.com/products/netmail. Решение: Установите последнюю версию (6.0.2.614 или выРешение: Установите исправление (NetMail 3.52E) с сай- ше) с сайта производителя. та производителя.
Уязвимость при обработке ICMP6‑пакетов в OpenBSD Программа: OpenBSD 3.9 и 4.0, возможно, более ранние версии. Опасность: Критическая. Описание: Уязвимость существует из-за ошибки в «mbuf» при обработке ICMP6-пакетов. Удаленный пользователь может с помощью специально сформированного ICMP6‑пакета вызвать повреждение памяти и аварийно завершить работу системы или выполнить произвольный код в целевой системе. URL производителя: www.openbsd.org. Решение: Установите исправление с сайта производителя.
66
Переполнение буфера в War FTP Daemon
Программа: War FTP Daemon 1.65, возможно, более ранние версии. Опасность: Высокая. Описание: Уязвимость существует из-за неизвестной ошибки до начала процесса аутентификации. Удаленный пользователь может вызвать переполнение стека и выполнить произвольный код на целевой системе. URL производителя: www.support.jgaa.com/index.php?cmd= Download&ProductID=1. Решение: В настоящее время способов устранения уязвимости не существует. Производитель рекомендует использовать версию 1.80.
Составил Александр Антипов
bugtraq Обход ограничений безопасности в Mozilla Firefox
Переполнение буфера при обработке GET‑запросов в NaviCOPA
Программа: Mozilla Firefox версии до 1.5.0.11 и 2.0.0.3. Опасность: Низкая. Описание: Уязвимость существует из-за ошибки при обработке FTP PASV-команд. Удаленный пользователь может создать специально сформированную страницу, которая заставит браузер пользователя подключиться к FTP-серверу и просканировать порты произвольной системы, включая локальную сеть пользователя. URL производителя: www.mozilla.org. Решение: Установите последнюю версию (1.5.0.11 или 2.0.0.3) с сайта производителя.
Программа: NaviCOPA 2.01 released 2006-10-06, возможно, более ранние версии. Опасность: Высокая. Описание: Уязвимость существует из-за недостаточной обработки HTTP GET-запросов. Удаленный пользователь может с помощью слишком длинного HTTP GET-запроса к ресурсу, чье имя начинается с cgi-bin или cgi, вызвать переполнение буфера и выполнить произвольный код на целевой системе. Пример:
Межсайтовый скриптинг в Mozilla Firefox Firebug Extension
GET /cgi-bin/AAAAAAAAAAAAA....
URL производителя: www.navicopa.com Решение: Установите последнюю версию (2.01 released 2007-03-23) с сайта производителя.
Программа: Firebug (расширение к Mozilla Firefox) версии до 1.02. Опасность: Высокая. Переполнение буфера Описание: Уязвимость существует из-за недостаточ- вIpswitch IMail Server/Collaboration Suite ной обработки входных данных, передаваемых функции Программа: Ipswitch Collaboration Suite 2006, IMail Server console.log(). Удаленный пользователь может с помощью 2006. специально сформированного веб-сайта выполнить про- Опасность: Критическая. извольный код сценария в браузере жертвы в контексте Описание: Уязвимость существует из-за ошибки проверки «chrome:». границ данных в IMAILAPI.DLL ActiveX-компоненте при обраURL производителя: https://addons.mozilla.org/en-US/firefox/ ботке членов WebConnect и Connect в IMAILAPILib.IMailServer, addon/1843. Sync3 и Init3 компонента IMAILAPILib.IMailLDAPService, Решение: Установите последнюю версию (1.02 или выше) и в SetReplyTo компонента IMAILAPILib.IMailUserCollection. с сайта производителя. Удаленный пользователь может с помощью специально сформированного веб-сайта вызвать переполнение динаПереполнение буфера в Apache Tomcat мической памяти или переполнение стека и выполнить проПрограмма: Apache Tomcat 5.5.20, Apache Tomcat 4.1.34, извольный код на целевой системе. Apache Tomcat JK Web Server Connector 1.2.19 и 1.2.20. URL производителя: www.ipswitch.com. Опасность: Высокая. Решение: Установите исправление с сайта производитеОписание: Уязвимость существует из-за ошибки провер- ля. ки границ данных в функции map_uri_to_worker() в библиотеке mod_jk.so. Удаленный пользователь может с помощью слишком длинного URL-запроса (более 4,095 байт) Переполнение буфера вызвать переполнение стека и выполнить произвольный в ActiveX‑компоненте в McAfee ePolicy код на целевой системе. Orchestrator/ProtectionPilot URL производителя: www.tomcat.apache.org. Программа: McAfee ePolicy Orchestrator 3.5.0 (Patch 5 and Решение: Установите последнюю версию (1.2.21) с сайта earlier), McAfee ePolicy Orchestrator 3.6.0 (Patch 5 earlier), производителя. McAfee ePolicy Orchestrator 3.6.1, McAfee ProtectionPilot 1.1.1 (Patch 3 and earlier), McAfee ProtectionPilot 1.5.0. Несколько уязвимостей в ядре Linux Опасность: Высокая. Программа: Linux Kernel версии до 2.6.20.3. Описание: Уязвимость существует из-за ошибки проверОпасность: Средняя. ки границ данных в SITEMANAGER.DLL ActiveX-компоОписание: 1. Ошибка разыменования нулевого указателя ненте при обработке аргументов, передаваемых методам обнаружена в файле net/netfilter/nfnetlink_log.c. Удаленный ExportSiteList() и VerifyPackageCatalog(). Удаленный пользопользователь может послать специально сформированный ватель может с помощью слишком длинного аргумента выпакет и вызвать панику ядра системы. звать переполнение стека и выполнить произвольный код 2. Уязвимость существует из-за ошибки в conntrack при на целевой системе. ассемблировании фрагментированных IPv6-пакетов. Зло- URL производителя: www.mcafee.com. умышленник может обойти некоторые установленные пра- Решение: Установите исправление с сайта производитевила и рано принять ESTABLISHED-пакеты. ля. URL производителя: www.kernel.org. Составил Александр Антипов Решение: Установите последнюю версию ядра с сайта производителя.
№4, апрель 2007
67
сети
Альтернативные беспроводные средства связи
Иван Максимов Лидером в области беспроводных сетей на данный момент является стандарт Wi-Fi, который в будущем, возможно, будет заменен на WiMAX. Но, несмотря на распространенность, Wi‑Fi обладает многими недостатками, есть ли альтернативные решения для организации беспроводной сети? 68
сети
Б
еспроводные сети все больше и больше вытесняют с рын- Альтернативные средства ка проводные решения. Связа- передачи данных но это с тем, что идея использовать В настоящее время многие организации исвместо проводной связи радиоволны пытывают нехватку мощностей выделенных крайне привлекательна, позволяя ре- линий, несмотря даже на то, что интернетшать массу технических, экономичес- провайдеры постоянно снижают тарифы на каналы связи и поднимают скорости пеких и административных проблем. Какие решения для организации редачи данных – этого недостаточно. Мечта беспроводных сетей можно найти се- любого системного администратора – 100 годня на рынке? Несомненно, лиди- мегабитная линия, ну а просто сказочный рующее положение сегодня занима- сон – гигабитное оптоволоконное соединеет знакомый многим стандарт Wi-Fi ние! Фантастика? Но давайте не будем спе(Wireless Fidelity, ieee 802.11), идеально шить, возможно, есть альтернативы станподходящий для организации локаль- дартным средствам передачи данных. Зачастую многие из нас для переданой сети там, где применение стандартного проводного оборудования неце- чи больших объемов данных (дистрибулесообразно по экономическим сооб- тивы ОС, базы данных и другое) испольражениям или невозможно техничес- зуют обычные оптические носители, воски. К сожалению, к недостаткам дан- пользуемся данным методом и рассчитаного стандарта можно отнести малую ем скорость передачи информации, переобласть покрытия – сотни метров, хо- даваемой КамАЗом, груженным DVD-дистя очень многое зависит от используе- ками и двигающимся со скоростью 100 кимых частот и оборудования (на практи- лометров в час. Итак, за основу возьмем КамАЗ модель ке энтузиасты, используя направленные антенны, расположенные «в чис- 43118. Объем его кузова примерно равен том поле», добивались устойчивой свя- 24 кубометра, исходя из этого диски будем укладывать в коробки, равные 1 кубометзи на расстоянии 5 километров). Для организации беспроводной ру. Один DVD-диск в стандартном боксе связи на значительные расстояния занимает размер 14,2х12,5х1 (длина/шиможно прибегнуть к продолжению рина/высота в сантиметрах). Произведем стандарта Wi-Fi – WiMAX (Worldwide расчет технических параметров, по котоInteroperability for Microwave Access, рым можно узнать, сколько дисков войдет ieee 802.16). Теоретически WiMAX поз- в одну коробку: воляет «покрыть» область, равную У представленных стандартов ра112,6 километра, при скорости передачи в 70 Мб/c. Правда, на практике диосвязи (да и многих других) есть цифры «немного» скромнее: радиус один явный недостаток – малая зопокрытия – до 10 километров, а ско- на покрытия, низкая скорость перерость передачи всего несколько ме- дачи, но самое главное, при большом габит. Скромные технические харак- количестве помех между приемнитеристики объясняются тем, что стан- ком и передатчиком (в городах – додарт с момента первой публикации ма, на пересеченной местности – возв 2001 году множество раз дополнял- вышенности) дальность зоны покрыся и изменялся, а производители обо- тия сильно сокращается либо вообрудования, спешившие выпустить его, ще невозможна. Как же быть, если необходимо наотталкивались от незавершённых вариантов ieee 802.16, что привело к мно- ладить связь в гористой местности или мегаполисе? Использовать спутжеству проблем. На данный момент сложилась си- ник для двухсторонней связи крайне туация, что оборудование разных про- неэкономично, прокладка витой пары изводителей зачастую несовместимо или оптоволокна зачастую невозмождруг с другом (выпущенное даже по од- на технически. Кажется, что мы опять возвращаной спецификации). Несомненно только одно, что аналогично с Wi‑Fi для до- емся к старым проблемам, подобным стижения хороших показателей не- проводным сетям. К счастью, для кажобходимы качественные антенны пе- дой задачи всегда есть альтернативредатчики-приемники (к сожалению, ные решения, сегодня мы рассмотрим один весьма перспективный стандарт очень дорогостоящие).
№4, апрель 2007
n по длине: 100/14,2=~7; n по ширине: 100/12,5=~8; n по высоте: 100/1=100. Теперь рассчитаем один слой в коробке: 7*8=56 и умножим на количество слоев, то есть на 100, получим 5600. Итак, в одной коробке помещается 5600 дисков, умножим это число на количество коробок, то есть на 24, получим 134400 дисков. Умножим общее количество компакт-дисков на объем информации, расположенной в них: 134400*4,7 Гб получим 631680 Гб. Теперь рассчитаем скорость передачи в секундах, так как изначальная в часах, для этого разделим получившееся число на 3600, получаем 175.4 Гб в секунду. И последнее, переведем байты в биты. 175.4*8=1,403 Тб в секунду. Задумайтесь! 1,4 Тб в секунду! Пожалуй, эта скорость с лихвой опережает спутниковую связь. Конечно, мы пренебрегли такими параметрами, как время записи дисков и расстояние между точками, но это незначительные факторы. Для повышения скорости передачи данных можно организовывать автомобилям «зеленые» коридоры (чтобы избежать пробок). Для этого, например, выделим КамАЗы из общего автомобильного потока, сделав на кузове большими буквами надпись – Internet.
RFC 1149 и его логическое продолжение RFC 2549.
RFC 1149 Итак, стандарт RFC 1149 «A Standard for the Transmission of IP Datagrams on Avian Carriers» [1] был предложен Дэвидом Вейтцманом (David Waitzman) в 1991 г. В стандарте описывается экспериментальный метод инкапсуляции IP-дейтограмм в птичьих курьерах. С самого начала – о грустном. К недостаткам птичьих курьеров можно отнести: высокую задержку, низкую пропускную способность, низкое качество обслуживания, а также недостаточный контроль самого процесса и наличие так называемого птичьего фактора, который необходимо учитывать в создании данного метода. Организация сети ограничена топологией точка-точка (point‑to-point) для каждого птичьего курьера, но возможно использовать многопоточность,
69
сети так как трехмерный эфир связи поз- те, далее пакет скручивается вокруг правки коротких сообщений на больволяет использовать множество ку- ноги птичьего курьера и закрепляется шие расстояния (не путать с SMS!), рьеров, при этом пакеты не перекры- либо специальным кольцом (подобные связано это с тем, что за последние ваются друг другом, как это бывает кольца можно купить в зоомагазинах), 200‑300 лет селекционным путем быв проводных сетях (исключение – вес- либо резинкой. Нужно сразу уточнить, ли выведены специальные виды этих на, в данный сезон почтовые курьеры что размер пакета будет ограничен птиц, способные преодолевать расстомогут перекрывать друг друга, что мо- длиною ноги птицы. MTU, к сожалению, яние до 3000 км! Даже WiMAX не может жет привести к коллизии и полной по- точно не определен и, как это ни па- тягаться с такой зоной покрытия. тере пакета). радоксально, вообще увеличивается Птицы с легкостью решают проблеТеперь о положительных момен- с возрастом курьера. Типичный MTU – мы информационной безопасности, так тах. Птицы имеют собственную систе- 256 миллиграммов. Итак, после от- как в них крайне эффективно реалиму предотвращения столкновения, ко- правки пакета птичий курьер достигает зованы механизмы уничтожения черторая увеличивает качество обслужи- получателя. Там напечатанный IP‑па- вей и других паразитов. Также в слувания. В отличие от радиоволн переда- кет разворачивается, сканируется (по- чае необходимости возможно шифроча не ограничена обзором радиолуча дойдет даже ручной сканер) и вводится вание пакета. При проведении аудита и с легкостью огибает любые препятс- в ЭВМ. Нужно отметить, что возможна подобной сети, при поиске потерянных твия как естественного, так и искусст- и ручная обработка пакета. пакетов следует обращать внимание венного происхождения (горы, дома, Дэвид Вейтцман хоть и не уточня- на крыши домов и телефонные столбы леса, глушители и другие). Послед- ет, какое оборудование на канальном (в сельской местности), именно в таких ний критерий должен способствовать уровне модели OSI использовать луч- местах чаще всего теряются пакеты. внедрению RFC 1149 в мегаполисах, ше всего, но явно намекает, что для ре- Связано это в первую очередь с упомягде количество препятствий для ра- ализации спецификации лучше всего нутым временем года – весна, так как подходят почтовые голуби. С чем это в это время года голуби самогенеридиоволн достаточно велико. Как это работает? IP-пакет печа- связано? Почтовые голуби уже давно руются, что, с одной стороны, являеттается на листе бумаги в hex-форма- хорошо зарекомендовали себя для от- ся минусом (временная потеря данных), а с другой – плюсом данной специфиНекоторые факты о RFC 2549 Продолжая тему оборудования, стоит кации (прирост оборудования). В 1999 году Дэвид Вейтцман выпустил до- заметить одну деталь: окна могут привлеИтак, рассмотрев рекомендации спеполнение к RFC 1149 – RFC 2549 (IP over кать почтовых голубей, сбивая своим блес- цификации, уважаемый читатель, возAvian Carriers with Quality of Service) [3], рас- ком их с пути. Исходя из этого стоит остере- можно, скептически отнесется к практисказывая о некоторых рекомендациях к ба- гаться прокладывать маршруты около окон ческой реализации данного стандарта, зовой спецификации. Итак, какие уровни и тем более не следует прокладывать мар- поэтому рассмотрим опыт европейских качества обслуживания (тот самый QoS, шруты через них. При практической реали- коллег по внедрению RFC 1149. который некоторым системным администраторам уже в ночных кошмарах снится) можно применить к данной спецификации, повысив эффективность передачи данных? Уровни качества обслуживания бывают: СВ, купе, плацкарт... Ну а если серьезно, Дэвид рекомендует использовать страусов в качестве оборудования на канальном уровне для доставки пакетов. Высокая скорость передачи данных, большой MTU, но это плюсы, есть и минусы, страусы не летают, поэтому между конечными узлами сети необходимо наличие мостов. Также Дэвид предупреждает: несмотря на высокую популярность пингвинов использовать их не рекомендуется – они так же, как и страусы, не летают (правда, в арктических условиях их применение может быть весьма актуально, так как «птицы»-амфибии лучше всего справятся с айсбергами). Использование Beastie (того самого демоненка), так же как и пингвина, весьма сомнительно и остается открытым вопросом, которым, несомненно, должно озаботиться сообщество Open Source.
70
зации RFC 1149 специалисты из BLUG ссылались на то, что необходима очередь пакетов (подобная очереди в TCP/IP). Данный вопрос был освещен в RFC 2549, где рекомендуется маркировать птиц штрих-кодами (RFID-чипы тоже подойдут), а птиц, стоящих в очереди, метить гуашью, например красным цветом. Проведенные эксперименты показали, что применение NATs подобных технологий неприемлемо для эффективной организации сети на почтовых голубях, связано это с тем, что птицы могут просто съесть NATs. Также в ходе проведенных экспериментов удалось выяснить TTL, в среднем он составляет 15 лет, но опять же очень многое зависит от типа используемого оборудования. В основном RFC 2549 дает некоторые рекомендации, рассказывает о возможных подводных камнях при проектировании сети, но в основном первая спецификация остается базовой, именно на нее стоит опираться при создании сети. Более подробные рекомендации и схемы по RFC 2549 можно найти в самой спецификации.
Практическая реализация RFC 1149 Несмотря на весь скептицизм, нашлись энтузиасты, которые смогли по достоинству оценить возможные выгоды использования данного протокола и реализовали его на практике. Ими оказались представители норвежской пользовательской группы Bergen Linux User Group (BLUG) [2], которые смогли доказать, что RFC 1149 действительно работает. Итак, 28 апреля 2001 года в 12.00 начались испытания протокола. Для проведения эксперимента заранее было решено выполнить команду ping между двумя компьютерами, пересылая ICMP‑запросы. Также было создано специальное ПО для вывода/ввода пакетов в ЭВМ под управлением ОС Linux (которое теперь доступно для загрузки с официального сайта BLUG). Пакеты печатались на обычной бумаге формата A4 небольшими блоками, далее необходимая информация вырезалась
сети
ножницами и пакет прикреплялся к голубям. Птицы выпускались с интервалом 7,5 минуты, чтобы избежать коллизии и накладок. Нужно заметить, что был прекрасный солнечный день и некоторые птицы (как выяснилось позже) присоединились к пролетающей стае голубей, которые так и не вернулись. Отправив ICMP Echo-Request-запрос, энтузиасты стали ждать информации от получателей. Через некоторое время первые голуби стали прибывать, и что же увидели получатели после сканирования пакета? 64 bytes from 10.0.3.1: icmp_seq=0 ttl=255 time=6165731.1 ms
Начало было положено, все ждали оставшихся птиц, и, не заставив долго ждать, стали прибывать остальные пакеты. Несмотря на то что голуби выпускались с интервалом в 7,5 минуты, некоторые прибыли одновременно, что добавило энтузиастам немного хлопот. После ввода всех пакетов птицы отправлялись обратно с соответствующими ICMP Echo-Reply-ответами. В конце процедуры была получена статистика команды ping: PING 10.0.3.1 (10.0.3.1): 56 data bytes 64 bytes from 10.0.3.1: icmp_seq=0 ttl=255 time=6165731.1 ms 64 bytes from 10.0.3.1: icmp_seq=4 ttl=255 time=3211900.8 ms 64 bytes from 10.0.3.1: icmp_seq=2 ttl=255 time=5124922.8 ms 64 bytes from 10.0.3.1: icmp_seq=1 ttl=255 time=6388671.9 ms --- 10.0.3.1 ping statistics --9 packets transmitted, 4 packets received, 55% packet loss round-trip min/avg/max = 3211900.8/5222806.6/6388671.9 ms
№4, апрель 2007
Итак, давайте вместе подсчитаем скорость передачи данных по голубиной сети. Среднее время передачи равно 64 байт в 5222 секунды (примерно 1 час 45 минут), тогда: 64/5222*8=0,1 бит в секунду. Нужно заметить, что в ходе эксперимента использовались почтовые голуби, которые давно не выполняли своих прямых обязанностей, в связи с этим и произошли курьезы: полная потеря пяти пакетов и длительные перелеты нулевого и первого пакетов. Сделаем небольшие подитоги. Несмотря на то, что из девяти голубей пакеты доставили только четыре (преодолев расстояние примерно в пять километров) и большое время передачи (около двух часов), спецификация RFC 1149 доказала свое право на жизнь, а это самое главное. Несмотря ни на что не стоит забывать, что описанные спецификации RFC исключительно экспериментальные, поэтому подлежат дальнейшей проработке и обсуждению. Полную статистику и другие подробности можно посмотреть на сайте группы норвежских энтузиастов [2], там же расположены фотографии процесса создания, отправки/получения пакетов и другие знаменательные моменты.
Итоги В первую очередь хочется поблагодарить Дэвида Вейтцмана и IETF (Internet Engineering Task Force), эту знаменитую международную группу проектировщиков, инженеров, сетевых администраторов и провайдеров, ведь именно эти люди занимаются развитием протоколов и архитектуры Интернета. Итак, спецификация доказала свое право на жизнь, открывая пользователям и администраторам новые возможности. Несмотря на весь скептицизм, многие компании – лидеры по производству сетевого оборудования официально поддерживают обе спецификации. Например, компания Cisco, по достоинству оценившая RFC Дэвида Вейтцмана, согласилась в экспериментальных целях включать поддержку этих спецификаций, правда, только один раз в году – каждое 1 апреля. 1. A Standard for the Transmission of IP Datagrams on Avian Carriers – http://www.ietf.org/rfc/rfc1149.txt. 2. Сайт группы Bergen Linux User Group – http://www.blug.linux.no/ rfc1149. 3. IP over Avian Carriers with Quality of Service – http://www.ietf.org/ rfc/rfc2549.txt.
71
вспомогательные программы
Gnuplot. Графики заказывали? Всё это меня очень заинтересовало, потому что Седловой, увлёкшись, говорил живо и образно. Но потому он спохватился, что получается как-то ненаучно, понавешал на сцене схемы и графики… Понедельник начинается в субботу. Аркадий и Борис Стругацкие
Евгений Балдин Уже более двадцати лет gnuplot используется для визуализации данных. Это профессиональный инструмент, так как создавался под нужды учёных, и ровно по той же причине gnuplot поразительно эффективен. Трансформация данных в графики – то, что у gnuplot получается лучше всех.
3
марта 2007 года, через три года после предыдущего релиза вышла новая версия популярной программы для создания графиков gnuplot. Gnuplot известен прежде всего умением легко производить обычные двухмерные графики, хотя он может строить и трёхмерные поверхности и даже подгонять их. При работе с программой возникает ощущение
72
абсолютной надёжности, естественно, если не просить чего-то нереального. Родная страничка проекта находится по адресу http://www.gnuplot.info. Формально gnuplot создавался для визуализации научных данных. Есть много указаний на то, что учёные используют gnuplot, в том числе и для предоставления полученных данных. Например, климатичес-
кие карты, предоставляемые NASA (http://www.ghcc.msfc.nasa.gov/charm/ charmanalysis), создаются с помощью этой программы. Хороший системный администратор журналирует множество параметров обслуживаемой им системы. Так – на всякий случай. Это для того, чтобы, когда «всякий случай» всё-таки придёт, можно было выявить его причины
вспомогательные программы и не допустить подобного в будущем. Помочь в этом может только анализ имеющихся записей. Представление информации в виде графиков – один из самых эффективных инструментов анализа. Gnuplot ориентирован на анализ данных. Для того чтобы начать анализировать gnuplot, необходимо «объяснить» структуру исследуемых данных, что требует некоторых усилий. Зато в дальнейшем ориентация на анализ позволяет легко экспериментировать с графическими представлениями данных. Примером подобных экспериментов является предложение от Raju Varghese представлять логи Apache в виде трёхмерного графика (см. рис. 1). Это ещё один способ локализации неочевидных проблем. Статья «A New Visualization for Web Server Logs» с описанием предложения опубликована на O'Reilly Network по адресу http://www.oreillynet.com/ pub/a/sysadmin/2007/02/02/3d-logfile-visualization.html. Для примера я взял логи с относительно небольшого локального веб-сайта и проделал описанную в статье Raju Varghese-процедуру. По вертикали отложен порядковый номер веб-страниц, отсортированных по популярности. По горизонтали отложено время запроса и порядковый номер отсортированных IP-адресов, с которых происходил запрос. На рис. 1 видно, чем веб-сайт живёт (особенно впечатляющим получается снятое таким образом кино). Видно, что есть IP-адреса (скорее всего, целые группы, так как IP рядом), с которых регулярно приходят роботы и опрашивают все доступные страницы. Также имеется набор адресов, с которых запрашиваются только определённые страницы, но делается это аномально часто. С помощью подобных представлений вряд ли получится определить проблему, но локализовать вполне вероятно. Чем уж заведомо не является gnuplot, так это «интуитивно понятной» (произносится как ругательство) программой. Это профессиональный инструмент. Любая полезная система требует времени на обучение. В случае с gnuplot потребуется, как минимум, полдня, чтобы освоить его концепцию и начать продуктивно работать.
К вопросу о лицензии Gnuplot можно распространять и использовать бесплатно. Исходный код доступен, но модифицированные исходники запрещено выкладывать в публичный доступ. Дополнения можно распространять только в виде патчей к исходному коду. Следует понимать, что «gnu» в названии программы пишется маленькими буквами и не имеет никакого отношения ни к GNU (GNU's Not UNIX), ни к FSF (Free Software Foundation). Подробности лицензии изложены в файле дистрибутива Copyrights.
Установка Если установка производится на какой-либо дистрибутив GNU/Linux, то gnuplot наверняка уже есть в стандартном репозитарии. Например, в случае Debian установка выглядит следующим образом: > sudo apt-get install gnuplot
№4, апрель 2007
Рисунок 1. Отображение выбранных веб-страниц в зависимости от IP-адреса запроса и от времени
Исходники или бинарники для других операционных систем можно получить, например, здесь: ftp://ftp.dante.de/ pub/tex/graphics/gnuplot. Исходники последней версии лучше скачать с официального сайта на SourceForge: http:// downloads.sourceforge.net/gnuplot/gnuplot-4.2.0.tar.gz. Сборка из исходников выглядит примерно так: > > > > >
tar xvfj gnuplot-4.2.0.tar.gz cd gnuplot-4.2.0/ ./configure --prefix=/usr/local --with-kpsexpand make make install
Ключ --prefix указывает, в какую директорию установить программу, а --with-kpsexpand добавляет к директориям для поиска шрифтов ресурсы LaTeX, если он установлен. Полезно просмотреть вывод скрипта configure. Часть форматов вывода требуют установки соответствующих программных компонент. Например, для вывода графиков в форматах PNG или JPEG необходима библиотека libgd. Всё дальнейшее повествование будет касаться gnuplot версии 4.2.0, собранного из исходников, и дистрибутива Debian GNU/Linux. В силу высокой портабельности gnuplot никаких особых проблем в случае выбора другого дистрибутива или операционной системы быть не должно. Теперь можно запустить программу: > sudo apt-get install gnuplot G N U P L O T Version 4.2 patchlevel 0 last modified March 2007 System: Linux 2.6.8-2-k7 Copyright (C) 1986 - 1993, 1998, 2004, 2007 Thomas Williams, Colin Kelley and many others Type `help` to access the on-line reference manual. The gnuplot FAQ is available from http://www.gnuplot.info/faq/ Terminal type set to 'x11'
Первое, что следует изучить для интерактивной работы с gnuplot, – это команду выхода exit. Прежде чем выйти можно посмотреть демонстрацию возможностей примерно следующим способом: gnuplot> cd "demo/" gnuplot> load "all.dem"
73
вспомогательные программы Все команды и подсказки выводятся в терминале, в котором запускается gnuplot, а отрисовка графиков при интерактивном режиме в случае GNU/Linux производится по умолчанию в X-овом окне (см. рис. 2).
Использование Сила gnuplot в том, что все его команды скриптуются, что позволяет легко автоматизировать создание графиков. Но прежде чем что-то оптимизировать – это что-то следует для начала создать или по крайней мере знать, как это что-то сделать.
Интерактивная работа Второй команде, которой следует обучиться, это команде help или её более короткой версии – ?. gnuplot> help help The `help` command displays on-line help. To specify information on a particular topic use the syntax: help {<topic>}
В gnuplot есть подробная текстовая иерархическая справка, в которой есть ответы на все вопросы, – надо только уметь читать. С помощью префикса «!» можно выполнять команды внешней оболочки: gnuplot> ! ls *.tex -rw-r--r-- 1 baldin 29297 2007-03-17 16:14 gnuplot.tex
Для того чтобы временно выйти из gnuplot и запустить командный интерпретатор, достаточно набрать команду shell. Первое, что необходимо сделать при построении графика, это выбрать, в каком виде следует вывести результаты и куда. За формат отвечает команда set terminal, а за вывод – set output: gnuplot> set terminal png gnuplot> set output "myexample.png"
Если после команды set output не будет указано имя файла, то вывод перенаправляется в STDOUT. Это не ка-
сается случаев, когда с помощью set terminal устанавливаются «настоящие» терминалы, например, x11. В зависимости от выбора терминала график выводится либо в специально открытое окно, либо в файл. При выборе терминала можно конкретизировать его настройки. Для каждого из них они свои, например, терминал png можно настраивать следующим образом: gnuplot> help set terminal png Syntax: set terminal png {{no}transparent} {{no}interlace} {{no}truecolor} {rounded|butt} {tiny | small | medium | large | giant} {font <face> {<pointsize>}} {size <x>,<y>} {{no}crop} {{no}enhanced} {<color0> <color1> <color2> ...}
Gnuplot выводит графики в десятки различных форматов. В число известных форматов попадают растровые (png, jpeg, gif и другие менее известные), векторные (corel, dxf, fig, mp, svg, epslatex, latex, eepic, postscript, pdf, tgif и много чего ещё), принтеры (epson-180dpi, hpgl, okidata, разные hp, pcl и прочее) и «настоящие» терминалы (x11, aqua, ggi, VMS, Windows и прочее). Если связь настолько плохая, что, кроме верного ssh, ничего нет, то можно обойтись и этим: gnuplot> set terminal dumb 50 20 Terminal type set to 'dumb' Options are 'feed 50 20'
gnuplot> set encoding koi8r gnuplot> plot [-3:3][-1:1.2] sin(x) t 'синус' +------+------+-----+------+------+------+ 1 ++ + + + +синус ******++ | *** **** | | ** ** | | ** ** | 0.5 ++ * **++ | ** **| | * ** | ** * 0 ++ ** ++ * * | |** ** | -0.5 ++* ** ++ | ** ** | | ** ** | + *** *** + + + + -1 ++-----******-+-----+------+------+-----++ -3 -2 -1 0 1 2 3
Для того чтобы нарисовать график по реальным данным, эти данные необходимо подготовить. Пусть требуется изучить активность пользователей базы данных PostgreSQL. Так как в ответ на каждое соединение PostgreSQL делает fork, то проще оценить число активных соединений, просто подсчитав число процессов пользователя, под которым запущена эта база данных. По умолчанию это пользователь postgres. Для периодического сбора информации в cron следует поместить строку примерно следующего вида:
Рисунок 2. Gnuplot демонстрирует свои возможности: хterm и X-окно
74
# считаем число процессов каждые 5 минут */5 * * * * echo `date -R` ↵ `ps aux | grep ^postgres| wc -l` >> ↵ /home/baldin/connectcount.txt
вспомогательные программы Команда date фиксирует время, а конвейер из ps, grep и wc выдаёт число соединений. В результате получается файл /home/baldin/connectcount.txt, состоящий из строк следующего вида: ... Wed, 28 Mar 2007 02:55:01 +0700 7 Wed, 28 Mar 2007 03:00:01 +0700 10 ...
plot "connectcount.txt" using 2:($7-4) title ""
Здесь вместо простого указания столбца в скобках указана формула. Номер столбца должен следовать за знаком $. Gnuplot поддерживает операции со столбцами данных фактически любой сложности. В данном же случае здесь достаточно простой арифметики (см. рис. 4).
Теперь необходимо описать формат этих данных. В случае числа процессов проблем нет, так как это просто столбик цифр, а вот со временем придётся разобраться. Сложность представляет то, что запись времени – сложная структура. Также необходимо задать подписи к графику, чтобы данные «обрели смысл». # Ось X – это время set xdata time # Формат временных данных. Описывается только структура вида # 28 Mar 2007 02:55:01, а день недели и зона игнорируются set timefmt "%d %b %Y %H:%M:%S" # Подпись для оси X set xlabel "Time" # Формат меток для оси Х set format x "%d/%m\n%H:%M" # Подпись для оси Y set ylabel "Connections" # Отрисовка решётки на графике set grid # Заголовок для графика set title "PostgreSQL activity"
Исчерпывающую информацию о работе с временными данными можно получить, набрав help set timefmt. При определении формата распознаются следующие определения: n %d – день месяца (1-31); n %m – номер месяца в году (1-12); n %y – последние две цифры года (0-99); n %Y – год (четыре цифры); n %j – порядковый номер дня в году (1-365); n %H – часы (0-24); n %M – минуты (0-60); n %S – секунды (0-60); n %s – число секунд с «начала времён» в смысле UNIX (epoch – число секунд от 1970-01-01, 00:00 UTC); n %b – трёхбуквенная аббревиатура месяца (Jan, Feb и тому подобное); n %B – полное название месяца.
Рисунок 3. Оценка активности работы с PostgreSQL
Рисунок 4. Оценка пользовательской активности PostgreSQL
Теперь можно вывести данные на экран: plot "connectcount.txt" using 2:7 title ""
Следует обратить внимание на инструкцию using. Она определяет столбцы отображаемых данных. Столбцы по умолчанию разделяются пробельными символами. В файле connectcount.txt описание времени начинается со второго (2) столбца (день месяца), а число процессов находится в седьмом (7) столбце (см. рис .3). Чтобы точнее оценить пользовательскую активность, следует из числа посчитанных процессов отнять системные. В моём случае таких процессов ровно 4 (изначальный postmater, writer process, stats buffer process и stats collector process):
№4, апрель 2007
Рисунок 5. Оценка пользовательской активности PostgreSQL с визуальными ограничениями
75
вспомогательные программы тально, но в чём дело, выяснить придётся. А казалось бы, что всё уже давным давно исследовано – пользователи явно не спят, точнее, не спят их программы. Команда plot является центральной. Вокруг неё всё и вертится. По значимости её можно сравнить разве что с SELECT для SQL. Фактически основное время на изучение gnuplot уходит именно на разборки с этой командой: gnuplot> help plot plot {<ranges>} {<function> | {"<datafile>" {datafile-modifiers}}} {axes <axes>} {<title-spec>} {with <style>} {, {definitions,} <function> ...}
Рисунок 6. Бутылка Клейна (демонстрация возможностей gnuplot). Результат исполнения команды splot
После команды plot обычно идёт имя функции или имя файла с данными. Список поддерживаемых функций можно посмотреть с помощью команды help в разделе «expression → functions». Файл с данными по умолчанию должен представлять из себя столбцы цифр, иначе, как это обязательно происходит со временем, формат данных необходимо описать. Кроме команды plot, которая отвечает за двухмерные графики, существует splot, отвечающая за представление трёхмерных графиков с достаточно похожим синтаксисом (см. рис. 6). Третья команда создания графиков, replot, исполняет предыдущую plot/splot-инструкцию, добавляя свою командную строку в конце.
Русский вопрос С кириллицей, как обычно, не всё так просто. Можно указать 8-битную кодовую страницу, например koi8-r: set encoding koi8r Рисунок 7. Оценка пользовательской активности PostgreSQL с визуальными ограничениями и кириллицей в подписях
Вспомним, что у PostgreSQL есть ограничение на число возможных соединений, и немного украсим график: plot [][-3:35] 32 with lines linewidth 3 title "Alert", ↵ 0 with lines linewidth 3 title "No User", ↵ "connectcount.txt" using 2:($7-4) title "" with lines
В отличие от предыдущих попыток вывести график здесь явно указывается интервал данных, которые следует вывести на график. В данном случае это сделано исключительно для красоты. Также для красоты данные выводятся в виде сплошной линии (инструкция with lines). Кроме вывода самих данных, также были выведены две прямые ограничительные линии – для полного отсутствия пользовательской активности и для условно опасного предела, который число соединений не должно превышать. Описание функций/данных в команде plot следует через запятую. Инструкция linewidth позволяет указать толщину соединяющей линии, а title указывает подпись для легенды. Gnuplot также поддерживает сокращённые ключевые фразы, например, w l эквивалентно with line. Подробности смотрите в справке в разделе «plot → style». Теперь на график можно и посмотреть (см. рис. 5). С 3 до 4 ночи был странный всплеск активности – не фа-
76
Сам gnuplot использует внешние шрифты. То есть достаточно, чтобы шрифты по умолчанию также имели эту же кодировку, или, если графики gnuplot используются в связке с LaTeX, использовать терминал epslatex (help set terminal epslatex). Проблема возникает, если хочется выбрать что-то другое вместо koi8r или koi8u. Все остальные 8-битные кодовые страницы придётся добавлять самостоятельно, благо исходники доступны. С другой стороны, в двадцать первом веке пора задуматься о переходе на Unicode. К счастью, последняя версия gnuplot умеет с ним работать. Для этого достаточно найти шрифт в кодировке unicode. Например, шрифты Computer Modern http://sourceforge.net/projects/cm‑unicode, подправленные Андреем Пановым: # Указываем Unicode-шрифт для png-терминала. # Для работы со шрифтом используется библиотека libgd set terminal png ↵ font "/home/baldin/text/gnuplot/cmunorm.pfb" 12 set output "pgconn-cyr.png" # теперь выводим кириллические надписи set title "PostgreSQL" set xlabel "Время" set ylabel "Пользовательская активность" plot [][-3:37] 32 with lines linewidth 3 title "Опасно", ↵ 0 with lines linewidth 3 title "Никого нет", ↵ "connectcount.txt" using 2:($7-4) title "" with lines
Естественно, это работает только в случае, если надписи будут в формате Unicode.
вспомогательные программы Неинтерактивная, или «настоящая» работа До сих пор все примеры касались интерактивной работы с gnuplot. Очевидно, что набирать серию команд руками каждый раз, когда требуется график, не самый оптимальный способ работы. Проще необходимые команды записать в текстовый файл, который можно загрузить с помощью инструкции load:
n подготовка и тес тирование командного файла для gnuplot;
n прописывание полученного скрипта, например в crontab;
n процесс забывания проделанной работы.
Так как командный файл – обычный текстовый файл, то легко написать сценарий, который генерирует решения для целого класса графиков в зависимости от ситуации. gnuplot> load "myexample.gnuplot" То есть возможен естественный переход на более высокий уровень абстракции. Например, популярно использоЕсли в файле есть несколько команд вывода графиков вание gnuplot для создания «кино»: «скрипт в цикле → кари каждый из них надо рассмотреть, то в нужных местах сле- тинки → mencoder → фильма». дует добавить паузу:
Заключение
pause -1 "Для продолжения нажмите Enter"
Файл с инструкциями можно указать gnuplot прямо в командной строке: > gnuplot myexample.gnuplot
Если в начале файла с командами для gnuplot добавить строчку: #!/usr/local/bin/gnuplot -persist
то сам файл можно сделать исполняемым, как и любой shell‑сценарий. Опция -persist необходима, чтобы терминал, который открывается при исполнении скрипта, не закрылся по окончании работы gnuplot. В силу вышеизложенного цикл работы с gnuplot состоит примерно из следующих фаз: n осознание, что именно надо; n подготовка файла с данными;
Возможные альтернативы gnuplot Gnuplot близок к идеалу, но всё-таки не идеален. Есть много программ, которые могут заменить его для выполнения схожих задач. Когда возникает желание рассмотреть аналоги gnuplot с точки зрения системного администратора, то приходится выбирать между программами, специализирующимися исключительно на анализе логов, и системами, специализирующимися на анализе данных. К продуктам, специализирующимся на анализе логов, относится, например, LogReport (http://www.logreport.org). Представляет также интерес система хранения и анализа данных общего применения RRDtool (Round Robin Database, http://oss.oetiker.ch/rrdtool). Автор Tobias Oetiker заявляет о своей программе как об индустриальном стандарте для анализа логов и представлении их в графи-
№4, апрель 2007
Столь краткий обзор не может осветить всех аспектов работы с этим замечательным инструментом. Из статьи почти полностью выпали трёхмерные построения, гистограммы, контурные карты, векторные поля, различные системы координат, операции над данными, работа в реальном времени и циклы, ограничения на шкалу, печать нескольких графиков в разных масштабах, подгонка данных функциями с помощью метода наименьшего квадрата и многое другое. Подготовка данных для визуализации – это отдельная и очень богатая тема, но она, скорее всего, имеет больше отношение к умению писать скрипты, например на perl, благо gnuplot легко скриптуется. Документация, идущая с пакетом, представляет из себя справочник, который ориентирован прежде всего на профессионалов. Это немного затрудняет вхождение в технологию новичкам. Но трудности не должны пугать истинных энтузиастов. Изучающим gnuplot, помимо всего прочего, имеет смысл обратить внимание на ресурс, созданный Toshihiko Kawano – http://t16web.lanl.gov/Kawano/gnuplot/ index-e.html.
ческом виде. Возможно, для стандартных ситуаций подобных программ более чем достаточно. Для систем, специализирующихся на анализе данных, как и в случае gnuplot, эти самые данные необходимо соответствующим образом подготовить, и это часто бывает не так просто. Зато эти программы позволяют проанализировать нестандартные ситуации и свести неочевидные проблемы к очевидным. Прежде всего следует отметить полноценные платформы для анализа, к которым можно отнести ROOT (http://root.cern.ch) и R (http://www.r-project.org). В некотором смысле эти две системы являются прямыми конкурентами друг для друга. ROOT пришла на смену легендарной системе анализа PAW (краткий обзор PAW/ROOT есть по адресу http://www.inp.nsk.su/~baldin/ DataAnalysis) для анализа данных в физике высоких энергий. R – это среда и язык для статистического анализа, об-
работки и визуализации данных, возникшие как открытая (GNU) реализация созданного в недрах Bell Labs языка S. Архив подключаемых модулей имеет знакомую по CPAN (Comprehensive Perl Archive Network) структуру и доступен по адресу http://cran.r‑project.org. Из систем создания графиков, ориентированных на графический пользовательский интерфейс, следует отметить LabPlot (http://labplot.sourceforge.net) и Grace (http://plasma-gate.weizmann.ac.il/ Grace). В качестве легковесного компонента для встраивания в графическую библиотеку Qt (http://www.trolltech.com) можно использовать Qwt (http://qwt.sourceforge.net). Язык Python (http://www.python.ru) также имеет свои компоненты, которые можно использовать для построения графиков, в том числе и интерактивно, например matplotlib (http://matplotlib.sourceforge.net) или PyXPlot (http://www.pyxplot.org.uk).
77
bugtraq Переполнение буфера в PECL zip Extension
Уязвимость при обработке UPX-файлов в Kaspersky Anti-Virus
Программа: Kaspersky Anti-Virus 6.0.1.411 for Windows Программа: PECL zip Extension версии до 1.8.4. и 5.5‑10 for Linux Опасность: Средняя. Описание: Уязвимость существует из-за ошибки провер- Опасность: Средняя. ки границ данных при обработке «zip:»-ссылок. Удален- Описание: Уязвимость существует из-за ошибки при обраный пользователь может с помощью слишком длинной ботке UPX-файлов, содержащих отрицательные значения «zip:»‑строки, переданной обработчику ссылок, вызвать смещений. Злоумышленник может с помощью специально переполнение стека и выполнить произвольный код на це- сформированного UPX-файла потребить все доступные ресурсы на системе и вызвать отказ в обслуживании. левой системе. URL производителя: www.kaspersky.com. URL производителя: www.pecl.php.net/package/zip. Решение: Установите последнюю версию (1.8.4) с сайта Решение: Установите исправление с помощью автоматического обновления. производителя.
Переполнение буфера в службе IMAP в MailEnable Программа: MailEnable Professional 2.37, возможно, более ранние версии. Опасность: Средняя. Описание: Уязвимость существует из-за ошибки проверки границ данных в службе IMAP при обработке аргументов, передаваемых команде APPEND. Удаленный пользователь может с помощью специально сформированной команды (длиной более 128 байт) вызвать переполнение стека и выполнить произвольный код на целевой системе. URL производителя: www.mailenable.com. Решение: В настоящее время способов устранения уязвимости не существует.
Уязвимость при обработке TRACE‑запросов в Squid
Несколько уязвимостей в Cisco Unified CallManager и Presence Server Програ м ма: Cisco CallManager 5.x, Cisco Unified CallManager 5.x, Cisco Unified Presence Server 1.x. Опасность: Средняя. Описание: 1. Уязвимость существует из-за ошибки при обработке большого количества ICMP Echo-пакетов. Удаленный пользователь может послать большое количество ICMP Echo-пакетов и аварийно завершить работу CUCM или CUPS-служб. 2. Уязвимость существует из-за ошибки в службе IPSec Manager для CUCM или CUPS. Удаленный пользователь может послать специально сформированный UDP-пакет на порт 8500 и приостановить работу некоторых служб (например, перенаправление звонков). Уязвимость существует в CUCM 5.0 версии до 5.0(4a)SU1 и в CUPS 1.0 версии до 1.0(3). URL производителя: www.cisco.com. Решение: Установите исправление с сайта производителя.
Программа: Squid 2.6.STABLE11, возможно, более ранние версии. Опасность: Средняя. Несколько уязвимостей в OpenOffice Описание: Уязвимость существует из-за ошибки при об- Программа: OpenOffice.org 2.x, OpenOffice 1.1.x, OpenOffice работке TRACE-запросов в файле squid/src/client_side.c. 1.0.x. Злоумышленник может с помощью специально сформи- Опасность: Средняя. рованного TRACE-запроса аварийно завершить работу Описание: 1. Несколько уязвимостей обнаружены в бибприложения. лиотеке libwpd. Удаленный пользователь может с помощью URL производителя: www.squid-cache.org. специально сформированного WordPerfect-файла вызвать Решение: Установите последнюю версию (2.6.STABLE12) переполнение динамической памяти и выполнить произс сайта производителя. вольный код на целевой системе. 2. Уязвимость существует из-за ошибки проверки границ данных в парсере StarCalc. Удаленный пользователь Уязвимость при обработке UPX-файлов может с помощью специально сформированного докуменв продуктах Trend Micro та вызвать переполнение стека и выполнить произвольный Программа: Семейство программ Trend Micro. код на целевой системе. Опасность: Средняя. 3. Уязвимость существует из-за недостаточной обработОписание: Уязвимость существует из-за ошибки деления ки консольных метаданных. Удаленный пользователь может на ноль при обработке UPX-файлов. Удаленный пользова- с помощью специально сформированного документа или тель может с помощью специально сформированного UPX ссылки выполнить произвольные команды на системе. файла вызвать отказ в обслуживании приложения. URL производителя: www.openoffice.org. URL производителя: www.trendmicro.com. Решение: В настоящее время способов устранения уязвиРешение: Установите исправление (OPR 4.335.00) с сай- мости не существует. та производителя.
Составил Александр Антипов
78
bugtraq Уязвимость при обработке анимированного курсора в cемействе ОС Microsoft Windows Программа: Microsoft Windows 2000 Datacenter Server, Microsoft Windows 2000 Advanced Server, Microsoft Windows 2000 Professional, Microsoft Windows 2000 Server, Microsoft Windows XP Home Edition, Microsoft Windows XP Professional, Microsoft Windows Server 2003 Datacenter Edition, Microsoft Windows Server 2003 Enterprise Edition, Microsoft Windows Server 2003 Standard Edition, Microsoft Windows Server 2003 Web Edition, Microsoft Windows Storage Server 2003, Microsoft Windows Vista. Опасность: Критическая. Описание: Уязвимость существует из-за неизвестной ошибки при обработке анимированных курсоров (.ani-файлов). Удаленный пользователь может с помощью специально сформированной веб-страницы или e-mail-сообщения вызвать переполнение стека и выполнить произвольный код на целевой системе. URL производителя: www.microsoft.com. Решение: Установите исправление с сайта производителя.
Переполнение буфера в ImageMagick Программа: ImageMagick 6.3.1, 6.3.2, 6.3.3-3 и 6.2.9, возможно более ранние версии. Опасность: Высокая. Описание: 1. Целочисленное переполнение обнаружено в функции ReadDCMImage(). Удаленный пользователь может с помощью специально сформированного DCM-изображения вызвать переполнение динамической памяти и выполнить произвольный код на целевой системе. 2. Целочисленное переполнение обнаружено в функции ReadXWDImage() при подсчете количества памяти, выделяемой для полей colors и comment. Удаленный пользователь может с помощью специально сформированного XWD‑изображения вызвать переполнение динамической памяти и выполнить произвольный код на целевой системе. URL производителя: www.imagemagick.org. Решение: Установите последнюю версию (6.3.3-5) с сайта производителя.
Целочисленное переполнение при обработке UFS-образов в Mac OS X Программа: Apple Macintosh OS X 10.4.8, возможно более ранние версии. Опасность: Высокая. Описание: Целочисленное переполнение обнаружено в функции ffs_mountfs() при обработке UFS-образов. Удаленный пользователь может с помощью специально сформированного UFS DMG-образа вызвать переполнение динамической памяти и выполнить произвольный код на целевой системе. URL производителя: www.apple.com/macosx. Решение: Установите последнюю версию (Mac OS X 10.4.9 или исправление 2007-003) с сайта производителя.
Переполнение буфера в xine-lib Программа: xine-lib, возможно более ранние версии. Опасность: Средняя. Описание: Уязвимость существует из-за ошибки проверки границ данных в функции DMO_VideoDecoder_Open() в файле src/libw32dll/dmo/DMO_VideoDecoder.c и в функции DS_VideoDecoder_Open() в файле src/libw32dll/DirectShow/ DS_VideoDecoder.c. Удаленный пользователь может с помощью специально сформированного медиа файла вызвать переполнение динамической памяти и выполнить произвольный код на целевой системе. URL производителя: www.xinehq.de. Решение: В настоящее время способов устранения уязвимости не существует.
Уязвимость при обработке анимированных курсоров в IrfanView Программа: IrfanView 3.99, возможно более ранние версии. Опасность: Высокая. Описание: Уязвимость существует из-за ошибки проверки границ данных при обработке .ani-файлов. Удаленный пользователь может с помощью специально сформированного анимированного курсора вызвать переполнение стека и выполнить произвольный код на целевой систме. URL производителя: www.irfanview.com. Решение: В настоящее время способов устранения уязвимости не существует.
Переполнение буфера в Yahoo! Переполнение буфера в MPlayer Messenger AudioConf ActiveX-компоненте Программа: MPlayer 1.0rc1, возможно более ранние верПрограмма: Yahoo! Messenger 8.x, Yahoo! Messenger 7.x, Yahoo! Messenger 6.x, Yahoo! Messenger 5.x. Опасность: Высокая. Описание: Уязвимость существует из-за ошибки проверки границ данных в AudioConf ActiveX-компоненте (yacscom.dll) в Yahoo! Messenger. Удаленный пользователь может установить слишком длинные строки для параметров socksHostname и hostName и вызвать метод createAndJoinConference(), что приведет к переполнению стека и позволит выполнить произвольный код на целевой системе. URL производителя: www.messenger.yahoo.com. Решение: Установите последнюю версию с сайта производителя.
№4, апрель 2007
сии. Опасность: Высокая. Описание: Уязвимость существует из-за ошибки проверки границ данных в функции DMO_VideoDecoder_Open() в файле loader/dmo/DMO_VideoDecoder.c и в функции DS_VideoDecoder_ Open() в файле loader/dshow/DS_VideoDecoder.c. Удаленный пользователь может с помощью специально сформированного медиа файла вызвать переполнение динамической памяти и выполнить произвольный код на целевой системе. URL производителя: www.mplayerhq.hu. Решение: Установите исправление из SVN-репозитория производителя.
Составил Александр Антипов
79
IMHO
Программисты, программы и искусственный интеллект
Боюсь, – проговорил он наконец, – что Вопрос и Ответ – вещи взаимоисключающие. Знание одного в силу самой логики исключает знание другого. В рамках одной Вселенной невозможно знание Вопроса и Ответа сразу. Путеводитель хитч-хайкера по Галактике. Жизнь, Вселенная и всё остальное. Дуглас Адамс
Алексей Мичурин Вопрос возможности существования искусственного интеллекта сродни вопросу о существовании разума на других планетах и вопросу «Одиноки ли мы во Вселенной?». Поэтому он всегда будет будоражить умы человечества. Он порождает множество новых вопросов: Что такое разум? Какие он может иметь формы? Как определить наличие или отсутствие разума?.. Но эти вопросы лежат далеко за пределами вопросов программирования, давайте оставим иx философам и остановимся на наиболее прикладных вопросах, которые, тем не менее, вплотную соприкасаются с вопросами искусственного интеллекта.
Компьютер и машина Тьюринга Прежде чем я буду использовать слова «компьютер» и «машина Тьюринга» как синонимы, нельзя не затронуть вопрос, что такое машина Тьюринга. Определения машины Тьюринга как такового нет, поэтому я позволю себе рассказать своими словами.
Простейшая машина Тьюринга Машина Тьюринга – это воображаемый аппарат со следующими характеристиками: n машина имеет конечное количество состояний и всегда находится в одном из них; n существует допускающее состояние, попадая в которое, машина заканчивает работу; n существует отклоняющее состояние, попадая в которое машина завершает работу с ошибкой;
80
n машина работает над воображае-
Звучит запутанно и скучновато? мой бесконечной магнитной лен- Давайте разберём пример. Создадим той, на которой записаны «симво- машину, которая вычитает два числа. лы» из некоторого конечного набоВходные данные на ленте предра (алфавита); ставим в унарном коде. Начало запиn машина может считать «символ», си обозначим символом «#», конец – находящийся под магнитной голов- символом «;». Уменьшаемое будем кокой; дировать символом «a», вычитаемое – n машина может писать сама на маг- символом «b» и ещё добавим к алфанитную ленту; виту символ «.»; это будет «пробел». n машина может сдвигать свою магКороче говоря, данные для операнитную головку на шаг вправо ции «5-3» будут кодироваться строкой или влево; «#aaaaabbb;». n машина «знает» набор правил виДля простоты машина будет рабода: «если головка находится над тать только с положительными числасимволом X и машина находится ми, уменьшаемое будет находиться в состоянии A, то следует записать справа от вычитаемого, а результат буна ленту символ Y, сдвинуть голо- дет записываться на ленту в унарном вку вправо или влево и перевести же коде символами «a». машину в состояние B»; Для реализации такой машины n и конечно, у машины есть началь- нам достаточно два «рабочих» состоное состояние и начальное положе- яния, назовём их «X» и «Y», кроме них, ние магнитной головки. конечно, у нас будет допускающее со-
IMHO стояние «T» (true) и запрещающее состояние «F» (false). Правила для машины, выполняющей такое вычитание, можно записать так: (X (X (X (X (X (Y (Y (Y (Y (Y
;) #) .) a) b) ;) #) .) a) b)
-> -> -> -> -> -> -> -> -> ->
(; (# (. (a (. (; (# (. (. (b
R R R R L R R L R L
T) X) X) X) Y) F) F) Y) X) Y)
Подобным образом обычно записываются машины Тьюринга, запись очень проста. Например, первая строчка означает, что если машина находилась в состоянии «X» и головка стояла на знаке «;», то следует записать знак «;» (то есть не вносить изменений), передвинуть головку на шаг вправо (буква «R») и перейти в состояние «T». Осталось только добавить, что начальным состоянием у нас будет «X», а магнитная головка вначале будет находиться над первым символом ленты. Как ни странно, это самая лаконичная запись алгоритма, но так как для большинства программистов она не очень привычна, то приведу реализацию того же самого алгоритма на языке C (см. листинг 1). Функция MT как раз и реализует описанную машину. Она производит Листинг 1. Запись алгоритма на языке С
вычитание и возвращает «1» в случае успеха или «-1» в случае ошибки. Теперь, я думаю, логика работы этой машины всем понятна: находясь в состоянии «X», она сканирует строку справа налево, в поисках первого символа «b». Найдя «b», она его стирает и переходит в состояние «Y», в котором сканирует строку слева направо в поисках «а». Обнаружив «а», она его стирает и переходит в состояние «X». Результат работы программы будет вот таким: d=#aaaaabbb; s=X d=#aaaaabbb; s=X d=#aaaaabbb; s=X d=#aaaaabbb; s=X d=#aaaaabbb; s=X d=#aaaa..bb; s=X d=#aaaa...b; s=Y d=#aaa....b; s=X d=#aaa....b; s=X d=#aaa....b; s=X d=#aaa.....; s=Y d=#aaa.....; s=Y d=#aaa.....; s=Y d=#aa......; s=X d=#aa......; s=X d=#aa......; s=X d=#aa......; s=X d=#aa......; s=X d=#aa......; s=X result=1 data=#aa......;
Окончательная строка с двумя буквами «a» говорит, что машина вычислила «5-3=2». Важно отметить, что машину Тьюринга можно закодировать – записать в виде последовательности символов. Способы могут быть самыми разными (вы уже видели два из них).
#include <stdio.h> int MT (char *d) { char s, *p; p=d; /* магнитная головка */ s='X'; /* стояние */ for (;;) { printf("d=%s s=%c p=%c\n", d, s, *p); if (s == 'X') { if (*p == ';') return 1; if (*p == '#') p++; if (*p == '.') p++; if (*p == 'a') p++; if (*p == 'b') *p='.', p--, s='Y'; } if (s == 'Y') { if (*p == ';') return -1; if (*p == '#') return -1; if (*p == '.') p--; if (*p == 'a') *p='.', p++, s='X'; if (*p == 'b') p--; } } return 0; } int main (void) { int r; char data[]="#aaaaabbb;"; r=MT(data); printf("\n result=%d\n data=%s\n", r, data); return 0; }
№4, апрель 2007
p=# p=a p=a p=a p=a p=. p=. p=. p=. p=. p=. p=. p=. p=. p=. p=. p=. p=. p=;
Разновидности машин Тьюринга Справедливости ради следует сказать, что определения машин Тьюринга у разных авторов мог у т сильно отличаться. Кто-то говорит о полубесконечной ленте, кто-то – о бесконечной в обе стороны, другие не ограничиваются одной магнитной головкой или строят машину с несколькими лентами... модификаций очень много, но следует понимать, что все они обладают одной и той же вычислительной мощностью. Или иначе, любая из этих машин может быть переформулирована и приведена к классической
машине без потери какой-либо функциональности. Отдельного упоминания заслуживают недетерминированные машины, где одному сочетанию символ-состояние может соответствовать несколько вариантов действий. Попав в такое состояние, машина как бы «распадается» на несколько, и каждая из машин продолжает работать в одном из возможных направлений (это очень похоже на вызов fork). Такие машины также не обладают никакими вычислительными преимуществами.
Компьютеры, программы и машина Тьюринга С некоторыми оговорками компьютер можно считать машиной Тьюринга. Он также работает с памятью, процессор имеет некоторое внутреннее состояние (состояние регистров) и также «знает», что ему делать, исходя из содержимого памяти и состояния регистров. Может показаться, что процессор способен выполнить гораздо больше операций, чем машина Тьюринга, но это только на первый взгляд. Например, когда процессор выполняет операцию 2+2 с точки зрения Тьюринга это выглядит как правило «если состояние машины (регистров процессора) является [ax=2, dx=2], а магнитная головка считала код операции «+», то следует изменить состояние на [ax=4, dx=2], записать «+» (то есть не вносить изменений) и передвинуть головку на шаг вправо». Мы выполнили операцию: ax := ax + dx
Конечно, процессоры разрабатываются таким образом, чтобы хранить как можно меньше правил и выполнять минимум непроизводительных действий. Разумеется, реальные процессоры не хранят таблицу сложения всех возможных чисел и не записывают повторно в память операции. Но все эти замечания касаются только внутренней архитектуры чипа, мы же всё равно используем его как машину Тьюринга, знаем мы о том или нет. Но несмотря на все свои возможности, компьютер даже слабее, чем машина Тьюринга. (Говоря о «слабости» или «силе», мы, конечно, имеем
81
IMHO Автореферативные парадоксы и самосознание Любопытно, что пара докс возникает при попытке машины Тьюринга проанализировать саму себя. Эта ситуация не нова, автореферативные парадоксы, такие как «Это утверждение ложно», известны давно. Многие психологи, логики, философы и специалисты по искусственному интеллекту полагают, что именно подобные парадоксы позволяют разуму выделить Себя. Например, я могу спокойно заявить «Уважаемый читатель не знает, что мою кошку зовут Люська». Это утверждение может быть истинно или ложно, но внутренне оно не противоречиво. Напротив, я не могу сказать тоже самое о себе: «Я не знаю, что мою кошку зовут Люська». Здесь я сра-
в виду не производительность, а круг задач, которые устройство способно решить за сколь угодно большое, но всё же конечное время.) Любая машина Тьюринга работает над бесконечной лентой, память же компьютера ограничена. Программы тоже являются машинами Тьюринга с аналогичными оговорками. Они являются закодированными машинами, которые выполняются компьютером как некой универсальной машиной. После всех этих замечаний я буду говорить о компьютере как о машине Тьюринга без опасения, что буду неправильно понят.
Всесилен ли компьютер? Оказывается, существуют задачи, непосильные компьютеру. Одна из фундаментальных задач, не поддающихся решению, это задача останова. Задача формулируется очень просто: по имеющейся записи машины Тьюринга (или попросту – программы) определить, остановится ли она или будет работать вечно. Ответ надо дать, естественно, за конечное время. Это фундаментальная задача, решение которой сулит невероятный рывок в разработках компиляторов и интерпретаторов, беспрецедентный прорыв в криптографии и многое другое. Хотите получить «нобеля» – решите задачу останова (я не шучу!). К сожалению (или к счастью?), существует очень простое доказательс-
82
n функция вернёт true, то есть F(f) зу натыкаюсь на внутреннее противоречие и начинаю замечать, что я чем-то отличаюсь от читателя, есть некая принципиальная разница. Можно ли считать появление подобных парадоксов в машине Тьюринга зачатками интеллекта и свидетельством возможности самосознания? Трудно сказать. На этом пути можно увлечься и прийти к весьма странным и неожиданным выводам. Добавлю только, например, Гёдель и его последователи считали, что существование подобных парадоксов доказывает невозможность существования разума. Вообще никакого, кроме Божественного. Как видите, двигаясь в обратную сторону, можно тоже прийти к интригующим заключениям.
не зависнет, но тогда (посмотрите на логику функции) функция зависнет – мы пришли к противоречию; n функция S(f,f) вернёт false, то есть F(f) зависнет, но тогда внутри функции F бесконечный цикл не выполнится, а значит, функция не зависнет – снова противоречие. Парадокс возник из-за нашего первого предположения: «Предположим, что мы реализовали функцию S(m,d), которая...» А значит, оно неверно.
Всесилен ли человек?
Опытный программист может возразить: «Это только бездушная железяка не может понять, зависнет ли она, но я‑то всегда смогу дать ответ, протво её неразрешимости. (Впервые этот читав внимательно код». К сожалению, факт доказал Алан Матисон Тьюринг доказать неправомочность этого заявв 1936 году.) И я не могу отказать се- ления я не смогу, так как в моём расбе в удовольствии изложить суть это- поряжении просто нет строгого опрего изящного доказательства. деления «программиста». Мне остаётся только апеллировать к контрпримеДоказательство неразрешимости рам. Вот один из многих.
задачи останова
Я буду говорить на С-образном алгоритмическом языке, более понятном большинству программистов. Для наглядности функции я буду обозначать большими буквами, а строки – маленькими. Предположим, что мы реализовали функцию S(m,d), которая принимает два арг умента: строк у m (machine) с закодированной программой (или функцией) и d (data) – данные для этой программы; а возвращает ture или false в зависимости от того, остановится ли программа или будет работать вечно. Естественно, зависнет программа или нет, можно сказать, только если знать, какие данные будут ей переданы. Поэтому мы передаём функции S и закодированную машину, и строку данных. Давайте создадим функцию F(x), реализующую следующий алгоритм:
Поиск совершенных чисел
«Совершенное число» – это не красивое сочетание слов, а математический термин. Так называются числа, равные сумме своих делителей. Например, 6 делится на 1, 2 и 3. Сумма делителей равна самому числу. Такими же свойствами обладают числа 28 (1+2+4+7+14=28), 496, 8128, 33550336, 8589869056... Как вы понимаете, эти числа тесно связаны с вопросами разложения на множители, поиском делителей и больших простых чисел. Ещё Евклид обнаружил, а Эйлер строго доказал связь совершенных чисел с числами Мерсенна: каждому простому числу Мерсенна соответствует чётное совершенное число, и наоборот. А те, кто занимается криптографией и генерацией случайных чисел, конечно, знают, какую важную роль играют в этой науке числа Мерсенна. Так вот. До сих пор неизвестно, бывают ли нечётные совершенные числа. F(x) { Неизвестно даже, сколько существует if (S(x,x)) for(;;) совершенных чисел, конечно или бес} конечно их число. Строку, кодирующую эту функцию, Таким образом, несложно реалиобозначим f. Что будет, если мы вызо- зовать программу, перебирающую все вем S(f,f)? нечётные числа, проверяющую, являВозможны два варианта: ется ли число совершенным и закан-
IMHO чивающую работу, только если таковое обнаружено. Остановится ли такая программа? Пока ни одни человек не знает ответа на этот вопрос. Хотя, может оказаться, что в этом частном случае задача поддаётся решению. Неразрешимость этой задачи также не доказана. «Горячие головы» ска ж у т, что программа остановится как минимум из‑за переполнения, но, согласитесь, что это не ответ. Самое большое совершенное число, обнаруженное на сегодняшний день, записывается 18,304,103 десятичными знаками Развитие событий на клетчатой ленте, каждому шагу отвечает горизонтальная линия (http://www.mersenne.org/perfect9.txt), клеток это более 7 Мб в двоичном представСначала давайте убедимся в том, (Stephen Wolfram использует именлении. (Да‑да! Человечество проявляет большое упорство в поисках этих чи- что свобода воли есть у нас. Загадай- но этот механизм для генерации слусел, а их свойства интересуют не толь- те одно из двух – «чёрное» или «бе- чайных чисел в пакете «Mathematica», лое». Получилось? Повторите попыт- http://www.wolfram.com.) ко теоретиков, но и спецслужбы.) Можно бесконечно долго споОдного этого примера достаточ- ку несколько раз. Поздравляю! Вы но, чтобы усомниться в том, что зада- в очередной раз воспользовались рить, является ли эта свобода свобоча останова может быть решена че- своей свободой и получили последо- дой воли. Именно бесконечно, потому вательность, которую я не могу уга- что разницы нет. ловеком. дать. Вы выбирали цвета не случайСкептики могут сразу возразить, ным, но и не предсказуемым, индиви- что никакой свободы здесь нет, есТезис Тьюринга-Чёрча Все эти факты наводят на мысль о том, дуальным образом. Может ли делать ли заложить ту же самую програмчто возможности человека и компью- тоже самое компьютер, руководству- му в любой компьютер, то он воспроясь некой программой? изведёт тот же результат. Посмею оттера имеют сходные пределы. Давайте рассмотрим «элементар- клонить это поспешное возражение, Равенство этих возможностей поси вот почему. тулирует так называемый физический ный» клеточный автомат. Пусть программа работает над Представьте, что технологии раз(или сильный) тезис Чёрча-Тьюринга, который гласит: «Любая функция, ко- клетчатой лентой, клетки могут быть вились настолько, что стало возможторая может быть вычислена физи- чёрными и белыми, каждое новое со- ным создавать идеальные копии часческим устройством (в том числе, ко- стояние ленты получается из предыду- тей пространства. Представьте теперь, нечно, и человеческим мозгом), может щего по простому правилу. Програм- что создана стопроцентная копия вас быть вычислена машиной Тьюринга». ма рассматривает саму клетку и две (со всеми вашими воспоминаниями, То есть всё, что может сделать чело- соседние клетки (справа и слева). опытом, чувствами и мыслями) и всеТак из каждой тройки мы получаем но- го вашего окружения (всего, что вы вивек, может сделать и компьютер. дите и чувствуете). Теперь вас просят Тезис Чёрча-Тьюринга невозмож- вое значение. Правила таковы: загадать последовательность чёрных но строго доказать или опровергнуть, БББ -> Б и белых клеток; и вашего клона пропоскольку он устанавливает равенсЧББ -> Ч сят сделать тоже самое. Я подозреваю тво между строго формализованным БЧБ -> Ч ЧЧБ -> Ч (хотя и не могу проверить), что экспепонятием «машина Тьюринга» и неББЧ -> Ч риментаторы получат одинаковые посформальным понятием «любое физиЧБЧ -> Б БЧЧ -> Б ледовательности. ческое устройство». Но и убедительЧЧЧ -> Б Когда вы запускаете одну и ту же ных контрпримеров, опровергающих Букой «Б» я обозначил «белое», программу с одними и теми же входэтот тезис, пока не найдено. ными данными, то вы получаете клон, Кажется, что у человека остаётся а «Ч» – «чёрное». В самом простом случае если изна- который выдаёт последовательность, только одно преимущество перед мачально на ленте была только одна чёр- не предсказуемую для вас (это же шиной – свободная воля. ная клетка, то мы получим развитие не ваш клон), но такую же, как и друсобытий, показанное на рисунке. гие клоны. Попробуйте задать другие Свобода воли у человека Самым интересным здесь явля- входные данные, и вы получите новую и у компьютера Большинство людей считают, что по- ется поведение центральной клет- последовательность. Её выдаст клон, ведение компьютера полностью пре- ки (она выделена). Ни один статис- с технической точки зрения эквивадопределено и никакой свободы воли тический тест пока не выявил ника- лентный другим, но имеющий собской закономерности в её поведении. твенные «воспоминания». Его резульу него быть не может.
№4, апрель 2007
83
IMHO тат будет уникальным (конечно, если воспоминания уникальны). Кроме того, не забывайте, что мы сравниваем человеческий мозг и машину, реализующую всего восемь элементарных правил. Будьте к ней снисходительны, удивительно, что она вообще может участвовать в подобном состязании.
Искусственный интеллект Итак, к чему же мы пришли? Компьютерная программа имеет ограничения, но и человеческий мозг не всесилен. Человек может проявлять свободу воли – вести себя индивидуально и непредсказуемо. Но такое же поведение может обнаруживать и элементарная программа. В свете всех этих (и многих других) фактов, возможность создания искусственного интеллекта уже не кажется такой уж фантастической.
Несколько ответов скептикам Многие люди, от обывателей до видных учёных, склонны отрицать возможность создания думающей машины. Постараюсь парировать наиболее распространённые доводы. Компьютер не может ошибаться. Это было справедливо полвека назад, но сейчас программы стали настолько сложны, что компьютеры ошибаются чаще, чем того хотелось бы. Примеры? Прогнозы погоды, автоматический перевод текстов, результаты работы поисковых систем, программы, играющие в шахматы... Многие и многие программы написаны так, чтобы ответ выдавался в определённый срок, ценой точности этого ответа. Если бы прогноз погоды на завтра можно было рассчитывать месяц, то можно было бы получить гораздо более достоверный результат, если бы у «поисковика» был часок на раздумье, то результаты поиска были бы намного точнее, если бы при игре в шахматы компьютер мог просчитать все ходы до конца партии (а количество вариантов превышает количество атомов во Вселенной), то выиграть у него было бы невозможно... В общем, всё как у людей: либо быстро и приблизительно, либо медленно и (если получится) точно. Компьютер не может радоваться, грустить, бояться, завидовать... Это
84
тоже сомнительный аргумент. Он апеллирует либо к физиологии человека, либо к социальным понятиям. Физиология даже у разных людей различна. Кто-то обрадуется хорошей сигаре, кто-то не может выносить запах сигар. Одна и та же шутка может быть кому-то смешна, а кто-то останется к ней равнодушен. Применять же к искусственному интеллекту социальные понятия вообще нет смысла, пока мы говорим об обособленном разуме. Может ли у человека появиться зависть, если он никогда не встречал других разумных существ?
Каким же будет искусственный интеллект?
ние лесов, истощение запасов нефти и собственная смерть). Они избегают этих проблем. Ну и в-третьих, создатель думающей машины не сможет доказать, что эта машина действительно думает. (Наиболее убедительный тест на разумность предложил Тьюринг, но скольнибудь серьёзное обсуждение этого теста никак не может быть вписано в рамки журнальной статьи.) Действительно. Работая над созданием искусственного интеллекта, доживём ли мы до счастливого дня, когда сможем с облегчением выдохнуть и сказать: «Всё! Работа завершена»? Скорее всего – нет. Такой день не наступит. Нам останется либо продолжать работу вечно, либо уверовать в то, что в этой коробке находится другой разум, не хуже нашего. Если вы спросите меня: «Так каким же будет искусственный разум?», я отвечу: «Непостижимым». А каким ещё может быть настоящий разум?
Одна из проблем состоит в том, что даже если мы создадим искусственный интеллект, то, скорее всего, не сможем понять, как он работает. Мы будем понимать, как работают все его узлы и алгоритмы, но как он приходит к тому или другому результату, мы уже понять не сможем. Это как поведение центральной Напоследок точки в нашем клеточном автома- Мне хотелось бы посоветовать всем те: мы прекрасно понимаем принцип интересующимся этими вопросам действия автомата, но не можем об- как минимум две книжки. наружить никакой закономерности Первая – «Классика программиров чередовании чёрных и белых кле- вания: алгоритмы, языки, автоматы, ток и не можем сделать никаких прог- компиляторы», Мозговой М.В. нозов. Эта книга будет интересна проВторая проблема состоит в том, граммистам. Здесь рассмотрены что человечество, скорее всего, не за- не только машина Тьюринга, но и автохочет согласиться с тем, кто будет ут- маты, вопросы создания языков, вопверждать, что искусственный интел- росы выражения задач на языках пролект создан. Ведь тогда людям при- граммирования, классификация задач дётся взглянуть в глаза очень непри- по сложности (как вы уже убедились, ятным фактам. простая формулировка может таить Во-первых, окажется, что человек очень сложные и даже неразрешимые уже не царь природы, что появился мо- задачи) и многое другое. Большое внигущественный конкурент, обладающий мание уделяется оптимизации различтем уникальным свойством, которое до ных решений. Философские вопросы, сих пор считалось привилегией чело- которых я чуть коснулся в это статье, века – способностью думать. Причём в этой книге только упоминаются. мы можем только гадать, о чём это соВторая – «Глаз разума», Д. Хофшздание думает и что замышляет. тадтер и Д. Деннетт. Во-вторых, человечеству придётся Здесь обсуждается, что же такое согласиться с тем, что у него появился сознание (вы, наверно, уже заметили, новый потенциальный враг и ему мо- что я обошёл эту тему в статье; обозжет угрожать совсем новая опасность. реть её в рамках статьи просто невозВедь на земле появилось новое разум- можно). Из неё вы узнаете, что такое ное(!) создание, к тому же практичес- тест Тьюринга (тест на наличие разуки бессмертное. Люди не любят заду- ма) и многое другое. Думаю, эта книга мываться о глобальных угрозах (та- понравится любителям научной фанких как вымирание видов, уничтоже- тастики.
ретроспектива
История компании MicroUnity: куда приводят мечты? MicroUnity была Трансметой своего времени Аналитик Insight 64 Натан Бруквуд
Дмитрий Мороз История знавала немало компаний, обещавших миру «манну небесную» благодаря своему очередному технологическому ноу-хау. Одной из них была MicroUnity, вознамерившаяся в середине 90-х годов прошлого века произвести революцию в производстве микропроцессоров. Вспышка давно осветила небосвод, но где же гром?
Н
ачало 1990-х ознаменовало собой настоящий бум не только компьютерных, но и сетевых технологий. Возможности передачи информации отныне не ограничивались одним лишь телефонным либо сетевым кабелем. В то время, когда большинство модемов обеспечивали скорость передачи не более 9,6 Кбит/с, по кабельным сетям данные сновали с головокружительной скоростью несколько мегабит в секунду. Для клиентов, особо привередливых к скорости и готовых за это платить, существовали спутниковые и волоконно-оптические линии связи с пропускной способностью до 2,4 Гбит/с. Однако постоянно развивающаяся сетевая инфраструктура ещё не была
86
гарантом всеобщего информационно- мотка вперед-назад, стоп-кадр, счетго блага. Для того чтобы с лихвой на- чик времени, расстановка пользовасладиться высокой пропускной спо- тельских меток. собностью, необходимо было наличие Об использовании несжатых потоне менее производительных вычисли- ков видеоинформации, понятное дело, тельных систем, способных справиться можно было даже и не мечтать, посс потоком данных, несущимся на столь кольку их передача и обработка были больших скоростях. подвластны лишь крупным исследоваДля примера возьмём начавшую тельским центрам и компаниям с высонабирать в то время популярность ус- коскоростным каналом связи. лугу «Видео по требованию» (Video Применение алгоритма сжатия on Demand). Суть её такова: абонент данных MPEG было более целесообможет просмотреть каталог фильмов, разным. Однако полноценное воспрохранящихся на сервере, выбрать и за- изведение подобных фильмов, было пустить любой из них. При этом про- доступно лишь владельцам высокопсмотр обычно напоминает таковой роизводительных рабочих станций от при использовании обычного видео- Silicon Graphics и Sun Microsystems, магнитофона или DVD-плеера. Доступ- а также специальным платам с аппаны следующие функции: пауза, пере- ратными MPEG-декодерами.
ретроспектива Что же касается персональных компьютеров, даже новый процессор Intel Pentium (1994 год), обладавший по тем временам гигантской производительностью в 100 миллионов инструкций за секунду (100 MIPS), не мог декодировать MPEG-видео «на лету». Для этого в компьютер необходимо было устанавливать дополнительную плату с аппаратным декодером. То же касалось графической и звуковой информации. А ведь при этом необходимо было ещё обрабатывать входящие и исходящие сетевые потоки. Вспомните: в середине 90-х центральный процессор ПК (в отличие, например, от платформы Amiga компании Commodore) был «одним в поле воином» и выполнял всю работу самостоятельно. «Обвешивание» компьютера дополнительными платами для обработки видео, звука и графики в то время выглядело идеей нецелесообразной уже потому, что повышало стоимость всей системы в несколько раз. Рынок нуждался в дешёвых специализированных чипах, которые были бы готовы к обработке столь массивных потоков различной мультимедийной информации независимо от способа их получения – посредством кабеля, беспроводной или спутниковой связи. По прогнозам аналитиков, уже к 2000 году этот сектор рынка должен был оцениваться в 1,6 миллиарда долларов США. Превращение небольшой калифорнийской компании MicroUnity Systems Engineering (далее MicroUnity) из никому не известной «темной лошадки» в одно из самых многообещающих предприятий пришлось как раз в этот период.
Из грязи в князи Основатель MicroUnity, выпускник Оксфордского университета Джон Мауссурис (John Moussouris) был известен в мире как один из создателей архитектуры RISC, а также основателей компании MIPS Computer Systems. В 1988 году он основал собственную компанию – MicroUnity. Чем занималась компания, никто не знал. Лишь в начале 90-х годов появились слухи, что фирма Мауссуриса занимается выпуском нового процессора, который будет ориентирован на только начавший набирать обороты рынок мультимедиа. Причём этот чип будет «чувствовать
№4, апрель 2007
себя прекрасно» как в специализированных приставках, подключаемых к телевизору, так и в различном коммуникационном оборудовании и даже в обычных ПК. Приблизительно в то же время появился термин «медиапроцессор» (по трактовке Wikipedia) – специализированный процессор, построенный на базе «системы-на-чипе» (system-on-chip, SOC), предназначенный для обработки потоковых мультимедийных данных в режиме реального времени. Первыми компаниями, заинтересовавшимися разработками MicroUnity, стали Microsoft и Tele-Communications (один из наибольших операторов кабельных сетей США). Они-то и начали разрабатывать платформу для новой услуги – интерактивного телевидения. Благодаря ТВ-приставке, подключённой к сети кабельного телевидения, пользователь мог смотреть любимые фильмы, слушать музыку, получать необходимую ему текстовую и графическую информацию. И всё это, не отрываясь от своего любимого телевизора (который большинство американцев, как известно, считают чуть ли не полноправным членом семьи). Tele-Communications предоставляла для этого свою развитую сетевую инфраструктуру, тогда как Microsoft – программную часть. За аппаратное же обеспечение, а конкретнее – центральный процессор, отвечала MicroUnity. Однако потенциально успешным продуктом заинтересовались и другие компании. Планы MicroUnity были столь красочны и многообещающи, что за короткий промежуток времени на банковские счета компании начал «течь» «денежный ручей» из инвестиций таких компаний, как Microsoft, TeleCommunications, Hewlett-Packard, Time Warner, US West, Cray Research, Motorola и др. Заручившись поддержкой гигантов индустрии, а также получив в своё распоряжение 120-миллионный бюджет, Мауссурис и его команда принялись за более активную разработку своего проекта. Кстати, MicroUnity не была первой компанией, вознамерившейся предложить миру мультимедийный процессор. Уже в 1994 году пальму первенства возглавила компания Texas Instruments. Представленный ею чип
Джон Мауссурис – темная лошадка
MVP можно было назвать «массивно-параллельным суперкомпьютером на одном чипе». В его состав входили четыре 64‑разрядных DSP-процессора, одно 32-разрядное RISC-ядро, два видеоконтроллера, а также 64-разрядный контроллер памяти со встроенными 64 Кб статического ОЗУ. Всё это «богатство» умещалось в одном корпусе 230-долларовой микросхемы и при частоте 30-50 МГц работало со скоростью 1000-1500 миллионов DSP-инструкций за секунду (DSP MIPS). Однако MVP было далеко до возможностей, которые обещал медиапроцессор MicroUnity.
Чудо в маленькой упаковке Информации о чипе MicroUnity в Интернете удручающе мало. Впрочем, это и неудивительно, поскольку компания славилась своей скрытностью. Как и в случае с разработкой процессора Crusoe компанией Transmeta, предприятие Мауссуриса всячески вуалировало собственную деятельность. Тем не менее, собрав все крохи доступной информации, общую картину обрисовать вполне возможно. Первые технические характеристики процессора были объявлены в 1994 году, тогда как презентация чипа должна была состояться на Микропроцессорном Форуме (Microprocessor Forum) в октябре 1995 г. В отличие от большинства других
87
ретроспектива Дополнительные удобства Несмотря на то что медиапроцессор MicroUnity был самостоятельным, готовым к использованию решением, компания намеревалась выпустить ещё две микросхемы, расширявшие его возможности. Первая из них называлась MediaCodec и представляла собой аналого-цифро-
вой преобразователь (АЦП), отвечавший за коммуникационные возможности чипа. Второй микросхемой служил MediaBridge, содержавший дополнительную кэш-память объёмом 512 Кб. Оба чипа подключались к медиапроцессору посредством высокоскоростной 8-битной шины, передававшей данные со скоростью 1 Гбит/с.
ляя при этом гораздо меньше энергии. «При обещанной цене в 100 долларов за микросхему MicroUnity могла кардинально изменить расстановку сил на процессорном рынке, нанеся удар самой Intel, а также другим компаниям», – говорил тогда Ричард Догерти (Richard Doherty), аналитик консалтинговой фирмы из Нью-Йорка. Поскольку для изготовления медиапроцессора на основе биполярной КМОП-технологии MicroUnity требовались специальные производственные мощности, руководство компании приняло решение построить собственную фабрику по их выпуску. Причём в то время как подавляющее большинство гигантов цифровой электроники начали переносить свои заводы в Азиатский регион с целью удешевления производства, MicroUnity вознамерилась построить фабрику в самом центре Кремниевой Долины. Да, амбициозности MicroUnity было не занимать.
специализированных процессоров, со- приблизительно 0,1 мкм, а также подержавших несколько ядер, сердцем даче очень низкого напряжения (0,5 В) медиапроцессора MicroUnity являлось транзисторы начинали работать наединственное полностью программи- много стабильнее и эффективнее, поруемое ядро, работавшее на частоте казывая повышение коэффициенв 1 ГГц и способное выполнять до пяти та усиления и понижение количества различных задач одновременно. Пять шумов. Работая же на сверхвысоких групп 64-разрядных регистров по 64 частотах, биполярные транзисторы штуки в каждой давали в сумме 320 потребляли намного меньше энергии, регистров. Чип также «нёс на борту» чем полевые транзисторы КМОП-тех64 Кб встроенной кэш-памяти, разде- нологии (Комплементарная структура лённой поровну между памятью инс- Металл-Окисел-Полупроводник), кототрукций и памятью данных. рые славились своим низким энергоМедиапроцессор обладал широ- потреблением. ким набором инструкций для цифроОднако на столь высоких частовой обработки сигналов, а также вы- тах транзисторы не могли работать полнения арифметических опера- с алюминиевыми проводниками, изо- Куда приводят… ций. Например, одна из них называ- лированными оксидом кремния. Тог- амбиции?! лась «групповое умножение и сложе- да Мэтьюс решил использовать золо- Время шло. 1995-й год подходил к конние». Всего за один цикл процессо- тые проводники, изолированные воз- цу, однако обещанный несколькира эта длинная инструкция могла ум- духом. Замена изоляции оксида крем- ми месяцами ранее выпуск первой ножить четыре 32-битных операнда, ния на воздух позволила биполярно- 10‑тысячной партии медиапроцессора сложить результаты с ещё четырьмя му транзистору работать со скоро- MicroUnity так и не состоялся. С другой 32-битными числами и вернуть четы- стью, недоступной стандартным на то стороны, компания «не сидела, сложа ре 32‑битных результата. В результа- время микроэлектронным структурам. руки», и, по обрывочным сведениям те медиапроцессор MicroUnity мог об- Кроме того, отказ от алюминия поз- различных источников, усиленно коррабатывать 512 бит информации за волил избавиться от множества пара- пела над доводкой своего чипа. Тактакт: 384 бит вводимых и 128 бит вы- зитных токов, в результате чего ста- же MicroUnity пополнила свой штат неводимых данных. ло возможным паковать транзисторы сколькими высококлассными специаКристалл чипа должен был содер- на кристалле микросхемы более плот- листами, призванными ускорить разжать 10,5 млн. транзисторов на пло- но друг к другу. работку. щади всего 10 мм 2 , что было намноУстроившись в MicroUnity, Мэтьюс Одним из таких «новобранцев» го больше аналогичного показателя приступил к разработке нового про- стал Генри Месселин (Henry Massalin), процессора Pentium с его тремя мил- цесса изготовления микросхем, кото- которого многие называли «Эйнштейлионами. рый объединял в единое целое лучшие ном нашего времени». Выпускник КоЗа счёт чего компания намерива- характеристики как ТТЛ, так и КМОП. лумбийского университета (Columbia лась достичь таких невероятных на тот В так называемой биполярной КМОП- University, Нью-Йорк), Генри был спемомент характеристик? технологии в подавляющем большинс- циалистом по цифровой обработЗдесь на сцену выходит Джеймс тве использовались биполярные тран- ке сигналов. Этим он и занимался Мэтьюс (James Matthews), глава техно- зисторы, работавшие на частотах свы- в MicroUnity. «В мои обязанности вхологического отдела MicroUnity, до это- ше Гигагерца, тогда как полевые тран- дила работа с кабельными модемаго проработавший несколько лет в ла- зисторы применялись для построения ми, демодуляцией и декодированием бораториях Hewlett-Packard. Экспери- ячеек памяти. Используя при этом зо- сигналов, разработкой фильтров. Всё ментируя с биполярными транзистора- лотые проводники вместе с воздуш- это требовало большого количества ми (которые являются основой техно- ными изоляционными мостами, ме- математических вычислений, а таклогии так называемой Транзисторно- диапроцессоры, построенные на ба- же оптимизации. Я должен был нахоТранзисторной Логики, ТТЛ), он открыл зе нового технологического процес- дить методы решения поставленных одно интересное свойство: при карди- са, работали в сотни раз быстрее «са- передо мной задач, многие из котональном уменьшении их размеров до мого быстрого» чипа Pentium, потреб- рых ещё даже не известны науке» –
88
ретроспектива так описывал Месселин свою работу в компании. В начале 1996 года стало известно, что тестовые экземпляры процессоров (по имеющейся информации это были 300 МГц чипы, созданные на основе стандартной КМОП-технологии) уже лежали на столах её сотрудников. Тем не менее компания постоянно уклонялась от ответа на единственный вопрос: когда же эти образцы, размноженные на тысячи и десятки тысяч штук, попадут наконец на рынок? Разработка и внедрение новых технологий сродни бегу перед локомотивом: необходимо постоянно держать заданную скорость, иначе мчащийся поезд не даст шанса выжить. К сожалению, начальная скорость, набранная MicroUnity, была слишком высокой, чтобы её поддерживать в дальнейшем, даже при помощи таких светлых умов, как Генри Месселин. К тому же локомотив в лице конкурентов останавливаться не собирался. MicroUnity начала испытывать трудности с производством микросхем на основе биполярной КМОП-технологии и попросту не укладывалась в заданные ею самой сроки. Кроме того, в 1996 году сразу неСайт компании MicroUnity сколько компаний объявили о завершении работ над собственными ме- Линли Гвиннеп (Linley Gwennap). – век из всего штата сотрудников комдиапроцессорами. Среди них можно Да, у неё была парочка хороших идей, пании, который отныне стал насчитывыделить VelociTI от Texas Instruments, но так и неразвившаяся толком индус- вать 159 человек. Благодаря вырученным от продажи TriMedia от Philips, Mpact компании трия ТВ‑приставок не смогла стать Chromatics и др. И пусть по своим ха- надёжным источником дохода ком- фабрики финансовым средствам компания смогла продолжить свои дальрактеристикам эти чипы не могли по- пании». П о с л е п р и н я т и я п о р а ж е н и я нейшие исследования. Отныне все её тягаться с изделием MicroUnity, они обладали одним огромным преиму- MicroUnity Мауссурису пришлось не- усилия были направлены на разраществом – полной готовностью вый- мало повоевать с инвесторами, ко- ботку коммуникационной продукции. торые хотели объявить предприятие «Вместо того чтобы вывести на рынок ти на рынок. полностью интегрированное решение, В довершение всего начала посте- банкротом. К счастью, ему удалось отстоять мы отныне будем предлагать наши пенно отпадать надобность в медиапроцессоре, поскольку у ранее столь свою точку зрения и удержать ком- разработки частично, и лишь в те секмногообещающего проекта, как ин- панию «на плаву». Правда, для этого торы рынка, которые в них нуждаюттерактивное телевидение, появил- MicroUnity пришлось лишиться своей ся», – говорил Мауссурис журналисся серьёзный враг в лице набираю- сверхновой фабрики по производству там Electronic News. Кроме того, компания занялась щей популярности Всемирной Паути- микропроцессоров. Несмотря на то что ны, которая к 1997 году уже могла по- рыночная стоимость завода составля- продажей лицензий другим компанирадовать пользователя не только тек- ла 42 млн. долларов, 6 октября 1996 ям собственной технологии под настом и графикой, но и звуковой, а так- года, когда ключи от фабрики были званием MaskTools, создав для этоже видеоинформацией. В результате переданы малазийской InterConnect го отдельное подразделение. Данная спрос на мультимедийные приставки Technology, на счет MicroUnity, согласно технология являлась развитием работ для телевизоров начал стремитель- анонимному источнику, была перечис- Джеймса Мэтьюса и представляла солена всего половина обещанной сум- бой специальную оптическую систему но падать. «MicroUnity никогда не имела хо- мы. Больше платить новый владелец на основе субволновой фотолитограрошего бизнес-плана», – говорил ре- отказывался. Вместе с продажей заво- фии (sub‑wavelength photolithography), дактор газеты Microprocessor Report да работу потеряли около сотни чело- улучшавшую производство микросхем
№4, апрель 2007
89
ретроспектива на основе КМОП-технологии, а также Что же касается Dell, MicroUnity обэкономившую средства. виняла её как соучастника Intel, усПервым заказчиком MaskTools танавливающего в свои компьютеры стала Photronics, приобретшая ли- чипы с «запрещёнными» технологияцензированную технологию в нача- ми. Потенциально компания Мауссуле 1997 года. Через несколько меся- риса могла подать иск на любого процев ее примеру последовала компа- изводителя компьютеров с процессония National Semiconductor. В 1998 го- рами Intel, однако MicroUnity решила ду новыми лицензиарами стали аме- для начала ограничиться наиболее изриканская Chip Express и японская вестным из них. Best Technology, а в марте 1999 года – «Общественность полагает, что наTaiwan Semiconductor Manufacturing ша компания давно прекратила своё Company (TSMC). существование, – комментировал В конце 1999 года подразделение, ситуацию Мауссурис. – Однако это занимавшееся продажей лицензий не так. Всё это время мы усердно труMaskTools, было куплено за 21 мил- дились, не афишируя свою деятельлион долларов нидерландской ком- ность. Судебный процесс тому подпанией ASML, занимавшейся созда- тверждение». нием оборудования для производства Через неделю на свет начали помикросхем. являться слухи из анонимных источников Intel, согласно которым она даБорьба за собственность же не подозревала о возможности возС того момента MicroUnity практичес- никновения судебного разбирательски исчезла с рынка. Многие аналити- тва. Обе компании вели переговоры, ки полагали, что компания прекрати- но до суда дело никто доводить не сола какие-либо технологические раз- бирался. «Отныне Intel пересмотрела работки. О её существовании мож- свою позицию и готова защищаться но было судить лишь на основе сайта всеми средствами». (www.microunity.com), который, впроВидимо, под словом «средствачем, также не мог похвастаться осо- ми» должна была подразумеваться бой информативностью. вполне материальная денежная сумЕдинственная информация, ко- ма, поскольку отстоять свою правоту торую он содержит на протяжении в суде юристы компании так и не смогкак минимум пяти лет (сайт не обнов- ли. В результате спустя полтора года, лялся с 2002 года), даёт краткое пред- 26 октября 2005 года, Intel согласиставление о платформе BroadMX. лась выплатить MicroUnity Она предназначена для ускорения 300 миллионов долларов и удешевления разработки SOC-сис- за урегулирование судебтем путём замены большей части ап- ного иска против неё, а такпаратного обеспечения программной же приобрести лицензию на патентную базу компаэмуляцией. Никаких более точных сведений, нии. Таким образом, иск кроме «пары строчек» текста и не- против Dell переставал быть скольких иллюстраций, на сайте нет, актуальным. Однако MicroUnity не осхотя в секции вопросов-ответов говорится, что более детальное описание тановилась на достигнупродукта, а также бизнес-план компа- том и сразу же замахнулась нии обсуждаются лишь с её клиента- на следующую компанию. ми, а также партнёрами. Спустя всего две недели MicroUnity перебывала «в подпо- с момента урегулирования лье» вплоть до 2004 года. И неждан- конфликта с Intel фирма Мано-негаданно «выстрелила», подав 26 уссуриса подала судебный марта судебный иск в окружной суд иск против Sony, обвинив США в Техасе против… Intel и Dell. Со- её в нарушении 10 патенгласно иску компании процессоры Intel тов. Под раздачу попали игнарушили семь её патентов. «Пост- ровые консоли PlayStation 2 радали»: технология HyperThreading, и PlayStation Portable, в коа также наборы мультимедийных инс- торых используются протрукций SSE и SSE2. цессоры на основе MIPS-
90
архитектуры, разработанные самой Sony. MicroUnity требует возмещения ущерба, который, судя по всему, будет опять исчисляться девятизначной суммой. Конфликт между компаниями не разрешён до сих пор. Не остался в стороне и второй гигант процессоростроения – AMD. 23 ноября 2006 года MicroUnity подала судебный иск и против неё. Как и в случае с Intel и Sony, в нём говорится о нарушении производителем процессоров уже двенадцати патентов. В тексте упоминаются все чипы AMD, поддерживающие технологию 3DNow!, совместимую с SSE от Intel, причём как уже вышедшие, так и только анонсированные и готовящиеся к выходу на рынок. Вполне возможно, что, «отыгравшись» на всех «гигантах» рынка, MicroUnity, получив достаточную сумму для своих дальнейших разработок, вновь возьмётся за сотворение «чуда». И, глядишь, через каких-нибудь пять лет о компании вновь заговорят в прежнем духе. 1. http://www.wired.com 2. http://www.byte.com 3. http://www.eetimes.com 4. http://www.seas.upenn.edu 5. http://www.businesswire.com 6. http://en.wikipedia.org 7. http://www.ecommercetimes.com
книжная полка
Алгоритмы: введение в разработку и анализ Ананий Левитин
Программирование – это искусство. И не только составления кода, но и того, что за этим кодом скрывается, – алгоритма. Тот, кто в своей работе не ограничивается рутинным «набиванием кода», несомненно, оценит книгу, полностью посвященную алгоритмам. Причем ее ценность обусловлена тем, что содержимое не ограничивается набо-
ром известных механизмов для реше- рамидальная сортировка), пространсния конкретных задач. Автор еще в пре- твенно-временной компромисс (алгодисловии предупреждает, что для него ритм Бойера-Мура, хеширование), дисущественно важнее «методика проек- намическое программирование (алготирования алгоритма», изучив которую, ритм Воршалла), жадные методы (алспециалист сможет широко применять горитм Дейкстры, деревья Хаффмана). полученные навыки. Кроме того, в из- Отдельно вынесены проблемы огранидании выдвинут новый принцип класси- чения мощи алгоритмов и преодоления фикации, в основе которого – стремле- этих ограничений. Все разделы снабние обучать общим идеям алгоритмов, жены упражнениями, указания по их относящихся к различным приклад- выполнению можно найти в конце книным областям. В введении раскрыва- ги. Более того, автор предлагает даже ются основные понятия и методы про- и «примерный план 80-часового одноектирования алгоритмов, выделяются семестрового учебного курса» по своосновные типы задач и структуры дан- им материалам. ных, а уже следующая глава призвана научить оценивать эффективность n Издательство: «Вильямс» того или иного алгоритма. Далее рас- n Год издания: 2006 сматриваются алгоритмы, разбитые n Количество страниц: 576 на такие группы, как метод грубой си- n ISBN: 5-8459-0987-2 лы, метод декомпозиции, метод умень- n Цена: ≈ 278 руб. шения размера задачи, метод преобра- К н и г а п р е д о с т а в л е н а и з д ат е л ь с т в о м зования (метод исключения Гаусса, пи- «Вильямс» .
Язык программирования C# 2005 и платформа .NET 2.0, 3-е издание Эндрю Троелсен
Известный эксперт по C#, изучающий платформу .NET с самого начала ее разработки, представил третье, наиболее полное и, на его взгляд, удачное, издание своего фундаментального труда по программированию на этом языке: как в целом, так и применительно к современной архитектуре от Microsoft. Читателю по мере изучения книги предла-
92
гается постепенное знакомство с языком C#: с нуля до создания на нем приложений с использованием библиотек .NET. В качестве подготовительного материала представлена глава «Философия .NET», в которой подробно описывается, как к такой концепции пришли, чем платформа характеризуется, как функционирует, на что способна и какую в ней роль играет C#. Написание программ на C# начинается с представления .NET Framework 2.0 SDK, а затем – различных компоновщиков: TextPad, SharpDevelop, Visual C# 2005 Express и Visual Studio 2005. После этого автор акцентирует внимание на процессе программирования, рассказывая об основах языка C#, объектноориентированном подходе, интерфейсах и коллекциях, обобщениях и других важных составляющих. Отсюда логично вытекает развитие темы и привязка программирования на C# к .NET:
сначала исследуются компоновочные блоки на этой платформе, а затем – применение ее библиотек, например, для создания графических интерфейсов спомощью System.Windows.Forms и для доступа к базам данных посредством ADO.NET. В последнюю, наиболее скромную, часть книги вынесена тематика Web: она затрагивает как обычные веб-приложения (написанные на ASP.NET 2.0), так и набирающие популярность веб-сервисы XML (в том числе язык описания WSDL и протокол UDDI). Для последних приведены примеры их создания в Visual Studio 2005.
n Издательство: n Год издания: n Количество страниц: n ISBN: n Цена:
«Вильямс» 2007 1168 5-8459-1124-9 ≈ 650 руб. К н и г а п р е д о с т а в л е н а и з д ат е л ь с т в о м «Вильямс» .
книжная полка
Функции SQL. Справочник программиста Э. Джоунс, Р. К. Стивенз, Р. Р. Плю, Р. Ф. Гарретт, А. Кригель енные функции, определяемые пользователем функции; дополнительные аспекты использования функций, приложения. Первая часть содержит общие сведения о различных реализациях SQL, определения основных понятий, данные о структуре функций и т. п. Вторая и третья подразделены на все рассматриваемые в книге СУРБД: Oracle (10g), IBM DB2 UDB (8.1), Microsoft SQL Server (2000), Sybase ASE (12.5), MySQL (5.0), PostgreSQL (8.0) и стандарт ANSI SQL. Во второй части можно найти подробГруппе авторов удалось создать все- ные списки функций, сгруппированобъемлющий справочник по функ- ные по типам (например, агрегатные, циям SQL в «глобальном» масштабе. строковые, числовые и т. п.), с их синДля этого в книге разобран целый ряд таксисом, описанием и примерами исреализаций этого языка, и для каждой пользования. В третьей – инструкции СУБД учтены именно ее особенности. по тому, как создавать, изменять, удаКнигу можно условно разделить на лять и отлаживать функции. Последняя 5 больших частей: введение про SQL часть посвящена вопросам применения в целом и функции в частности; встро- функций в типовых ситуациях: для ге-
нерации отчетов, для миграции данных, для заполнения хранилища данных, в приложениях. Кроме того, рассмотрены внедренные функции, возможность генерирования одних операторов SQL с помощью других, специальные системные таблицы различных СУРБД, а также проанализировано влияние SQL-функций на производительность запросов, базы данных и других ресурсов. В приложениях вкратце описаны технологии ODBC и JDBC, представленные данные по встроенным функциям, ключевым словам, типам данных и правам доступа.
n Издательство: n Год издания: n Количество страниц: n ISBN: n Цена:
«Диалектика» 2007 768 5-8459-1125-7 ≈ 371 руб. К н и г а п р е д о с т а в л е н а и з д ат е л ь с т в о м «Вильямс».
Язык программирования C++ Лекции и упражнения, 5-е издание Стивен Прата
Как можно догадаться из названия, издание относится к учебным пособиям по C++ для начинающих. Язык программирования рассматривается вне зависимости от платформы – речь идет о его стандарте, принятом ISO/ANSI в 2003 году. Причем ввиду профессиональных интересов автора оно создавалось для преподавателей соответствующей
№4, апрель 2007
дисциплины в вузах. Тем не менее издание можно смело рекомендовать любому, кто решит научиться программировать на C++. В книгу удалось включить всю необходимую для этого базу, да еще и сделать это в удобном виде. Автор постепенно раскрывает необходимые и повышающиеся по уровню сложности понятия, конструкции и алгоритмы, сопровождая многочисленными примерами, пояснениями и вопросами для самопроверки в конце главы (ответы на них можно найти в приложении; в некоторых приводится код программ, решающих заданные проблемы). Содержание структурировано примерно так: первые шаги и использование компиляторов, базовые операторы и функции, работа с данными (простые переменные и арифметика), более сложные типы данных (строки,
массивы, структуры, указатели), циклы, условные операторы и логические выражения, создание и использование функций, объекты и классы, изучение моделей и классов памяти, а также ее динамического распределения, шаблоны классов, «друзья»/исключения и RTTI, класс string и стандартная библиотека шаблонов (STL), ввод/вывод (потоки, буферы и файлы). В приложениях изложены дополнительные сведения о различных операциях, классе string и библиотеке STL.
n Издательство: n Год издания: n Количество страниц: n ISBN: n Цена:
«Вильямс» 2007 1184 5-8459-1127-3 ≈ 464 руб. К н и г а п р е д о с т а в л е н а и з д ат е л ь с т в о м «Вильямс».
Обзор книжных новинок подготовил Дмитрий Шурупов
93
подписка на 2007 год
Редакционная подписка для физических лиц n Вы можете оформить подписку
n Вы можете оформить подписку
n Журнал высылается почтой прос-
на любой российский адрес. n При заполнении квитанции обя‑ зательно РАЗБОРЧИВО укажи‑ те фамилию, имя, отчество пол‑ ностью, почтовый индекс и ад‑ рес получателя (область, город, улица, номер дома, номер квар‑ тиры), контактный телефон.
с любого месяца на любой срок. n В графе «Сумма» проставьте сумму за выбранное количество номеров. Стоимость одного номера журнала 150 руб. За 10 месяцев (с марта по декабрь) – 1500 руб. НДС и почтовые расходы включены в стоимость.
той бандеролью только после поступления денег на расчетный счет и копии заполненного и оплачен‑ ного бланка, отправленной в ре‑ дакцию по факсу: (495) 628‑82‑53 или на элек тронный а д рес: info@samag.ru.
94
подписка на 2007 год Российская Федерация
n Подписной индекс: годовой – 20780, полугодовой – 81655
Каталог агентства «Роспечать» n Подписной индекс: 87836 Объединенный каталог «Пресса России» Адресный каталог «Подписка за рабочим столом» Адресный каталог «Библиотечный каталог» n Альтернативные подписные агентства: Агентство «Интер-Почта» (495) 500-00-60, курьерская доставка по Москве Агентство «Вся Пресса» (495) 787-34-47 Агентство «Курьер-Прессервис» Агентство «ООО Урал-Пресс» (343) 375-62-74 ЛинуксЦентр www.linuxcenter.ru n Подписка On-line http://www.arzi.ru http://www.gazety.ru http://www.presscafe.ru
СНГ В странах СНГ подписка принимается в почтовых отделениях по национальным каталогам или по списку номенклатуры «АРЗИ»: n Азербайджан – по объединенному каталогу российских изданий через предприятие по распространению
печати «Гасид» (370102, г. Баку, ул. Джавадхана, 21)
n Казахстан – по каталогу «Российская Пресса» через ОАО «Казпочта» и ЗАО «Евразия пресс»
n Беларусь – по каталогу изданий стран СНГ через РГО «Белпочта» (220050, г. Минск, пр-т Ф. Скорины, 10)
n Узбекистан – по каталогу «Davriy nashrlar» российские издания через агентство по распространению печати «Davriy nashrlar» (7000029, г. Ташкент, пл. Мустакиллик, 5/3, офис 33) n Армения – по списку номенклатуры «АРЗИ» через ГЗАО «Армпечать» (375005, г. Ереван, пл. Сасунци Давида, д. 2) и ЗАО «Контакт-Мамул» (375002, г. Ереван, ул. Сарьяна, 22) n Грузия – по списку номенклатуры «АРЗИ» через АО «Сакпресса» ( 380019, г. Тбилиси, ул. Хошараульская, 29) и АО «Мацне» (380060, г. Тбилиси, пр-т Гамсахурдия, 42) n Молдавия – по каталогу через ГП «Пошта Молдовей» (МД-2012, г. Кишинев, бул. Штефан чел Маре, 134) по списку через ГУП «Почта Приднестровья» (МD-3300, г. Тирасполь, ул. Ленина, 17) по прайс-листу через ООО Агентство «Editil Periodice» (МД-2012, г. Кишинев, бул. Штефан чел Маре, 134) n Подписка для Украины: Киевский главпочтамт Подписное агентство «KSS», тел./факс (044)464-0220
Подписные индексы:
20780* 81655** по каталогу агентства «Роспечать»
87836 по каталогу агентства «Пресса России» *
годовой полугодовой
**
№4, апрель 2007
95
СИСТЕМНЫЙ АДМИНИСТРАТОР №4(53), Апрель, 2007 год УЧРЕДИТЕЛИ Владимир Положевец Александр Михалев РУКОВОДИТЕЛЬ ПРОЕКТА Петр Положевец РЕДАКЦИЯ Исполнительный директор Владимир Положевец Ответственный секретарь Наталья Хвостова sekretar@samag.ru Технический редактор Владимир Лукин Главный редактор электронного приложения «Open Source» Дмитрий Шурупов Внештатные редакторы Алексей Барабанов Алексей Мичурин Алексей Шелестов Дмитрий Горяинов РЕКЛАМНАЯ СЛУЖБА тел./факс: (495) 628-8253 Евгения Тарабрина reсlama@samag.ru Верстка и оформление maker_up@samag.ru Дизайн обложки Николай Петрочук По вопросам распространения обращайтесь по телефону: (495) 628-8253 (доб. 120) 107045, г. Москва, Ананьевский переулок, дом 4/2, стр. 1 тел./факс: (495) 628-8253 Сайт журнала: www.samag.ru ИЗДАТЕЛЬ ЗАО «Издательский дом «Учительская газета» Отпечатано типографией ГП «Московская Типография №13» Тираж 15000 экз. Журнал зарегистрирован в Министерстве РФ по делам печати, телерадиовещания и средств массовых коммуникаций (свидетельство ПИ № 77-12542 от 24 апреля 2002 г.). За содержание статьи ответственность несет автор. За содержание рекламных материалов ответственность несет рекламодатель. Все права на опубликованные материалы защищены.
Читайте в следующем номере: Сравнительный обзор программных средств удаленного доступа Чем рабочее место системного администратора отличается от рабочего места обычного пользователя? Тем, что на нем, как правило, установлен клиент системы удаленного доступа, а иногда два или несколько. Для того чтобы виртуально «побывать» на удаленном компьютере, используется широкий диапазон программ, особенности которых мы рассмотрим в следующем номере журнала.
m0n0wall – дистрибутив для создания межсетевого экрана Интернет не только средство обмена сообщениями и информации, но и источник многих проблем. Среди них – вирусы, атаки хакеров, программы шпионы, утечка информации, использование ресурсов в личных целях. Первым барьером на пути стоят межсетевые экраны. Существует большое количество решений, как аппаратных, так и программных, позволяющих превратить обычный ПК в межсетевой экран, работающих под разными операционными системами, отличающихся стоимостью и лицензией. Крупные организации могут себе позволить использовать такие продукты, как ISA 2006 Server. Но сто-
имость последнего вместе с операционной системой для средних и тем более небольших компаний будет значительной расходной статьей в бюджете. В этом случае на помощь могут прийти специализированные решения на базе свободных операционных систем. Одно из них – проект m0n0wall.
Split DNS: Заставим BIND работать на два фронта! Вы системный администратор серьезной организации, которая использует много внешних адресов и свои DNSсерверы? У вас единое адресное пространство для внешних и внутренних серверов? Вы используете разные DNSсерверы для внутренней и внешней сети? Не стоит так усложнять себе жизнь. Есть способ заставить BIND работать на два фронта!
Используем Cisco PIX для обеспечения VPN‑подключений к локальной сети Существует множество способов, чтобы предоставить удалённым пользователям возможность получения доступа к сетевым ресурсам локальной сети компании. В следующем выпуске расскажем, как этого достичь при помощи специально разработанного для подобных целей firewall Cisco PIX.
Уважаемые читатели! Обратите внимание, что оформить подписку вы можете не только на полугодие, но и сразу на весь год. Годовой индекс по каталогу «Роспечать» – 20780. Интер-почта – заказ журналов по тел.(495) 500-00-60. Подписка on-line – SetBook.ru. Приобрести новые и старые номера журнала вы можете через интернет-магазины LinuxCenter.ru и Allsoft.ru.
Доставка почтой в любую точку России.
96