Дано: существующий
домен-контроллер (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"
usermod -a -G winbindd_priv radiusd
Удалитьвместо radiusd в зависимости от ОС может фигурировать иная учетка, например, freeradius