Миграция с файрвола Juniper SRX на PaloAlto, с помощью python

в 10:36, , рубрики: juniper, Palo Alto Networks, python3, srx

У PaloAlto есть специальный инструмент для миграции под названием Expedition.
Он может конвертировать файлы конфигурации с разных брандмауэров в PaloAlto.
Но его исходный код закрыт, вы не сможете понять логику его работы,
и он больше не будет поддерживаться в 2025 году.

Моя программа на Python имеет открытый исходный код. Вы можете прочитать, использовать, обновлять, добавлять свои собственные функции.
Программа преобразует структурированный текст в другой структурированный текст, и находится в стадии разработки.
Чтобы понять эту программу, вам нужно знать основные операции в Python, текст, list и dictionary.
Я пишу этот текст для сетевых инженеров, которые изучают Python, я хочу показать вам направление развития.
Я добавил как можно больше комментариев в текст для лучшего понимания.
И в Juniper Firewall, и в PaloAlto используются объекты адресов (set address) и группы объектов адресов (set address-group).
В обоих брандмауэрах объекты адресов используются как IP адреса источника или IP адреса назначения в политиках или правилах.
Здесь мы видим объекты адресов (set address). Слева Juniper, справа те же объекты, преобразованные в PaloAlto.

Миграция с файрвола Juniper SRX на PaloAlto, с помощью python - 1

Программа считывает текст конфигурации Juniper и ищет слова "set security address-book global address",
затем программа находит имя объекта и префикс объекта.

Миграция с файрвола Juniper SRX на PaloAlto, с помощью python - 2

Здесь мы видим объекты группы адресов (set address-group). Слева Juniper, справа преобразованные в PaloAlto.
В Juniper address-set может состоять из нескольких объектов в нескольких строках, в PaloAlto в одной строке несколько объектов в квадратных скобках.

Миграция с файрвола Juniper SRX на PaloAlto, с помощью python - 3

И далее python преобразует "security policies global", как это называется в SRX, в "rulebase security rules" в PaloAlto.
Для простоты я использую "глобальные политики безопасности", что означает, что это не связано с какой-то зоной,
она применяется из любой зоны в любую зону.

Миграция с файрвола Juniper SRX на PaloAlto, с помощью python - 4
#!/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)
    

Автор: CCNPengineer

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js