Lihtsustame töötamist Check Point API-ga Python SDK abil

Lihtsustame töötamist Check Point API-ga Python SDK abilKogu API jĂ”ud avaldub programmkoodi kooskasutamisel, kui tekivad vĂ”imalused dĂŒnaamiliselt luua API pĂ€ringuid ja tööriistu API vastuste analĂŒĂŒsimiseks. Siiski jÀÀb Python Software Development Kit (edasi – Python SDK) jaoks Check Point Management API, mis on kahetusvÀÀrne. See oluliselt lihtsustab arendajate ja automatiseerimisarmastajate elu. Viimasel ajal on Python saavutanud tohutut populaarsust ja otsustasin sulgeda vahe ja teha ĂŒlevaate peamistest vĂ”imalustest Check Point API Python Development Kit. See artikkel on suurepĂ€rane tĂ€ienduseks teisele artiklile Habr's Check Point R80.10 API. Halduse CLI, skriptid ja muud. Me vaatame, kuidas kirjutada skripte Python SDK abil ja peatume pĂ”hjalikumalt Management API uuel funktsionaalsusel versioonis 1.6 (toetatakse alates R80.40). Artikli mĂ”istmiseks on vajalikud pĂ”hiteadmised API ja Python'i töö kohta.

Check Point arendab aktiivselt API-d ja praeguseks on ilmunud:

Python SDK toetab praeguseks ainult Management API ja Gaia API. Vaatame kÔige olulisemaid klasse, meetodeid ja muutujaid selles moodulis.

Lihtsustame töötamist Check Point API-ga Python SDK abil

Moodi installimine

Moodul cpapi installitakse kiiresti ja lihtsalt Check Point'i ametlikust repostiitoriumist github'is kasutades pip. Üksikasjalik installatsioonijuhend on README.md. See moodul on kohandatud tööks Python versioonidega 2.7 ja 3.7. KĂ€esolevas artiklis esitatakse nĂ€iteid kasutades Python 3.7. Siiski on Python SDK vĂ”imalik otse Check Point'i haldusserverist (Smart Management) kĂ€itada, kuid seal toetatakse vaid Python 2.7 versiooni, seega viimas sekretis on toomatud kood versioonile 2.7. Kohe pĂ€rast mooduli installimist soovitan vaadata nĂ€iteid kaustades examples_python2 ja examples_python3.

Esimene samm

Ettevalmistamiseks, et saaksime töötada cpapi mooduli komponentidega, tuleb importida moodulist cpapi kaks vajalikku klassi:

APIClient ja APIClientArgs

from cpapi import APIClient, APIClientArgs

Klass APIClientArgs vastutab API serverisse ĂŒhenduse loomise parameetrite eest, samas kui klass APIClient vastutab API-ga suhtlemise eest.

MÀÀrame ĂŒhenduse parameetrid

Et mÀÀrata erinevaid ĂŒhenduse parameetreid API-ga, peate looma klassi APIClientArgs. Üldiselt on tema parameetrid eeldefineeritud ja skripti kĂ€ivitamisel haldusserveris ei pea neid mÀÀrama.

client_args = APIClientArgs()

Kuid kolmandal hostil kĂ€ivitamisel tuleb mÀÀrata vĂ€hemalt API serveri IP-aadress vĂ”i hosti nimi (haldusserver). Allolevas nĂ€ites mÀÀrame ĂŒhenduse parameetri server ja omistame sellele stringina haldusserveri IP-aadressi.

client_args = APIClientArgs(server='192.168.47.241')

Vaadakem kĂ”iki parameetreid ja nende vaikimisi vÀÀrtusi, mida saab kasutada API serveriga ĂŒhenduse loomiseks:

APIClientArgs klassi __init__ meetodi argumendid

class APIClientArgs:
    """
    See klass annab argumente APIClient konfiguratsiooniks.
    KÔik argumendid on konfigureeritud oma vaikimisi vÀÀrtustega.
    """

    # port on vaikimisi mÀÀratud None-ks, kuid see asendatakse 443-ga, kui seda ei mÀÀrata
    # konteksti vÔimalikud vÀÀrtused - web_api (vaikimisi) vÔi 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
        # haldusserveri sÔrmejÀlg
        self.fingerprint = fingerprint
        # sessiooni-id.
        self.sid = sid
        # haldusserveri nimi vÔi IP-aadress
        self.server = server
        # silumisaste
        self.http_debug_level = http_debug_level
        # massiiv kÔigi API kutsungitega (silumiseks)
        self.api_calls = api_calls if api_calls else []
        # silumisdokumendi nimi. Kui see jÀÀb tĂŒhjaks, ei salvestata silumistandmeid kettale.
        self.debug_file = debug_file
        # HTTP proxy serveri aadress (ilma "http://")
        self.proxy_host = proxy_host
        # HTTP proxy port
        self.proxy_port = proxy_port
        # Haldusserveri API versioon
        self.api_version = api_version
        # NĂ€itab, et klient ei peaks kontrollima serveri sertifikaati
        self.unsafe = unsafe
        # NĂ€itab, et klient peaks automaatselt aktsepteerima ja salvestama serveri sertifikaadi
        self.unsafe_auto_accept = unsafe_auto_accept
        # Kliendi kasutamise kontekst - vaikimisi web_api
        self.context = context

Eeldan, et APIClientArgs klassi eksemplaride argumendid on Check Pointi administraatoritele intuitiivselt arusaadavad ja ei vajada lisakommentaare.

Ühendume APIClienti ja konteksti halduriga

Klass APIClient KĂ”ige mugavam on kasutada konteksti haldajat. KĂ”ik, mis tuleb APIClient klassi eksemplarile edastada, on ĂŒhenduse parameetrid, mis mÀÀrati eelmises etapis.

with APIClient(client_args) as client:

Konteksti haldaja ei tee automaatselt API serveri sisselogimist, kuid ta teeb vÀljaregistreerimise vÀljumisel. Kui mingil pÔhjusel ei ole pÀrast API kutsete kasutamist vÀljaregistreerimine vajalik, tuleks alustada töötamist ilma konteksti haldajata:

client = APIClient(client_args)

Ühenduse kontrollimine

Lihtsaim viis kontrollida, kas ĂŒhendus on antud parameetrite alusel olemas, on kasutada meetodit check_fingerprint. Kui sha1 kontrollsumma API serveri fingerprint sertifikaadi jaoks ebaĂ”nnestub (meetod tagastas Vale), siis on see tavaliselt pĂ”hjustatud ĂŒhenduse probleemidest ja me saame peatada programmi toimimise (vĂ”i anda kasutajale vĂ”imaluse parandada ĂŒhendusandmeid):

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

Pange tĂ€hele, et edaspidi kontrollib klass APIClient iga API kutse puhul (meetodites api_call ja api_query, millest rÀÀgitakse pisut hiljem) sha1 fingerprint sertifikaati API serveris. Kui sha1 fingerprint API serveri sertifikaadi kontrollimisel ilmneb viga (sertifikaat on tundmatu vĂ”i on muudetud), siis meetod check_fingerprint pakub vĂ”imalust lisada/muuta teavet selle kohta kohalikus masinas automaatselt. Selle kontrolli saab tĂ€ielikult keelata (kuid seda soovitatakse ainult juhul, kui skripte kĂ€itatakse otse API serveris, ĂŒhendudes 127.0.0.1), kasutades APIClientArgs argumenti — unsafe_auto_accept (vt rohkem APIClientArgs kohta varem peatĂŒkis "MÀÀrame ĂŒhenduse parameetrid").

client_args = APIClientArgs(unsafe_auto_accept=True)

Sisselogimine API serverisse

Uus APIClient on kokku 3 meetodit API serverisse sisselogimiseks ja igaĂŒks neist salvestab vÀÀrtuse sid(sessioon-ID), mida kasutatakse automaatselt igas jĂ€rgnevas API kutses pĂ€ises (selle parameetri nimi pĂ€ises on X-chkp-sid), nii et seda parameetrit pole vaja tĂ€iendavalt töödelda.

Sisselogimise meetod

Variant sisselogimiseks kasutades kasutajanime ja parooli (nÀites on kasutajanimi admin ja parool 1q2w3e antud positsiooniliste argumentidena):

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

Sisselogimise meetodil on ka tÀiendavad valikulised parameetrid, toon vÀlja nende nimed ja vaikeseaded:

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

login_with_api_key meetod

API vĂ”tme kasutamise variant (toetatakse alates versioonist R80.40 / Management API v1.6, «3TsbPJ8ZKjaJGvFyoFqHFA==» see on API vĂ”tme vÀÀrtus ĂŒhe kasutaja jaoks haldusserveris, kasutades API key autoriseerimise meetodit):

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

Meetodis login_with_api_key on sama valikuline parameetrite hulk nagu meetodis login.

login_as_root meetod

API serveriga kohalikult sisselogimise variant:

     login = client.login_as_root()

Selle meetodi jaoks on saadaval vaid kaks valikulist parameetrit:

domain=None, payload=None

Ja lÔpuks ise API kutsed

Meil on kaks varianti API kutsumiste tegemiseks meetodite kaudu. api_call ja api_queryUurime, mis vahel erinevus on.

api_call

See meetod sobib igasuguste kutsude tegemiseks. Me peame edastama viimase osa API kutsest ja payload'i vajadusel pĂ€ringu kehas. Kui payload on tĂŒhi, siis ei ole seda ĂŒldse vaja edastada:

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

Selle pÀringu vÀljund allpool:

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 allpool:

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

Esiteks, see meetod sobib ainult pĂ€ringute jaoks, mille vĂ€ljund eeldab offset'i. Selline vĂ€ljund toimub juhul, kui see sisaldab vĂ”i vĂ”ib sisaldada suurt hulka teavet. NĂ€iteks vĂ”ib see olla pĂ€ring kĂ”igi loodud host-tĂŒĂŒpi objektide loendi saamiseks haldusserveris. Selliste pĂ€ringute puhul tagastab API vaikimisi 50 objekti loendi (seda limiiti on vĂ”imalik suurendada kuni 500 objekti kohta vastuses). Ja et mitte teavet mitu korda kĂŒsida, muutes pĂ€ringu offset parameetrit, on olemas meetod api_query, mis teeb selle töö automaatselt. NĂ€idised vĂ€ljakutsetest, kus vajalik see meetod: show-sessions, show-hosts, show-networks, show-wildcards, show-groups, show-address-ranges, show-simple-gateways, show-simple-clusters, show-access-roles, show-trusted-clients, show-packages. Tegelikult nĂ€eme nende API vĂ€ljakutsete nimedes mitmuse vormi sĂ”nu, seega on neid vĂ€ljakutseid lihtsam töödelda lĂ€bi api_query

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

Selle pÀringu vÀljund allpool:

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 kutsungite tulemuste töötlemine

PÀrast seda on vÔimalik kasutada klassi muutujaid ja meetodeid APIResponse(nii konteksti halduri sees kui vÀljaspool). Klassil APIResponse on mÀÀratletud 4 meetodit ja 5 muutujat, millest kÔige olulisematel peatume lÀhemalt.

Lihtsustame töötamist Check Point API-ga Python SDK abil

success

Esmalt oleks hea veenduda, et API kutsung lÀks lÀbi ja tagastas tulemuse. Selleks on olemas meetod success:

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

Tagastab True, kui API kutsung lĂ€ks edukalt lĂ€bi (vastuskood — 200) ja False, kui mitte (igal muul vastuskoodil). Mugav kasutada kohe pĂ€rast API kutsungit, et vastuskoodi jĂ€rgi erinevat teavet vĂ€lja printida.

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

statuscode

Tagastab vastuskoodi pÀrast API kutsungi tÀitmist.

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

VÔimalikud vastuskoodid: 200,400,401,403,404,409,500,501.

set_success_status

Samas vĂ”ib olla vajalik muuta status success vÀÀrtust. Tehniliselt on sinna vĂ”imalik paigutada mida iganes, isegi tavaline string. Kuid reaalse nĂ€itena vĂ”ib olla selle parameetri seadmine False'ks teatud kaasnevate tingimuste korral. Allpool on nĂ€ide, kus on ĂŒlesanded, mida tĂ€idetakse juhtimisseerveris, kuid me peame seda pĂ€ringut ebaĂ”nnestunuks (seame muutuja success) Vale, vaatamata sellele, et API kutsumine 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

response()

Metod response vÔimaldab vaadata vastuse sÔnastikku (status_code) ja vastuse keha (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']}}

data

Lubab nÀha ainult vastuse keha (body) ilma liigsest teabest.

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

error_message

See teave on saadaval ainult siis, kui API pÀringu töötlemisel tekkis viga (vastuskood ei 200). NÀide vÀljundist

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

Kasulikud nÀited

Allpool on loetletud nÀited, kus kasutatakse API kutsumisi, mis on lisatud versioonile Management API 1.6.

Alustame API kutsumise töötluse uurimist add-host ja add-address-range. Oletame, et peame looma hosti tĂŒĂŒpi objektid kĂ”ikidele alamvĂ”rgu 192.168.0.0/24 IP-aadressidele, mille viimane oktet on 5, ja kĂ”ik ĂŒlejÀÀnud IP-aadressid jÀÀvad aadressivahemiku objektideks. Samuti tuleb vĂ€listada alamvĂ”rgu aadress ja laiaulatusliku aadress.

Nii et allpool on skript, milles lahendatakse antud ĂŒlesanne ja luuakse 50 hosti tĂŒĂŒpi objekti ja 51 aadressivahemiku objekti. Ülesande lahendamiseks on vajalik 101 API kutset (ilma viimase publish kutseta). Samuti mÔÔdame timeit mooduli abil skripti tĂ€itmise aega kuni muudatuste avaldamiseni.

Skript add-host ja add-address-range kasutamisega

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 laboratoorse keskkonna jaoks kulub selle skripti tĂ€itmiseks 30 kuni 50 sekundit, sĂ”ltuvalt haldussĂŒsteemi koormusest.

NĂŒĂŒd vaatame, kuidas sama ĂŒlesannet lahendada API kĂ”ne abil add-objects-batch, mille tugi on lisatud API versioonis 1.6. See kĂ”ne vĂ”imaldab ĂŒhe API pĂ€ringu abil luua korraga mitmeid objekte. Need vĂ”ivad olla erinevat tĂŒĂŒpi objektid (nĂ€iteks hostid, alavĂ”rgud ja aadressivahemikud). Seega saame meie ĂŒlesande lahendada ĂŒhe API kĂ”ne raames.

Skript, mis kasutab 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')

Ja selle skripti tĂ€itmine minu laboratoorse keskkonna jaoks vĂ”tab 3 kuni 7 sekundit, sĂ”ltuvalt haldussĂŒsteemi koormusest. See tĂ€hendab, et keskmiselt toimib 101 objekti API kĂ”ne tĂŒĂŒbiga batch 10 korda kiiremini. Suurema objekti arvu korral on erinevus veelgi muljetavaldavam.

NĂŒĂŒd vaatame, kuidas töötada set-objects-batch. Selle API kĂ”ne abil saame suurte muudatuste kaudu muuta igat parameetrit. Seadistame nĂ€iteks eelmise nĂ€ite esimeses pooles (hostid kuni .124, samuti vahemikud) vĂ€rvi sienna ja teises pooles mÀÀrame vĂ€rvi khaki.

Objektide vÀrvi muutmine, mis loodi eelnevas nÀites

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

Mitme objekti kustutamine ĂŒhes API-kutses on vĂ”imalik delete-objects-batch. Vaatame nĂŒĂŒd koodinĂ€idet, mis kustutab kĂ”ik varem loodud hostid add-objects-batch.

Objektide kustutamine delete-objects-batch abil

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 uusimates Check Pointi tarkvaraversioonides, saavad kohe ka API-kutsed. NĂ€iteks R80.40 toob sellised „funktsioonid“ nagu Revert to revision ja Smart Task, ning neile on kohe valmistatud vastavad API-kutsed. Veelgi enam, kogu funktsionaalsus, mis on seotud ĂŒleminekuga Legacy konsoolidelt Unified Policy reĆŸiimile, saab samuti API toe. NĂ€iteks oli kauaoodatud uuendus versioonis R80.40 HTTPS Inspection poliitika ĂŒleviimine Legacy reĆŸiimist Unified Policy reĆŸiimi ja see funktsionaalsus sai kohe API kutsed. Siin on koodinĂ€ide, mis lisab HTTPS Inspection poliitika kĂ”rgeimale positsioonile reegli, mis vĂ€listab inspekteerimisest 3 kategooriat (Tervis, Finants, Riiklikud teenused), mida on mitmesuguste seaduste kohaselt keelatud inspekteerida.

Lisa reegel HTTPS Inspection poliitikasse

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 skriptide kÀivitamine Check Pointi haldusserveris

KĂ”ik on samas README.md sisaldab teavet, kuidas kĂ€ivitada Python skripte otse haldusserverist. See vĂ”ib olla mugav, kui teil pole vĂ”imalust ĂŒhendada API serveriga teiselt masinalt. Olen salvestanud kuue minuti pikkuse video, kus kĂ€sitlen mooduli cpapi ja Python skriptide kĂ€ivitamise eripĂ€ra haldusserveris. NĂ€iteks kĂ€ivitub skript, mis automatiseerib uue lĂŒnga seadistamist selliseks ĂŒlesandeks nagu vĂ”rgu audit Security CheckUp. Kohtasin eripĂ€ra, millega pidin silmitsi seisma: versioonis Python 2.7 ei olnud veel funktsiooni input, seega kasutatakse kasutaja sisendi töötlemiseks funktsiooni raw_input. ÜlejÀÀnud osas on kood sama, nagu kĂ€ivitamisel teistelt masinatelt, lihtsalt mugavam on kasutada funktsiooni login_as_root, et mitte mÀÀrata uuesti oma kasutajanime, parooli ja haldusserveri IP-aadressi.

MĂ€ngi videot

Skript kiireks Security CheckUp 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("Sisesta vÀrava nimi:")
        gw_ip = raw_input("Sisesta vÀrava IP-aadress:")
        if sys.stdin.isatty():
            sic = getpass.getpass("Sisesta ĂŒhekordne parool vĂ€rava jaoks (SIC): ")
        else:
            print("TĂ€helepanu! Teie parool kuvatakse ekraanil!")
            sic = raw_input("Sisesta ĂŒhekordne parool vĂ€rava jaoks (SIC): ")
        version = raw_input("Sisesta vÀrava versioon (nt 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("Turbeline ĂŒhendus vĂ€ravaga ei ole loodud!")
            exit(1)
        elif add_gw.success:
            print("VĂ€rav lisatud edukalt.")
            gw_uid = add_gw.data['uid']
            gw_name = add_gw.data['name']
        else:
            print("VÀrava lisamine ebaÔnnestus - {}".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("Poliitikat on edukalt muudetud")
        else:
            print("Poliitika muutmine ebaÔnnestus - {}".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("Cleanup reegel on edukalt muudetud")
        else:
            print("Cleanup reegli muutmine ebaÔnnestus - {}".format(change_rule.error_message))

        # avalda tulemus
        publish_res = client.api_call("publish", {})
        if publish_res.success:
            print("Muutused on edukalt avaldatud.")
        else:
                print("Muutuste avaldamine ebaÔnnestus - {}".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("JuurdepÀÀsupoliitika on installitud")
        else:
                print("JuurdepÀÀsupoliitika installimine ebaÔnnestus - {}".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("OhutÔrje poliitika on installitud")
        else:
            print("OhutÔrje poliitika installimine ebaÔnnestus - {}".format(install_tp_policy.error_message))
        
        # lisa paroolid ja salafraasid sÔnaraamatusse
        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" : "Lisa paroolid ja salafraasid", "script" : "printf "{}" >> $FWDIR/conf/additional_pass.conf".format(line), "targets" : gw_name})
                if add_password_dictionary.success:
                    print("Parooli sÔnaraamatu rida {} on edukalt lisatud".format(line_num))
                else:
                    print("SÔnaraamatu lisamine ebaÔnnestus - {}".format(add_password_dictionary.error_message))

main()

NĂ€idisfail salajaste paroolide jaoks additional_pass.conf
{
"passwords" : ["pahavÔtud","kahjulik","nakatunud","Nakatunud"],
"phrases" : ["pahavĂ”ti","PahavĂ”ti","Pass","pass","kood","vĂ”ti","pwd","ĐżĐ°Ń€ĐŸĐ»ŃŒ","ĐŸĐ°Ń€ĐŸĐ»ŃŒ","Ключ","Đșлюч","шофр","йофр"]
}

KokkuvÔte

See artikkel kĂ€sitleb ainult pĂ”hifunktsioone Python SDK ning moodulit cpapi(nagu vĂ”isite arvata, on need tegelikult sĂŒnonĂŒĂŒmid), ja uurides selle mooduli koodi, avardate oma vĂ”imalusi selle kasutamisel. Pole vĂ€listatud, et soovite lisada sellele oma klasse, funktsioone, meetodeid ja muutujaid. Saate alati jagada oma töid ja vaadata teisi Check Pointi skripte jaotises CodeHub kogukonnas CheckMates, mis ĂŒhendab arendajaid ja toote kasutajaid.

Head kodeerimist ja tÀnan teid, et lugesite lÔpuni!

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster