Другой 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: %%c\n"
             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

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

    Similar posts

    Comments 0

    Only users with full accounts can post comments. Log in, please.