Настройка OpenVPN CE + Indeed AM NPS RADIUS Extension
Автор Viktor Barmakov, Last modified by Viktor Barmakov на 07 мая 2024 04:58 PM

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

Оглавление

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

Предварительные требования

    Настройка на стороне Indeed AM NPS RADIUS Extension

    1. В оснастке Network Policy Server создайте новый RADIUS Client, указав имя RADIUS Client’а, IP-адрес и общий секрет.

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




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


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

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


    6. Во вкладке “Область действия” добавьте пользователей/группу из 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 в режим уведомлений

    1. Измените режим работы SELinux на “permissive” в конфигурационном файле:
      sudo nano /etc/selinux/config
      В файле:
      SELINUX=permissive
    2. Выполните команду:
      setenforce 0
    3. Перезагрузите машину

    Настройка SELinux в усиленный режим

    Чтобы вернуть SELinux усиленный режим работы, выполните следующее.

    1. Измените режим работы SELinux на “enforcing” в конфигурационном файле:
      sudo nano /etc/selinux/config
      В файле:
      SELINUX=enforcing
    2. Выполните команду:
      setenforce 1
    3. Перезагрузите машину

    Установка OpenVPN CE и первоначальная настройка

    1. Обновите пакеты системы:
      sudo dnf update -y
    2. Установите OpenVPN CE (В инструкции используется версия "openvpn-2.6.8-1.el7.x86_64”):
      sudo dnf install -y openvpn
    3. Скопируйте шаблон конфигурационного файла в директорию “/etc/openvpn”:
      sudo cp /usr/share/doc/openvpn/sample/sample-config-files/server.conf /etc/openvpn
    4. Измените конфигурационный файл 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 для их получения.

    1. Установите easy-rsa для развёртывания CA и выпуска сертификатов:
      sudo dnf install openvpn easy-rsa -y
    2. Создайте директорию для ключей:
      sudo mkdir -p /etc/openvpn/easy-rsa/keys
    3. В директорию “/etc/openvpn/easy-rsa/” скопируйте скрипты:
      cp -r /usr/share/easy-rsa/3.0/* /etc/openvpn/easy-rsa
    4. Перейдите в директорию “/etc/openvpn/easy-rsa/”:
      cd /etc/openvpn/easy-rsa/
    5. 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"
    6. Разрешите исполнение файла:
      chmod +x vars
    7. Инициализируйте PKI директорию:
      ./easyrsa init-pki
    8. Создайте центр сертификации:
      (На этапе "Enter New CA Key Passphrase" задайте пароль)
      (На этапе ввода CN укажите - “server” или любое необходимое Вам значение)
      ./easyrsa build-ca
    9. Создайте запрос сертификата и ключ сервера:
      (На этапе ввода CN можно пропустить и нажать “Enter”)
      (На этапе подтверждения введите “yes”)
      ./easyrsa gen-req server nopass
    10. Подпишите сертификат:
      ./easyrsa sign-req server server
    11. Проверьте, подписался ли сертификат:
      openssl verify -CAfile pki/ca.crt pki/issued/server.crt

      Вывод при успешной проверке:
      pki/issued/server.crt: OK
    12. Сгенерируйте дополнительный ключ сервера ta.key:
      openvpn --genkey secret /etc/openvpn/easy-rsa/keys/ta.key
    13. Создайте файл Диффи-Хеллмана. Данный файл нужен для обеспечения защиты трафика (трафик, который был записан и сохранен еще до похищения ключей) от расшифровки, если ключи были похищены:
      ./easyrsa gen-dh
    14. Выпустите пользовательский клиентский сертификат, по аналогии с сертификатом сервера.
      ./easyrsa gen-req client01 nopass

      ./easyrsa sign-req client client01
      openssl verify -CAfile pki/ca.crt pki/issued/client01.crt
    15. Перенесите файлы ключей сервера в директорию “/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
    16. Перенесите файлы ключей клиента в директорию “/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/
    17. Перенесите файл Диффи-Хеллмана в директорию “/etc/openvpn/“:
      cp pki/dh.pem /etc/openvpn/dh2048.pem

      Настройка правил обмена пакетов через “firewalld”

      1. Разрешите форвардинг пакетов между сетевыми интерфейсами:
        sudo nano /etc/sysctl.conf:
        В файле:
        net.ipv4.ip_forward = 1

        net.ipv4.ip_nonlocal_bind = 1
      2. Выполните команду по загрузке параметров, которые были указаны в файле выше:
        sudo sysctl -p
      3. Установите firewalld (firewalld-2.0.0-2.el7):
        sudo dnf install firewalld
      4. Активируйте сервис “firewalld.service”:
        sudo systemctl start firewalld.service
      5. Убедитесь, что сервис запущен (Вывод: running):
        firewall-cmd --state
      6. Настройте маршрутизацию:
        ###Конфигурируем 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
      7. Перезагрузите процесс systemd:
        sudo systemctl daemon-reload
      8. Запустите OpenVPN CE сервер и поставьте в автозагрузку
        sudo systemctl -f enable openvpn-server@server.service

        sudo systemctl start openvpn-server@server.service

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

      В рамках данной инструкции, проверка подключения будет осуществлена на машине с Windows 10.

      1. Настройте клиентский конфигурационный файл:
        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
      2. Скачайте клиент OpenVPN и установите его на машине.
      3. На клиентскую машину по пути "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 файле и использовать для конфигурации клиента только его.
      4. Запустите установленный клиент OpenVPN.
      5. Откройте трей Windows, нажмите правой кнопкой мыши по значку OpenVPN, после чего выберите опцию “Подключиться”:
      6. Проверьте успешность подключения в открывшемся окне:

        Настройка аутентификации в OpenVPN CE через Indeed AM NPS RADIUS Extension

        Настройка будет осуществляться через один из трёх предложенных ниже плагинов. Они будут отсылать радиус запросы на NPS сервер с установленным Indeed AM RADIUS Extension. Достаточно установить только один из перечисленных вариантов.

        Установка и настройка RADIUS плагинов для OpenVPN CE

        Плагин 1 (nongnu - radiusplugin)

        1. Скачайте архив с плагином:
          wget https://www.nongnu.org/radiusplugin/radiusplugin_v2.1a_beta1.tar.gz
        2. Распакуйте скачанный архив:
          tar -xvf radiusplugin_v2.1a_beta1.tar.gz
        3. Перейдите в директорию с распакованным плагином:
          cd radiusplugin_v2.1a_beta1
        4. Установите плагин:
          dnf install libgcrypt libgcrypt-devel gcc-c++
          make
        5. Скопируйте конфигурационные файлы плагина в директорию "/etc/openvpn":
          cp radiusplugin.cnf /etc/openvpn
          cp radiusplugin.so /etc/openvpn
        6. Добавьте в конфигурационный файл OpenVPN CE сервера строку, которая необходима для включения работы плагина в процессе аутентификации:
          nano /etc/openvpn/server.conf
          В файле добавить строку:
          plugin /etc/openvpn/radiusplugin.so /etc/openvpn/radiusplugin.cnf
        7. В конфигурационном файле плагина добавьте данные 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 сервером
        8. Перезапустите OpenVPN CE сервер:
          systemctl restart openvpn-server@server.service
        9. На клиентской машине в файле "C:\Program Files\OpenVPN\config\client.ovpn" добавьте строку auth-user-pass.

          Плагин 2 (rakasatria -radiusplugin)

          1. Установите необходимые компоненты:
            dnf install golang git freeradius-utils sqlite
          2. Создайте локальный репозиторий плагина:
            git clone https://github.com/rakasatria/ovpn-radius
          3. Соберите проект:
            cd ovpn-radius/src
            go mod tidy #если необходимо
            go build
          4. Создайте директорию для плагина и переместите в неё конфигурационные файлы:
            mkdir -p /etc/openvpn/plugin
            cp config.json /etc/openvpn/plugin
            cp ovpn-radius /etc/openvpn/plugin
            chmod 755 /etc/openvpn/plugin/ovpn-radius
          5. Создайте директорию и файл для базы данных sqlite
            mkdir -p /etc/openvpn/plugin/db
            touch /etc/openvpn/plugin/db/ovpn-radius.db
            chmod -R 777 /etc/openvpn/plugin/db
          6. Создайте лог файл:
            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”
          7. В конфигурационном файле плагина “/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 сервером
          8. Добавьте в конфигурационный файл OpenVPN CE сервера строки, которые необходимы для включения работы плагина в процессе аутентификации:
            nano /etc/openvpn/server.conf
            В файле добавить строки:
            auth-user-pass-verify "/etc/openvpn/plugin/ovpn-radius auth " via-file
            script-security 2

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

            Плагин 3 (Pam модуль)

            1. Установите Pam модуль:
              sudo dnf -y install pam_radius
            2. Добавьте в конфигурационный файл 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 секунд)
            3. Добавьте в конфигурационный файл OpenVPN CE сервера строку для работы Pam модуля в процессе аутентификации:
              nano /etc/openvpn/server.conf
              В файле добавить строку:
              plugin /usr/lib64/openvpn/plugins/openvpn-plugin-auth-pam.so openvpn
            4. Добавьте в файл “/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
            5. Перезапустите OpenVPN CE сервер:
              systemctl restart openvpn-server@server.service
            6. На клиентской машине в файле "C:\Program Files\OpenVPN\config\client.ovpn" добавьте строку auth-user-pass.

              Настройка 2fa в OpenVPN CE и проверка подключения

              Данная настройка выполняется, когда уже установлен один из описанных выше плагинов и при аутентификации радиус запросы успешно приходят на NPS сервер с установленным Indeed AM NPS RADIUS Extension.

              !!!Примечание: Сценарий входа Windows Password + Software TOTP, а также подобные, требующие дважды вводить данные, не поддерживаются, так как OpenVPN CE не поддерживает Challenge/Response.!!!

              1. В оснастке NPS должна быть включена настройка “Проверять подлинность запросов на этом сервере”:

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

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

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

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

                    Настройка 1fa в OpenVPN CE и проверка подключения

                    Данная настройка выполняется, когда уже установлен один из описанных выше плагинов и при аутентификации радиус запросы успешно приходят на NPS сервер с установленным Indeed AM NPS RADIUS Extension.

                    1. В оснастке NPS должна быть включена настройка “Принимать пользователей без проверки учетных данных”:
                    2. В MC консоли, во вкладке “Политики”, открываем политику, а затем созданное ранее приложение. В нём во вкладке “Приложения” выберите необходимый метод аутентификации:
                      1. Метод аутентификации: “Программный генератор TOTP”:
                      2. Метод аутентификации: “Passcode”:
                    3. Пример проверки подключения при сценарии “Программный генератор TOTP”:
                      1. Введите имя доменной учётной записи и TOTP код из приложения. После чего нажмите “ОК”:
                      2. Аутентификация прошла успешно:


                    Полезные материалы

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

                    Комментарии (0)
                    Добавить новый комментарий
                     
                     
                    Полное имя:
                    Email:
                    Комментарии: