OpenVPN 2.0 и более поздние версии включают функцию, которая позволяет серверу OpenVPN безопасно получать имя пользователя и пароль от подключающегося клиента и использовать эту информацию в качестве основы для аутентификации клиента.
Чтобы использовать этот метод аутентификации, сначала добавьте директиву auth-user-pass в конфигурацию клиента. Он будет предписывать клиенту OpenVPN запрашивать у пользователя имя пользователя / пароль, передавая его на сервер по безопасному каналу TLS.
Затем настройте сервер на использование плагина аутентификации, который может быть скриптом, общим объектом или DLL. Сервер OpenVPN будет вызывать плагин каждый раз, когда VPN-клиент пытается подключиться, передавая ему имя пользователя / пароль, введенные на клиенте. Плагин аутентификации может контролировать, позволяет ли сервер OpenVPN клиенту подключаться, возвращая значение ошибки (1) или успеха (0).
Использование скриптовых плагинов
Подключаемые модули сценариев можно использовать, добавив директиву auth-user-pass-verify в файл конфигурации на стороне сервера. Например:
auth-user-pass-verify auth-pam.pl via-file
будет использовать perl-скрипт auth-pam.pl
для аутентификации имени пользователя / пароля подключающихся клиентов. См. Описание auth-user-pass-verify на странице руководства для получения дополнительной информации.
Сценарий auth-pam.pl
включен в дистрибутив исходного файла OpenVPN в подкаталоге sample-scripts . Он будет аутентифицировать пользователей на сервере Linux, используя модуль аутентификации PAM, который, в свою очередь, может реализовать теневой пароль, RADIUS или аутентификацию LDAP. auth-pam.pl
в первую очередь предназначен для демонстрационных целей. Для реальной аутентификации PAM используйте плагин openvpn-auth-pam
общего объекта, описанный ниже.
Использование общего объекта или плагинов DLL
Плагины общего объекта или DLL обычно представляют собой скомпилированные модули C, которые загружаются сервером OpenVPN во время выполнения. Например, если вы используете пакет OpenVPN на основе RPM в Linux, плагин openvpn-auth-pam
уже должен быть собран. Чтобы использовать его, добавьте это в файл конфигурации на стороне сервера:
plugin /usr/share/openvpn/plugin/lib/openvpn-auth-pam.so login
Это позволит серверу OpenVPN проверить имя пользователя / пароль, введенные клиентами с помощью модуля PAM для login
в систему .
Для реального производственного использования лучше использовать плагин openvpn-auth-pam
, потому что он имеет несколько преимуществ перед сценарием auth-pam.pl
:
Плагин разделяемого объекта openvpn-auth-pam использует модель выполнения с разделенными привилегиями для повышения безопасности. Это означает, что сервер OpenVPN может работать с ограниченными привилегиями, используя директивы user nobody, group nobody и chroot, и все равно сможет выполнять аутентификацию по файлу теневых паролей, доступному только для root.
OpenVPN может передавать имя пользователя / пароль плагину через виртуальную память, а не через файл или среду, что лучше для локальной безопасности на сервере.
Скомпилированные C-модули плагина обычно работают быстрее, чем скрипты.
Если вам нужна дополнительная информация о разработке собственных плагинов для использования с OpenVPN, см. Файлы README в подкаталоге плагинов исходного дистрибутива OpenVPN.
Чтобы создать плагин openvpn-auth-pam в Linux, перейдите в каталог plugin/auth-pam в дистрибутиве исходного кода OpenVPN и запустите make.
Использование аутентификации по имени пользователя / паролю в качестве единственной формы аутентификации клиента
По умолчанию использование на сервере плагина auth-user-pass-verify
или плагина для проверки имени пользователя / пароля включает двойную аутентификацию, требующую успешной аутентификации клиента-сертификата и имени пользователя / пароля для аутентификации клиента.
Хотя это не рекомендуется с точки зрения безопасности, также возможно отключить использование клиентских сертификатов и принудительно устанавливать только аутентификацию по имени пользователя и паролю. На сервере:
client-cert-not-required
Такие конфигурации обычно также должны устанавливать:
username-as-common-name
который скажет серверу использовать имя пользователя для целей индексации, так как он будет использовать общее имя клиента, который проходил аутентификацию через сертификат клиента.
Обратите внимание, что client-cert-not-required
не устранит необходимость в сертификате сервера, поэтому клиент, подключающийся к серверу, который использует client-cert-not-required, может удалить директивы cert
и key
из файла конфигурации клиента, но не может директива ca, потому что клиенту необходимо проверить сертификат сервера.