Параметры стенда
ip сервера=10.0.2.15
OS сервера = Ubuntu
Порт сервиса=22
Порт Туннеля=443
Туннелированный сервис = SSH
OS клиента = Ubuntu
За основу настройки сервера и клиента была взята эта статья. Для настройки клиента с аутентфикацией по ГОСТу можно можно воспользоваться данной статьей
Настройка сервера
Выполним первичную настройку сервера:
# Настраиваем firewall для приема соединений на 443 порту sudo ufw allow 443/tcp sudo ufw allow 22/tcp sudo ufw enable # Устанавливаем необходимые пакеты sudo apt-get update sudo apt-get upgrade sudo apt-get install stunnel4 openssl opensc libengine-pkcs11-openssl1.1 # В нашем случае дополнительно нужно будет поставить сервис ssh sudo apt-get install ssh # И запустить его (перед этим можете настроить его любым способом) sudo systemctl start ssh # Установим библиотеку pkcs11 wget https://download.rutoken.ru/Rutoken/PKCS11Lib/Current/Linux/x64/librtpkcs11ecp_2.0.5.1-1_amd64.deb sudo dpkg -i librtpkcs11ecp_2.0.5.1-1_amd64.deb # Создадим папку для хранения сертификатов sudo mkdir /var/lib/stunnel4/certs
Создадим файл /etc/stunnel/stunnel.conf с конфигурацией stunnel
; ************************************************************************** ; * Global options * ; ************************************************************************** ; Установим уровень отладочных сообщений debug = 7 ; Лог-файл output = /var/lib/stunnel4/stunnel.log ; Не использовать syslog syslog = no ; ************************************************************************** ; * Service defaults may also be specified in individual service sections * ; ************************************************************************** ; Сертификат/ключ сервера cert = /etc/stunnel/servercert.pem key = /etc/stunnel/serverkey.pem ; Проверка сертификата. 0 - не проверять, 1 - проверять при наличии, 2 - проверять всегда, ... verify = 2 ; Каталог для разрешенных сертификатов. ; Находится в окружении. Для каждого сертификата должна быть хеш-ссылка CApath = /var/lib/stunnel4/certs ; Не использовать SSLv2 options = NO_SSLv2 ; ************************************************************************** ; * Service definitions (remove all services for inetd mode) * ; ************************************************************************** [ssh] ; Принимать соединения на интерфейс:порт или просто порт. Например accept = 192.168.0.1:443 accept = 443 ; Отдавать приложению на интерфейс:порт или просто порт. Например connect = 127.0.0.1:22 connect = 22
Создадим необходимый набор ключевых пар и сертификатов для УЦ, сервера и клиента.
Упрощенное создание ключа и сертификата на токене
Для упрощения процесса создания ключей и заявок на сертификат на токене, а также их импорт на него можно воспользоваться утилитой по работе с токеном.
# Генерация сертификата и ключа УЦ sudo openssl req -nodes -new -days 365 -newkey rsa:2048 -x509 -keyout cakey.pem -out cacert.pem # Генерация ключевой пары сервера sudo openssl genrsa -out serverkey.pem 2048 # Генерация заявки на сертификат сервера sudo openssl req -new -out server.req -key serverkey.pem # Создание сертификата сервера sudo openssl x509 -req -in server.req -CAkey cakey.pem -CA cacert.pem -out servercert.pem -CAcreateserial # Генерация ключевой пары клиента pkcs11-tool --module /usr/lib/librtpkcs11ecp.so --keypairgen --key-type rsa:2048 -l --id 454647 # Генерация заявки на сертификат клиента openssl OpenSSL> engine dynamic -pre SO_PATH:/usr/lib/x86_64-linux-gnu/engines-1.1/pkcs11.so -pre ID:pkcs11 -pre LIST_ADD:1 -pre LOAD -pre MODULE_PATH:librtpkcs11ecp.so ... OpenSSL> req -engine pkcs11 -new -key "pkcs11:id=%45%46%47" -keyform engine -out client.req -subj "/C=RU/ST=Moscow/L=Moscow/O=Aktiv/OU=dev/CN=testuser/emailAddress=testuser@mail.com" # Создание сертификата клиента sudo openssl x509 -req -in client.req -CAkey cakey.pem -CA cacert.pem -out clientcert.pem -CAcreateserial # Импорт сертификата на токен pkcs11-tool --module /usr/lib/librtpkcs11ecp.so -l -y cert -w ./clientcert.pem --id 454647 sudo mv serverkey.pem /etc/stunnel/ sudo mv servercert.pem /etc/stunnel/ sudo mv clientcert.pem /var/lib/stunnel4/certs sudo mv cacert.pem /var/lib/stunnel4/certs cd /var/lib/stunnel4/certs # функция получения хеша по содержимому файла function get_hash() { local file=$1 openssl x509 -noout -hash -in "$file" } # создадим ссылки на сертификаты в нужном формате sudo ln -s cacert.pem "`get_hash cacert.pem`.0" sudo ln -s clientcert.pem "`get_hash clientcert.pem`.0" # запустим сервер stunnel sudo systemctl restart stunnel4
Настройка Stunnel на клиенте
Произведем первичную настройку на стороне клиента.
# Установим необходимые пакеты sudo apt-get update sudo apt-get upgrade sudo apt-get install stunnel4 openssl opensc libengine-pkcs11-openssl1.1 # Установим библиотеку pkcs11 wget https://download.rutoken.ru/Rutoken/PKCS11Lib/Current/Linux/x64/librtpkcs11ecp_2.0.5.1-1_amd64.deb sudo dpkg -i librtpkcs11ecp_2.0.5.1-1_amd64.deb cp cacert.pem /etc/stunnel/cacert.pem
Узнаем где находится директория с файлом конфигурации openssl.
openssl version -d
В данный конфигурационный файл /path/to/openssl.cnf добавим следующие строчки:
# В начале напишем: openssl_conf = openssl_def ... # В конце файла: # OpenSSL default section [openssl_def] engines = engine_section [engine_section] pkcs11 = pkcs11_section [pkcs11_section] engine_id = pkcs11 dynamic_path = /usr/lib/x86_64-linux-gnu/engines-1.1/pkcs11.so # путь до данной библиотеки может отличаться в разных ОС MODULE_PATH = /usr/lib/librtpkcs11ecp.so # путь до данной библиотеки может отличаться в разных ОС default_algorithms = CIPHERS, DIGEST, PKEY, RAND
Сконфигурируем клиент stunnel через файл /etc/stunnel/stunnel.conf:
; уровень логирования и путь до лог-файла debug = 7 output = /var/lib/stunnel4/stunnel.log ; устанавливаем протокол защиты TLSv1.2 sslVersion=TLSv1.2 ; подгружаем движок engine=pkcs11 ; настраиваем туннель на клиенте [ssh] ; указываем engine, необходимый для подгрузки ключей engineId=pkcs11 ; устанавливаем верификацию 2 (принудительную проверку сертификата) verify = 2 ; путь до корневого сертификата CAFile = /etc/stunnel/cacert.pem ; путь до сертификата клиента cert=pkcs11:id=%45%46%47 ; путь до ключа на токене. key=pkcs11:id=%45%46%47 options = NO_SSLv2 client = yes accept = 127.0.0.1:22 connect = 10.0.2.15:443
Попробуем создать соединение и подключиться по ssh:
sudo stunnel ssh user@127.0.0.1
Если соединение установлено успешно, то мы получим следующий вывод:
Если соединение не будет установлено, то можно посмотреть логи /var/lib/stunnel4/stunnel.log.