vitus_wagner (
vitus_wagner) wrote2017-04-17 03:46 pm
![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Entry tags:
openvpn & subjectAltName
Задумался над идеей назначать клиентам 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
На самом деле проблема в том, что openvpn-сервер отдает адреса из пула в порядке прихода клиентов. Это не dhcp, никакого leases-файла она не хранит.
Поэтому если вдруг два клиента отключились, а потом подключились в другом порядке. то все плохо.
no subject
Ну, я не знал твоей специфики. Теоретически, могут быть "медленно меняющиеся" адреса.
> отдает адреса из пула в порядке прихода клиентов
Может быть, проще доработать openvpn-сервер для раздачи lease-ов?
no subject
Кроме того, нужно подумать чем мы будем индексировать этот самый lease. DHCPD хорошо, у него mac-адреса есть. А что у нас является аналогом mac-адреса?
common-name сертификата/юзернейм при парольной аутентификации?
Тут придется придумывать решение, которое работает не только в моем случае.
В то время как у доработки "пропихнуть сертификат целиком не только в tls-verify, но и в client-connect скрипт есть куча других usecase, поэтому ее можно будет пытаться продавить в upstream. А уж что я тут с этим сертификатом делаю и как - личное дело моего скрипта.
Ну и само решение сильно проще - там уже есть необходимые функции. Просто их надо вызывать еще раз перед запуском другого скрипта.
no subject
Fingerprint открытого ключа? Ключ уникален для каждого устройства.
no subject
А если мы начинаем дописывать в core серьезную новую функциональность ее придется делать несоклько более универсальной, чем конкретно для нашего случая, а то хрен в апстрим пропихнешь.
Пытался я уже туда кое-чего пропихивать.
no subject