OpenVPN с аутентификацией на Microsoft RADIUS-сервере

В OpenVPN нет нативной поддержки аутентификации на RADIUS-сервере. Реализовать данный функционал можно с помощью модуля pam_radius или с помощью плагина для OpenVPN radiusplugin.

В этой статье хочу рассмотреть вариант настройки аутентификации OpenVPN на сервере RADIUS через модуль pam_radius.

Оглавление

Вводные данные

Требуется на имеющемся сервере под управлением Gentoo Linux установить OpenVPN сервер и обеспечить аутентификацию vpn-клиентов (в том числе мобильных) с помощью RADIUS-сервера, работающего на Microsoft Windows Server 2003.

Для определенности:

  • внешний ip адрес сервера linux — xxx.xxx.xxx.xxx
  • внутренний ip адрес сервера linux — 10.0.0.1/24
  • внутренний ip адрес сервера windows — 10.0.0.2/24
  • подсеть vpn — 10.10.0.0/24

Этап 1. Установка

На момент написания статьи в portage Gentoo доступна версия OpenVPN 2.3.0, но она замаскирована по keywords. Модуль pam_radius так же замаскирован. Для успешной установки требуется размаскировать необходимые пакеты, для этого нужно добавить следующие строки в файл /etc/portage/package.keywords:

net-misc/openvpn ~amd64
sys-auth/pam_radius ~amd64

Установка выполняется командой:

emerge openvpn pam_radius

Этап 2: Настройка сервера

Для правильной работы vpn-клиентов с ресурсами внутренней подсети, на сервере, где установлен OpenVPN, нужно обеспечить соответствующую маршрутизацию трафика.

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

Установку RADIUS-сервера в Windows Server 2003 описывать не буду, так как этот вопрос подробно рассмотрен на официальном сайте компании Microsoft и в Интернете.

Для работы необхдимой схемы аутентификации требуется открыть оснастку «Служба проверки подлинности в Интернете» и в разделе RADIUS-клиенты создать нового клиента:

openvpn1

Клиент-вендор следует задать «RADUIS Standard». Общий секрет — какое либо секретное слово, для примера пусть будет «TopSecret».

openvpn2

Затем, в разделе «Политика удаленного доступа» нужно создать новую политику.

openvpn3

Способ доступа можно указать Ethernet, в дальнейшем эта настройка будет заменена.

openvpn4

Далее нужно указать группу (или несколько групп), учетным записям из которой разрешено устанавливать соединения vpn. В моем примере группа называется vpnconnect.

openvpn5

Тип расширенной проверки подлинности следует выбрать MD5-оклик, в дальнейшем эта настройка будет заменена.

openvpn6

Теперь следует открыть свойства созданной политики удаленного доступа и нажать кнопку «Изменить профиль». На вкладке «Дополнительно» нужно задать атрибуты:

  • Ignore-User-Dialin-Properties = True
  • Framed-Protocol = PPP
  • Service-Type = Framed

openvpn7

На вкладке «Проверка подлинности» следует включить проверки MS-CHAO v2, MS-CHAP, CHAP, PAP.

openvpn8

В окне свойств политики удаленного доступа необходимо задать следующие условия политики:

  • Windows-Groups соответствует выбранной группе (или группам)
  • Authentication-Type соответствует «CHAP OR EAP OR Extension OR MS-CHAP v1 OR MS-CHAP v1 CPW OR MS-CHAP v2 OR MS-CHAP v2 CPW OR PAP»
  • NAS-Port-Type соответствует «Виртуальная (VPN)»

openvpn9

На этом настройку RADIUS-сервера можно считать завершенной.

Настройка pam_radius

Для работы аутентификации OpenVPN через модуль pam_radius необходимо создать файл /etc/pam.d/openvpn со следующим содержимым:

#%PAM-1.0
auth            sufficient              pam_radius_auth.so
account         sufficient              pam_permit.so
session         sufficient              pam_permit.so

А так же, для обеспечения аутентификации самого OpenVPN на RADIUS-сервере, в файл /etc/raddb/server нужно добавить ip адрес RADIUS-сервера и секретное слово:

10.0.0.2  TopSecret

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

В Gentoo OpenVPN по умолчанию ищет свои конфигурационные файлы в директории /etc/openvpn. Перед написанием конфигурационного файла требуется создать необходимые для работы OpenVPN сертификаты. Я предлагаю хранить сертификаты в директории /etc/openvpn/certs.

На сайте OpenVPN есть официальная инструкция по генерированию сертификатов — http://openvpn.net/index.php/open-source/documentation/howto.html#pki
Я предлагаю создать сертификаты вручную с помощью openssl.

Для получения необходимых сертификатов в директории /etc/openvpn/certs нужно дополнительно создать поддиректории demoCA/newcerts:

mkdir -p /etc/openvpn/certs/demoCA/newcerts

Чтобы правильно отработала подпись сертификатов, в директории demoCA нужно создать два файла — serial и index.txt:

touch /etc/openvpn/certs/demoCA/index.txt
echo 00 > /etc/openvpn/certs/demoCA/serial

Подготовительные действия завершены и можно приступить к созданию сертификатов.

Важное замечание: при генерировании сертификатов необходимо для каждого типа сертификата указать уникальное значение поля Common Name. Например, для сертификата CA  можно указать Common Name = CA, для сертификата сервера Common Name = Server, для сертификата клиента Common Name = Client.

Прежде всего нужно получить сертификат CA (сертификат, которым будут подписываться остальные сертификаты). Генерируется CA сертификат следующей командой (действия выполняются в директории /etc/openvpn/certs):

openssl req -nodes -new -newkey rsa:2048 -x509 -days 73000 -keyout ca.key -out ca.crt

Далее переходим к генерированию сертификата сервера OpenVPN. Сначала генерируется запрос сертификата, затем создается сам сертификат путем подписывания запроса уже полученным сертификатом CA:

openssl req -new -newkey rsa:2048 -nodes -keyout server.key -out server.req
openssl ca -in server.req -days 36500 -out server.crt -cert ca.crt -keyfile ca.key

Важное замечание: срок действия сертификата должен быть равен или меньше срока действия сертификата CA, с учетом промежутка времени между созданием сертификата CA и подписываемого сертификата. Разумно эту разницу сделать существенной.

Следующий шаг в процессе генерирования сертификатов — получение клиентского сертификата.  Процесс идентичен получению сертификата сервера:

openssl req -new -newkey rsa:2048 -nodes -keyout client.key -out client.req
openssl ca -in client.req -days 36500 -out client.crt -cert ca.crt -keyfile ca.key

Последнее действие — создание ключа Диффи-Хеллмана, используемого для шифрования дальнейшего обмена данными с помощью алгоритмов симметричного шифрования:

openssl dhparam -out dh2048.pem 2048

Для запуска OpenVPN сервера осталось написать файл конфигурации /etc/openvpn/openvpn.conf.  В качестве примера можно воспользоваться моим конфигурационным файлом:

# локальный ip, на котором будет работать OpenVPN
local xxx.xxx.xxx.xxx
# порт сервера OpenVPN
port 1194
# сетевой протокол
proto udp
# определение типа устройства tun/tap
dev tun0

# пути до сертификатов
ca certs/ca.crt
cert certs/server.crt
key certs/server.key
dh certs/dh2048.pem

# подключение плагина PAM с опцией для аутентификации
# через RADIUS-сервер
plugin /usr/lib/openvpn/openvpn-plugin-auth-pam.so openvpn
# отключение аутентификации по сертификатам
client-cert-not-required
# использовать для аутентификации введенный пользователем логин
username-as-common-name

# подсеть, из которой будут назначаться ip адреса клиентам
server 10.10.0.0 255.255.255.0
# маршрут, передаваемый клиентам при подключении
push "route 10.0.0.0 255.255.255.0"

# разрешение подключения нескольких клиентов под одним логином
duplicate-cn
# проверка работы туннеля (каждые 10 секунд посылать ping,
# если за 120 секунд небыло получено ответа - перезапустить туннель)
keepalive 10 120
# алгоритм шифрования
cipher BF-CBC
# сжатие трафика
comp-lzo
push "comp-lzo yes"

# учетная запись, под которой будет работать сервер OpenVPN
user nobody
group nobody

# не перечитывать файлы ключей при перезапуске туннеля
persist-key
# не изменять устройство tun/tap при перезапуске OpenVPN
persist-tun
# статус-файл с информацией о текущих соединениях
status openvpn-status.log
# уровень логирования
verb 3
# оптимизация операций ввода-вывода
fast-io
# поддержка простых vpn-сетей
topology subnet
# максимальный размер MSS (размер блока данных пакета TCP)
mssfix 1300

Запускается сервер OpenVPN с помощью команды:

/etc/init.d/openvpn start

Этап 3. Настройка клиента

Для максимального упрощения настройки клиентов OpenVPN лучше всего воспользоваться файлом конфигурации для клиентов *.ovpn (для примера, пусть файл называется client.ovpn). Универсальный файл, который могут использовать клиенты как на desktop операционных системах, так и на мобильных устройствах, может выглядеть, например, так:

# режим работы
client
# использовать динамический порт
nobind
# определение типа устройства tun/tap
dev tun
# адрес OpenVPN сервера
remote xxx.xxx.xxx.xxx 1194 udp
# требование ввода логина/пароля
auth-user-pass
# сжатие трафика
comp-lzo
# уровень логирования
verb 3
# переподключения при отказе резолва
resolv-retry infinite
# не перечитывать файлы ключей при перезапуске туннеля
persist-key
# не изменять устройство tun/tap при перезапуске OpenVPN
persist-tun

<ca>
-----BEGIN CERTIFICATE-----
# содержимое файла ca.crt
-----END CERTIFICATE-----
</ca>
<cert>
-----BEGIN CERTIFICATE-----
# содержимое файла client.crt
-----END CERTIFICATE-----
</cert>
<key>
-----BEGIN RSA PRIVATE KEY-----
# содержимое файла client.key
-----END RSA PRIVATE KEY-----
</key>

Этот файл необходимо передать всем клиентам, которым требуется подключение к OpenVPN серверу. В операционной системе Linux произвести подключение к OpenVPN серверу из терминала с помощью созданного файла client.ovpn можно командой:

openvpn -config /path/to/client.ovpn

Логин, вводимый по запросу OpenVPN, должен находится в группе Active Directory, которой разрешен доступ к vpn подключениям.

На данном этапе сервер OpenVPN можно считать настроенным и готовым к бою.

css.php