В статье приводится описание процесса организации удаленного доступа к локальной сети предприятия с использованием OpenVPN в Ubuntu 16


Предполагается, что:

  • локальная сеть образована хостами с адресами из подсети 10.100.100.0/24
  • имя домена Active Directory - domain.local
  • DNS-имя контроллера домена - dc.domain.local
  • адрес DNS-сервера - 10.100.100.1
  • адреса удаленным клиентам будут выделяться из подсети 10.200.200.0/24
  • проверка подлинности будет осуществляться на основании членства в группе Active Directory "Пользователи VPN"
  • LDAP-запросы будут выполняться сервером OpenVPN посредством учетной записи Active Directory "openvpn"
  • удаленные подключения будут выполнятся к серверу ovpn.domain.com по протоколу TCP на порт 443
  • установка будет осуществляться на виртуальную машину Hyper-V с 1ГБ ОП, 10ГБ жестким диском и ОС Ubuntu 16.04.1

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


  • настраиваем сетевое оборудование (на устройстве, осуществляющем маршрутизацию между подсетями, добавляем маршрут, направляющий трафик, адресованный в подсеть удаленных клиентов, на сервер OpenVPN; на межсетевом экране разрешаем входящий трафик OpenVPN и т.д.)
  • устанавливаем Ubuntu 16.04.01, основные пакеты (mc, ssh и т.д.) и выполняем необходимую базовую настройку (в частности, конфигурируем iptables, как рассказывается здесь)
  • создаем в Active Directory пользователя «openvpn», который будет использоваться для LDAP-аутентификации, и группу «Пользователи VPN»
  • импортируем ключ репозитория OpenVPN
  • wget -O - https://swupdate.openvpn.net/repos/repo-public.gpg | apt-key add -
  • проверяем, что ключ был успешно добавлен
  • apt-key list
  • в папке /etc/apt/sources.list.d создаем файл, содержащий путь к репозиторию OpenVPN
  • echo "deb http://build.openvpn.net/debian/openvpn/stable xenial main" > /etc/apt/sources.list.d/openvpn-aptrepo.list
  • обновляем список пакетов
  • apt-get update
  • устанавливаем OpenVPN
  • apt-get install openvpn
  • устанавливаем модуль pam_ldap.so, необходимый для LDAP-аутентификации пользователей OpenVPN посредством PAM
  • apt-get install libpam-ldap
  • Замечание: в процессе установки будет запущен мастер настройки модуля; на всех шагах нажимаем «ESC»
  • создаем группу "openvpn"
  • addgroup openvpn
  • создаем пользователя "openvpn"
  • adduser --home /nonexistent --shell /usr/sbin/nologin --no-create-home --ingroup openvpn openvpn
  • Замечание: пользователь будет автоматически добавлен в группу «openvpn», и ему не будет назначен ни домашний каталог, ни командный интерпретатор
  • создаем сертификат сервера (как это сделать, рассказывается здесь), при этом:
    • в сертификат включаем следующие атрибуты:
      • extendedKeyUsage = serverAuth
      • keyUsage = digitalSignature, keyEncipherment
    • закрытый ключ сохраняем в файл /etc/openvpn/private.key
    • сертификат сервера сохраняем вместе с сертификатом промежуточного центра сертификации в файле /etc/openvpn/chain.cer
    • Замечание: объединить сертификаты можно командой cat public.cer iss-ca.cer > chain.cer
    • сертификат корневого центра сертификации сохраняем в файл /etc/openvpn/ca.cer
  • создаем файл DH-параметров dh.pem и сохраняем его в папке /etc/openvpn
  • openssl dhparam -out dh.pem 4096
  • Замечание: в качестве длины ключа используем то же значение, что и при создании закрытого ключа
  • создаем файл /etc/openvpn/server.conf с настройками сервера OpenVPN
  • proto tcp
    port 443
    dev tun
    topology subnet
    server 10.200.200.0 255.255.255.0
    push "route 10.100.100.0 255.255.255.0"
    push "dhcp-option DNS 10.100.100.1"
    tls-version-min 1.2
    tls-cipher TLS-ECDHE-RSA-WITH-AES-256-GCM-SHA384
    cipher AES-256-GCM
    ca /etc/openvpn/ca.cer
    cert /etc/openvpn/chain.cer
    key /etc/openvpn/private.key
    dh /etc/openvpn/dh.pem
    verify-client-cert none
    comp-lzo
    duplicate-cn
    keepalive 10 120
    max-clients 999
    user openvpn
    group openvpn
    persist-key
    persist-tun
    verb 4
    daemon
    plugin /usr/lib/openvpn/plugins/openvpn-plugin-auth-pam.so openvpn
    
  • Замечание 1: описание параметров можно посмотреть в этом примере
  • Замечание 2: изначально в конфигурацию входили также параметры
    ifconfig-pool-persist /home/openvpn/ipp.txt
    status /var/log/openvpn/openvpn.status
    log /var/log/openvpn/openvpn.log
    Однако, оказалось, что первый параметр не работает при использовании совместно с параметром «duplicate-cn», а при использовании произвольных путей к лог-файлам OpenVPN не мог получить к ним доступ (вероятно, потому, что они создавалась пользователем «root», а запись в них выполнял пользователь «openvpn»)
  • Замечание 3: «openvpn» в конце последнего параметра означает имя используемого сценария PAM-аутентификации, который будет создан далее в папке /etc/pam.d
  • назначаем папке /etc/openvpn и ее содержимому в качестве владельца пользователя и группу «openvpn» и предоставляем им права полного доступа
  • chown -R openvpn:openvpn /etc/openvpn
    chmod -R 700 /etc/openvpn
  • создаем файл /etc/pam.d/openvpn следующего содержания
  • auth required pam_ldap.so config=/etc/ldap/openvpn.conf
    
  • устанавливаем на файл /etc/pam.d/openvpn те же права, что установлены на остальные файлы сценариев аутентификации
  • chmod 644 /etc/pam.d/openvpn
  • создаем файл /etc/ldap/openvpn.conf следующего содержания
  • uri ldap://dc.domain.local:389
    base dc=domain,dc=local
    binddn cn=openvpn,cn=users,dc=domain,dc=local
    bindpw <some_password>
    pam_filter &(objectClass=user)(!(userAccountControl:1.2.840.113556.1.4.803:=2))
    (memberOf:1.2.840.113556.1.4.1941:=cn=пользователи vpn,cn=users,dc=domain,dc=local)
    pam_login_attribute sAMAccountName
    
  • Замечание 1: насколько я понимаю, LDAP-фильтр строится на основании параметров "pam_filter" и "pam_login_attribute" следующим образом:
    (&(pam_login_attribute=%u)(pam_filter))
    Таким образом, значение параметра pam_filter следует указывать без скобок, т.е., например, в случае отбора только по одному условию "objectClass=user" в конфигурационный файл необходимо добавить строку
    pam_filter objectClass=user
  • Замечание 2: указанный фильтр отбирает незаблокированные учетные записи пользователей, входящих в группу "Пользователи VPN" и любые дочерние группы
  • Замечание 3: проверку на принадлежность группе можно выполнить без использования фильтра, используя параметры
    pam_groupdn cn=пользователи vpn,cn=users,dc=domain,dc=local
    pam_member_attribute member
    Однако, в этом случае проверка членства в дочерних группах выполняться не будет, и пользователь должен будет непосредственно входить в группу "Пользователи VPN"
  • Замечание 4: если имя группы должно содержать круглые скобки, то при указании FQDN группы в фильтре необходимо использовать escape-последовательности '\(' и '\)'
  • Замечание 5: для взаимодействия с контроллером домена по протоколу LDAPS необходимо поместить в папку /etc/ldap файл с сертификатом корневого центра сертификации root.cer, а в файл конфигурации /etc/ldap/openvpn.conf внести следующие изменения
    uri ldaps://dc.domain.local:636
    tls_cacertfile /etc/ldap/root.cer
    tls_checkpeer yes
    Помимо этого, на сервере должна быть включена поддержка LDAPS. Как этого сделать, можно прочитать здесь
  • Замечание 6: изначально планировалось выполнять проверку подлинности посредством модуля openvpn-auth-ldap, однако, при его использовании аутентификация завершалась с ошибкой, а в журнале syslog появлялась запись: "LDAP search failed: Operations error (000004DC: LdapErr: DSID-0C090748, comment: In order to perform this operation a successful bind must be completed on the connection., data 0, v2580)"
  • устанавливаем на файл /etc/ldap/openvpn.conf те же права, что установлены на другие файлы в этой папке
  • chmod 644 /etc/ldap/openvpn.conf
  • включаем маршрутизацию ipv4-пакетов между интерфейсами OpenVPN, для чего в файле /etc/sysctl.conf раскомментируем строку
  • net.ipv4.ip_forward=1
    
  • Замечание: без данного шага VPN-клиенты и узлы локальной сети не смогут взаимодействовать друг с другом, и у них будет доступ только к VPN-шлюзу
  • для автоматического запуска сервиса OpenVPN добавляем в файл /etc/default/openvpn параметр
  • AUTOSTART="server"
    
  • Замечание: данный параметр означает, что при запуске сервиса автоматически будет запущен экземпляр OpenVPN, использующий параметры, указанные в файле /etc/openvpn/server.conf
  • перезагружаемся
  • проверяем, что сервис OpenVPN запущен
  • service openvpn status
  • просматриваем файл /var/log/syslog на предмет отсутствия ошибок и предупреждений, касающихся OpenVPN

Создание профиля подключения


  • создаем файл конфигурации клиентов "domain.com.ovpn" следующего содержания
  • client
    remote ovpn.domain.com
    proto tcp
    port 443
    dev tun
    nobind
    persist-key
    persist-tun
    remote-cert-tls server
    tls-cipher TLS-ECDHE-RSA-WITH-AES-256-GCM-SHA384
    cipher AES-256-GCM
    comp-lzo
    verb 1
    auth-user-pass
    auth-nocache
    <ca>
    -----BEGIN CERTIFICATE-----
    ...
    -----END CERTIFICATE-----
    </ca>
    
  • Замечание: между тегами <ca> и </ca> необходимо вставить содержимое файла с сертификатом корневого центра сертификации в PEM-формате
  • распространяем файл конфигурации domain.com.ovpn на клиентские устройства

Установка клиента OpenVPN в Windows 8.1 x64


  • на сайте разработчика в разделе "Community Downloads" скачиваем установочный пакет OpenVPN
  • выполняем установку со следующими компонентами:
    • OpenVPN User-Space Components
    • TAP Virtual Ethernet Adapter
    • OpenVPN GUI
    • Dependencies
  • копируем файлы «domain.com.ovpn» и «domain.com.cer» в папку C:\Program Files\OpenVPN\config
  • запускаем OpenVPN от имени администратора и пробуем установить подключение
  • Замечание 1: запуск от имени администратора необходим для добавления в таблицу маршрутизации маршрутов в удаленные подсети
  • Замечание 2: при установке OpenVPN в папку, отличную от c:\program files\openvpn, его запуск необходимо выполнять с параметрами --exe_path и --config_dir:
    openvpn-gui.exe --exe_path "c:\OpenVPN\bin\openvpn.exe" --config_path "c:\OpenVPN\config"

Полезные ссылки


http://swupdate.openvpn.org/community/releases

https://community.openvpn.net/openvpn/wiki/UnprivilegedUser

https://community.openvpn.net/openvpn/wiki/Using_Certificate_Chains

https://community.openvpn.net/openvpn/wiki/OpenvpnSoftwareRepos

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