Хабрахабр

[Из песочницы] WiFi Enterprise. FreeRadius + FreeIPA + Ubiquiti

Здесь я распишу как реализовал подобное решение и проблемы с которыми пришлось столкнуться при подключении на разных устройствах. Уже были описаны некоторые примеры организации корпоративного WiFi. Вроде все просто. Будем использовать уже имеющейся LDAP с заведенными пользователями, поднимем FreeRadius и настроим WPA2-Enterprise на контроллере Ubnt. Посмотрим…

Немного о методах EAP

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

Из википедии:

Формат был впервые описан в RFC 3748 и обновлён в RFC 5247.
EAP используется для выбора метода аутентификации, передачи ключей и обработки этих ключей подключаемыми модулями называемыми методами 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 будет проходить именно в так. Да, все верно. Да и пусть отправляются, только у вас есть доступ к серверу FreeRadius. В режиме дебага можно отследить как отправляются username и password.

Подробнее о работе EAP-TTLS можно почитать тут

FreeRADIUS

FreeRadius будем поднимать на CentOS 7.6. Здесь ничего сложного, ставим обычным способом.

yum install freeradius freeradius-utils freeradius-ldap -y

Из пакетов ставится версия 3.0.13. Последнюю можно взять на https://freeradius.org/

Можно в /etc/raddb/users расскоментировать строчку После этого FreeRadius уже работает.

steve Cleartext-Password := "testing"

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

freeradius -X

И делаем тестовое подключение с localhost

radtest steve testing 127.0.0.1 1812 testing123

Получили ответ Received Access-Accept Id 115 from 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="$"
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

У нас есть сертификат и ключ от доверенного центра сертификации. Дело в том, что подключая некоторые устройства мы будем использовать системные сертификаты и указывать домен. Но и без самоподписанных сертификатов все же не получилось уйти. Лично по моему мнению такая процедура подключения проще, чем кидать на каждое устройство самоподписанный сертификат. Поэтому для них создаем отдельный экземпляр eap-guest с самоподписанными сертификатами. Samsung девайсы и Android =< 6 версии не умеют использовать системные сертификаты. User-Name определяется по полю Anonymous при подключении устройства. Для всех других устройств будем использовать eap-client c доверенным сертификатом. Остальное все отбрасывается. Разрешено использовать только 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
}

Теперь нам нужно переместиться в директорию certs. Сюда нужно положить ключ и сертификат от доверенного центра сертификации, который у нас уже есть и нужно сгенерировать самоподписанные сертификаты для 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 = admin@admin.ru
commonName = "CA FreeRadius"

Такие же значения прописываем в файле server.cnf. Меняем только
commonName:

server.cnf


...
default_days = 3650
default_md = sha256
...
input_password = blablabla
output_password = blablabla
...
countryName = RU
stateOrProvinceNmae = State
localityNmae = City
organizationName = NONAME
emailAddress = admin@admin.ru
commonName = "Server Certificate FreeRadius"

Создаем:

make

Готово. Полученные server.crt и server.key у нас уже прописаны выше в eap-guest.

У меня их 7. И последнее, добавим наши точки доступа в файл client.conf. Чтобы не добавлять каждую точку отдельно, пропишем только сеть в котороый они находятся (у меня точки доступа находятся в отдельном VLAN).

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

Контроллер Ubiquiti

На контроллере поднимаем отдельную сеть. Пусть будет 192.168.2.0/24
Идем в настройки -> профиль. Cоздаем новый:

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

В качестве метода аутентификации выбираем WPA-EAP (Enterprise) и указываем созданный radius-профиль: Создаем новое имя беспроводной сети.

Все сохраняем, применяем и идем дальше.

Настройка клиентов

Начнем с самого сложного!

Windows 10

Сложность сводится к тому, что Windows пока еще не умеет подключаться к корпоративному WiFi по домену. Поэтому приходится вручную закидывать наш сертификат в хранилище доверенных сертификатов. Здесь можно использовать как самоподписанный так и от центра сертификации. Я буду использовать второй.

Для этого идем в параметры сети и Интернет -> Центр управления сетями и общим доступом -> Создание и настройка нового подключения или сети: Далее нужно создать новое подключение.

После нажимаем на изменить параметры подключения и во владке Безопасность выбираем проверку подлинности сети — EAP-TTLS. Вручную прописываем имя сети и меняем тип безопасности.

В качестве доверенного центра сертификации выбираем добавленный нами сертификат, ставим галочку «Не выдавать пользователю приглашение, если не удается авторизовать сервер» и метод проверки подлинности выбираем — незашифрованный пароль (PAP). Заходим в параметры, прописываем конфиденциальность аутентификации — client.

Выбираем пункт «Проверка подлинности пользователя» и нажимаем на сохранить учетные данные. Далее заходим в дополнительные параметры, ставим галочку на «Укажите режим проверки подлинности». Здесь надо будет ввести username_ldap и password_ldap

Можно подключаться к новой сети. Все сохраняем, применяем, закрываем.

Linux

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

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

Поэтому нужен сертификат удостоверяющего центра, у которого был приобретен наш сертификат. Будем подключаться по домену.

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

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

Android

non-Samsung

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

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

Samsung

Как уже писал выше, Samsung-устройства не умеют использовать системные сертификаты при подключении WiFi, и у них нет возможности подключаться по домену. Поэтому надо вручную добавить корневой сертификат центра сертификации (ca.pem, берем на Radius сервере). Вот здесь будет использовать самоподписанный.

Скачиваем сертификат себе на устройство и устанавливаем его.

Установка сертификата

При этом, надо будет установить рисунок разблокировки экрана, пин-код или пароль, если он еще не установлен:

На большинстве устройств достаточно просто нажать на скаченный сертификат.
Я показал сложный вариант установки сертификата.

Когда сертификат установлен, можно переходить к подключению:

сертификат — указываем тот, который устанавливали
анонимный пользователь — guest

macOS

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

Apple Configurator

Здесь указываем имя своей сети
Security Type — WPA2 Enterprise
Accepted EAP Types — TTLS
User Name и Password — оставляем пустыми
Inner Authentication — PAP
Outer Identity — client

Здесь указываем наш домен Вкладка Trust.

Профиль можно сохранять, подписывать и распространять на устройства
Все.

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

iOS

Процесс аналогичен macOS. Нужно использовать профиль (можно прям такой же как для macOS. Как создавать профиль в Apple Configurator, смотреть выше).

Скачиваем профиль, устанавливаем, вводим учетные данные, подключаемся:

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

Возможные вопросы

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

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

она же более безопасная! В: почему не использовать схему с MSCHAPv2?

Доп. О: во-первых, такая схема хорошо работает на NPS (Windows Network Policy System), в нашей реализации необходимо дополнительно настраивать LDAP (FreeIpa) и хранить хэши паролей на сервере. это может привести к различным проблемам сихронизации УЗ. настройки делать не желательно, т.к. Во-вторых, хеш представляет собой MD4, так что это не особо повышает безопасность

В: можно ли авторизовывать устройтсва по mac-адресам?

О: НЕТ, это не безопасно, злоумышленник может подменить мак-адреса, и тем более авторизация по мак-адресам не поддерживается на многих устройствах

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

Т.е. О: сертификаты используются, чтобы авторизовать сервер. Если тот, то аутентификация проходит дальше, если нет, соединение закрывается. устройство при подключении проверяет тот ли это сервер, которому можно доверять или нет. А когда используется сертификат, враг увидит у себя в логах только наши вымышленные User-Name — guest или client и ошибку типа — Unknown CA Certificate Можно подключаться без сертификатов, но если злоумышленик или сосед поднимет у себя дома radius-сервер и точку доступа с таким же именем как у нас, он сможет легко перехватить учетные данные пользователя (не забываем, что они передаются в открытом виде).

еще немного про macOS

В режиме восстановления мак надо подключить к WiFi, и здесь не сработает ни наш корпоративный WiFi, ни гостевая сеть. Обычно на macOS переустановка системы делается через интернет. Либо еще можно заранее сделать загрузочную флешку с системой. Лично я поднял еще одну сеть, обычную по WPA2-PSK, скрытую, только для технических операций. Но если мак после 2015 года, надо будет еще найдит адаптер для это флешки)

Теги
Показать больше

Похожие статьи

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»
Закрыть