Рассмотрим отдельной инструкцией настройку аутентификации на OpenVPN через LDAP на базе FreeIPA. Конфигурирование будет выполнено на CentOS 7.
Предполагается, что у нас уже установлены серверы OpenVPN и FreeIPA.
Настройка на FreeIPA
На сервере аутентификации мы должны создать учетную запись, с помощью которой мы будем подключаться по ldap и выполнять поиск учетных записей. Мы создадим сервисный аккаунт.
Заходим по SSH на сервер FreeIPA и авторизуемся под администратором:
kinit admin
Создадим сервисную учетную запись командой:
ipa service-add openvpn/oserver.test.local
Чтобы создать пароль для сервисного аккаунта, создаем файл ldif:
vi openvpn-passwd.ldif
1 2 3 4 5 6 7 |
dn: krbprincipalname=openvpn/oserver.test.local@test.local,cn=services,cn=accounts,dc=test,dc=local changetype: modify add: objectClass objectClass: simpleSecurityObject - add: userPassword userPassword: openvpn |
* в данном примере мы создаем атрибут userPassword и задаем ему значение openvpn (наш пароль) для пользователя openvpn/oserver.test.local.
Применяем изменения для нашего каталога:
ldapmodify -f ./openvpn-passwd.ldif -D 'cn=Directory Manager' -W -H ldap://localhost -Z
Зададим позднее время для истечение срока действия пароля:
ipa service-mod openvpn/oserver.test.local --setattr=krbPasswordExpiration=20300317010000Z
* в данном примере до 2030 года.
Удаляем тикет для авторизации на ldap под администратором:
kdestroy
Настройка OpenVPN
Нам нужно установить модуль для аутентификации на OpenVPN через LDAP. Вводим команды:
yum install epel-release
yum install openvpn-auth-ldap
Редактируем конфигурационный файл openvpn (добавляем строку):
vi /etc/openvpn/server.conf
plugin /usr/lib64/openvpn/plugin/lib/openvpn-auth-ldap.so /etc/openvpn/auth/ldap.conf
Открываем конфигурационный файл ldap.conf:
vi /etc/openvpn/auth/ldap.conf
Приводим его к, примерно, следующему виду:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<LDAP> ... URL "ldap://ipa-server.test.local ldap://ipa-server2.test.local" ... BindDN krbprincipalname=openvpn/oserver.test.local@test.local,cn=services,cn=accounts,dc=test,dc=local ... Password openvpn ... TLSEnable no ... </LDAP> <Authorization> ... BaseDN "cn=users,cn=accounts,dc=test,dc=local" ... SearchFilter "(&(uid=%u)(objectClass=person))" ... # <Group> # BaseDN "cn=groups,cn=accounts,dc=test,dc=local" # SearchFilter "(|(cn=admins)(cn=openvpn))" # … # </Group> </Authorization> |
* обратите внимание, что мы настроили подключение без шифрования — настройку TLS выполним ниже. Также мы закомментировали настройки аутентификации на основе групп — также, рассмотрим данную конфигурацию ниже.
** где:
- URL — адреса контроллеров домена. Задаются через пробел. Если адресов несколько, значение указываем в кавычках.
- BindDN — учетная запись для связывания с контроллером домена. Можно указать обычную учетную запись либо принципал.
- Password — пароль для учетной записи, которую мы указали в BindDN.
- TLSEnable — использование шифрования между OpenVPN и FreeIPA. На данном этапе без шифрования.
- Authorization BaseDN — корень в домене, с которого начнется поиск учетной записи для аутентификации.
- Authorization SearchFilter — фильтр по значению некоторых атрибутов для поиска объектов в LDAP. В данном примере объект должен иметь значение uid, которое равно запрашиваемому логину и objectClass должен быть person.
Перезапускаем сервис:
systemctl restart openvpn@server
На этом настройка сервера завершена. Переходим к проверке.
Настройка клиента
На клиенте нам нужно в конфигурационный файл ovpn добавить всего одну строку:
…
auth-user-pass
Теперь, при попытке подключиться к VPN, программа будет требовать ввода логина и пароля — вводим данные для авторизации через ldap.
Аутентификация на основе групп безопасности
Выше мы закомментировали настройки авторизации на основе групп. Давайте рассмотрим, как их использовать. Для этого нужно выполнить настройки на стороне VPN и LDAP.
Настройка OpenVPN
Открываем файл:
vi /etc/openvpn/auth/ldap.conf
Снимаем комментарии с настроек Group и приводим их к виду:
1 2 3 4 5 6 7 |
... <Group> BaseDN "cn=groups,cn=accounts,dc=test,dc=local" SearchFilter "(|(cn=admins)(cn=openvpn))" ... </Group> </Authorization> |
* где:
- Group BaseDN — корень в домене, с которого начнется поиск групп.
- Group SearchFilter — фильтр для поиска группы безопасности. В нашем примере, она должна входить либо в группу admins, либо openvpn.
Перезапускаем сервис:
systemctl restart openvpn@server
FreeIPA
На стороне сервера LDAP нужно создать группу безопасности для разрешения подключения (в нашем примере, это openvpn) и добавить в нее нужных пользователей.
Заходим по SSH на сервер FreeIPA и авторизуемся под администратором:
kinit admin
Создадим группу командой:
ipa group-add --desc='Allow VPN-connections' openvpn
Добавим в данную группу пользователей, которым хотим разрешить подключение, например:
ipa group-add-member openvpn --users=admin,test
* в данном примере мы добавляем пользователей admin и test.
Готово. Пробуем подключиться.
Настройка TLS между OpenVPN и FreeIPA
Для работы по зашифрованному каналу между VPN и LDAP необходимо, чтобы наш сервер OpenVPN был членом домена. После нужно запросить сертификат для служебной учетной записи и прописать его в конфигурационном файле ldap.
Присоединение к домену
Подробнее о процессе присоединения компьютера к FreeIPA рассказано в инструкции Установка и использование FreeIPA на CentOS. В данном разделе пройдемся по данному вопросу поверхностно.
Устанавливаем клиентскую часть:
yum install freeipa-client
Вводим
ipa-client-install --mkhomedir
Система задаст несколько вопросов, после начнется процесс присоединения к домену. В итоге, мы должны увидеть:
…
Client configuration complete.
The ipa-client-install command was successful
Компьютер присоединен к домену на базе FreeIPA.
Запрос сертификата
Ранее мы создали служебную учетную запись openvpn/oserver.test.local — создадим для нее сертификат. Данные действия нужно выполнить на сервере VPN.
Итак, заходим по SSH на сервере OpenVPN и авторизовываемся под админом на сервере FreeIPA:
kinit admin
Создаем запрос на получение сертификата:
ipa-getcert request -K openvpn/`hostname` -k /etc/pki/tls/certs/freeipa.key -f /etc/pki/tls/certs/freeipa.crt -I openvpn
Запрос должен обработаться быстро. Посмотреть статус можно командой:
ipa-getcert list
В каталоге:
ls /etc/pki/tls/certs
… мы должны увидеть 2 новых файла — freeipa.key и freeipa.crt.
Закрываем сессию
kdestroy
Настройка OpenVPN
Откроем на редактирование конфигурационный файл ldap.conf:
vi /etc/openvpn/auth/ldap.conf
Внесем следующие изменения:
1 2 3 4 5 6 7 8 9 10 |
<LDAP> ... TLSEnable yes ... TLSCACertFile /etc/ipa/ca.crt ... TLSCertFile /etc/pki/tls/certs/freeipa.crt TLSKeyFile /etc/pki/tls/certs/freeipa.key ... </LDAP> |
* где:
- TLSEnable — использование шифрования между OpenVPN и FreeIPA. Меняем значение на yes для включения.
- TLSCACertFile — путь до ключа центра сертификации. Задаем путь до ca от FreeIPA. Он должен был появиться после присоединения нашего компьютера к домену.
- TLSCertFile/TLSKeyFile — открытый и закрытый ключи для сервисной учетной записи.
Перезапускаем сервис сервера vpn:
systemctl restart openvpn@server
Настройка выполнена. Пробуем подключиться клиентом.