Содержание

Skip to end of metadata
Go to start of metadata

Введение


В статье будет описана авторизация в OpenVPN с помощью криптографического USB-токена Рутокен ЭЦП. Рутокен ЭЦП надежно защищен PIN-кодом от несанкционированного доступа и блокируется при исчерпании попыток ввода PIN-кода, поэтому злоумышленник не попадет в VPN даже в случае кражи токена. Кроме того, в Рутокен ЭЦП аппаратно реализованы алгоритмы ГОСТ и RSA, поэтому аутентификация производится «на борту» токена. Благодаря этому закрытый ключ никогда не покидает токен и его невозможно украсть из оперативной памяти компьютера с помощью троянов. 

В статье будет показано, как развернуть тестовый VPN, а также корпоративный УЦ на базе приложения XCA. С помощью УЦ будет создан ключ и сертификат сервера OpenVPN и произведена инициализация токена клиента. Затем настроим клиент OpenVPN таким образом, чтобы пользователь мог авторизоваться в OpenVPN с помощью Рутокен ЭЦП.

Установка и настройка  удостоверяющего центра на сервере


sudo apt-get install libccid libpcsclite1 pcscd xca


Для установки библиотеки librtpkcs11ecp.so следует перейти по указанной ссылке и скачать необходимую версию:


https://www.rutoken.ru/support/download/pkcs/

sudo dpkg -i librtpkcs11ecp_1.8.2.0-1_amd64.deb



Запустим XCA:

Создание новой базы данных

 Файл→ Новая база данных (Ctrl+N) и сохраняем ее в удобном для Вас месте


Создание ключа УЦ

Создадим ключ УЦ: Раздел "Закрытые ключи"→ "Новый ключ", назовем его CAkey, Keytype выбираем RSA, Keysize 2048 bit.



Создание сертификата УЦ

Создадим сертификат УЦ: раздел "Сертификаты" → "Новый сертификат" согласно нижеуказанным скриншотам:


Создание сертификата сервера OpenVPN



Создадим ключ сервера OpenVPN: раздел "Закрытые ключи" → "Новый ключ", назовем его Openvpnkey, Keytype - RSA, Keysize - 2048 bit.

Создадим сертификат сервера: раздел "Сертификаты"→  "Сертификаты" согласно представленным скриншотам.

Создание сертификата клиента на Рутокен ЭЦП


Подключение библиотеки pkcs#11

 Для работы с Рутокен ЭЦП, утилите XCA нужно указать библиотеку PKCS#11 АктивСофта.

 Для этого указываем путь к ней: Файл → Опции → PKCS#11 provider  → "Добавить" и указываем путь до библиотеки pkcs11(/opt/aktivco/rutokenecp/x86_64/librtpkcs11ecp.so)

Генерация ключей на Рутокен ЭЦП

Далее подключаем Рутокен ЭЦП и создаем ключ «на борту» Рутокен ЭЦП: раздел "Закрытые ключи" → "Новый ключ" → назовем его Clientkey, Keytype - RSA(!) на рутокене, Keysize - 2048 bit.

 По запросу вводим PIN-код.

Создание сертификата клиента

Когда XCA предложит сохранить сертфикат на токен, нажимаем «Да» и вводим PIN-код. 


OpenVPN


Пакет openvpn входит в дистрибутивы ОС ОН Орёл 2.12 и ОС СН Смоленск 1.6 , и устанавливается по умолчанию.

Для быстрой настройки можно рекомендовать дополнительно установить пакеты

  • для машины, предназначенной на роль сервера: 
    • графический инструмент fly-admin-openvpn-server
    • или инструмент командной строки astra-openvpn-server
  • для клиентской машины дополнительных пакетов не требуется

При установке пакетов fly-admin-openvpn-server и astra-openvpn-server автоматически будет установлен пакет libgost-astra, поддерживающий защитное преобразование информации в соответствии с алгоритмами ГОСТ.


Устанавливаем OpenVPN:

$ sudo apt-get install fly-admin-openvpn-server


Настройка


Создание DH (Diffie Hellman) ключа

Вы можете создать файл параметров Diffie Hellman (Диффи-Хелмана) с помощью openssl:

openssl dhparam -out dh2048.pem 2048

Вы можете заменить 2048 на другие цифры, например на 4096.

Если число выше, безопасность параметров будет выше, но вашему серверу или компьютеру потребуется больше времени для генерации двух простых чисел этой длины.

Более низкие номера имеют более низкую безопасность, но требуют значительно меньшего времени для создания


Создание конфигурационного файла 


Создаем конфигурационный файл сервера OpenVPN:

$ nano openvpn.conf


Cо следующими параметрами:

port 1194
proto tcp
dev tap

ca /home/u/openvpn/CA.crt
cert /home/u/openvpn/Openvpn.crt
key /home/u/openvpn/Openvpnkey.pem
dh /home/u/openvpn/dh2048.pem

server 10.0.0.0  255.255.255.0
ifconfig-pool-persist ipp.txt

keepalive 10 120

cipher BF-CBC
comp-lzo
persist-key
persist-tun
status openvpn-status.log
verb 3

Параметры конфигурационного файла

ПараметрЗначенияОписание
client
Строка говорит о том, что конфигурационный файл описывает клиентское подключение (программа сама устанавливает соединение, а не ждет, как сервер).
devtap или tunВыбор виртуального сетевого драйвера. TUN — сетевой уровень модели OSI, оперирует IP-пакетами. TAP — эмулирует Ethernet устройство и работает на канальном уровне модели OSI, оперируя кадрами Ethernet. Настраивая OpenVPN клиента, в большинстве случаев, необходимо выбирать tun. TAP необходимо использовать для работы определенных сервисов, например DHCP.
dev-nodeлюбая строкаПараметр используется в системах Windows в случаях, если имеется несколько сетевых интерфейсов. Значение этого параметра должно содержать название сетевого подключения, через который должен работать OpenVPN.
protoudp или tcpУказывает, какой протокол использовать для передачи данных. В большинстве случаев, лучше использовать UDP, так как данный протокол создает меньше нагрузки на сеть.
remoteVPN-сервер и портЗадает сервер, к которому должен подключаться клиент, а также сетевой порт, на котором OpenVPN принимает запросы. Можно указать несколько строк.
remote-random
Если указано несколько строк remote, данный параметр говорит, что необходимо подключаться к удаленным серверам в случайном порядке.
resolv-retryколичество секунд или infiniteИспользуется в тех случаях, когда в качестве сервера указано доменное имя. Параметр задает время в секундах для повторного переподключения, если не удалось узнать имя сервера. infinite — держать связь с сервером постоянно.
nobind
Клиент использует динамический порт для подключения.
userучетная записьЗадает определенного пользователя для работы клиента (только для UNIX-систем).
groupгруппаЗадает определенную группу для работы клиента (только для UNIX-систем).
persist-key
Не перечитывает ключи при перезагрузке сервиса OpenVPN.
persist-tun
Не перечитывает параметры туннеля при перезагрузке сервиса OpenVPN.
http-proxyсервер прокси и портИспользовать прокси-сервер для подключения.
http-proxy-retry
Переподключаться к прокси-серверу, если связь была разорвана.
http-proxy-timeoutколичество секундВремя, через которое выполнять попытки переподключения к прокси-серверу.
mute-replay-warnings
Параметр стоит задавать при использовании беспроводного соединения. Он отключит дублирование предупреждений пакетов.
caпут к сертификатуКорневой сертификат удостоверяющего центра. Генерируем на сервере.
certпут к сертификатуОткрытый ключ клиента. Генерируем на сервере.
keyпут к сертификатуЗакрытый ключ клиента. Генерируем на сервере.
dhпут к сертификатуКлюч с алгоритмом Diffie-Hellman (Диффи-Хеллмана).
remote-cert-tlsсерверИсключает возможность mitm атаки, включая верификацию сертификата сервера.
tls-client
Указание на то, что это клиент TLS.
tls-authta.key 1Дополнительный уровень аутентификации посредством ключа TLS.
float
Удаленный хост может менять IP-адрес в процессе соединения, при этом последнее не будет разорвано.
keepaliveсекунд1 секунд2Пинговать каждые секунд1 сервер и если в течение секунд2 не будут получены ответные пакеты, перезапустить подключение.
cipherалгоритмУказывает алгоритм шифрования. Примеры: AES-256-CBC, AES-128-CBC, BF-CBC, DES-EDE3-CBC.
comp-lzo
Использовать сжатие.
verbчисло от 0 до 9Уровень детализации лога. 0 отключает отладочную информацию.
muteчислоУказывает сколько лог-сообщений может отображаться для каждой категории события.
auth-user-passничего или путь к файлуГоворит клиенту, что необходима аутентификация. Если не указан путь к файлу, клиент выкинет окно для авторизации, иначе прочитает данные из файла.
ipchangeкоманда или путь к скриптуВыполняет команду при смене IP.
connect-retryсекундПереподключиться к серверу через указанное количество секунд, если соединение было разорвано.
connect-retry-maxчислоСколько раз повторять соединение, если оно было разорвано.
shaperбайтЗадает максимальную скорость передачи данных для исходящего трафика.
tun-mtuчислоЗадает MTU.
statusпуть к файлуПуть к фалу хранения статуса.
logпуть к файлуПуть к лог-файлу.

Наиболее полный и актуальный список параметров для OpenVPN можно получить командой openvpn --help


Запуск OpenVPN

Запускаем сервер OpenVPN

$ sudo openvpn --config /home/u/openvpn/openvpn.conf

В "боевой" конфигурации сервер следует запускать как демон и ключи/сертификаты не должны лежать в /home

Настройка клиентской машины


Установка компонентов для работы с  Рутокен ЭЦП


На клиентской машине устанавливаем пакеты, необходимые для работы Рутокен ЭЦП:

$ sudo apt-get install pcscd libpcsclite1 libccid


и библиотеку librtpkcs11ecp.so

sudo dpkg -i librtpkcs11ecp_1.8.2.0-1_amd64.deb



Установка OpenVPN на клиенте

 Устанавливаем OpenVPN:

$ sudo apt-get install openvpn

Копируем с сервера сертификат Удостоверяющего Центра (УЦ) к примеру в раздел /home/client/openvpn/CA.crt

Создаем конфигурационный файл клиента

$ nano openvpnclient.conf

Cо следующими параметрами:

client
dev tap
proto tcp
remote 192.168.xxx.xxx 1194
resolv-retry infinite
nobind
persist-key
persist-tun

ca /home/client/openvpn/CA.crt
pkcs11-providers /usr/lib/librtpkcs11ecp.so
pkcs11-id 'Aktiv\x20Co\x2E/Rutoken\x20ECP/2f996caf/Rutoken\x20ECP\x20\x3Cno\x20label\x3E/3C9F594E0994420E'

pkcs11-pin-cache 300

comp-lzo
verb 3

В параметре remote указываем ip-адрес VPN-сервера

В параметре pkcs11-providers указываем путь к библиотеке PKCS#11 Рутокен.

В параметре pkcs11-id указываем ID контейнера, в котором на Рутокен ЭЦП хранятся ключ и сертификат. Узнать этот ID можно с помощью команды:

sudo openvpn --show-pkcs11-ids /usr/lib/librtpkcs11ecp.so




Подключение к VPN-серверу

Подключаемся к VPN-серверу:

sudo openvpn --config /home/client/openvpnclient.conf


По запросу следует ввести PIN-код к Рутокену ЭЦП.