
Copyright (c) 1995-1998 by Cisco systems, Inc.

Permission to use, copy, modify, and distribute this software for
any purpose and without fee is hereby granted, provided that this
copyright and permission notice appear on all copies of the
software and supporting documentation, the name of Cisco Systems,
Inc. not be used in advertising or publicity pertaining to
distribution of the program without specific prior permission, and
notice be given in supporting documentation that modification,
copying and distribution is by permission of Cisco Systems, Inc.

Cisco Systems, Inc. makes no representations about the suitability
of this software for any purpose.  THIS SOFTWARE IS PROVIDED ``AS
IS'' AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS FOR A PARTICULAR PURPOSE.

------------------------------------------------------------------------------

Copyright (c) 1989, 1993
The Regents of the University of California.  All rights reserved.

This product includes software developed by the University of
California, Berkeley and its contributors.

------------------------------------------------------------------------------

Copyright 1988,1990,1993,1994 by Paul Vixie
All rights reserved

Distribute freely, except: don't remove my name from the source or
documentation (don't take credit for my work), mark your changes (don't
get me blamed for your possible bugs), don't alter or remove this
notice.  May be sold if buildable source is provided to buyer.  No
warrantee of any kind, express or implied, is included with this
software; use at your own risk, responsibility for damages (if any) to
anyone resulting from the use of this software rests entirely with the
user.

------------------------------------------------------------------------------

Portion copyright (c) 1996 by Middle Volga Communications, Ltd.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
   notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
   notice, this list of conditions and the following disclaimer in the
   documentation and/or other materials provided with the distribution.

THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
SUCH DAMAGE.

------------------------------------------------------------------------------

Copyright (c) 1994
	The Regents of the University of California.  All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
   notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
   notice, this list of conditions and the following disclaimer in the
   documentation and/or other materials provided with the distribution.
3. All advertising materials mentioning features or use of this software
   must display the following acknowledgement:
	This product includes software developed by the University of
	California, Berkeley and its contributors.
4. Neither the name of the University nor the names of its contributors
   may be used to endorse or promote products derived from this software
   without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
SUCH DAMAGE.

------------------------------------------------------------------------------



===================== 1. Что такое tac+ia

На настоящий момент это пакет, состоящий из четыр╠х частей:


- Библиотек, аналогичных системным, для использования их совместно с tacacs+
  и построения на их базе внешних приложений. В их число входят:

      - Библиотека libutil, которая содержит функции алиасинга портов,
        расширенного управления аутентификацией и аккаунтингом отдельно по
        портам, а также ведения дополнительных журналов заходов
        пользователей - файлов utmp(5) и wtmp(5). В дополнение к ней идут
        две утилиты просмотра этих журналов - аналоги утилит who(1) и
        last(1), - и две утилиты ручного "залогинивания/отлогинивания"
        пользователя.

      - Библиотека libpasswd, которая содержит функции для работы с базами
        данных пользователей аналогичного стандартным формата
        (passwd(5)/pwd_mkdb(8)). В дополнение к ней идут утилиты ведения
        этих баз - аналоги утилит pwd_mkdb(8), passwd(1), vipw(8).

- Доработанного демона авторизации и аккаунтинга tac_plus фирмы Cisco
  Systems, Inc., в который включены дополнительные возможности управления
  пользовательскими заходами - в некотором роде расширенный
  администраторский интерфейс. Обеспечена полная совместимость с
  оригинальным продуктом "сверху вниз". В дополнение к демону ид╠т небольшая
  библиотека, содержащая функции для адресации запросов к этому демону,
  которые могут служить для написания собственных NAS'ов (с этой целью демон
  также подвергнут некоторой модификации).

- Демона отслеживания пользовательских лимитов acctd с утилитой
  сопровождения базы пользователей macct, предназначенного для
  автоматического "отключения" исчерпавших свой лимит работы пользователей.

- Демона по выдаче динамических ip адресов dynipd.

- Других программ, доработанных для работы с демоном tac_plus. В их число
  входят:

       - pppd для FreeBSD.

Идея пакета принадлежит Владимиру Бармину (Vladimir Barmin, <bwm@simtel.ru>).
Ему же принадлежит его первая реализация.

Следующая версия называлась tac+bwm+pasa. В ней во многом были использованы
идеи, коды и документальные описания Владимира, а подготовлена она была
Павлом Владимировым (Pavel Vladimirov, <pasa@queen.ru>).

После получения дополнений к пакету от других людей, название было изменено
на tac+ia, что обозначает tacacs+inet-admins - по названию списка рассылки,
в котором производится анонс.

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

Павел Антонов (Paul Antonov <apg@demos.net>)
Владимир Бармин (Vladimir Barmin <bwm@simtel.ru>)
Игорь Валяев (Igor Valiaev <iv@vsu.ru>)
Сергей Вернер (Serge Werner <eff@icomm.ru>)
Павел Владимиров (Pavel Vladimirov <pasa@queen.ru>)
Владимир Волович (Vladimir Volovich <vvv@vsu.ru>)
Дмитрий Ермаков (Dmitriy Yermakov <dyer@sut.ru>)
Андрей Игошин (Andy Igoshin <ai@vsu.ru>)
Дмитрий Карташов (Dmitry Kartashoff <dima@cg.ukrtel.net>)
Александр Колесник (Alexander Kolesnik <sasha@lanck.net>)
Иван Сидоренко (Ivan V. Sidorenko <ivs@tomsknet.ru>)
Вячеслав Силаков (Vyacheslav Silakov <seal@inar.ru>)
Алексей Федоров (Aleksey Fedorov <alexf@vsi.ru>)
Денис Шапошников (Denis Shaposhnikov <wizard@vlink.ru>)
Михаил Шойхер (Mike Shoyher <msh@corbina.net>)

Данную версию (0.96) подготовили Andy Igoshin <ai@vsu.ru>,
Vladimir Volovich <vvv@vsu.ru>.

Пакет тестировался на операционных системах:
AIX 4.2.1
BSD/OS 2.1, 3.0
FreeBSD 3.0
Linux Slackware/RedHat
Solaris 7

Новые версии могут быть найдены на ftp://ftp.vsu.ru/pub/hardware/cisco/tacacs/.

Ниже приведены описания всех частей пакета.



===================== 2. Библиотеки


-------------- 2.1. Библиотека libutil

Если вы не собираетесь использовать во входящем в состав пакета tacacs+
возможности алиасинга портов, расширенного управления аутентификацией и
аккаунтингом отдельно по портам, а также ведения дополнительных журналов
заходов пользователей, то вы можете пропустить данную главу (2.1) и сразу же
перейти к следующей главе (2.2).

Модули из данной библиотеки могут быть присоединены при сборке любой
пользовательской программы с целью замены стандартных функций работы с
файлами журналов заходов пользователей wtmp(5) и utmp(5) на альтернативные
(с небольшими поправками на структуру управляющего файла ttys). Кроме того,
в комплект входят две утилиты для просмотра этих журналов - whotac и lasttac
- аналоги системных утилит who(1) и last(1).

Модули библиотеки и утилит базируются на исходных текстах аналогичных
модулей и утилит из ОС BSD/OS 2.1 фирмы Berkeley Software Design Inc.
(BSDI). В них внесены патчи для возможности использования их под ОС FreeBSD
и Linux.

------ 2.1.1. Файлы, используемые библиотекой

Библиотека libutil использует три файла:

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

Файл состоит из строк, описывающих терминалы (порты) на NAS'ах. Каждая
строка состоит из полей, раздел╠нных табуляциями или пробелами. Все, что
ид╠т после символа '#' считается комментарием и игнорируется. Пустые строки
и строки, состоящие из одного комментария, игнорируются. Длина строки не
должна превышать 256 символов.

Первое поле описывает условную терминальную линию (будем называть е╠ алиасом
порта), второе - имя хоста, на котором располагается эта терминальная линия.
То есть в отличие от стандартного ttys(5) здесь линия идентифицируется не
одним, а двумя полями, поскольку линии принадлежат не локальному хосту, а
удал╠нному, точнее, нескольким удал╠нным.

Последующие поля интерпретируются как флаги терминальной линии и
представляют собой пары flag=value (без пробелов!). Список флагов считается
законченным, как только появляется неизвестный флаг (неизвестное слово). Имя
флага без значения после него также считается неизвестным словом и знаменует
окончание списка. Неизвестное значение флага просто игнорируется и конец
списка не отмечает. Если один и тот же флаг встречается в списке более
одного раза, то рабочим считается его последнее значение. Естественно,
список флагов может быть полностью опущен.

Все остальные поля (вплоть до конца строки или знака '#') интерпретируются
как истинные имена портов, которые будет соответствовать этой условной
линии, то есть будут приравнены к алиасу в случаях, определяемых флагами.
Естественно, само имя условной терминальной линии может быть истинным именем
порта, хотя и необязательно. Рассмотрим простейший пример (список флагов
опущен):

tty1     pool-1    Async1   # line 1

Здесь мы описываем линию на NAS'е pool-1 с именем tty1 (это реальная
терминальная линия) и ставим в соответствие ей также линию (порт) на этом же
NAS'е с именем Async1. Естественно, что это тот же самый порт, просто в
разных случаях IOS может использовать при обращении к tac+ то или иное имя.
Описав линию таким образом, мы можем "объединить" эти имена в одно и
упростить информацию, записываемую в журналы аккаунтинга, а также
конфигурационные файлы, использующие имя терминала. Другой пример:

2345678     pool-1  utmp=no   tty1 Async1   # line 1, phone number 2345678

Здесь мы описали ту же линию, но в качестве е╠ алиаса выбрали номер е╠
входного телефона, а оба реальных имени перенесли в список. Кроме того,
заходы на эту линию не будут фиксироваться в дополнительных журналах ведения
пользователей (флаг utmp=no).

Следует не забывать о допустимой длине алиаса (и реальных им╠н) - не более
UT_LINESIZE символов (обычно 8, для уточнения см. /usr/include/utmp.h).
Допустимая длина имени хоста - UT_HOSTSIZE.

Теперь рассмотрим допустимые флаги. Некоторые из них специфичны для
входящего в пакет демона tac+, некоторые могут использоваться внешними
программами, работающими с дополнительными журналами ведения пользователей.
Такие флаги помечены в списке (*).

Допустимые флаги и их значения:

check=(yes|no)             - использовать не только имя хоста, но и его
                             alias (если имеется) в ходе аутентификации
                             пользователя на этой линии там, где это имя
                             задействовано в проверке (например, в CRON).

pcheck=(yes|no)            - использовать не только имя линии/порта, но и е╠
                             alias в ходе аутентификации пользователя на
                             этой линии там, где это имя задействовано в
                             проверке (например, в CRON).

utmp=(no|asis|true|alias)  - что записывать в дополнительные журналы заходов
(*)                          пользователей в качестве имени хоста при заходе
                             пользователя на эту линию:

                                no - не фиксировать заход вообще

                                asis - то имя, которое найдено в файле ttys
                                       (это может быть как алиас,
                                       соответствие для которого ищется
                                       первым, так и истинное имя хоста)

                                alias - alias, если существует, иначе
                                        истинное имя хоста

                                true - всегда истинное имя хоста

wtmp=(no|asis|true|alias)  - синоним предыдущей команды
(*)

acct=(no|asis|true|alias)  - что записывать в главный журнал аккаунтинга
                             tac+ в качестве имени хоста при заходе
                             пользователя на эту линию. Значения данного
                             флага полностью аналогичны значениям флага
                             utmp.

putmp=(true|alias)         - что записывать в дополнительные журналы заходов
(*)                          пользователей в качестве имени линии при заходе
                             пользователя на эту линию:

                                true - всегда реальное имя линии/порта

                                alias - alias, т.е. условное имя из ttys

pwtmp=(true|alias)         - синоним предыдущей команды
(*)

pacct=(true|alias)         - что записывать  в главный журнал аккаунтинга
                             tac+ в качестве имени линии при заходе
                             пользователя на эту линию. Значения данного
                             флага полностью аналогичны значениям флага
                             putmp.

Значения флагов станут более понятны после знакомства с описанием
модифицированного демона tac+ - разделом 3. Следует лишь отметить, что все
вышепривед╠нные флаги являются допустимыми вне зависимости от параметров
сборки демона - флаги, соответствующие "невключенным" возможностям, будут
просто игнорироваться.

В поставку библиотеки входит пример файла ttys.

utmp, wtmp - смотрите utmp(5), wtmp(5). Формат и назначение полностью
аналогичны.

Смысл управляющего файла ttys состоит в том, что с помощью некоторых
библиотечных функций (t_ttyslot() - см. пункт 2.1.3) можно считывать флаги,
соответствующие определ╠нным линиям на определ╠нных NAS'ах, и основываясь на
их значениях, выполнять те или иные действия, в частности запись в файлы
utmp(5), wtmp(5). Следует обратить внимание, что в эти файлы запись никогда
не будет производиться, если заход произош╠л на пару терминал-хост, которой
не найдено соответствие в файле ttys. За запись в эти файлы также отвечают
соответствующие библиотечные функции (logintac(), login() и loginal() - см.
пункт 2.1.3).

Также следует обратить внимание, что файл wtmp функциями библиотеки не
созда╠тся и в случае его отсутствия этот журнал просто не вед╠тся. Для того
чтобы инициализировать его ведение, необходимо создать файл wtmp нулевой
длины.

Параметры configure:

--enable-utmpfile=PATH [/DATAPATH/utmp]
--enable-wtmpfile=PATH [/DATAPATH/wtmp]
--enable-ttysfile=PATH [/DATAPATH/ttys]

------ 2.1.2. Утилиты, сопровождающие библиотеку

Вместе с библиотекой поставляются три утилиты:

 - whotac - полный аналог who(1)

 - lasttac - полный аналог last(1). Кроме того, добавлен ключ '-s',
   позволяющий показывать результирующее время нахождения на линии с
   секундами - например, не как (02:14), а как (02:14:25).

 - logtac - утилита, "залогинивающая" пользователя с указанным именем на
   указанной паре терминал-хост - т.е. очищающая соответствующее вхождение в
   utmp(5) и заносящая соответствующую запись в wtmp(5). Синтаксис:

   logtac <terminal> <NAS> <user>

   Утилита крайне молчалива и не сообщает об ошибках в процессе
   "залогинивания". Она использует библиотечную функцию login() с
   соответствующей интерпретацией флагов (см. пункт 2.1.3)

 - unlogtac - утилита, "отлогинивающая" пользователя на указанной паре
   терминал-хост - т.е. очищающая соответствующее вхождение в utmp(5) и
   заносящая соответствующую запись в wtmp(5). Синтаксис:

   unlogtac <terminal> <NAS>

   Утилита крайне молчалива и не сообщает об ошибках в процессе
   "отлогинивания". Она использует библиотечную функцию login() с
   соответствующей интерпретацией флагов (см. пункт 2.1.3)

------ 2.1.3. Библиотечные функции

Если вы не собираетесь писать собственные программы с использованием этой
библиотеки, вы можете пропустить все оставшиеся в этой главе (2.1) пункты и
сразу же перейти к следующей главе (2.2).

--- 2.1.3.1

int init_utmp(char *reason)

Должна вызываться при старте и завершении программы. Чистит utmp(5) и
заносит в wtmp(5) запись вида

reason       ~                             Mon Nov  3 16:27

То есть эмулирует закрытие/старт операционной системы.

reason - строка, записываемая в wtmp(5)

Возвращает 0 в случае успешного завершения, в противном случае 1.

Примеры:

init_utmp("reboot");

init_utmp("shutdown");

--- 2.1.3.2

void logwtmp(char *line, char *name, char *host)

Заносит в файл wtmp(5) запись, соответствующую пользователю с именем name на
линии line на хосте host. Никаких проверок (в т.ч. в ttys) не производится.

Пример:

logwtmp("tty1", "guest", "pool-2.provider.com");

--- 2.1.3.3

int t_ttyslot(char *name, char *host, char *alias,
                         char **palias, int *status)

Анализирует файл ttys на предмет вхождения, соответствующего паре host (или
alias) - name (реальное имя терминала/порта). При нахождении такового (name
может соответствовать как алиасу линии в ttys, так и одному из им╠н в списке
реальных) возвращает номер слота в файле utmp, иначе - 0.

Если пара найдена, то модифицирует (не переписывает заново полностью, а лишь
модифицирует!) status в соответствии с флагами в ttys для этого терминала.

alias имеет приоритет над host. Если найдено вхождение именно на alias, то в
status поднимается флаг A_FLAG_FOUND_AL.

Если alias опущен (равен NULL) или если в статусе НЕ ПОДНЯТ флаг
A_FLAG_TTYS, то на alias файл ttys не проверяется, только на истинное имя
(host).

В palias всегда записывается не более чем UT_LINESIZE символов алиаса
(условного имени) линии (если вхождение не найдено, то алиасом считается
name). Это делается функцией strncpy, т.е. при максимальной длине копия
строки не терминируется нуль-байтом.

Все упоминаемые битовые флаги описаны в файле "own_wtmp.h".

Пример:

char s[UT_LINESIZE];
char *palias = s;
int status = A_FLAG_TTYS;
int slot = t_ttyslot("tty1", "pool-1.provider.com", "pool-1", &palias, &status);

--- 2.1.3.4

void logintac(char *name, long time, char *host, char *alias, char *port,
              char *palias, int slot, int status)

Заносит в wtmp(5) и utmp(5) соответствующие записи с временем time для
пользователя с именем name на паре host (или alias) - port (или palias). Для
записи в utmp используется слот slot.

Для выбора между host и alias руководствуется флагами в status:

A_FLAG_UTMP_TR - host

A_FLAG_UTMP_AL - alias

A_FLAG_UTMP_AS - если поднят флаг A_FLAG_FOUND_AL, то alias, иначе host

Если не поднят ни один из этих флагов, то запись не выполняется.

Для выбора между port и palias руководствуется флагом в status:

A_FLAG_PUTMP_AL - если поднят, то palias, иначе port

Все упоминаемые битовые флаги описаны в файле "own_wtmp.h".

Пример:

logintac("john", 902089500, "pool-1.provider.com", "pool-1", "tty1", "PORT1",
                                         1, A_FLAG_UTMP_AL | A_FLAG_PUTMP_AL);

--- 2.1.3.5

void login(struct utmp *ut)

front-end к t_ttyslot() и logintac(). Проверяет данные в аргументе ut (см.
utmp(5)) на соответствие вхождению в ttys, и если таковое обнаружено, то в
wtmp(5) и utmp(5) заносятся соответствующие записи для пользователя
ut->ut_user и времени ut->ut_time с хоста ut->ut_host и линии ut->ut_line.

В качестве начального статуса перед вызовом t_ttyslot используется значение
A_FLAG_UTMP_TR | A_FLAG_PUTMP_AL (то есть записывать истинное имя хоста и
alias линии - е╠ условное имя), которое будет модифицировано флагами в ttys
для соответствующего вхождения.

Примеры:

Залогинить пользователя:

    struct utmp u;
    u.ut_time = time(NULL);
    strncpy(u.ut_host, "pool-2.provider.com", UT_HOSTSIZE);
    strncpy(u.ut_line, "tty1", UT_LINESIZE);
    strncpy(u.ut_user, "guest", UT_NAMESIZE);
    login(&u);

Отлогинить пользователя (очистить линию):

    struct utmp u;
    bzero(&u, sizeof(u));
    u.ut_time = time(NULL);
    strncpy(u.ut_host, "pool-2.provider.com", UT_HOSTSIZE);
    strncpy(u.ut_line, "tty1", UT_LINESIZE);
    login(&u);

--- 2.1.3.6

void loginal(struct utmp *ut, char *alias, int logmode)

front-end к t_ttyslot() и logintac(). Модифицированная функция login().
Отличается от не╠ тем, что на соответствие второму полю в ttys проверяется
не только ut->ut_host, но ещ╠ и alias (причем первым) - при вызове
t_ttyslot() флаг A_FLAG_TTYS поднят. Для занесения записей в wtmp(5) и
utmp(5) достаточно, чтобы совпало одно из двух. При этом, что будет
фигурировать в качестве хоста в этих записях, будет зависеть от аргумента
logmode, который может принимать следующие значения (в скобках даны
альтернативные имена):

UTMP_LOG_ASIS  (A_FLAG_UTMP_AS) - в точности как в совпавшем вхождении в ttys
UTMP_LOG_ALIAS (A_FLAG_UTMP_AL) - всегда alias
UTMP_LOG_TRUE  (A_FLAG_UTMP_TR) - всегда ut->ut_host
0              (A_FLAG_NO)      - запись заноситься не будет

Соответствующий флаг заносится в status перед вызовом t_ttyslot (вместе с
A_FLAG_TTYS и A_FLAG_PUTMP_AL - то есть записывать alias линии - е╠ условное
имя). Естественно, status будет модифицирован флагами в ttys для
соответствующего вхождения.

Все упоминаемые битовые флаги описаны в файле "own_wtmp.h".

Пример:

    struct utmp u;
    u.ut_time = time(NULL);
    strncpy(u.ut_host, "pool-2.provider.com", UT_HOSTSIZE);
    strncpy(u.ut_line, "tty1", UT_LINESIZE);
    strncpy(u.ut_user, "guest", UT_NAMESIZE);
    loginal(&u, "pool-2", UTMP_LOG_ASIS);

------ 2.1.4. Использование библиотеки

Включите в файл, в котором вы собираетесь использовать библиотечные функции,
следующие директивы:

#include <utmp.h>
#include "own_wtmp.h"

При компиляции используйте ключ

-I<каталог_библиотеки>

А при сборке

-L<каталог_библиотеки> -lsystem

или аналогичные ключи для вашего компилятора, если он не совместим с
компилятором GNU C.


-------------- 2.2. Библиотека libpasswd

Если вы не собираетесь использовать во входящем в состав пакета tacacs+
возможности использования аналогичных стандартным баз пользователей, то вы
можете пропустить данную главу (2.2) и сразу же перейти к следующему разделу
(3).

Модули из данной библиотеки могут быть присоединены при сборке любой
пользовательской программы с целью получения сведений о пользователях,
содержащихся в базах данных стандартного формата passwd(5)/pwd_mkdb(8).
Кроме того, в комплект входят три утилиты для ведения этих баз -
pwd_mkdbtac, passwdtac, vipwtac - аналоги системных утилит pwd_mkdb(8),
passwd(1), vipw(8).

Модули библиотеки и утилит базируются на исходных текстах аналогичных
модулей и утилит из FreeBSD 2.2.7. Если вы имеете source/binary license на
ОС BSD/OS 2.1 фирмы Berkeley Software Design Inc. (BSDI), то напишите по
адресу <pasa@queen.ru>, и вы получите версию библиотеки и утилит, основанную
на текстах этой ОС (эта их часть защищена коммерческим копирайтом фирмы и не
может быть использована без лицензии). Однако, это не является обязательным
- версия библиотеки, поставляемая с пакетом, адаптирована под BSD/OS, хотя
синтаксис утилиты pwd_mkdbtac в этом случае и будет несколько отличаться от
BSD/OS'ного.

Параметр configure:

--enable-pwddb={ bsd | bsdi }

------ 2.2.1. Файлы, используемые библиотекой

Библиотека libpasswd использует тр╠х- или четыр╠хфайловые наборы баз данных
пользователей. Подробнее о таком наборе можно прочитать в pwd_mkdb(8).

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

/etc/_basename_

Тогда:

/etc/master._basename_             - secure plain файл
/etc/s_basename_.db                - secure db файл
/etc/_basename_.db                 - insecure db файл
/etc/_basename_                    - insecure plain файл типа Version 7
                                     (в общем случае необязательный)

------ 2.2.2. Утилиты, сопровождающие библиотеку

Вместе с библиотекой поставляются три утилиты:

 - pwd_mkdbtac - аналог pwd_mkdb(8). Отличается от не╠ возможностью задания
   в качестве последнего аргумента базового имени набора (если этот аргумент
   опущен, то используется стандартный набор, задаваемый при сборке). То
   есть командная строка выглядит так:

   pwd_mkdbtac [-c] [-p] [-d <dest dir>] [-u <local username>] file [pwdfile]

Для версии, основанной на текстах BSD/OS:

   pwd_mkdbtac [-c cachesize] [-d] [-l] [-p] [-r] file [pwdfile]

 - passwdtac - аналог passwd(1). Отличается от не╠ возможностью переключения
   между генерацией длинных и коротких паролей (эту роль играет флаг -l),
   возможностью задания (как флага -f с аргументом) базового имени набора
   (если этот флаг опущен, то используется стандартный набор, задаваемый при
   сборке), а также обязательностью задания имени пользователя (поскольку
   связи между пользователем в системе и пользователем с тем же именем в
   используемой базе в общем случае может и не быть, то passwdtac в отличие
   от passwd(1) может использоваться только администратором, но не кем-то
   для смены "своего" пароля, и ни в коем случае не должна быть suid'ной).
   То есть командная строка выглядит так:

       passwdtac [-l] [-f pwdfile] user

  - vipwtac - аналог vipw(8). Отличается от не╠ возможностью задания в
   качестве аргумента базового имени набора (если аргумент опущен, то
   используется стандартный набор, задаваемый при сборке). То есть командная
   строка выглядит так:

       vipwtac [pwdfile]

------ 2.2.3. Библиотечные функции

Если вы не собираетесь писать собственные программы с использованием этой
библиотеки, вы можете пропустить данный пункт (2.2.3), а также следующий
пункт (2.2.4), и сразу же перейти к пункту (2.2.5).

Библиотека поддерживает функции, аналогичные "набору" getpwent(3) и функции
user_from_uid(3), плюс функцию setpwfilet(). Вот полный список прототипов:

struct passwd *getpwentt(void);
struct passwd *getpwnamt(const char *login);
struct passwd *getpwuidt(uid_t uid);
int setpassentt(int stayopen);
int setpwentt(void);
void endpwentt(void);
char *user_from_uidt(uid_t uid, int nouser);
void setpwfilet(const char *pwdfile);

С помощью функции setpwfilet() зада╠тся базовое имя набора, с которым будет
вестись работа(значение NULL будет означать стандартный набор, задаваемый
при сборке). Имя набора всегда нужно задать перед первым вызовом любой
другой функции. Перед заданием другого набора рекомендуется вызвать функцию
endpwentt().

Например:

// Начинаем работу с набором 1 ("/etc/tac1")
setpwfilet("/etc/tac1");
p1 =  getpwnamt("user1");
p2 =  getpwnamt("user2");
p3 =  getpwnamt("user3");
endpwentt();

// Начинаем работу с набором 2 ("/etc/tac2")
setpwfilet("/etc/tac2");
q1 =  getpwnamt("user1");
q2 =  getpwnamt("user2");
endpwentt();

------ 2.2.4. Использование библиотеки

Включите в файл, в котором вы собираетесь использовать библиотечные функции,
следующие директиву:

#include "pwdt.h"

При компиляции используйте ключ

-I<каталог_библиотеки>

А при сборке

-L<каталог_библиотеки> -lpasswd

или аналогичные ключи для вашего компилятора, если он не совместим с
компилятором GNU C.

------ 2.2.5. Настройка библиотеки

В Makefile библиотеки описаны несколько параметров, смысл которых
разъясняется ниже.

TAC_PLUS_USERID
TAC_PLUS_GROUPID

Эти два описания по умолчанию выключены. Это означает, что secure базы
пользователей будут доступны только для root'а. Однако, если вы будете
собирать tac_plus с описанными TAC_PLUS_USERID и TAC_PLUS_GROUPID, то
вам понадобится ведение этих баз от этого же пользователя. При этом
утилиты passwdtac, vipwtac и pwd_mkdbtac при старте от root'а будут
делать смену effective uid и effective gid, а функции библиотеки при
работе от этого пользователя будут обращаться к secure файлам.
Естественно, passwdtac и vipwtac в этом случае также будут работать
при запуске от этого пользователя.

_PATH_DEFAULTT

Значение по умолчанию '/CONFPATH/tac_passwd'. Это базовое имя стандартного
набора, которое будет использоваться функциями и утилитами, когда базовое
имя требуемого набора опущено.

_PATH_PWD_MKDBT

Значение по умолчанию '/SBINDIR/pwd_mkdbtac'. Полный путь к утилите
pwd_mkdbtac, которая входит в состав библиотеки (перед использованием других
утилит необходимо разместить pwd_mkdbtac в данном месте; это делается
командой make install).

PASSWD_PW_FIELDS

По умолчанию закомментировано. Если структура passwd (см. getpwent(3)) в
вашей ОС имеет поле pw_fields (как в FreeBSD), и вы хотите, чтобы оно
заполнялось, раскомментируйте это описание. Наличие поля pw_fields в
struct passwd автоматически проверяется скриптом configure.

LONGPWD

Значение по умолчанию равно 1. Это соответствует генерации по умолчанию
утилитой passwdtac длинных паролей. Опция '-l' утилиты будут переключать е╠
в режим генерации коротких (8-символьных) паролей. Изменение значения на 0
даст обратную картину.



===================== 3. Модифицированный tac_plus

За основу данной версии взят демон tac_plus 3.0.12 alpha компании Cisco
Systems Inc. В него введ╠н ряд дополнений, направленных в основном на
облегчение управлением и контролем за заходами пользователей на NAS'ы, а
также на возможность написания собственных NAS'ов с помощью функций из
библиотеки libtac_plus, поставляемой в дополнение к демону.


-------------- 3.1. Расширения демона и соответствующие параметры компиляции

------ 3.1.1. Определение временнЫх интервалов и терминалов для заходов

При компиляции демона его можно собрать с возможностью задания временнЫх
интервалов и допустимых терминалов (линий) на определ╠нных NAS'ах для
отдельных пользователей или их групп. Это делается с помощью описания
--enable-cron[=PATH] configure (по умолчанию включено).

Суть данного дополнения в том, что для успешно аутентифицированного по
правилам обычного tac_plus пользователя проводится ещ╠ одна проверка и
результат аутентификации зависит также и от е╠ успеха.

Для выполнения проверки введ╠н управляющий каталог, путь к которому описан
в --enable-cron[=PATH] (TAC_PLUS_CRONDIR) (/DATAPATH/tabs по умолчанию, может
быть измен╠н в configure). Если этом каталоге обнаружен файл с именем,
совпадающим с именем проверяемого пользователя, то дальнейший поиск прекращается.
Если такой файл не обнаружен, то начинает действовать общее правило рекурсии
для tac_plus, и соответствующий поиск выполняется для группы, в которую
входит пользователь (если таковая имеется), далее, если опять не найден, для
группы, в которую входит группа, и так далее до нахождения файла, либо
достижения верхушки дерева. Если верхушка достигнута, а файл так и не
обнаружен, то аутентификация считается успешно пройденной. Если же файл
обнаружен, то для проверяемого захода ищется вхождение в этом файле, под
которое он попадает.

Формат файла совпадает с форматом crontab(5), хотя и имеет несколько другой
смысл. Смысл первых пяти полей файла совпадает со смыслом соответствующих
полей в crontab(5) - они задают время, - в данном случае время, в которое
разреш╠н заход. Последующие поля задают терминалы и хосты, на которые заход
в это время возможен. Формат каждого такого поля

<terminal>@<host>

При задании терминалов и хостов можно использовать регулярные выражения в
формате Unix shell (sh(1)/fnmatch(3)), либо в формате regexp(3). Тип
регулярных выражений определяется наличием описания --enable-cronregexp
configure. По умолчанию включены sh(1)/fnmatch(3). Опция --enable-cronregexp
configure приводит к использованию regexp(3).

Комбинация "любой терминал на любом хосте" может быть указана как

*@*

 или просто

*

(здесь и далее примеры даются для случая использования sh(1)/fnmatch(3)).

В ходе проверки данные по аутентифицируемому заходу проверяются на предмет
попадания во вхождения в файле. Если вхождение находится, аутентификация
считается успешно пройденной. Если все вхождения перебраны, и ни одно из них
не подошло по всем параметрам (время, терминал, хост), то аутентификация
отвергается и выда╠тся соответствующее сообщение.

К примеру, если в файле содержатся два следующих вхождения:

* * * * *	     tty1@pool-1.provider.com
* 22-23,0-4 * * *    tty[2-4]@pool-2.provider.com tty[25]@pool-1.provider.com

то это означает, что пользователь может в любое время заходить на терминал
tty1 на NAS'е pool-1.provider.com, а с 22:00 до 4:59 (включительно) кроме
того и на терминалы tty2, tty3, tty4 на NAS'е pool-1.provider.com и
терминалы tty2, tty5 на NAS'е pool-1.provider.com.

Обратите внимание, что проверка времени производится именно по шаблону и
вхождение

* 11-15 * * *  tty[12]@pool-2.provider.com

будет означать, что пользователю будет разреш╠н заход на линии tty1, tty2 на
NAS'е pool-2.provider.com ежедневно с 11:00 до 15:59 включительно. А не с
11:00 до 15:00, как это может показаться на первый взгляд.

Пример файла crontab поставляется с демоном.

Как видно из описания, можно задавать единые правила для целых групп и
переописывать их отдельным пользователям/группам - членам этих групп.

Для разборки таблиц используются функции из утилиты cron(8) из ОС BSD/OS 2.1
фирмы Berkeley Software Design Inc. (BSDI).

Сообщение, выдаваемое при запрете захода, может быть описано для каждого
пользователя/группы (работает стандартная рекурсия - и начинается она с
аутентифицируемого пользователя, а не с группы, для которой обнаружен файл)
с помощью директивы crondeny. Если таковое отсутствует, то используется
сообщение, определ╠нное глобальной директивой crondeny, а если отсутствует и
оно, то стандартное сообщение. Последнее определяется описанием
--enable-cronmsg='MESSAGE' configure. Его значение по умолчанию

"\nSorry, you are not allowed to log in at this time on this line"

Последовательность "\n" в описаниях будет трактоваться как переход на новую
строку, а "\\n" как "\n".

При включении расширенного режима использования переменных (см. пункт
3.1.18) их можно использовать в этих описаниях.

Например:

crondeny = "\nSorry, this line is for internal use only"

user = fedor {
 crondeny = "\n\n\nFedya, call later, please"
}

------ 3.1.2. ВрЕменное блокирование/разрешение заходов

При компиляции демона его можно собрать с возможностью врЕменного
блокирования/разрешения заходов отдельным пользователям или их группам. Это
делается с помощью включения описания --enable-deny[=deny] configure
(по умолчанию включено).

Суть данного дополнения в том, что для успешно аутентифицированного по
правилам обычного tac_plus (и по временнЫм интервалам/терминалам, если эта
проверка включена) пользователя проводится ещ╠ одна проверка и результат
аутентификации зависит также и от е╠ успеха.

Для выполнения проверки введено два управляющих каталога, пути к которым
описаны как --enable-denydir=PATH (TAC_PLUS_DENYDIR) и --enable-allowdir=PATH
(TAC_PLUS_ALLOWDIR) (/DATAPATH/deny и /DATAPATH/allow по умолчанию, можно
изменить в configure). Если в одном из этих каталогов обнаружен файл с именем,
совпадающим с именем проверяемого пользователя, то дальнейший поиск
прекращается. Если такой файл не обнаружен, то начинает действовать общее
правило рекурсии для tac_plus, и соответствующий поиск выполняется для группы,
в которую входит пользователь (если таковая имеется), далее, если опять не
найден, для группы, в которую входит группа, и так далее до нахождения файла,
либо достижения верхушки дерева. Если верхушка достигнута, а файл так и не
обнаружен, то аутентификация считается успешно пройденной. Если же файл
обнаружен, то в зависимости от того, в каком каталоге он найден, аутентификация
считается пройденной (если в allow-каталоге) или не пройденной (если в
deny-каталоге).

В случае, если файл обнаружен в deny-каталоге, его длина не равна 0, и он
может быть прочитан, tac_plus возвращает в качестве сообщения содержимое
этого файла.

Если длина файла равна 0 или он не может быть прочитан, то выда╠тся
сообщение, которое описано для пользователя/группы (работает стандартная
рекурсия - и начинается она с аутентифицируемого пользователя, а не с
группы, для которой обнаружен файл) с помощью директивы admdeny. Если
таковое отсутствует, то используется сообщение, определ╠нное глобальной
директивой admdeny, а если отсутствует и оно, то стандартное сообщение.
Последнее определяется описанием --enable-denymsg='MESSAGE' configure.
Его значение по умолчанию

"\nSorry, this account has been blocked by administrator"

Последовательность "\n" в описаниях будет трактоваться как переход на новую
строку, а "\\n" как "\n".

При включении расширенного режима использования переменных (см. пункт
3.1.18) их можно использовать в этих описаниях.

Например:

admdeny = "\nSorry, you're not our customer now"

user = fedor {
 admdeny = "\n\n\nYou fired, jerk!!!"
}

Порядок проверки каталогов - какой первым проверяется для каждого
пользователя/группы - зависит от описания --enable-deny=deny (DENY_THEN_ALLOW).
По умолчанию оно выключено (меняется в configure) и порядок сначала allow,
потом deny - то есть файл в allow-каталоге имеет приоритет над файлом в
deny-каталоге. Если включить это описание, то порядок будет сначала deny,
потом allow.

Как видно из описания, можно с помощью файлов в deny запрещать заходы целым
группам и открывать их с помощью allow отдельным пользователям/группам -
членам этих групп.

------ 3.1.3. Проверка лимита времени для заходов

При компиляции демона его можно собрать с возможностью проведения проверки
базы лимитов пользовательских заходов. Это делается с помощью описания
--enable-db[=old] configure (по умолчанию включено).

Суть данного дополнения в том, что для успешно аутентифицированного по
правилам обычного tac_plus (а также по временнЫм интервалам/терминалам и на
временную блокировку, если эти проверки включены) пользователя проводится
ещ╠ одна проверка и результат аутентификации зависит также и от е╠ успеха.

Проверка выполняется по базе db-формата --enable-db-file=PATH (TAC_PLUS_DBFILE)
(по умолчанию /DATAPATH/user.db).
Ведение этой базы осуществляется при помощи демона acctd (см. раздел 5).
Можно использовать формат db2, Версия db определяется при configure.

Если также включено описание DBF_1 (по умолчанию это так и есть), то будет
использоваться база пользователей нового формата (подробнее см. пункт 5.1).

Если база отсутствует, аутентификация считается успешно пройденной. В
случае, если остаток времени нулевой (лимит исчерпан), то tac_plus возвращает
в качестве сообщения:

*** User <имя_пользователя>: time limit EXCEEDED!

В случае использования базы нового формата, когда исчерпан общий или суточный
лимит, это сообщение выглядит как:

*** User <имя_пользователя>: total time limit EXCEEDED!

либо как

*** User <имя_пользователя>: daily time limit EXCEEDED!

Аутентификация в этом случае не проходит.

Если лимит времени не исчерпан (значение больше 0), либо, для базы нового
формата, как минимум один лимит безграничен, а второй не исчерпан, то
возвращается сообщение:

*** User <имя_пользователя>: time left <время> minutes.

Для базы нового формата оно выглядит как

*** User <имя_пользователя>: total time left <время> minutes, left for today <время> minutes.

Для безграничного лимита вместо <время> подставляется слово unlimited.

Аутентификация в этом случае считается пройденной.

Если пользователя вообще нет в базе (лимит времени не ограничен), то
либо возвращается сообщение:

*** User <имя_пользователя>: time is unlimited.

либо никакого сообщения не выда╠тся (зависит от опции configure
--enable-db-silent, по умолчанию выключено, что соответствует выдаче сообщения).

Аутентификация в этом случае также считается пройденной.

------ 3.1.3.1. Блокировка заходов пользователей, отсутствующих в базе
                пользовательских лимитов user.db

При компиляции демона его можно собрать с возможностью проведения проверки
базы лимитов пользователей, причем, если пользователь отсутствует в базе, то
не разрешать его заход. Это делается с помощью описания --enable-db-strict
configure (по умолчанию выключено).

------ 3.1.4. Управление терминалами и ведение дополнительных журналов

При компиляции демона его можно собрать с возможностью использования файла
управления терминалами ttys. Подробно об этом файле можно прочитать в пункте
2.1.1.

Все флаги в ttys потерминально переопределяют значения по умолчанию,
заданные с помощью configure, а также значения, заданные в файле alias'ов
(см. пункт 3.1.5).

В configure устанавливаются (и могут быть переназначены) значения для всех
флагов, которые будут использоваться в случае, если они не переописаны в
файлах alias'ов и ttys.

--disable-pcheck (включено по умолчанию)
--disable-putmp  (включено по умолчанию)
--enable-pacct

Описание         Возможные значение     По умолчанию        Флаг
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

PALIAS_CHECK     Описан                         *           pcheck=yes
                 Не описан                                  pcheck=no

PALIAS_UTMP      Описан                         *           putmp=alias
                 Не описан                                  putmp=true

PALIAS_ACCT      Описан                                     pacct=alias
                 Не описан                      *           pacct=true

Другие описания по умолчанию приведены в пункте 3.1.5.

При использовании файла ttys можно также собрать демон с возможностью
ведения альтернативных системным журналов заходов пользователей - файлов
utmp(5) и wtmp(5). Это делается с помощью включения описания --enable-utmp
configure (по умолчанию включено).

В этом случае обо всех пользователях, заходящих через стандартный заход
(login), либо по PPP на пары терминал-хост, описанные в файле ttys будут
делаться записи в файлы wtmp и utmp - в формате соответственно wtmp(5)
и utmp(5).

Условие описания пары терминал-хост в ttys является обязательным для
попадания захода на этот терминал в журнал (но, естественно, не достаточным
- значение флага wtmp=no воспрепятствует этому попаданию).

Следует обратить внимание, что разные версии IOS используют разную логику
аккаунтинга, и поэтому в некоторых случаях на один сеанс работы пользователя
может приходиться несколько стыкующихся записей в журнале wtmp - отдельно на
каждый вид сервиса.

В некоторых случаях в качестве имени IOS переда╠т пустое значение. По
умолчанию записи о таких заходах в дополнительные журналы не заносятся.
Однако, включив описание --enable-logempty[=NAME] (LOG_EMPTY) (по умолчанию
выключено), можно начать вести и такие записи. При этом имя пользователя,
которое будет записываться в журнал, описывается как EMPTY_NAME (по умолчанию
"unknown", можно изменить в configure).

Более подробно об именах файлов по умолчанию и способе их изменить можно
прочитать в главе 2.1.

Обратите внимание, что некоторые сервисы передаются с именем интерфейса, а
не линии, поэтому для попадания их в журналы "в тот же слот", очевидно,
следует объединить их с именами линий

tty0  pool-1 Async0
...
tty15 pool-1 Async15

Добавлена также переменная $palias, которая может использоваться при вызове
пред- и послеавторизационных программ. Е╠ значение равно alias'у порта,
либо, значению переменной $port, если он не описан в ttys.

------ 3.1.5. Алиасинг

При компиляции демона его можно собрать с возможностью использования алиасов
в ходе выполнения аутентификационных процессов и ведения записей в журналах
аккаунтинга. Кроме того, каждому алиасу можно поставить в соответствие некий
набор флагов, определяющий выполнение тех или иных действий в ходе
вышеперечисленных операций. Это делается с помощью включения описания
--enable-aliases configure (по умолчанию включено).

Суть данного дополнения в том, что в файле с именем --enable-aliasesfile=PATH
(TAC_PLUS_ALIAS_FILE) (по умолчанию /DATAFILE/aliases, можно изменить в
configure) можно поставить в соответствие группе истинных адресов и/или им╠н
NAS'а некоторый alias и набор флагов.

Файл алиасов состоит из строк, описывающих alias и его флаги. Каждая строка
состоит из полей, раздел╠нных табуляциями или пробелами. Все, что ид╠т после
символа '#' считается комментарием и игнорируется. Пустые строки и строки,
состоящие из одного комментария, игнорируются. Длина строки не должна
превышать 1024 символа.

Первое поле описывает имя alias'а.

Последующие поля интерпретируются как флаги alias'а и представляют собой
пары flag=value (без пробелов!). Список флагов считается законченным, как
только появляется неизвестный флаг (неизвестное слово). Имя флага без
значения после него также считается неизвестным словом и знаменует окончание
списка. Неизвестное значение флага просто игнорируется и конец списка не
отмечает. Если один и тот же флаг встречается в списке более одного раза, то
рабочим считается его последнее значение. Естественно, список флагов может
быть полностью опущен.

Все остальные поля (вплоть до конца строки или знака '#') интерпретируются
как имена/адреса хостов, которые будет соответствовать этому alias'у.

Рассмотрим простейший пример (список флагов опущен):

pool-1         pool-1.provider.com 192.0.0.1

Здесь описан алиас для некоторого NAS'а, причем на всякий случай в
соответствие алиасу поставлено как доменное имя, так и IP-адрес.

Один и тот же alias может быть поставлен в соответствие разным
именам/адресам и с разными флагами:

pool           wtmp=true pool-1.provider.com
pool           wtmp=asis pool-2.provider.com

При описании более одного alias'а для одного и того же имени/адреса
использоваться всегда будет только первый.

В файле alias'ов можно использовать все флаги, которые описаны в пункте
2.1.1, а также флаг:

ttys=(yes|no)              - использовать не только имя хоста, но и его
                             alias (если имеется) в ходе анализа файла
                             ttys (см. пункт 3.1.4)

Все флаги являются допустимыми вне зависимости от параметров сборки демона -
флаги, соответствующие "невключ╠нным" возможностям, будут просто
игнорироваться.

При использовании файла ttys значения флагов могут быть переопределены
потерминально (см. пункт 3.1.4).

Пример файла aliases поставляется с пакетом.

В configure устанавливаются (и могут быть переназначены) значения для всех
флагов, которые будут использоваться в случае, если они не переописаны в
файлах alias'ов и ttys.

--enable-alias-ttys
--enable-alias-check
--enable-acct-log-mode=MODE
--enable-utmp-log-mode=MODE

Описание         Возможные значение     По умолчанию        Флаг
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

ALIAS_TTYS       Описан                         *           ttys=yes
                 Не описан                                  ttys=no

ALIAS_CHECK      Описан                         *           check=yes
                 Не описан                                  check=no


ACCT_LOG_MODE    A_FLAG_NO                                  acct=no
                 A_FLAG_ACCT_AS                             acct=asis
                 A_FLAG_ACCT_TR                 *           acct=true
                 A_FLAG_ACCT_AL                             acct=alias

UTMP_LOG_MODE    A_FLAG_NO      (0)                         utmp=no
                 A_FLAG_UTMP_AS (UTMP_LOG_ASIS) *           utmp=asis
                 A_FLAG_UTMP_TR (UTMP_LOG_TRUE)             utmp=true
                 A_FLAG_UTMP_AL (UTMP_LOG_ALIAS)            utmp=alias

Следует обратить внимание, что включение флага utmp никак не означает, что
автоматически будут вестись расширенные журналы для всех терминалов данного
NAS'а - терминал все равно должен присутствовать в файле ttys (см. пункт
3.1.4), флаг же лишь предписывает свойства для всех терминалов данного
NAS'а.

Другие описания по умолчанию приведены в пункте 3.1.4.

Добавлена также переменная $alias, которая может использоваться при вызове
пред- и послеавторизационных программ. Е╠ значение равно первому найденному
для имени/адреса NAS'а (т.е. для того, что содержится в переменной $name)
alias'у, а в случае отсутствия такового будет совпадать со значением
переменной $name.

------ 3.1.6. Возможность задания log facility

При компиляции демона можно явно задать ему log facility. Этот делается с
помощью описания --enable-syslog-facility=FACILITY configure (по умолчанию
равно LOG_LOCAL6).

------ 3.1.7. Возможность запрета использования обратной DNS

При компиляции демона можно запретить ему получать по обратной DNS имена
NAS'ов по их адресам. Это делается с помощью выключения описания
--enable-lookup-names configure (т.е. --disable-lookup-names; по
умолчанию включено).

При запрете использования обратной DNS вы должны будете употреблять в файле
ttys (см. пункт 3.1.4) и таблицах проверки временнЫх интервалов и терминалов
(см. пункт 3.1.1) только цифровые IP-адреса NAS'ов, либо их alias'ы (см.
пункт 3.1.5)

Обратите внимание, что даже при включ╠нном --enable-lookup-names (LOOKUP_NAMES)
по умолчанию tac_plus будет использовать обратную DNS только, если он стартовал
в standalone режиме (обычно из-под inetd). Для того, чтобы он делал это в
стандартном режиме демона, необходимо запускать его с ключом -L. В случае,
если --disable-lookup-names, ключ -L, естественно, недоступен.

------ 3.1.8. Описание приглашения и сообщения об отказе в заходе

При компиляции демона можно поменять ему стандартное приглашение на запрос
имени пользователя для аутентификации, а также описать фразу, которая будет
предшествовать любому сообщению, выдаваемому в случае, когда аутентификация
не прошла. Кроме того, их можно поменять и без перекомпиляции - в
конфигурационном файле демона, а сообщение о непрошедшей конфигурации может
перезадаваться также для каждого пользователя/группы (работает стандартная
рекурсия).

Это выполняется с помощью включения описания --enable-unix-login configure
(по умолчанию включено; отключение: --disable-unix-login). Тогда
приглашение описывается как --enable-unix-prompt='STRING', а сообщение
об отказе как --enable-unix-reject='STRING'.

Значения по умолчанию для них соответственно

"\nUser Access Verification\n\nlogin: "

и

"Login incorrect"

В конфигурационном файле для переописания этих строк "на лету" используются
две новые директивы с параметром - prompt и reject соответственно.
Последовательность "\n" в описаниях будет трактоваться как переход на новую
строку, а "\\n" как "\n".

При включении расширенного режима использования переменных (см. пункт
3.1.18) их можно использовать в этих описаниях.

Например:

prompt = "\nCISCO router\n\nlogin: "
reject = "Authentication failed"

user = fedor {
 reject = "Login incorrect"
}

------ 3.1.9. Альтернативный формат даты в журнале аккаунтинга

При компиляции демона можно задать ему альтернативный формат даты для
журнала аккаунтинга (формат предложен Владимиром Барминым). Это делается с
помощью описания --enable-bwm-date configure (по умолчанию включено).

Альтернативный формат - это:

YYYY/MM/DD HH:MM:SS     <seconds from epoch>

Например:

1997/11/06 14:20:09     878815209      pool-2.provider.com       pasa    tty18
      111.11.11.10    stop    task_id=14     start_time=878805339
      timezone=MSK      service=shell     elapsed_time=9869

Сравните со стандартным форматом:

Wed Nov  5 17:56:21 1997 pool-2.provider.com      pasa      tty18
      111.11.11.10    stop    task_id=13      start_time=878735683
      timezone=MSK      service=shell     elapsed_time=6098

------ 3.1.10. Запись в системный журнал информации об отвергнутых запросах

Сообщения обо всех отвергнутых запросах теперь всегда будут заноситься в
системный журнал с приоритетом LOG_INFO.

Например:

Nov 12 17:01:38 tacserver tac_plus[23011]: login query for 'hacker' tty1 from
                pool-2.provider.com rejected
Nov 15 18:31:11 tacserver tac_plus[12457]: enable query for 'lamer' tty18 from
                pool-2.provider.com rejected

------ 3.1.11. Задание конфигурационного файла по умолчанию

Теперь демон можно запускать без ключа -C. Тогда он будет использовать файл
конфигурации по умолчанию, который зада╠тся описанием --enable-taccfgfile=PATH
configure (по умолчанию /CONFPATH/tac_plus.conf).

------ 3.1.12. Задание файла журнала аккаунтинга по умолчанию

Теперь при компиляции можно задать имя файла журнала аккаунтинга (accounting
file), используемое по умолчанию. Оно зада╠тся описанием --enable-acctfile=PATH
configure (по умолчанию /DATAPATH/acctfile).

------ 3.1.13. Расширенный поиск вхождения пользователя в конфигурационном
               файле

--- 3.1.13.1. Регулярные выражения в именах пользователей

Если собрать демон с включ╠нным описанием --enable-name-regexp configure
(по умолчанию включено), то появится возможность использовать в
именах пользователей, описываемых директивой user, регулярные выражения.
Демон будет автоматически приравнивать всех пользователей с именами,
попадающими под эти выражения, к пользователю, в имени которого использовано
это выражение (дальнейшая рекурсия также работает).

Регулярные выражения могут использоваться двух типов - Unix shell
(sh(1)/fnmatch(3)) и regexp(3). Тип выражения определяется описанием
--enable-name-regexp[=literal] (по умолчанию включено, что соответствует
regexp(3)).

Демон автоматически определяет содержит ли имя пользователя регулярные
выражения, или нет, на основании того, встречается ли в нем хоть один из
нижепривед╠нных метасимволов:

!*?[                             - для sh(1)/fnmatch(3)

^$.[()|?+*\                      - для regexp(3)

Явное описание пользователя в конфигурационном файле всегда перебивает
какие-либо поиски в именах пользователей, содержащих регулярные выражения. В
именах групп использовать регулярные выражения нельзя (то есть имя группы
всегда будет трактоваться просто как литеральная константа, вне зависимости
от того, содержит ли оно метасимволы).

В случае, если конкретное имя попадает под шаблоны в именах нескольких
пользователей, то приоритет отда╠тся первому по порядку описания в
конфигурационном файле.

Имя пользователя, содержащие метасимволы, одновременно может трактоваться
ещ╠ и как литеральная константа, то есть считаться описанием пользователя с
точно таким именем, если --enable-name-regexp=literal.

Например:

user = who[0-9] {
 member = group1
}

user = who* {
 member = group2
}

user = who5 {
 member = group3
}

Здесь пользователи 'who[0-9]' и 'who*' являются шаблонами (использован
формат sh(1)/fnmatch(3)), и все пользователи, чьи имена попадут под тот или
иной шаблон, будут
приравнены к соответствующему пользователю и соответственно войдут в ту или
иную группу 'group1' или 'group2'.

who1 who2   -> who[0-9] (по порядку в файле) ... group1
whois       -> who* ... group2

Пользователь 'who5', чь╠ имя также попадает под оба шаблона, тем не менее не
будет ни к чему приравнен, поскольку описан явно.

Некоторый пользователь с именем 'who[0-9]' будет считаться описанным явно
только если при сборке было описание --enable-name-regexp=literal, в противном
случае он будет приравнен к 'who*', поскольку попад╠т под этот шаблон.
Некоторый пользователь с именем 'who*' будет считаться описанным явно только
если при сборке было описание --enable-name-regexp=literal, в противном случае
никакие конкретные правила из примера на него распространяться не будут.

Поскольку при использовании формата regexp(3) имена пользователей '$enable$'
и '$enab%d$' будут трактоваться как регулярные выражения, то в этом случае
(и только в этом - в случае sh(1)/fnmatch(3) все оста╠тся по-прежнему)
символ '$' будет замен╠н на другое сочетание символов, определяемое как
--enable-name-regexp-prefix=VALUE configure (по умолчанию равно "__" (два
подч╠ркивания), то есть имена будут выглядеть как '__enable__' и '__enab%d__').
Ещ╠ раз обратите внимание, что в случае использования sh(1)/fnmatch(3) это
переописание силы иметь не будет.

--- 3.1.13.2. Auto membering

При компиляции демона можно задать ему режим работы с auto membering'ом. Это
делается с помощью описания --enable-auto-members configure (по умолчанию
включено).

Суть данного дополнения в том, что при описании группы в конфигурационном
файле демона можно будет использовать ключевое слово users с параметром.
Параметр является шаблоном (регулярным выражением), описывающим,
пользователи с какими именами автоматически считаются членами данной группы
(дальнейшая рекурсия также работает).

Регулярные выражения могут использоваться двух типов - Unix shell
(sh(1)/fnmatch(3)) и regexp(3). Тип выражения определяется описанием
--enable-auto-regexp configure (по умолчанию выключено, что соответствует
sh(1)/fnmatch(3)).

Если некоторый пользователь описан в конфигурационном файле явно и также
явно для него описано членство, то это всегда перебивает auto membering.

Если некоторый пользователь описан в конфигурационном файле явно, но
членство для него явно не описано, то под auto membering он попадает только
если при сборке включено описание --enable-auto-infile (по умолчанию включено).
При этом в случае использования --enable-name-regexp (см. подпункт
3.1.13.1) пользователи, в чьих именах использованы метасимволы, проверяются
на auto membering только в случае --enable-name-regexp=literal.

На группы auto membering не распространяется.

В случае, если имя пользователя попадает под шаблоны в нескольких группах,
то приоритет отда╠тся первой по порядку описания в конфигурационном файле
группе.

Например:

group = admin {
}

group = who {
 users = who*
}

user = whotinenko {
 member = admin
}

user = whoall {
}

В данном примере описана группа who, которая автоматически включает в себя
всех пользователей, чьи имена попадают под шаблон 'who*' (использован
формат sh(1)/fnmatch(3)).

Например, некоторый неописанный явно пользователь 'who1' - член группы who.

Но явно описанный пользователь 'whotinenko' - член группы admin, поскольку
для него членство указано явно.

А явно описанный пользователь 'whoall' будет членом группы who только если
при сборке было использовано описание --enable-auto-infile.

--- 3.1.13.3. Общий порядок поиска вхождения

В общем случае, когда отрабатывается запрос на некоторое имя, демон
руководствуется следующим алгоритмом при поиске соответствия этому имени в
конфигурационном файле:

1. Поиск точного вхождения имени в файле

   Если не найдено, то п.2.

   Если найдено, но содержит метасимволы и собрано с --enable-name-regexp
   то п.2.

   Если явно не указано членство, но собрано с --enable-auto-members и
   --enable-auto-infile, то
   {

    Поиск во всех группах с auto membering'ом сверху вниз в файле.

    Если найдена соответствующая группа, то установка членства в ней.

   }

   Выход (найдено).

2. Если собран с --disable-name-regexp, то п.3.

   Поиск по всем пользователям с шаблонными именами сверху вниз в файле.

   Если не найден, то п.3.

   Если явно не указано членство, но собрано с --enable-auto-members,
   --enable-auto-infile и --enable-name-regexp=literal, то
   {

    Поиск во всех группах с auto membering'ом сверху вниз в файле для
    найденного шаблона.

    Если найдена соответствующая группа, то установка членства в ней.

   }

   Выход (найдено).

3. Если собран с --disable-auto-members, то п.4.

   Поиск во всех группах с auto membering'ом сверху вниз в файле.

   Если найдена соответствующая группа, то установка членства в ней, иначе
   п.4.

   Выход (найдено)

4. Если собран с --disable-defuser-always, то п.5.

   Поиск точного вхождения имени --enable-default-username='STRING' в файле.

   Если не найдено, то п.6.

   Если явно не указано членство, но собрано с --enable-auto-members и
   --enable-auto-infile, то
   {

    Поиск во всех группах с auto membering'ом сверху вниз в файле.

    Если найдена соответствующая группа, то установка членства в ней.

   }

   Выход (найдено)

5. Если запрос на на авторизацию, то п.6.

   Если имя == --enable-default-username='STRING', то п.6.

   Имя = --enable-default-username='STRING'

   Переход на п.1

6. Выход (не найдено)


По пп.4-5 алгоритма дополнительная информация содержится в пункте 3.1.24
документа.

------ 3.1.14. Дополнительные проверки для enable-аутентификации

По умолчанию дополнительные проверки (--enable-cron, --enable-deny, --enable-db
- см. пункты 3.1.1 - 3.1.3) делаются только при аутентификации пользовательских
заходов, но не делаются при аутентификации enable (поскольку в tac_plus
enable-аутентификация делается с помощью специальных пользователей с именами
типа $enable*$, и в общем-то пользователь с таким именем может сделать и
заход, то следует обратить внимание, что при подобном заходе эти проверки
также будут сделаны, но их не следует путать с проверками для
enable-аутентификации).

При сборке демона можно включить эти проверки и для enable-аутентификации. В
этом случае они будут проводиться по соответствующему имени из семейства
$enable*$. Делается это включением описаний --enable-cronenable,
--enable-denyenable и --enable-db-enable configure (по умолчанию выключены).

------ 3.1.15. Расширенный синтаксис директивы login

При компиляции демона его можно собрать с возможностью расширенного
синтаксиса директивы login для пользователей и групп - в число е╠
параметров войдут также ещ╠ и "permit", "deny", "none" и "nopassword".

Это достигается включением описания --enable-none-login configure (по умолчанию
включено).

Смысл новых параметров следующий:

permit     - не выдавая приглашение Password: и не проводя никаких
             верификационных процедур разрешить заход. (==nopassword).

deny       - не выдавая приглашение Password: и не проводя никаких
             верификационных процедур не дать захода.

none       - не выдавая приглашение Password: провести все верификационные
             процедуры (кроме проверки пароля) и поступить в соответствии с их
             результатом. Рекурсия работает как обычно.

Например:

group g1 {
 login = none
}

user u1 {
 login = permit
}

Это распространяется также и на enable-аутентификацию в случае, когда
директива используется для пользователей семейства $enable*$ (но рекурсия не
поддерживается, как и обычно в таком случае).

------ 3.1.16. Сообщения при успешной аутентификации

В демоне восстановлена работоспособность директивы message для
пользователя/группы. В случае успешного захода пользователя ему выда╠тся
сообщение, заданное этой директивой. Это сообщение выда╠тся только в случае
захода, в случае же enable-аутентификации выда╠тся сообщение, заданное
директивой emessage, поддержка которой включается описанием --enable-emessage
configure (по умолчанию включено). Причем подразумевается директива именно
для самого пользователя, а не для enable-пользователя. Рекурсия работает как
обычно.

Последовательность "\n" в описаниях сообщений будет трактоваться как переход
на новую строку, а "\\n" как "\n".

При включении расширенного режима использования переменных (см. пункт
3.1.18) их можно использовать в этих описаниях.

------ 3.1.17. enable-аутентификация на per user основе

При компиляции демона его можно собрать с возможностью проведения
enable-аутентификации на per user основе. Это достигается включением
описания --enable-peruser-enable configure (по умолчанию включено).

В этом случае для пользователя и группы вводится новая директива enable,
синтаксис которой таков:

   enable   = <enable_spec>


   <enable_spec>    := file <filename> |
		       cleartext <password> |
                       des <password> |
                       permit |
                       deny |
                       none |
                       login

Смысл директивы в следующем. Если она введена для пользователя/группы
(рекурсия для е╠ поиска работает как обычно), то при попытке
enable-аутентификации для него, она выполняется не по общим правилам (т.е.
по enable-пользователям), а по самому пользователю и в соответствии с этой
директивой. Параметры имеют следующее значение:

file <filename>
cleartext <password>
des <password>
         - в случае этих параметров проводится запрос пароля, проверка его
           (в случае файла - по имени самого пользователя, а не
           enable-пользователя) и затем обычная процедура верификации для
           этого пользователя, за тем исключением, что дополнительные
           проверки (опять-таки по имени самого пользователя) проводятся
           только если включ╠н соответствующий XXXX_FOR_ENABLE (см. пункт
           3.1.14), а вместо сообщения, описанного директивой message,
           выда╠тся сообщение, описанное директивой emessage (см. пункт
           3.1.16). Рекурсия работает как обычно.

none   -   одно отличие от первого случая: пароль не запрашивается и не
           проверяется. Остальное аналогично.

login    - одно отличие от первого случая: запрос/проверка пароля проводятся
           по общим правилам для этого пользователя. То есть пароль
           запрашивается и проверяется только в том случае, если для
           пользователя/группы не стоит login = none, deny или permit, а
           сама его проверка ид╠т по директивам login, global, файлу с
           паролями по умолчанию и т.д. Остальное аналогично.

permit   - не выдавая приглашение Password: и не проводя никаких
           верификационных процедур разрешить аутентификацию

deny     - не выдавая приглашение Password: и не проводя никаких
           верификационных процедур запретить аутентификацию

Например:

group g1 {
 enable = none
}

user u1 {
 login = cleartext "noproblem"
 enable = login
}

------ 3.1.18. Использование переменных в некоторых директивах

При компиляции демона его можно собрать с возможностью использования
переменных не только при вызове пре/пост-авторизационных программ, но и в
строках, задаваемых директивами prompt, reject, message, emessage, crondeny,
admdeny, а также в командах. Это достигается включением описания
--enable-more-subst configure (по умолчанию включено; отключение:
--disable-more-subst).

Следует обратить внимание, что значения некоторых переменных для директив
prompt, reject, message, emessage, crondeny и admdeny будут иметь несколько
иной смысл. Поскольку это не затрагивает основных переменных, связанных с
именами пользователя, NAS'а, порта и т.п., то подробности опускаются.
Желающие могут обратиться к модулю programs.c и сравнить функции lookup() и
lookup2().

------ 3.1.19. Запрет проверки finger'ом для MAXSESS

При компиляции демона его можно собрать с возможностью отказа от проверки на
максимальное количество сессий для пользователя (MAXSESS) с помощью
finger'а. Эта проверка выполняется tac_plus в дополнение к проверке по его
внутренней аккаунтинговой базе, когда авторизуемый пользователь заходит на
асинхронный порт и согласно проверке по базе лимит его сессий превышен.
Отключить эту дополнительную проверку можно включив описание --disable-finger
configure (по умолчанию --enable-finger).

------ 3.1.20. Модификации для использования с NAS на базе Unix-boxes

Если вы не собираетесь использовать демон совместно с NAS на базе
Unix-boxes, написанными с использованием функций из поставляемой с пакетом
библиотеки libtac_plus (см. главу 3.2), вы можете пропустить этот пункт и
сразу же перейти к следующему (3.1.21)

--- 3.1.20.1. Конфигурационный файл

NAS, использующий функции из библиотеки, будет читать свою конфигурацию из
файла с именем --enable-resolvfile=PATH (TAC_RESOLV_FILE) (по умолчанию
/CONFPATH/tac_plus.conf).

Более подробно об этом можно прочитать в главе 3.2.

--- 3.1.20.2. Значение тайм-аута

NAS, использующий функции из библиотеки, будет пытаться установить
соединение с tac_plus в течении времени, равному --enable-connect-timeout[=VALUE]
секунд (по умолчанию 10), после чего выдаст сообщение об ошибке.

Более подробно об этом можно прочитать в главе 3.2.

--- 3.1.20.3. Значения uid, gid, home, shell для пользователей,
              не прописанных в passwd

Модифицированный tac_plus будет возвращать NAS'у, использующему функции из
библиотеки, информацию об аутентифицированном пользователе (см. главу 3.2),
в частности его uid, gid, домашний каталог и shell. Все эти данные берутся из
passwd-файла tac_plus. Но если пользователь не прописан в этом файле, а
завед╠н только в конфигурационном файле tac_plus, то в качестве uid, gid,
домашнего каталога и shell'а будут возвращены значения --enable-nopuid=UID,
--enable-nopgid=GID, --enable-nophome=PATH и --enable-nopshell=PATH
соответственно (по умолчанию 32767, 32766, "" и "" соответственно).

------ 3.1.21. Дополнительные проверки для PAP/CHAP-аутентификации

По умолчанию дополнительные проверки (--enable-cron, --enable-deny, --enable-db
- см. пункты 3.1.1 - 3.1.3) делаются только при аутентификации пользовательских
заходов через стандартный login, но не делаются при аутентификации через
PAP/CHAP.

При сборке демона можно включить эти проверки и для PAP/CHAP-аутентификации.
Делается это включением описаний --enable-cronppp, --enable-denyppp и
--enable-db-ppp (по умолчанию выключены).

------ 3.1.22. Задание файла пользователей для MAXSESS

Теперь имя файла, в котором демон будет держать базу залогиненных
пользователей, используемую для проверки максимально разреш╠нного количества
сессий можно описать --enable-wlogfile=PATH configure
(по умолчанию /DATAPATH/tac_who.log), а также изменить его значение в
конфигурационном файле с помощью директивы

wholog file <string>

Например:

wholog file /tmp/tacwho

------ 3.1.23. Максимальная длина входной очереди на socket'е

Теперь при сборке демону можно задать значение максимальной длины входной
очереди на socket'е с помощью --enable-somaxconn=VALUE configure (по умолчанию 5).
Подробнее см. listen(2).

------ 3.1.24. Имя пользователя-по-умолчанию для авторизации

Теперь при сборке демону можно задать значение имени
пользователя-по-умолчанию для авторизации, то есть имени, которое будет
использоваться, когда имя пользователя в запросе отсутствует, или же не
описано в конфигурационном файле демона явно, либо через шаблоны.
Параметр configure --enable-default-username='STRING'
(по умолчанию - DEFAULT).

Кроме того, этот же пользователь-по-умолчанию может быть использован и как
шаблон для аутентификации в случае, когда имя пользователя не описано в
конфигурационном файле явно и не попадает под явные шаблоны и auto
membering. Для этого необходимо включить в configure описание
--enable-defuser-always (по умолчанию выключено).

------ 3.1.25. Использование баз пользователей формата passwd(5)/pwd_mkdb(8)

Теперь при сборке демон можно собрать с поддержкой баз пользователей в
формате passwd(5)/pwd_mkdb(8) вместо обычного файла. Это делается с помощью
включения описания --enable-pwddb={ bsd | bsdi } configure (по умолчанию
выключено).

Демон понимает поле expire в базе и использует его. Это поле имеет приоритет
над данными в поле shell'а - последнее используется только в случае
незаполненности (либо нулевого значения) поля expire.

ПРИМЕЧАНИЕ: Это не относится к проверкам, выполняемым по стандартному
системному файлу (то есть когда имя файла паролей совпадает с /etc/passwd),
этот случай рассматривается в следующем пункте (3.1.26).

Дополнительная информация о базах пользователей этого формата содержится в
пункте 2.2.1.

Перевести файл старого формата в новый можно следующим образом (для этого
вам потребуется утилита pwd_mkdbtac из комплекта библиотеки libpasswd (см.
пункт 2.2.2)):

Допустим, вы используете файл /etc/tac_passwd

mv /etc/tac_passwd /etc/tac_passwd.backup
awk -F ':' '{print $1 ":" $2 ":" $3 ":" $4 "::0:0:" $5 ":" $6 ":" $7 }' \
                        /etc/tac_passwd.backup > /etc/tac_passwd.xxx
cp /dev/null /etc/master.tac_passwd
pwd_mkdbtac -p /etc/tac_passwd.xxx /etc/tac_passwd

Копия оригинального файла сохранится как /etc/tac_passwd.backup

Если вы собрали библиотеку с описанными значениями uid/gid, и
соответственно собираете демон с опцией изменения uid/gid после запуска, то
выполнять данную процедуру также рекомендуется от этого пользователя (он
должен иметь право создавать/удалять файлы в каталоге, где вы храните базы
пользователей). [при использовании configure это происходит автоматически]

------ 3.1.26. Расширения expires

Теперь демон понимает дату expires как в сво╠м формате (MON DD YYYY), так и
в формате числа, показывающего сколько секунд прошло с начала эпохи по GMT.
Дата, представляющая собой одно-единственное число, интерпретируется именно
так, в противном случае производится попытка е╠ разбора как даты в
стандартном формате. Это относится как к директиве expires в
конфигурационном файле, так и к данным в поле shell'а файла пользователей.

Если вы хотите, чтобы при проверке пользователей в стандартном системном
файле (то есть когда имя файла паролей совпадает с /etc/passwd) демон
использовал также и поле expire (с приоритетом над значением поля shell'а),
укажите в configure --enable-exp-sys (по умолчанию выключено).

Теперь значение периода в течении которого выда╠тся предупреждение о
грядущем окончании действия можно переописать в configure
--enable-exp-warn=VALUE (в секундах) (по умолчанию 1209600 секунд (14 суток)).

По умолчанию демон выравнивает (обрезает) все значения (включая
--enable-exp-warn=VALUE) до целого числа суток. То есть любая дата в
стандартном формате tac+ обозначает полночь этого числа по GMT, а любая дата
в формате количества секунд с начала эпохи по GMT обрезается до полуночи этого
же числа по тому же GMT. Эта дата является последней действующей для пароля,
то есть в эти сутки он ещ╠ работает.

Исключение составляет используемое оригинальным демоном поле expiring'а в
системном shadow-файле Solaris'а, которое преобразуется по достаточно
странному алгоритму (бага или фича?). Если вы хотите, чтобы это поле также
преобразовывалось по единому алгоритму, то включите в configure описание
--enable-exp-shadow (по умолчанию выключено).

Если вы хотите, чтобы выравнивание/преобразование выполнялось по ЛОКАЛЬНОМУ
времени с уч╠том летнего/зимнего (то есть к ЛОКАЛЬНОЙ полуночи), то включите
в configure описание --enable-exp-local (по умолчанию выключено).

В это случае, например, для MSK:

Допустим, мы имеем следующую дату expires:

Nov 11 1998

Либо, во втором варианте:

910786163

Последнее число будет интерпретировано как

Nov 11 15:09:23 MSK 1998

И приведено опять-таки к

Nov 11 1998

И мы имеем значение --enable-exp-warn

282656

Которое будет приведено к

259200 (то есть трое суток)

Тогда действие пароля закончится в

Nov 12 00:00:00 MSK 1998

А предупреждение об этом начн╠т выдаваться в

Nov 9 00:00:00 MSK 1998

Но можно вообще убрать выравнивание, включив в configure описание
--enable-exp-fine (по умолчанию выключено). Тогда никакого выравнивания для
значений, заданных в секундах, делаться вообще не будет, а дата в формате tac+
будет по-прежнему интерпретироваться как полночь по GMT либо ЛОКАЛЬНОМУ времени
(зависит от --enable-exp-local) этого числа. Именно эти даты с точностью до
секунды и будут отмечать тот момент времени, начиная с которого действие пароля
прекращается. --enable-exp-warn также будет отсчитываться как есть, без
выравниваний, с точностью до секунды.

Тогда при тех же самых исходных данных мы получим уже два различных
варианта.

Дата

Nov 11 1998

будет проинтерпретирована как

Nov 11 00:00:00 MSK 1998

и переведена в число

910731600

Именно в этот момент и прекратит действовать пароль. А предупреждение об
этом начн╠т выдаваться в

910731600 - 282656 = 910448944

то есть

Nov  7 17:29:04 MSK 1998

Для второго же случая:

910786163

Nov 11 15:09:23 MSK 1998

- дата прекращения действия пароля.

910786163 - 282656 = 910503507

Nov  8 08:38:27 MSK 1998

- дата начала предупреждения.

При всех вычислениях используются системные функции работы с временем,
поэтому накладки, возникающие при переходе на летнее/зимнее время, будут
зависеть лишь от корректности этих функций.

Маленькое резюме, для тех, кто запутался:

Основное отличие без/с --enable-exp-local: без него границей смены дат является
полночь по GMT (системным часам), с ним - локальная полночь по действующему
зимнему/летнему времени.

Основное отличие без/с --enable-exp-fine: без него expiring происходит точно
в полночь, причем СЛЕДУЮЩЕГО за заданным числа, с ним - точно в указанное
время.

------ 3.1.27. Определение залогиненных пользователей

Теперь демон tac_plus при старте или получении сигнала SIGUSR1, утилитой finger
может определять уже залогиненных на NAS'ах пользователей и производить их
регистрацию в utmp/wtmp. Эта возможность включается опцией --enable-regnas
configure (по умолчанию выключено).

Кроме того, если используется dynipd, то regnas будет определять по
rsh на NAS IP адреса залогиненных пользователей, и передавать эту
информацию dynipd.

Информацию о том, какие NAS'ы опрашивать при regnas, tacacs берет из
конфигурационного файла, из станз nas (3.1.37), поэтому все NAS'ы
должны быть описаны в tac_plus.conf.

------ 3.1.28. Директива tac_plus.conf allow-from

Директива tac_plus.conf allow-from разрешает соединения только с указанного
ip адреса. Можно указать несколько директив allow-from. Если не указано ни
одной директивы, то разрешаются соединения с любых адресов. Синтаксис
директивы следующий:

allow-from = <hostip>

------ 3.1.29. Директива tac_plus.conf listen-on

Директива tac_plus.conf listen-on указывает tac_plus выполнить вызов bind(3)
с указанным ip адресом. Если директива не указана, то выполняется bind(3)
INADDR_ANY. Синтаксис директивы следующий:

listen-on = <hostip>

------ 3.1.30. Аутентификация на сервере SMB

Демон tac_plus может аутентифицировать пользователей по протоколу SMB
на серверах Samba или Windows NT. Эта возможность включается опцией
--enable-auth-smb[=crypt|plain] (по умолчанию crypt) configure (по умолчанию
выключено). Для использования этой возможности, применяйте директивы login/pap
tac_plus.conf следующего вида:

  < login | pap > = smb
    {
	primary = <SMB-SRV1>		# primary domain controller name
	backup  = <SMB-SRV2>		# backup  domain controller name
	domain  = <SMB-DOMAIN>		# domain name
    }

------ 3.1.31. Аутентификация на сервере LDAP

Демон tac_plus может аутентифицировать пользователей на сервере LDAP.
Эта возможность включается опцией --enable-auth-ldap[=(v2|v3|sasl|ns-ssl)]
configure (по умолчанию выключено). В операционной системе должен быть
установлен LDAP toolkit. Для использования этой возможности, применяйте
директивы login/pap tac_plus.conf следующего вида:

  < login | pap > = ldap
    {
	basedn      = <ldap info>	# for example: "o=JOFA,c=UK"

	server      = <ip-addr[:port]>	# ip address of LDAP server
					# for example:
					# "host.domain.com" or
					# "host1.dom.com host2.dom.com:380"

	binddn      = <ldap info>	# for authenticated access on
					# LDAP server
					# for example: "cn=root,o=JOFA,c=UK",
					# "" - for anonymous access

	bindpw      = <password>	# password for authenticated access on
					# LDAP server
					# for example: "qwerty",
					# "" - for anonymous access

	saslmech    = <mechanism>	# SASL mechanism for authentication on
					# LDAP server, server must be supported
					# specifying mechanism
					# for example:
					# "CRAM-MD5"

	saslcred    = <cred>		# SASL credentials for authentication on
					# LDAP server
					# for example:
					# "qwerty"

	sslpath     = <path to cert>	# path to cert .db file (for Netscape
					# ldap ssl)
					# for example:
					# "/u/mozilla/.netscape/cert7.db"
    }

Если какая-либо опция отсутствует, то ей присваивается значение "" (пустая
строка).

------ 3.1.32. Аутентификация протокола PPP/PAP

Демон tac_plus может аутентифицировать ppp по pap с использованием криптованных
паролей в tac_plus.conf. Синтаксис директивы следующий:

    pap = des <des-hash>

------ 3.1.33. Максимальная длина имени пользователя

Максимальная длина имени пользователя может быть задана опцией
--enable-maxuserlen=LENGTH configure (по умолчанию 16).

------ 3.1.34. Аутентификация на сервере DCE

Демон tac_plus может аутентифицировать пользователей на сервере DCE.
Эта возможность включается опцией --enable-auth-dce configure (по умолчанию
выключено). В операционной системе должен быть установлен DCE toolkit. Для
использования этой возможности, применяйте директивы login/pap tac_plus.conf
следующего вида:

  < login | pap > = dce

------ 3.1.35. Выбор библиотеки regexp

Опция configure --with-regexp[=(system|pcre|rx)] позволяет указать библиотеку
regexp, которая будет использоваться tacacs+. По умолчанию будет использована
системная библиотека (system). Так же поддерживаются библиотеки PCRE -
Perl-compatible regular expressions и RX.

------ 3.1.36. Расширение для before/after authorization скриптов

Опция configure --enable-assemble-msg позволяет показывать пользователям
вывод программы, вызванной как before и/или after authorization скрипт.
Для этого, каждая строка выводимого программой текста должна начинаться с
префикса 'msg=' (без кавычек). Пример скрипта:

#!/usr/local/bin/perl

$user = $ARGV[0];

if ($user eq "seal") {
    print "msg=Hello seal!\n";
    print "msg=How are you?\n";
    exit 0;
} elsif ($user eq "dust") {
    print "msg=Come closer... closer...\n";
    exit 0;
} else {
    print "msg=Goodbye cruel world...\n";
    exit 1;
}

------ 3.1.37. Дополнительное описание NAS

Дополнительное описание NAS в tac_plus.conf:

nas = <nas-name> {                       # произвольная последовательность
                                         # символов

    nasaddr        = <ip-addr>           # адрес NAS

    key            = <key-value>         # ключ, который будет использован
                                         # для шифрования сессии с указанным
					 # NAS

    snmp-community = <community-name>    # SNMP community name NAS если
                                         # включена опция --enable-snmp
                                         # README-3.1.38

    rsh-user       = <user>              # имя пользователя для команд rsh
                                         # (поиск пользователей, dxs1)
}

Таким образом, разные NAS могут иметь разные значения key и разные
snmp-community.

------ 3.1.38. Проверка пользователей по SNMP

При компиляции демона его можно собрать с возможностью проверки на
максимальное количество сессий для пользователя (MAXSESS) с помощью
SNMP. Эта проверка выполняется tac_plus в дополнение к проверке по его
внутренней аккаунтинговой базе, когда авторизуемый пользователь заходит на
асинхронный порт и согласно проверке по базе лимит его сессий превышен.
Опция configure --enable-snmp (по умолчанию выключено), необходима библиотека
поддержки SNMP: ftp://ftp.net.cmu.edu/pub/snmp/cmu-snmp-*.tar.gz. Файл
mib.txt должен находиться в директории /etc, или там, где Вы явно это указали.
Так же см. README-3.1.37.

------ 3.1.39. Расширенная обработка regexp

В параметре users станзы group может быть указан regexp, выделяющий
подмножества из имени пользователя. Всего может быть выделено до 9
подмножеств. Например, для пользователя pptest запись

users = ^pp(.+)

поместит в макрос $1 значение 'test' (без кавычек). Как говорилось выше,
всего таких макросов может быть 9 - $1 ... $9. В макросе $0 содержится
оригинальное имя пользователя. Данные макросы могут быть разв╠рнуты внутри
станзы group. Опции configure --enable-auto-members, --enable-auto-regexp.

------ 3.1.40. Параметры new-user и db-user

В станзе group может быть указан параметр

new-user = <user-name>	# строка символов с возможностью использовать
			# макросы

Этот параметр замещает имя пользователя, с которым он заш╠л, на указанное,
которое будет использоваться в дальнейших аутентификации и авторизации.
Аккаунтится оригинальное имя пользователя. Это может быть использовано,
например, для роуминга (README-3.3) и для организации аутентификации
различных сервисов по одному реальному пользователю. Опции configure
--enable-auto-members, --enable-auto-regexp.

Также может быть задан параметр

db-user = <user-name>	# строка символов с возможностью использовать
			# макросы $0 ... $9

Он замещает значение ключа при доступе к базе данных при поиске
паролей или при подстановке параметров %0 .. %9. Это может
использоваться, напр., для хранения единых данных для пользователей с
именами-префиксами, независимо от префикса:

group = ppp_plain {
  users = "^pp(.+)"
  db = "/path/to/tacacs.db"
  db-user = $1
  chap = cleartext %0
  ... [ использование макросов %1 .. %9 ] ...
}

group = ppp_callback {
  users = "^pc(.+)"
  db = "/path/to/tacacs.db"
  db-user = $1
  chap = cleartext %0
  ... [ использование макросов %1 .. %9 ] ...
}

При этом в базе данных нужно хранить данные только в одном экземпляре,
без префиксов. Имена с разными префиксами соответствуют, по сути,
одному пользователю, только с различными методами/правами доступа.

db-user будет работать, если используются следующие опции configure:
--enable-db-passwd
--enable-auto-regexp
--enable-more-subst (включено по умолчанию)
--enable-auto-members (включено по умолчанию)

------ 3.1.41. Аутентификация с использованием внешних программ

Демон tac_plus может производить аутентификацию с использованием внешних
программ. Эта возможность включается опцией --enable-auth-extern configure
(по умолчанию выключено). Для использования этой возможности, применяйте
директивы tac_plus.conf следующего вида:

    < login |
      pap   |
      chap  |
      ms-chap > = extern "/some/path/passcheck $user $type"

На stdin вызываемой программе переда╠тся пароль. В случае login и pap -
cleartext, в случае chap - данные кодируются в строку шестнадцатеричных
символов. При этом каждый байт всегда представляется в виде двух знаков
(дополнение 0 слева). В командной строке программе можно передать dollar
variables. Если программа завершает свою работу с кодом 0, то аутентификация
пользователя принимается, иначе - отвергается. Это позволяет использовать
любые средства для проверки пользователей без внесения каких либо изменений
в tac_plus и конфиг, например по внешней БД.
Пример внешней программы: contrib/misc/passcheck

------ 3.1.42. Хранение информации о пользователях в BSD-style db.

Информация о пользователях может находиться вне конфигурационного
файла, во внешней BSD-style базе данных (опция configure
--enable-db-passwd). Пример:

	user = ol.* {
	      login      = "db /noc/tac/db/online.db"

	      service = exec {
		      autocommand = "rlogin %1 /user %2"
	      }
	      . . .
	}

Здесь знаки `%' означают подстановку полей базы данных в
авторизационные данные. Пользовательские поля начинаются с `1'; в поле
`0' хранится зашифрованный (DES/MD5) или нет (для типов
аутентификации, требующих хранения открытых паролей -- chap, mschap,
arap, opap) пароль. [[Данные из базы извлекаются с _обрезанным_ префиксом
имени пользователя (если таковой имеется)]].

Подстановки %-переменных производятся в следующих полях:
 - во всех местах, где определяются AV пары
 - в определении "member = " в станзе user
 - в определении "access-group" в станзе user

База данных должна состоять из пар username-value, где поля в `value'
разделены символом `|'. Пример записи в базе данных для предыдущего
примера:

	user1     uK28sm3kdkdf8|dream.demos.su|otheruser

(так, пользователь oluser1 будет залогинен на dream.demos.su с именем
otheruser).

------ 3.1.43. Метод db-аутентификации по умолчанию.

default authentication = db "dbname"

Замечание: использование этого механизма потенциально опасно и вообще
говоря не рекомендуется. [[Вместо него лучше указывать аутентификацию
по умолчанию через default-group, потому что в противном случае могут
возникнуть проблемы, если на ваших роутерах разрешена exec
авторизация]].

------ 3.1.44. Механизм access-control (ACL).

Контроль прав доступа (access-control) (опция configure --enable-acl)
осуществляется в станзах "access-group" со следующим синтаксисом
(необязательные поля находятся в квадратных скобках):

	access-group = <access_group_name> {
		[ default authentication = (deny|permit) ]
		[ deny message = "your text" ]
		(deny|permit) {
			[ access-group = <access_group_name> ]
			[ nas-group    = <nas_group_name> ]
			[ dxs1         = "<dxs1_regexp>" ]
			[ from         = "<from_regexp>" ]
			[ group        = "<group_regexp>" ]
			[ time         = "<time_grade>" ]
			[ tty          = "<tty_regexp>" ]
			[ user         = "<user_regexp>" ]
		}
	}
	nas-group = <nas_name> {
		<ip_address>[/<ip_wildcardmask>]
		...
	}

Алгоритм прерывается при обнаружении _ПЕРВОГО_ подходящего условия
permit/deny. Если ни одно условие permit/deny не подошло, то
используется default аутентификация (п. 3.1.43). По умолчанию -- DENY.
Условие permit/deny подходит только когда матчатся _все_ определ╠нные
поля.

Вы можете указать другие access-groups в условиях permit/deny для
построения сложных прав доступа.

Большинство полей в permit/deny являются регулярными выражениями, за
исключением некоторых специальных случаев (nas-group, access-group и
timegrades). Также исключением являются следующие специальные значения
поля `from':

	async           - user coming from async line
	<ip address>    - user coming from some host via vty
	Serial          - user coming via sync serial line

В поле nas-group вы можете указать IP адрес некоторого NAS или даже
группы NAS'ов.

Поле `timegrade' использует немного расширенный синтаксис
Taylor-UUCP-style; если присутствуют несколько токенов, то они
разделяются `,':

	!       - negate meaning of next token
	su      - Sunday
	mo      - Monday
	tu      - Tuesday
	we      - Wednesday
	th      - Thursday
	fr      - Friday
	sa      - Saturday
	any     - (any day)
	wk      - Any weekday (!su,!sa)
	never   - Never
	none    - -/-

Пример:		!wk0900-2200,!sa1000-1500
разрешает пользователю работать в любое время за исключением 09:00 в
рабочие дни и 10:00-15:00 по субботам.

Замечание: этот механизм пересекается по функциональности с
crontab-like подходом в оригинальном tac+ia.

Поле `dxs1' служит для ограничения захода пользователей на
неразрешенные для них потоки (напр., из-за разных тарифных
планов). Информация о потоках извлекается при помощи rsh (В MIB'ах
такой информации, по-видимому, нет). При этом, в частности,
используется поле rsh-user в станзе nas, описанное в п. 3.1.37
(однако, его наличие не является обязательным).

Например: show line X дает:

[skip]
Modem state: Ready
  modem(slot/port)=1/9, state=CONNECTED
  dsx1(slot/unit/channel)=0/3/23,
status=VDEV_STATUS_ACTIVE_CALL.VDEV_STATUS_ALLOCATED.
Modem hardware state: CTS DSR  DTR RTS
Line is running PPP for address 195.170.60.110.
[skip]

Интересна строка 'dsx1(slot/unit/channel)=0/3/23'.

Здесь
slot - место, в которое вставлена карта (в as5300 всегда одна, номер 0),
unit - поток (например E1, бывает 0-4, 0-8 - зависит от карты),
channel - таймслот в этом потоке (для E1 0-30).

Например, есть один E1 с городской АТС (dxs1 = "0/0/.*"), есть E1 с
какой-нибудь районной АТС (dxs1 = "0/1/.*").

Для города один тариф (высокий), для района другой тариф (низкий).
Пользователь, работающий по районному тарифу не может зайти из
города. При авторизации нужно проверять номер потока.

Поле dxs1 в ACL позволяет автоматизировать эти проверки. Поддержку
dxs1 необходимо включить опцией configure --enable-dxs1.

Для ссылки на access-group, поместите 'access-group = <name>' внутри
станзы user или group.

------ 3.1.45. Псевдо-пользователь SVC-DEFAULT.

При использовании "aaa authorize network" могут возникнуть проблемы с
PPP, которые решаются при помощи псевдо-пользователя SVC-DEFAULT (в
действительности, это метод _авторизации_ сервисов используя
ACL). Типичный пример:

	access-group = PPP-DEFAULT {
		permit  { tty = "^(Serial|Hssi|Async).*$" }
	}
	user = SVC-DEFAULT {
		access-group = PPP-DEFAULT
		service = ppp protocol = ip { }
		service = slip {}
	}

------ 3.1.46. Хранение cleartext паролей во внешнем файле или базе данных.

для типов аутентификации, которые требуют хранения cleartext паролей
(chap, mschap, arap, opap), теперь поддерживаются также возможность
хранить их во внешнем passwd-like файле или базе данных. Т.е., например,
помимо

	chap = cleartext "top_secret"

(для каждого пользователя) можно указать

	chap = file "/path/to/passwd-chap"

(для пользователя или группы) или

	chap = db "/path/to/passwd-chap.db"

Это избавляет от необходимости прописывать каждого chap-пользователя в
конфигурационном файле.

Если вы по какой-то причине желаете хранить во внешней базе cleartext
пароли и для других типов аутентификации, то можно использовать
механизм подстановки, описанный в п. 3.1.42, поместив в станзе group
(или user) что-то вроде

  db = "/path/to/passwd-login.db"
  login = cleartext %0

------ 3.1.47. Рекурсивные ресурсы времени и parrot.

Ресурсы "time limit", "day limit", "parrot limit" являются
разделяемыми для групп пользователей, т.е. если пользователь
принадлежит группе, надел╠нной ресурсом (при помощи macct, с именем
группы), то он будет браться оттуда. Действуют обычные правила
рекурсии в соответствии с конфигурационным файлом. Ресурсы вычисляются
независимо (т.е. time limit может браться у пользователя, а parrot
limit у группы). это действует в acctd и при аутентификации.

------ 3.1.48. Выхов внешней программы при приходе accounting-пакетов.

В станзах user и group можно указать внешние программы (скрипты),
которые будут вызываться при приходе от NAS accounting-пакетов.
Поддерживаются 3 типа пакетов: start, stop, update. Соответствующий
синтаксис:

  acct_start "/path/to/program [arguments]"
  acct_stop "/path/to/program [arguments]"
  acct_update "/path/to/program [arguments]"

Если в станзе user или group находится одна или более из вышеуказанных
директив, то при приходе accounting-пакета соответствующего типа будет
вызываться указанная программа. Ей на стандартный вход передаются
строки:

username
NAS name
NAS port
NAC address

Последующие строки содержат все AV-пары из accounting-пакета.


-------------- 3.2. Библиотека libtac_plus

Если вы не собираетесь использовать демон совместно с NAS на базе
Unix-boxes, написанными с использованием функций из поставляемой с пакетом
библиотеки libtac_plus, вы можете пропустить все до конца этого раздела и
сразу же перейти к следующему (4).

------ 3.2.1. Конфигурационный файл

NAS, использующий функции из библиотеки, будет читать свою конфигурацию из
файла tac_plus.conf, имеющего следующий формат: каждая строка состоит из
двух полей - параметра и его значения, раздел╠нных пробелами и/или
табуляциями. В качестве параметров могут использоваться слова server и key,
а в качестве их значений - IP-адрес (не доменное имя!) сервера tac_plus и
MD5-криптоключ для обращения к нему соответственно. Все остальные строки
будут просто игнорироваться.

Пример файла tac_plus.conf поставляется с пакетом.

Более подробно об имени этого файла по умолчанию и способе его изменить
можно прочитать в подпункте 3.1.20.1.

------ 3.2.2. Библиотечные функции

Все функции, обращающиеся к серверу tac_plus, в случае невозможности связаться с
ним, выдают сообщения об ошибках в stderr. Сообщения могут быть следующие:

  - Если невозможно соединится с сервером по причине отсутствия роутинга до
    хоста или нерабочего состояния самого хоста, то выводится сообщение:

	*** ERROR: UNABLE TO AUTHENTICATE: <причина>

    Например, если на хосте не запущен демон tac_plus, мы получим:

	*** ERROR: UNABLE TO AUTHENTICATE: connection refused

  - Если невозможно длительное время достучаться до хоста (например,
    нерабочее состояние машины на локальном сегменте Ethernet), то выводится
    дополнительное сообщение о таймауте:

	*** ERROR: TACACS+ SERVER NOT RESPONDING!
	*** ERROR: UNABLE TO AUTHENTICATE: interrupted system call

    О значении таймаута по умолчанию и способе его изменить можно прочитать
    в подпункте 3.1.20.2.

  - Если вследствие слишком большого количества длинных параметров,
    переданных функции, невозможно сформировать пакет для передачи серверу,
    то выводится дополнительное сообщение об этом:

	*** ERROR: TOO LONG ARGUMENT
	*** ERROR: UNABLE TO AUTHENTICATE: unknown error

------ 3.2.2.1

struct passwd *tacacs_plus_auth(char *user, char *password, char *tty)

Производит аутентификацию по заданному имени пользователя (user), паролю
(password) и имени терминала (tty).

В случае успешной аутентификации возвращает указатель на статическую
структуру типа passwd (см. getpwent(3)) со следующими заполненными полями:

pw_name		- имя пользователя
pw_uid		- uid пользователя
pw_gid		- gid пользователя
pw_dir		- домашний каталог пользователя
pw_shell	- shell пользователя

Поля pw_name, pw_dir, pw_shell указывают на строки, пространство под которые
выделяется динамически и будут перераспределено при следующем перевызове
функции.

Все остальные поля имеют значение 0 или NULL, в зависимости от типа.

В случае неудачи возвращает NULL.

Для получения дополнительной информации прочитайте также подпункт 3.1.20.3.

------ 3.2.2.2

int tacacs_plus_auth_pap(char *user, char *password, char *tty)

Производит PAP-аутентификацию по заданному имени пользователя (user), паролю
(password) и имени терминала (tty).

В случае успешной аутентификации возвращает 1, иначе - 0.

------ 3.2.2.3

int tacacs_plus_acct(char *user, char *tty, int action, ...)

Производит запись в журнал аккаунтинга tac_plus о пользователе user на
терминале tty.

action может иметь три значения:

TAC_PLUS_ACCT_FLAG_MORE		- я не знаю что это :) (c) Бармин. Я тоже :)
TAC_PLUS_ACCT_FLAG_START	- начало записи о сервисе
TAC_PLUS_ACCT_FLAG_STOP		- окончание записи о сервисе

Все остальные аргументы - они должны быть типа (char *) - выводятся в журнал
аккаунтинга демона. Список аргументов должен заканчиваться NULL.

Например:

tacacs_plus_acct("gog", "ttye8", TAC_PLUS_ACCT_FLAG_START,
	 "task_id=6484", "start_time=845156684", "service=exec", NULL);

1996/10/13 01:44:45     845156685       pool-2.provider.com  gog     ttye8
 111.11.11.1    start   task_id=6484    start_time=845156684    service=exec

tacacs_plus_acct("gog", "ttye8", TAC_PLUS_ACCT_FLAG_START,
	 "task_id=6496", "start_time=845156685", "service=slip", NULL);

1996/10/13 01:44:45     845156685       pool-2.provider.com  gog     ttye8
 111.11.11.1    start   task_id=6496    start_time=845156685    service=slip

tacacs_plus_acct("gog", "ttye8", TAC_PLUS_ACCT_FLAG_STOP,
	"task_id=6484", "start_time=845156684", "service=exec",
	"elapsed_time=2066", NULL);

1996/10/13 02:19:10     845158750       pool-2.provider.com  gog     ttye8
 111.11.11.1    stop    task_id=6484    start_time=845156684    service=exec
 elapsed_time=2066

tacacs_plus_acct("gog", "ttye8", TAC_PLUS_ACCT_FLAG_STOP,
	"task_id=6496", "start_time=845156685", "service=slip",
	"elapsed_time=2098", NULL);

1996/10/13 02:19:43     845158783       pool-2.provider.com    gog    ttye8
 111.11.11.1    stop    task_id=6496    start_time=845156685    service=slip
 elapsed_time=2098

------ 3.2.2.4

int tacacs_plus_author (char* user, char* port, AVpair** av)

Производит авторизацию по заданному имени пользователя (user),
имени терминала (port) и парам атрибут-значение (av).

av - это массив указателей на элементы следующей структуры:

typedef struct pair {
       char * attr;		/* имя атрибута		*/
       char * val;		/* значение атрибута	*/
       char data[256];		/* ???			*/
} AVpair;

Последним элементом массива должен быть NULL.

В случае успешной авторизации возвращает 1, иначе - 0.

------ 3.2.3. Использование библиотеки

Включите в файл, в котором вы собираетесь использовать библиотечные функции,
следующую директиву:

#include "tac_lib.h"

При компиляции используйте ключ

-I<каталог_библиотеки>

А при сборке

-L<каталог_библиотеки> -ltac_plus

или аналогичные ключи для вашего компилятора, если он не совместим с
компилятором GNU C.


-------------- 3.3. Роуминг

Роуминг осуществляется по следующей схеме:
 a) демон tac_plus получает запрос на аутентификацию пользователя;
 b) если имя пользователя попадает под wildcard/regex соответствующий
    станзе роуминга, tac_plus делает вид, что он NAS, производит соединение
    с указанным сервером и аутентифицирует пользователя на нем;
 c) авторизация на удал╠нном сервере не производится;
 d) удал╠нному серверу посылается аккаунтинг.

------ 3.3.1. Роуминг tacacs-tacacs

Роуминг tacacs-tacacs включается опцией configure --enable-roaming-tacacs.
Для использования этой возможности, применяйте директивы login/pap
tac_plus.conf следующего вида:

   < login | pap > = tacacs+
     {
	tacaddr = <ip-addr>       # адрес tacacs+ сервера, которому
	                          # будут посылаться запросы и аккаунтинг

	key     = <key-value>     # ключ, который будет использоваться для
	                          # шифрования сессии с указанным tacacs+
				  # сервером
     }

В tac_plus.conf удал╠нного tacacs+ сервера локальный tacacs+ сервер должен
быть описан станзой nas (см. README-3.1.37), если, конечно, нет желания
использовать один ключ шифрования на все. Так же см. README-3.1.39, 3.1.40.

------ 3.3.2. Роуминг tacacs-radius

Роуминг tacacs-radius включается опцией configure --enable-roaming-radius.
Для использования этой возможности, применяйте директивы login/pap
tac_plus.conf следующего вида:

   < login | pap > = radius
     {
	authhost1 = <ip-addr>		# адрес radius сервера, которому будут
					# посылаться запросы на аутентификацию

	authhost2 = <ip-addr>		# адрес radius сервера (backup), которому будут
					# посылаться запросы на аутентификацию

	accthost1 = <ip-addr>		# адрес radius сервера, которому будет
					# посылаться аккаунтинговая информация.

	accthost2 = <ip-addr>		# адрес radius сервера (backup), которому будет
					# посылаться аккаунтинговая информация.

	secret    = <secret>		# secret key
     }

При использовании этой возможности запускается ещ╠ один процесс, который буферизирует
запросы к RADIUS серверу.
Так же см. README-3.1.39, 3.1.40.



===================== 4. Другие программы

Вместе с пакетом поставляются стандартные программы, доработанные для работы
с tacacs+. Все эти программы располагаются в каталоге contrib. Возможно
вы найд╠те более новые их версии на сайтах, которые могут быть указаны в
документации на эти программы.


-------------- 4.1. rluucpd

rluucpd -- rlogin-uucp proxy (contrib/rluucpd). Опции configure
--enable-rluucpd (по умолчанию выключено) и --enable-rluucpd-uucico - полный
путь исполняемого файла uucico (по умолчанию /usr/local/lib/uucp/uucico).
    Этот демон осуществляет проброс UUCP пользователя с cisco на машину
с подсистемой UUCP. Аутентификация пользователя осуществляется uucico,
поэтому нет необходимости, чтобы пользователи были пользователями системы
в смысле /etc/passwd.

В файле inetd.conf rluucpd должен быть прописан так:

login   stream  tcp     nowait  root    /usr/local/sbin/rluucpd rluucpd

В файле tac_plus.conf должно быть указано, например, следующее:

group = uucp
{
    login = none
    maxsess = 1
    users = uu*
    service = exec
    {
	noescape = true
	autocmd = "rlogin <ip address> /user $user"
    }
}

где <ip address> - адрес UUCP сервера.



===================== 5. Демон acctd

Если вы не собираетесь использовать во входящем в состав пакета tacacs+
возможности проверки лимита времени, вы можете пропустить данный раздел (5)
и сразу же перейти к следующему (6).


-------------- 5.1. Принцип взаимодействия

Входящий в состав пакета tacacs+ может быть собран с использованием
возможностей проверки лимита времени для пользователя (пут╠м включения
описания DB, см. пункт 3.1.3). В этом случае tac_plus в процессе
аутентификации производит соответствующую проверку по базе пользователей.

Однако, следит за истечением лимита и вносит соответствующие корректировки в
эту базу не сам tac_plus, а отдельный демон acctd. Кроме того, существует
утилита macct, которая позволяет администратору манипулировать базой
(db- или db2-структуры).

-------------- 5.1.1 Формат базы

Существует три формата базы данных user.db.

------ 5.1.1.1 Формат 0

- имя пользователя
- время, которое ему осталось для работы

Время, оставшееся для работы уменьшается по мере нахождения пользователя на
линии вплоть до нуля (демон acctd не заносит в базу отрицательное значение в
случае переработки).

------ 5.1.1.2. Формат 1

- имя пользователя
- общий стартовый лимит времени, задаваемый администратором
- общее время, оставшееся пользователю для работы
- суточный стартовый лимит времени, задаваемый администратором
- суточное время, оставшееся пользователю для работы
- общее уч╠тное время, отработанное пользователем

По мере выработки пользователем его времени, уменьшаются только общее и
суточное время, оставшиеся пользователю для работы. Одновременно
увеличивается общее уч╠тное время отработки (это поле рассматривается
главным образом как информационное).

Отрицательное значение для того или иного стартового лимита означает
соответствующий неограниченный доступ. Уч╠т "оставшегося" времени в этом
случае все равно вед╠тся - в отрицательных единицах. При переработке acctd
также заносит в эти поля отрицательные значения.

------ 5.1.1.3. Формат 2

- имя пользователя
- общий стартовый лимит времени, задаваемый администратором
- общее время, оставшееся пользователю для работы
- суточный стартовый лимит времени, задаваемый администратором
- суточное время, оставшееся пользователю для работы
- общее уч╠тное время, отработанное пользователем
- поле, содержащее так называемые попугаи
- поле, содержащее максимальное значение кредита пользователя

По мере выработки пользователем его времени, уменьшаются только общее и
суточное время, оставшиеся пользователю для работы. Одновременно
увеличивается общее уч╠тное время отработки (это поле рассматривается
главным образом как информационное).

Отрицательное значение для того или иного стартового лимита означает
соответствующий неограниченный доступ. Уч╠т "оставшегося" времени в этом
случае все равно вед╠тся - в отрицательных единицах. При переработке acctd
также заносит в эти поля отрицательные значения.

Поле, содержащее попугаи следует интерпретировать как некий ресурс, который
у пользователя убывает, причем может убывать с различной скоростью в
зависимости от времени суток. Это поле может иметь предопредел╠нное значение
PARROT_OFF, которое означает, что для данного пользователя подсч╠т parrot
не производится.

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


-------------- 5.2. Режимы работы acctd

------ 5.2.1. Параметры сборки

В configure имеются следующие описания, задающие параметры работы демона
acctd:

--enable-db-file=PATH - путь к базе пользователей (по умолчанию
/DATAPATH/user.db). Может быть изменено при запуске демона с ключом -u.

--enable-scantime=VALUE - период ожидания в секундах между проверками
находящихся "на линии" пользователей (с соответствующим внесением изменений по
ним в базу) (по умолчанию - 60 секунд). Может быть изменено при запуске демона
с ключом -t. Проверка выполняется по файлу формата utmp(5), то есть tac_plus
должен быть собран с включ╠нной возможностью ведения дополнительных журналов
(см. пункт 3.1.4). --enable-scantime=VALUE определяет погрешность, с которой
вед╠тся база.

--enable-denydir=PATH - демон может по истечении лимита формировать в
определяемом этим описанием каталоге файлы с именами пользователей, содержащие
информацию об истечении лимита времени (по умолчанию /DATAPATH/deny).
Может быть изменено при запуске демона с ключом -r.

--enable-actprog=PATH - полный путь к программе, которая будет запускаться в
случае возникновения необходимости "убить" пользователя, находящегося на линии
(по умолчанию /usr/local/sbin/killuser). Может быть изменено при запуске демона
с ключом -k.
Этой программе будет передано три параметра:

  - имя пользователя
  - терминал, на котором он находится
  - имя (или alias) хоста (NAS'а), на котором он находится

Все параметры берутся из utmp(5), поэтому обратите внимание на описания
ALIASES и UTMP_LOG_xxxx, используемые при сборке tac_plus (см. пункт 3.1.5),
чтобы определить что именно эта программа будет получать в качестве имени
NAS'а.

Пример такой программы - скрипт killuser - поставляется вместе с acctd.
Для работы killuser необходимо, чтобы на cisco были прописаны следующие
команды:
ip rcmd rsh-enable
ip rcmd remote-host <cisco user> <unix host> <unix user> enable

--enable-reinit=VALUE - временной интервал в секундах, в случае превышения
которого для одной сессии любой пользователь будет "убит" (по умолчанию 0,
означает, что проверка выполняться не будет). Может быть изменено при запуске
демона с ключом -a. "Антизалипательная" мера.

--enable-syslog-facility=FACILITY - log facility (по умолчанию LOG_LOCAL6).

--enable-db - включение этого описания говорит о том, что будет использоваться
новый формат базы (по умолчанию включено).

Если вы осуществляете смену структуры базы, не забудьте "перегнать" и сам
файл данных. К примеру, для перехода от db к db2 необходимо выполнить
приблизительно следующую команду:

db_dump185 user.db | db_load new_user.db

--enable-strict-time-check - включение этого описания говорит о том, что демон
acctd будет отслеживать конец интервала работы пользователя, заданный в файлах
в директории /DATAPATH/tabs. Например, для пользователя pptest в директории
/DATAPATH/tabs существует файл pptest:

* 14-15 * * *	*

это означает, что при включении опции --enable-strict-time-check, демон acctd
удалит пользователя pptest с линии (с помощью программы --enable-actprog=PATH),
когда текущее время будет 16:00, не зависимо от того, сколько у данного
пользователя осталось времени в бюджете (по умолчанию включено). Действует
общее правило рекурсии для пользователей/групп. (см. пункты 3.1.1, 3.1.3).

--enable-parrot[=PATH] - включение этого описания говорит о том, что демон
acctd будет считать попугаи (деньги, например), пользуясь для этого файлами в
формате cron в директории /DATAPATH/parrot (по умолчанию выключено). Действует
общее правило рекурсии для пользователей/групп (см. пункт 3.1.1). В последнем
поле каждой строки указывается стоимость интервала времени, заданного опцией
configure --enable-parrot-interval. Например, для пользователя pptest в
директории /DATAPATH/parrot существует файл pptest:

* 14-15 * * *   2.1
* 16-18 * * *   3.3

это означает, что через каждый интервал, заданный опцией configure
--enable-parrot-interval, из поля базы данных user.db parrot вычитается некое
десятичное число, причем в промежутке времени 14:00-15:59 вычитается число 2.1,
а в промежутке времени 16:00-18:59 вычитается число 3.3. ВНИМАНИЕ!!! Если
текущему интервалу времени не соответствует ни одна строка файла pptest
(for example!), то декремент поля parrot базы данных не производится, о чем
выда╠тся сообщение в лог. Чтобы избежать подобной случайности, можно в конце
файла всегда добавлять строку с попугаями по умолчанию, например:

* 14-15 * * *   2.1
* 16-18 * * *   3.3
* * * * *       3.0

Если файл пользователя или группы пользователей отсутствует в директории
/DATAPATH/parrot, то декремент поля parrot базы данных user.db не производится,
и сообщение об этом не выда╠тся.

В случае, если остаток parrot нулевой или -parrot_credit (лимит исчерпан),
то tac_plus при заходе пользователя возвращает в качестве сообщения:

*** User <имя_пользователя>: parrot limit EXCEEDED!

Аутентификация в этом случае не проходит.

Опция configure --enable-parrot должна использоваться совместно с --enable-db.

--enable-parrot-interval[=SECONDS] - включение этого описания говорит о том,
что демон acctd, когда будет считать попугаи (деньги, например), будет
использовать это значение как интервал (по умолчанию 60 секунд), стоимость
которого указывается в последнем поле файла формата cron в директории
/DATAPATH/parrot.

--enable-acctd-notify - включение этого описания говорит о том, что демон
acctd будет посылать уведомление клиенту, что у него заканчиваются попугаи.
Для уведомления используется WinPopup, сообщение которому отправляется с
помощью smbclient из Samba. Поставляется скрипт notifyuser (параметры --
аналогично killuser), для отправки уведомления пользователю. Подразумевается,
что имя машины (в Windows-сетке) соответствует имени пользователя на Cisco.


------ 5.2.2. Ключи, используемые при запуске

-d

Режим отладки - acctd не демонизируется и дублирует все свои сообщения в
стандартный поток вывода.

-w <file>

Использовать альтернативный стандартному --enable-utmpfile=PATH файл utmp(5).

-u <file>

Использовать альтернативную стандартной (описание --enable-db-file=PATH) базу
пользователей.

-r [<dir>]

По истечении лимита формировать в каталоге <dir> (или, если параметр <dir>
опущен, то в каталоге, определяемом описанием --enable-denydir=PATH) файлы с
именами пользователей, содержащие информацию об истечении лимита времени -
сообщение, которое выглядит так:

*** Sorry, your time limit is exceeded at <time>

где time - календарное время наступления факта истечения лимита в формате
ctime(3).

Эти файлы будут создаваться по истечении как суточного, так и общего
лимитов. Никакого механизма их удаления в acctd не предусмотрено.

Эта возможность может быть использована, если tac_plus по каким-то причинам
собран без описания --enable-db[=old] (см. пункт 3.1.3), но с описанием
--enable-deny[=deny]  (см. пункт 3.1.2).

-t <time>

Использовать период ожидания в секундах между проверкой нахождения находящихся
на линии пользователей и соответствующим внесением изменений по ним в базу,
равный <time> - вместо определ╠нного по умолчанию --enable-scantime=VALUE.

-a <time>

Использовать временной интервал в секундах, в случае превышения которого для
одной сессии, любой пользователь будет "убит", равный <time>, вместо
определ╠нного по умолчанию --enable-reinit=VALUE. Значение, равное 0, означает,
что проверка выполняться не будет.

-k <path>

Использовать альтернативную стандартной (описание --enable-actprog=PATH)
программу "убийства" находящихся на линии пользователей.

-n <path>

Использовать альтернативную стандартной (NOTIFYPROG в acctd-config.h)
программу уведомления находящегося на линии пользователя. Эта возможность
может быть использована, если включ╠н --enable-acctd-notify.

-o <time>

Когда до истечения лимита попугаев останется <time> минут, пользователю будет
отправлено предупреждение (по умолчанию NOTIFYTIME в acctd-config.h равно
2 минуты). Эта возможность может быть использована, если включ╠н
--enable-acctd-notify.

-------------- 5.3. Утилита macct

Эта утилита служит для "ручного" манипулирования с базой пользователей - то
есть для создания и удаления записей, а также корректировки значений полей в
них. См. также macct(1).

Временные интервалы, используемые в качестве аргументов утилиты, задаются в
МИНУТАХ.

------ 5.3.1. Режим работы при использовании формата 0

В этом случае отрабатываются следующие ключи:

---
-h|--help

Краткая справка по использованию, включая возможные опции.

---
-c|--create <user> --tl <time>

Созда╠тся запись, соответствующую пользователю с именем <user>, и в не╠
заносится остаток времени для работы, равный <time>. Если запись для такого
пользователя уже существует, операция не отрабатывается и выда╠тся
соответствующее сообщение об ошибке.

---
-m|--modify <user> --tl <time>

В записи, соответствующей пользователю с именем <user>, остаток времени для
работы, модифицируется на значение, равное <time>. Увеличение или уменьшение
определяется знаком <time>. Если записи для такого пользователя не
существует, выда╠тся соответствующее сообщение об ошибке.

---
-d|--delete <user>

Из базы удаляется запись, соответствующая пользователю с именем <user>. Если
такой записи нет, никаких сообщений об ошибке не выда╠тся.

---
-l|--list <user>

Показывается содержимое записи, соответствующей пользователю с именем <user>
в формате

*** User `<user>', time left <time> minutes

В случае если записи для <user> не существует, выда╠тся сообщение

*** Time limit not set for user `<user>'

Чтобы посмотреть содержимое всех записей в качестве <user> нужно задать '-'
(без апострофов). Формат вывода в этом случае будет следующий (время
выда╠тся в МИНУТАХ):

user1           0
user2         -57

Утилита, запущенная без параметров, отработает как запущенная с "-l -".


------ 5.3.2. Режим работы при использовании формата 1

В этом случае отрабатываются следующие ключи:

-c|s|m|d|l|t <user|-|c> [--tl <time_lim>]  [--tll <time_lim_left>]
[--dl <day_lim>] [--dll <day_lim_left>] [--tu <tot_used|c>] [-f <format>]


--tl|--total-lim
устанавливает значение общего лимита времени.
Если Вы не хотите ставить лимит пользователю, но учитывать его
время работы, используйте значение "nolimit". В соответствующем поле
будет выставлено предопредел╠нное значение TIME_LIMIT_NO. Что бы не
накладывать никаких временных ограничений и не учитывать время
работы пользователя, можно использовать значение "off".
В соответствующем поле будет выставлено предопредел╠нное
значение TIME_LIMIT_OFF и параметр не будет использоваться ни в
каких алгоритмах.

--tll|--total-lim-left
устанавливает значение общего остатка времени.

--dl|--day-lim
устанавливает значение суточного лимита времени.
Если Вы не хотите ставить лимит пользователю, но учитывать его
время работы, используйте значение "nolimit". В соответствующем поле
будет выставлено предопредел╠нное значение TIME_LIMIT_NO. Что бы не
накладывать никаких временных ограничений и не учитывать время
работы пользователя, можно использовать значение "off".
В соответствующем поле будет выставлено предопредел╠нное
значение TIME_LIMIT_OFF и параметр не будет использоваться ни в
каких алгоритмах.

--dll|--day-lim-left
устанавливает значение суточного остатка времени.

--tu|--total-used
устанавливает значение общего уч╠тного времени, отработанного пользователем.
В общем случае, tu = tl - tll, однако Вы можете присвоить этому полю
любое значение. Если Вы изменяете значения полей tl или tll и хотите,
чтобы macct соответственно пересчитал значение поля tu, используйте
`c` в качестве значения. Поле tu не будет пересчитываться, если
поле tl установлено в значение `nolimit` или `off`.

---
-h|--help

Краткая справка по использованию, включая возможные опции.

---
-c|--create

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

---
-s|--set

Служит только для модификации уже существующих в базе записей. Указанному
параметру будет присвоено соответствующее значение. Значения неуказанных полей
не изменяются. Если запись для такого пользователя не существует, то
выда╠тся соответствующее сообщение об ошибке.

---
-m|--modify

В записи, соответствующей пользователю с именем <user>, соответствующие
значения полей изменятся на указанные величины. Увеличение или уменьшение
определяется знаком аргумента.  Значения неуказанных полей не изменяются.
Если записи для такого пользователя не существует, то выда╠тся
соответствующее сообщение об ошибке.

---
-d|--delete

Из базы удаляется запись, соответствующая пользователю с именем <user>. Если
такой записи нет, никаких сообщений об ошибке не выда╠тся.

---
-l|--list

Показывается содержимое записи, соответствующей пользователю с именем <user>
(либо содержимое всех записей, если в качестве <user> задано '-' (без
апострофов))

Формат выдачи может быть задан пользователем. Для этого используется опция
-f|--format с параметром вида "tl,tll,dl". Список будет выдаваться в формате
имя пользователя - значения полей, в порядке появления в строке-параметре.
Список полей (соответствует названиям опций времени):

tl  показывает значение общего лимита времени.
tll показывает значение общего остатка времени.
dl  показывает значение суточного лимита времени.
dll показывает значение суточного остатка времени.
tu  показывает значение общего уч╠тного времени, отработанного пользователем.

+для режима работы при использовании формата 2
pl  показывает значение лимита "попугаев".
pc  показывает значение возможности превышения лимита "попугаев".

Параметры могут отделяться друг от друга пробелом и/или запятой.

По умолчанию, формат вывода определяется переменной FORMAT и список выда╠тся
в формате соответствующем следующему (время выда╠тся в МИНУТАХ):

   user            t-limit   t-left  d-limit   d-left   t-used
 user1                -100       20        5        5      -20
 user2                 -85       80       20       20       10
Last modify 'day limits' table: 2000/04/08 12:12:12

В случае если записи для <user> не существует, выда╠тся сообщение
*** Time limit not set for user `<user>'

Утилита, запущенная без параметров, отработает как запущенная с "l -".

---
-t|--time <time>

Во всех записях значение суточного остатка для работы выставляется в
значение суточного лимита. Дата модификации суточного лимита (она выда╠тся в
последней строке при просмотре базы по аргументу 'l') выставляется в <time>,
а при использовании значения 'c'|'current' - в текущее время.

Формат <time> должен быть следующим (строка не проверяется утилитой на
корректность!):

YYYY/MM/DD HH:MM:SS

Например:

2000/03/08 12:34:56

<time> - это один аргумент, то есть при запуске утилиты из shell'а его
необходимо заключать в кавычки или апострофы.


------ 5.3.3. Режим работы при использовании формата 2

Режимы работы соответствуют формату 1 с небольшими дополнениями:

---
[--pl|--parrot-lim <parrot_lim|off>]

устанавливает значение общего лимита <parrot_lim>, который можно
интерпретировать, например как деньги, уплаченные пользователем.
Это должно быть число в десятичном формате, например 100.5. Если
вместо <parrot_lim> написать off, то в базу данных user.db, в поле
parrot будет занесено предопредел╠нное значение PARROT_OFF, которое
означает, что для данного пользователя подсч╠т parrot не производится.
Этот способ отключения подсчета parrot более эффективен, чем отсутствие
файла пользователя или группы в директории /DATAPATH/parrot.

---
[--pc|--parrot-credit <parrot_credit>]

Необязательный параметр <parrot_credit> позволяет задать для пользователя с
именем <user> значение кредита, на который можно превышать значение
<parrot_lim>. Это означает, что поле, содержащее попугаи может быть меньше
нуля на величину, содержащуюся в поле максимального значения кредита. Иначе
говоря, пользователь может работать в кредит на указанную сумму в попугаях.

Запись в базе данных user.db о пользователе с именем <user> уже должна
существовать. Е╠ можно создать с помощью режима -c, описанного в
README-5.3.2. По умолчанию, этот режим заносит в поле parrot предопредел╠нное
значение PARROT_OFF, которое означает, что для данного пользователя подсч╠т
parrot не производится и параметр не будет использоваться ни в каких алгоритмах;
в поле parrot_credit заносится значение 0.0, что означает отсутствие
кредита для данного пользователя, однако Вы можете явно указать отличные от
умолчания, необходимые Вам значения.


===================== 6. Динамическое выделение адресов

Для использования этой возможности укажите параметр --enable-dyna configure
(по умолчанию выключено).


-------------- 6.1. Демон dynipd

Этот демон выда╠т по запросу от tac_plus ip адреса и вед╠т базу соответствия
<пользователь> = <ip адрес>. Демон стремится выдать пользователю тот же
самый ip адрес, который был у данного пользователя при предыдущем заходе.
Алгоритм, по которому демон выда╠т адреса близок к кеширующему.
Пользователь получает другой ip адрес только в том случае, если из-за
малого объ╠ма пула адресов или большой активности пользователей, адрес,
выданный данному пользователю при предыдущем заходе уже выдан другому
пользователю, не обязательно активному в данный момент.
Поддерживается пул статических адресов, которые ни при каких обстоятельствах
не будут выданы другому пользователю.

------ 6.1.1. Конфигурирование и опции командной строки dynipd

По умолчанию dynipd считает, что его конфигурационный файл
/CONFPATH/dynipd.conf. Это расположение может быть изменено с помощью
задания значения параметра --enable-dyncfgfile=PATH configure или при
запуске dynipd параметром -c (описание параметров командной строки
dynipd см. ниже).

Синтаксис файла dynipd.conf:

    update  <secs>          - number of seconds for external
                              IP database update. 30 secs default.
    db      <dbname>        - full pathname of cache database
                              (по умолчанию /DATAPATH/ipaddr.db, может
                              быть задан другой параметром
                              --enable-cdbfile=PATH configure
                              или параметром командной строки -D)
    pool <name> x.x.x.x y.y.y.y
                            - define pool name and range of IP numbers
                              for allocation. You can specify multiple
                              ranges for each pool name.
    range x.x.x.x y.y.y.y   - synonym for "pool default x.x.x.x y.y.y.y"
    port <portnum>          - use alternate TCP port
    allow-from <hostip>     - allow connections _only_ from given
                              IP number. You can specify multiple
                              allow-from instances. If no such
                              instances specified, connections are
                              permitted from everywhere - be careful!
    logfile <name>            log IP space allocations to file
                              (по умолчанию /LOGPATH/dynipd.log, может
                              быть задан другой параметром
                              --enable-dynlogfile=PATH configure)

Структура кеширующего файла:

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

frog	time=42356	addr=10.10.10.193

frog - имя пользователя
time - произвольное число, обозначает количество запросов к dynipd
       since creation of ipaddr.db. Исправляется автоматом, при первом
       заходе пользователя.
addr - статический адрес, выделяемый пользователю.

Адреса пользователей со статическими адресами должны принадлежать пулу
с именем static. Это гарантирует неизменность адреса.

Опции командной строки:

    -g              - debug mode. Don't go background.
    -c confname     - take configuration file from specified location
    -D dbname       - specify other cache dabatase location
    -p port         - use alternate TCP port.

Опции командной строки всегда перекрывают значения опций, указанных в
конфигурационном файле.


-------------- 6.2. Программа tdb управления базой данных демона dynipd

Эта программа может использоваться не только для управления базой
данных демона dynipd, поэтому флагов в ней больше, чем может быть
необходимо для использования управления базой dynipd.

ДЛЯ УПРАВЛЕНИЯ БАЗОЙ ip НОМЕРОВ ДЛЯ ДЕМОНА dynipd, tdb ДОЛЖЕН ВСЕГДА
ЗАПУСКАТЬСЯ С КЛЮЧЕМ -i.

Эту программу надо применять, если вам надо сгенерировать базу пользователей
с указанными ip адресами, назначить пользователю статический адрес, etc.
Т.к. демон dynipd при работе держит свою базу открытой, то для изменения этой
базы с помощью tdb, необходимо завершить работу dynipd.

Опции командной строки:
    -C      - create new database. Warning: this option will
	      OVERWRITE old database. With this option, tdb reads
	      standard input for (tab|blank)-separated key-data pairs.
    -a      - append standard input to database
    -e name - edit particular entry. Actually it calls dbappend
	      after editing, so if you change key field you will
	      just add entry to db.

    -d keylist ...
	    - delete all specified keys from database
    -g keylist ...
	    - fetch all specified keys from database

    -p name [des-password]
	    - change password for user 'name'. This is a special
	      case because it modifies only first field in '|'-
	      separated data. Second arguments applies if you want
	      to explicitly set DES password, otherwise tdb will
	      prompt you to type it in. (*)
    -P name [cleartext_password]
	    - similar with -p, but you can specify cleartext
	      password - tdb will encrypt it. (*)

    -L      - dumps whole file in format acceptale for tdb -C

    -v      - turn on verbose mode.

    -i	    - specific for dynipd databases

(*) - не используется для работы с базой dynipd

Ключ -i обозначает, что в качестве ключа в базе будет использоваться
совместно имя пользователя и ip номер. Это сделано для того, чтобы
одному пользователю можно было выделять несколько ip номеров.

Примеры использования:
    gendialups | tdb dialups -C
    tdb adm -p apg
    tdb dialups -g slap dark


-------------- 6.3. tac_plus и dynipd

Для поддержки возможности выдачи динамических адресов, необходимо использовать
следующие команды в конфигурационном файле tac_plus:

    user = xxx {
        [ address-pool = mypool ]
        service = exec {
	    autocommand = "ppp $dyna"
        }
    }

Вместо переменной $dyna будет подставлен выданный dynipd ip адрес.
Поддерживается произвольное количество пулов; пулом по умолчанию является
'default'. Предопредел╠нное имя для пула статических адресов - 'static'.
По умолчанию, tac_plus будет искать менеджер динамических ip адресов (dynipd)
на localhost (127.0.0.1), но если Ваш dynipd выполняется на другой машине,
поместите куда-нибудь в начало конфигурационного файла tac_plus директиву

    dynip-server = "hostname"



===================== 7. Как инсталлировать пакет

Инсталлировать пакет следует в порядке, описанном в данном разделе.

./configure ...
make
make install



===================== 8. Что ещ╠?

В данный пакет не вошла ещ╠ одна хорошая вещь, которая разработана Владимиром
Барминым:

 - dialup shell для NAS'ов на базе Unix-boxes
   (<http://www.mv.ru/~bwm/soft/dsh.tar.gz>)

При соответствующей корректировке путей к файлам исполняемые модули
оригинальной версии должны работать без проблем в комплексе с утилитами из
данного пакета. Вполне возможно, что и этот продукт будет после
соответствующей ревизии и возможной адаптации добавлен к данному пакету.

