Содда кардани API Check Point бо Python SDK

Содда кардани API Check Point бо Python SDKҚувваи пурраи ҳамкорӣ бо APIҳо ҳангоми истифодаи якҷоя бо коди барнома, вақте имкон пайдо мешавад, ки дархостҳои API ва асбобҳо барои таҳлили посухҳои API ба таври динамикӣ тавлид карда шаванд. Бо вуҷуди ин, он то ҳол ноаён боқӣ мемонад Маҷмӯаи таҳияи нармафзори Python (минбаъд Python SDK номида мешавад) барои API Control Point Check, вале бехуда. Он ҳаёти таҳиягарон ва мухлисони автоматизатсияро ба таври назаррас осон мекунад. Python вақтҳои охир маъруфияти бузург пайдо кард ва ман қарор додам, ки холигоҳро пур кунам ва хусусиятҳои асосиро баррасӣ кунам. Маҷмӯаи рушди Python Check Point API. Ин мақола ҳамчун як иловаи олӣ ба мақолаи дигар дар бораи Habré хизмат мекунад Санҷиши нуқтаи R80.10 API. Идоракунӣ тавассути CLI, скриптҳо ва ғайра. Мо дар бораи чӣ гуна навиштани скриптҳоро бо истифода аз Python SDK дида мебароем ва ба функсияҳои нави идоракунии API дар версияи 1.6 (аз R80.40 дастгирӣ мешавад) бодиққат назар мекунем. Барои фаҳмидани мақола, ба шумо дониши асосии кор бо API ва Python лозим аст.

Check Point API-ро фаъолона таҳия мекунад ва дар айни замон инҳо бароварда шудаанд:

Дар айни замон Python SDK танҳо ҳамкорӣ бо API Management ва API Gaia. Мо дар ин модул муҳимтарин синфҳо, усулҳо ва тағирёбандаҳоро дида мебароем.

Содда кардани API Check Point бо Python SDK

Насб кардани модул

Модул cpapi зуд ва ба осонӣ насб мекунад анбори расмии Check Point дар github бо кӯмаки Фишка. Дастурҳои муфассали насбкунӣ дар README.md. Ин модул барои кор бо версияҳои Python 2.7 ва 3.7 мутобиқ карда шудааст. Дар ин мақола мисолҳо бо истифода аз Python 3.7 дода мешаванд. Бо вуҷуди ин, Python SDK-ро мустақиман аз сервери идоракунии Check Point (Идоракунии Smart) иҷро кардан мумкин аст, аммо онҳо танҳо Python 2.7-ро дастгирӣ мекунанд, аз ин рӯ қисмати охирин рамзи версияи 2.7-ро таъмин мекунад. Дарҳол пас аз насб кардани модул, ман тавсия медиҳам, ки мисолҳоро дар директорияҳо бубинам мисолҳои_python2 и мисолҳои_python3.

саршавӣ

Барои он ки мо бо ҷузъҳои модули 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 истифода бурдан мумкин аст, бубинем:

Далелҳои усули __init__ синфи APIClientArgs

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)

Санҷиши пайвастшавӣ

Роҳи осонтарини тафтиш кардани он, ки оё пайвастшавӣ ба параметрҳои муқарраршуда мувофиқат мекунад, ин усул аст чек_изи ангушт. Агар тафтиши маблағи hash sha1 барои изи ангушти сертификати API сервер ноком шавад (усул баргардонида мешавад дуруц), пас ин одатан аз сабаби мушкилоти пайвастшавӣ ба вуҷуд меояд ва мо метавонем иҷрои барномаро қатъ кунем (ё ба корбар имкони ислоҳи маълумоти пайвастшавӣ дода шавад):

    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, мо дар бораи онҳо каме бештар сӯҳбат хоҳем кард) шаҳодатномаи изи ангуштони sha1 дар сервери API. Аммо агар ҳангоми тафтиши изи ангуштони sha1 сертификати сервери API хатогӣ ошкор карда шавад (шаҳодатнома номаълум аст ё тағир дода шудааст), усул чек_изи ангушт имконият медихад, ки маълумот дар бораи он дар мошини локалй ба таври худкор илова/тагьир дода шавад. Ин чекро комилан ғайрифаъол кардан мумкин аст (аммо инро танҳо тавсия додан мумкин аст, агар скриптҳо дар худи сервери API ҳангоми пайвастшавӣ ба 127.0.0.1 кор кунанд), бо истифода аз аргументи APIClientArgs - unsafe_auto_қабул (дар бораи APIClientArgs бештар дар "Муайян кардани параметрҳои пайвастшавӣ" нигаред).

client_args = APIClientArgs(unsafe_auto_accept=True)

Ба сервери API ворид шавед

У APIClient то 3 усул барои ворид шудан ба сервери API вуҷуд дорад ва ҳар кадоми онҳо маънои онро мефаҳманд Пурбинандатаринҳо(session-id), ки ба таври худкор дар ҳар як занги минбаъдаи API дар сарлавҳа истифода мешавад (ном дар сарлавҳаи ин параметр аст X-чкп-сид), аз ин рӯ зарурати коркарди минбаъдаи ин параметр нест.

усули воридшавӣ

Опсия бо истифода аз логин ва парол (дар мисол, номи корбар ва парол 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==') 

Дар усул login_with_api_key ҳамон параметрҳои ихтиёрӣ, ки дар усули дастрас мебошанд даромадан.

усули 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 тағирёбанда пешакӣ муайян карда шудаанд; мо дар бораи муҳимтаринаш муфассалтар таваққуф хоҳем кард.

Содда кардани API Check Point бо Python SDK

муваффақияти

Барои оғоз кардан, хуб мебуд, ки боварӣ ҳосил кунед, ки занги API бомуваффақият буд ва натиҷа дод. Барои ин усул вуҷуд дорад муваффақияти:

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

Агар занги API муваффақ бошад (рамзи ҷавоб - 200) True -ро бармегардонад ва агар муваффақ набошад (ҳар рамзи ҷавоби дигар). Он қулай аст, ки фавран пас аз занги 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.

set_success_status

Дар ин ҳолат, мумкин аст, ки тағир додани арзиши мақоми муваффақият зарур бошад. Аз ҷиҳати техникӣ, шумо метавонед ҳама чизро дар он ҷо гузоред, ҳатто як сатри муқаррарӣ. Аммо як мисоли воқеӣ метавонад аз нав танзим кардани ин параметр ба 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

посух ()

Усули ҷавоб ба шумо имкон медиҳад, ки луғатро бо рамзи ҷавоб (status_code) ва мақоми ҷавоб (бадан) бубинед.

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'

Намунаҳои муфид

Дар зер намунаҳое ҳастанд, ки зангҳои API-ро истифода мебаранд, ки дар идоракунии API 1.6 илова карда шудаанд.

Аввалан, биёед бубинем, ки зангҳо чӣ гуна кор мекунанд илова мизбон и илова-адрес-диапазон. Фарз мекунем, ки ба мо лозим аст, ки ҳамаи суроғаҳои IP-и зершабакаи 192.168.0.0/24, ки октети охирини он 5 аст, ҳамчун объекти навъи ҳост эҷод кунем ва ҳама суроғаҳои 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-ро қабул кард. Ин аст мисоли коде, ки ба мавқеи болоии сиёсати бозрасии HTTPS қоида илова мекунад, ки 3 категорияро аз санҷиш хориҷ мекунад (Тандурустӣ, Молия, Хадамоти давлатӣ), ки тибқи қонунҳои як қатор кишварҳо санҷиш манъ аст.

Ба сиёсати бозрасии 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")

Иҷрои скриптҳои Python дар сервери идоракунии Check Point

Ҳама чиз якхела аст README.md дорои маълумот дар бораи чӣ тавр ба кор скриптҳои Python бевосита аз сервери назорат. Ин метавонад қулай бошад, вақте ки шумо наметавонед ба сервери API аз мошини дигар пайваст шавед. Ман видеои шашдақиқаӣ сабт кардам, ки дар он ба насби модул назар мекунам cpapi ва хусусиятҳои иҷро кардани скриптҳои Python дар сервери идоракунӣ. Ҳамчун мисол, скрипт иҷро карда мешавад, ки конфигуратсияи шлюзи навро барои вазифа ба монанди аудити шабака автоматӣ мекунад Санҷиши амният. Дар байни хусусиятҳое, ки ман бояд онҳоро ҳал мекардам: функсия то ҳол дар Python 2.7 пайдо нашудааст вуруди, бинобар ин барои коркарди иттилооте, ки корбар ворид мекунад, функсия истифода мешавад raw_input. Дар акси ҳол, рамз ҳамон тавре аст, ки аз мошинҳои дигар оғоз карда шавад, танҳо истифодаи ин функсия қулайтар аст login_as_root, то дубора номи корбар, парол ва суроғаи IP-и сервери идоракуниро муайян накунед.

Видеоро нависед

Скрипт барои танзими зуди CheckUp Security

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()

Намунаи файл бо луғати парол extra_pass.conf
{
"passwords" : ["malware","malicious","infected","Infected"],
"phrases" : ["password","Password","Pass","pass","codigo","key","pwd","пароль","Пароль","Ключ","ключ","шифр","Шифр"]
}

хулоса

Ин мақола танҳо имкониятҳои асосии корро баррасӣ мекунад Python SDK ва модул cpapi(чунон ки шумо тахмин карда будед, инҳо воқеан синонимҳо мебошанд) ва бо омӯзиши код дар ин модул шумо дар кор бо он имкониятҳои бештар пайдо хоҳед кард. Мумкин аст, ки шумо мехоҳед онро бо синфҳо, функсияҳо, усулҳо ва тағирёбандаҳои худ илова кунед. Шумо ҳамеша метавонед кори худро мубодила кунед ва скриптҳои дигари Check Point дар ин бахшро бубинед CodeHub дар чамъият CheckMates, ки ҳам таҳиягарони маҳсулот ва ҳам корбаронро муттаҳид мекунад.

Рамзгузории хушбахтона ва ташаккур барои хондан то охир!

Манбаъ: will.com

Хостинги боэътимодро барои сайтҳо бо муҳофизати DDoS, серверҳои VPS VDS харед 🔥 Харидани хостинги боэътимоди вебсайт бо муҳофизати DDoS, серверҳои VPS VDS | ProHoster