FreeBSD 10: настройка FreeRadius 3 на доменную авторизацию (Samba 4.4, Active Directory). Хождение по мукам…

Дано: существующий домен-контроллер (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 ПК с 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

Не выходя из отладочного режима, запускаем команду radtest и смотрим логи.



Пример лога с ошибкой:


Если на самом радиус сервере тест проходит, можно попробовать сделать тест на машине с 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.
Если Вам понравилась статья, пожалуйста, поставьте лайк, сделайте репост или оставьте комментарий. Если у Вас есть какие-либо замечания, также пишите комментарии.

18 комментариев :

  1. Огромное спасибо за статью!

    > 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.

    ОтветитьУдалить
    Ответы
    1. Не за что :)
      Спасибо за уточнения и полезный комментарий.

      Удалить
    2. Вообще говоря, если нужно просто проверять пользователя\пароль в домене, без учета нахождения в группах, то с версии 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

      Я проверял, работает.
      Удачи :)

      Удалить
  2. Перезагружаемся
    # reboot

    Во FreeBSD reboot после установки пакета???

    Вы что это не Windows.

    ОтветитьУдалить
    Ответы
    1. А при чем здесь установка пакета, если перезагрузка после включения машины в домен и изменения конфигов?

      Удалить
    2. Я давным давно подобной вешью баловался, но что-то не помню что нужно перезагружать машину.

      Удалить
    3. Спорить не буду, но без перезагрузки не проходили некоторые тесты...

      Удалить
    4. Фиг знает мож не запущено что было, попробовать рестартануть:

      service samba_server restart

      В любом слечае статью в закладочку пригодиться в хозяйстве. Спсб.

      ЗЫ Я если честно уж и не помню когда на фре перезагружал ее, было с полгода назад по питанию apcupsd погасил ее. Поэтому и удивился.

      Еще раз спсб.

      Удалить
  3. Если ответ Reject, хотя всё введено правильно, то включаем режим отладки радиуса и смотрим на каком этапе проблема.
    Включение радиуса в режиме отладки:

    # service radiusd debug

    Можно короче


    #radiusd -X

    ОтветитьУдалить
    Ответы
    1. Разве "radiusd -X" не запуск проверки корректности конфигурационных файлов?

      Удалить
    2. Да и потом он остается в режиме онлайн слушанья, я так пакеты дебажу с CISCO, плюс все видно что куда лезет.

      Удалить
    3. Спасибо за дополнения.

      Удалить
  4. Добрый день, кто нибудь сталкивался с задачей, авторизацию пользователей AD, только из конкретной AD группы ?

    ОтветитьУдалить
    Ответы
    1. Не сталкивалась, т.к. не стояло подобной задачи на тот момент. Если найдете решение, пожалуйста, напишите.

      Удалить
    2. в файле /usr/local/etc/raddb/mods-available/ntlm_auth в строке с указанием ключей для команды ntlm_auth обавляем следующую конструкцию

      --require-membership-of="DOMAIN\GROUP_NAME"

      Удалить
    3. Спасибо за пояснение.

      Удалить
  5. привет, подскажите, как эту бяку победить?

    MS-CHAP-Error = "\000E=691 R=1 C=0dca59ab2eb746b8 V=2"

    ОтветитьУдалить