TACACS - протокол между клиентами и сервером Authentification (проверка тот ли пользователь за кого он себя выдает), Authorization (права выполнять то или иное действие) и Accounting (учет затраченных ресурсов). Используется Cisco в IOS для расширения внутренних средств контроля за пользователями (невозможно каждый раз переконфигурировать киску, если появился новый клиент) с помощью внешнего сервера. Имеет три модификации: tacacs, xtacacs, tacacs+. Первые две имеют историческое значение. Фирма Cisco дарит исходники тестового tacacs+ демона всем желающим (если знаешь, где искать ;). К сожалению, он несмотря на развитие перванентно остается в состоянии альфа-версии.
Я взял версию F4.0.2.alpha.
Правим Makefile под gcc и Solaris, USERID и GROUPID под
себя (незачем ему работать под root), MS CHAP пока не
рассматриваем, PIDFILE в область
журнала.
make tac_plus - все
откомпилировалось!
В /etc/services добавляем: "tacacs 49/tcp", хотя это
вроде бы
лишнее.
Засылаем в /usr/local/sbin и даем права "r-sr-s---",
чтобы можно было запускать не ис-под
суперпользователя.
Подробное описание
синтаксиса есть в
документации, так что я его опущу. Имя файла
конфигурации задается ключом _-C при
запуске tac_plus. В начале файла должен
задаваться ключ (им
шифруются все
передаваемый пакеты, так что его
необходимо тщательно скрывать, знание ключа
позволяет извлечь пароли
пользователей - для борьбы с этим
надо перейти на IOS 11.2 и
включить поддержку DES в tac_plus).
key = ключ
тот же ключ д.б. задан в
конфигурации IOS
tacacs-server key ключ
В следующей строке должно быть задано имя
учетного файла
accounting file =
полный-путь-к-файлу
Всю, что начнается с # до конца строки считается комментарием. Если # нужен сам по себе (в паролях, например), то он д.б. заключен в кавычки.
Для каждого вида
деятельности
описываются группы. У меня их две: заход на BBS
group = telnet {
═service = exec { autocmd = "telnet 194.84.39.28 23 " } #
выполняем telnet за
пользователя
═cmd = telnet { permit "^194.84.39.28 23 .*" } #
разрешаем этот telnet и только его
}
и работа в PPP
group = ppp {
═after authorization
"имя-программы-дополнительной-проверки $name $port $user"
═service = exec { autocmd = "ppp default"═} #
выполнем запуск ppp за
пользователя
═cmd = ppp { permit .* } #
разрешаем ppp
═service = ppp protocol = ip {
═default attribute = permit #
разрешаем IP
═addr-pool = "default" #
навязываем IP адрес клиента из пула
сервера доступа
═}
}
Теперь описания обычных
пользователей выглядят так:
user =
имя-пользователя {
═login = des
"шифрованный пароль"
═after authorization
"имя-личной-программы-дополнительной-проверки $name $port $user" #
если
необходимо
═member = telnet | ppp
═timeout =
"сколько-минут-разрешается-работать"
═maxsess =
число-одновременных-сессий
}
В описании группы задаются параметры общие для всех членов группы. В описании пользователя указываются специфичные для данного пользователя параметры (перекрывают значения параметров в описании группы). Группы могут входить в состав других групп (число уровней иерархии не ограничено). Внутри фигурных скобок могут быть команды:
Специальные пользователи: $enabуровень$, где уровень - это уровень привилегий в EXEC IOS. Позволяет задать внешне-управляемый пароль для перехода на другой уровень привилегий. Задействуется командой: "aaa auth enable default tacacs+".
По умолчанию, NAS разрешает вошедшему пользователю все, если ее не сконфигурировать передавать запросы к демону. Демон, уж если запрос попал к нему, наоборот запрещает все по умолчанию. Демон может запретить выполнение команды или использование сервиса или модифицировать их параметры.
Авторизация команд
конфигурируется заданием
регулярных выражений в качестве
шаблонов для сравнения
запрошенной
пользователем команды
(синтаксис аналогичен egrep) и
действия "deny" или "permit":
cmd =
имя-команды═{
═deny/permit шаблон
═...
}
Используется первый подошедший шаблон. Если не подошел ни один, то команда запрещается. Все имена команд предварительно расширяются до их полного вида.Если нужно разрешить все или почти все, то используется строк:
Если
разрешается
выполнение хотя бы одной команды, то неявно
разрешается запуск EXEC, но можно
поменять параметры СЕРВИСА exec
service = exec {
═acl = 4
═autocmd = "ppp default"
}
Авторизация сервисов. При попытке пользователя запустить сервис, NAS посылает демону запрос состоящий из набора AV-пар (attribut=value или attribut*value, если значение необязательно). Например, авторизация PPP/IP состоит из следующих запросов:
Каждый запрос обрабатывается так: ищется в описании пользователя или группы часть соответствующая сервису и протоколу. Затем для каждой обязательной AV пары, пришедшей с NAS, ищется значение атрибута из списка обязательных. Если нашли, AV пара передаются на выход. Если не нашли, ищем первое соответствие среди списка необязательных. Если нашли, передаем на выход. Если не нашли ни там ни там, то в зависимости от авторизации по умолчанию: deny - запретить команду (сервис?), permit - пропустить AV пару на выход. Для опциональной AV пары, пришедшей с NAS, ищется значение атрибута из списка обязательных. Если нашли, AV пара с демона - на выход. Если не нашли, ищем первое соответствие среди списка необязательных. Если нашли, передаем на выход AV пару с демона (при обоих поисках приоритет имеет точное соответствие). Если не нашли ни там ни там, то в зависимости от авторизации по умолчанию: deny - удалить AV пару, permit - пропустить AV пару с NAS на выход. После всего этого, для каждой обязательной AV пары на демоне, проверятся есть ли соответствующая ей пара на выходе, и если нет, то добавляем AV пару с демона на выход. Необязательность AV пары на демоне задается словом optional перед именем атрибута.
Программа дополнительной авторизацией до tacacs.
Программа дополнительной проверки после tacacs (вместе они не работают, во всяком случае в версии 2.1). Позволяет ограничить вход для определенных пользователей, категорий пользователей в заданное время или на заданный телефонный номер.
TACACS сервер заносит в свою базу данных (при нынешней конфигурации) запись о каждом конце сеанса PPP пользователя:
процедура извлекает из этой базы данных все записи за последние 86400 секунд (сутки) и суммирует потраченное каждым пользователем время.
наш конфигурационный файл изготавливается из базы пользователей WorldGroup состоит из трех частей:
crontab пользователя bog содержит строчку, каждый час запускающую tacacs_reload.sh, которая либо запускает tacacs_сервер (если он не был запущен ранее) с конфигурационным файлом или извещает запущенный ранее сервер о необходимости заново прочитать конфигурационный файл.
С помощью процедуры из учетной базы данных TACACS сервера извлекаются данные за последние сутки, сортируются и суммируется траффик (в КБ) ═и время (в минутах) по ключу <имя терм. сервера, номер линии>.