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

Thank you for reading this post, don't forget to subscribe!

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

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

  • Freeradius.
  • FreeIPA.

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

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

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

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

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

Настройка FreeIPA

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

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

В нашем при­ме­ре будет исполь­зо­вать­ся домен test.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. Мы долж­ны полу­чить, при­мер­но, такой ответ:

* где 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.test.local'

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

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

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

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

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

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

klist

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

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

ldapwhoami -Y GSSAPI

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

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

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

vi freeradius.ldif

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

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

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

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

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

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

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

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

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

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

kinit admin

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

ipa role-add-member --services='freeradius/ipa-server.test.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

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

* где:

  • 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. Имен­но для нее в дан­ной инструк­ции выше был создан хэш пароля.

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

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

Что дальше

Опи­са­ние настрой­ки 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

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

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

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

vi /etc/raddb/mods-available/eap

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

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

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

systemctl restart radiusd