|
Bog BOS: TACACS (Terminal Access Controller Access Control System) сервер |
|
Последние изменения: |
Последнее изменение текста: 20000411
Скопировано с www.bog.pp.ru: 2024.11.23
IOS 12.0(5). Tac_plus F4.0.2/3.alpha. TACACS+ protocol 1.78.
TACACS - протокол между клиентами и сервером (49/tcp): Authentification (проверка тот ли пользователь за кого он себя выдает), Authorization (права выполнять то или иное действие) и Accounting (учет затраченных ресурсов). Используется Cisco в IOS для расширения внутренних средств контроля за пользователями (невозможно каждый раз переконфигурировать киску, если появился новый клиент) с помощью внешнего сервера. Имеет три модификации: tacacs, xtacacs, tacacs+. Первые две имеют историческое значение. Фирма Cisco дарит исходники тестового tacacs+ демона всем желающим (если знаешь, где искать ;). К сожалению, он несмотря на развитие перманентно остается в состоянии альфа-версии. Весь поток информации между сервером и NAS (network access server) шифруется с использованием общего секрета (key) и MD5.
Версия F4.0.3.alpha. Правим Makefile под gcc и Solaris, USERID и GROUPID под себя (незачем ему работать под root), PIDFILE в область журнала. Расскоментировать MSCHAP (MSCHAP_DES и MSCHAP_MD4_SRC приводит к ошибке компиляции - не находит arap_des.h). Добавить MSCHAP и MSCHAP_DES в CFLAGS (интересно, как это у других работает?). В общем, можно только "ms-chap = cleartext", что совершенно не интересно. Выключил MSCHAP совсем.
Правим do_acct.c так, чтобы в учетный журнал не выдавались пробелы и непечатные символы (IOS 12.0 начал выдавать записи о неудачных попытках соединения, что позволяет хакерам вмешиваться в работу учетной системы, вводя вместо имени пользователя хитро составленную строку, имитирующую строку из учетного журнала).
Якобы maxsess.c для IOS 12 надо править (finger выдает имя пользователя не с 13, а с 15 позиции), но IOS 12.0.5 по-прежнему выдает имя с 13й позиции.
make tac_plus - все откомпилировалось!
В /etc/services добавляем: "tacacs 49/tcp", хотя это вроде бы лишнее.
Засылаем в /usr/local/sbin и даем права "r-sr-s---", чтобы можно было запускать не ис-под суперпользователя.
Для использования алгоритма s/key для аутентификации необходимо подключить libskey.a при сборке.
Для обработки MSCHAP демоном необходимо наличие библиотеки DES (des_setkey() и др.) при сборке. Если DES отсутствует, то обработка MSCHAP все-таки производится, но на NAS, что менее безопасно.mschap.h вместо ключа содержит интересную фразу: "Contact Microsoft for the MSCHAP key". Без такого ключа часть обработки опять-таки будет делаться не демоном, а NAS.
tac_plus
Сигналы:
Использует syslog (LOG_LOCAL6). Отладочная печать в него не выдается.
Подробное описание
синтаксиса есть в
документации, так что я его опущу. В начале файла
должен задаваться ключ (им
шифруются все
передаваемый пакеты, так что его
необходимо тщательно скрывать, знание ключа
позволяет извлечь пароли
пользователей - для борьбы с этим
надо включить
поддержку DES в tac_plus).
key = ключ
тот же ключ д.б. задан в
конфигурации IOS
tacacs-server key ключ
Всю, что начнается с # до конца строки считается комментарием. Если # нужен сам по себе (в паролях, например), то он д.б. заключен в кавычки.
Для каждого вида
деятельности
описываются группы. У меня их две: заход на 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 ppp"
═service = exec { autocmd = "ppp default"═} #
выполнем запуск ppp за
пользователя
═cmd = ppp { permit .* } #
разрешаем ppp
═service = ppp protocol = ip {
═default attribute = permit #
разрешаем IP
═addr-pool = "default" #
навязываем IP адрес клиента из пула
сервера доступа
═dns-servers = "адреса серверов через
пробел"
═inacl =
имя-ACL-который-будет-поставлен-на-входной-интерфейс
═}
}
Теперь описания обычных
пользователей выглядят так:
user =
имя-пользователя {
═login = des
"шифрованный пароль"
═pap = des
"шифрованный пароль"
═after authorization
"имя-личной-программы-дополнительной-проверки $name $port $user" #
если необходимо
═member = telnet | ppp
═maxsess =
число-одновременных-сессий
═service = ppp protocol = lcp { timeout =
макс-длина-сессии-в-секундах}
}
В описании группы задаются параметры общие для всех членов группы. В описании пользователя указываются специфичные для данного пользователя параметры (перекрывают значения параметров в описании группы). Группы могут входить в состав других групп (число уровней иерархии не ограничено). Внутри фигурных скобок могут быть команды:
Специальные пользователи: $enabуровень$, где уровень - это уровень привилегий в EXEC IOS. Позволяет задать внешне-управляемый пароль для перехода на другой уровень привилегий. Задействуется командой: "aaa auth enable default tacacs+".
Специальный пользователь DEFAULT позволяет задавать параметры авторизации по умолчанию.
По умолчанию, 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+ серверу пакет запроса (поля
пакета запроса можно
передавать программе
предварительной
авторизации в виде
параметров) и набор AV пар
(передаются на
стандартный ввод
программме по одной на строке в формате
имя=значение и ожидаются на
стандартном выводе
программы - пробелы
запрещены!). Вызов
программы
оформляется так:
user = имя {
═ ═before autorization
"имя-программы
поле-запроса ..."
═ ═...
}
Полный список полей запроса:
Программа будет вызываться несколько раз, т.к. приходит несколько запросов на аутехтификацию/авторизацию (у меня 4: shell, ppp/ip, ppp/lcp, еще раз ppp/ip). Программа должна передать AV-пары на свой стандартный выход (м.б. изменив их - я вставляю timeout, чтобы киска сама отрубала клиента, перерасходовавшего лимит). Коды возврата: 0 - авторизация разрешена, AV-пары не передаются на NAS; 1 - авторизация запрещена; 2 - авторизация разрешена, модифицированные AV-пары передаются на NAS со статусом AUTHOR_STATUS_PASS_REPL, дальнейшая обработка запроса не делается (включая как ту, что определена конфигурацией tacacs+ сервера, так и программу пост-обработки), нельзя использовать при авторизации комманды; 3 - авторизация запрещена, но все AV-пары передаются на NAS, ═а stderr помещается в поле server-msg и также передается на NAS.
Программа
дополнительной проверки после tacacs
(вместе они не
работают, во всяком случае в версии 2.1).
Позволяет ограничить вход для
определенных
пользователей, категорий
пользователей в заданное время или на
заданный телефонный номер.
Аналогично, но программа будет вызвана уже после
обработки запроса tacacs+
сервером:
group = ppp {
═after authorization
"имя-программы
поле-запроса ..."
═...
}
Список полей запроса смотри выше.
Опять-таки программа будет
вызываться несколько раз для каждого
пользователя. Если
используется внешняя база данных надо
учитывать, что запросы от NAS
обрабатываются
параллельно, так что д.б. сделана
синхронизация, которая д.б.
рассчитана на "внезапную смерть"
блокировавшего процесса (child tacacs+
сервера иногда помирает). Код
возврата: 0 -
авторизация
продолжается, как будто
программа и не
вызывалась
(используется для ведения
статистики), 1 -
авторизация запрещена, 2 -
авторизация разрешена,
модифицированные (м.б.) AV-пары со
стандартного вывода
передаются на NAS вместо AV-пар,
сгенерированных tacacs+ сервером.
Для отладки используйте "debug aaa authorization".
Программы пре- и поставторизации вызываются через sh. Если программа не существует sh возвращает код возврата, зависящий от версии Unix.
tacacs+ не обрабатывает случай зависания программы пре- и поставторизации.
Программы пре- и поставторизации имеют те же права, что и tacas+ (лучше, если не root).
Кавычки в AV-парах посылаемых на стандартный вывод использовать не надо (никто не будет их удалять).
AV-пары авторизации (если разделены знаком равенства, то это обязательный аргумент, если звездочкой, то опциональный):
А вот пример, не вошедший в книжку (raccess {}
обеспечивает доступ к любому порту, если raccess
вообще нет, то и доступа не будет):
user = jim
{
login = cleartext lab
service = raccess {
port#1 = cat1/tty2
port#2 = cat2/tty5
}
}
Учет (account).
В следующей строке должно быть задано имя
учетного файла
accounting file =
полный-путь-к-файлу
Формат файла зависит от версии tacacs+ сервера и версии IOS. Для версии tacacs+ F.4.0.2.alpha и IOS 12.0(3) получается следующая картина. Каждая учетная запись представляет собой одну строку, разделенную на поля символом табуляции (внутри поля могут быть пробелы и табуляции! - поправить do_acct.c и обработку журнала). В начале идут позиционные поля (имя дня недели, имя месяца, номер дня в месяце, локальное время, год, имя или адрес NAS, имя пользователя, имя линии, тип линии, тип события), за ними AV-пары.
Дополнительные AV-пары при учете (также могут использоваться любые AV-пары, определенные для авторизации, замечено использование service, protocol, addr):
В
конфигурацию NAS
добавляем:
═aaa new-model
═tacacs-server host ...
═tacacs-server key ...
═aaa authentication login execckeck tacacs+
═aaa authentication ppp pppcheck tacacs+
═aaa authorization network tacacs+
═service exec-callback
═line 4
═login authentication execcheck
═int async 6
═ppp authentication chap pppcheck
═ppp callback accept
Конфигурация tacacs+:
═user = имя {
═ login/chap = des ...
═ service ppp protocol = lcp { callback-dialstring = 1234567 }
═ service = exec {
═ ═callback-dialstring = 1234567
═ ═callback-line=7
═ ═nocallback-verify = 1
═ }
Проверка синтаксиса конфигурационного файла: tac_plus -P
tac_plus -d уровень-отладки должен сбрасывать отладочную печать в /var/tmp/tac_plus.log. К сожалению, в этот файл попадают только сообщения о запуске tac_plus и все. Отладочную печать мне удалось получить только на консоль, что в моей конфигурации (а/ц терминал) невозможно использовать. Или на stdout при запуске в отладочном режиме (-g).
TACACS сервер заносит в свою (account.tacacs) базу данных (при нынешней конфигурации) запись о каждом конце сеанса PPP пользователя:
(tacacs/ppp_elapsed.sh) процедура извлекает из этой базы данных все записи за последние 86400 секунд (сутки) и суммирует потраченное каждым пользователем время.
наш конфигурационный файл (config.tacacs) изготавливается из базы пользователей WorldGroup и состоит из трех частей:
crontab пользователя содержит строчку, каждый час запускающую tacacs_reload.sh, которая либо запускает tacacs_сервер (если он не был запущен ранее) с конфигурационным файлом или извещает запущенный ранее сервер о необходимости заново прочитать конфигурационный файл.
С помощью tacacs/modem_monitoring.sh процедуры из учетной базы данных TACACS сервера извлекаются данные за последние сутки, сортируются и суммируется траффик (в КБ) ═и время (в минутах) по ключу <имя терм. сервера, номер линии>.
|
Bog BOS: TACACS (Terminal Access Controller Access Control System) сервер |
|
Последние изменения: |