1995 | 1996 | 1997 | 1998 | 1999 | 2000 | 2001 | 2002 | 2003 | 2004 | Оглавление текущего номера /323, 1999 г./ | Поиск  

Cвет в конце s-туннеля

МАКСИМ СМИРНОВ,
Опубликовано: 9.11.1999


© 2003, Журнал «Компьютерра» | http://www.computerra.ru/offline
Этот материал вы сможете найти в Интернете по адресу: http://www.computerra.ru/offline/1999/323/3375/

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


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

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

Защита соединений и SSLeay

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

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

Такое решение, как виртуальные частные сети (VPN, virtual private network), здесь не подходит. Традиционно методы подтверждения полномочий определялись в спецификациях прикладных протоколов, таких как http, pop3 или imap. Как правило, эти методы ограничивались передачей от клиента к серверу имени пользователя и пароля, причем пароль передавался в открытом виде.

Под влиянием справедливой критики экспертов по компьютерной безопасности и благодаря появлению протоколов Secure Sockets Layer (SSL) и Transport Layer Security (TLS) [1] ситуация стала меняться. Все больше производителей серверных программ реализуют в приложениях возможность проверки полномочий посредством SSL и TLS.

Для реализации SSL часто используют предложенную Эриком Янгом и Тимом Хадсоном (Eric Young, Tim Hudson) библиотеку SSLeay (www.psy.uq.edu.au/~ftp/Crypto), бесплатно предоставляемую в исходных текстах. Эта библиотека успешно встроена в ряд серверных продуктов (например, в Web-сервер Apache) и хорошо себя зарекомендовала. Кроме того, она работает не только в открытых системах, но и в Windows 9x и NT. В настоящее время развитие SSLeay продолжается в проекте OpenSSL (www.openssl.org). Благодаря OpenSSL, а также коммерческим криптографическим библиотекам, предлагаемым RSA Data Security, сегодня реализация SSL в серверных приложениях не представляет серьезных проблем.

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

С другой стороны, коммерческие производители программ столь искусно дозируют использование криптографических средств в своих приложениях, что иногда просто невозможно понять, что же реально умеет делать программа [2].

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

 
СООТВЕТСТВИЕ ПОРТОВ И НАИБОЛЕЕ ШИРОКО ИСПОЛЬЗУЕМЫХ ПРИКЛАДНЫХ ПРОТОКОЛОВ

Стандартный протокол (порт)Защищенный протокол (порт)Назначение протокола
http (80)https (443)Передача гипертекста между Web-сервером и браузером.
smtp (25)smtps (465)Передача сообщений электронной почты от клиента к серверу и обмен сообщениями между серверами.
nntp (119)nntps (563)Прием-передача сообщений конференций usenet.
ldap (389)ldaps (636)Доступ к каталогу (используется для работы с адресной книгой).
ftp-data (20)ftps-data (989)Протокол приема и передачи файлов.
ftp (21)ftps (990) 
telnet (23)telnets (992)Работа с удаленным компьютером в режиме терминала.
imap (143)imaps (993)Управление каталогами почтового ящика, прием сообщений электронной почты.
irc ircs (994)Участие в online-разговорах (chat).
pop3 (110)pop3s (995)Получение сообщений электронной почты с почтового сервера.


Основная идея STunnel

Задача интеграции приложений всегда была сложной. Одно из возможных решений состоит в распространении программ в исходных текстах, что позволяет пересобрать программу с использованием необходимых библиотек. Такое решение нравится системным администраторам, но не годится для обычных пользователей. К тому же большинство популярных Windows-программ в исходных текстах не распространяется [3]. Если ваша программа не поддерживает SSL, задача обеспечения безопасности при работе в сети кажется нерешаемой. Однако это не так.

STunnel позволит вам использовать защищенные соединения практически в любой программе. Для того чтобы "научить" программу (например, упомянутый выше Outlook Express) работать с SSL в полном объеме, просто следует запустить STunnel, и пока она запущена, вся ваша почта будет доставляться на сервер через защищенное соединение.

Это достигается при помощи следующего приема. Программы, использующие протоколы TCP/IP, могут взаимодействовать не только с программами, запущенными на других компьютерах; иногда бывает полезным запустить программу-клиент на том же компьютере, что и программу-сервер. Поэтому каждому компьютеру присваивается локальный IP-адрес 127.0.0.1, позволяющий запущенным на нем приложениям работать так, как будто взаимодействие между ними происходит по сети.

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

Думаю, для системных администраторов и программистов сказанного выше вполне достаточно, чтобы успешно использовать STunnel на серверах или рабочих станциях для любых сетевых приложений. Добавлю только, что официальная страница STunnel доступна на http://mike.daewoo.com.pl/computer/stunnel.

Дальнейшие советы предназначены в основном для пользователей, и в первую очередь - для пользователей Windows 95/98, NT и Windows 2000.

Практические советы

К сожалению, пока программа STunnel плохо документирована, не обладает графическим интерфейсом и в малой степени использует другие возможности Windows. Поэтому ее настройка и использование требует аккуратности.

Я экспериментировал с версией 3.4a, возможно, в других версиях некоторые детали отличаются от указанных ниже.

Состав продукта

В Пакет входят три обязательных файла: программа stunnel.exe и две динамически подключаемые библиотеки libeay32.dll и libssl32.dll, позаимствованные из пакета OpenSSL. Практически вся доступная на сегодня документация находится в файле faq.txt (на английском языке). Скорее всего, вам понадобится файл с закрытым ключом и сертификатом. Имя этого файла может быть произвольным. Создать его можно с использованием пакета OpenSSL.

Какой-либо специальной установки для STunnel не требуется. Для начала работы файлы libeay32.dll и libssl32.dll необходимо скопировать в системный каталог Windows (по умолчанию это c:\windows\system для Windows 9х или c:\winnt\system32 для NT).

Параметры запуска

Для того чтобы правильно запустить stunnel.exe, вам необходимо указать несколько параметров. Параметры начинаются со знака минус и разделяются пробелом. Полный список параметров можно получить, запустив STunnel с параметром -h. Описание параметров приведено во врезке.

Для работы в режиме клиента, то есть при использовании STunnel совместно с клиентским программным обеспечением (например, с программой электронной почты), всегда следует указывать параметр -c. Кроме этого, вам всегда придется указывать еще как минимум два параметра: протокол, который использует ваша программа (-d), и протокол, используемый сервером, с которым устанавливается защищенное соединение (-r).

Для указания протоколов могут быть использованы либо их текстовые названия, либо закрепленные за протоколами номера портов. Например, протокол передачи сообщений электронной почты называется smtp, и для него зарезервирован порт с номером 25, поэтому в качестве протокола, используемого приложением для отправки почты, надо указать параметр -d smtp или же -d 25.

Напомню, что соответствие протоколов и номеров портов задается файлом services, который располагается в каталоге c:\windows для Windows 95 или в каталоге c:\winnt\ system32\drivers\etc для NT. В этом файле могут быть не указаны протоколы, используемые сервером, ожидающим защищенное соединение. Названия таких протоколов и соответствующих стандартных портов приведены во врезке на стр. 38. STunnel нецелесообразно использовать для защиты протокола http, так как для каждого сервера, с которым вы работаете, придется запускать новую копию stunnel.exe. Впрочем, большинство браузеров реализует защиту протокола http.

width=250Рассмотрим простой пример использования STunnel. Известно, что одним из наиболее существенных недостатков протокола получения электронной почты pop3 является передача пароля в открытом виде, то есть любой компьютер, через который вы связываетесь с сервером почты, может быть использован злоумышленником для того, чтобы узнать ваш пароль и беспрепятственно читать вашу почту. STunnel решает эту проблему. Вам достаточно запустить программу со следующими параметрами: stunnel -c -d localhost:pop3 -r сервер:995, где "сервер" - имя вашего почтового сервера, например pop3.mail.ru. А в настройках вашей почтовой программы в качестве сервера входящей почты следует указать адрес локального компьютера 127.0.0.1 или localhost (см. рис.).

 
ПАРАМЕТРЫ КОМАНДНОЙ СТРОКИ STUNNEL

Параметры запуска

STunnel [-c] [-T] [-p pemfile] [-v level] [-a directory] [-t timeout] [-u username] [-n protocol] -d [ip:]port -r [ip:]port

-cЗапуск производится на компьютере клиента для работы с сервером, который поддерживает SSL. Этот параметр не используется, если STunnel запускается на сервере.
-TTransparent proxy mode (используется только на хостах, которые поддерживают такой режим).
-p pemfileИмя файла сертификата в формате PEM. Если этот параметр не указан, а STunnel запущена в режиме сервера, используется файл STunnel.pem. Если же STunnel запущена в режиме клиента, и этот параметр не указан, то сертификат не используется.
-v levelУровень проверки сертификатов удаленного компьютера.
1 - корректный сертификат может быть предоставлен или не предоставлен;
2 - удаленный компьютер должен предоставить произвольный сертификат;
3 - удаленный компьютер должен предоставить сертификат такой же, как один из сертификатов в локальном каталоге.
По умолчанию сертификат удаленного компьютера не проверяется.
-a directoryЛокальный каталог сертификатов.
-t timeoutТайм-аут TCP-соединения. По умолчанию 300 секунд.
-u userИмя пользователя. Задается в том случае, если сервер использует механизм аутентификации IDENT (RFC 1413).
-n protoЗадается при использовании SSL для конкретного протокола. В настоящее время поддерживается только smtp.
-d [ip:]portIP-адрес и протокол или порт приложения. Если IP-адрес не задан, допустимы любые адреса (INADDR_ANY).
-r [ip:]portIP-адрес и протокол или порт удаленного приложения. Если IP-адрес не задан, используется локальный хост (INADDR_LOOPBACK).
-hПолучение справки по командам STunnel.
-C listЗадание списка допустимых алгоритмов шифрования.
-D levelУровень выдачи отладочной информации в диапазоне от 0 до 7. По умолчанию 5.
-VВерсия программы STunnel.


Создание ключа и получение сертификата

Как я уже говорил, мое знакомство с STunnel было вызвано безуспешными попытками заставить Outlook Express устанавливать защищенное соединение в режиме с взаимной аутентификацией. Протокол SSL допускает работу в одном из двух режимов. В первом используется только цифровой сертификат сервера. Второй предусматривает наличие сертификатов как у сервера, так и у клиента. В обоих режимах осуществляется шифрование данных, однако в первом режиме только клиент может быть уверен в аутентичности (подлинности) сервера, а во втором сервер требует обязательного наличия у клиента корректного цифрового сертификата, что позволяет строго аутентифицировать и пользователя.

Безусловно, наибольший интерес представляет второй режим SSL, режим со взаимной аутентификацией клиента и сервера. Использование клиентских цифровых сертификатов позволяет не только обеспечить конфиденциальность передаваемых данных, но и отказаться от таких неудобных и слабых механизмов аутентификации, как пароли.

Для того чтобы выработать собственный цифровой сертификат, вам понадобится пакет OpenSSL [5].

Вы можете действовать по одному из двух сценариев: 1) создать ключ и заявку на сертификат при помощи программы OpenSSL, отправить заявку для регистрации в службу заверения сертификатов (certificate authority, CA) [6] и дождаться получения сертификата, или же 2) создать при помощи OpenSSL собственный локальный certificate authority, в котором и зарегистрировать ваш ключ [7].

Для реализации первой стратегии вам следует создать файл конфигурации req.cnf (см. врезку) и вызвать программу openssl.exe с следующими параметрами:

openssl.exe req -new -config req.cnf -out stunnel.req

Полученный в результате файл stunnel.req следует отправить в certificate authority для заверения. После того как вы получите заверенный сертификат, например, в файле stunnel.crt, вам останется просто добавить его к файлу закрытого ключа stunnel.pem командой copy stunnel.pem + stunnel.crt. В дальнейшем при использовании STunnel запускайте файл с дополнительным параметром -p stunnel.pem.

 
ФАЙЛ КОНФИГУРАЦИИ OPENSSL (REQ.CNF)

[ req ]
default_bits= 1024
default_keyfile= STunnel.pem
distinguished_name= req_distinguished_name
encrypt_rsa_key= no
[ req_distinguished_name ]
countryName= страна (двухбуквенный код)
countryName_default= RU
stateOrProvinceName= штат или область (полное название)
localityName= населенный пункт (например, город)
localityName_default= Moscow
organizationName= название организации (например, фирмы)
organizationName_default=
organizationalUnitName= название подразделения (например, отдела)
commonName= имя лица (например, ВАШЕ имя)
emailAddress= адрес электронной почты


Возможные угрозы

Следует сказать несколько слов о том, какие атаки может попытаться осуществить злоумышленник. Прежде всего, любая криптозащита эффективна только в том случае, если злоумышленнику недоступен ваш закрытый ключ. Он хранится в файле stunnel.pem. Кроме того, ценность для злоумышленника представляет файл .rnd, используемый пакетом OpenSSL как "рассада" (seed file) для выработки ключей. Если вы работаете в операционной системе Windows 95/98, ни при каких обстоятельствах не храните ключи в каталоге, к которому разрешен доступ из сети. При использовании Windows NT и файловой системы NTFS обязательно запретите доступ к этому файлу всем, кроме себя.

Другой неочевидной и крайне неприятной угрозой является возможность использования сервиса STunnel с другого компьютера. Дело в том, что если вы запустите STunnel, не указав явно в параметре -d IP-адрес локального компьютера, то любой подключенный к Internet компьютер сможет воспользоваться вашей Stunnel как сервисом-посредником (proxy). К счастью, эта проблема легко решается: просто при каждом запуске STunnel следует явно указывать, что программа будет обслуживать только локальный компьютер, например, -d localhost:pop3 или -d 127.0.0.1:pop3. Остается только сожалеть о том, что это правило не предусмотрено "по умолчанию".

Как видите, использовать STunnel достаточно просто. Если все же процедуры настройки покажутся вам сложными, а интерфейс - недостаточно дружественным, можно адаптировать STunnel в соответствии со своими потребностями и вкусами. Ведь этот продукт невелик по размеру и поставляется с исходными текстами. Разработчики STunnel обещают в ближайших версиях реализовать графический интерфейс для Windows и протоколирование событий в EventLog. Я считаю, что более важным была бы реализация STunnel в виде сервиса Windows NT, разработка правил управления сертификатами и шифрование ключей на пароле, как это реализовано в OpenSSL. Возможно, вам покажется более актуальным добавить в STunnel какие-либо другие возможности.



1 (обратно к тексту) - Протокол TLS (RFC2246) разработан на базе версии 3 протокола SSL и незначительно отличается от SSL. TLS также поддерживается новейшими версиями OpenSSL. Основное отличие TLS от SSL в том, что TLS специфицирует конкретный слой сетевой модели (а именно транспортный), по отношению к которому строится механизм защиты, а SSL апеллирует не к сетевой модели, а к модели ее реализации (socket'у).

2 (обратно к тексту) - Так, например, чтобы научить MS Internet Information Server версии 4.0 аутентифицировать клиентские приложения с использованием цифровых сертификатов, в документации рекомендовано сначала добавить сертификат в браузер, устанавливаемый на том же компьютере, что и Web-сервер, а затем синхронизировать справочники сертификатов браузера и Web-сервера при помощи утилиты iisca.

3 (обратно к тексту) - Следует отметить, что Microsoft предложила способ встраивания SSL в Windows NT, однако этот способ довольно сложен и требует досконального знания сетевых средств этой операционной системы.

4 (обратно к тексту) - Существуют и другие продукты, построенные на этом принципе, например sslwrap (www.rickk.com/sslwrap), но по ряду причин я остановился именно на STunnel.

5 (обратно к тексту) - Внимание! Программы STunnel и OpenSSL могут использовать разные версии библиотек, поэтому вам лучше скопировать файлы libeay32.dll, ssleay32.dll и openssl.exe в отдельный каталог и запускать openssl.exe только из этого каталога.

6 (обратно к тексту) - Список действующих CA и их Web-адресов можно найти в окне Security|Sertificates|Signers приложения Netscape Navigator/Communicator или Start|Settings|Control Panel|Internet|Content|Certificates|Authorities|Secure Email. Обязательно обратите внимание на то, что американские CA, как правило, не подписывают сертификатов ключей достаточной длины для пользователей за пределами США/Канады.

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






1995 | 1996 | 1997 | 1998 | 1999 | 2000 | 2001 | 2002 | 2003 | 2004 | Оглавление текущего номера /323, 1999 г./ | Поиск  

© 2004, Издательский дом «Компьютерра» | http://www.computerra.ru
Телефон редакции: (095) 232-22-61
E-mail редакции: inform@computerra.ru