Используемые термины: 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) будет его вытаскивать и сравнивать с хэшем введенного пароля.
Перейдем к реализации задуманного.
На стороне сервера LDAP нам необходимо:
В нашем примере будет использоваться домен admins24.local.
Начнем с установки пакета:
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=admins24,dc=local
dn: uid=test,cn=users,cn=accounts,dc=admins24,dc=localipaNTHash:: b1hf+P9igLWcziUv21AOuA==
* где b1hf+P9igLWcziUv21AOuA== — хэш пароля.
Нам необходимо создать настройки безопасности для возможности предоставить доступ к атрибуту ipaNTHash. Разберемся с этим по шагам.
1. Создаем разрешение:
ipa permission-add ‘ipaNTHash reader’ —attrs=ipaNTHash —type=user —right=read
* где:
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.admins24.local’
* где freeradius — имя сервисного аккаунта; ipa-server.admins24.local — FQDN-имя сервера IPA.
Создаем keytab-файл:
ipa-getkeytab -p ‘freeradius/ipa-server.admins24.local’ -s ipa-server.admins24.local -k /root/radiusd.keytab
* в данном примере файл будет сохранен по пути /root/radiusd.keytab.
Проверим файл:
kinit -t /root/radiusd.keytab -k freeradius/ipa-server.admins24.local
Мы должны увидеть что-то на подобие:
Default principal: freeradius/[email protected]
Valid starting Expires Service principal08/23/2021 12:48:14 08/24/2021 12:48:14 krbtgt/[email protected]
Также выполним who a mi в LDAP:
ldapwhoami -Y GSSAPI
Ответ должен быть на подобие:
SASL/GSSAPI authentication startedSASL username: freeradius/[email protected]SASL SSF: 256SASL data security layer installed.dn: krbprincipalname=freeradius/[email protected],cn=services,cn=accounts,dc=admins24,dc=local
* freeradius/[email protected],cn=services,cn=accounts,dc=admins24,dc=local — полный путь учетной записи в LDAP. Он нам понадобиться для дальнейшей настройки.
Теперь зададим пароль для сервисного аккаунта. Для этого создаем ldif файл:
vi freeradius.ldif
dn: krbprincipalname=freeradius/[email protected],cn=services,cn=accounts,dc=admins24,dc=localchangetype: modifyadd: objectClassobjectClass: simpleSecurityObject—add: userPassworduserPassword: my_password
* где krbprincipalname указывает на полный путь к сервисной учетной записи, а userPassword — пароль, который мы хотим ей задать.
Применяем настройки из файла:
ldapmodify -f ./freeradius.ldif -D ‘cn=Directory Manager’ -W -H ldap://localhost -Z
Система запросит пароль для учетной записи администратора FreeIPA — после мы должны увидеть сообщение:
modifying entry «krbprincipalname=freeradius/[email protected],cn=services,cn=accounts,dc=admins24,dc=local»
Проверим, выполнив запрос:
ldapwhoami -Z -D ‘krbprincipalname=freeradius/[email protected],cn=services,cn=accounts,dc=admins24,dc=local’ -W
Система от нас потребует пароль для сервисной учетной записи (в нашем примере, my_password) — вводим его. Мы должны получить что-то на подобие:
dn: krbprincipalname=freeradius/[email protected],cn=services,cn=accounts,dc=admins24,dc=local
Снова получаем билет для привилегированного пользователя:
kinit admin
Добавляем сервисный аккаунт в роль Radius server:
ipa role-add-member —services=’freeradius/ipa-server.admins24.local’ ‘Radius server’
С настройкой FreeIPA мы закончили и можем переходить к настройке Freeradius.
Устанавливаем дополнение к 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.admins24.local’
identity = ‘krbprincipalname=freeradius/[email protected],cn=services,cn=accounts,dc=admins24,dc=local’ password = my_password
base_dn = ‘cn=users,cn=accounts,dc=admins24,dc=local’
… update { … control:NT-Password := ‘ipaNTHash’ … } …}
Настраиваем модуль 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 = 0x00010000000000000000000000000000000000000000000000002d6f06ec5b2599ccb515706c9ec15e0fbc7b026f79a08418Received 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 не входит в рамки данной инструкции. В двух словах, выполняем следующие шаги:
Для диагностики проблем, удобнее всего запускать freeradius в режиме дебага. Для этого сначала остановим его:
systemctl stop radiusd
После запускаем радиус командой:
radiusd -X
После проведения диагностики не забываем снова запустить сервис:
systemctl start radiusd
Рассмотрим проблему, с которой столкнулся я.
При подключении некоторых устройств мы можем получить ошибку:
(18) eap_peap: ERROR: TLS Alert write:fatal:protocol versiontls: 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 должны поддерживаться. Открываем конфигурационный файл:
Приводим к следующему виду опции:
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:
Продолжая использовать данный сайт вы принимаете политику конфиденциальности и cookies