В статье приводится описание процесса организации удаленного доступа к локальной сети предприятия с использованием 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