WiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

WiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

Вже описано деякі приклади організації корпоративного WiFi. Тут я розпишу як реалізував подібне рішення та проблеми з якими довелося зіткнутися при підключенні на різних пристроях. Будемо використовувати вже наявну LDAP із заведеними користувачами, піднімемо FreeRadius і налаштуємо WPA2-Enterprise на контролері Ubnt. Начебто все просто. Подивимося…

Небагато про методи EAP

Перш ніж приступити до виконання завдання, треба визначитися, який метод аутентифікації будемо використовувати в нашому рішенні.

З вікіпедії:

EAP – фреймворк аутентифікації, який часто використовується в бездротових мережах та з'єднаннях точка-точка. Формат був вперше описаний у RFC 3748 та оновлений у RFC 5247.
EAP використовується для вибору методу аутентифікації, передачі ключів і обробки цих ключів модулями, що підключаються, званими методами EAP. Існує безліч методів EAP, як визначених разом із самим EAP, і випущених окремими виробниками. EAP не визначає канальний рівень, він лише визначає формат повідомлень. Кожен протокол, який використовує EAP, має власний протокол інкапсуляції повідомлень EAP.

Самі методи:

  • LEAP – пропрієтарний протокол, розроблений CISCO. Знайдено вразливість. В даний час не рекомендується використовувати
  • EAP-TLS — бездротові з'єднання, що добре підтримуються серед вендорів. Є безпечним протоколом, оскільки є наступником стандартів SSL. Налаштування клієнтів досить складне. Потрібен клієнтський сертифікат, крім пароля. Підтримується у багатьох системах
  • EAP-TTLS - широко підтримується в багатьох системах, пропонує гарну безпеку, використовуючи PKI сертифікати лише на сервері аутентифікації
  • EAP-MD5 – інший відкритий стандарт. Пропонує мінімальну безпеку. Вразливий, не підтримує взаємну аутентифікацію та генерацію ключів
  • EAP-IKEv2 – заснований на Internet Key Exchange Protocol version 2. Забезпечує взаємну автентифікацію та встановлення сеансового ключа між клієнтом та сервером
  • PEAP – спільне рішення CISCO, Microsoft та RSA Security як відкритий стандарт. Широко доступний у продуктах, забезпечує дуже гарну безпеку. Схожий на EAP-TTLS, вимагаючи лише сертифікат на серверній стороні
  • PEAPv0/EAP-MSCHAPv2 – після EAP-TLS, це другий широко використовується стандарт у світі. Використовується клієнт-серверний взаємозв'язок у Microsoft, Cisco, Apple, Linux
  • PEAPv1/EAP-GTC – створений Cisco як альтернатива PEAPv0/EAP-MSCHAPv2. Не захищає автентифікаційні дані у будь-якому випадку. Не підтримуються у Windows OS
  • EAP-FAST – метод, розроблений Cisco для виправлення недоліків LEAP. Використовує Protected Access Credential (PAC). Цілком недоопрацьований

З усього цього розмаїття вибір все ж таки не великий. Від методу аутентифікації вимагалося: хороша безпека, підтримка на всіх пристроях (Windows 10, macOS, Linux, Android, iOS) і, власне, що простіше, то краще. Тому вибір ліг на EAP-TTLS у зв'язці з протоколом PAP.
Можливо виникне питання - Навіщо використовувати PAP? адже він передає паролі у відкритому вигляді?

Так все вірно. Спілкування між FreeRadius та FreeIPA буде проходити саме так. У режимі дебагу можна відстежити як надсилаються username і password. Та й нехай відправляються, тільки у вас є доступ до сервера FreeRadius.

Докладніше про роботу EAP-TTLS можна прочитати тут

FreeRADIUS

FreeRadius підніматимемо на CentOS 7.6. Тут нічого складного, ставимо звичайним способом.

yum install freeradius freeradius-utils freeradius-ldap -y

Із пакетів ставиться версія 3.0.13. Останню можна взяти на https://freeradius.org/

Після цього FreeRadius працює. Можна в /etc/raddb/users розкоментувати рядок

steve   Cleartext-Password := "testing"

Запустити на сервер у режимі дебагу

freeradius -X

І робимо тестове підключення із localhost

radtest steve testing 127.0.0.1 1812 testing123

Отримали відповідь Received Access-Accept Id 115 від 127.0.0.1:1812 to 127.0.0.1:56081 length 20, значить все добре. Йдемо далі.

Підключаємо модуль ldap.

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

І одразу його змінимо. Нам потрібно, щоб FreeRadius міг звертатися до FreeIPA

mods-enabled/ldap

ldap {
server="ldap://ldap.server.com"
port=636
start_tls=yes
identity="uid=admin,cn=users,dc=server,dc=com"
password=**********
base_dn="cn=users,dc=server,dc=com"
set_auth_type=yes
...
user {
base_dn="${..base_dn}"
filter="(uid=%{%{Stripped-User-Name}:-%{User-Name}})"
}
...

Перезапускаємо radius-сервер і перевіряємо синхронізацію користувачів LDAP:

radtest user_ldap password_ldap localhost 1812 testing123

Редагуємо eap в mods-enabled/eap
Тут додамо два екземпляри eap. Вони відрізнятимуться лише сертифікатами та ключами. Трохи нижче поясню, чому саме так

mods-enabled/eap

eap eap-client {                                                                                                                                                                                                                           default_eap_type = ttls                                                                                                                                                                                                                 timer_expire = 60                                                                                                                                                                                                                       ignore_unknown_eap_types = no                                                                                                                                                                                                          cisco_accounting_username_bug = no                                                                                                                                                                                                      max_sessions = ${max_requests}
           tls-config tls-common {
           private_key_file = ${certdir}/fisrt.key
           certificate_file = ${certdir}/first.crt
           dh_file = ${certdir}/dh
           ca_path = ${cadir}
           cipher_list = "HIGH"
           cipher_server_preference = no
           ecdh_curve = "prime256v1"
           check_crl = no
           }
                                                                                                                                                                                                                                                                                                                                                                                                                                                 
           ttls {
           tls = tls-common
           default_eap_type = md5
           copy_request_to_tunnel = no
           use_tunneled_reply = yes
           virtual_server = "inner-tunnel"
           }
}
eap eap-guest {
default_eap_type = ttls                                                                                                                                                                                                                 timer_expire = 60                                                                                                                                                                                                                       ignore_unknown_eap_types = no                                                                                                                                                                                                          cisco_accounting_username_bug = no                                                                                                                                                                                                      max_sessions = ${max_requests}
           tls-config tls-common {
           private_key_passwotd=blablabla
           private_key_file = ${certdir}/server.key
           certificate_file = ${certdir}/server.crt
           dh_file = ${certdir}/dh
           ca_path = ${cadir}
           cipher_list = "HIGH"
           cipher_server_preference = no
           ecdh_curve = "prime256v1"
           check_crl = no
           }
                                                                                                                                                                                                                                                                                                                                                                                                                                                 
           ttls {
           tls = tls-common
           default_eap_type = md5
           copy_request_to_tunnel = no
           use_tunneled_reply = yes
           virtual_server = "inner-tunnel"
           }
}

Далі редагуємо site-enabled/default. Цікавлять розділи authorize та authenticate.

site-enabled/default

authorize {
  filter_username
  preprocess
  if (&User-Name == "guest") {
   eap-guest {
       ok = return
   }
  }
  elsif (&User-Name == "client") {
    eap-client {
       ok = return 
    }
  }
  else {
    eap-guest {
       ok = return
    }
  }
  ldap
  if ((ok || updated) && User-Password) {
    update {
        control:Auth-Type := ldap
    }
  }
  expiration
  logintime
  pap
  }

authenticate {
  Auth-Type LDAP {
    ldap
  }
  Auth-Type eap-guest {
    eap-guest
  }
  Auth-Type eap-client {
    eap-client
  }
  pap
}

У секції authorize прибираємо всі модулі, які нам не потрібні. Залишаємо тільки ldap. Додаємо перевірку клієнта за username. Саме для цього ми додавали вище два екземпляри eap.

Multi EAPСправа в тому, що підключаючи деякі пристрої, ми будемо використовувати системні сертифікати і вказувати домен. У нас є сертифікат та ключ від довіреного центру сертифікації. Особисто на мою думку така процедура підключення простіша, ніж кидати на кожен пристрій самопідписаний сертифікат. Але й без самопідписаних сертифікатів все ж таки не вдалося піти. Samsung девайси та Android =< 6 версії не вміють використовувати системні сертифікати. Тому для них створюємо окремий екземпляр eap-guest із самопідписаними сертифікатами. Для інших пристроїв будемо використовувати eap-client з довіреним сертифікатом. User-Name визначається за полем Anonymous при підключенні пристрою. Дозволено використовувати лише 3 значення: Guest, Client та порожнє поле. Решта все відкидається. Це налаштовується у політиках. Приклад наведу трохи згодом

Відредагуємо секції authorize та authenticate у site-enabled/inner-tunnel

site-enabled/inner-tunnel

authorize {
  filter_username
  filter_inner_identity
  update control {
   &Proxy-To-Realm := LOCAL
  }
  ldap
  if ((ok || updated) && User-Password) {
    update {
        control:Auth-Type := ldap
    }
  }
  expiration
  digest
  logintime
  pap
  }

authenticate {
  Auth-Type eap-guest {
    eap-guest
  }
  Auth-Type eap-client {
    eap-client
  }
  Auth-Type PAP {
    pap
  }
  ldap
}

Далі слід прописати в політиках, які імена можна використовувати для анонімного входу. Редагуємо policy.d/filter.

Потрібно знайти рядки схожі на це:

if (&outer.request:User-Name !~ /^(anon|@)/) {
  update request {
    Module-Failure-Message = "User-Name is not anonymized"
  }
  reject
}

І нижче в elsif додати потрібні значення:

elsif (&outer.request:User-Name !~ /^(guest|client|@)/) {
  update request {
    Module-Failure-Message = "User-Name is not anonymized"
  }
  reject
}

Тепер нам потрібно переміститися до директорії сертифікати. Сюди потрібно покласти ключ та сертифікат від довіреного центру сертифікації, який ми вже маємо і потрібно згенерувати самопідписані сертифікати для eap-guest.

Змінюємо параметри у файлі ca.cnf.

ca.cnf


...
default_days = 3650
default_md = sha256
...
input_password = blablabla
output_password = blablabla
...
countryName = RU
stateOrProvinceNmae = State
localityNmae = City
organizationName = NONAME
emailAddress = [email protected]
commonName = "CA FreeRadius"

Такі ж значення прописуємо у файлі server.cnf. Змінюємо тільки
звичайне ім'я:

server.cnf


...
default_days = 3650
default_md = sha256
...
input_password = blablabla
output_password = blablabla
...
countryName = RU
stateOrProvinceNmae = State
localityNmae = City
organizationName = NONAME
emailAddress = [email protected]
commonName = "Server Certificate FreeRadius"

Створюємо:

make

Готово. Отримані server.crt и server.key у нас вже написано вище в eap-guest.

І останнє, додамо наші точки доступу до файлу client.conf. У мене їх 7. Щоб не додавати кожну точку окремо, пропишемо тільки мережу в яку вони знаходяться (у мене точки доступу знаходяться в окремому VLAN).

client APs {
ipaddr = 192.168.100.0/24
password = password_AP
}

Контролер Ubiquiti

На контролері піднімаємо окрему мережу. Нехай буде 192.168.2.0/24
Йдемо в налаштування -> профіль. Створюємо новий:

WiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

Прописуємо адресу та порт radius-сервера та пароль, який прописували у файлі clients.conf:

WiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

Створюємо нове ім'я бездротової мережі. Як метод аутентифікації вибираємо WPA-EAP (Enterprise) і вказуємо створений radius-профіль:

WiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

Все зберігаємо, застосовуємо та йдемо далі.

Налаштування клієнтів

Почнемо із найскладнішого!

Windows 10

Складність зводиться до того, що Windows ще не вміє підключатися до корпоративного WiFi по домену. Тому доводиться вручну закидати наш сертифікат у сховище довірених сертифікатів. Тут можна використовувати як самопідписаний, так і від центру сертифікації. Я використовуватиму другий.

Далі слід створити нове підключення. Для цього йдемо в параметри мережі та Інтернет -> Центр управління мережами та загальним доступом -> Створення та налаштування нового підключення або мережі:

WiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

WiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

WiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

Вручну прописуємо ім'я мережі та змінюємо тип безпеки. Після натискаємо на змінити параметри підключення і у володінні Безпека вибираємо автентифікацію мережі - EAP-TTLS.

WiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

WiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

WiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

Заходимо до параметрів, прописуємо конфіденційність аутентифікації. клієнт. Як довірений центр сертифікації вибираємо доданий нами сертифікат, ставимо галочку "Не видавати користувачеві запрошення, якщо не вдається авторизувати сервер" і метод автентифікації вибираємо - незашифрований пароль (PAP).

WiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

Далі заходимо у додаткові параметри, ставимо галочку на "Вкажіть режим автентифікації". Вибираємо пункт «Перевірка справжності користувача» та натискаємо на зберегти облікові дані. Тут потрібно буде ввести username_ldap та password_ldap

WiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

WiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

WiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

Все зберігаємо, застосовуємо, закриваємо. Можна підключатися до нової мережі.

Linux

Я перевіряв на Ubuntu 18.04, 18.10, Fedora 29, 30.

Для початку скачуємо собі сертифікат. Я не знайшов у Linux, чи є можливість використовувати системні сертифікати і чи є там взагалі таке сховище.

Підключатимемося по домену. Тому потрібен сертифікат центру, що посвідчує, у якого був придбаний наш сертифікат.

Все підключення робиться в одному вікні. Вибираємо нашу мережу:

WiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

anonymous - client
domain — домен, на який випущено сертифікат

Android

non-Samsung

C 7 версії при підключенні WiFi можна використовувати системні сертифікати, вказавши лише домен:

WiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

domain — домен, на який випущено сертифікат
anonymous - client

Samsung

Як уже писав вище, Samsung-пристрої не вміють використовувати системні сертифікати при підключенні WiFi, і вони не мають можливості підключатися по домену. Тому треба вручну додати кореневий сертифікат центру сертифікації (ca.pem, беремо на сервері Radius). Ось тут використовуватиме самопідписаний.

Завантажуємо сертифікат собі на пристрій та встановлюємо його.

Встановлення сертифікатаWiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

WiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

WiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

WiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

При цьому потрібно буде встановити малюнок розблокування екрану, пін-код або пароль, якщо він ще не встановлений:

WiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

WiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

Я показав складний варіант встановлення сертифіката. На більшості пристроїв досить просто натиснути на сертифікат.

Коли сертифікат встановлено, можна перейти до підключення:

WiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

сертифікат - вказуємо той, який встановлювали
анонімний користувач - guest

MacOS

Яблучні пристрої з коробки можуть підключатися тільки до EAP-TLS, але все одно потрібно закидати сертифікат. Щоб вказати інший метод підключення, потрібно скористатися Apple Configurator 2. Відповідно потрібно заздалегідь завантажити його на мак, створити новий профіль та додати всі необхідні налаштування WiFi.

Apple ConfiguratorWiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

WiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

Тут вказуємо ім'я своєї мережі
Security Type - WPA2 Enterprise
Accepted EAP Types - TTLS
User Name і Password - залишаємо порожніми
Inner Authentication - PAP
Outer Identity - client

Вкладка Trust. Тут вказуємо наш домен

Всі. Профіль можна зберігати, підписувати та розповсюджувати на пристрої

Після того, як профіль готовий, його потрібно завантажити на мак та встановити. У процесі встановлення потрібно буде вказати usernmae_ldap та password_ldap користувача:

WiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

WiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

WiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

iOS

Процес аналогічний до macOS. Потрібно використовувати профіль (можна прямий такий як для macOS. Як створювати профіль у Apple Configurator, дивитися вище).

Завантажуємо профіль, встановлюємо, вводимо облікові дані, підключаємось:

WiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

WiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

WiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

WiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

WiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

WiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

На цьому все. Ми налаштували сервер Radius, синхронізували його з FreeIPA і вказали точкам доступу Ubiquiti використовувати WPA2-EAP.

Можливі питання

В: як передавати профіль/сертифікат співробітнику?

Про: Усі сертифікати/профілі я зберігаю на фтп з доступом через Інтернет. Підняв гостьову мережу з обмеженням за швидкістю та доступом тільки в інтернет, за винятком фтп.
Аутентифікація триває 2 дні, після чого скидається і клієнт залишається без інтернету. Т.о. коли співробітник хоче підключитися до WiFi, спочатку він підключається до гостьової мережі, заходить на фтп, завантажує потрібний сертифікат або профіль, встановлює їх, і потім може підключатися до корпоративної мережі.

В: чому не використовувати схему з MSCHAPv2? вона ж безпечніша!

Про: по-перше, така схема добре працює на NPS (Windows Network Policy System), у нашій реалізації необхідно додатково налаштовувати LDAP (FreeIpa) та зберігати хеші паролів на сервері. Дод. налаштування робити не бажано, т.к. це може призвести до різних проблем сихронізації УЗ. По-друге, хеш є MD4, так що це не особливо підвищує безпеку

В: Чи можна авторизувати пристрої за mac-адресами?

Про: НІ, це не безпечно, зловмисник може підмінити мак-адреси, і тим більше авторизація за мак-адресами не підтримується на багатьох пристроях

В: навіщо взагалі всі ці сертифікати використати? можна ж і без них підключатися

Про: Сертифікати використовуються для авторизації сервера. Тобто. пристрій при підключенні перевіряє той сервер, якому можна довіряти чи ні. Якщо той, то аутентифікація відбувається далі, якщо ні, з'єднання закривається. Можна підключатися без сертифікатів, але якщо зловмисник або сусід підніме у себе вдома radius-сервер і точку доступу з таким самим ім'ям, як у нас, він зможе легко перехопити облікові дані користувача (не забуваємо, що вони передаються у відкритому вигляді). А коли використовується сертифікат, ворог побачить у себе в логах тільки наші вигадані User-Name – guest або client та помилку типу – Unknown CA Certificate

ще трохи про macOSЗазвичай на macOS перевстановлення системи здійснюється через Інтернет. У режимі відновлення мак треба підключити до WiFi, і тут не спрацює наш корпоративний WiFi, ні гостьова мережа. Особисто я підняв ще одну мережу, звичайну WPA2-PSK, приховану, тільки для технічних операцій. Або ще можна заздалегідь зробити завантажувальну флешку із системою. Але якщо мак після 2015 року, треба буде ще знайде адаптер для цієї флешки)

Джерело: habr.com

Додати коментар або відгук