@ Карта сайта News Автора!

Bog BOS: TACACS (Terminal Access Controller Access Control System) сервер

apache inn MySQL nntpcache Cyrus IMAP exim Squid ssh syslog tacacs ProFTPD wu-ftpd xntpd

Последние изменения:
2024.11.22: sysadmin: systemd-journald (централизованное хранение)
2024.11.11: sysadmin: Linux: пространства имён
2024.11.06: sysadmin: настройка TCP/IP в Linux: виртуальный интерфейс и виртуальный мост
2024.10.25: sysadmin: Linux VFS, атрибуты, расширенные атрибуты, ACL

Последнее изменение текста: 20000411
Скопировано с www.bog.pp.ru: 2024.11.23

Bog BOS: TACACS (Terminal Access Controller Access Control System) сервер

Ссылки

Версии

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). Отладочная печать в него не выдается.

Конфигурирование tacacs+

Подробное описание синтаксиса есть в документации, так что я его опущу. В начале файла должен задаваться ключ (им шифруются все передаваемый пакеты, так что его необходимо тщательно скрывать, знание ключа позволяет извлечь пароли пользователей - для борьбы с этим надо включить поддержку 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 = макс-длина-сессии-в-секундах}
}

Проверка подлинности клиента (authentification)

В описании группы задаются параметры общие для всех членов группы. В описании пользователя указываются специфичные для данного пользователя параметры (перекрывают значения параметров в описании группы). Группы могут входить в состав других групп (число уровней иерархии не ограничено). Внутри фигурных скобок могут быть команды:

Специальные пользователи: $enabуровень$, где уровень - это уровень привилегий в EXEC IOS. Позволяет задать внешне-управляемый пароль для перехода на другой уровень привилегий. Задействуется командой: "aaa auth enable default tacacs+".

Специальный пользователь DEFAULT позволяет задавать параметры авторизации по умолчанию.

Проверка прав (authorization).

По умолчанию, NAS разрешает вошедшему пользователю все, если ее не сконфигурировать передавать запросы к демону. Демон, уж если запрос попал к нему, наоборот запрещает все по умолчанию. Демон может запретить выполнение команды или использование сервиса или модифицировать их параметры.

Авторизация команд конфигурируется заданием регулярных выражений в качестве шаблонов для сравнения запрошенной пользователем команды (синтаксис аналогичен egrep) и действия "deny" или "permit":
cmd = имя-команды═{
═deny/permit шаблон
═...
}

Используется первый подошедший шаблон. Если не подошел ни один, то команда запрещается. Все имена команд предварительно расширяются до их полного вида.Если нужно разрешить все или почти все, то используются строки:

Если разрешается выполнение хотя бы одной команды, то неявно разрешается запуск EXEC, но можно поменять параметры СЕРВИСА exec
service = exec {
═acl = 4
═autocmd = "ppp default"
}

Авторизация сервисов. При попытке пользователя запустить сервис, NAS посылает демону запрос состоящий из набора AV-пар (attribut=value или attribut*value, если значение необязательно). Например, авторизация PPP/IP состоит из следующих запросов:

  1. service=ppp
    protocol=ip
    ...
  2. service=ppp
    protocol=lcp # здесь можно задать параметры LCP (callback, например)
    ...
  3. service = ppp
    protocol = ipcp
    ...
  4. если клиент требует адрес, не возвращенный демоном ранее, то делается запрос(ы) на проверку допустомости адреса

Каждый запрос обрабатывается так: ищется в описании пользователя или группы часть соответствующая сервису и протоколу. Затем для каждой обязательной 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

callback (не проверял)

В конфигурацию 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).

Решение проблем

Местные особенности (устарело)

Подсчет времени, который затратил каждый пользователь на PPP

TACACS сервер заносит в свою (account.tacacs) базу данных (при нынешней конфигурации) запись о каждом конце сеанса PPP пользователя:

  1. время (5 полей);
  2. имя терминального сервера;
  3. имя пользователя;
  4. номер порта на терминальном сервере;
  5. async;
  6. stop (это и есть признак конца сеанса);
  7. ключевые параметры, среди которых есть:

(tacacs/ppp_elapsed.sh) процедура извлекает из этой базы данных все записи за последние 86400 секунд (сутки) и суммирует потраченное каждым пользователем время.

Структура нашего конфигурационного файла

наш конфигурационный файл (config.tacacs) изготавливается из базы пользователей WorldGroup и состоит из трех частей:

  1. заголовка, в котором указан ключ шифрования, имя (account.tacacs) файла статистики и описание пользователя bbs из группы telnet с паролем bbs (для demo пользователей).
  2. для каждого платного пользователя два имени входа (<имя пользователя>, <имя пользователя>-ppp ) с паролем, взятым из базы пользователей WorldGroup. Первое имя из группы telnet, второе из группы ppp.
  3. Описание групп:
    telnet (автокоманда telnet 194.84.39.28 23 и с правами только на эту команду) и
    ppp (автокоманда ppp default и соответствующие права).

Запуск tacacs сервера

crontab пользователя содержит строчку, каждый час запускающую tacacs_reload.sh, которая либо запускает tacacs_сервер (если он не был запущен ранее) с конфигурационным файлом или извещает запущенный ранее сервер о необходимости заново прочитать конфигурационный файл.

Учет времени использования каждого модема.

С помощью tacacs/modem_monitoring.sh процедуры из учетной базы данных TACACS сервера извлекаются данные за последние сутки, сортируются и суммируется траффик (в КБ) ═и время (в минутах) по ключу <имя терм. сервера, номер линии>.

@ Карта сайта News Автора!

Bog BOS: TACACS (Terminal Access Controller Access Control System) сервер

apache inn MySQL nntpcache Cyrus IMAP exim Squid ssh syslog tacacs ProFTPD wu-ftpd xntpd

Последние изменения:
2024.11.22: sysadmin: systemd-journald (централизованное хранение)
2024.11.11: sysadmin: Linux: пространства имён
2024.11.06: sysadmin: настройка TCP/IP в Linux: виртуальный интерфейс и виртуальный мост
2024.10.25: sysadmin: Linux VFS, атрибуты, расширенные атрибуты, ACL



Copyright © 1996-2024 Sergey E. Bogomolov; www.bog.pp.ru