openvpn & subjectAltName
Apr. 17th, 2017 03:46 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Задумался над идеей назначать клиентам OpenVPN ip-адреса по значению поля subjectAltName в их сертификатах.
RFC 5280 предусматривает тип поля IP в SubjectAltName, и OpenSSL его вполне поддерживает.
Идея хороша тем, что при подключении нового клиента не нужно вообще ничего делать на сервере. Удостоверяющий центр, выписывая клиенту сертификат (что все равно надо сделать) выделяет ему IP и DNS-имя и прописывает иъ в этот сертификат. А задача сервера - просто согласиться с тем что подписано удостоверяющим центром.
Правда, похоже просто так не получится. Что-то я не вижу там, чтобы client-connect скрипто получил доступ ко всему сертификату или хотя бы к subjectAltName.
Upd Благодаря
dzz родилось более простое решение:
Сейчас у меня в скрипте client-connect соответствие CN сертификата клиента и выданного ему IP записывается в динамическую зону DNS. Чтобы на того клиента логиниться по имени.
Так вот - сначала надо в DNS посмотреть, и если там это CN есть, то сказать openvpn-у "этому дай вот этот адрес". А вот уж если адреса такого в DNS нет - назначать первый свободный.
Это, конечно, не гарантирует от того что адрес будет переисиользован пока клиент будет в оффлайне. но все же.
RFC 5280 предусматривает тип поля IP в SubjectAltName, и OpenSSL его вполне поддерживает.
Идея хороша тем, что при подключении нового клиента не нужно вообще ничего делать на сервере. Удостоверяющий центр, выписывая клиенту сертификат (что все равно надо сделать) выделяет ему IP и DNS-имя и прописывает иъ в этот сертификат. А задача сервера - просто согласиться с тем что подписано удостоверяющим центром.
Правда, похоже просто так не получится. Что-то я не вижу там, чтобы client-connect скрипто получил доступ ко всему сертификату или хотя бы к subjectAltName.
Upd Благодаря
![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Сейчас у меня в скрипте client-connect соответствие CN сертификата клиента и выданного ему IP записывается в динамическую зону DNS. Чтобы на того клиента логиниться по имени.
Так вот - сначала надо в DNS посмотреть, и если там это CN есть, то сказать openvpn-у "этому дай вот этот адрес". А вот уж если адреса такого в DNS нет - назначать первый свободный.
Это, конечно, не гарантирует от того что адрес будет переисиользован пока клиент будет в оффлайне. но все же.
no subject
Date: 2017-04-17 01:31 pm (UTC)no subject
Date: 2017-04-17 01:34 pm (UTC)no subject
Date: 2017-04-17 01:49 pm (UTC)no subject
Date: 2017-04-17 02:15 pm (UTC)Сервером можно и через веб-панель порулить. А при необходимости синхронизировать библиотеку электронных книг между десктопом и смартфоном ничего удобнее rsync over ssh не придумано.
no subject
Date: 2017-04-17 02:21 pm (UTC)ssh - SSH-client :)
Я не имел в виду обязательно промышленные серверы.
no subject
Date: 2017-04-17 02:25 pm (UTC)Там, правда нет таких проверок аутентичнрости сервера как в ssh.
no subject
Date: 2017-04-17 02:28 pm (UTC)Таки да :)
no subject
Date: 2017-04-17 02:49 pm (UTC)На самом деле проблема в том, что openvpn-сервер отдает адреса из пула в порядке прихода клиентов. Это не dhcp, никакого leases-файла она не хранит.
Поэтому если вдруг два клиента отключились, а потом подключились в другом порядке. то все плохо.
no subject
Date: 2017-04-17 03:08 pm (UTC)Ну, я не знал твоей специфики. Теоретически, могут быть "медленно меняющиеся" адреса.
> отдает адреса из пула в порядке прихода клиентов
Может быть, проще доработать openvpn-сервер для раздачи lease-ов?
no subject
Date: 2017-04-17 03:15 pm (UTC)Кроме того, нужно подумать чем мы будем индексировать этот самый lease. DHCPD хорошо, у него mac-адреса есть. А что у нас является аналогом mac-адреса?
common-name сертификата/юзернейм при парольной аутентификации?
Тут придется придумывать решение, которое работает не только в моем случае.
В то время как у доработки "пропихнуть сертификат целиком не только в tls-verify, но и в client-connect скрипт есть куча других usecase, поэтому ее можно будет пытаться продавить в upstream. А уж что я тут с этим сертификатом делаю и как - личное дело моего скрипта.
Ну и само решение сильно проще - там уже есть необходимые функции. Просто их надо вызывать еще раз перед запуском другого скрипта.
no subject
Date: 2017-04-17 03:26 pm (UTC)Fingerprint открытого ключа? Ключ уникален для каждого устройства.
no subject
Date: 2017-04-17 03:43 pm (UTC)А если мы начинаем дописывать в core серьезную новую функциональность ее придется делать несоклько более универсальной, чем конкретно для нашего случая, а то хрен в апстрим пропихнешь.
Пытался я уже туда кое-чего пропихивать.
no subject
Date: 2017-04-17 04:44 pm (UTC)no subject
Date: 2017-04-17 01:48 pm (UTC)no subject
Date: 2017-04-17 02:08 pm (UTC)Тем более что в этой VPN если и найдется пара устройств на которых не работает sshd, то это недоработка, а не "так задумано".
no subject
Date: 2017-04-17 02:14 pm (UTC)Выделять каждому статик - довольно таки расточительно и чревато коллизиями.
no subject
Date: 2017-04-17 02:16 pm (UTC)no subject
Date: 2017-04-17 02:18 pm (UTC)А вот если пользователь раскопировал секретный ключ на два устройства вместо того чтобы обратиться в УЦ за вторым сертификатом, то такого пользователя нужно в CRL записывать.
no subject
Date: 2017-04-17 01:52 pm (UTC)Но у меня набор клиентов, кому надо было выдавать статические ip, был фиксированным, так что выдать каждому свой сертификат и написать/сгенерить конфиг проблемы не создавало.
no subject
Date: 2017-04-17 02:12 pm (UTC)Выдавать сертификат клиенту все равно надо (без него кто же его в vpn пустит).
Но при этом весь учет клиентов ведется на удостоверяющем центре, а не на сервере.
А сервер просто тупо доверяет удостоверяющему центру.
В принципе, похакать openvpn чтобы отдавала в client-connect больше информации о сертификате, а то и весь сертификат - несложно. Вопрос в том, стоит ли оно таких трудозатрат или проще для домена этой VPN отключить у ssh СheckHostIP.
no subject
Date: 2017-04-17 02:52 pm (UTC)no subject
Date: 2017-04-17 03:04 pm (UTC)no subject
Date: 2017-04-17 03:09 pm (UTC)no subject
Date: 2017-04-17 04:55 pm (UTC)А твой SubjectAltName из сертификата должэн быть в переменной X509_0_subjectAltName .
no subject
Date: 2017-04-17 06:43 pm (UTC)А во время client-connect этот файл уже удален.
А вот с помощью опции x509-track действительно можо заставить ее пихать в environment subjectAltName
no subject
Date: 2017-04-17 06:38 pm (UTC)Ssh умеет сертификаты. Если сделать свой ssh ca, то можно подписывать серверные ключи, а клиентам указать этой подписи верить.
Тогда ssh не ругается при смене IP адреса.
no subject
Date: 2017-04-17 06:53 pm (UTC)А вообще проблему использования сертификатов SSH у меня в журнале разбирали
три года назад.
Устраивающую меня систему отзыва (вернее систему распространения файла RevokedKeys) так тогда и не придумали.
Опять же, не всякий ssh-клиент и не всякий ssh-вервер умеет сертификаты. на телефоне у меня, например, какой-то довольно древний dropbear.
А openvpn свои сертификаты умеет одинаково, начиная с самых древних версий.
no subject
Date: 2017-04-17 09:45 pm (UTC)[root@linux openvpn]# grep pool-per server.conf
ifconfig-pool-persist /etc/openvpn/ipp.txt
[root@linux openvpn]# cat ipp.txt
client7,10.8.0.4
client10,10.8.0.8
client2,10.8.0.12
client4,10.8.0.16
client3,10.8.0.20
no subject
Date: 2017-04-18 04:02 am (UTC)Мануал на openvpn большой, в голове не удержишь. Тем более что менять там что-то приходится раз в пару лет.
no subject
Date: 2017-04-18 11:31 am (UTC)no subject
Date: 2017-05-03 07:28 pm (UTC)no subject
Date: 2017-05-04 02:33 am (UTC)