Check Point API lihtsustamine Pythoni SDK abil

Check Point API lihtsustamine Pythoni SDK abilAPI-dega suhtlemise täielik võimsus ilmneb siis, kui seda kasutatakse koos programmikoodiga, kui tekivad võimalused API-päringute dünaamiliseks vormimiseks ja tööriistad API-vastuste analüüsimiseks. Siiski jääb see siiski vähe tähelepanuta. Pythoni tarkvaraarenduskomplekt (edaspidi Pythoni SDK) jaoks Kontrollpunkti halduse API, aga asjatult. See teeb arendajate ja automatiseerimishuviliste elu palju lihtsamaks. Python on viimasel ajal tohutu populaarsuse saavutanud ja otsustasin tühimiku täita ning selle peamised funktsioonid üle vaadata. Check Point API Pythoni arenduskomplektSee artikkel on suurepärane täiendus teisele Habri käsitlevale artiklile. Check Point R80.10 API. Haldamine CLI, skriptide ja muu kauduVaatleme, kuidas kirjutada skripte Python SDK abil ja käsitleme üksikasjalikumalt Management API uut funktsionaalsust versioonis 1.6 (toetatud alates versioonist R80.40). Artikli mõistmiseks on vaja API ja Pythoniga töötamise põhiteadmisi.

Check Point arendab aktiivselt API-sid ja praegu on välja antud järgmised:

Pythoni SDK toetab praegu ainult suhtlust haldus-API-ga ja Gaia APISelles moodulis käsitleme kõige olulisemaid klasse, meetodeid ja muutujaid.

Check Point API lihtsustamine Pythoni SDK abil

Mooduli paigaldamine

Moodul cpapi Paigaldatakse kiiresti ja lihtsalt aadressilt Check Pointi ametlik githubi hoidla abiga pipÜksikasjalikud paigaldusjuhised on saadaval aadressil README.mdSee moodul on kohandatud töötama Pythoni versioonidega 2.7 ja 3.7. Selles artiklis tuuakse näiteid Python 3.7 kasutamise kohta. Pythoni SDK-d saab aga käivitada otse Check Pointi haldusserverist (Smart Management), kuid need toetavad ainult Python 2.7, seega on versiooni 2.7 kood esitatud viimases osas. Kohe pärast mooduli installimist soovitan vaadata kataloogides olevaid näiteid. examples_python2 и examples_python3.

Alustamine

Selleks, et saaksime cpapi mooduli komponentidega töötada, peame need moodulist importima cpapi vähemalt kaks kohustuslikku kursust:

API-klient и API kliendi argumendid

from cpapi import APIClient, APIClientArgs

Klass API kliendi argumendid vastutab API serveriga ühenduse parameetrite ja klassi eest API-klient Vastutab API-ga suhtlemise eest.

Me määratleme ühenduse parameetrid

API-ga erinevate ühendusparameetrite määratlemiseks peate looma klassi eksemplari. API kliendi argumendidPõhimõtteliselt on selle parameetrid eelnevalt määratletud ja skripti haldusserveris käivitamisel ei ole neid vaja määrata.

client_args = APIClientArgs()

Kolmanda osapoole hostil töötades peate aga määrama vähemalt API-serveri (ehk haldusserveri) IP-aadressi või hostinime. Allolevas näites defineerime serveriühenduse parameetri ja määrame sellele haldusserveri IP-aadressi stringina.

client_args = APIClientArgs(server='192.168.47.241')

Vaatame kõiki parameetreid ja nende vaikeväärtusi, mida saab API-serveriga ühenduse loomisel kasutada:

APIClientArgs klassi __init__ meetodi argumendid

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

Usun, et APIClientArgs klassi eksemplarides kasutatavad argumendid on Check Pointi administraatoritele intuitiivselt arusaadavad ega vaja täiendavaid kommentaare.

Ühendamine APIClienti ja kontekstihalduri kaudu

Klass API-klient Kõige mugavam on seda kasutada kontekstihalduri kaudu. APIClient klassi eksemplarile tuleb edastada vaid eelmises etapis määratletud ühenduse parameetrid.

with APIClient(client_args) as client:

Kontekstihaldur ei soorita automaatselt API serverisse sisselogimiskutset, kuid sooritab serverist väljumisel väljalogimiskutse. Kui mingil põhjusel pole API-kõnedega töötamise lõpetamise järel väljalogimine vajalik, peate alustama tööd ilma kontekstihaldurit kasutamata:

client = APIClient(clieng_args)

Ühenduse kontrollimine

Lihtsaim viis kontrollida, kas ühendus toimib vastavalt määratud parameetritele, on meetodi kasutamine sõrmejälje kontrollKui API serveri sertifikaadi sõrmejälje sha1 räsi kontroll ebaõnnestus (meetod tagastas Vale), siis on selle põhjuseks tavaliselt ühenduse probleemid ja me saame programmi täitmise peatada (või anda kasutajale võimaluse ühenduse andmeid parandada):

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

Palun arvestage, et tulevikus klass API-klient kontrollib iga API-kõnet (meetodeid api_kõne и api_päring, me räägime neist veidi lähemalt) API serveri sertifikaadi sha1 sõrmejälg. Aga kui API serveri sertifikaadi sha1 sõrmejälje kontrollimisel tuvastatakse viga (sertifikaat on tundmatu või seda on muudetud), siis meetod sõrmejälje kontroll annab võimaluse selle kohta teavet kohalikus masinas automaatselt lisada/muuta. Selle kontrolli saab täielikult keelata (kuid seda on soovitatav teha ainult skriptide käitamise korral API-serveris endas, kui ühendutakse aadressiga 127.0.0.1), kasutades argumenti APIClientArgs - ohtlik_automaatne_aktsepteerimine (Lisateavet APIClientArgsi kohta leiate eespool jaotisest „Ühenduse parameetrite defineerimine”).

client_args = APIClientArgs(unsafe_auto_accept=True)

Logi sisse API serverisse

У API-klient API serverisse sisselogimiseks on koguni kolm meetodit ja igaüks neist mäletab väärtust sid(sessiooni ID), mida kasutatakse automaatselt iga järgneva API-kõne puhul päises (selle parameetri nimi päises on X-chkp-sid), seega pole selle parameetri edasist töötlemist vaja.

Sisselogimismeetod

Sisselogimise ja parooli abil valik (näites edastatakse kasutajanimi admin ja parool 1q2w3e positsiooniargumentidena):

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

Sisselogimismeetodil on saadaval ka täiendavaid valikulisi parameetreid, siin on nende nimed ja vaikeväärtused:

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

Meetod sisselogimine_api_võtmega

API-võtme kasutamise võimalus (toetatud alates haldusversioonist R80.40/Management API v1.6, "3TsbPJ8ZKjaJGvFyoFqHFA==" See on ühe haldusserveri kasutaja API-võtme väärtus, millel on API-võtme autoriseerimismeetod):

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

Meetodi järgi sisselogimine_API_võtmega Saadaval on samad valikulised parameetrid nagu meetodis Logi sisse.

sisselogimise_juurmeetodi

API-serveriga kohalikku masinasse sisselogimise võimalus:

     login = client.login_as_root()

Selle meetodi jaoks on saadaval ainult kaks valikulist parameetrit:

domain=None, payload=None

Ja lõpuks API kutsub iseennast

API-kõnede tegemiseks meetodite kaudu on meil kaks võimalust api_kõne и api_päringVaatame välja, mis vahe neil on.

api_kõne

See meetod on rakendatav mis tahes kõnede puhul. Vajadusel peame edastama API-kõne viimase osa ja päringu sisus oleva kasuliku koormuse. Kui kasulik koormus on tühi, võib selle üldse välja jätta:

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

Selle päringu väljund on lõike all:

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'})

Selle päringu väljund on lõike all:

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_päring

Kohe teen märkuse, et see meetod on rakendatav ainult päringute puhul, mille väljund eeldab nihet. Selline väljund tekib siis, kui see sisaldab või võib sisaldada suurt hulka teavet. Näiteks võib see olla päring kõigi haldusserveris loodud hostitüüpi objektide loendi saamiseks. Selliste päringute puhul tagastab API vaikimisi 50 objekti loendi (vastuses saab piirangut suurendada 500 objektini). Ja selleks, et teavet mitu korda ei kogutaks, on API päringus nihke parameetri muutmiseks olemas meetod api_query, mis teeb selle töö automaatselt. Näited päringutest, kus seda meetodit vaja on: saatesessioonid, saatejuhid, saatevõrgustikud, saatemetamärgid, saategrupid, saateaadresside vahemikud, saatelihtsad lüüsid, saateklastrid, saatejuurdepääsu rollid, saateusaldusväärsed kliendid, saatepaketidTegelikult näeme nende API-kõnede nimedes mitmuses olevaid sõnu, seega on neid kõnesid lihtsam käsitleda api_päring

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

Selle päringu väljund on lõike all:

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-kõne tulemuste töötlemine

Pärast seda saate kasutada klassi muutujaid ja meetodeid. API vastus(nii kontekstihalduri sees kui ka väljaspool). Klass API vastus Seal on 4 eelnevalt määratletud meetodit ja 5 muutujat, käsitleme neist olulisemaid üksikasjalikumalt.

Check Point API lihtsustamine Pythoni SDK abil

edu

Esiteks oleks hea veenduda, et API-kutse oli edukas ja tagastas tulemuse. Selleks on olemas meetod edu:

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

Tagastab tõese väärtuse (True), kui API-kutse oli edukas (vastusekood - 200), ja väära väärtuse (False), kui see ei õnnestunud (mis tahes muu vastusekood). Mugav kasutada kohe pärast API-kutse, et kuvada erinevat teavet olenevalt vastusekoodist.

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

olekukood

Tagastab vastusekoodi pärast API-kõne käivitamist.

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

Võimalikud vastusekoodid: 200,400,401,403,404,409,500,501.

edu_oleku_seadistus

Sellisel juhul võib olla vajalik muuta edu staatuse väärtust. Tehniliselt võttes saab sinna panna mida iganes, isegi tavalise stringi. Kuid reaalne näide oleks selle parameetri lähtestamine väärtusele False teatud kaasnevate tingimuste korral. Pöörake allpool tähelepanu näitele, kus haldusserveris töötavad ülesanded, kuid me loeme selle päringu ebaõnnestunuks (määrame edu muutujaks Vale, hoolimata asjaolust, et API-kutse oli edukas ja tagastas koodi 200).

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

vastus()

Vastusemeetod võimaldab teil vaadata sõnastikku koos vastusekoodiga (status_code) ja vastuse sisuga (body).

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']}}

andmed

Võimaldab näha ainult vastuse sisu ilma ebavajaliku teabeta.

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']}

veateade

See teave on saadaval ainult siis, kui API-päringu töötlemisel ilmnes viga (vastusekood ei 200). Väljundi näide

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

Kasulikud näited

Järgmistes näidetes kasutatakse API-kõnesid, mis lisati Management API versioonis 1.6.

Alustame sellest, et vaatame, kuidas kõned toimivad. lisa hosti и lisa-aadressi-vahemikOletame, et peame looma kõik alamvõrgu 192.168.0.0/24 IP-aadressid, mille viimane oktett on 5, hosti tüüpi objektidena ja kirjutama kõik ülejäänud IP-aadressid aadressivahemiku tüüpi objektidena. Sel juhul jätke alamvõrgu aadress ja leviedastuse aadress välja.

Seega, allpool on skript, mis lahendab selle probleemi ja loob 50 hosti tüüpi objekti ja 51 aadressivahemiku tüüpi objekti. Probleemi lahendamiseks on vaja 101 API-kõnet (arvestamata viimast avaldamiskõnet). Samuti arvutame timeit-mooduli abil välja aja, mis kulub skripti käivitamiseks kuni muudatuste avaldamiseni.

Skript, mis kasutab add-host ja add-address-range funktsioone

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

Minu laborikeskkonnas võtab selle skripti käivitamine aega 30–50 sekundit, olenevalt haldusserveri koormusest.

Vaatame nüüd, kuidas sama probleemi API-kõne abil lahendada. lisamisobjektide partii, mille tugi lisati API versioonis 1.6. See kutse võimaldab teil ühe API päringuga korraga luua mitu objekti. Lisaks võivad need olla erinevat tüüpi objektid (näiteks hostid, alamvõrgud ja aadressivahemikud). Seega saab meie ülesande lahendada ühe API kutse raames.

Skript, mis kasutab add-objects-batch funktsiooni

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

Ja selle skripti täitmine minu laborikeskkonnas võtab aega 3 kuni 7 sekundit, olenevalt haldusserveri koormusest. See tähendab, et keskmiselt töötab 101 objekti puhul partiitüüpi API-kutse 10 korda kiiremini. Suurema arvu objektide puhul on vahe veelgi muljetavaldavam.

Nüüd vaatame, kuidas töötada set-objects-batchSelle API-kutse abil saame muuta mis tahes parameetrit hulgi. Määrame eelmises näites olevate aadresside esimesele poolele (kuni .124 hosti ja ka vahemikud) värviks sienna ja aadresside teisele poolele värviks khaki.

Eelmises näites loodud objektide värvi muutmine

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

Ühe API-kõnega saab mitu objekti kustutada, kasutades objektide partii kustutamineVaatame nüüd näidet koodist, mis kustutab kõik eelnevalt loodud hostid lisamisobjektide partii.

Objektide kustutamine käsuga 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)

Kõik funktsioonid, mis ilmuvad uutes Check Pointi tarkvaraväljaannetes, saavad kohe API-kõnesid. Seega ilmusid versioonis R80.40 sellised "funktsioonid" nagu "Revert to revision" ja "Smart Task" ning nende jaoks valmistati kohe ette vastavad API-kõned. Lisaks saavad kõik funktsioonid, mis lülituvad pärandkonsoolidelt ühendatud poliitika režiimile, ka API-toe. Näiteks kauaoodatud värskendus R80.40 tarkvaraversioonis oli HTTPS-i inspekteerimispoliitika viimine pärandrežiimist ühendatud poliitika režiimi ja see funktsionaalsus sai kohe API-kõnesid. Siin on näide koodist, mis lisab HTTPS-i inspekteerimispoliitika ülemisele positsioonile reegli, mis välistab kontrollist 3 kategooriat (tervishoid, rahandus, valitsusasutused), mille kontroll on mitmete riikide õigusaktide kohaselt keelatud.

Lisage HTTPS-i kontrollipoliitikale reegel

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

Pythoni skriptide käitamine kontrollpunkti haldusserveris

Kõik on sama README.md sisaldab teavet selle kohta, kuidas Pythoni skripte otse juhtserverist käivitada. See võib olla kasulik, kui te ei saa API-serveriga teisest masinast ühendust luua. Salvestasin kuueminutilise video, milles vaatlen mooduli installimist. cpapi ja Pythoni skriptide haldusserveris käitamise funktsioonid. Näiteks käivitatakse skript, mis automatiseerib uue lüüsi konfigureerimise sellise ülesande jaoks nagu võrgu auditeerimine. TurvakontrollÜks omadus, millega ma pidin tegelema: Python 2.7-s pole see funktsioon veel ilmunud. sisend, seega funktsiooni kasutatakse kasutaja sisestatud teabe töötlemiseks toores_sisendMuidu on kood sama mis teistelt masinatelt käivitamisel, lihtsalt mugavam on funktsiooni kasutada. sisselogimine_juurkasutajana, et mitte uuesti oma kasutajanime, parooli ja juhtserveri IP-aadressi sisestada.

Esita video

Skript turvakontrolli kiireks seadistamiseks

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

Näide failist, mis sisaldab paroolisõnastikku additional_pass.conf
{
"passwords" : ["malware","malicious","infected","Infected"],
"phrases" : ["password","Password","Pass","pass","codigo","key","pwd","пароль","Пароль","Ключ","ключ","шифр","Шифр"]
}

Järeldus

See artikkel käsitleb ainult töö põhivõimalusi. Pythoni SDK ja moodul cpapi(nagu arvata võis, on need tegelikult sünonüümid) ja pärast selle mooduli koodi uurimist avastate sellega töötamiseks veelgi rohkem võimalusi. Võimalik, et teil tekib soov seda täiendada oma klasside, funktsioonide, meetodite ja muutujatega. Saate alati oma arendusi jagada ja vaadata teisi Check Pointi skripte selles jaotises. CodeHub kogukonnas Matid, mis koondab nii tootearendajaid kui ka kasutajaid.

Head kodeerimist ja tänan teid lõpuni lugemise eest!

Allikas: www.habr.com

Ostke DDoS-kaitsega saitide jaoks usaldusväärne hostimine, VPS VDS-serverid 🔥 Osta usaldusväärne veebimajutus DDoS-kaitsega, VPS VDS serverid | ProHoster