Radius Server. Аутентификация пользователей Wi-Fi на основе Freeradius + Active Directory
Краткое предисловие, что привело к появлению данной статьи.
Со стороны ИБ поступил запрос, что бы с табличек, расклеенных по офису, был убран SSID и пароль от рабочего Wi-Fi с доступом ко всем корпоративным ресурсам компании. Таблички заменили и сразу же встал вопрос, как сотрудникам узнать пароль и должны ли они его вообще знать, т.к. зная пароль его можно передать третьим лицам, а передав пароль третьему лицу теряется смысл скрытия SSID и пароля из общего доступа. Так и было принято решение о необходимости внедрения Radius сервера, чтобы каждый сотрудник проходил авторизацию по своей доменной учетной записи при подключении к Wi-Fi сети.
Процесс внедрения условно можно разделить на 2 этапа:
- Подготовка сервера и ввод его в домен
- Установка, настройка и ввод в эксплуатацию Radius сервера.
1) Все действия происходят на сервере Debian 12 BookWorm. Если у вас другой дистрибутив или версия ОС, возможно вам понадобится адаптировать команды и пути к файлам под вашу версию.
2) Задайте статический ip адрес.
Приведите файл /etc/network/interfaces к следующему виду:
Где:
address – статический ip сервера и маска подсети
gateway – ip адрес шлюза по умолчанию
Для это откройте файл для редактирования: sudo nano /etc/network/interfaces
3) Сконфигурируйте ip адрес dns сервера и имя домена.
Приведите файл /etc/resolf.conf к виду:
Где:
nameserver – ip адрес вашего контроллера домена
search – доменное имя вашего домена
Для этого откройте файл для редактирования sudo nano /etc/resolf.conf
4) Убедитесь, что возвращаемые ip адреса корректные, а так же сам ответ приходит от dns сервера – контроллера домена.
Введите команду nslookup dc1.nnnn.local
Вывод должен быть примерно следующим:
Где:
Server – ip адрес сервера от которого получен ответ
Name – имя сервера
Address – ip адрес сервера, имя которого было в запросе
Введите команду nslookup 10.151.1.86 для проверки PTR записи dns сервера
Вывод должен быть примерно следующим:
Где видно, что ip адрес сервера 10.151.1.86 разрешается в имя dc1.nnnn.local
5) Установите “chrony” для синхронизации времени с контроллером домена.
Введите команду sudo apt install chrony
Конфигурационный файл chrony находится по пути /etc/chrony/chrony.conf
Откройте файл для редактирования: sudo nano /etc/chrony/chrony.conf
Приведите конфигурационный файл к следующему виду:
______________________________________________________________________________________________________
# Welcome to the chrony configuration file. See chrony.conf(5) for more
# information about usuable directives.
# This directive specify the location of the file containing ID/key pairs for
# NTP authentication.
keyfile /etc/chrony/chrony.keys
# This directive specify the file into which chronyd will store the rate
# information.
driftfile /var/lib/chrony/chrony.drift
# Uncomment the following line to turn logging on.
#log tracking measurements statistics
# Log files location.
logdir /var/log/chrony
# Stop bad estimates upsetting machine clock.
maxupdateskew 100.0
# This directive tells ‘chronyd’ to parse the ‘adjtime’ file to find out if the
# real-time clock keeps local time or UTC. It overrides the ‘rtconutc’ directive.
hwclockfile /etc/adjtime
# This directive enables kernel synchronisation (every 11 minutes) of the
# real-time clock. Note that it can’t be used along with the ‘rtcfile’ directive.
rtcsync
# Step the system clock instead of slewing it if the adjustment is larger than
# one second, but only in the first three clock updates.
makestep 1 3
# ipaddress of this Unix domain member
bindcmdaddress 10.151.1.33
# The source, where we are receiving the time from
server DC1.nnnn.local iburst
server DC2.nnnn.local iburst
______________________________________________________________________________________________________
Где:
bindcmdaddress 10.151.1.33 – ip адрес radius сервера
server DC1.nnnn.local – имя локального ntp сервера, в нашем случае контроллера домена
server DC2.nnnn.local – имя локального ntp сервера, в нашем случае контроллера домена
6) Установите Samba.
Введите команду sudo apt install acl attr samba winbind libpam-winbind libnss-winbind krb5-config krb5-user dnsutils python3-setproctitle
7) Отредактируйте конфигурационный файл krbconf, предварительно сделав его резервную копию.
Введите команду sudo cp /etc/krb5.conf /etc/krb5.conf.bak
Откройте файл для редактирования sudo nano /etc/krb5.conf
Приведите файл к следующему состоянию:
______________________________________________________________________________________________________
[libdefaults]
default_realm = NNNN.LOCAL
clockskew = 300
v4_instance_resolve = false
v4_name_convert = {
host = {
rcmd = host
ftp = ftp
}
plain = {
something = something-else
}
}
[realms]
NNNN.LOCAL = {
kdc = NNNN.LOCAL # контроллер домена или домен
admin_server = NNNN.LOCAL # контроллер домена или домен
}
[domain_realm]
.nnnn.local = NNNN.LOCAL
______________________________________________________________________________________________________
8) Отредактируйте файл hosts.
Откройте файл для редактирования sudo nano /etc/hosts
Приведите файл к следующему виду:
______________________________________________________________________________________________________
127.0.0.1 localhost
10.151.1.33 freeradius.nnnn.local freeradius
______________________________________________________________________________________________________
Где адрес 127.0.0.1 должен разрешаться только на “localhost”, а ip адрес radius сервера 10.151.1.33 должен разрешаться в FQDN и короткое имя сервера.
9) Отредактируйте конфигурационный файл smb.conf, предварительно сделав его резервную копию.
Введите команду sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.bak
Откройте файл для редактирования sudo nano /etc/samba/smb.conf
Приведите файл к следующему виду:
______________________________________________________________________________________________________
[global]
workgroup = NNNN
server string = Radius Server
security = ads
;hosts allow = 192.168.0. 127.
log file = /var/log/samba/log.%m
max log size = 500
password server = DC1.NNNN.LOCAL # контроллер домена или домен
encrypt passwords = yes
realm = NNNN.LOCAL
socket options = TCP_NODELAY
os level = 1
ntlm auth = mschapv2-and-ntlmv2-only
winbind use default domain = true
unix charset = koi8-r
dos charset = cp866
winbind use default domain = yes
winbind uid = 10000-15000
winbind gid = 10000-15000
winbind enum users = yes
winbind enum groups = yes
______________________________________________________________________________________________________
10) Перезагрузите сервер.
Введите команду sudo reboot
11) Добавьте сервер в домен.
Введите команду sudo net ads join -U admin
Где “admin” – доменная учетная запись пользователя с правами на добавление компьютеров в домен.
Введите пароль от учетной записи sudo
Введите пароль от учетной записи “admin”
12) Перезагрузить сервер.
Введите команду sudo reboot
13) Проверить, что сервер видит учетные записи домена.
Введите команду wbinfo -u
В выводе должен быть перечень учетных записей домена
Введите команду sudo wbinfo -a test33%ABcd1234!
где:
test33 – доменная учетная запись
ABcd1234! – пароль от учетной записи test33
Вывод команды должен быть примерно такой:
В выводе команды должно быть видно, что аутентификация пользователя прошла успешно – authentication succeeded
Введите команду ntlm_auth –request-nt-key –domain=NVBS.LOCAL –username=test33 –password=ABcd1234!
Вывод команды должен быть примерно такой:
В выводе команды не должно быть ошибок
На этом этапе мы завершили настройку samba и убедились, что наш сервер находится в домене и готов аутентифицировать пользователей по протоколу ntlm.
Можно переходить к настройке FreeRadius.
14) Установите FreeRadius.
Введите команду sudo apt install freeradius
15) Отредактируйте конфигурационный файл ntlm_auth, предварительно создав его резервную копию.
Файл находится по пути /etc/freeradius/3.0/mods-available/ntlm_auth
Введите команду sudo su
Введите пароль от sudo
Введите команду cp /etc/freeradius/3.0/mods-available/ntlm_auth /etc/freeradius/3.0/mods-available/ntlm_auth.bak
Введите команду nano /etc/freeradius/3.0/mods-available/ntlm_auth
Приведите файл к следующему виду:
______________________________________________________________________________________________________
exec ntlm_auth {
wait = yes
program = “/usr/bin/ntlm_auth –request-nt-key –domain=NNNN.LOCAL –username=%{mschap:User-Name} –password=%{User-Password}”
}
______________________________________________________________________________________________________
Эта конфигурация сообщает серверу, что нужно запустить ntlm_auth аутентификацию с именем пользователя и паролем, полученным из Access-Request.
16) Отредактируйте конфигурационный файл /etc/freeradius/3.0/sites-enabled/default, предварительно создав его резервную копию.
Как и в предыдущем пункте, файл default является ссылкой на файл /etc/freeradius/3.0/sites-available/default
Введите команду cp /etc/freeradius/3.0/sites-available/default /etc/freeradius/3.0/sites-available/default.bak чтобы создать резервную копию.
Введите команду nano /etc/freeradius/3.0/sites-enabled/default чтобы открыть конфигурационный файл.
В секцию “authenticate” добавьте ntlm_auth, что бы получилось примерно следующее:
______________________________________________________________________________________________________
authenticate {
…
Auth-Type PAP {
Pap
}
…
ntlm_auth
…
}
______________________________________________________________________________________________________
17) Отредактируйте конфигурационный файл /etc/freeradius/3.0/sites-enabled/inner-tunnel
Этот файл так же является ссылкой на файл /etc/freeradius/3.0/sites-available/inner-tunnel
Введите команду cp /etc/freeradius/3.0/sites-available/inner-tunnel /etc/freeradius/3.0/sites-available/inner-tunnel.bak чтобы создать резервную копию.
Введите команду nano /etc/freeradius/3.0/sites-enabled/inner-tunnel чтобы открыть конфигурационный файл.
Как и в предыдущем пункте добавьте в секцию “authenticate” ntlm_auth чтобы получилась примерно следующая конфигурация:
______________________________________________________________________________________________________
authenticate {
…
Auth-Type PAP {
Pap
}
…
ntlm_auth
…
}
______________________________________________________________________________________________________
18) Отредактируйте файл users
Для последующей отладки и тестирования отредактируйте файл /etc/freeradius/3.0/users
Введите команду nano /etc/freeradius/3.0/users
Добавьте первой строкой DEFAULT Auth-Type = ntlm_auth чтобы получилось примерно следующее:
19) Запустите сервер в режиме отладки.
Введите команду exit чтобы выйти из окружения su
Введите команду sudo systemctl stop freeradius.service чтобы остановить службу
Введите команду sudo freeradius -X чтобы запустить сервер в режиме отладки
Дождитесь пока загрузятся все модули и конфигурации и на экране появится “ Ready to process requests.”
20) Запустите тест.
В новом окне терминала введите команду sudo radtest test33 ABcd1234! localhost 0 testing123
Где:
test33 – доменная учетная запись
ABcd1234! – пароль от учетной записи test33
testing123 – пароль по умолчанию для freeradius
Вывод должен быть подобен следующему: Received Access-Accept id 12 from 127.0.0.1:1812 to 127.0.0.1:55600 length=20
На самом сервере Вы так же должны увидеть лог успешной аутентификации подобно следующему примеру:
21) Удалите тестовый метод аутентификации из файла users.
Введите команду sudo su чтобы перейти в режим su.
Введите команду nano /etc/freeradius/3.0/users чтобы открыть конфигурационный файл
Удалите строку DEFAULT Auth-Type = ntlm_auth
22) Отредактируйте конфигурационный файл mschap, предварительно сделав его резервную копию.
Файл находится по пути /etc/freeradius/3.0/mods-available/mschap
Введите команду cp /etc/freeradius/3.0/mods-available/mschap /etc/freeradius/3.0/mods-available/mschap.bak чтобы создать резервную копию.
Введите команду nano /etc/freeradius/3.0/mods-available/mschap чтобы открыть файл.
Найдите и раскомментируйте строку “use_mppe = yes”
Найдите и раскомментируйте строку “ require_encryption = yes ”
Найдите и раскомментируйте строку “ require_strong = yes ”
Найдите и раскомментируйте строку начинающуюся с “ntlm_auth = ”
Приведите строку к виду, чтобы получилось примерно следующее:
______________________________________________________________________________________________________
ntlm_auth = “/usr/bin/ntlm_auth –request-nt-key –allow-mschapv2 –username=%{%{Stripped-User-Name}:-%{%{User-Name}:-None}} –challenge=%{%{mschap:Challenge}:-00} –nt-response=%{%{mschap:NT-Response}:-00}”
______________________________________________________________________________________________________
23) Запустите тест.
Выйдите из режима su
Введите команду exit
Введите команду sudo freeradius -X чтобы запустить сервер в режиме отладки
В другом терминале введите команду sudo radtest -t mschap test33 ABcd1234! localhost 0 testing123
Где:
test33 – доменная учетная запись
ABcd1234 – пароль от учетной записи test33
testing123 – пароль по умолчанию
Вы должны увидеть отказ “Access-Reject”, а в терминале сервера ошибку “mschap: ERROR: Program returned code (1) and output ‘Reading winbind reply failed! (0xc0000001)’” и ” mschap: ERROR: Reading winbind reply failed! (0xc0000001)”
24) Назначте права доступа.
Ошибка из предыдущего пункта связана с отсутствием прав доступа пользователя freerad от имени которого работает radius к директории winbindd_priveleged, находящейся по пути /var/lib/samba/winbindd_priveleged.
На втором терминале, где Вы запускали команду “radtest” введите команду sudo su, чтобы перейти в окружение su.
Введите команду usermod -aG winbindd_priv freerad чтобы добавить пользователя freerad в группу winbindd_priv.
Введите команду exit чтобы выйти из окружения su.
На первом терминале перезапустите сервер в режиме отладки.
На втором терминале повторно запустите команду sudo radtest -t mschap test33 ABcd1234! localhost 0 testing123
Тест должен пройти без ошибок и вывод должен иметь примерно следующий вид:
На первом терминале, завершите режим отладки и введите команду sudo systemctl start freeradius.service чтобы запустить сервис в штатном режиме.
Radius сервер готов к эксплуатации.