OpenVPN сервер на Debian/Ubuntu с аутентификацией в Active Directory (LDAP)

    OpneVPN

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

    Настраивать OpenVPN пришлось на стареньком сервере под управлением Debian 7.7 (Wheezy), но статья будет актуальна и для старших версий Debian/Ubuntu. В компании есть сервер Active Directory, будем использовать его для аутентификации пользователей, как LDAP-сервер.

    Приступаем. Логинимся на сервер и повышаем привилегии до root`а:

    $ sudo su

    Обновляемся:

    # apt-get update && apt-get upgrade

    Устанавливаем пакеты openvpn, openvpn-auth-ldap и easy-rsa:

    # apt-get install openvpn openvpn-auth-ldap easy-rsa -y

    Создаем в каталоге OpenVPN каталог easy-rsa и копируем в него файлы программы:

    # mkdir /etc/openvpn/easy-rsa
    # cd /etc/openvpn/easy-rsa

    Для Debian 7:

    # cp -r /usr/share/doc/openvpn/examples/easy-rsa/2.0/* .

    Для старших версий Debian:

    # cp -r /usr/share/easy-rsa/* .

    # cp vars.example vars

    Не зависимо от версии Debian:

    В файле vars правим значения, указывая географическое положение, название организации и т.д:

    # nano vars

    set_var EASYRSA_REQ_COUNTRY "RU"
    set_var EASYRSA_REQ_PROVINCE "Moscow"
    set_var EASYRSA_REQ_CITY "Moscow"
    set_var EASYRSA_REQ_ORG "IT Co"
    set_var EASYRSA_REQ_EMAIL "Этот адрес электронной почты защищен от спам-ботов. Для просмотра адреса в вашем браузере должен быть включен Javascript."
    set_var EASYRSA_REQ_OU "My Organizational Unit"

    Для Debian 7:

    Запускаем отредактированный скрипт:

    # . ./vars

    Удаляем старые сертификаты (если они есть):

    # ./clean-all

    Генерируем корневой сертификат:

    # ./build-ca

    Генерируем ключ сервера:

    # ./build-key-server server

    Генерируем ключ Диффи-Хеллмана:

    # ./build-dh

    Генерируем ключ клиента (проверка клиентских сертификатов у меня пока не предполагается, но пусть будет):

    # ./build-key client

    Генерируем TLS-ключ:

    # openvpn --genkey --secret keys/ta.key

    Копируем каталог с созданными ключами и сертификатами в каталог OpenVPN:

    # cp -r keys /etc/openvpn/

    Для старших версий Debian:

    Создаем каталог для ключей:

    # cd /etc/openvpn

    # mkdir keys

    # cd /etc/openvpn/easy-rsa

    Генерируем ключи и сертификаты.
    Инициализируем инфраструктуру открытых ключей:

    # ./easyrsa init-pki

    Создаем центр сертификации:

    # ./easyrsa build-ca

    Создаем запрос сертификата для сервера без пароля и подписываем его:

    # ./easyrsa gen-req server nopass

    # ./easyrsa sign-req server server

    Генерируем ключ Диффи-Хеллмана:

    # ./easyrsa gen-dh

    Копируем ключи и сертификаты в каталог keys:

    # cp pki/ca.crt /etc/openvpn/keys/ca.crt
    # cp pki/dh.pem /etc/openvpn/keys/dh.pem
    # cp pki/issued/server.crt /etc/openvpn/keys/server.crt
    # cp pki/private/server.key /etc/openvpn/keys/server.key

    Генерируем TLS-ключ:

     # openvpn --genkey --secret /etc/openvpn/keys/ta.key

    Проверяем, в каталоге keys должны быть следующие ключи:

    # ls /etc/openvpn/keys/
    ca.crt dh.pem server.crt server.key ta.key

    Ниже в конфигурационном файле указано имя ключа dh1024.pem (для Debian 7) , измените его на dh.pem

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

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

    # nano /etc/openvpn/server.conf

    #IP на котором устанавливается VPN-соединение
    local 192.168.0.1
    port 1194
    proto udp
    #Использовать тип устройства tun
    dev tun

    #Keys
    ca keys/ca.crt
    cert keys/server.crt
    key keys/server.key
    dh keys/dh1024.pem
    tls-auth keys/ta.key 0

    #Диапазон адресов, выдаваемых клиенту
    server 10.1.0.0 255.255.255.0
    #Настройка статических IP
    ifconfig-pool-persist ipp.txt
    #Таймаут ping и ping-restart
    keepalive 10 120
    #Максимальное количество подключений
    max-clients 20
    #Указывает не перечитывать файлы ключей при перезапуске туннеля
    persist-key
    #Оставляет без изменения устройства tun при перезапуске OpenVPN
    persist-tun

    #Аутентификация LDAP
    username-as-common-name
    client-cert-not-required

    plugin /usr/lib/openvpn/openvpn-auth-ldap.so /etc/openvpn/auth/ldap.conf

    #Настройки логирования
    status /var/log/openvpn/openvpn-status.log
    log-append /var/log/openvpn/openvpn.log
    verb 4
    mute 20

    #Программа будет работать в режиме демона
    daemon
    #Режим работы сервера
    mode server
    #Активирует работу TLS сервера
    tls-server
    #Компрессия трафика
    comp-lzo
    #Алгоритм хэширования
    auth SHA512
    #Алгоритм шифрования
    cipher AES-256-CBC

    #Передавать клиенту свой DNS север
    push "dhcp-option DNS 192.168.0.2"
    push "block-outside-dns"
    #Передать название домена
    push "dhcp-option DOMAIN my_domain.local"
    #Передать маршрут к локальной подсети
    push "route 192.168.0.0 255.255.255.0"

    В /etc/openvpn создадим каталог auth

    # mkdir /etc/openvpn/auth

    Создаем конфигурационный файл ldap.conf с настройками для подключения к AD:

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

    <LDAP>
    URL ldap://192.168.0.2
    BindDN CN=openvpn,CN=Users,DC=my_domain,DC=local
    Password ******
    Timeout 15
    TLSEnable no
    </LDAP>

    <Authorization>
    BaseDN "DC=my_domain,DC=local"
    SearchFilter "(&(sAMAccountName=%u)(memberOf=CN=VPNUsers,CN=Users,DC=my_domain,DC=local))"
    </Authorization>

    Создаем каталог для логов запускаем сервер:

    # mkdir /var/log/openvpn
    # service openvpn start

    Настройка Active Directory

    В контейнере «Users» создаем учетную запись пользователя openvpn с паролем "по вкусу". Далее, создаем группу безопасности «VPNUsers» и добавляем в неё учетные записи пользователей, которым предоставим возможность удаленного подключения.

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

    Включаем форвардинг, если ещё не включен:

    # echo "1" > /proc/sys/net/ipv4/ip_forward

    Разрешаем входящие соединения на порту OpenVPN

    # iptables -A INPUT -p UDP --dport 1194 -j ACCEPT

    Разрешаем форвардинг между локальной подсетью и подсетью OpenVPN

    # iptables -A FORWARD -s 10.1.0.0/24 -d 192.168.0.0/24 -j ACCEPT

    # iptables -A FORWARD -d 10.1.0.0/24 -s 192.168.0.0/24 -j ACCEPT

    В Debian 7 у меня был уже настроен фаервол FireHOL, оставалось только добавить в файл /etc/firehol/firehol.conf строки:

    interface tun+ vpntun
    server all accept
    client all accept

    ******

    router tun2eth0 inface tun+ outface eth0
    route all accept

    router eth02tun inface eth0 outface tun+
    route all accept

    Настройка клиента

    Загрузите и установите необходимый клиент с официального сайта OpenVPN: https://openvpn.net/community-downloads/

    Далее будет предполагаться, что мы настраиваем клиент под Windows 10.

    В папке текущего пользователя C:\Users\user\OpenVPN\config (конфигурация будет доступна только для текущего пользователя) или в папке программы C:\Program Files\OpenVPN\config (конфигурация будет доступна для всех пользователей ПК) создаем файл client.ovpn.

    Для создания файла можно использовать обычный Блокнот или Notepad++

    Заполняем файл следующим содержимым:

    client
    dev tun
    proto udp
    remote server_name_or_ip 1194
    resolv-retry infinite
    nobind
    persist-key
    persist-tun
    ca ca.crt
    tls-client
    tls-auth ta.key 1
    comp-lzo
    verb 3
    auth-user-pass
    cipher AES-256-CBC
    auth SHA512
    remote-cert-tls server

    Сохраняем.

    В ту же папку копируем с сервера файлы ca.crt, ta.key.

    Файлы можно скопировать с сервера с помощью программы WinSCP.

    Проверяем.

    Если ещё не запущена, то запускаем с рабочего стола программу «OpenVPN GUI». В трее нажимаем правой кнопкой мыщи по значку OpenVPN и выбираем пункт «Подключиться». Далее, в появившемся окне вводим логин и пароль. При успешном подключении значок станет зеленым.

    Внимание! логин вводится без указания домена, т.е. только имя пользователя и ничего больше.