Добрый день! Есть проблема в аудите больших списков доступа с оборудования 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, а остальные игнорирует, или при добавлении больших количеств проверок, циклов и листов, вложенных в словари, просто не удалось дождаться завершения)
spoilerparse = 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)