service login
Начиная с сентября 2002 года в дистрибутив программного комплекса NeTAMS был включен сервис weblogin и соответствующий набор скриптов для управления процедурами доступа пользователей через веб-интерфейс. Хотя подобный инструментарий и пользовался популярностью, он был далек от совершенства. Так, настройка этого средства для большой сети требовала значительный усилий и увеличению размера конфигурационного файла. В результате, благодаря многочисленным пожеланиям пользователей, механизм авторизации решено было изменить. При этом был написано новый сервис, а не переделан старый. Новый сервис называется
login.
Основные свойства:
- Хранение информации о доступе клиентов в базе SQL.
- Возможность задания персональных значений таймаута неактивности и абсолютного таймаута. При этом оба эти значения могут быть равны нулю (таймауты не действуют), а сервис будет заниматься исключительно авторизацией.
- Наличие значений таймаутов по умолчанию, и установка граничных значений. Пользователь может иметь возможность менять значения самостоятельно (в то время как скрипт для того еще не написан)
- Перенос блокировки из сферы системных политик на отдельный уровень, что позволит одновременно использовать сервисы login и quota
- Поддержка типа юнита unit user, что дает возможность "роуминга" пользователей, т.е. авторизации с любой машины в сети при привязке статистики не к IP-адресу, а к пользователю.
Первоначальный запуск сервиса login при работающей программе невозможен. Вам необходимо вручную изменить конфигурационный файл и перезапустить NeTAMS. Допустим, что данные уже хранятся в базе данных MySQL, определенной в сервисе data-source с номером 2:
service data-source 2
type mysql
Для старта сервиса login необходимо будет указать номер сервиса-хранилища данных:
service login 0
storage 2
После этих операций запустите NeTAMS. Все остальные настройки можно выполнить при работающей программе. Проверить, работает ли сервис, можно:
- Просмотром лог-файла программы
- Просмотром списка таблиц SQL-базы NeTAMS: mysqlshow netams (должна появиться таблица `login')
- Подключившись к программе через telnet-интерфейс и выполнив команду show config
Команды настройки сервиса login, которые сохраняются в конфигурационном файле, приводят только к установке соответствующих параметров сервиса, но не более. Собственно для обеспечения авторизации отдельных клиентов необходим отдельный набор команд, которые задаются в контексте все в том же сервисе login. Вся информация о паролях пользователей и их правах доступа и значениях таймаутов хранится в SQL-таблице login. Ее формат приведен ниже:
+------------------+------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------------+------------------+------+-----+---------+-------+
| unit_oid | int(10) unsigned | | PRI | 0 | |
| password | varchar(32) | YES | | NULL | |
| inact | int(10) unsigned | YES | | NULL | |
| abs | int(10) unsigned | YES | | NULL | |
| last_changed | int(10) unsigned | YES | | NULL | |
| last_opened_time | int(10) unsigned | YES | | NULL | |
| last_opened_ip | int(10) unsigned | YES | | NULL | |
| last_opened_mac | varchar(18) | YES | | NULL | |
| def_state | int(11) | YES | | NULL | |
| curr_state | int(11) | YES | | NULL | |
+------------------+------------------+------+-----+---------+-------+
- unit_oid - Идентификатор (OID) юнита, является уникальным ключом к базе данных
- password - Пароль пользователя. Никогда не пытайтесь поменять его извне программы путем прямой записи в SQL.
- inact - Величина таймаута неактивности для данного пользователя
- abs - Величина абсолютного таймаута для данного пользователя
- last_changed - Время (в формате UNIXTIME) последнего изменения записи
- last_opened_time - Время (в формате UNIXTIME), когда был в последний раз предоставлен доступ юниту
- last_opened_ip - IP-адрес, с которого был предоставлен доступ юниту
- last_opened_mac - MAC-адрес, с которого был предоставлен доступ юниту
- def_state - Режим доступа этого юнита по умолчанию (например, сразу после старта программы). 0 означает отсутствие доступа, 1 означает разрешения доступа.
- curr_state - Текущий режим доступа этого юнита. 0 означает отсутствие доступа, 1 означает разрешения доступа. К сожалению, по наступлении таймаута не сбрасывается (баг).
При старте сервиса происходит считывание всех доступных записей о юнитах из базы SQL/таблицы "login" в память программы и заполнение соответствующих полей в структурах, описывающих юниты. Если для какого-то юнита нет информации о таймаутах (т.е. соответствующей по индексу OID строки в таблице), то для данного юнита сервис login не будет работать и вопрос о доступе будет определяться работой других механизмов (fw-policy, sys-policy, quota и пр.). Это обеспечивает "прозрачную" работу уже настроенной системы.
Для случая, когда в базе данных есть запись о юните, информация о таймаутах и пароле копируется в соответствующие поля данных о юните. При этом текущее состояние доступа (u->logindata->c_state) становится равным значению по умолчанию (def_state из таблицы). Каждые delay секунд сервис проверяет возможность доступа, и при необходимости отключает юнит обнулением переменной u->logindata->c_state. Она проверяется при каждом прохождении пакета сервисом data-source.
Не пытайтесь редактировать SQL-таблицу login извне своими программами. Все записи должны вноситься скриптами или вручную через telnet-интерфейс программы. Для этого существует три команды сервиса login: set, login и logout. Их поведение и параметры описаны ниже.
Для полного контроля над процессом логинов и записи всей служебной информации в лог-файл и консоль служит новый параметр встроенного отладчика "debug login"
Для вывода информации о логинах служит команда (глобальная, НЕ сервиса login) "show login {name AAA | oid BBBB}"
Написание администраторского веб-интерфейса по привязке юнитов к сервису логинов и клиентского по управлению паролями и параметрами оставляется на потребителя программы NeTAMS. В настоящий момент реализован только примитивный скрипт веб-авторизации по паролю. Он идет в комплекте поставки NeTAMS в каталоге cgi-bin/ и называется login.cgi. Скрипт требует файлов logo-small.gif и netams_api.pl (последней версии), которые находятся в том же каталоге.
Для работы скрипта нужен веб-сервер, интерпретатор Perl и прямые руки администратора. Рекомендуется:
- Использовать протокол HTTPS для доступа к скрипту авторизации
- Настроить доступ к статистике и к скрипту "в обход" NeTAMS, чтобы не считался данный служебный трафик и работала возможность логина при предварительно отключенном пользователе.
- Сделать простой URL и раздать его клиентам для выставления иконки на desktop, например https://loginserver/login.cgi
Необходимо исправить несколько первых строчек скрипта с указанием параметров подключения и путей до каталога со статистикой; можно также исправить его HTML-интерфейс.
Написание скрипта автоматического логина пользователя при входе в виндовс, или при авторизации в домене Windows (через скрипт профиля или групповую политику) оставляется на совести заинтересованных лиц.
default-inact N
Устанавливает значение времени неактивности клиента по умолчанию. Применяется, если при настройке параметров сервиса login для заданного юнита не было указано конкретное время неактивности. Задается в секундах. По умолчанию значение 0.
default-abs N
Устанавливает значение времени абсолютного таймаута клиента по умолчанию. Применяется, если при настройке параметров сервиса login для заданного юнита не было указано конкретное время абсолютного таймаута. Задается в секундах. По умолчанию значение 0.
max_inact N
Максимально допустимая величина времени таймаута неактивности, используется при проверке корректности введенного пользователем (оператором) значения. Задается в секундах. По умолчанию значение 43200 сек = 12*60*60.
min_inact N
Минимально допустимая величина времени таймаута неактивности, используется при проверке корректности введенного пользователем (оператором) значения. Задается в секундах. По умолчанию значение 60 сек.
max_abs N
Максимально допустимая величина времени абсолютного таймаута, используется при проверке корректности введенного пользователем (оператором) значения. Задается в секундах. По умолчанию значение 1036800 сек = 24*12*60*60.
min_abs N
Минимально допустимая величина времени абсолютного таймаута, используется при проверке корректности введенного пользователем (оператором) значения. Задается в секундах. По умолчанию значение 60 сек.
min_passwd_length N
Минимально допустимая длина пользовательского пароля. По умолчанию равно 3 символом, однако в настоящий момент проверки не производится.
delay N
Интервал времени между периодическими проверками всех юнитов на наступление таймаута. Задается в секундах. По умолчанию значение 10 сек.
relogin {yes|no}
Разрешать ли повторный логин для абонента, который считается уже залогиненным? По умолчанию "да".
set-user-ip
Указывает на необходимость в случае успешной авторизации перезаписать IP-адрес юнита (если он имеет тип user) на текущий; при наступлении таймаута или останове доступа адрес сбрасывается в 0.0.0.0. Принимает значения yes или 1 (делать перезаписывание) или no или 0 (не делать). По умолчанию равно 0.
set {name AAA | oid BBBB}
[password CCCC]
[inact DDDD]
[abs EEEE]
[mac 0a:0b:0c:0d:0e:0f]
[strict|nostrict]
Записывает в структуру данных юнита в памяти и одновременно в SQL-базу параметры юнита (определяется по имени или номеру OID):
- Пароль (password)
- Таймаут неактивности (inact)
- Абсолютный таймаут (abs)
- Установленный привязанный MAC-адрес юнита (mac)
- Параметр безусловной привязки (strict) или его отмена (nostrict)
Все значения таймаутов задаются в секундах. Они должны быть или равны нулю, или быть в рамках между минимальным и максимальным значением. Если какая-то из величин таймаутов (или обе) равны нулю, то проверка этого типа таймаута для данного юнита не производится. Если какая-то из величин не указана, будет взято значение по умолчанию (определенное соответственно или в заголовочном файле src/netams.h или параметрами управления сервисов default-inact или default-abs).
login {name AAA | oid BBBB}
password CCCC
[ip A.B.C.D]
[mac JJ:JJ:JJ:JJ:JJ:JJ]
Служит для авторизации юнита и открытия к нему доступа. Обязательно указывать имя или OID юнита, а также пароль. Значения IP- и MAC-адреса должны подставляться внешним скриптом авторизации.
В случае указания неправильного имени юнита получится:
login:0#login name r546-1a
parse: FAIL: unit with name= r546-1a is not exist
Неправильного пароля:
login:0#login name r546-1 password 123
parse: FAIL: password incorrect
Успешной авторизации:
login:0#login name r546-1 password 123456
parse: OK: login success from ip:0.0.0.0, mac:00:00:00:00:00:00
При этом в лог-файле сервера появится соответствующая запись.
logout {name AAA | oid BBBB}
password CCCC
[ip A.B.C.D]
[mac JJ:JJ:JJ:JJ:JJ:JJ]
Команда отключения пользователя, параметры такие же, как и у login.