Настройка EAP + Freeradius + FreeIPA для авторизации на WiFi
Используемые термины: FreeIPA, FreeRADIUS.
Очень часто, в качестве реализации LDAP используется Active Directory. С данным сервером не возникаем много сложностей, так как существует огромная практика у администраторов и, как следствие, множество рабочей документации. Мы же рассмотрим другую реализацию — FreeIPA, при работе с которой есть нюансы. В моих примерах команды выполняются на Rocky Linux (CentOS / Red Hat).
Предполагается, что у нас уже установлены следующие сервисы:
- Freeradius. Пример установки на Linux CentOS.
- FreeIPA. Инструкция по установке.
Наша инструкция будет разбита на подразделы:
План действий
Настраиваем LDAP-сервер FreeIPA
Добавление атрибута ipaNTHash
Создание объектов безопасности
Создание сервисной учетной записи
Настройка Freeradius
Что делать дальше
Решение проблем
Как будет выполняться настройка
Для выполнения задачи по настройке авторизации на 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:
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 не входит в рамки данной инструкции. В двух словах, выполняем следующие шаги:
- На WiFi контроллере или точке доступа указываем тип проверки подлинности с использованием RADIUS. В качестве последнего указываем его IP-адрес, а также парольную фразу, которую планируем использовать для проверки подлинности.
- На Freeradius в конфигурационном файле clients.conf создаем раздел с указанием IP-адреса устройства, с которого будет отправляться запрос на проверку подлинности, также указываем парольную фразу.
- Подключаемся к 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