Сетевая схема:

Оглавление
- Предварительные требования
- Настройка на стороне Indeed AM NPS RADIUS Extension
- Установка и настройка OpenVPN CE (Community Edition)
- Предварительная настройка SELinux
- Настройка SELinux в режим уведомлений
- Настройка SELinux в усиленный режим
- Установка OpenVPN CE и первоначальная настройка
- Установка и настройка местного центра сертификации
- Настройка правил обмена пакетов через “firewalld”
- Настройка клиента OpenVPN и проверка подключения
- Настройка аутентификации в OpenVPN CE через Indeed AM NPS RADIUS Extension
- Установка и настройка RADIUS плагинов для OpenVPN CE
- Плагин 1 (nongnu - radiusplugin)
- Плагин 2 (rakasatria -radiusplugin)
- Плагин 3 (Pam модуль)
- Плагин 4 (osenchenko - radiusplugin)
- Настройка 2fa в OpenVPN CE и проверка подключения
- Настройка 1fa в OpenVPN CE и проверка подключения
- Полезные материалы
Предварительные требования
Настройка на стороне Indeed AM NPS RADIUS Extension
- В оснастке Network Policy Server создайте новый RADIUS Client, указав имя RADIUS Client’а, IP-адрес и общий секрет.

- Создайте сетевую политику с необходимыми для Вас условиями подключения. Настройки политики, которая задействована в инструкции, ниже на скриншотах:




- Создайте новое приложение в MC консоли. Во вкладке “Приложения”, нажмите кнопку “Добавить приложение”, в появившемся окне выберите модуль интеграции NPS RADIUS Extension и задайте название. После чего, нажмите кнопку “Создать”:


- Откройте созданное приложение, укажите IP-адрес RADIUS Client’а (тот же самый IP-адрес, что мы указывали в оснастке NPS) и нажмите сохранить:

- Далее откройте в MC консоли вкладку “Политики”, выберите политику (либо, если её нет, то создайте, а затем выберите её), нажмите кнопку “Добавить приложение” и выберите созданное ранее приложение:


- Во вкладке “Область действия” добавьте пользователей/группу из AD/каталог , которые в дальнейшем будут аутентифицироваться через Indeed AM:

Установка и настройка OpenVPN CE (Community Edition)
В рамках данной инструкции, установка и настройка OpenVPN CE была осуществлена на системе RedOS release MUROM (7.3.4). Также работоспособность OpenVPN CE и 2fa проверялась на системе Oracle 9.2.
!!!Настройка имеет рекомендательный характер. Основополагающей целью является настройка для корректной работы 2fa, но не для полноценной работы OpenVPN CE в продуктовой системе.!!!
Предварительная настройка SELinux
На момент установки и настройки OpenVPN CE сервера и RADIUS плагинов рекомендуем переключить SELinux в режим уведомлений.
Настройка SELinux в режим уведомлений
- Измените режим работы SELinux на “permissive” в конфигурационном файле:
sudo nano /etc/selinux/config В файле: SELINUX=permissive

- Выполните команду:
setenforce 0
- Перезагрузите машину
Настройка SELinux в усиленный режим
Чтобы вернуть SELinux усиленный режим работы, выполните следующее.
- Измените режим работы SELinux на “enforcing” в конфигурационном файле:
sudo nano /etc/selinux/config В файле: SELINUX=enforcing

- Выполните команду:
setenforce 1
- Перезагрузите машину
Установка OpenVPN CE и первоначальная настройка
- Обновите пакеты системы:
sudo dnf update -y
- Установите OpenVPN CE (В инструкции используется версия "openvpn-2.6.8-1.el7.x86_64”):
sudo dnf install -y openvpn
- Скопируйте шаблон конфигурационного файла в директорию “/etc/openvpn”:
sudo cp /usr/share/doc/openvpn/sample/sample-config-files/server.conf /etc/openvpn
- Измените конфигурационный файл OpenVPN сервера:
sudo nano /etc/openvpn/server.conf В файле:
local 192.168.188.162
port 1194 proto udp
dev tun
ca ca.crt
cert server.crt
key server.key
dh dh2048.pemserver 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "route 192.168.7.0 255.255.255.0"
push "dhcp-option DNS 192.168.7.1"
script-security 2
keepalive 10 120
tls-auth ta.key 0
auth sha512
tls-server
tls-version-min 1.2
tls-cipher TLS-DHE-RSA-WITH-AES-128-GCM-SHA256
cipher AES-256-CBC
data-ciphers-fallback 'AES-256-CBC'
user openvpn
group openvpn
persist-key
persist-tun
log /etc/openvpn/openvpn.log
verb 6
explicit-exit-notify 1
reneg-sec 0
mode server
Где, 192.168.188.162 - внешний IP-адрес сетевого интерфейса 192.168.7.0 - внутренний адрес сети, куда настраивается доступ 192.168.7.1 - DNS сервер внутренней сети 10.8.0.0 - виртуальная внутренняя сеть, в которой будут выдаваться IP-адреса OpenVPN клиентам
Установка и настройка местного центра сертификации
Для полноценной работы OpenVPN CE сервера понадобятся сертификаты и ключи, которые создаются в центре сертификации. Для примера, настроим локальный openssl CA для их получения.
- Установите easy-rsa для развёртывания CA и выпуска сертификатов:
sudo dnf install openvpn easy-rsa -y
- Создайте директорию для ключей:
sudo mkdir -p /etc/openvpn/easy-rsa/keys
- В директорию “/etc/openvpn/easy-rsa/” скопируйте скрипты:
cp -r /usr/share/easy-rsa/3.0/* /etc/openvpn/easy-rsa
- Перейдите в директорию “/etc/openvpn/easy-rsa/”:
cd /etc/openvpn/easy-rsa/
- Cоздайте скрипт vars:
nano vars (При необходимости измените значения на свои) В файле:
set_var EASYRSA "$PWD" set_var EASYRSA_PKI "$EASYRSA/pki"
set_var EASYRSA_DN "cn_only"
set_var EASYRSA_REQ_COUNTRY "RU"
set_var EASYRSA_REQ_PROVINCE "Moscow"
set_var EASYRSA_REQ_CITY "Moscow"
set_var EASYRSA_REQ_ORG "MyOrg"
set_var EASYRSA_REQ_EMAIL "openvpn@mydomain.net"
set_var EASYRSA_REQ_OU "CA"
set_var EASYRSA_KEY_SIZE 2048
set_var EASYRSA_ALGO rsa
set_var EASYRSA_CA_EXPIRE 500
set_var EASYRSA_CERT_EXPIRE 365
set_var EASYRSA_NS_SUPPORT "no"
set_var EASYRSA_NS_COMMENT "CERTIFICATE AUTHORITY"
set_var EASYRSA_EXT_DIR "$EASYRSA/x509-types"
set_var EASYRSA_SSL_CONF "$EASYRSA/openssl-easyrsa.cnf"
set_var EASYRSA_DIGEST "sha256"
- Разрешите исполнение файла:
chmod +x vars
- Инициализируйте PKI директорию:
./easyrsa init-pki
- Создайте центр сертификации:
(На этапе "Enter New CA Key Passphrase" задайте пароль) (На этапе ввода CN укажите - “server” или любое необходимое Вам значение)
./easyrsa build-ca
- Создайте запрос сертификата и ключ сервера:
(На этапе ввода CN можно пропустить и нажать “Enter”) (На этапе подтверждения введите “yes”)
./easyrsa gen-req server nopass
- Подпишите сертификат:
./easyrsa sign-req server server
- Проверьте, подписался ли сертификат:
openssl verify -CAfile pki/ca.crt pki/issued/server.crt Вывод при успешной проверке:
pki/issued/server.crt: OK
- Сгенерируйте дополнительный ключ сервера ta.key:
openvpn --genkey secret /etc/openvpn/easy-rsa/keys/ta.key
- Создайте файл Диффи-Хеллмана. Данный файл нужен для обеспечения защиты трафика (трафик, который был записан и сохранен еще до похищения ключей) от расшифровки, если ключи были похищены:
./easyrsa gen-dh
- Выпустите пользовательский клиентский сертификат, по аналогии с сертификатом сервера.
./easyrsa gen-req client01 nopass
./easyrsa sign-req client client01
openssl verify -CAfile pki/ca.crt pki/issued/client01.crt
- Перенесите файлы ключей сервера в директорию “/etc/openvpn/server”:
cp pki/ca.crt /etc/openvpn/server
cp pki/issued/server.crt /etc/openvpn/server
cp pki/private/server.key /etc/openvpn/server
cp /etc/openvpn/easy-rsa/keys/ta.key /etc/openvpn/server
- Перенесите файлы ключей клиента в директорию “/etc/openvpn/client”:
cp pki/ca.crt /etc/openvpn/client/
cp pki/issued/client01.crt /etc/openvpn/client/
cp pki/private/client01.key /etc/openvpn/client/
- Перенесите файл Диффи-Хеллмана в директорию “/etc/openvpn/“:
cp pki/dh.pem /etc/openvpn/dh2048.pem
Настройка правил обмена пакетов через “firewalld”
- Разрешите форвардинг пакетов между сетевыми интерфейсами:
sudo nano /etc/sysctl.conf: В файле:
net.ipv4.ip_forward = 1
net.ipv4.ip_nonlocal_bind = 1

- Выполните команду по загрузке параметров, которые были указаны в файле выше:
sudo sysctl -p
- Установите firewalld (firewalld-2.0.0-2.el7):
sudo dnf install firewalld
- Активируйте сервис “firewalld.service”:
sudo systemctl start firewalld.service
- Убедитесь, что сервис запущен (Вывод:
running ):
firewall-cmd --state
- Настройте маршрутизацию:
###Конфигурируем firewall
sudo firewall-cmd --get-active-zones
sudo firewall-cmd --zone=trusted --add-interface=tun0
sudo firewall-cmd --permanent --zone=trusted --add-interface=tun0
sudo firewall-cmd --permanent --add-service openvpn
sudo firewall-cmd --permanent --zone=trusted --add-service openvpn
sudo firewall-cmd --reload
sudo firewall-cmd --list-services --zone=trusted ###Конфигурируем masquerade
sudo firewall-cmd --add-masquerade
sudo firewall-cmd --add-masquerade --permanent
sudo firewall-cmd --query-masquerade
DEVICE=$(ip route | awk '/^default via/ {print $5}')
sudo firewall-cmd --permanent --direct --passthrough ipv4 -t nat -A POSTROUTING -s 10.8.0.0/24 -o $DEVICE -j MASQUERADE
sudo firewall-cmd --reload
sudo systemctl edit --full --force openvpn-server@server.service В файле: ###Закомментируйте строку
ExecStart=/usr/sbin/openvpn --status %t/openvpn-server/status-%i.log... ###Добавьте строку:
ExecStart=/usr/sbin/openvpn --config /etc/openvpn/server.conf

- Перезагрузите процесс systemd:
sudo systemctl daemon-reload
- Запустите OpenVPN CE сервер и поставьте в автозагрузку
sudo systemctl -f enable openvpn-server@server.service
sudo systemctl start openvpn-server@server.service
Настройка клиента OpenVPN и проверка подключения
В рамках данной инструкции, проверка подключения будет осуществлена на машине с Windows 10.
- Настройте клиентский конфигурационный файл:
nano /etc/openvpn/client/client.ovpn В файле:
client
dev tun
proto udp
remote 192.168.188.162 1194
nobind
resolv-retry infinite
persist-key
persist-tun
auth sha512
auth-nocache
ca ca.crt
cert client01.crt
key client01.key
tls-auth ta.key 1
cipher AES-256-GCM
tls-client
tls-version-min 1.2
tls-cipher TLS-DHE-RSA-WITH-AES-128-GCM-SHA256
verb 4
- Скачайте клиент OpenVPN и установите его на машине.
- На клиентскую машину по пути "C:\Program Files\OpenVPN\config" перенесите следующие файлы с сервера OpenVPN CE:
1) "/etc/openvpn/client/client.ovpn" 2) "/etc/openvpn/client/ca.crt" 3) "/etc/openvpn/client/client01.crt" 4) "/etc/openvpn/client/client01.key" 5) "/etc/openvpn/ta.key"
Примечание: все переносимые сертификаты можно также указать в .ovpn файле и использовать для конфигурации клиента только его.
- Запустите установленный клиент OpenVPN.
- Откройте трей Windows, нажмите правой кнопкой мыши по значку OpenVPN, после чего выберите опцию “Подключиться”:

- Проверьте успешность подключения в открывшемся окне:

Настройка аутентификации в OpenVPN CE через Indeed AM NPS RADIUS Extension
Настройка будет осуществляться через один из трёх предложенных ниже плагинов. Они будут отсылать радиус запросы на NPS сервер с установленным Indeed AM RADIUS Extension. Достаточно установить только один из перечисленных вариантов.
Установка и настройка RADIUS плагинов для OpenVPN CE
Плагин 1 (nongnu - radiusplugin)
- Скачайте архив с плагином:
wget https://www.nongnu.org/radiusplugin/radiusplugin_v2.1a_beta1.tar.gz
- Распакуйте скачанный архив:
tar -xvf radiusplugin_v2.1a_beta1.tar.gz
- Перейдите в директорию с распакованным плагином:
cd radiusplugin_v2.1a_beta1
- Установите плагин:
dnf install libgcrypt libgcrypt-devel gcc-c++ make
- Скопируйте конфигурационные файлы плагина в директорию "/etc/openvpn":
cp radiusplugin.cnf /etc/openvpn cp radiusplugin.so /etc/openvpn
- Добавьте в конфигурационный файл OpenVPN CE сервера строку, которая необходима для включения работы плагина в процессе аутентификации:
nano /etc/openvpn/server.conf В файле добавить строку: plugin /etc/openvpn/radiusplugin.so /etc/openvpn/radiusplugin.cnf

- В конфигурационном файле плагина добавьте данные NPS сервера в секцию server{...}:
nano /etc/openvpn/radiusplugin.cnf В файле, секции server{...} изменить строки:
name=192.168.7.2
retry=3
wait=60
sharedsecret=Qwer1234!
 Где, name=192.168.7.2 - IP адрес NPS сервера retry=3 - Сколько попыток, если ответа не последовало wait=60 - Ожидание ответа (рекомендуем везде ставить 60 секунд) sharedsecret=Qwer1234! - Общий секрет с NPS сервером
- Перезапустите OpenVPN CE сервер:
systemctl restart openvpn-server@server.service
- На клиентской машине в файле "C:\Program Files\OpenVPN\config\client.ovpn" добавьте строку
auth-user-pass .

Плагин 2 (rakasatria -radiusplugin)
- Установите необходимые компоненты:
dnf install golang git freeradius-utils sqlite
- Создайте локальный репозиторий плагина:
git clone https://github.com/rakasatria/ovpn-radius
- Соберите проект:
cd ovpn-radius/src go mod tidy #если необходимо go build
- Создайте директорию для плагина и переместите в неё конфигурационные файлы:
mkdir -p /etc/openvpn/plugin cp config.json /etc/openvpn/plugin cp ovpn-radius /etc/openvpn/plugin chmod 755 /etc/openvpn/plugin/ovpn-radius
- Создайте директорию и файл для базы данных sqlite
mkdir -p /etc/openvpn/plugin/db touch /etc/openvpn/plugin/db/ovpn-radius.db chmod -R 777 /etc/openvpn/plugin/db
- Создайте лог файл:
mkdir /var/log/openvpn touch /var/log/openvpn/radius-plugin.log chown openvpn:openvpn /var/log/openvpn/radius-plugin.log
Где, openvpn:openvpn - сервисный пользователь:группа, указанные в конфигурационном файле OpenVPN сервера “/etc/openvpn/server.conf”
- В конфигурационном файле плагина “/etc/openvpn/plugin/config.json” измените значения параметров "LogFile", “IpAddress”, “Server” и “Secret”:
nano /etc/openvpn/plugin/config.json В файле: "LogFile": "/var/log/openvpn/radius-plugin.log" "IpAddress": "192.168.4.17" "Server": "192.168.7.2:1812" "Secret": "Qwer1234!"

Где, "LogFile": "/var/log/openvpn/radius-plugin.log" - Путь к файлу для записи логов плагина "IpAddress": "192.168.4.17" - IP адрес OpenVPN сервера "Server": "192.168.7.2:1812" - IP адрес NPS сервера "Secret": "Qwer1234!" - Общий секрет с NPS сервером
- Добавьте в конфигурационный файл OpenVPN CE сервера строки, которые необходимы для включения работы плагина в процессе аутентификации:
nano /etc/openvpn/server.conf В файле добавить строки: auth-user-pass-verify "/etc/openvpn/plugin/ovpn-radius auth " via-file script-security 2

- На клиентской машине в файле "C:\Program Files\OpenVPN\config\client.ovpn" добавьте строку
auth-user-pass .

Плагин 3 (Pam модуль)
- Установите Pam модуль:
sudo dnf -y install pam_radius
- Добавьте в конфигурационный файл pam модуля “/etc/pam_radius.conf” данные, необходимые для отправки запроса на NPS сервер:
nano /etc/pam_radius.conf В файле добавьте строку:
192.168.7.2 Qwer1234! 60
 Где, 192.168.7.2 - IP-адрес сервера с Indeed AM NPS RADIUS Extension Qwer1234! - Общий секрет с NPS сервером 60 - Ожидание ответа (рекомендуем везде ставить 60 секунд)
- Добавьте в конфигурационный файл OpenVPN CE сервера строку для работы Pam модуля в процессе аутентификации:
nano /etc/openvpn/server.conf В файле добавить строку:
plugin /usr/lib64/openvpn/plugins/openvpn-plugin-auth-pam.so openvpn

- Добавьте в файл “/etc/pam.d/openvpn” строки настроек аутентификации в OpenVPN CE через NPS сервер:
nano /etc/pam.d/openvpn В файле добавить строки:
auth required pam_radius_auth.so conf=/etc/pam_radius.conf
account sufficient pam_permit.so
session sufficient pam_permit.so

- Перезапустите OpenVPN CE сервер:
systemctl restart openvpn-server@server.service
- На клиентской машине в файле "C:\Program Files\OpenVPN\config\client.ovpn" добавьте строку
auth-user-pass .

Плагин 4 (osenchenko - radiusplugin)
- Установите необходимые компоненты:
Rust:
dnf install curl
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
Golang:
rm -rf /usr/local/go && tar -C /usr/local -xzf go1.24.1.linux-amd64.tar.gz
export PATH=$PATH:/usr/local/go/bin
go version
Task:
Настройка 2fa в OpenVPN CE и проверка подключения
Данная настройка выполняется, когда уже установлен один из описанных выше плагинов и при аутентификации радиус запросы успешно приходят на NPS сервер с установленным Indeed AM NPS RADIUS Extension.
!!!Примечание: Сценарий входа Windows Password + Software TOTP, а также подобные, требующие дважды вводить данные, не поддерживаются, так как OpenVPN CE не поддерживает Challenge/Response.!!!
- В оснастке NPS должна быть включена настройка “Проверять подлинность запросов на этом сервере”:

- В MC консоли, во вкладке “Политики”, откройте политику, а затем созданное ранее приложение. В нём, во вкладке “Приложения”, выберите необходимый метод аутентификации.
- Метод аутентификации: “Indeed Key”

- Метод аутентификации: “Passcode + Indeed Key”

- Пример проверки подключения при сценарии “Windows Password + Indeed Key”:
- Введите данные от доменной учётной записи и нажмите “ОК”:

- Подтвердите Push-уведомление в приложении Indeed Key:

- Аутентификация прошла успешно:

-
Настройка 1fa в OpenVPN CE и проверка подключения
Данная настройка выполняется, когда уже установлен один из описанных выше плагинов и при аутентификации радиус запросы успешно приходят на NPS сервер с установленным Indeed AM NPS RADIUS Extension.
- В оснастке NPS должна быть включена настройка “Принимать пользователей без проверки учетных данных”:

- В MC консоли, во вкладке “Политики”, открываем политику, а затем созданное ранее приложение. В нём во вкладке “Приложения” выберите необходимый метод аутентификации:
- Метод аутентификации: “Программный генератор TOTP”:

- Метод аутентификации: “Passcode”:

- Пример проверки подключения при сценарии “Программный генератор TOTP”:
- Введите имя доменной учётной записи и TOTP код из приложения. После чего нажмите “ОК”:

- Аутентификация прошла успешно:


Полезные материалы
- https://redos.red-soft.ru/base/server-configuring/other-utilites/openvpn/ - статья из документации RedOS по установке и настройке OpenVPN сервера.
- https://www.nongnu.org/radiusplugin/index.html - RADIUS плагин 1 (nongnu - radiusplugin)
- https://github.com/rakasatria/ovpn-radius - RADIUS плагин 2 (rakasatria -radiusplugin)
- https://github.com/FreeRADIUS/pam_radius - RADIUS плагин 3 (Pam модуль)
- https://community.openvpn.net/openvpn/wiki/PluginOverview - таблица со списоком RADIUS плагинов для OpenVPN
|