- Настройка EAP + Freeradius + FreeIPA для авторизации на WiFi
- Как будет выполняться настройка
- Настройка FreeIPA
- Настройка атрибута ipaNTHash
- Создание ролей и привилегий
- Создание и настройка сервисной учетной записи
- Настройка сервера RADIUS
- Что дальше
- Возможные проблемы
- eap_peap: ERROR: TLS Alert write:fatal:protocol version
Настройка EAP + Freeradius + FreeIPA для авторизации на WiFi
Опубликовано: 23.08.2021
Наша инструкция будет разбита на подразделы:
Как будет выполняться настройка
Для выполнения задачи по настройке авторизации на WiFi через RADIUS сервер может использоваться множество решений. Какие-то из них более удобные в настройке, какие-то в эксплуатации. В данной инструкции сделан упор на максимальное удобство со стороны пользователя.
Фреймворк аутентификации EAP включает в себя множество протоколов. Одним из самых популярных является PEAP (EAP-TLS) — его поддержка реализована в большинстве устройств. Данный протокол, в свою очередь, работает совместно с такими методами аутентификации, как EAP-MSCHAPv2 и EAP-GTС.
Для работы с FreeIPA нам подойдет MSCHAP, но для его использования потребуется небольшое расширение схемы и добавление поля хранения хэша пароля. Сервер RADIUS (в нашем случае, Freeradius) будет его вытаскивать и сравнивать с хэшем введенного пароля.
Перейдем к реализации задуманного.
Настройка FreeIPA
На стороне сервера LDAP нам необходимо:
- Добавить атрибут ipaNTHash для хранения в нем хэша пароля
- Создать роли и привилегии для возможности читать данный атрибут.
- Создать сервисный аккаунт и предоставить ему права на чтение атрибута ipaNTHash.
В нашем примере будет использоваться домен dmosk.local.
Настройка атрибута ipaNTHash
Начнем с установки пакета:
yum install freeipa-server-trust-ad
Данный пакет необходим для запуска утилиты ipa-adtrust-install, с помощью которой мы создаем атрибут ipaNTHash:
Команда запросит пароль для пользователя admin:
После мы получим предупреждение о существовании файла 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. Разберемся с этим по шагам.
ipa permission-add ‘ipaNTHash reader’ —attrs=ipaNTHash —type=user —right=read
- ipaNTHash reader — имя разрешения.
- attrs — атрибут, для которого действует разрешение.
- type — тип учетной записи, для которой будет применимо разрешение.
- right — уровень прав.
ipa privilege-add ‘Radius services’ —desc=’Radius privileges’
* данной командой мы создадим привилегию с именем Radius services.
3. Добавим созданное разрешение в созданную привилегию:
ipa privilege-add-permission ‘Radius services’ —permissions=’ipaNTHash reader’
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.
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
Мы должны увидеть что-то на подобие:
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:
Ответ должен быть на подобие:
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 файл:
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) — вводим его. Мы должны получить что-то на подобие:
Снова получаем билет для привилегированного пользователя:
Добавляем сервисный аккаунт в роль 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:
Внесем некоторые изменения в настройки конфигурации:
identity = ‘krbprincipalname=freeradius/ipa-server.dmosk.local@dmosk.local,cn=services,cn=accounts,dc=dmosk,dc=local’
password = my_password
update .
control:NT-Password := ‘ipaNTHash’
.
>
- server — перечисление наших серверов FreeIPA. Если их несколько, создаем несколько строчек.
- identity — путь до учетной записи пользователя, под которой мы будем подключаться к Freeradius.
- password — пароль для учетной записи, которую мы используем в опции identity.
- base_dn — базовый путь в ldap для поиска объектов.
- control:NT-Password — атрибут, в котором Freeradius должен найти пароль пользователя.
Достаточно внести изменение в одной строке:
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 не входит в рамки данной инструкции. В двух словах, выполняем следующие шаги:
- На WiFi контроллере или точке доступа указываем тип проверки подлинности с использованием RADIUS. В качестве последнего указываем его IP-адрес, а также парольную фразу, которую планируем использовать для проверки подлинности.
- На Freeradius в конфигурационном файле clients.conf создаем раздел с указанием IP-адреса устройства, с которого будет отправляться запрос на проверку подлинности, также указываем парольную фразу.
- Подключаемся к WiFi с использованием учетных данных, хранимых во FreeIPA.
Возможные проблемы
Для диагностики проблем, удобнее всего запускать freeradius в режиме дебага. Для этого сначала остановим его:
После запускаем радиус командой:
После проведения диагностики не забываем снова запустить сервис:
Рассмотрим проблему, с которой столкнулся я.
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 должны поддерживаться. Открываем конфигурационный файл:
Приводим к следующему виду опции:
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. — для этого, как правило, необходимо установить обновления на клиентском устройстве.
systemctl restart radiusd