Настройка EAP + Freeradius + FreeIPA для авторизации на WiFi

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

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

Очень часто, в качестве реализации LDAP используется Active Directory. С данным сервером не возникаем много сложностей, так как существует огромная практика у администраторов и, как следствие, множество рабочей документации. Мы же рассмотрим другую реализацию — FreeIPA, при работе с которой есть нюансы. В моих примерах команды выполняются на Rocky Linux (CentOS / Red Hat).

Предполагается, что у нас уже установлены следующие сервисы:

Наша инструкция будет разбита на подразделы:

Как будет выполняться настройка

Для выполнения задачи по настройке авторизации на WiFi через RADIUS сервер может использоваться множество решений. Какие-то из них более удобные в настройке, какие-то в эксплуатации. В данной инструкции сделан упор на максимальное удобство со стороны пользователя.

Фреймворк аутентификации EAP включает в себя множество протоколов. Одним из самых популярных является PEAP (EAP-TLS) — его поддержка реализована в большинстве устройств. Данный протокол, в свою очередь, работает совместно с такими методами аутентификации, как EAP-MSCHAPv2 и EAP-GTС.

Для работы с FreeIPA нам подойдет MSCHAP, но для его использования потребуется небольшое расширение схемы и добавление поля хранения хэша пароля. Сервер RADIUS (в нашем случае, Freeradius) будет его вытаскивать и сравнивать с хэшем введенного пароля.

Перейдем к реализации задуманного.

Настройка FreeIPA

На стороне сервера LDAP нам необходимо:

  1. Добавить атрибут ipaNTHash для хранения в нем хэша пароля
  2. Создать роли и привилегии для возможности читать данный атрибут.
  3. Создать сервисный аккаунт и предоставить ему права на чтение атрибута ipaNTHash.

В нашем примере будет использоваться домен dmosk.local.

Настройка атрибута ipaNTHash

Начнем с установки пакета:

yum install freeipa-server-trust-ad

Данный пакет необходим для запуска утилиты ipa-adtrust-install, с помощью которой мы создаем атрибут ipaNTHash:

ipa-adtrust-install --add-sids

Команда запросит пароль для пользователя admin:

admin password:

После мы получим предупреждение о существовании файла smb.conf и о том, что команда ipa-adtrust-install его заменит. Соглашаемся на изменения:

WARNING: The smb.conf already exists. Running ipa-adtrust-install will break your existing samba configuration.

Do you wish to continue? [no]: yes

На все последующие вопросы можно ответить по умолчанию, нажав Enter. Ждем окончания операции. Теперь при смене пароля или создании нового пользователя, у учетной записи будет добавлен атрибут ipaNTHash.

Чтобы в этом убедиться нужно поменяем пароль у существующей записи:

ipa user-mod test --password

* в данном примере мы работаем с учетной записью test.

Если мы создаем новую запись, необходимо сразу после этого также поменять пароль.

Теперь проверяем, что у нашей учетной записи есть нужный нам атрибут:

ldapsearch -H ldap://localhost -x -D 'cn=Directory Manager' -W -LLL -Z '(uid=test)' ipaNTHash

* в данном примере мы обращаемся к серверу LDAP localhost и вытаскиваем данные по учетной записи test. Чтобы не получать множество данных, мы фильтруем, вытаскивая только атрибут ipaNTHash.

Система запросит пароль — вводим его от учетной записи администратора FreeIPA. Мы должны получить, примерно, такой ответ:

Enter LDAP Password: 
dn: uid=test,cn=users,cn=compat,dc=dmosk,dc=local

dn: uid=test,cn=users,cn=accounts,dc=dmosk,dc=local
ipaNTHash:: b1hf+P9igLWcziUv21AOuA==

* где b1hf+P9igLWcziUv21AOuA== — хэш пароля.

Создание ролей и привилегий

Нам необходимо создать настройки безопасности для возможности предоставить доступ к атрибуту ipaNTHash. Разберемся с этим по шагам.

1. Создаем разрешение:

ipa permission-add 'ipaNTHash reader' --attrs=ipaNTHash --type=user --right=read

* где:

  • ipaNTHash reader — имя разрешения.
  • attrs — атрибут, для которого действует разрешение.
  • type — тип учетной записи, для которой будет применимо разрешение.
  • right — уровень прав.

2. Добавляем привилегию:

ipa privilege-add 'Radius services' --desc='Radius privileges'

* данной командой мы создадим привилегию с именем Radius services.

3. Добавим созданное разрешение в созданную привилегию:

ipa privilege-add-permission 'Radius services' --permissions='ipaNTHash reader'

4. Создадим роль:

ipa role-add 'Radius server' --desc='Radius server role'

* где Radius server — имя роли.

5. Добавим в созданную роль созданную привилегию:

ipa role-add-privilege --privileges='Radius services' 'Radius server'

Итого, мы получили роль Radius server, в которую входит привилегия Radius services, в которую входит разрешение ipaNTHash reader для чтения атрибута ipaNTHash.

Идем дальше.

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

Создадим пользователя, с помощью которого Freeradius будет подключаться к FreeIPA и получать доступ к атрибуту ipaNTHash.

Вводим:

ipa service-add 'freeradius/ipa-server.dmosk.local'

* где freeradius — имя сервисного аккаунта; ipa-server.dmosk.local — FQDN-имя сервера IPA.

Создаем keytab-файл:

ipa-getkeytab -p 'freeradius/ipa-server.dmosk.local' -s ipa-server.dmosk.local -k /root/radiusd.keytab

* в данном примере файл будет сохранен по пути /root/radiusd.keytab.

Проверим файл:

kinit -t /root/radiusd.keytab -k freeradius/ipa-server.dmosk.local

klist

Мы должны увидеть что-то на подобие:

Default principal: freeradius/ipa-server.dmosk.local@DMOSK.LOCAL

Valid starting       Expires              Service principal
08/23/2021 12:48:14  08/24/2021 12:48:14  krbtgt/DMOSK.LOCAL@DMOSK.LOCAL

Также выполним who a mi в LDAP:

ldapwhoami -Y GSSAPI

Ответ должен быть на подобие:

SASL/GSSAPI authentication started
SASL username: freeradius/ipa-server.dmosk.local@DMOSK.LOCAL
SASL SSF: 256
SASL data security layer installed.
dn: krbprincipalname=freeradius/ipa-server.dmosk.local@dmosk.local,cn=services,cn=accounts,dc=dmosk,dc=local

freeradius/ipa-server.dmosk.local@dmosk.local,cn=services,cn=accounts,dc=dmosk,dc=local — полный путь учетной записи в LDAP. Он нам понадобиться для дальнейшей настройки.

Теперь зададим пароль для сервисного аккаунта. Для этого создаем ldif файл:

vi freeradius.ldif

dn: krbprincipalname=freeradius/ipa-server.dmosk.local@dmosk.local,cn=services,cn=accounts,dc=dmosk,dc=local
changetype: modify
add: objectClass
objectClass: simpleSecurityObject
-
add: userPassword
userPassword: my_password

* где krbprincipalname указывает на полный путь к сервисной учетной записи, а userPassword — пароль, который мы хотим ей задать.

Применяем настройки из файла:

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

Система запросит пароль для учетной записи администратора FreeIPA — после мы должны увидеть сообщение:

modifying entry "krbprincipalname=freeradius/ipa-server.dmosk.local@dmosk.local,cn=services,cn=accounts,dc=dmosk,dc=local"

Проверим, выполнив запрос:

ldapwhoami -Z -D 'krbprincipalname=freeradius/ipa-server.dmosk.local@dmosk.local,cn=services,cn=accounts,dc=dmosk,dc=local' -W

Система от нас потребует пароль для сервисной учетной записи (в нашем примере, my_password) — вводим его. Мы должны получить что-то на подобие:

dn: krbprincipalname=freeradius/ipa-server.dmosk.local@dmosk.local,cn=services,cn=accounts,dc=dmosk,dc=local

Снова получаем билет для привилегированного пользователя:

kinit admin

Добавляем сервисный аккаунт в роль Radius server:

ipa role-add-member --services='freeradius/ipa-server.dmosk.local' 'Radius server'

С настройкой FreeIPA мы закончили и можем переходить к настройке Freeradius.

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

Устанавливаем дополнение к Freeradius для работы с ldap:

yum install freeradius-ldap

Активируем установленный модуль:

ln -s /etc/raddb/mods-available/ldap /etc/raddb/mods-enabled/ldap

Открываем на редактирование файл ldap:

vi /etc/raddb/mods-available/ldap

Внесем некоторые изменения в настройки конфигурации:

ldap {

    ...

    server = 'ldap://ipa-server.dmosk.local'

    ...

    identity = 'krbprincipalname=freeradius/ipa-server.dmosk.local@dmosk.local,cn=services,cn=accounts,dc=dmosk,dc=local'
    password = my_password

    ...

    base_dn = 'cn=users,cn=accounts,dc=dmosk,dc=local'

    ...
    
    update {
        ...
        control:NT-Password := 'ipaNTHash'
        ...
    }
    
    ...
}

* где:

  • server — перечисление наших серверов FreeIPA. Если их несколько, создаем несколько строчек.
  • identity — путь до учетной записи пользователя, под которой мы будем подключаться к Freeradius. 
  • password — пароль для учетной записи, которую мы используем в опции identity.
  • base_dn — базовый путь в ldap для поиска объектов.
  • control:NT-Password — атрибут, в котором Freeradius должен найти пароль пользователя.

Настраиваем модуль EAP:

vi /etc/raddb/mods-available/eap

Достаточно внести изменение в одной строке:

default_eap_type = mschapv2

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

systemctl restart radiusd

Для проверки устанавливаем утилиту freeradius-utils:

yum install freeradius-utils

И вводим команду:

radtest -t mschap test test12345 localhost:1812 0 testing123

* где test и test12345 — логин и пароль для учетной записи во FreeIPA. Именно для нее в данной инструкции выше был создан хэш пароля.

Мы должны увидеть что-то на подобие:

Sent Access-Request Id 21 from 0.0.0.0:41315 to 127.0.0.1:1812 length 130
    User-Name = "test"
    MS-CHAP-Password = "test12345"
    NAS-IP-Address = 192.168.0.15
    NAS-Port = 0
    Message-Authenticator = 0x00
    Cleartext-Password = "test12345"
    MS-CHAP-Challenge = 0x6b2080f016c3f741
    MS-CHAP-Response = 0x00010000000000000000000000000000000000000000000000002d6f06ec5b2599ccb515706c9ec15e0fbc7b026f79a08418
Received Access-Accept Id 21 from 127.0.0.1:1812 to 127.0.0.1:41315 length 84
    MS-CHAP-MPPE-Keys = 0x0000000000000000cbbed686042e794f17cda4b9c54f3487
    MS-MPPE-Encryption-Policy = Encryption-Allowed
    MS-MPPE-Encryption-Types = RC4-40or128-bit-Allowed

Проверка прошла успешно.

Что дальше

Описание настройки WiFi не входит в рамки данной инструкции. В двух словах, выполняем следующие шаги:

  1. На WiFi контроллере или точке доступа указываем тип проверки подлинности с использованием RADIUS. В качестве последнего указываем его IP-адрес, а также парольную фразу, которую планируем использовать для проверки подлинности.
  2. На Freeradius в конфигурационном файле clients.conf создаем раздел с указанием IP-адреса устройства, с которого будет отправляться запрос на проверку подлинности, также указываем парольную фразу.
  3. Подключаемся к WiFi с использованием учетных данных, хранимых во FreeIPA.

Возможные проблемы

Для диагностики проблем, удобнее всего запускать freeradius в режиме дебага. Для этого сначала остановим его:

systemctl stop radiusd

После запускаем радиус командой:

radiusd -X

После проведения диагностики не забываем снова запустить сервис:

systemctl start radiusd

Рассмотрим проблему, с которой столкнулся я.

eap_peap: ERROR: TLS Alert write:fatal:protocol version

При подключении некоторых устройств мы можем получить ошибку:

(18) eap_peap: ERROR: TLS Alert write:fatal:protocol version
tls: TLS_accept: Error in error
(18) eap_peap: ERROR: Failed in __FUNCTION__ (SSL_read): error:14209102:SSL routines:tls_early_post_process_client_hello:unsupported protocol
(18) eap_peap: ERROR: System call (I/O) error (-1)
(18) eap_peap: ERROR: TLS receive handshake failed during operation
(18) eap_peap: ERROR: [eaptls process] = fail
(18) eap: ERROR: Failed continuing EAP PEAP (25) session.  EAP sub-module failed

Причина: по умолчанию, eap настроен на использование TLS версии 1.2. Если устройство, с которого мы подключаемся использует версию протокола выше или ниже, то мы получим ошибку.

Решение: в настройках RADIUS-сервера есть возможность указать, какие версии TLS должны поддерживаться. Открываем конфигурационный файл:

vi /etc/raddb/mods-available/eap

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

    tls-config tls-common {
        ...
    #   disable_tlsv1_2 = no
        disable_tlsv1_1 = no
        disable_tlsv1 = no
        ...
        tls_min_version = "1.0"
        tls_max_version = "1.3"
        ...
    }

* в данном примере указаны не самые лучшие параметры с точки зрения безопасности. Лучше всего отказаться от TLS 1.0 и 1.1. — для этого, как правило, необходимо установить обновления на клиентском устройстве.

Перезагружаем freeradius:

systemctl restart radiusd

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

Да            Нет