Online Documentation Server
 ПОИСК
ods.com.ua Web
 КАТЕГОРИИ
Home
Programming
Net technology
Unixes
Security
RFC, HOWTO
Web technology
Data bases
Other docs

 


 ПОДПИСКА

 О КОПИРАЙТАХ
Вся предоставленная на этом сервере информация собрана нами из разных источников. Если Вам кажется, что публикация каких-то документов нарушает чьи-либо авторские права, сообщите нам об этом.




Terminal Access Controller Access Control System

Ссылки

Базовые понятия

TACACS - протокол между клиентами и сервером (49/tcp): Authentification (проверка тот ли пользователь за кого он себя выдает), Authorization (права выполнять то или иное действие) и Accounting (учет затраченных ресурсов). Используется Cisco в IOS для расширения внутренних средств контроля за пользователями (невозможно каждый раз переконфигурировать киску, если появился новый клиент) с помощью внешнего сервера. Имеет три модификации: tacacs, xtacacs, tacacs+. Первые две имеют историческое значение. Фирма Cisco дарит исходники тестового tacacs+ демона всем желающим (если знаешь, где искать ;). К сожалению, он несмотря на развитие перманентно остается в состоянии альфа-версии. Весь поток информации между сервером и NAS (network access server) шифруется с использованием общего секрета (key) и MD5.

Установка

Я взял версию 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---", чтобы можно было запускать не ис-под суперпользователя.

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

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

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

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

  • arap = cleartext "пароль для arap"
  • chap = cleartext "пароль для chap" # заметьте, что в этом случае пароль нельзя шифривать
  • pap = cleartext "inbound pap password"
  • opap = cleartext "outbound pap password"
  • login = cleartext "пароль для текстового диалога useername/password"
  • login = des "шифрованный как Unix пароль для диалога"
  • login = file /etc/passwd
  • login = nopassword
  • login = skey
  • global = cleartext "единый пароль на все случаи жизни"
  • expires = "MMM DD YYYY" # дата протухания пароля, пользователь получает предупреждение за 14 дней

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

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

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

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

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

  • default authorization = permit # на самом внешнем уровне, разрешает все по умолчанию
  • default service = permit # на уровне пользователя, разрешить все по умолчанию для данного пользователя (д.б. первой)
  • default attribut = 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 "имя-программы поле-запроса ..."
...
}
Полный список полей запроса:

  • $user - имя пользователя
  • $name - имя сервера доступа (IP-адрес)
  • $port - порт сервера доступа (в виде ttynn)
  • $address - IP-адрес пользователя или caller-ID (у меня слово "async", как бы запихнуть сюда строку CONNECT?)
  • $priv - уровень привилегий (от 0 до 15)
  • $method - от 1 до 4 (каким способом была проверена подлинность пользователя - authentication method)
    • 1 - none
    • 2 - KRB5 (kerberos, version 5)
    • 3 - line (пароль, привязанный к линии)
    • 4 - enable (команда изменения привилегий)
    • 5 - local (в соответствии с локальной базой данных NAS)
    • 6 - tacacs+
    • 8 - guest (например, guest в ARAP)
    • 16 - RADIUS
    • 17 - KRB4 (kerberos, version 4)
    • 32- RCMD (r-команды, видимо подразумевается .rhosts)
  • $type - от 1 до 4
    1. ASCII
    2. PAP
    3. CHAP
    4. ARAP
    5. MS CHAP (IOS 11.2 и выше)
  • $service - от 1 до 7
    1. login
    2. enable
    3. ppp
    4. arap
    5. pt
    6. rcmd
    7. X25
    8. NASI
    9. FWPROXY
  • $status -
    • pass
    • fail
    • error
    • unknown
  • любое другое выражение будет передано как строка "unknown"

Программа будет вызываться несколько раз, т.к. приходит несколько запросов на аутехтификацию/авторизацию (у меня 4: shell, ppp/ip, ppp/lcp, еще раз ppp/ip). Программа должна передать AV-пары на свой стандартный выход (м.б. изменив их - я вставляю timeout, чтобы киска сама отрубала клиента, перерасходовавшего лимит). Коды возврата: 0 - авторизация разрешена, AV-пары не передаются на NAS; 1 - авторизация запрещена; 2 - авторизация разрешена, модифицированные AV-пары передаются на NAS со статусом AUTHOR_STATUS_PASS_REPL, дальнейшая обработка запроса не делается (включая как ту, что определена конфигурацией tacacs+ сервера, так и программу пост-обработки), нельзя использовать при авторизации комманды.

Программа дополнительной проверки после 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-пары авторизации (если разделены знаком равенства, то это обязательный аргумент, если звездочкой, то опциональный):

  • service - обязательная пара
    • slip
    • ppp
    • arap
    • shell
    • tty-daemon
    • connection
    • system
    • firewall
  • protocol - подмножество сервиса (в основном для ppp)
    • lcp
    • ip
    • ipx
    • atalk
    • vines
    • lat
    • xremote
    • tn3270
    • telnet
    • rlogin
    • pad
    • vpdn
    • ftp
    • http
    • deccp
    • osicp
    • unknown
  • cmd - обязательная пара для сервиса shell: имя команды EXEC
  • cmd-arg - может быть несколько, порядок существенен
  • acl - только при service=shell и cmd=NULL (запуск самого EXEC)
  • inacl
  • outacl
  • zonelist (AppleTalk)
  • addr - сетевой адрес
  • addr-pool - имя адресного пула, из которого взять адрес
  • routing - true/false: обрабатывать ли информацию о маршрутизации
  • route - маршрут для данного интерфейса в виде
    dst-address mask [ routing-address]
    если routing-address опущен, то подразумевается через клиента (peer)
  • timeout - в минутах
  • idletime - в минутах
  • autocmd - только при service=shell и cmd=NULL (запуск самого EXEC)
  • noescape - true/false, запрет использования escape символа - только при service=shell и cmd=NULL (запуск самого EXEC)
  • nohangup - true/false, не разрывать связь после выполнения автокоманды - только при service=shell и cmd=NULL (запуск самого EXEC)
  • priv_lvl
  • remote_user - UID (метод аутентификации - RCMD)
  • remote_host - host (метод аутентификации - RCMD)
  • callback-dialstring
  • callback-line
  • callback-rotary
  • nocallback-verify - true/false - не делать дополнительных проверок после callback

Учет (account).

В следующей строке должно быть задано имя учетного файла
accounting file = полный-путь-к-файлу

Дополнительные AV-пары при учете (мугут использоваться любые AV-пары, определенные для авторизации):

  • task_id
  • start_time (UNIX-стиль: число секунд с 1 января 1970)
  • stop_time
  • elapsed_time
  • timezone
  • event - только если service=system (изменения системного уровня)
    • net_acct
    • cmd_acct
    • conn_acct
    • shell_acct
    • sys_acct
    • clock_change
  • reason
  • bytes
  • bytes_in
  • bytes_out
  • paks
  • paks_in
  • paks_out
  • status - целое число со знаком (4 байта, сетевой порядок байт). 0 - успех, отрицательное число - ошибка, положительное - non-error failure (?!)
  • err_msg

Конфигурирование 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 и все. Отлаочную печать мне удалось получить только на консоль, что в моей конфигурации (а/ц терминал) невозможно использовать.

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

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

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

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

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

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

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

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

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

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

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

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

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



With any suggestions or questions please feel free to contact us