Дано: существующий
домен-контроллер (DC) на Windows Server 2012 R2, заполненный Active Directory (AD) каталог пользователей.
Задача: поднять
бесплатный RADIUS сервер и настроить его на аутентификацию
пользователей через вышеуказанный AD.
Предыстория
такова, что первоначальная задача, это не радиус, а Caprive Portal (о котором напишу в другой статье), который будет авторизовывать (показывать страницу логина-пароля) и
контролировать пользователей, подключающихся к корпоративному WiFi.
В
качестве источника бесплатного готового решения Caprive
портала был выбран pfSense 2.3, которому для сторонней (в том числе доменной) авторизации
пользователей нужен радиус-сервер.
Статья больше является неким логом действий и
ошибкок от закоренелого Windows-админа, поэтому не судите строго, это заметка для unix-чайников от unix-чайников.
В
качестве радиус сервера был выбран бесплатный FreeRadius версии
3.
В
качестве операционной системы для него - FreeBSD 10.3
Допустим,
что FreeBSD 10.3 уже установлена.
Дистрибутив FreeBSD/releases/amd64/amd64/ISO-IMAGES/10.3/
Зададим, например,
следующие исходные данные:
Пусть
имя ПК с FreeBSD и радиусом будет:
FreeRADIUS-AO
Его IP: 192.168.10.30
Его IP: 192.168.10.30
IP ПК с pfSense: 192.168.10.12
IP DC (домен контроллеров): 192.168.10.4 и 192.168.0.4
Домен:
corp.domain.net
Логинимся
на машину FreeRADIUS-AO и
переходим в режим суперадмина (рута, su).
Если
удобнее работать из Windows, то можно подключиться через ssh клиент PuTTY:
Для удобства сразу установим файловый менеджер MC (Midnight Commander)
# pkg
install mc
Запустить
его без псевдографики можно по команде:
# mc
-a
Т.к.
входить на машину сразу под рутом через тот же PuTTY не рекомендуется, входим
под другим пользователем, например, admin, который предварительно должен быть
добавлен в спец. группу wheel. Добавляем так:
# pw
groupmod wheel -m admin
#
pw groupshow wheel
Вход
под суперпользователем (root):
$ su
Настраиваем
сервера времени на контроллеры домена CORP.DOMAIN.NET
Где, dc1.corp.domain.net и dc2.corp.domain.net имена контроллеров домена.
В
файле /etc/resolv.conf должны быть правильно
настроены наши адреса домен-контроллеров.
nameserver
192.168.10.4
nameserver
192.168.0.4
search corp.domain.net
В файле /etc/hosts
прописываем домены:
127.0.0.1 localhost
192.168.10.30
freeradius-ao.corp.domain.net freeradius-ao
Смотрим,
что уже установлено, какие пакеты имеются:
#
pkg info
Проверяем нет ли
обновлений пакетов:
#
pkg update
#
pkg upgrade
Далее
основной источник, по которому ведется установка и настройка - это официальный
мануал от разработчиков FreeRadius
- wiki.freeradius.org/guide/FreeRADIUS-Active-Directory-Integration-HOWTO
Устанавливаем
пакет Samba (версия 4.4) (необходим для доменной авторизации пользователей).
#
pkg install net/samba44
Установятся также
сопутствующие пакеты
Здесь стоит обратить
внимание на расположение конфигурационных файлов и логов.
Samba
содержит компоненты, которые в дальнейшем понадобятся для
работы с AD:
- winbind, служба (демон в терминах FreeBSD) для связи линукс машины и контроллера домена.
- ntlm_auth, утилита, использующая службу winbind для NTLM запросов. Она разрешает проверку пользовательских данных (логин и пароль) на контроллере домена и возвращает ответ либо успешный результат проверки, либо сообщения об ошибках.
Для просмотра опций
самбы можно выполнить команду:
#
smbd -b
Результат
ее выполнения:
Build environment:
Built
by: root@101amd64-quarterly-job-14
Built
on: Thu Jul 28 15:46:26 UTC 2016
Built
using: cc
Build
host: FreeBSD 101amd64-quarterly-job-14
10.1-RELEASE-p37 FreeBSD 10.1-RELEASE-p37 amd64
SRCDIR:
/wrkdirs/usr/ports/net/samba44/work/samba-4.4.5/source3
BUILDDIR:
/wrkdirs/usr/ports/net/samba44/work/samba-4.4.5/source3
Paths:
SBINDIR:
/usr/local/sbin
BINDIR:
/usr/local/bin
CONFIGFILE:
/usr/local/etc/smb4.conf
LOGFILEBASE: /var/log/samba4
LMHOSTSFILE: /usr/local/etc/lmhosts
LIBDIR:
/usr/local/lib/samba4
MODULESDIR:
/usr/local/lib/shared-modules
SHLIBEXT:
so
LOCKDIR:
/var/db/samba4
STATEDIR:
/var/db/samba4
CACHEDIR:
/var/db/samba4
PIDDIR:
/var/run/samba4
SMB_PASSWD_FILE: /var/db/samba4/private/smbpasswd
PRIVATE_DIR: /var/db/samba4/private
System Headers:
HAVE_SYS_ACL_H
HAVE_SYS_CAPABILITY_H
HAVE_SYS_CDEFS_H
...
Headers:
HAVE_AIO_H
...
UTMP Options:
HAVE_UTMPX_H
HAVE_* Defines:
HAVE_ACL
HAVE_ACL_EVERYONE
HAVE_ACL_GET_FILE
HAVE_ACL_GET_PERM_NP
...
--with Options:
WITH_ADS
WITH_AUTOMOUNT
WITH_DNS_UPDATES
WITH_PAM
WITH_PAM_MODULES
WITH_PTHREADPOOL
WITH_QUOTAS
WITH_SENDFILE
WITH_SYSLOG
WITH_WINBIND
Build Options:
AD_DC_BUILD_IS_ENABLED
BROKEN_NISPLUS_INCLUDE_FILES
BSD_STYLE_STATVFS
...
Cluster support features:
NONE
Type sizes:
sizeof(char): 1
sizeof(int): 4
sizeof(long): 8
sizeof(long
long): 8
sizeof(uint8_t): 1
sizeof(uint16_t): 2
sizeof(uint32_t): 4
sizeof(short): 2
sizeof(void*): 8
sizeof(size_t): 8
sizeof(off_t): 8
sizeof(ino_t): 4
sizeof(dev_t): 4
Builtin modules:
vfs_default
vfs_posixacl auth_domain auth_builtin auth_sam auth_winbind pdb_smbpasswd
pdb_tdbsam pdb_wbc_sam auth_unix auth_wbc nss_info_template idmap_tdb
idmap_passdb idmap_nss pdb_samba_dsdb auth_samba4 vfs_dfs_samba4 pdb_ldapsam
idmap_ldap
Теперь нужно настроить Samba на наши адреса и домены.
Создаем
конфигурационный файл по пути /usr/local/etc/smb4.conf:
#
vi /usr/local/etc/smb4.conf
Добавляем следующие
настройки (могут меняться по ситуации, в разных
мануалах в сети, каждый пишет свой вариант настроек, здесь некий сводный
результат моего анализа вариантов):
[global]
# WORKGROUP - название рабочей группы
# realm - полное имя домена
#
Пишем эти параметры прописными (заглавными) буквами
workgroup = CORP
realm = CORP.DOMAIN.NET
# server string - комментарий к серверу, который будет
#
виден клиентам, например в проводнике.
server string = Radius
Samba Server
# тип авторизации
# Эти две опции отвечают за авторизацию через AD
# В этом режиме Samba работает как член домена AD
security = ads
encrypt passwords = yes
# hosts allow - разрешить доступ только в указаных подсетях
# Список сетей, которым разрешено соединяться с сервером.
# hosts allow =
192.168.0. 127.
# log file - файл журнала
log file = /var/log/samba4/log.%m
# max log size - максимальный размер журнала (в килобайтах?)
max log size = 500
#
Запрещаем nmbd делать запросы к DNS
dns
proxy = no
socket options = TCP_NODELAY
# samba может
"захотеть" стать контроллером домена,
# чтобы она этого не сделала, указываем
следующие параметры
domain
master = no
local
master = no
preferred
master = no
os
level = 0
domain
logons = no
# Отключаем поддержку принтеров
load
printers = no
show
add printer wizard = no
printcap
name = /dev/null
disable
spoolss = yes
# кодировки
# display charset
= koi8-r
# unix charset =
koi8-r
dos charset = cp866
# Параметры сопоставления AD пользователей при помощи winbind
# Указываем для
виртуальных пользователей
# диапазоны идентификаторов
idmap
config * : range = 10000-20000
idmap
config * : backend = tdb
#
Также не выключаем эти параметры
winbind
enum groups = yes
winbind
enum users = yes
#
Следующую настройку придется выбрать самостоятельно.
# Если нет (no), то будет использовано домен\имя
# Если да (yes), то
будет использовано просто имя
# Хотя на странице
настройки AD для FreeRadius предлагают "no"
winbind
use default domain = yes
# Если требуется автообновление билета Kerberos
# модулем pam_winbind.so, то снимаем
комментарий
# winbind refresh tickets = yes
#==
Share Definitions =============
[homes]
comment = Home Directories
browseable = no
writable = yes
|
Для
проверки конфигурации Samba на
ошибки можно выполнить команду:
#
testparm
Правим конфигурационный файл /etc/nsswitch.conf: (указываем ссылку на winbind у group,
passwd, services, protocols)
В
файле etc/rc.conf добавить включение служб:
samba_enable="YES"
winbindd_enable="YES"
Теперь можно
включать машину в домен:
#
net join -U Administrator
Где Administrator - это
имя администратора домена.
Спросит пароль
администратора домена, вводим, в итоге должно быть:
Using short domain
name -- CORP
Joined
'FREERADIUS-AO' to dns domain 'corp.domain.net'
Примечание: выход из домена, если нужно: net ads leave -U
Administrator
Если
будет сообщение:
Failed to
leave domain: failed to leave realm: No such file or directory
То машина уже не в
домене (например, администратор удалил ее на самом контроллере домена).
Перезагружаемся
#
reboot
(не забываем перезагружать и делать рестарт служб, если меняем настройки
и конфигурационные файлы)
По
команде проверяем статус состояния в домене:
#
net ads testjoin
Если
получаем сообщение:
kerberos_kinit_password FREERADIUS-AO$@CORP.DOMAIN.NET
failed: Client not found in Kerberos database
Join to domain is not valid: Improperly formed account name
То означает, что
машина не в домене.
Если всё
успешно, то должны получить сообщение:
Join is OK
Стартуем
samba
#
samba
Стартуем
winbind
#
winbindd
Проверяем статус
коннекта к домену:
#
wbinfo -p
Если получаем
сообщение:
Ping to winbindd failed
could not ping winbindd!
То
сервис winbind не запущен, надо
его запустить по команде выше.
Проверяем
утилиту авторизации ntlm_auth пытаясь войти под каким-либо доменным пользователем:
#
ntlm_auth --request-nt-key --domain=corp.domain.net --username=test1
Запросит пароль,
вводим, покажет статус NT_STATUS_OK:
Success (0x0)
Если получаем
сообщение:
could not obtain winbind separator!
Reading winbind reply failed! (0x01)
: (0x0)
То
значит сервис winbind не запущен,
надо его запустить по команде # winbindd.
Если
сообщение:
NT_STATUS_USER_SESSION_DELETED:
User session deleted (0xc0000203)
То возможно забыли
включить машину в домен.
Теперь ставим FreeRadius (последняя версия на дату статьи 3.0.11)
#
pkg install freeradius3
Добавляем
клиента, который будет пользоваться радиусом, в конфигурационный файл /usr/local/etc/raddb/clients.conf (в нашем случае это машина с pfSense)
client 192.168.10.12 {
secret = ХХХpf-SenseXXX
ipaddr = 192.168.10.12
shortname = 192.168.10.12
}
Где
ХХХpf-SenseXXX - это придуманное Вами секретное
кодовое слово для обмена с радиус-сервером.
Также
проверяем секцию client localhost,
чтобы сервер мог обращаться к самому себе:
client localhost {
ipaddr = 127.0.0.1
secret = testing123
…
Теперь настраиваем радиус для работы с ntlm_auth.
(источник wiki.freeradius.org/guide/NTLM-Auth-with-PAP-HOWTO)
Корректируем
конфигурационный файл /usr/local/etc/raddb/mods-available/ntlm_auth. Нужно указать в нем правильный путь до утилиты ntlm_auth и прописать
домен (необязательно). Пример:
program = "/usr/local/bin/ntlm_auth
--request-nt-key --username=%{mschap:User-Name}
--password=%{User-Password}"
Также
создаем файл /usr/local/etc/raddb/policy.d/ntlm_auth со следующим содержимым:
ntlm_auth.authorize
{
if (!control:Auth-Type &&
User-Password) {
update control {
Auth-Type := ntlm_auth
}
}
}
Далее
дополняем файл /usr/local/etc/raddb/sites-enabled/default следующим содержимым (находим соответствующие секции, а также
комментируем модуль pap):
authorize {
…
ntlm_auth
# pap
}
authenticate
{
Auth-Type ntlm_auth {
ntlm_auth
}
…
}
Теперь
добавляем включение радиуса в ранее упоминавшийся файл rc.conf
#
echo 'radiusd_enable="YES"' >> /etc/rc.conf
(либо этой командой, либо вручную)
Проверить
корректность настройки конфигурационных файлов радиуса можно командой:
#
radiusd -X
Ошибки
будут подсвечены.
Возможные
предупреждения при проверке:
[/usr/local/etc/raddb/mods-config/attr_filter/access_reject]:11
Check item "FreeRADIUS-Response-Delay" found in filter list for realm
"DEFAULT".
[/usr/local/etc/raddb/mods-config/attr_filter/access_reject]:11
Check item "FreeRADIUS-Response-Delay-USec" found in filter list for realm
"DEFAULT".
Ignoring "sql" (see
raddb/mods-available/README.rst)
Ignoring "ldap" (see
raddb/mods-available/README.rst)
Если
получили сообщение:
Failed binding to auth address 127.0.0.1 port 18120 bound to server
inner-tunnel: Address already in use
/usr/local/etc/raddb/sites-enabled/inner-tunnel[33]: Error binding
to port for 127.0.0.1 port 18120
То
значит радиус уже запущен и для валидации нужно его предварительно отключить по
команде:
#
service radiusd stop
Старт
радиуса
#
service radiusd start
Теперь можно делать
проверку связи и работу радиус сервера по команде:
#
radtest test1 testpass localhost 1218 testing123
Где,
test1 - логин пользователя
testpass - пароль
пользователя
localhost - машина,
где расположен радиус (в данном случае запрос к самому себе)
1218 - порт по умолчанию
testing123 -
секретное слово по умолчанию для клиента localhost
Возможные ошибки:
Access-Reject:
admin@FreeRADIUS-AO:/#
radtest test1 testpass localhost
0 testing123
Sent
Access-Request Id 169 from 0.0.0.0:40117 to 127.0.0.1:1812 length 89
User-Name = "test1"
User-Password = "testpass"
NAS-IP-Address = 192.168.10.30
NAS-Port = 0
Message-Authenticator = 0x00
Cleartext-Password = "testpass"
Received Access-Reject Id 169 from 127.0.0.1:1812 to 0.0.0.0:0
length 20
(0) -: Expected Access-Accept got Access-Reject
Если ответ Reject,
хотя всё введено правильно, то включаем режим отладки радиуса и смотрим на
каком этапе проблема.
Включение
радиуса в режиме отладки:
#
service radiusd stop
#
service radiusd debug
Если
на самом радиус сервере тест проходит, можно попробовать сделать тест на машине
с pfSense (при условии, что там
установлен модуль freeradius,
иначе проверить можно будет только через pfSense):
#
radtest test1 testpass 192.168.10.30 0 ХХХpf-SenseXXX
В итоге должен быть
ответ: Access-Accept
Далее настраиваем работу протокола mschap (если
требуется).
В
конфигурационном файле /usr/local/etc/raddb/mods-available/mschap нужно скорректировать строку ntlm_auth (указать путь к утилите
ntlm_auth, указать правильный домен (указывать домен необязательно), изменить
параметры запроса имени пользователя, если отличается).
Здесь, возможно
придется поэкспериментировать с вариантами:
ntlm_auth = "/usr/local/bin/ntlm_auth
--request-nt-key --domain=corp.domain.net
--username=%{%{Stripped-User-Name}:-%{%{User-Name}:-None}}
--challenge=%{%{mschap:Challenge}:-00}
--nt-response=%{%{mschap:NT-Response}:-00}"
Или так
ntlm_auth = "/usr/local/bin/ntlm_auth
--request-nt-key --username=%{%{Stripped-User-Name}:-%{%{User-Name}:-None}}
--challenge=%{%{mschap:Challenge}:-00}
--nt-response=%{%{mschap:NT-Response}:-00}"
Или так
ntlm_auth = "/usr/local/bin/ntlm_auth
--request-nt-key --username=%{mschap:User-Name}
--challenge=%{%{mschap:Challenge}:-00}
--nt-response=%{%{mschap:NT-Response}:-00}"
В конфигурационном файле /usr/local/etc/raddb/mods-available/eap нужно заменить опцию:
default_eap_type = md5
Меняем md5 на peap,
в итоге:
default_eap_type = peap
А также
расскомментируем строку
random_file = /dev/urandom
Теперь можно
тестировать работу радиус сервера:
#
radtest -t mschap test1 testpass localhost 0 testing123
Ответы будут такие
же, как было указано ранее.
Возможные ошибки: ошибка 691:
admin@FreeRADIUS-AO:/# radtest -t mschap
test1 testpass localhost 0 testing123
Sent Access-Request Id 191 from 0.0.0.0:13388 to
127.0.0.1:1812 length 145
User-Name = "test1"
MS-CHAP-Password = "testpass"
NAS-IP-Address = 192.168.10.30
NAS-Port = 0
Message-Authenticator = 0x00
Cleartext-Password = "testpass"
MS-CHAP-Challenge = 0x343cf762608b18eb
MS-CHAP-Response =
0x0001000000000000000000000000000000000000000000000000c5d3be2d767350eccce93ac4f1dc4bb7c32558c8d9bd1508
Received Access-Reject Id 191 from 127.0.0.1:1812 to 0.0.0.0:0
length 61
MS-CHAP-Error =
"\000E=691 R=1 C=0dca59ab2eb746b8
V=2"
(0) -: Expected Access-Accept got Access-Reject
Еще варианты ошибок:
MS-CHAP2-Response is incorrect mschap = reject
mschap: ERROR: Program returned code (1) and output 'Logon failure
(0xc000006d)'
Опять же
включаем отладку и смотрим логи.
Если
все тесты прошли успешно, можно пробовать подключать радиус сервер на Captive портале на сервере pfSense, как было задумано в первоначальной
задаче.
Какие еще не исследованные проблемы на данный момент:
1) не стартовала
автоматически служба winbind, возможно не верно указаны параметры запуска.
2)
отказ входа пользователя, если имя указано вместе с доменом, например, test1@corp.domain.net (всегда возвращается
Reject). Возможно надо разбираться
в шаблоне имени пользователя при задании подключения по ntlm_auth.
Также
ради проверки были предприняты неудачные
попытки понизить уровень безопасности на домен контроллере и разрешении
протокола NTLMv1.
Вот
какие поверочные действия были сделаны:
1.
На контроллере домена в реестре в ветке HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\RemoteAccess\Policy
был создан DWORD ключ "Enable NTLMv2 Compatibility" со значением 1.
2.
Через оснастку secpol.msc (Run - secpol.msc) в
Security Options в параметре "Network security: LAN Manager authentication
level" разрешен "Send LM & NTLM Response", а также в
параметре "Minimum session security for NTLM SSP" отключен
"Disable Require 128-bit encryption".
(с) Ella S.
Если Вам понравилась статья, пожалуйста, поставьте лайк, сделайте репост или оставьте комментарий. Если у Вас есть какие-либо замечания, также пишите комментарии.
Огромное спасибо за статью!
ОтветитьУдалить> 1) не стартовала автоматически служба winbind, возможно не верно указаны параметры запуска.
В /etc/rc.conf:
samba_server_enable="YES"
samba_enable="NO"
nmbd_enable="NO"
smbd_enable="NO"
winbindd_enable="YES"
И ещё, после настройки mschap перед "radtest -t mschap" надо сделать service radiusd restart.
Не за что :)
УдалитьСпасибо за уточнения и полезный комментарий.
Вообще говоря, если нужно просто проверять пользователя\пароль в домене, без учета нахождения в группах, то с версии 3.0.8 есть более простой и быстрый способ без использования ntlm_auth: http://wiki.freeradius.org/guide/Active-Directory-direct-via-winbind.
УдалитьТолько радиус придется пересобрать.
В контексте FreeBSD 10.3 это выглядит так:
1) Поставить самбу из пакетов, запустить, проверить, всё как в вашей статье
2) Обновить дерево портов:
pkg install portsnap
portsnap fetch update
3) Установить радиус
cd /usr/ports/net/freeradius3
make config (там можно ничего не менять, Enter)
make CPPFLAGS=-I/usr/local/include/samba4 LDFLAGS=-L/usr/local/lib/samba4 install clean
Когда-нибудь порт поправят, и он будет сам видеть каталоги самбы, но пока так.
Для автоматического обновления силами portupgrade можно эти ключи внести в pkgtools.conf.
4) Настроить clients.conf, как описано у вас, и поправить две строчки в mods-available/mschap, как сказано в howto по ссылке выше.
5) (возможно) перезапустить winbindd
/usr/local/etc/rc.d/samba-server restart
Я проверял, работает.
Удачи :)
Спасибо :)
УдалитьПерезагружаемся
ОтветитьУдалить# reboot
Во FreeBSD reboot после установки пакета???
Вы что это не Windows.
А при чем здесь установка пакета, если перезагрузка после включения машины в домен и изменения конфигов?
УдалитьЯ давным давно подобной вешью баловался, но что-то не помню что нужно перезагружать машину.
УдалитьСпорить не буду, но без перезагрузки не проходили некоторые тесты...
УдалитьФиг знает мож не запущено что было, попробовать рестартануть:
Удалитьservice samba_server restart
В любом слечае статью в закладочку пригодиться в хозяйстве. Спсб.
ЗЫ Я если честно уж и не помню когда на фре перезагружал ее, было с полгода назад по питанию apcupsd погасил ее. Поэтому и удивился.
Еще раз спсб.
Если ответ Reject, хотя всё введено правильно, то включаем режим отладки радиуса и смотрим на каком этапе проблема.
ОтветитьУдалитьВключение радиуса в режиме отладки:
# service radiusd debug
Можно короче
#radiusd -X
Разве "radiusd -X" не запуск проверки корректности конфигурационных файлов?
УдалитьДа и потом он остается в режиме онлайн слушанья, я так пакеты дебажу с CISCO, плюс все видно что куда лезет.
УдалитьСпасибо за дополнения.
УдалитьДобрый день, кто нибудь сталкивался с задачей, авторизацию пользователей AD, только из конкретной AD группы ?
ОтветитьУдалитьНе сталкивалась, т.к. не стояло подобной задачи на тот момент. Если найдете решение, пожалуйста, напишите.
Удалитьв файле /usr/local/etc/raddb/mods-available/ntlm_auth в строке с указанием ключей для команды ntlm_auth обавляем следующую конструкцию
Удалить--require-membership-of="DOMAIN\GROUP_NAME"
Спасибо за пояснение.
Удалитьпривет, подскажите, как эту бяку победить?
ОтветитьУдалитьMS-CHAP-Error = "\000E=691 R=1 C=0dca59ab2eb746b8 V=2"