UniFi Controller, отображение RADIUS логинов

Автор: admin от 31-08-2017, 17:31, посмотрело: 1291

Некоторое время назад прочитал статью (на Хабре, но повторно найти не удалось), в которой рассказывалось о том, как настроить отображение логинов авторизованных RADIUS-пользователей в веб-панели управления контроллером, установленном на *nix системе. Я воспринял, что то конкретное решение подходит лишь для *.nix, поэтому, вдохновившись, решил реализовать подобное на Windows + NPS (aka RADIUS-сервер).

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

Было


UniFi Controller, отображение RADIUS логинов

Будет


UniFi Controller, отображение RADIUS логинов

Информацию как настроить ТД и NPS не привожу, для ознакомления можно воспользоваться публикацией «Аутентификация беспроводных клиентов по учетным записям Active Directory». Хочу отметить, что в моем случае NPS сервер используется только для Wi-Fi авторизации, а Unifi Controller стоит на одной с ним машине. Ниже по тексту будут примечания, что делать, если ваша конфигурация отличается.

Перейдем непосредственно к реализации задуманного. Первым делом нам нужно «отловить» момент успешной авторизации пользователя и получить ключевую информацию, под которой я подразумеваю MAC-адрес клиентского устройства и логин авторизованного пользователя. Для этого необходимо создать в планировщике Windows задачу, триггером для которой будет событие успешной авторизации NPS сервером (Журнал: «Безопасность», источник: «Microsoft Windows security auditing.», код события: 6272). В действиях указываем наш будущий CMD (позже вернемся к нему).

[spoiler=Настройки триггера]UniFi Controller, отображение RADIUS логинов
[/spoiler]
Через GUI Windows настроить передачу данных из события в скрипт нельзя, но не проблема, экспортируем нашу задачу в XML и откроем ее в текстовом редакторе. Нас интересует блок EventTrigger:

<EventTrigger>
	<Enabled>true</Enabled>
	<Subscription><QueryList><Query Id="0" Path="Security"><Select Path="Security">*[System[Provider[@Name='Microsoft-Windows-Security-Auditing'] and EventID=6272]]</Select></Query></QueryList></Subscription>
</EventTrigger>

В него нужно вставить блок ValueQueries с параметрами, «позаимствованными» из события:

<EventTrigger>
	<Enabled>true</Enabled>
	<Subscription><QueryList><Query Id="0" Path="Security"><Select Path="Security">*[System[Provider[@Name='Microsoft-Windows-Security-Auditing'] and EventID=6272]]</Select></Query></QueryList></Subscription>
	<ValueQueries>
		<Value name="SubjectUserName">Event/EventData/Data[@Name='SubjectUserName']</Value>
		<Value name="CallingStationID">Event/EventData/Data[@Name='CallingStationID']</Value>
	</ValueQueries>
</EventTrigger>

[spoiler=Полный текст задачи, без необязательных параметров (хабрапарсер съел > <, а именно они должны быть в блоке Subscription вместо угловых скобок, иначе импорт не пройдет)]
<?xml version="1.0" encoding="UTF-16"?>
<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
  <Triggers>
	<EventTrigger>
		<Enabled>true</Enabled>
		<Subscription><QueryList><Query Id="0" Path="Security"><Select Path="Security">*[System[Provider[@Name='Microsoft-Windows-Security-Auditing'] and EventID=6272]]</Select></Query></QueryList></Subscription>
		<ValueQueries>
			<Value name="SubjectUserName">Event/EventData/Data[@Name='SubjectUserName']</Value>
			<Value name="CallingStationID">Event/EventData/Data[@Name='CallingStationID']</Value>
	</ValueQueries>
    </EventTrigger>
  </Triggers>
  [leech=http://www.osp.ru/win2000/2012/08/13033295/]тут[/leech].<br/>
<br/>
Если NPS сервер обслуживает не только Wi-Fi сеть и на нем много политик, то по ссылке выше указано как добавить дополнительную фильтрацию в условия задачи (блок Subscription), в данном случае можно фильтровать по имени NPS политики.<br/>
[/spoiler]<br/>
Теперь, когда есть все необходимые данные, переходим к скрипту. В нем проводится правка базы mongo, используемой Unifi Controller'ом, а именно — в коллекции user записи с МАК адресом клиентского устройства устанавливается свойство name, равное логину пользователя (обычный update). В CMD это выглядит так:<br/>
<br/>
[code]@ECHO off
set user=%1
set mac=%2
:: меняем в маке - на :
set mac=%mac:-=:%

:: в случае если это первый логин устройства - мака в базе еще нет, ставим "sleep"
ping -n 60 127.0.0.1 > nul

:: mongo регистрозависим, поэтому средствами встроенного в mongo js приводим мак к нижнему регистру
mongo.exe 127.0.0.1:27117/ace  --eval "var mac='%mac%'; db.user.update({ mac:mac.toLowerCase()},{$set:{name:'%user%'} });"

[spoiler=Немного о MONGO клиенте и сервер]Среди бинарников mongo сервера поставляемого с Unifi Controller клиента нет. Его нужно скачать отдельно, при этом предлагаемый к скачиванию клиент был свежее сервера и выполнять апдейт не хотел. Решается скачиванием клиента той же версии.

Проверить версии клиента и сервера можно следующим образом:

C:>mongo.exe 127.0.0.1:27117/ace
MongoDB shell version: 2.2.2
connecting to: 127.0.0.1:27117/ace
> db.version()
2.2.2
> version()
version: 2.2.2
>

Ссылки на скачивание этой версии на сайте MongoDB нет, но не проблема, берем ссылку на любую версию под нужную платформу:

fastdl.mongodb.org/win32/mongodb-win32-i386-2.2.7.zip

И подставляем необходимую нам версию mongo:

fastdl.mongodb.org/win32/mongodb-win32-i386-2.2.2.zip

C 2.2.2 прошло на «УРА».

И, да, со сторонней машины подключиться мне не удавалось, возможно, настройки базы тому виной, разбираться не стал, так как не было необходимости. Но даже с невозможностью удаленно подключиться к базе никто не мешает удаленно выполнить локальную команду на машине с сервером mongo.
[/spoiler]
На этом все, желаю удачи! Принимаю исправления/критику.

[spoiler=Unifi API]Уже после реализации всей затеи и приступив к статье я встретил упоминание о unifi api (видимо, в оригинальной статье, упомянутой вначале, именно на нем было реализовано), но ссылки и поиск на официальной вики информацию не раскрыли. Информация в репозитариях приоткрыла тайну некоторых методов.

Полагаю, что для изменения логина можно обратиться к $baseurl/api/cmd/stamgr и передать строку json={'cmd':'update-sta', 'mac':'${mac}', 'name':'$2', 'email':'$3'}.[/spoiler]

Источник: Хабрахабр

Категория: Системное администрирование, Сетевые технологии

Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.

Добавление комментария

Имя:*
E-Mail:
Комментарий:
Полужирный Наклонный текст Подчеркнутый текст Зачеркнутый текст | Выравнивание по левому краю По центру Выравнивание по правому краю | Вставка смайликов Выбор цвета | Скрытый текст Вставка цитаты Преобразовать выбранный текст из транслитерации в кириллицу Вставка спойлера
Введите два слова, показанных на изображении: *