У PaloAlto есть специальный инструмент для миграции под названием Expedition.
Он может конвертировать файлы конфигурации с разных брандмауэров в PaloAlto.
Но его исходный код закрыт, вы не сможете понять логику его работы,
и он больше не будет поддерживаться в 2025 году.
Моя программа на Python имеет открытый исходный код. Вы можете прочитать, использовать, обновлять, добавлять свои собственные функции.
Программа преобразует структурированный текст в другой структурированный текст, и находится в стадии разработки.
Чтобы понять эту программу, вам нужно знать основные операции в Python, текст, list и dictionary.
Я пишу этот текст для сетевых инженеров, которые изучают Python, я хочу показать вам направление развития.
Я добавил как можно больше комментариев в текст для лучшего понимания.
И в Juniper Firewall, и в PaloAlto используются объекты адресов (set address) и группы объектов адресов (set address-group).
В обоих брандмауэрах объекты адресов используются как IP адреса источника или IP адреса назначения в политиках или правилах.
Здесь мы видим объекты адресов (set address). Слева Juniper, справа те же объекты, преобразованные в PaloAlto.
Программа считывает текст конфигурации Juniper и ищет слова «set security address-book global address»,
затем программа находит имя объекта и префикс объекта.
Здесь мы видим объекты группы адресов (set address-group). Слева Juniper, справа преобразованные в PaloAlto.
В Juniper address-set может состоять из нескольких объектов в нескольких строках, в PaloAlto в одной строке несколько объектов в квадратных скобках.
И далее python преобразует «security policies global», как это называется в SRX, в «rulebase security rules» в PaloAlto.
Для простоты я использую «глобальные политики безопасности», что означает, что это не связано с какой-то зоной,
она применяется из любой зоны в любую зону.
#!/usr/bin/python3 # usage " python srx_to_pa.py fw_name " ---- SRX convert address objects to PaloAlto import csv, sys ################# main args = sys.argv # Set the input and output file names from command line argument input_file = args[1] +'.conf' # read " juniper_srx.conf" pa_output_file = args[1] +'_pa.conf' # write PA config # Open the input files ---- convert 'address-book global address' with open(input_file, "r") as f: reader = csv.reader(f, delimiter=" ") # read Juniper config into dictionary of lists for row in reader: # loop for each line, list of separate words from SRX config if (len(row) == 7): if ((row[0] == "set") and (row[1] == "security") and (row[2] == "address-book")): if (("address" in row) and not ("address-set" in row) and not ("dns-name" in row) and not ("description" in row)): add_name = row[(row.index('address')+1)] ip_address = row[(row.index('address')+2)] pa_str = 'set address ' + add_name +' ip-netmask '+ ip_address print(pa_str) # Open the input files ---- convert 'address-book global address-set address' with open(input_file, "r") as f: add_name , pa_str_list = '' , [] # add_name -- name of address-set object, pa_str_list -- list containing addresses reader = csv.reader(f, delimiter=" ") for row in reader: # list of separate words from SRX config if (len(row) == 8): if ((row[0] == "set") and (row[1] == "security") and (row[2] == "address-book")): if (("address" in row) and ("address-set" in row) and not ("description" in row)): if add_name == row[(row.index('address-set')+1)]: add_name = row[(row.index('address-set')+1)] ip_address = row[(row.index('address' )+1)] pa_str_list.append(ip_address) else: if not add_name == '': pri = 'set address-group ' + add_name + ' static '+ str(pa_str_list) pri = pri.replace("'",' ') pri = pri.replace(", ",'') print(pri) add_name , pa_str_list = '' , [] add_name = row[(row.index('address-set')+1)] ip_address = row[(row.index('address' )+1)] pa_str_list.append(ip_address) if ((row.count('address-set') == 2) and not ("description" in row)): if add_name == row[(row.index('address-set')+1)]: first = row.index('address-set') sec_name = row[(row.index('address-set',(first+1))+1)] pa_str_list.append(sec_name) else: if not add_name == '': pri = 'set address-group ' + add_name + ' static '+ str(pa_str_list) pri = pri.replace("'",' ') pri = pri.replace(", ",'') print(pri) add_name , pa_str_list = '' , [] add_name = row[(row.index('address-set')+1)] first = row.index('address-set') sec_name = row[(row.index('address-set',(first+1))+1)] pa_str_list.append(sec_name) pri = 'set address-group ' + add_name + ' static '+ str(pa_str_list) pri = pri.replace("'",' ') pri = pri.replace(", ",'') print(pri) print(' ') # Open the input files ---- convert 'security policies global policy' to 'rulebase security rules ' with open(input_file, "r") as f: sec_name , pa_source_list , pa_dest_list , pa_app_list = '' , [] , [] , [] reader = csv.reader(f, delimiter=" ") for row in reader: if (len(row) == 9): if ((row[0] == "set") and (row[1] == "security") and (row[2] == "policies")): if (("policy" in row) and not ("description" in row)): if sec_name == row[(row.index('policy')+1)]: if (row[(row.index('policy')+3)] == "source-address"): pa_source_list.append(row[(row.index('policy')+4)]) if (row[(row.index('policy')+3)] == "destination-address"): pa_dest_list.append(row[(row.index('policy')+4)]) if (row[(row.index('policy')+3)] == "application"): pa_app_list.append(row[(row.index('policy')+4)]) else: if not sec_name == '': pri_1 = 'set rulebase security rules ' + sec_name + ' from any' pri_2 = 'set rulebase security rules ' + sec_name + ' to any' pri_3 = 'set rulebase security rules ' + sec_name + ' application any' pri_4 = 'set rulebase security rules ' + sec_name + ' action allow' pri_5 = 'set rulebase security rules ' + sec_name + ' service application-default' pri_s = 'set rulebase security rules ' + sec_name + ' source ' + str(pa_source_list) pri_s = pri_s.replace("'",' ') pri_s = pri_s.replace(", ",'') print(pri_1) print(pri_s) print(pri_2) pri_d = 'set rulebase security rules ' + sec_name + ' destination ' + str(pa_dest_list) pri_d = pri_d.replace("'",' ') pri_d = pri_d.replace(", ",'') print(pri_d) print(pri_3) print(pri_4) print(pri_5) sec_name , pa_source_list , pa_dest_list , pa_app_list = '' , [] , [] , [] sec_name = row[(row.index('policy')+1)] if (row[(row.index('policy')+3)] == "source-address"): pa_source_list.append(row[(row.index('policy')+4)]) if (row[(row.index('policy')+3)] == "destination-address"): pa_dest_list.append(row[(row.index('policy')+4)]) if (row[(row.index('policy')+3)] == "application"): pa_app_list.append(row[(row.index('policy')+4)]) pri_1 = 'set rulebase security rules ' + sec_name + ' from any' # from any zone pri_2 = 'set rulebase security rules ' + sec_name + ' to any' # to any zone pri_3 = 'set rulebase security rules ' + sec_name + ' application any' pri_4 = 'set rulebase security rules ' + sec_name + ' action allow' # "action allow" the same as "permit" in SRX pri_5 = 'set rulebase security rules ' + sec_name + ' service application-default' pri_s = 'set rulebase security rules ' + sec_name + ' source ' + str(pa_source_list) pri_s = pri_s.replace("'",' ') pri_s = pri_s.replace(", ",'') print(pri_1) print(pri_s) print(pri_2) pri_d = 'set rulebase security rules ' + sec_name + ' destination ' + str(pa_dest_list) pri_d = pri_d.replace("'",' ') pri_d = pri_d.replace(", ",'') print(pri_d) print(pri_3) print(pri_4) print(pri_5)
ссылка на оригинал статьи https://habr.com/ru/articles/849338/
Добавить комментарий