NAME

stunnel - Универсальный SSL/TLS тунель


SYNOPSIS

Unix:
stunnel [<filename>] | -fd n | -help | -version | -sockets

WIN32:
stunnel [ [-install | -uninstall | -start | -stop] [-quiet] [<filename>] ] | -help | -version | -sockets


DESCRIPTION

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)


OPTIONS

<filename>
Использовать указанный конфигурационный файл

-fd n (Unix only)
Прочитать конфигурационный файл из указанного дескриптора

-help
Напечатать справку по stunnel

-version
Печать версии stunnel

-sockets
Печать опций для сокета

-install (NT/2000/XP only)
Установить NT сервис

-uninstall (NT/2000/XP only)
Удалить NT сервис

-start (NT/2000/XP only)
Запустить NT сервис

-stop (NT/2000/XP only)
Остановить NT сервис

-quiet (NT/2000/XP only)
Не открывать окошки с сообщениями


CONFIGURATION FILE

Каждая строка конфигурационного файла должна быть:

GLOBAL OPTIONS

chroot = directory (Unix only)
Каталог вызова функции chroot() которая вызывается после разбора конфигурационного файла stunnel

Примечания:

1)Использование данной возможности крайне желательно сопровождать использованием setuid;

2)При создании замкнутого окружения, в нем должны бытьустановлены все внешние обьекты CryptoAPI/SSPI, CApath, CRLpath, pid, exec дожны находиться в нем. Например, если вы используете (TCP Wrappers) вы дожны скопировать файлы /etc/hosts.allow /etc/hosts.deny внутрь каталога chroot.

compression = zlib | rle(OpenSSL)
Алгоритм сжатия данных

По умолчанию: без сжатия

debug = [facility.]level
Уровень протоколирования

Уровни задаются аналогично 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 = yes | no (Unix only)
foreground режим

Оставаться в foreground режиме (не использовать fork) и писать протокол в stderr (если не указан output).

По умолчанию: no, т.е в режиме демона

output = file
Писать протокол в file, а не в syslog

Допустимо значение /dev/stdout

pid = file (Unix only)
Файл для сохранения pid

Если аргумент не задан, то pid не сохраняется.

Если задана опция chroot, то путь указывается относително ее.

RNDbytes = bytes(OpenSSL)
Количество байт для чтения из фала со случайной последовательностью.

Количество байт для чтения из файла со случайной последовательностью. Для OpenSSL версии меньше 0.9.5a, она так же определяет сколько байт достаточно для инициализации датчика случайных чисел. Более поздние версии OpenSSL имеют встроенные функции для определения достаточного количества байт для инициализации.

RNDfile = file(OpenSSL)
Путь к файлу со случайной последовательностью

Библиотека OpenSSL использует эти данные для инициализации датчика случайных чисел.

RNDoverwrite = yes | no(OpenSSL)
Перезаписывать файл со случайной последовательностью

По умолчанию: yes

service = servicename
Имя сервиса

On Unix: В inetd это имя для TCP Wrapper библиотеки.

On NT/2000/XP: Имя NT сервиса для контрольной панели.

По умолчанию: stunnel

setgid = groupname (Unix only)
Выплняется setgid() в эту группу.

setuid = username (Unix only)
Выполняется setuid() под этого пользователя

socket = a|l|r:option=value[:value]
Опции setsockopt() для сокета приема соединений, а так же для локального и удаленного сокетов.

Формат значений для 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 интерфейса

taskbar = yes | no (WIN32 only)
Разрешить иконку.

По умолчанию: yes

SERVICE-LEVEL OPTIONS

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

Примечание: Если вы хотите запускать stunnel в Inetd режиме, смотрите секцию Inetd MODE описанную ниже

accept = [host:]port
Принимать соединения только с host:port

Если host не указан, то для всех ip данного компьютера.

CApath = store(SSPI)
Хранилище доверенных корневых центров сертификации, используемое вместо ROOT.

Пример: My

CApath = directory(OpenSSL)
Каталог с сертификатами CA

Каталог в которой stunnel будет искать сертификаты CA при использовании verify. Сертификаты в этой дериктории должны называться как XXXXXXXX.0 где XXXXXXXX значение хеша Der кодированно сертификата. (первые 4 байта в MD5 хеше).

Если указан chroot то CApath указывается относительно него.

CAfile = certfile(OpenSSL)
Файл с сертификатом СА

Этот файл может сожержать множество сертификатов СА. Используется в verify.

cert = pemfile(OpenSSL)
Цепочка сертификатов PEM файл. Сертификаты должны быть в PEM формате и должны начинаться с сертификата верхнего в цепочке (корневого CA).

Сертификат stunnel обязателен для использования в качестве сервера. Указание этой опции в режиме клиента необходимо для удовлетворения требования TLS сервера на двустороннюю аутентификацию по сертификату клиента. Использование клиентского сертификата опционально.

cert = Cert-Id(SSPI)
Сертификат в der кодировке. Соответствующий сертификат в хранилище должен иметь ссылку на закрытый ключ.

ciphers = cipherlist
Список разрешенный SSL/TLS алгоритмов.

Пример: GOST34102001-WITH-GOST28147-OFB-GOST28147:DES-CBC3-SHA:IDEA-CBC-MD5

minkeysize = keysize (SSPI – only)
Минимальная длина ключа

client = yes | no
Режим клиента (удаленный сервис использует TLS/SSL)

По умолчанию: no (режим сервера)

connect = [host:]port
Соединять с удаленным сервером, если не указано то с localhost

CRLpath = directory(OpenSSL)
Каталог сожержащий CRL.

Примечание: Файлы в этой дериктории должны быть названы как XXXXXXXX.0 где XXXXXXXX значение хеша CRL.

Если указан chroot то CApath указывается относительно него.

CRLpath = Store(SSPI)
Хранилище CRL, используемое вместо хранилища по умолчанию.

Пример: My

CRLfile = certfile(OpenSSL)
CRL файл

Этот файл содержит множество CRL, используеммых в verify.

delay = yes | no
Задержка для DNS запроса для 'connect' опции

engineNum = engine number(OpenSSL)
Использовать для чтения закрытого ключа engine

Нумерация начинается с 1.

exec = executable_path (Unix only)
Запустить локально inetd программу

exec путь относителен chroot дериктории если она задана.

execargs = $0 $1 $2 ... (Unix only)
Аргументы для программы указанной в exec опции, включая ее имя-($0)

Кавычки не поддерживаются. Аргументы должны быть разделены пробелами.

ident = username(OpenSSL)
Использовать IDENT (RFC 1413) проверку имени

key = keyfile(OpenSSL)
Закрытый ключ для сертификата из cert опции

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

    chmod 600 keyfile

По умолчанию: значение cert опции

local = host
Интерфейс, который должен быть использован для соединения с удаленны хостом.

ocsp = url(OpenSSL)
OCSP сервер для проверки сертификатов

options = SSL_options(OpenSSL)
Опции для библиотеки OpenSSL

Параметры для OpenSSL описанные в SSL_CTX_set_options(3ssl) реководстве но без префискса SSL_OP_. Несколько options могут быть использованы для указания множества опций.

Например, для совместимости с Eudora SSL реализацией следущие опции должны быть установлены.

    options = DONT_INSERT_EMPTY_FRAGMENTS

protocol = proto
Протокол внутри SSL/TLS

Поддерживаемые: cifs, connect, nntp, pop3, smtp

protocolCredentials = username:password
пароль и имя пользователя для протокола proto

protocolHost = host:port
Удаленный сервер для внутренего протокола

pty = yes | no (Unix only)
Создать псевдо-терминал для 'exec' опции

session = timeout
Таймаут сессии

sslVersion = version(OpenSSL)
Версия SSL протокола

Допустимые опции: all, SSLv2, SSLv3, TLSv1

TIMEOUTbusy = seconds
таймаут для ожидания входящий данных

TIMEOUTclose = seconds(OpenSSL)
Таймаут для ожидания close_notify

TIMEOUTconnect = seconds
Таймаут для соединения с удаленным хостом

TIMEOUTidle = seconds
Таймаут для keep alive

transparent = yes | no (Unix only)
transparent proxy

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.

verify = level(SSPI)
Уровень проверки цепочки
    default – Проверка по умолчанию, если не заданы CRLpath или CRLfile, то использует доступ к CDP по http/ldap;
    level 3 - Проверять используя локально установленные сертификаты;
    level 2 - Проверять каждый сертификат;
    level 1 - Проверять каждый сертификат если есть;
    level 0 - Не проверять;
FIX ME!!!    НЕ ЗАКОНЧЕНА

verify = level(OpenSSL)
Уровень проверки
    level 1 - Проверять каждый сертификат если есть
    level 2 - Проверять каждый сертификат
    level 3 - Проверять используя локально установленные сертификаты
    default - Не проверять


RETURN VALUE

stunnel Возвращает нулевой код завершения при успешном выполнении, при ошибках возвращается не нулевой код возвращения.


EXAMPLES

Для реализации инкапсуляции 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


FILES

stunnel.conf
stunnel Конфигурационный файл

stunnel.pem
stunnel Сертификат и закрытый ключ


BUGS

Опция execargs не поддерживает кавычки.


RESTRICTIONS

stunnel нельзя использовать с FTP демоном из-за природы FTP протокола который использует множество портов для передачи данных.


NOTES

INETD MODE

Наиболее распространненый вариант использования 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 с примерами.

CERTIFICATES

Каждый \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]

RANDOMNESS

В stunnel нужен для инициализации PRNG (Датчик псевдо случайных чисел) для того что бы SSL использовал хорошие последовательности. Следующие источники будут использоваться (в указанном порядке) до тех пор пока не будет полученно соответствующие кол-во данных.

В последних версиях (>=OpenSSL 0.9.5a) при получении достаточной энтропии источники случайных данных будут закрыты автоматически. В предыдущих версиях OpenSSL не существует функций для определения достаточного количества данных.

Примечание: На Windows машинах нет консоли для интерактивного взаимодействия с пользователем (движение мыши, создание окон и т.д.) и содержание окна не достаточно, вам необходимо созадть файл с случайной последовательностью и указать его в опции RNDfile.

Файл указанный в опции RNDfile должен сожержать случайную последовательность это означает что он должен содержать разные данные при каждом запуске stunnel. Это будет делаться автоматически ло тех пор пока не будет указана опция RNDoverwrite. Если вы хотите обновлять его вручную, то openssl rand команда из последней версии OpenSSL будет весьма полезна.

Если /dev/urandom доступен, OpenSSL имеет привычку инициализировать PRNG данными из него да же кога проверяет случайное состояние, таким образом на системах с ним вероятнее всего вы используете его да же если он в самом низу списка указаного выше. Это не поведение stunnel's, это OpenSSL.


SEE ALSO

tcpd(8)
Управление доступом для интернет сервисов

inetd(8)
Интеренет 'super-server'

pam(8)
модель имепрсонализации

setsockopt(2)
Установка опций для сокета

chroot(2)
создание замкнутого окружения

http://stunnel.mirt.net/
домашня страница stunnel

http://www.stunnel.org/
Часто задаваемые вопросы по stunnel

http://www.openssl.org/
Домашняя страница проекта OpenSSL


AUTHOR

Michal Trojnara
<Michal.Trojnara@mirt.net>