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

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

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

Рассмотрим отдельной инструкцией настройку аутентификации на OpenVPN через LDAP на базе FreeIPA. Конфигурирование будет выполнено на CentOS 7.

Предполагается, что у нас уже установлены серверы OpenVPN и FreeIPA.

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

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

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

kinit admin

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

ipa service-add openvpn/oserver.dmosk.local

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

vi openvpn-passwd.ldif

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

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

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

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

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

ipa service-mod openvpn/oserver.dmosk.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

 Приводим его к, примерно, следующему виду:

<LDAP>
    ...
    URL             "ldap://ipa-server.dmosk.local ldap://ipa-server2.dmosk.local"
    ...
    BindDN          krbprincipalname=openvpn/oserver.dmosk.local@dmosk.local,cn=services,cn=accounts,dc=dmosk,dc=local
    ...
    Password        openvpn
    ...
    TLSEnable       no
    ...
</LDAP>

<Authorization>
    ...
    BaseDN          "cn=users,cn=accounts,dc=dmosk,dc=local"
    ...
    SearchFilter    "(&(uid=%u)(objectClass=person))"
    ...
#    <Group>
#        BaseDN          "cn=groups,cn=accounts,dc=dmosk,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 и приводим их к виду:

    ...
    <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. В данном разделе пройдемся по данному вопросу поверхностно.

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

yum install freeipa-client

Вводим

ipa-client-install --mkhomedir

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

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

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

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

Ранее мы создали служебную учетную запись openvpn/oserver.dmosk.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

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

<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

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

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

Да            Нет