Python SDK көмегімен Check Point API интерфейсін жеңілдету

Python SDK көмегімен Check Point API интерфейсін жеңілдетуAPI интерфейстерімен өзара әрекеттестіктің толық күші бағдарлама кодымен бірге пайдаланылған кезде, API сұрауларын және API жауаптарын талдауға арналған құралдарды динамикалық түрде жасау мүмкін болғанда ашылады. Дегенмен, ол әлі де байқалмайды Python бағдарламалық жасақтамасын әзірлеу жинағы (бұдан әрі Python SDK деп аталады) үшін Check Point Management API, бекер. Ол әзірлеушілер мен автоматтандыру әуесқойларының өмірін айтарлықтай жеңілдетеді. Python соңғы уақытта үлкен танымалдылыққа ие болды және мен олқылықтың орнын толтырып, негізгі мүмкіндіктерді қарастыруды шештім. Check Point API Python әзірлеу жинағы. Бұл мақала Хабре туралы басқа мақалаға тамаша қосымша ретінде қызмет етеді Check Point R80.10 API. CLI, сценарийлер және т.б. арқылы басқару. Біз Python SDK көмегімен сценарийлерді қалай жазу керектігін қарастырамыз және 1.6 нұсқасында (R80.40 бастап қолдау көрсетіледі) жаңа Management API функционалдығын мұқият қарастырамыз. Мақаланы түсіну үшін сізге API және Python бағдарламаларымен жұмыс істеу туралы негізгі білім қажет.

Check Point API-ны белсенді түрде дамытуда және қазіргі уақытта келесілер шығарылды:

Python SDK қазіргі уақытта тек басқару API интерфейсімен өзара әрекеттесуді қолдайды және Gaia API. Біз осы модульде ең маңызды сыныптарды, әдістерді және айнымалыларды қарастырамыз.

Python SDK көмегімен Check Point API интерфейсін жеңілдету

Модульді орнату

Модуль cpapi бастап жылдам және оңай орнатады github сайтындағы ресми Check Point репозиторийі көмегімен PIP. Толық орнату нұсқаулары мына жерден қол жетімді README.md. Бұл модуль Python 2.7 және 3.7 нұсқаларымен жұмыс істеуге бейімделген. Бұл мақалада мысалдар Python 3.7 арқылы беріледі. Дегенмен, Python SDK тікелей Check Point Management серверінен (Smart Management) іске қосылуы мүмкін, бірақ олар тек Python 2.7 нұсқасын қолдайды, сондықтан соңғы бөлімде 2.7 нұсқасы үшін код беріледі. Модульді орнатқаннан кейін бірден каталогтардағы мысалдарды қарауды ұсынамын мысалдар_питон2 и мысалдар_питон3.

Жұмысты бастау

Біз cpapi модулінің құрамдас бөліктерімен жұмыс істей алуымыз үшін модульден импорттауымыз керек. cpapi кем дегенде екі міндетті сынып:

APIClient и APIClientArgs

from cpapi import APIClient, APIClientArgs

Класс APIClientArgs API серверіне және сыныпқа қосылу параметрлеріне жауап береді APIClient API интерфейсімен өзара әрекеттесу үшін жауапты.

Қосылу параметрлерін анықтау

API-ге қосылудың әртүрлі параметрлерін анықтау үшін сынып данасын жасау керек APIClientArgs. Негізінде оның параметрлері алдын ала анықталған және сценарийді басқару серверінде іске қосқан кезде оларды көрсету қажет емес.

client_args = APIClientArgs()

Бірақ үшінші тарап хостында жұмыс істегенде, кем дегенде IP мекенжайын немесе API серверінің (басқару сервері ретінде белгілі) хост атауын көрсету керек. Төмендегі мысалда біз сервер қосылымының параметрін анықтаймыз және оған басқару серверінің IP мекенжайын жол ретінде тағайындаймыз.

client_args = APIClientArgs(server='192.168.47.241')

API серверіне қосылу кезінде пайдалануға болатын барлық параметрлерді және олардың әдепкі мәндерін қарастырайық:

APIClientArgs класының __init__ әдісінің аргументтері

class APIClientArgs:
    """
    This class provides arguments for APIClient configuration.
    All the arguments are configured with their default values.
    """

    # port is set to None by default, but it gets replaced with 443 if not specified
    # context possible values - web_api (default) or gaia_api
    def __init__(self, port=None, fingerprint=None, sid=None, server="127.0.0.1", http_debug_level=0,
                 api_calls=None, debug_file="", proxy_host=None, proxy_port=8080,
                 api_version=None, unsafe=False, unsafe_auto_accept=False, context="web_api"):
        self.port = port
        # management server fingerprint
        self.fingerprint = fingerprint
        # session-id.
        self.sid = sid
        # management server name or IP-address
        self.server = server
        # debug level
        self.http_debug_level = http_debug_level
        # an array with all the api calls (for debug purposes)
        self.api_calls = api_calls if api_calls else []
        # name of debug file. If left empty, debug data will not be saved to disk.
        self.debug_file = debug_file
        # HTTP proxy server address (without "http://")
        self.proxy_host = proxy_host
        # HTTP proxy port
        self.proxy_port = proxy_port
        # Management server's API version
        self.api_version = api_version
        # Indicates that the client should not check the server's certificate
        self.unsafe = unsafe
        # Indicates that the client should automatically accept and save the server's certificate
        self.unsafe_auto_accept = unsafe_auto_accept
        # The context of using the client - defaults to web_api
        self.context = context

APIClientArgs сыныбының даналарында қолдануға болатын аргументтер Check Point әкімшілері үшін интуитивті және қосымша түсініктемелерді қажет етпейді деп ойлаймын.

APIClient және контекстік менеджер арқылы қосылу

Класс APIClient Оны пайдаланудың ең қолайлы жолы - контекстік менеджер арқылы. APIClient класының данасына өту керек нәрсенің бәрі алдыңғы қадамда анықталған қосылым параметрлері болып табылады.

with APIClient(client_args) as client:

Мәтінмәндік басқарушы API серверіне кіру қоңырауын автоматты түрде жасамайды, бірақ одан шыққан кезде жүйеден шығу қоңырауын жасайды. API қоңырауларымен жұмысты аяқтағаннан кейін қандай да бір себептермен жүйеден шығу қажет болмаса, контекстік менеджерді пайдаланбай жұмысты бастау керек:

client = APIClient(clieng_args)

Байланысты тексеру

Қосылымның көрсетілген параметрлерге сәйкес келетінін тексерудің ең оңай жолы - әдісті пайдалану саусақ ізін_тексеру. Сервер API сертификатының саусақ ізі үшін sha1 хэш сомасын тексеру сәтсіз аяқталса (әдіс қайтарылды жалған), онда бұл әдетте қосылым ақауларынан туындайды және біз бағдарламаның орындалуын тоқтата аламыз (немесе пайдаланушыға қосылым деректерін түзету мүмкіндігін береміз):

    if client.check_fingerprint() is False:
        print("Could not get the server's fingerprint - Check connectivity with the server.")
        exit(1)

Болашақта сынып болатынын ескеріңіз APIClient әрбір API қоңырауын тексереді (әдістер api_call и api_query, біз олар туралы аздап сөйлесеміз) API серверіндегі sha1 саусақ ізі сертификаты. Бірақ API сервер сертификатының sha1 саусақ ізін тексеру кезінде қате анықталса (сертификат белгісіз немесе өзгертілген), әдіс саусақ ізін_тексеру ол туралы ақпаратты жергілікті құрылғыға автоматты түрде қосу/өзгерту мүмкіндігін береді. Бұл тексеруді толығымен өшіруге болады (бірақ бұл сценарийлер API серверінің өзінде, 127.0.0.1-ге қосылу кезінде іске қосылған жағдайда ғана ұсынылуы мүмкін), APIClientArgs аргументі арқылы - қауіпсіз_авто_қабылдау («Байланыс параметрлерін анықтау» бөлімінен бұрын APIClientArgs туралы қосымша ақпаратты қараңыз).

client_args = APIClientArgs(unsafe_auto_accept=True)

API серверіне кіріңіз

У APIClient API серверіне кірудің 3 әдісі бар және олардың әрқайсысы мағынасын түсінеді sid(сеанс идентификаторы), ол тақырыптағы әрбір келесі API шақыруында автоматты түрде пайдаланылады (осы параметрдің тақырыбындағы атау X-chkp-sid), сондықтан бұл параметрді одан әрі өңдеудің қажеті жоқ.

кіру әдісі

Логин мен құпия сөзді пайдаланатын опция (мысалы, пайдаланушы аты admin және 1q2w3e құпия сөзі позициялық аргументтер ретінде беріледі):

     login = client.login('admin', '1q2w3e')  

Кіру әдісінде қосымша қосымша параметрлер де бар; міне, олардың атаулары мен әдепкі мәндері:

continue_last_session=False, domain=None, read_only=False, payload=None

Login_with_api_key әдісі

api кілтін пайдаланатын опция (басқару R80.40/Management API v1.6 нұсқасынан бастап қолдау көрсетіледі, "3TsbPJ8ZKjaJGvFyoFqHFA==" бұл API кілтінің авторизация әдісі бар басқару серверіндегі пайдаланушылардың бірі үшін API кілтінің мәні):

     login = client.login_with_api_key('3TsbPJ8ZKjaJGvFyoFqHFA==') 

Әдісте api_кілтімен_кіріңіз әдістегі сияқты бірдей қосымша параметрлер қол жетімді кіру.

login_as_root әдісі

API серверімен жергілікті компьютерге кіру опциясы:

     login = client.login_as_root()

Бұл әдіс үшін тек екі қосымша параметр бар:

domain=None, payload=None

Ақырында API өздерін шақырады

Бізде әдістер арқылы API қоңырауларын жасаудың екі нұсқасы бар api_call и api_query. Олардың арасындағы айырмашылық неде екенін анықтайық.

api_call

Бұл әдіс кез келген қоңырауларға қолданылады. Қажет болса, сұрау органында api қоңырауы мен пайдалы жүктеменің соңғы бөлігін беруіміз керек. Егер пайдалы жүк бос болса, оны мүлде тасымалдау мүмкін емес:

api_versions = client.api_call('show-api-versions') 

Бұл сұрау үшін кесіндінің астындағы шығыс:

In [23]: api_versions                                                           
Out[23]: 
APIResponse({
    "data": {
        "current-version": "1.6",
        "supported-versions": [
            "1",
            "1.1",
            "1.2",
            "1.3",
            "1.4",
            "1.5",
            "1.6"
        ]
    },
    "res_obj": {
        "data": {
            "current-version": "1.6",
            "supported-versions": [
                "1",
                "1.1",
                "1.2",
                "1.3",
                "1.4",
                "1.5",
                "1.6"
            ]
        },
        "status_code": 200
    },
    "status_code": 200,
    "success": true
})
show_host = client.api_call('show-host', {'name' : 'h_8.8.8.8'})

Бұл сұрау үшін кесіндінің астындағы шығыс:

In [25]: show_host                                                              
Out[25]: 
APIResponse({
    "data": {
        "color": "black",
        "comments": "",
        "domain": {
            "domain-type": "domain",
            "name": "SMC User",
            "uid": "41e821a0-3720-11e3-aa6e-0800200c9fde"
        },
        "groups": [],
        "icon": "Objects/host",
        "interfaces": [],
        "ipv4-address": "8.8.8.8",
        "meta-info": {
            "creation-time": {
                "iso-8601": "2020-05-01T21:49+0300",
                "posix": 1588358973517
            },
            "creator": "admin",
            "last-modifier": "admin",
            "last-modify-time": {
                "iso-8601": "2020-05-01T21:49+0300",
                "posix": 1588358973517
            },
            "lock": "unlocked",
            "validation-state": "ok"
        },
        "name": "h_8.8.8.8",
        "nat-settings": {
            "auto-rule": false
        },
        "read-only": false,
        "tags": [],
        "type": "host",
        "uid": "c210af07-1939-49d3-a351-953a9c471d9e"
    },
    "res_obj": {
        "data": {
            "color": "black",
            "comments": "",
            "domain": {
                "domain-type": "domain",
                "name": "SMC User",
                "uid": "41e821a0-3720-11e3-aa6e-0800200c9fde"
            },
            "groups": [],
            "icon": "Objects/host",
            "interfaces": [],
            "ipv4-address": "8.8.8.8",
            "meta-info": {
                "creation-time": {
                    "iso-8601": "2020-05-01T21:49+0300",
                    "posix": 1588358973517
                },
                "creator": "admin",
                "last-modifier": "admin",
                "last-modify-time": {
                    "iso-8601": "2020-05-01T21:49+0300",
                    "posix": 1588358973517
                },
                "lock": "unlocked",
                "validation-state": "ok"
            },
            "name": "h_8.8.8.8",
            "nat-settings": {
                "auto-rule": false
            },
            "read-only": false,
            "tags": [],
            "type": "host",
            "uid": "c210af07-1939-49d3-a351-953a9c471d9e"
        },
        "status_code": 200
    },
    "status_code": 200,
    "success": true
})

api_query

Бұл әдіс шығысы офсетті қамтитын қоңыраулар үшін ғана қолданылатынын бірден ескертемін. Мұндай қорытынды ақпараттың үлкен көлемін қамтитын немесе қамтуы мүмкін болғанда орын алады. Мысалы, бұл басқару серверіндегі барлық жасалған хост нысандарының тізіміне сұрау болуы мүмкін. Мұндай сұраулар үшін API әдепкі бойынша 50 нысан тізімін қайтарады (жауапта шектеуді 500 нысанға дейін арттыруға болады). API сұрауындағы офсет параметрін өзгерте отырып, ақпаратты бірнеше рет тартпау үшін бұл жұмысты автоматты түрде орындайтын api_query әдісі бар. Бұл әдіс қажет болатын қоңыраулардың мысалдары: шоу-сессиялар, шоу-жүргізушілер, шоу-желілер, шоу-қойылмалы таңбалар, шоу-топтар, шоу-мекен-жай диапазондары, шоу-қарапайым-шлюздар, шоу-қарапайым-кластерлер, рұқсат-рөлдерді көрсету, сенімді клиенттерді көрсету, шоу-пакеттер. Шын мәнінде, біз осы API қоңырауларының атауында көпше сөздерді көреміз, сондықтан бұл қоңырауларды өңдеу оңайырақ болады api_query

show_hosts = client.api_query('show-hosts') 

Бұл сұрау үшін кесіндінің астындағы шығыс:

In [21]: show_hosts                                                             
Out[21]: 
APIResponse({
    "data": [
        {
            "domain": {
                "domain-type": "domain",
                "name": "SMC User",
                "uid": "41e821a0-3720-11e3-aa6e-0800200c9fde"
            },
            "ipv4-address": "192.168.47.1",
            "name": "h_192.168.47.1",
            "type": "host",
            "uid": "5d7d7086-d70b-4995-971a-0583b15a2bfc"
        },
        {
            "domain": {
                "domain-type": "domain",
                "name": "SMC User",
                "uid": "41e821a0-3720-11e3-aa6e-0800200c9fde"
            },
            "ipv4-address": "8.8.8.8",
            "name": "h_8.8.8.8",
            "type": "host",
            "uid": "c210af07-1939-49d3-a351-953a9c471d9e"
        }
    ],
    "res_obj": {
        "data": {
            "from": 1,
            "objects": [
                {
                    "domain": {
                        "domain-type": "domain",
                        "name": "SMC User",
                        "uid": "41e821a0-3720-11e3-aa6e-0800200c9fde"
                    },
                    "ipv4-address": "192.168.47.1",
                    "name": "h_192.168.47.1",
                    "type": "host",
                    "uid": "5d7d7086-d70b-4995-971a-0583b15a2bfc"
                },
                {
                    "domain": {
                        "domain-type": "domain",
                        "name": "SMC User",
                        "uid": "41e821a0-3720-11e3-aa6e-0800200c9fde"
                    },
                    "ipv4-address": "8.8.8.8",
                    "name": "h_8.8.8.8",
                    "type": "host",
                    "uid": "c210af07-1939-49d3-a351-953a9c471d9e"
                }
            ],
            "to": 2,
            "total": 2
        },
        "status_code": 200
    },
    "status_code": 200,
    "success": true
})

API қоңырауларының нәтижелерін өңдеу

Осыдан кейін сіз сыныптың айнымалылары мен әдістерін пайдалана аласыз APIResponse(контекст менеджерінің ішінде де, сыртында да). Сыныпта APIResponse 4 әдіс пен 5 айнымалы алдын ала анықталған, біз олардың ең маңыздыларына толығырақ тоқталамыз.

Python SDK көмегімен Check Point API интерфейсін жеңілдету

табыс

Алдымен API қоңырауының сәтті болғанына және нәтиже қайтарылғанына көз жеткізген дұрыс. Бұл үшін әдіс бар табыс:

In [49]: api_versions.success                                                   
Out[49]: True

API шақыруы сәтті болса, True мәнін (жауап коды - 200) және сәтсіз болса, False мәнін (кез келген басқа жауап коды) қайтарады. Жауап кодына байланысты әртүрлі ақпаратты көрсету үшін API шақыруынан кейін бірден пайдалану ыңғайлы.

if api_ver.success: 
    print(api_versions.data) 
else: 
    print(api_versions.err_message) 

күй коды

API қоңырауы жасалғаннан кейін жауап кодын қайтарады.

In [62]: api_versions.status_code                                               
Out[62]: 400

Ықтимал жауап кодтары: 200,400,401,403,404,409,500,501.

табыс_күйін орнату

Бұл жағдайда сәттілік күйінің мәнін өзгерту қажет болуы мүмкін. Техникалық тұрғыдан, сіз кез келген нәрсені, тіпті қарапайым жолды да қоюға болады. Бірақ нақты мысал белгілі бір ілеспе шарттарда бұл параметрді False күйіне қайтару болады. Төменде басқару серверінде орындалатын тапсырмалар бар мысалға назар аударыңыз, бірақ біз бұл сұрауды сәтсіз деп санаймыз (сәтті айнымалы мәнін орнатамыз жалған, API шақыруы сәтті болғанына және 200 кодын қайтарғанына қарамастан).

for task in task_result.data["tasks"]:
    if task["status"] == "failed" or task["status"] == "partially succeeded":
        task_result.set_success_status(False)
        break

жауап()

Жауап әдісі сөздікті жауап кодымен (күй_коды) және жауап мәтінімен (дене) қарауға мүмкіндік береді.

In [94]: api_versions.response()                                                
Out[94]: 
{'status_code': 200,
 'data': {'current-version': '1.6',
  'supported-versions': ['1', '1.1', '1.2', '1.3', '1.4', '1.5', '1.6']}}

мәліметтер

Қажетсіз ақпаратсыз жауаптың (дененің) денесін ғана көруге мүмкіндік береді.

In [93]: api_versions.data                                                      
Out[93]: 
{'current-version': '1.6',
 'supported-versions': ['1', '1.1', '1.2', '1.3', '1.4', '1.5', '1.6']}

қате_хабарлама

Бұл ақпарат API сұрауын өңдеу кезінде қате орын алған кезде ғана қолжетімді болады (жауап коды емес 200). Мысал шығару

In [107]: api_versions.error_message                                            
Out[107]: 'code: generic_err_invalid_parameter_namenmessage: Unrecognized parameter [1]n'

Пайдалы мысалдар

Төменде Management API 1.6 ішінде қосылған API қоңырауларын пайдаланатын мысалдар берілген.

Алдымен қоңыраулар қалай жұмыс істейтінін қарастырайық хост қосу и мекенжай диапазоны қосу. Хост түрінің объектілері ретінде соңғы октеті 192.168.0.0 болатын 24/5 ішкі желінің барлық IP мекенжайларын құруымыз керек делік, ал қалған барлық IP мекенжайларды мекенжай диапазоны типінің объектілері ретінде жазу керек. Бұл жағдайда ішкі желі мекенжайын және тарату мекенжайын алып тастаңыз.

Сонымен, төменде осы мәселені шешетін және хост түрінің 50 нысанын және мекенжай ауқымы түрінің 51 нысанын жасайтын сценарий берілген. Мәселені шешу үшін 101 API қоңырауы қажет (соңғы жариялау қоңырауын есептемегенде). Сондай-ақ, timeit модулін пайдаланып, өзгерістер жарияланғанға дейін сценарийді орындауға кететін уақытты есептейміз.

Қосу хосты мен мекенжай ауқымын қосу арқылы сценарий

import timeit
from cpapi import APIClient, APIClientArgs

start = timeit.default_timer()

first_ip = 1
last_ip = 4

client_args = APIClientArgs(server="192.168.47.240")

with APIClient(client_args) as client: 
     login = client.login_with_api_key('3TsbPJ8ZKjaJGvFyoFqHFA==')
     for ip in range(5,255,5):
         add_host = client.api_call("add-host", {"name" : f"h_192.168.0.{ip}", "ip-address": f'192.168.0.{ip}'})
     while last_ip < 255:
         add_range = client.api_call("add-address-range", {"name": f"r_192.168.0.{first_ip}-{last_ip}", "ip-address-first": f"192.168.0.{first_ip}", "ip-address-last": f"192.168.0.{last_ip}"})
         first_ip+=5
         last_ip+=5
     stop = timeit.default_timer() 
     publish = client.api_call("publish")
     
print(f'Time to execute batch request: {stop - start} seconds')

Менің зертханалық ортамда бұл сценарий басқару серверіндегі жүктемеге байланысты орындалу үшін 30 және 50 секундқа созылады.

Енді API қоңырауы арқылы бірдей мәселені қалай шешуге болатынын көрейік қосу-объектілер-бума, қолдау API 1.6 нұсқасында қосылған. Бұл қоңырау бір API сұрауында бірден көптеген нысандарды жасауға мүмкіндік береді. Сонымен қатар, бұл әртүрлі типтегі объектілер болуы мүмкін (мысалы, хосттар, ішкі желілер және мекенжай ауқымдары). Осылайша, біздің тапсырманы бір API шақыруы аясында шешуге болады.

Add-objects-batch көмегімен сценарий

import timeit
from cpapi import APIClient, APIClientArgs

start = timeit.default_timer()

client_args = APIClientArgs(server="192.168.47.240")

objects_list_ip = []
objects_list_range = []

for ip in range(5,255,5):
    data = {"name": f'h_192.168.0.{ip}', "ip-address": f'192.168.0.{ip}'}
    objects_list_ip.append(data)
    
first_ip = 1
last_ip = 4


while last_ip < 255:
    data = {"name": f"r_192.168.0.{first_ip}-{last_ip}", "ip-address-first": f"192.168.0.{first_ip}", "ip-address-last": f"192.168.0.{last_ip}"}
    objects_list_range.append(data)
    first_ip+=5
    last_ip+=5

data_for_batch = {
  "objects" : [ {
    "type" : "host",
    "list" : objects_list_ip
}, {
    "type" : "address-range",
    "list" : objects_list_range
  }]
}


with APIClient(client_args) as client: 
     login = client.login_with_api_key('3TsbPJ8ZKjaJGvFyoFqHFA==')
     add_objects_batch = client.api_call("add-objects-batch", data_for_batch)
     stop = timeit.default_timer() 
     publish = client.api_call("publish")
     
print(f'Time to execute batch request: {stop - start} seconds')

Бұл сценарийді менің зертханалық ортамда іске қосу басқару серверіндегі жүктемеге байланысты 3-тен 7 секундқа дейін созылады. Яғни, орта есеппен 101 API нысанында пакеттік түрдегі қоңырау 10 есе жылдамырақ жұмыс істейді. Нысандардың көп санында айырмашылық одан да әсерлі болады.

Енді онымен қалай жұмыс істеу керектігін көрейік жиынтық объектілері. Осы API қоңырауын пайдалану арқылы біз кез келген параметрді жаппай өзгерте аламыз. Алдыңғы мысалдағы мекенжайлардың бірінші жартысын (124 хостқа дейін және диапазондар) сиенна түсіне орнатып, адрестердің екінші жартысына хаки түсін тағайындайық.

Алдыңғы мысалда жасалған нысандардың түсін өзгерту

from cpapi import APIClient, APIClientArgs

client_args = APIClientArgs(server="192.168.47.240")

objects_list_ip_first = []
objects_list_range_first = []
objects_list_ip_second = []
objects_list_range_second = []

for ip in range(5,125,5):
    data = {"name": f'h_192.168.0.{ip}', "color": "sienna"}
    objects_list_ip_first.append(data)
    
for ip in range(125,255,5):
    data = {"name": f'h_192.168.0.{ip}', "color": "khaki"}
    objects_list_ip_second.append(data)
    
first_ip = 1
last_ip = 4
while last_ip < 125:
    data = {"name": f"r_192.168.0.{first_ip}-{last_ip}", "color": "sienna"}
    objects_list_range_first.append(data)
    first_ip+=5
    last_ip+=5
    
while last_ip < 255:
    data = {"name": f"r_192.168.0.{first_ip}-{last_ip}", "color": "khaki"}
    objects_list_range_second.append(data)
    first_ip+=5
    last_ip+=5

data_for_batch_first  = {
  "objects" : [ {
    "type" : "host",
    "list" : objects_list_ip_first
}, {
    "type" : "address-range",
    "list" : objects_list_range_first
  }]
}

data_for_batch_second  = {
  "objects" : [ {
    "type" : "host",
    "list" : objects_list_ip_second
}, {
    "type" : "address-range",
    "list" : objects_list_range_second
  }]
}

with APIClient(client_args) as client: 
     login = client.login_with_api_key('3TsbPJ8ZKjaJGvFyoFqHFA==') 
     set_objects_batch_first = client.api_call("set-objects-batch", data_for_batch_first)
     set_objects_batch_second = client.api_call("set-objects-batch", data_for_batch_second)
     publish = client.api_call("publish")

Қолдану арқылы бір API қоңырауында бірнеше нысандарды жоюға болады жою-объектілер-бума. Енді арқылы бұрын жасалған барлық хосттарды жоятын код мысалын қарастырайық қосу-объектілер-бума.

Delete-objects-batch көмегімен объектілерді жою

from cpapi import APIClient, APIClientArgs

client_args = APIClientArgs(server="192.168.47.240")

objects_list_ip = []
objects_list_range = []

for ip in range(5,255,5):
    data = {"name": f'h_192.168.0.{ip}'}
    objects_list_ip.append(data)

first_ip = 1
last_ip = 4
while last_ip < 255:
    data = {"name": f"r_192.168.0.{first_ip}-{last_ip}"}
    objects_list_range.append(data)
    first_ip+=5
    last_ip+=5

data_for_batch = {
  "objects" : [ {
    "type" : "host",
    "list" : objects_list_ip
}, {
    "type" : "address-range",
    "list" : objects_list_range
  }]
}

with APIClient(client_args) as client: 
     login = client.login_with_api_key('3TsbPJ8ZKjaJGvFyoFqHFA==')
     delete_objects_batch = client.api_call("delete-objects-batch", data_for_batch)
     publish = client.api_call("publish")

print(delete_objects_batch.data)

Check Point бағдарламалық құралының жаңа шығарылымдарында пайда болатын барлық функциялар API қоңырауларын дереу алады. Осылайша, R80.40 нұсқасында қайта қарау және Smart Task сияқты «мүмкіндіктер» пайда болды және олар үшін сәйкес API қоңыраулары дереу дайындалды. Сонымен қатар, бұрынғы консольдерден Бірыңғай саясат режиміне көшу кезінде барлық функциялар API қолдауына ие болады. Мысалы, бағдарламалық жасақтаманың R80.40 нұсқасындағы көптен күткен жаңарту HTTPS тексеру саясатын бұрынғы режимнен Бірыңғай саясат режиміне ауыстыру болды және бұл функция бірден API қоңырауларын алды. Бірқатар елдерде заңға сәйкес тексеруге тыйым салынған 3 санатты тексеруден (денсаулық сақтау, қаржы, мемлекеттік қызметтер) алып тастайтын HTTPS инспекциясы саясатының жоғарғы позициясына ереже қосатын код мысалы келтірілген.

HTTPS тексеру саясатына ереже қосыңыз

from cpapi import APIClient, APIClientArgs

client_args = APIClientArgs(server="192.168.47.240")

data = {
  "layer" : "Default Layer",
  "position" : "top",
  "name" : "Legal Requirements",
  "action": "bypass",
  "site-category": ["Health", "Government / Military", "Financial Services"]
}

with APIClient(client_args) as client: 
     login = client.login_with_api_key('3TsbPJ8ZKjaJGvFyoFqHFA==')
     add_https_rule = client.api_call("add-https-rule", data)
     publish = client.api_call("publish")

Check Point басқару серверінде Python сценарийлерін іске қосу

Бәрі бірдей README.md Python сценарийлерін басқару серверінен тікелей іске қосу жолы туралы ақпаратты қамтиды. Бұл API серверіне басқа құрылғыдан қосыла алмаған кезде ыңғайлы болуы мүмкін. Мен модульді орнатуды қарастыратын алты минуттық бейне жаздым cpapi және басқару серверінде Python сценарийлерін іске қосу мүмкіндіктері. Мысал ретінде, желі аудиті сияқты тапсырма үшін жаңа шлюз конфигурациясын автоматтандыратын сценарий іске қосылады. Қауіпсіздікті тексеру. Мен шешуге тура келген мүмкіндіктердің арасында: функция Python 2.7-де әлі пайда болған жоқ енгізу, сондықтан пайдаланушы енгізетін ақпаратты өңдеу үшін функция пайдаланылады raw_input. Әйтпесе, код басқа машиналардан іске қосумен бірдей, тек функцияны пайдалану ыңғайлырақ login_as_root, өзіңіздің пайдаланушы атыңызды, құпия сөзіңізді және басқару серверінің IP мекенжайын қайтадан көрсетпеу үшін.

Қауіпсіздік тексеруін жылдам орнатуға арналған сценарий

from __future__ import print_function
import getpass
import sys, os
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
from cpapi import APIClient, APIClientArgs

def main():
    with APIClient() as client:
       # if client.check_fingerprint() is False:
       #     print("Could not get the server's fingerprint - Check connectivity with the server.")
       #     exit(1)
        login_res = client.login_as_root()

        if login_res.success is False:
            print("Login failed:n{}".format(login_res.error_message))
            exit(1)

        gw_name = raw_input("Enter the gateway name:")
        gw_ip = raw_input("Enter the gateway IP address:")
        if sys.stdin.isatty():
            sic = getpass.getpass("Enter one-time password for the gateway(SIC): ")
        else:
            print("Attention! Your password will be shown on the screen!")
            sic = raw_input("Enter one-time password for the gateway(SIC): ")
        version = raw_input("Enter the gateway version(like RXX.YY):")
        add_gw = client.api_call("add-simple-gateway", {'name' : gw_name, 'ipv4-address' : gw_ip, 'one-time-password' : sic, 'version': version.capitalize(), 'application-control' : 'true', 'url-filtering' : 'true', 'ips' : 'true', 'anti-bot' : 'true', 'anti-virus' : 'true', 'threat-emulation' : 'true'})
        if add_gw.success and add_gw.data['sic-state'] != "communicating":
            print("Secure connection with the gateway hasn't established!")
            exit(1)
        elif add_gw.success:
            print("The gateway was added successfully.")
            gw_uid = add_gw.data['uid']
            gw_name = add_gw.data['name']
        else:
            print("Failed to add the gateway - {}".format(add_gw.error_message))
            exit(1)

        change_policy = client.api_call("set-access-layer", {"name" : "Network", "applications-and-url-filtering": "true", "content-awareness": "true"})
        if change_policy.success:
            print("The policy has been changed successfully")
        else:
            print("Failed to change the policy- {}".format(change_policy.error_message))
        change_rule = client.api_call("set-access-rule", {"name" : "Cleanup rule", "layer" : "Network", "action": "Accept", "track": {"type": "Detailed Log", "accounting": "true"}})
        if change_rule.success:
            print("The cleanup rule has been changed successfully")
        else:
            print("Failed to change the cleanup rule- {}".format(change_rule.error_message))

        # publish the result
        publish_res = client.api_call("publish", {})
        if publish_res.success:
            print("The changes were published successfully.")
        else:
                print("Failed to publish the changes - {}".format(install_tp_policy.error_message))

        install_access_policy = client.api_call("install-policy", {"policy-package" : "Standard", "access" : 'true',  "threat-prevention" : 'false', "targets" : gw_uid})
        if install_access_policy.success:
            print("The access policy has been installed")
        else:
                print("Failed to install access policy - {}".format(install_tp_policy.error_message))

        install_tp_policy = client.api_call("install-policy", {"policy-package" : "Standard", "access" : 'false',  "threat-prevention" : 'true', "targets" : gw_uid})
        if install_tp_policy.success:
            print("The threat prevention policy has been installed")
        else:
            print("Failed to install threat prevention policy - {}".format(install_tp_policy.error_message))
        
        # add passwords and passphrases to dictionary
        with open('additional_pass.conf') as f:
            line_num = 0
            for line in f:
                line_num += 1
                add_password_dictionary = client.api_call("run-script", {"script-name" : "Add passwords and passphrases", "script" : "printf "{}" >> $FWDIR/conf/additional_pass.conf".format(line), "targets" : gw_name})
                if add_password_dictionary.success:
                    print("The password dictionary line {} was added successfully".format(line_num))
                else:
                    print("Failed to add the dictionary - {}".format(add_password_dictionary.error_message))

main()

Қосымша_pass.conf құпия сөздігі бар мысал файл
{
"passwords" : ["malware","malicious","infected","Infected"],
"phrases" : ["password","Password","Pass","pass","codigo","key","pwd","пароль","Пароль","Ключ","ключ","шифр","Шифр"] }

қорытынды

Бұл мақалада жұмыстың негізгі мүмкіндіктері ғана қарастырылады Python SDK және модуль cpapi(сіз ойлағандай, бұл шын мәнінде синонимдер) және осы модульдегі кодты зерделеу арқылы сіз онымен жұмыс істеудің одан да көп мүмкіндіктерін ашасыз. Сіз оны өзіңіздің сыныптарыңызбен, функцияларыңызбен, әдістермен және айнымалылармен толықтырғыңыз келуі мүмкін. Сіз әрқашан жұмысыңызды бөлісе аласыз және бөлімде Check Point үшін басқа сценарийлерді көре аласыз CodeHub қоғамдастықта CheckMates, ол өнімді әзірлеушілер мен пайдаланушыларды біріктіреді.

Бақытты кодтау және соңына дейін оқығаныңыз үшін рахмет!

Ақпарат көзі: www.habr.com

пікір қалдыру