Другой tacacs+

в 13:13, , рубрики: Cisco, juniper, linux, tacacs+, метки: , , ,

Я думаю, про tacacs+ его настройку, политики, ACL и прочее сказано, а уж тем более написано более чем достаточно. Но, что меня всегда напрягало в tacas+ — постоянно чего-то не хватает. Некая недоработанность что ли...
Например, нельзя задать баннер на вход группе хостов, можно только по отделенности. Нельзя применить идентичные настройки к группе хостов, можно только по отдельности. И наберется ещё с пяток таких придирок. Возможно, я чего-то не знаю, но пока для меня всё обстоит именно так.
На прошлой работе, видел необычный tacacs+, который в корне отличался от стандартного. И вот, спустя какое-то время, я его нашел. И не просто нашел, а внедрил в небольшую конторку.
Речь пойдёт о проекте: www.pro-bono-publico.de/projects/tac_plus.html. Статья будет несколько в духе «How-to», надеюсь кому-то она окажется полезной.

Исходные данные:
Сервер, с debian wheezy на борту, на котором уже стоит tacacs+ и tftp, установленные мной же из репозиториев.

Приступаем к установке и настройке нового tacacs+ (естественно, удаляем старый tacacs+).
Собирать его мы будем с помощью checkinstall. Нам понадобятся некоторые библиотеки и gcc-multilib. Ставим:
apt-get install flex bison libtool gcc-multilib checkinstall
Подготавливаем к сборке:
./configure
И собираем:
checkinstall

С первого раза собрать не выйдет, так как компилятор будет ругаться на отсутствующие каталоги. Посему, создадим их сразу:

mkdir /home/USER/tacacs-sourse/PROJECTS/build/linux-3.2.0-4-amd64-x86_64
mkdir /home/USER/tacacs-sourse/PROJECTS/build/linux-3.2.0-4-amd64-x86_64/mavis
mkdir /usr/local/etc/mavis

tacacs-sourse — каталог, куда мы распаковали исходники.

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

Далее, самая интересная часть — конфигурирование.
На сети, я использовал tacacs+ для cisco, juniper, zelax, qutech.

Но, приступим к конфигурации самого tacacs+:
Для начала, стоит создать каталог, где будет храниться файл конфигурации, у меня это /etc/tacacs+/. Далее, создадим сам файл конфигурации, у меня — tacacs.conf. Выставляем права 600 на папку и файл, чтобы никто посторонний не смог подсмотреть конфиг.

Далее, приведу простенький пример конфигурационного файла с комментариями:

#!/usr/local/sbin/tac_plus
id = spawnd 
        {
         listen = { port = 49 } ## tacacs работает на 49 порту
        }

id = tac_plus
        {
         accounting log = /var/log/tacacs/tac_plus.log  ## Сюда складываем логи (кто, что, где и когда делал), неплохо бы задать права 600 и настроить logrotate
         mavis module = external ##Подключаем mavis модуль (подробнее можно прочитать в документации). К слову, можно подключить другой модуль и использовать ldap.
                {
                 exec = /usr/local/lib//mavis/mavis_tacplus_passwd.pl 
                }
login backend = mavis

### Выставляю идентичный баннер для всех хостов
host = world 
        {
         welcome banner = "nWe are watching you! We know your ip: %%cn"
         failed authentication banner ="nYou are the %%u?n"
         motd banner = "nHello %%u. Today is %A!"
         key = WeryLongAndSequreKey ## Мегапароль
         address = 0.0.0.0/0
        }

### Создаю две группы юзеров - админы и... неадмины
#Полный доступ
group = admin 
{
    default service = permit
    service = exec { set priv-lvl = 15 }
    service = junos-exec { set local-user-name = remote-super-users } #Классы для juniper, читаем ниже
}

#Доступ только к определенным командам
group = noob 
{
    default service = deny
     service = exec { set priv-lvl = 15 }
     service = junos-exec { set local-user-name = remote-read-only } 
     service = shell 
     {
      cmd = show { permit .* }
      cmd = ping { permit .* }
      cmd = traceroute { permit .* }
     }
}

### ACL тут здорово отличаются от того, что было в обычном tacacs+. В данном случае, сей ACL разрешает пользователю доступ только к устройству  192.168.0.5. На всех прочих мы получим bad password. 
acl = noobilo 
   {
    nas = 192.168.0.5
   }

### Создаем пользователей
  user = prootik 
  {
    member = admin
    login = crypt bla-bla-bla
        service = shell 
        {
        set priv-lvl = 15
        }
  }

    user = noob
    {
    acl = noobilo 
    member = noob
    login = crypt la-la-la
        service = shell 
        {
        set priv-lvl = 15
        }
    }


}

Пользовательские пароли храним зашифрованным в md5 либо DES. Согласно документации это можно сделать так:

openssl passwd -1 <clear_text_password>
openssl passwd -crypt

Как вы заметили, всем пользователям по умолчанию даются привилегии 15 уровня (cisco). Однако, пользователи группы noob всё равно смогут выполнить только явно разрешенные им команды. Мне кажется это удобным, не надо постоянно вводить пароль на привилегированный режим.

Возможности ACL тут шире, чем в стандартном tacacs+, но и синтаксис здорово отличается. Для более детального изучение стоит покурить man. В рамках этой статьи останавливаться на ACL я не буду.

И так, мы получили вполне рабочий tacas+. Попробуем его запустить:

tac_plus /etc/tacacs+/tacacs.conf &

В процессах мы увидим нечто такое:
71745 ? Ss 0:00 tac_plus: 0 connections, accepting up to 480 more
71746 ? Ss 0:00 tac_plus: 0 connections
71747 ? Ss 0:00 tac_plus: 0 connection

Правда удобно видеть сколько пользователей в данный момент пользуются системой (особенно, когда хочешь её остановить)?

На сайте www.pro-bono-publico.de. Есть пример init скрипта, я его немного изменил под свои нужды:

#!/bin/sh
#
# Start-stop script for tac_plus
#
# (C)2001-2010 by Marc Huber <Marc.Huber@web.de>
# $Id: etc_init.d_tac_plus,v 1.1 2011/07/22 17:04:03 marc Exp $
#
# chkconfig: 2345 99 99
# description: Starts and stops the tac_plus server process.
#

<code>PATH=/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/sbin/
export PATH

DEFAULT=/etc/default/tacplus-tac_plus

PROG=/usr/local/sbin/tac_plus
CONF=/etc/tacacs+/tacacs.conf
PIDFILE=/var/run/tac_plus.pid
NAME=tac_plus

[ -f "$DEFAULT" ] && . "$DEFAULT"

for FILE in $PROG $CONF ; do
        if ! [ -f "$FILE" ] ; then
                echo $FILE does not exist.
                DIE=1
        fi
done

if [ "$DIE" != "" ] ; then
        echo Exiting.
        exit 1
fi

start () {
        /bin/echo -n "Starting $NAME: "
        if $PROG -bp $PIDFILE $CONF
        then
                echo "done."
        else
                echo "failed."
        fi
}
restart () {
        PID=`cat $PIDFILE 2>/dev/null`
        /bin/echo -n "Restarting $NAME: "
        if [ "x$PID" = "x" ]
        then
                echo "failed (service not running)"
        else
                kill -1 $PID 2>/dev/null
                echo "initiated."
        fi
}
stop () {
        PID=`cat $PIDFILE 2>/dev/null`
        /bin/echo -n "Stopping $NAME: "
        if [ "x$PID" = "x" ]
        then
                echo "failed ($NAME is not running)"
        else
                kill -9 $PID 2>/dev/null
                rm -f $PIDFILE
                echo "done."
        fi
}
case "$1" in
    stop)
        stop
        ;;
    status)
        PID=`cat $PIDFILE 2>/dev/null`
        if [ "x$PID" = "x" ]
        then
                echo "$NAME is not running."
                exit 1
        fi
        if ps -p $PID 2>/dev/null >&2
        then
                echo "$NAME ($PID) is running."
                exit 0
        fi
        echo "$NAME ($PID) is not running but pid file exists."
        ;;
    start|restart|force-reload|reload)
        if $PROG -P $CONF ;then
                if [ "$1" = "start" ]
                then
                        stop 2>/dev/null >&2
                        start
                else
restart
                fi
        else
                cat <<EOT
********************************************************************************
* Unable to $1 $NAME ... please fix the configuration problem
* indicated above.
********************************************************************************
EOT
                exit 1
        fi
        ;;
    *)
        echo "Usage: $0 {start|stop|restart|force-reload|reload|status}"
        exit 1
;;
esac

exit 0

Даем скрипту права на исполнение (chmod +x). Обзываем его например tac_plus и кидаем в /etc/init.d. Все. Теперь можно стопарить, запускать, рестартовать tacas+ с помощью service tac_plus start/stop/restart.

И для полного феншую добавим tacacs+ в автозагрузку:
update-rc.d tac_plus defaults.

Серверная часть готова. Перейдем к настройке активного оборудования. На самом деле, тут все просто, отличился лишь juniper. Для cisco конфиг думаю смысла приводить нет (для zelax и qutech он практически идентичен), а вот для juniper приведу. Кстати, в документации описано, как подружить juniper и tacacs+. В свое время, мне пришлось здорово с этим повозиться.

Конфиг для juniper:

set system authentication-order tacplus
set system authentication-order password
set system tacplus-server <ip сервера> port 49
set system tacplus-server <ip сервера> secret WeryLongAndSequreKey
set system tacplus-server <ip сервера> timeout 10
set system accounting events login
set system accounting events change-log
set system accounting events interactive-commands
set system accounting destination tacplus server <ip сервера> secret WeryLongAndSequreKey

# А вот тут и зарыта собака, на самом juniper мы должны создать классы пользователей и распределить им права/

set system login user remote-super-users full-name "User template for remote super-users" uid 2013 class super-user
set system login user remote-read-only full-name "User template for remote read-only" uid 2014 class read-only

#Права можно настроить более гибко чем в примере, например:
set system login class remote-getconf permissions [ view-configuration configure ]
set system login user remote-getconfig full-name "User template for remote getconf" uid 2015 class remote-getconf

Даже с включенным tacacs+, вы сможете попасть на juniper под учетной записью root. Это делается для того, чтобы вы могли попасть в shell. По учеткам tacacs+ вы попадаете сразу в cli.

Так же, настоятельно рекомендую выделять подсеть управления и навешивать на все устройства ACL, с доступом только с этой подсети.

А сейчас, приведу несколько скриншотов:

image

image

З.Ы. К вопросу стабильности. На прошлой работе систему юзало куча администраторов и было несколько тысяч устройств. Все было, в принципе, хорошо.
На текущем месте — это несколько десятков устройств и пяток пользователей, все прекрасно.

Автор: ProotIK

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js