В данной статье рассматривается структура CLI-команд на магистральных маршрутизаторах серии ME, а также механизм их авторизации с использованием TACACS+. Будет разобран принцип формирования правил ограничения доступа для пользователей и описан порядок обработки этих правил оборудованием при выполнении команд.


Для анализа механизма авторизации рассмотрим структуру команды на примере"show users".  

В классической модели TACACS+ чаще встречается такая структура команды, где ''show'' будет являться ее основой, а ''users'' аргументом. В конфигурации это бы выглядело так: 

cmd = show { 
        deny /users/ 
        permit .*  
      }  

В приведённой конфигурации разрешаются все команды, начинающиеся с show, за исключением случая, когда аргумент соответствует выражению users. Таким образом, сервер TACACS+ сопоставляет основную команду show, а затем анализирует её аргументы согласно заданным правилам.


На маршрутизаторах серии ME механизм взаимодействия с TACACS+ имеет особенность: CLI передаёт на сервер авторизации полную строку команды, без явного логического разделения на основную команду и аргументы.


То есть., например, команды “show running-config”, “show route”, “show lldp neighbors” и т.д. – являются цельными.  

В конфигурации tacacs это выглядит так: 

cmd = "show users" { 
       deny .* #deny all possible arguments for command show users 
    } # 

В данном блоке конфигурации задаётся запрет на выполнение конкретной команды "show users", без анализа её составляющих элементов.


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

Например, одноранговые команды типа: "logout", "rootshell", "quit" и т.д. авторизуются привычным образом.

В случае, если команда имеет вариативность, например: "show usb-devices" - авторизация отрабатывает только по первой части команды.  


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

cmd = "show" { 
       deny .* #deny all possible arguments for command show users 
    } # 


  Либо все разом их разрешить: 

cmd = "show" { 
       permit .* #permit all possible arguments for command show users 
    } # 


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

script = {
        if (cmd == "") permit           
        if (cmd =~ "^show .*") permit   
        if (cmd =~ "^logout") permit   
}
default cmd = deny

Данный блок конфигурации реализует модель «только чтение»: разрешается вход в сессию, выполнение всех команд, начинающихся с show, а также корректный выход из системы, при этом все остальные команды по умолчанию запрещаются правилом default cmd = deny.