@The3fon

Парсер ACL Cisco, как правильно?

Добрый день! Есть проблема в аудите больших списков доступа с оборудования Cisco. Вот пример (acl выдуманный) :

object-group network AAAAAAAAAA
 network-object 10.150.198.24 255.0.0.0
 network-object 10.150.198.242 255.0.0.0
 network-object 10.150.198.243 255.0.0.0
 network-object 10.150.198.247 255.0.0.0
object-group network BBBBBBBBBBB
 network-object 10.150.2.17 255.0.0.0
 network-object 10.157.7.14 255.0.0.0
object-group service CCCCCCCCCCCCCC
 service-object udp destination eq tftp 
 service-object udp destination eq sip 
 service-object udp destination eq 9999
 service-object udp destination range 32768 61000 


access-list OUTSIDE-IN extended permit udp object-group AAAAAAAAAAobject-group BBBBBBBBBBB range 8000 65535 
access-list OUTSIDE-IN extended permit object-group BBBBBBBBBBB object-group AAAAAAAAAAobject-group CCCCCCCCCCCCCC


Вопросы:
1) Как проходит аудит таких списков доступа, если он, например, переваливает за 10 000 правил и 5 000 объектов, может есть специальное ПО, куда выгрузил весь конфиг и построилась схема с взаимодействиями?

2) Как автоматически вставить в ACL соответствующие им сетевые объекты, чтобы видеть полноценное правило, не оперируя object-group? (P.S. пробовал через python и билиотеку ciscoconfigparser, не получилось. Написанный код или сопостовляет только первый network-object из object-group, а остальные игнорирует, или при добавлении больших количеств проверок, циклов и листов, вложенных в словари, просто не удалось дождаться завершения)

spoiler
parse = CiscoConfParse(args.file, syntax='ios', factory=True)
print(parse)
dict = {}
for net_obj in parse.find_parents_w_child('^object-group',''):
  res = str(net_obj).split(' ')[2]                                # получаем название (id) объекта
  dict[res] = []
  print()
  print()
  print('!!!-----Найден объект: '+res+'--------------------')
  print('Объект содержит следующие правила:')
  for c_obj in parse.find_objects(res):
    for ccobj in c_obj.children:
      service_object = str(ccobj).split("'")[1]
      service_object = service_object.replace('service-object','')
      service_object = service_object.replace('network-object', '') #очищаем правило от лишних слов
      print(service_object)   #получаем чистую строку service object или network object
      dict[res].append(service_object)

 acl = []
 for acl_obj in parse.find_objects(r'access-list'):
   words = str(acl_obj).split()
   for i in dict.keys():
     if i in words:
       for key in dict[i]:
         if words.count('object-group') > 1:
             q = 0
             while(q<=len(words) - 1): # повторяем пока их не останется 0
               if words[q] == 'object-group' and words[q+1] != res: # если каждая итерация = искомой группе и не равна начальной, то выводим результат
                 otherobj = words[q+1]
                 for oth1 in parse.find_objects(otherobj):
                   for cc1 in oth1.children:
                     print(str(cc1).split("'")[1])
               q=q+1
 print(acl)
  • Вопрос задан
  • 889 просмотров
Решения вопроса 1
@iddqda
network engineer, netdevops
не знаю как правильно
А я для анализа ACL использую batfish
ну и самописную тулзу обертку для удобства работы с ним
в которой реализовал всего две необходимые мне функции
1. проверяет пройдет ли пакет с заданными 5tuple (src ip, src port, dst ip, dst port, proto) через сеть или нет и благодаря какому правилу
2. ищет ACE которые никогда не сработают

батфиш умеет это делать сам. Достаточно скормить ему конфиги устройств и вызвать нужные функции
И только что проверил. ObjectGroups он понимает

вот пример:
5f3e3623d47eb773658735.png
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@sh76
Утилита для анализа ACL cisco.
Понимает object-group.
https://aclcheck.ru
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы