Установка OpenVPN сервера с LDAP аутентификацией

Я уже рассказывал о том, как выполняется установка OpenVPN сервера. Но там я использовал подключение на основе сертификатов и NAT, т.е. все клиенты “выпрыгивали” из под IP-адреса сервера. В этой публикации я покажу, как выполняется Установка OpenVPN сервера с LDAP аутентификацией и полноценной маршрутизацией.

Общая схема решения приведена ниже:

Есть серверная подсеть – 10.10.10.0/24. В этой подсети будут находится сервер OpenVPN и контроллер домена Active Directory. Сервер OpenVPN будет аутентифицировать клиентов через LDAP, обращаясь к контроллеру домена. На маршрутизаторы будет проброшен порт UDP/1194 на сервер с OpenVPN, а также будут настроены необходимые правила маршрутизации, но об этом ниже.

Настройка сервера

Сначала выполним настройку сервера OpenVPN. В качестве платформы я буду использовать Ubuntu Server 22.04.

Приступим:

1. Сначала установки OpenVPN сервер и Easy RSA для подготовки сертификатов:

sudo apt install -y openvpn easy-rsa

2. Теперь подготовим директорию для хранения необходимых сертификатов и сопутствующих файлов инфраструктуры PKI:

suod mkdir /etc/openvpn/easy-rsa
cd /etc/openvpn/easy-rsa
sudo cp -r /usr/share/easy-rsa/* .

3. Подготовим файл с переменными окружения для выпуска сертификата:

sudo nano ./vars

Содержимое файла:

export KEY_COUNTRY="RU"
export KEY_PROVINCE="Altay Kray"
export KEY_CITY="Biysk"
export KEY_ORG="itproblog.ru"
export KEY_EMAIL="roman@itproblog.ru"
export KEY_CN=IT
export KEY_OU=IT
export KEY_NAME=vpn.itproblog.ru
export KEY_ALTNAMES="vpn"

Сохраните внесенные изменения.

4. Очистим предыдущую конфигурацию PKI:

sudo ./easyrsa clean-all

5. Подготовим сертификат для локального центра сертификации – в процессе выпуска сертификата укажите парольную фразу:

sudo ./easyrsa build-ca

6. Теперь нужно выпустить сертификат для сервера:

sudo ./easyrsa build-server-full vpn.itproblog.ru nopass 

7. Сгенерируем ключ Диффи-Хеллмана:

sudo ./easyrsa gen-dh

8. Сгенерируем статический ключ:

sudo openvpn --genkey secret pki/ta.key

9. Создадим директорию для хранения всех сгенерированных ключей и сертификатов, а также скопируем все ключи и сертификаты в эту директорию:

sudo mkdir /etc/openvpn/server/keys/
sudo cp pki/ca.crt pki/dh.pem pki/ta.key pki/issued/vpn.itproblog.ru.crt pki/private/vpn.itproblog.ru.key /etc/openvpn/server/keys/

10. Теперь необходимо отредактировать конфигурационный файл сервера OpenVPN:

sudo nano /etc/openvpn/server/server.conf

Пример моего конфигцрационного файла ниже.

Далее я прокомментирую основные ключевые моменты этого конфигурационного файла.

ПараметрЗначение
local 10.10.10.82Указывает IP-адрес, на котором сервер OpenVPN будет прослушивать клиентские подключения
port 1194Указывает порт, по которому будет работать сервер OpenVPN
proto udpУказывает протокол, по которому будет работать сервер OpenVPN
ca keys/ca.crtПуть до сертификата корневого центра сертификации (мы генерировали его ранее)
cert keys/vpn.itproblog.ru.crtПуть до файла с открытам ключом сервера (мы генерировали его ранее)
key keys/vpn.itproblog.ru.keyПуть до файла с закрытым ключом сервера (мы генерировали его ранее)
dh keys/dh.pemПуть до файла с ключом Диффи-Хеллмана (мы генерировали его ранее)
server 10.10.20.0 255.255.255.0Указывает подсеть, которая будут использоваться для клиентов OpenVPN
push “route 10.10.10.0 255.255.255.0”Маршрут, который будет добавляться в таблицу маршрутизации на ПК, который будет подключаться к серверу OpenVPN
push “redirect-gateway def1 bypass-dhcp”[Опционально] Включает или отключает маршрут по умолчанию для клиента OpenVPN
push “dhcp-option DNS 10.10.10.52”
push “dhcp-option DOMAIN itproblog.ru”
Устанавливает адрес сервера DNS и домен для поиска имен
tls-auth keys/ta.key 0Указываем путь до статического ключа (генерировали его ранее)
user nobody
group nogroup
Необходимо указать этого пользователя и группу для работы аутентификации через LDAP

11. Теперь попробуем включить автоматический запуск сервиса сервера OpenVPN и запустим его:

sudo systemctl -f enable openvpn-server@server.service
sudo systemctl -f start openvpn-server@server.service

12. Посмотрим статус службы сервера OpenVPN:

sudo systemctl -f status openvpn-server@server.service

13. Если служба по каким-то причинам не запустилась успешно, то вы можете посмотреть журналы вот такой командой:

sudo journalctl -ru openvpn-server@server.service

Настройка LDAP аутентификации

Теперь мне нужен сервер с Microsoft Active Directory. В AD я создам отдельную группу и выполню настройку LDAP аутентификации на сервере OpenVPN таким образом, что только пользователям из этой группы будет разрешено выполнить подключение к серверу.

Для настройки мне нужно будет знать distinguishedName этой группы. Запишу его:

CN=VPNAccess,OU=Groups,OU=IT,DC=itproblog,DC=ru

Подключение к серверу OpenVPN будет разрешено только явным членам группы VPNAccess. Вложенные группы работать не будут.

Также я создам отдельную учетную запись в AD, которая будет использоваться сервером OpenVPN для подключения к AD.

Теперь выполним настройку LDAP аутентификации:

1. Установим модуль аутентификации для LDAP:

sudo apt install -y openvpn-auth-ldap

2. И создадим файл конфигурации модуля аутентификации LDAP:

mkdir /etc/openvpn/ldap/
nano /etc/openvpn/ldap/auth.conf

3. Укажем в конфигурационном файле пользователя, от имени которого нужно подключаться к AD и параметры проверки LDAP.

<LDAP>
    # LDAP server URL
    URL       ldap://10.10.10.52
    # Bind DN (If your LDAP server doesn't support anonymous binds)
    BindDN   "CN=openvpnsvc,OU=OpenVPN,OU=Services,OU=IT,DC=itproblog,DC=ru"
    # Bind Password
    Password  Qwerty123
    # Network timeout (in seconds)
    Timeout   15
    # Enable Start TLS
    TLSEnable no
    # Follow LDAP Referrals (anonymously)
    FollowReferrals no
</LDAP>
<Authorization>
    # Base DN
    BaseDN        "DC=itproblog,DC=ru"
    # User Search Filter
    SearchFilter  "(&(sAMAccountName=%u)(memberOf=CN=VPNAccess,OU=Groups,OU=IT,DC=itproblog,DC=ru))"
    # Require Group Membership
    RequireGroup  false
</Authorization>

Если вы не хотите настраивать ограничения для определенной группы, то можете использовать вот это значение для параметра SearchFilter – “(&(sAMAccountName=%u))”

4. Теперь необходимо отредактировать конфигурационный файл сервера OpenVPN:

nano /etc/openvpn/server/server.conf

Добавим туда два параметра.

ПараметрЗначение
plugin /usr/lib/openvpn/openvpn-auth-ldap.so /etc/openvpn/ldap/auth.confПуть до конфигурационного файла с настройками параметров аутентификации по LDAP
verify-client-cert noneСертификаты с стороны клиента не нужны, т.к. мы будем использовать LDAP аутентификацию

Использование опции verify-client-cert none уменьшает обшую безопасность сервера OpenVPN, но упрощает конфигурацию клиентов, т.к. вам не нужно генерировать сертификаты клиента. И здесь решать вам – какой баланс между безопасностью и удобством управления/администрирования вы изберете.

5. Перезапустим сервер OpenVPN и проверим его статус:

sudo systemctl -f restart openvpn-server@server.service
sudo systemctl -f status openvpn-server@server.service

Настройка маршрутизации

Теперь настала пора заняться маршрутизацией. Вообще настройка маршрутизации очень сильно зависит от вашей инфраструктуры. Есть шаги, которые общие для всей инфраструктуры. Например, включение возможности пересылки пакетов на сервере OpenVPN. Есть шаги специфичные для каждой инфраструктуры – публикация сервера OpenVPN во внешний мир, настройка маршрутов на сетевом оборудовании и правила натирования подсети клиентов OpenVPN во внешний мир.

Общий шаг

Я начну с общих шагов – которые будут идентичны для всех. Точнее – этот шаг один – нужно включить возможность работы нашего сервера OpenVPN в качестве маршрутизатора. Отредактируем файл sysctl.conf:

sudo nano /etc/sysctl.conf

Раскомментируем следующую строку:

net.ipv4.ip_forward=1

Сохраните изменения и перезагрузите сервер.

Шаги, зависящие от инфраструктуры

Сначала я просто перечислю перечень тех шагов, которые необходимо выполнить:

1. Публикация сервер OpenVPN во внешний мир.

2. Настроить маршруты на всем сетевом оборудовании, чтобы все оборудование было в курсе – как добраться до подсети клиентов OpenVPN.

3. Настройка возможности выхода клиентов OpenVPN во внешний мир. В моей инфраструктуре для этого будет достаточно настроить дополнительное правило nat.

Приступим:

1. Для публикации сервера OpenVPN во внешний мир я буду использовать простой проброс порта на маршрутизаторе. Маршрутизатор в моем случае Mikrotik, соответственно правило выглядит следующим образом:

/ip firewall nat add chain=dstnat dst-port=1194 action=dst-nat protocol=udp to-address=10.10.10.82 to-port=1194 in-interface=WAN

2. Теперь необходимо выполнить настройку маршрутов. В моей небольшой инфраструктуре всего один маршрутизатор. Следовательно, мне нужно добавить маршрут для подсети клиентов OpenVPN только на одном маршрутизаторе:

/ip route add dst-address=10.10.20.0/24 gateway=10.10.10.82

В качестве адреса назначения в моем случае необходимо указать подсеть клиентов OpenVPN, а в качестве адреса шлюза – IP-адрес сервера OpenVPN.

3. (Опционально) Этот шаг необходимо выполнить, если вы планируете использовать VPN подключение в качестве шлюза по умолчанию. Необходимо настроить правило маскарадинга, чтобы хосты из подсети клиентов OpenVPN могли получать доступ во внешний мир.

/ip firewall nat add chain=srcnat src-address=10.10.20.0/24 action=masquerade out-interface=WAN

На этом настройка маршрутизации завершена и можно переходить к настройке конфигурации клиента.

Подготовка файла для клиента OpenVPN

Теперь необходимо подготовить конфигурационный файл для клиента OpenVPN.

Большая часть конфигурации клиента статическая:

client
resolv-retry infinite
nobind
remote vpn.itproblog.ru 1194
proto udp
dev tun
auth-user-pass
tls-client
block-outside-dns
float
key-direction 1
keepalive 10 120
persist-key
persist-tun
verb 3

Лишь директива remote vpn.itproblog.ru 1194 указывет имя сервера и порт для подключения – вам нужно будет поменять на ваше имя (или IP-адрес).

Затем в файл нужно добавить статический ключ сервера OpenVPN:

cat /etc/openvpn/server/keys/ta.key
#
# 2048 bit OpenVPN static key
#
-----BEGIN OpenVPN Static key V1-----
e25942a17d3e7af420c34f8ad47e91c7
3fdd2feaa9e93852f02e206f34d8220c
457c13b9534e1bb3cda4f4ce61aa5e8c
09ac6cbacd15e79caca9c62a93a4dbc3
61f958fd65235433a51de368d1f7ec77
567801374b3634c633841318c000bd33
fb4387c84dfb0114daf90a5ba56d06e6
be8b26c01e127fc3b6bb7ee83f9a089c
9565a2c769cf802601db11e1969d6187
4c5072ba49aad284ada924a5441618e1
f064d4797dbdcbdfac5372e54ae41a56
c9f294edc98f2dc39ec4f141692188b4
7ea256b2bbd341cfe0aaa0cd8f749f8d
0a563bccb4ae27de04c21d2548189c95
506ad2ebef9459b040c268814328a12e
e80f4e15d56a9c35d108836e1d657ec2
-----END OpenVPN Static key V1-----

Последним шагом необходимо выполнить добавление информации о сертификате центра сертификации, который мы с вами настроили через Easy RSA:

cat /etc/openvpn/server/keys/ca.crt
-----BEGIN CERTIFICATE-----
MIIDSzCCAjOgAwIBAgIUaaxHh2OyWTFTC0gDjjnGHKkKdq4wDQYJKoZIhvcNAQEL
BQAwFjEUMBIGA1UEAwwLRWFzeS1SU0EgQ0EwHhcNMjMwNzI4MTYzNzE0WhcNMzMw
NzI1MTYzNzE0WjAWMRQwEgYDVQQDDAtFYXN5LVJTQSBDQTCCASIwDQYJKoZIhvcN
AQEBBQADggEPADCCAQoCggEBAO8dMFgYOUe/Wp5BZIn/MckLjACnprnGOb4Y/Ean
EcrEBFMT7nOcQ2a3XJtIbGChso+ynwnVHDipwZmefYjVPoESrUg9+Jc0xRVvaq+e
nbcoN9oXMJOMr3BSGdS4EXklcP13toMd3FgkEQeuW99tx8n8I5S0o8pouHfJRHXf
5fDdXkIlr8hZdNLU1H1IjWIH/rRcHx8AiTzuK8wrfhV5YPbD4lG23t3blVzCUJII
ivjfgaKArMv8CmylpO/ZapmI00wl1fsBug3vRdUYt4FZBJ2JX7k3iCP+eEV1BQWg
vXlXHzQDNAl4KWvDR/s/vEe0/1DOuSom5AKukUm1BX5/vUUCAwEAAaOBkDCBjTAd
BgNVHQ4EFgQUj2m7QYJSFrYitUr1ZmRZaUlfblQwUQYDVR0jBEowSIAUj2m7QYJS
FrYitUr1ZmRZaUlfblShGqQYMBYxFDASBgNVBAMMC0Vhc3ktUlNBIENBghRprEeH
Y7JZMVMLSAOOOcYcqQp2rjAMBgNVHRMEBTADAQH/MAsGA1UdDwQEAwIBBjANBgkq
hkiG9w0BAQsFAAOCAQEAP3hoDvH81N5c0OAxWjtWtTAxl3tf6xrZ82ImoKT7yre3
bETwvDklDmB0PDpo7Rd2PKHqc2Ye3EA5wtisxqdvifOdKQgifdb8wYOMGo5Aia03
OcVyLGc2LNq4QH8u7OKdkfwCuS4QO59npFvYjnIbKWqVHck7b15e+X1aV4vjwZLD
7rExp9pT4ua+MMw+xRrdZofJX/3MEBLDKKDyyXJEZmATaj+l87aHKcXsKqpPcxei
fV5Qwq4n1oytS3GNulBBn30ilQQp8Iy1U/PEAT0AAh0lo6OhQULVqlHWUHckeLIg
Uot4lznoVmhepJFfFKqdGHd7MCQNm2fluvBopd8rWQ==
-----END CERTIFICATE-----

Итоговый файл я приложу ниже.

Итого для моего случая получился следующий конфигурационный файл:

client
resolv-retry infinite
nobind
remote vpn.itproblog.ru 1194
proto udp
dev tun
auth-user-pass
tls-client
block-outside-dns
float
key-direction 1
keepalive 10 120
persist-key
persist-tun
verb 3
<tls-auth>
#
# 2048 bit OpenVPN static key
#
-----BEGIN OpenVPN Static key V1-----
e25942a17d3e7af420c34f8ad47e91c7
3fdd2feaa9e93852f02e206f34d8220c
457c13b9534e1bb3cda4f4ce61aa5e8c
09ac6cbacd15e79caca9c62a93a4dbc3
61f958fd65235433a51de368d1f7ec77
567801374b3634c633841318c000bd33
fb4387c84dfb0114daf90a5ba56d06e6
be8b26c01e127fc3b6bb7ee83f9a089c
9565a2c769cf802601db11e1969d6187
4c5072ba49aad284ada924a5441618e1
f064d4797dbdcbdfac5372e54ae41a56
c9f294edc98f2dc39ec4f141692188b4
7ea256b2bbd341cfe0aaa0cd8f749f8d
0a563bccb4ae27de04c21d2548189c95
506ad2ebef9459b040c268814328a12e
e80f4e15d56a9c35d108836e1d657ec2
-----END OpenVPN Static key V1-----
</tls-auth>
<ca>
-----BEGIN CERTIFICATE-----
MIIDSzCCAjOgAwIBAgIUaaxHh2OyWTFTC0gDjjnGHKkKdq4wDQYJKoZIhvcNAQEL
BQAwFjEUMBIGA1UEAwwLRWFzeS1SU0EgQ0EwHhcNMjMwNzI4MTYzNzE0WhcNMzMw
NzI1MTYzNzE0WjAWMRQwEgYDVQQDDAtFYXN5LVJTQSBDQTCCASIwDQYJKoZIhvcN
AQEBBQADggEPADCCAQoCggEBAO8dMFgYOUe/Wp5BZIn/MckLjACnprnGOb4Y/Ean
EcrEBFMT7nOcQ2a3XJtIbGChso+ynwnVHDipwZmefYjVPoESrUg9+Jc0xRVvaq+e
nbcoN9oXMJOMr3BSGdS4EXklcP13toMd3FgkEQeuW99tx8n8I5S0o8pouHfJRHXf
5fDdXkIlr8hZdNLU1H1IjWIH/rRcHx8AiTzuK8wrfhV5YPbD4lG23t3blVzCUJII
ivjfgaKArMv8CmylpO/ZapmI00wl1fsBug3vRdUYt4FZBJ2JX7k3iCP+eEV1BQWg
vXlXHzQDNAl4KWvDR/s/vEe0/1DOuSom5AKukUm1BX5/vUUCAwEAAaOBkDCBjTAd
BgNVHQ4EFgQUj2m7QYJSFrYitUr1ZmRZaUlfblQwUQYDVR0jBEowSIAUj2m7QYJS
FrYitUr1ZmRZaUlfblShGqQYMBYxFDASBgNVBAMMC0Vhc3ktUlNBIENBghRprEeH
Y7JZMVMLSAOOOcYcqQp2rjAMBgNVHRMEBTADAQH/MAsGA1UdDwQEAwIBBjANBgkq
hkiG9w0BAQsFAAOCAQEAP3hoDvH81N5c0OAxWjtWtTAxl3tf6xrZ82ImoKT7yre3
bETwvDklDmB0PDpo7Rd2PKHqc2Ye3EA5wtisxqdvifOdKQgifdb8wYOMGo5Aia03
OcVyLGc2LNq4QH8u7OKdkfwCuS4QO59npFvYjnIbKWqVHck7b15e+X1aV4vjwZLD
7rExp9pT4ua+MMw+xRrdZofJX/3MEBLDKKDyyXJEZmATaj+l87aHKcXsKqpPcxei
fV5Qwq4n1oytS3GNulBBn30ilQQp8Iy1U/PEAT0AAh0lo6OhQULVqlHWUHckeLIg
Uot4lznoVmhepJFfFKqdGHd7MCQNm2fluvBopd8rWQ==
-----END CERTIFICATE-----

</ca>

Тестирование подключения

Самый последний (и обычно самый волнительный) шаг – это проверка работы готового решения.

Я для проверки буду использовать коммунити редакцию для клиента OpenVPN.

Для ОС Windows файл с конфигурацией необходимо скопировать вот в эту директорию:

C:\Program Files\OpenVPN\config

При попытке подключения клиент OpenVPN должен запросить у вас учетные данные:

Обратите внимание на то, что имя пользователя необходимо указывать без указания домена.

В случае успешного подключения вы должны увидеть примерно вот такой статус подключения:

Также обратите внимание на то, что DNS сервер, который мы указали в параметрах подключения будет использоваться в качестве DNS-сервера по умолчанию:

Установка OpenVPN сервера с LDAP аутентификацией завершена и, надеюсь, что эта статья будет вам полезна.

Установка OpenVPN сервера с LDAP аутентификацией: 2 комментария

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *