stunnel - Универсальный SSL/TLS тунель
stunnel утилита разработанная для создания TLS защищенного соединения между клиентом и локальным (Iinetd-запускаемым) или удаленным сервером. Таким образом, не имея поддержки TLS в том или ином демоне(сервисе) в Вашей системы, Вы можете легко обеспечить защиту(шифрование, одностороннюю или двустороннюю аутентификацию) соединения с использыванием TLS. stunnel может быть использован для добавления функции TLS для популярных Inetd сервисов, тиких как POP-2, POP-3, и IMAP , так же для сервисов как NNTP, SMTP и HTTP, или организацию PPP тунелей без изменения кода самих сервисов.
Этот продукт, для реализации TLS использует либо пакеты Security Support Provider Interface (SSPI) от Microsoft (www.microsoft.com) или Крипто-Про(www.cryptopro.ru), либо пакет OpenSSL написанный Eric Young (eay@cryptsoft.com)
Каждая строка конфигурационного файла должна быть:
chroot()
которая вызывается после разбора конфигурационного файла stunnel
Примечания:
1)Использование данной возможности крайне желательно сопровождать использованием setuid;
2)При создании замкнутого окружения, в нем должны бытьустановлены все внешние обьекты CryptoAPI/SSPI, CApath, CRLpath, pid, exec дожны находиться в нем. Например, если вы используете (TCP Wrappers) вы дожны скопировать файлы /etc/hosts.allow /etc/hosts.deny внутрь каталога chroot.
rle(OpenSSL)
По умолчанию: без сжатия
Уровни задаются аналогично syslogd emerg (0), alert (1), crit (2), err (3), warning (4), notice (5), info (6), или debug (7). Все сообщения с заданным уровнем и уровнем ниже заданного будут запротоколированы. Пример debug = debug или debug = 7.
По умолчанию: debug = notice и используется syslog(Unix only.) Параметры facility и level регистронезависимы.
Оставаться в foreground режиме (не использовать fork) и писать протокол в stderr (если не указан output).
По умолчанию: no, т.е в режиме демона
Допустимо значение /dev/stdout
Если аргумент не задан, то pid не сохраняется.
Если задана опция chroot, то путь указывается относително ее.
bytes(OpenSSL)
Количество байт для чтения из файла со случайной последовательностью. Для OpenSSL версии меньше 0.9.5a, она так же определяет сколько байт достаточно для инициализации датчика случайных чисел. Более поздние версии OpenSSL имеют встроенные функции для определения достаточного количества байт для инициализации.
file(OpenSSL)
Библиотека OpenSSL использует эти данные для инициализации датчика случайных чисел.
no(OpenSSL)
По умолчанию: yes
On Unix: В inetd это имя для TCP Wrapper библиотеки.
On NT/2000/XP: Имя NT сервиса для контрольной панели.
По умолчанию: stunnel
setgid()
в эту группу.
setuid()
под этого пользователя
Формат значений для SO_LINGER : l_onof:l_linger. Формат значений для времени: tv_sec:tv_usec.
Пример:
socket = l:SO_LINGER=1:60 Установить минунтный таймаут для локального сокета socket = r:TCP_NODELAY=1 Выключить Nagle алгоритм для удаленного сокета socket = a:SO_REUSEADDR=0 Запретить повторное использование портов TCP (по умолчанию разрешено) socket = a:SO_BINDTODEVICE=lo Принимать соединения только с loopback интерфейса
По умолчанию: yes
Каждая секция в конфигурационном файле начинается с имени сервиса в квадратных скобках. Это имя будет использоваться библиотекой libwrap и PAM, а так же дает возможность различать протокольные сообщения.
Примечание: Если вы хотите запускать stunnel в Inetd режиме, смотрите секцию Inetd MODE описанную ниже
Если host не указан, то для всех ip данного компьютера.
store(SSPI)
Пример: My
directory(OpenSSL)
Каталог в которой stunnel будет искать сертификаты CA при использовании verify. Сертификаты в этой дериктории должны называться как XXXXXXXX.0 где XXXXXXXX значение хеша Der кодированно сертификата. (первые 4 байта в MD5 хеше).
Если указан chroot то CApath указывается относительно него.
certfile(OpenSSL)
Этот файл может сожержать множество сертификатов СА. Используется в verify.
pemfile(OpenSSL)
Сертификат stunnel обязателен для использования в качестве сервера. Указание этой опции в режиме клиента необходимо для удовлетворения требования TLS сервера на двустороннюю аутентификацию по сертификату клиента. Использование клиентского сертификата опционально.
Пример: GOST34102001-WITH-GOST28147-OFB-GOST28147:DES-CBC3-SHA:IDEA-CBC-MD5
По умолчанию: no (режим сервера)
directory(OpenSSL)
Примечание: Файлы в этой дериктории должны быть названы как XXXXXXXX.0 где XXXXXXXX значение хеша CRL.
Если указан chroot то CApath указывается относительно него.
Store(SSPI)
Пример: My
certfile(OpenSSL)
Этот файл содержит множество CRL, используеммых в verify.
number(OpenSSL)
Нумерация начинается с 1.
exec путь относителен chroot дериктории если она задана.
Кавычки не поддерживаются. Аргументы должны быть разделены пробелами.
username(OpenSSL)
keyfile(OpenSSL)
Закрытый ключ необходим для аутентификации обладателя сертификата. Файл должен быть защищен от доступа третьих лиц,в Unix системах можно использовать следующую команду:
chmod 600 keyfile
По умолчанию: значение cert опции
url(OpenSSL)
SSL_options(OpenSSL)
Параметры для OpenSSL описанные в SSL_CTX_set_options(3ssl) реководстве но без префискса SSL_OP_. Несколько options могут быть использованы для указания множества опций.
Например, для совместимости с Eudora SSL реализацией следущие опции должны быть установлены.
options = DONT_INSERT_EMPTY_FRAGMENTS
Поддерживаемые: cifs, connect, nntp, pop3, smtp
version(OpenSSL)
Допустимые опции: all, SSLv2, SSLv3, TLSv1
seconds(OpenSSL)
Re-write address to appear as if wrapped daemon is connecting from the SSL client machine instead of the machine running stunnel. This option is only available in local mode (exec option) by LD_PRELOADing env.so shared library or in remote mode (connect option) on Linux 2.2 kernel compiled with transparent proxy option and then only in server mode. Note that this option will not combine with proxy mode (connect) unless the client's По умолчанию route to the target machine lies through the host running stunnel, which cannot be localhost.
level(SSPI)
default – Проверка по умолчанию, если не заданы CRLpath или CRLfile, то использует доступ к CDP по http/ldap; level 3 - Проверять используя локально установленные сертификаты; level 2 - Проверять каждый сертификат; level 1 - Проверять каждый сертификат если есть; level 0 - Не проверять; FIX ME!!! НЕ ЗАКОНЧЕНА
level(OpenSSL)
level 1 - Проверять каждый сертификат если есть level 2 - Проверять каждый сертификат level 3 - Проверять используя локально установленные сертификаты default - Не проверять
stunnel Возвращает нулевой код завершения при успешном выполнении, при ошибках возвращается не нулевой код возвращения.
Для реализации инкапсуляции imapd в SSL/TLS:
[imapd] accept = 993 exec = /usr/sbin/imapd execargs = imapd
Тунелирование pppd через SSL/TLS по порту 2020,
[vpn] accept = 2020 exec = /usr/sbin/pppd execargs = pppd local pty = yes
Для запуска stunnel в inetd стиле можно использовать следующий stunnel.conf.
Примечание: в конфигурационном файле не должно быть [service_name] секции.
exec = /usr/sbin/imapd execargs = imapd
Ниже приведен пример конфигурации engine для считывания закрытого ключа используя OpenSC engine.
engine=dynamic engineCtrl=SO_PATH:/usr/lib/opensc/engine_pkcs11.so engineCtrl=ID:pkcs11 engineCtrl=LIST_ADD:1 engineCtrl=LOAD engineCtrl=MODULE_PATH:/usr/lib/pkcs11/opensc-pkcs11.so engineCtrl=INIT
[service] engineNum=1 key=id_45
Опция execargs не поддерживает кавычки.
stunnel нельзя использовать с FTP демоном из-за природы FTP протокола который использует множество портов для передачи данных.
Наиболее распространненый вариант использования stunnel когда он слушает порт и устанавливает соединение или с другим портом из опции connect или прграммой из exec опции. Так же могут быть причины по которым вы хотите что бы другая программа принимала входящие соединения и запускала stunnel из inetd, xinetd, или tcpserver.
Например если вы имеете следующий конфиг в \fIinetd.conf\fR:
imaps stream tcp nowait root /usr/sbin/stunnel stunnel /etc/stunnel/imaps.conf
В таком случае inetd демон ответственен за привязку сокета и передачу его в stunnel когда соединение установлено. Таким образом stunnel не имеет ни одной accept опции. Все Service Level Options должны содержаться в глобалных опциях и не должно быть ни одной [service_name] секции Смотри раздел EXAMPLES с примерами.
Каждый \s-1SSL\s0 демон должен предстваить валидный X.509 сертификат Так же ему нужен закрытый ключ для расшифровки входящий данных. Наиболее простой путь получения сертификата и закрытого ключа это использовать OpenSSL пакет. Больше информации про этот пакет можно найти в описании следующих пакетов.
Две вещи наиболее важны при генерации пары сертификат-закрытый ключ для stunnel. Закрытый ключ не может быть зашифрован, так как сервер не имеет возможности получить пароль от пользователя. Для генерации незашифрованого ключа добавьте -nodes опцию при выполнении req каманды из пакета OpenSSL.
Порядок следования сертификатов в .pem файле то же важен. Он должнет сожержать не зашифрованый закрытый ключ в начале, затем сертификат. Затем пустая строка после закрытого ключа и сертификата. Не зашифрованая информация о сертификате (в верху сертификата) должна быть удалена Файл должнен выглядеть вот так:
-----BEGIN RSA PRIVATE KEY----- [encoded key] -----END RSA PRIVATE KEY----- [empty line] -----BEGIN CERTIFICATE----- [encoded certificate] -----END CERTIFICATE----- [empty line]
В stunnel нужен для инициализации PRNG (Датчик псевдо случайных чисел) для того что бы SSL использовал хорошие последовательности. Следующие источники будут использоваться (в указанном порядке) до тех пор пока не будет полученно соответствующие кол-во данных.
В последних версиях (>=OpenSSL 0.9.5a) при получении достаточной энтропии источники случайных данных будут закрыты автоматически. В предыдущих версиях OpenSSL не существует функций для определения достаточного количества данных.
Примечание: На Windows машинах нет консоли для интерактивного взаимодействия с пользователем (движение мыши, создание окон и т.д.) и содержание окна не достаточно, вам необходимо созадть файл с случайной последовательностью и указать его в опции RNDfile.
Файл указанный в опции RNDfile должен сожержать случайную последовательность это означает что он должен содержать разные данные при каждом запуске stunnel. Это будет делаться автоматически ло тех пор пока не будет указана опция RNDoverwrite. Если вы хотите обновлять его вручную, то openssl rand команда из последней версии OpenSSL будет весьма полезна.
Если /dev/urandom доступен, OpenSSL имеет привычку инициализировать PRNG данными из него да же кога проверяет случайное состояние, таким образом на системах с ним вероятнее всего вы используете его да же если он в самом низу списка указаного выше. Это не поведение stunnel's, это OpenSSL.