Настройка OpenVPN + FreeIPA (LDAP) на Ubuntu

Обновлено и опубликовано Опубликовано:

Используемые термины: OpenVPNFreeIPA, Ubuntu.

Рассмотрим отдельной инструкцией настройку аутентификации на OpenVPN через LDAP на базе FreeIPA. Конфигурирование будет выполнено на Ubuntu (проверено для версий 20 и 22).

Предполагается, что у нас уже установлены серверы OpenVPN и FreeIPA. Ссылки на некоторые полезные инструкции будут в конце данной инструкции.

Настройка на FreeIPA

На сервере аутентификации необходимо создать учетную запись, с помощью которой мы будем подключаться по ldap и выполнять поиск учетных записей.

Данный аккаунт можно создать с помощью веб интерфейса FreeIPA или командной строки. Мы рассмотрим второй вариант.

Заходим по SSH на сервер FreeIPA и авторизуемся под администратором:

kinit admin

Создадим сервисную учетную запись командой:

ipa service-add openvpn/srv-vpn-01.dmosk.local --skip-host-check --force

* в данном примере мы создаем сервисную учетную запись для хоста srv-vpn-01.dmosk.local. Опции --skip-host-check и --force нужны на тот случай, если данного хоста нет в службе каталогов.

Чтобы создать пароль для сервисного аккаунта, создаем файл ldif:

vi openvpn-passwd.ldif

dn: krbprincipalname=openvpn/srv-vpn-01.dmosk.local@dmosk.local,cn=services,cn=accounts,dc=dmosk,dc=local
changetype: modify
add: objectClass
objectClass: simpleSecurityObject
-
add: userPassword
userPassword: openvpn123

* в данном примере мы создаем атрибут userPassword и задаем ему значение openvpn123 (наш пароль) для аккаунта openvpn/srv-vpn-01.dmosk.local.

Применяем изменения для нашего каталога:

ldapmodify -f ./openvpn-passwd.ldif -D 'cn=Directory Manager' -W -H ldap://localhost -Z

Зададим позднее время для истечение срока действия пароля:

ipa service-mod openvpn/srv-vpn-01.dmosk.local --setattr=krbPasswordExpiration=`echo $(($(date +%Y)+10))$(date +%m%d%H%M%SZ)`

* в данном примере 10 лет.

Удаляем тикет для авторизации на ldap под администратором:

kdestroy

Настройка OpenVPN

Нам нужно установить модуль для аутентификации на OpenVPN через LDAP. Вводим команды:

apt update

apt install openvpn-auth-ldap

Редактируем конфигурационный файл openvpn (добавляем строку):

vi /etc/openvpn/server.conf

plugin /usr/lib/openvpn/openvpn-auth-ldap.so /etc/openvpn/ldap.conf

Создаем конфигурационный файл ldap.conf:

vi /etc/openvpn/ldap.conf

<LDAP>
    URL             "ldap://ipa-server1.dmosk.local ldap://ipa-server2.dmosk.local"
    BindDN          krbprincipalname=openvpn/srv-vpn-01.dmosk.local@dmosk.local,cn=services,cn=accounts,dc=dmosk,dc=local
    Password        openvpn123
    Timeout         15
    FollowReferrals yes
    TLSEnable       no
</LDAP>

<Authorization>
    BaseDN          "cn=users,cn=accounts,dc=dmosk,dc=local"
    SearchFilter    "(&(uid=%u)(objectClass=person)(!(nsaccountlock=TRUE)))"
    RequireGroup    false
</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/ldap.conf

Добавляем секцию Group в Authorization:

<Authorization>
    <Group>
        BaseDN          "cn=groups,cn=accounts,dc=dmosk,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,dmosk

* в данном примере мы добавляем пользователей admin и dmosk.

Готово. Пробуем подключиться.

Настройка TLS между OpenVPN и FreeIPA

Для работы по зашифрованному каналу между VPN и LDAP необходимо, чтобы наш сервер OpenVPN был членом домена. После нужно запросить сертификат для служебной учетной записи и прописать его в конфигурационном файле ldap.

Присоединение к домену

Подробнее о процессе присоединения компьютера к FreeIPA рассказано в инструкции Установка и использование FreeIPA на CentOS. В данном разделе пройдемся по данному вопросу поверхностно.

Устанавливаем клиентскую часть:

apt install freeipa-client

Вводим

ipa-client-install --mkhomedir

Система задаст несколько вопросов, после начнется процесс присоединения к домену. В итоге, мы должны увидеть:

...
Client configuration complete.
The ipa-client-install command was successful

Компьютер присоединен к домену на базе FreeIPA.

Запрос сертификата

Мы создадим запрос на сертификат к службе сертификации FreeIPA. Данные действия нужно выполнить на сервере VPN.

Заходим по SSH на сервере OpenVPN и cоздаем запрос на получение сертификата:

ipa-getcert request -k /etc/ssl/freeipa.key -f /etc/ssl/freeipa.crt -I openvpn

Запрос должен обработаться быстро. Посмотреть статус можно командой:

ipa-getcert list

В каталоге:

ls /etc/ssl

... мы должны увидеть 2 новых файла — freeipa.key и freeipa.crt.

Настройка OpenVPN

Откроем на редактирование конфигурационный файл ldap.conf:

vi /etc/openvpn/ldap.conf

Внесем следующие изменения:

<LDAP>
    ...
    TLSEnable       yes
    TLSCACertFile   /etc/ipa/ca.crt
    TLSCertFile     /etc/ssl/freeipa.crt
    TLSKeyFile      /etc/ssl/freeipa.key
</LDAP>

* где:

  • TLSEnable — использование шифрования между OpenVPN и FreeIPA. Меняем значение на yes для включения.
  • TLSCACertFile — путь до ключа центра сертификации. Задаем путь до ca от FreeIPA. Он должен был появиться после присоединения нашего компьютера к домену.
  • TLSCertFile/TLSKeyFile — открытый и закрытый ключи для сервисной учетной записи.

Перезапускаем сервис сервера vpn:

systemctl restart openvpn@server

Настройка выполнена. Пробуем подключиться клиентом.

Читайте также

Другие инструкции, которые могут быть полезными:

1. Настройка OpenVPN клиента.

2. Настройка OpenVPN + FreeIPA (LDAP) на CentOS 7.

3. Установка и использование FreeIPA на Rocky Linux или CentOS.

4. Как настроить OpenVPN сервер и включить аутентификацию через LDAP (Active Directory).

# Ubuntu # Безопасность # Серверы # Сети
Дмитрий Моск — частный мастер
Была ли полезна вам эта инструкция?

Да            Нет